|
Liite 5. |
Selvitä lyhyesti:
Miten muuttuja ja nimetty vakio eroavat toisistaan? Mitä samaa niissä on?
Etsi seuraavasta Pascal-ohjelmassa olevat syntaktiset virheet. Sisennä ja kommentoi ohjelmakoodi!
program potenssi(Input,Output);
var tulos,eksponentti: Integer;
begin Write('Anna eksponentti:);
Readln(exponentti); i := 0; tulos := 1
while i < eksponentti do begin tulos := 2*tulos; i := i + 1
Writeln(tulos) end.
Seuraavan ohjelman tarkoituksena on laskea annettujen lukujen keskiarvo. Ohjelma näyttää olevan oikeaa Pascalia, mutta se ei toimi. Mikä on mennyt vikaan? Etsi ja korjaa ohjelman loogiset ja syntaktiset virheet. Sisennä ja kommentoi ohjelmakoodi!
program keskiarvo (Input,Output);
var summa,luku,lukuja: Integer;
begin
Writeln('Lukujen keskiarvon laskeminen');
Writeln('Anna negatiivinen luku, kun haluat lopettaa'); lukuja := 0;
while luku > 0 do begin lukuja := lukuja + 1;
Write('Anna luku: ') Readln(luku) summa := summa + luku; end;
if lukuja > 0 then begin
keskiarvo := summa / lukuja;
Writeln('keskiarvo = ', keskiarvo)
end else Writeln('Ei yhtään lukua') end.
Seuraavassa oleva Kello ohjelma on sama kuin edellisissä demoissa. Emme ole käsitelleet for-silmukkaa vielä kovin syvällisesti, joten ohjelmassa olevat for-silmukat tulisi muuttaa while-silmukoiksi. Sisennä ja kommentoi ohjelmakoodi!
program kello; uses Crt; var sekunnit, minuutit, tunnit : Integer; begin for tunnit := 0 to 24 do begin for minuutit := 0 to 59 do begin for sekunnit := 0 to 59 do begin GotoXY(20, 20); Write(tunnit,':',minuutit,':',sekunnit); end; end; end; end.
Kirjoita ohjelma, joka pyytää antamaan positiivisen kokonaisluvun ja ilmoittaa sen jälkeen, montako kertaa luku kolme (3) oli luvussa tekijänä (eli montako kertaa luku voitiin jakaa kolmosella siten, että jako meni tasan).
Kirjoita lauseke, joka saa arvokseen:
Esitä vaiheittain, miten alla olevien lausekkeiden tyyppi ja arvo määrätään. Joukossa on myös virheellisiä lausekkeita.
Määritelty:
Lausekkeet:
Tee ohjelma, joka selvittää, leikkaako suora y = bx + a, x-akselin annetussa kohdassa. Ohjelma kysyy ensin: x:n ja sen jälkeen kertoimien b ja a arvot. Kaikki kysytyt arvot ovat tyyppiä real.
Määrittele muuttujat alla mainittujen tietojen tallettamiseen. Määrittele ensin sopiva tyyppi.
Tämän ohjelman tarkoituksena on laskea yhteen joka kymmenes luku alkaen luvusta alku ja päätyen lukua loppu pienempään lukuun. Ohjelmassa on kuitenkin jotain pahasti vialla, mitä?
program jokakymmenes (input,output);
var
i,alku,loppu,summa: Integer;
begin
Write('Anna ensimmäinen summattava luku: ');
Readln(alku);
Write('Anna viimeinen summattava luku: ');
Readln(loppu);
summa := 0;
for i := alku to loppu do
begin
summa := summa + i;
i := i + 9
end;
Writeln('Summa oli: ',summa);
Writeln('Viimeinen summattu oli: ',i-10)
end.
Kirjoita edellisessä tehtävässä oleva ohjelma oikein.
Laadi ohjelma, joka ilmoittaa kuinka kuinka monta mitäkin (10MK, 5MK ja 1MK) kolikkoa tarvitaan annetun rahasumman saamiseksi. Kolikkojen määrän tulee olla pienin mahdollinen.
Kirjoita ohjelma, joka kysyy käyttäjältä viikonpäivän numeron (käytä rajoitettua tyyppiä) ja tulostaa päivän nimen. Tee ohjelmasta kaksi versiota, toisessa käytetään if- ja toisessa case--rakennetta. Vertaile ohjelmia. Kumman itse valitsisit tähän tarkoitukseen? Mitä etua on rajoitetun tyypin käytössä? Mitä tarvitsisi tehdä jos rajoitettua tyyppiä ei olisi käytettävissä?
Kirjoita ohjelma, joka laskee luvun 2**n (2 potensiin n) käyttäen while, for ja repeat-until rakenteita. Vertaile ohjelmia. Mikä mielestäsi sopii parhaiten tehtävässä esiteltyyn tarkoitukseen?
Kirjoita funktio joka palauttaa arvonaan satunnaisen merkin väliltä ['a'...'z']. Oletetaan että käytettävissä on satunnaislukuja väliltä [0.0 .. 0.99] generoiva funktio random (tyyppi on siis Real).
Pohdi mitä alitehtäviä liittyy korttiplein ventti pelin toteuttamiseen. Tee lista tarvittavista tehtävistä. Kiinnitä huomiota listan hierarkisuuteen.
Kirjoita ohjelma, joka laskee toisen asteen yhtälön juuret käyttäen laskukaavaa x = (-b ± Sqrt(b2 - 4ac)) / 2a . Kirjoita ohjelmasta kaksi versiota. Toisessa juuret lasketaan yhdessä aliohjelmassa ja oisessa ohjelmassa on laskenta on hajautettu useiksi aliohjelmiksi (tapaukset suora, yksi juuri ja kaksi juurta). Pohdi näiden kahden ohjelman välisiä eroja.
Selvitä seuraavassa TurboPascal-ohjelmassa olevien tunnusten näkyvyysalueet.
program lohkot (input,output);
var
b,c : Integer;
procedure P1 (a : Real; d : Integer, k : Char);
var
e,f : Real;
function F (x : Real) : Real;
var
z,y : Real;
i : Integer;
begin
...
end;
begin
...
end;
var
ch : Char;
begin
...
end.
Tee ohjelma, joka tulostaa käyttäjän antaman kokonaisluvun (0-1000) roomalaisena lukuna. Roomalaiset luvuthan määritellään seuraavien kirjaiten yhdistelminä: M=1000, D=500, C=100, L=50, X=10, V=5, I=1. Esimerkiksi luku 482 = CDLXXXII. Vihje: käytä case-rakennetta ja apuohjelmaa. Kirjoita itse prosessi aliohjelmaksi, ja hoida luvun syöttö pääohjelmassa.
Määrittele taulukkotyyppi kirjainten 'a'..'z' esiintymis todennäköisyyksien tallentamiseen. Kirjoita aliohjelma, joka lukee käyttäjältä todennäköisyydet taulukkoon ja varmistaa, että luvut on syötetty suuruusjärjestyksessä suurimmasta pienimpään, ja että lukujen summa on likimäärin 1.0.
Kirjoita funktio, joka palauttaa satunnaisen merkin edellisessä tehtävässä määritellyn taulukonmukaisella painotuksella. Kirjoita edellämääriteltyjä rutiineja hyväksikäyttäen ohjelma, joka tulostaa 100 satunnaista kirjainta.
Kirjoita kirjan sivulla 183 olevasta suurimman yhteisen tekijän laskevasta aliohjelmasta (syt) rekursiivinen versio.
Kirjoita rekursiivinen ohjelma, joka tulostaa luvun l k-kantaisena. (luvut l ja k kysytään käyttäjältä). Jos k>10, niin merkitään lukuja 10=A, 11=B, ... Eli siis esimerkiksi luku 45 heksadesimaalisena (eli k=16) on 2D.
Vihje: luku = ln-1*kn-1 + ln-2*kn-2 + ... + l1*k1 + l0*k0
Binomikerroin voidaan laskea esim. seuraavasti:
Tai rekrusiivisesti:
Kirjoita funktio joka laskee binomikertoimen arvon: a) iteratiiviseti, b) rekursiivisesti.
Taulukko voidaan lajitella kuplalajittelulla seuraavasti, nimensä se on saanut siitä, että menetelmässä suurin lajittelematon alkio nousee taulukon loppuun kuin kupla.
Kirjoita aliohjelma, joka lajittelee parametrina annetun Real-tyyppisen taulukon kuplalajittelulla, taulukon koko annetaan myös parametrina.
const TaulukonKoko = 100; type Taulukko = array [1..TaulukonKoko] of Real; procedure lajittele (var taulu: Taulukko; koko: Integer);
Kirjoita proseduuri, joka osaa lukea sentit ja millit syötettynä näppäimistöltä jossakin seuraavista muodoista:
2 cm 3 mm 2 cm 3 mm
Syöte päättyy rivinvaihtoon. Erottimena käytetään yhtä välilyöntiä. Proseduurin tulee tarkistaa ainakin se, että yksiköt on kirjoitettu oikein.
Mieti, miten tekemäsi proseduuri käyttäytyy, jos syötteen muoto on virheellinen.
Määritellään seuraavat tyypit:
type
opiskelijaTyyppi =
record
nimi: String[40];
arvosana: Real;
end;
OpiskelijaTiedosto = file of opiskelijaTyyppi;
Kirjoita ohjelma, joka luo tiedoston opiskelijoista. Käytä Read- ja Write-proseduureja, sekä käsittele tiedostoja TurboPascalin tapaan. Ohjelma kyselee tietoja, kunnes nimeksi annetaan tyhjä.
Kirjoita edellisen jatkoksi ohjelma, joka hakee luodusta tiedostosta parhaan ja huonoimman opiskelijan, sekä laskee kaikkien keskiarvon.
|
|