Programmering A

 
Introduktion
Första programmet
Strukturerad programmering
Variabler
Selektion
Sammansatta villkor
Iteration
 
Introduktion
Exempel
Självrättande övning 7.1
Insändningsuppgift 2
Underprogram
Klassrum
Hjälp
   
Senaste nytt
Till kursens början
Exempel
Nationellt centrum för flexibelt lärande 2002


Gissningslek

Antag att det är två deltagare i leken.
Deltagare1 skriver in ett heltal mellan 0-9 och därefter ska deltagare2 gissa vilket tal som skrevs in.
Vi ska istället för readln använda readkey. Med readkey läser datorn in tecknet utan att man måste "mata in" det med entertangenten.
Anledningen är att vi inte vill att talet ska synas på skärmen för då blir leken så enkel. (Man kan i och för sig tjyvkika på tangentbordet...)
readkey fungerar lite annorlunda eftersom den använder sig av tilldelningsoperatorn, man kan bara läsa in ett tecken dessutom får det det ASCII tecken tecknet svarar mot.
ASCII tecknet för 0 är nr 48. Så om värdet är 48 vet vi att det är 0 som matats in. De andra siffrorna kommer efter i rätt ordning därför kan vi göra om ASCII värdet till det tal det motsvarar genom att subtrahera med 48. Det blir tydligare i koden förhoppningsvis.

Om deltagare2 gissar ett för stort tal ska "För stort, försök igen" skrivas ut, om talet är för litet ska "För litet, försök igen" skrivas ut.
När rätt tal är gissat ska "Rätt!" skrivas ut.

Nä vi nu börjar koda ska vi ställa oss frågan:
Vilken loop ska vi välja?
Om vi använder lathunden från förra sidan ser vi att vi inte ska loopa ett bestämt antal gånger eftersom vi inte vet hur många gissningar det behövs innan rätt tal gissas.
Dessutom måste ju deltagare få gissa åtminstone en gång, dvs loopen ska upprepas minst en gång.
Utifrån detta ser vi att det är repeat until loopen som passar bäst.

Då börjar vi koda!
Koden finns att hämta här ifall du vill.

program gissa_tal;
uses Crt32;
{$APPTYPE Console}

var ch:char;
    giss, talet:integer;
begin
     clrscr;
     writeln('Ge ett tal anvandare1');
     ch:=readkey; {ch blir alltså det ASCII tecken som}                   {siffran motsvarar}
     talet:=ord(ch)-48; {vi gör om ASCII tecknets nr}
                        {i ASCII tabellen till siffran}
                        {
det motsvarar,}
                        {tecknet 0 har plats 48}
                        {ord(ch) ger platsen/numret}
                        {tecknet har i ASCII tabellen}
     clrscr;
     repeat
           begin
                writeln('Gissa talet!');
                readln(giss);
                if (giss < talet) then
                  writeln('For litet, forsok igen!')
                else
                    if (giss > talet) then
                      writeln('For stort, forsok igen')
                    else
                        writeln('Ratt!');
           end;
     until (giss=talet);
     readln;
end.

När du har testat det här programmet och förstår hur det fungerar tycker jag att du ska modifiera det så att användare2 bara har t ex fyra gissningar på sig innan det rätta svaret skrivs ut.
Kommer du inte på hur man gör tror jag du kan hitta hjälp i avsnittet om sammansatta villkor.
Lycka till!

Det har visat sig att readkey inte fungerar korrekt på vissa datorer. Siffran som ska gissas syns när användare2 ska gissa.
Då får man göra programmet lite dummare och använda den vanliga readln för att mata in den "okända" siffran. Det kräver dock att användare2 inte tjyvkikar.
I detta alternativ slipper vi dessutom krånglet med att omvandla tecknet till den siffra som är "okänd".

Alternativ kod då readkey inte fungerar korrekt:
Koden finns här att hämta.

program gissa_tal2;
uses Crt32;
{$APPTYPE Console}

var giss, talet:integer;
begin
     clrscr;
     writeln('Ge ett tal anvandare1!');
     writeln('Anvandare2, tjyvkika inte!');
     readln(talet);

     clrscr; {vi rensar skärmen direkt efter inmatningen}
     repeat
           begin
                writeln('Gissa talet!');
                readln(giss);
                if (giss < talet) then
                  writeln('For litet, forsok igen!')
                else
                    if (giss > talet) then
                      writeln('For stort, forsok igen')
                    else
                        writeln('Ratt!');
           end;
     until (giss=talet);
     readln;
end.

 

       
Exempel Upp
   Kursindex © HSw CFL 2002