31
TentamensTräning Här följer råd och information för dig som ska tentera i kursen Grundläggande programmering – speciellt LabTentamen. Vi delar här in kursen i åtta delar. I varje del får Du förutom läsanvisningar, tre stycken programmeringsuppgifter. De första två är grundläggande (lite för enkla för att göra anspråk på att finnas på en tentamen) men den tredje uppgiften skulle mycket väl kunnat vara en (enkel) tentamensuppgift. Glöm inte bort att tentamen i hög grad är en praktisk utmaning. Det räcker inte att ha teoretiska kunskaper om programspråket C. Har Du inte erfarenhet av hur det i praktiken går till att utveckla program vid datorn, kan uppgiften bli allt för svår. Du måste träna vid datorn! Läsanvisningar Del 1 Filhantering Läs kapitel 7 (sid 230-242) Det är alldeles nödvändigt att kunna skriva pro- gram som kan läsa data från textfiler i stället för tangentbordet. Problem 1 På filen uppg1.dat finns ett antal heltal, första talet i filen anger hur många. Skriv ett program som beräknar summan av dessa tal. Filen uppg1.dat hittar du i filer.zip. Svar: Summan av talen på filen är 1010. Självklart ska programmet fungera även då uppg1.dat får ett annat innehåll! Problem 2 Skriv ett program som skriver ut det största respektive det näst största talen på filen uppg2.dat. Filen inleds som i föregående uppgift med ett tal som anger antalet tal i filen. Svar: Det största talet är 882 och det näst största är 861. Vi antar att det inte kan finna fler än 100 tal på filen. Problem 3 På filen uppg3.dat finns 100 tärningskast, tal i intervallet 1 till 6. Anta att man varje gång kastar 5 tärningar. Beräkna vid vilket av de 20 kasten av de fem tärningarna som summan är störst. Svar: Den högsta summan, 25, erhölls vid det 18:e kastet. Del 2 Arrayer Att kunna hantera arrayer, indicerade variabler är ett måste för den som vill skriva lite mer avancerade program. Ibland, som här hanterar cellerna heltal, men de kan också innehålla tecken och då kallar vi dem för strängar – som vi återkommer till längre ner. Läs kapitel 6 (sid 167-177) Problem 4 Skriv ett program som först frågar om hur många tal som ska läsas in, sedan tar emot dessa tal och till sist skriver ut dem i omvänd ordning – det sist inmatade talet skrivs ut först Håkan Strömberg 1 KTH STH

TentamensTräning - KTHingforum.haninge.kth.se/c/TentaTraning.pdf · •Problem 17 Matematikern Richard Hamming har gjort en del arbeten in-om området felkorrigerande kod.Han introducerade

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: TentamensTräning - KTHingforum.haninge.kth.se/c/TentaTraning.pdf · •Problem 17 Matematikern Richard Hamming har gjort en del arbeten in-om området felkorrigerande kod.Han introducerade

TentamensTräning

Här följer råd och information för dig som ska tentera i kursen Grundläggande

programmering – speciellt LabTentamen. Vi delar här in kursen i åtta delar. Ivarje del får Du förutom läsanvisningar, tre stycken programmeringsuppgifter. Deförsta två är grundläggande (lite för enkla för att göra anspråk på att finnas påen tentamen) men den tredje uppgiften skulle mycket väl kunnat vara en (enkel)tentamensuppgift.

Glöm inte bort att tentamen i hög grad är en praktisk utmaning. Det räcker inte attha teoretiska kunskaper om programspråket C. Har Du inte erfarenhet av hur deti praktiken går till att utveckla program vid datorn, kan uppgiften bli allt för svår.Du måste träna vid datorn!

Läsanvisningar

Del 1 Filhantering

• Läs kapitel 7 (sid 230-242) Det är alldeles nödvändigt att kunna skriva pro-gram som kan läsa data från textfiler i stället för tangentbordet.

• Problem 1 På filen uppg1.dat finns ett antal heltal, första talet i filen angerhur många. Skriv ett program som beräknar summan av dessa tal. Filenuppg1.dat hittar du i filer.zip . Svar: Summan av talen på filen är 1010.Självklart ska programmet fungera även då uppg1.dat får ett annat innehåll!

• Problem 2 Skriv ett program som skriver ut det största respektive det näst

största talen på filen uppg2.dat . Filen inleds som i föregående uppgift medett tal som anger antalet tal i filen. Svar: Det största talet är 882 och det näststörsta är 861. Vi antar att det inte kan finna fler än 100 tal på filen.

• Problem 3 På filen uppg3.dat finns 100 tärningskast, tal i intervallet 1 till 6.Anta att man varje gång kastar 5 tärningar. Beräkna vid vilket av de 20 kastenav de fem tärningarna som summan är störst. Svar: Den högsta summan, 25,erhölls vid det 18:e kastet.

Del 2 Arrayer

Att kunna hantera arrayer, indicerade variabler är ett måste för den som vill skrivalite mer avancerade program. Ibland, som här hanterar cellerna heltal, men de kanockså innehålla tecken och då kallar vi dem för strängar – som vi återkommer tilllängre ner.

• Läs kapitel 6 (sid 167-177)

• Problem 4 Skriv ett program som först frågar om hur många tal som ska läsasin, sedan tar emot dessa tal och till sist skriver ut dem i omvänd ordning –det sist inmatade talet skrivs ut först

Håkan Strömberg 1 KTH STH

Page 2: TentamensTräning - KTHingforum.haninge.kth.se/c/TentaTraning.pdf · •Problem 17 Matematikern Richard Hamming har gjort en del arbeten in-om området felkorrigerande kod.Han introducerade

• Problem 5 På filen uppg5.dat finns resultaten från senaste tentamen. Förvarje student (en rad på filen) anges studentkod, ett tresiffrigt heltal och re-

sultat ett annat heltal. Filen inleds med ett tal som anger hur många studentersom ingår. Skriv ett program skriver ut studentkoden för de studenter vars re-sultat är ≥ medelvärdet av alla resultat. Svar: Studenterna 721, 334, 725, 317, 397

• Problem 6 Programmet uppg6A.cpp läser in 20 tal från filen uppg6.datoch placerar i arrayen lista . Bygg nu ut detta program så att det bestämmerden största summan man kan få genom att addera tre på varandra följandetal i listan. Svar: Den största summa som kan erhållas är 202, som bildas meddet fjärde, femte och sjätte talet.

Del 3 Slumptal

• Läs kapitel 4 (sid 106-108).

• Problem 7 Med tärningens hjälp ska du förflytta en pjäs från ruta 1 förbi ruta1000. På varje ruta vars nummer slutar på 0 står en motståndarpjäs, som dukommer att peta ut ur spelet om du hamnar på den rutan. Skriv ett programsom uppskattar hur många pjäser du kommer att peta, på din färd mot målet.Kör programmet flera gånger och använd srand() . Svar: Ungefär 30 pjäserbör bli petade.

• Problem 8 Skriv ett program som tar reda på hur ofta man får en ”kåk” närman kastar fem tärningar. En ”kåk” uppkommer då tre av tärningarna visarsamma antal ögon och de två andra också är lika, men skilda ifrån de förstatre. Låt programmet kasta de fem tärningarna 10000 gånger. Svar: Cirka 388

gånger av 10000 får man ”kåk”.

• Problem 9 Givet en tipsrad: "1XX2X2X111X12". Skriv ett program som slumparfram nya rader och som tar reda på hur många det behövs innan en tagitsfram, som har minst 10 tecken som överensstämmer med raden ovan. Svar:Resultatet bör ligga mellan 575 och 600, men har man tur kan raden kommabetydligt tidigare.

Del 4 Strängar

• Läs kapitel 7 (sid 221-229)

• Problem 10 Skriv ett program som tar emot en sekvens av bokstäver, (≤ 80)och skriver ut den på skärmen. Om indatasträngen innehåller parenteserska dessa tillsammans med inneslutna texten inte återfinnas i utskriften. Tillexempel från AB(CD)EFGH(IJK)L ska utskriften bli ABEFGHL. Indata kanbara innehålla korrekt använda parenteser.

• Problem 11 För korsordslösaren skriver vi detta program. På filen uppg11.datfinns en mängd ord, ett på varje rad och alla med fem bokstäver. Första radeni filen anger antalet ord. Skriv ett program som tar emot en söksträng ochsöker igenom filen och skriver ut ord, som matchar söksträngen. En sök-sträng kan innehålla förutom små bokstäver (gemener) också asterisker (* ).

Håkan Strömberg 2 KTH STH

Page 3: TentamensTräning - KTHingforum.haninge.kth.se/c/TentaTraning.pdf · •Problem 17 Matematikern Richard Hamming har gjort en del arbeten in-om området felkorrigerande kod.Han introducerade

En asterisk står för en godtycklig bokstav. Om programmet till exempel gessöksträngen s* ns * ska utskriften med vår ordfil bli: synsk och sansa

• Problem 12 På filen uppg12.dat finns 19 rader. På varje rad står ett pojk-namn. Alla namn utom ett förekommer två gånger. Skriv ett program som tarreda på vilket program som bara förekommer en gång. Inget namn är längreän 10 tecken. Svar: Jompa.

Del 5 Funktioner

• Läs kapitel 8, 10 och 11.

• Problem 13 Till detta program ska du skriva inte mindre än fyra funktion-er. Var och en av dem ska ta emot en vektor a innehållande 100000 fram-slumpade tärningskast, i övrigt gäller följande:

– Funktionen frekvens tar förutom vektorn emot ett tal t ur mängden[1 . . . 6] och returnerar antalet förekomster av t i a

– Funktionen par har samma parametrar som frekvens och returnerarhur många gånger talet t förekommer i par. I sekvensen ...35554...bildar 5 två par.

– Funktionen langsta med samma parametrar som funktionerna ovanska ta reda på den längsta sekvensen där enbart talet t förekommer.

– Funktionen sekvens ska räkna och returnera antalet gånger sekvensen123456 förekommer i a.

Svar: När jag körde programmet fick jag följande resultat:

Antal 5:or är 16415Antal par av 3:or är 2823Längsta sekvensen av 4:or är 7Antal 123456 är 3

• Problem 14 Skriv en funktion antal , som tar emot två heltalsvektorer a ochb. a innehåller 10 olika tal och b olika 4 tal. Funktionen ska nu ta reda påoch returnera hur många tal i b som återfinns i a.

• Problem 15 Skriv ett funktion rensa , som tar emot en sträng med tecken ochsom plockar bort alla tecken som inte är siffror. Inledningen till programmetges i uppg15A.c .

Del 6 Optimering och sökning

• Problem 16 Skriv ett program som tar reda på vilka positiva heltal (< 3000)som är sådana att de ger resten 1 vid division med 2, 3, 4, 5 och 6 men resten0 vid division med 7.Programmet ska skriva ut samtliga sådana tal. Svar: Det finns sju sådana tal:301, 721, 1141, 1561, 1981, 2401, 2821

Håkan Strömberg 3 KTH STH

Page 4: TentamensTräning - KTHingforum.haninge.kth.se/c/TentaTraning.pdf · •Problem 17 Matematikern Richard Hamming har gjort en del arbeten in-om området felkorrigerande kod.Han introducerade

• Problem 17 Matematikern Richard Hamming har gjort en del arbeten in-om området felkorrigerande kod. Han introducerade bland annat Hammin-

gavstånd som förklaras här:Två vektorer v1 = {1011110101011100010} och v2 = {0010101100010111010}

har avståndet 8, eftersom v1 och v2 skiljer sig åt på 8 platser.På filen uppg17.txt finns 20 vektorer, en på varje rad. Vektorerna in-nehåller endast 0:or och 1:or. Alla vektorer är lika långa och < 80 tecken.Längden kan alltså variera från test till test.Skriv ett program som bestämmer på vilka rader de två vektorerna, som hardet största avståndet, befinner sig i filen. Resultatet med testfilen ger:

Största avståndet är 14, mellan rad 3 och 8

• Problem 18 Skriv ett program som avgör om givna punkter ligger inuti en,

två eller ingen av två givna rektanglar.På filen uppg18.dat finns beskrivning av två rektanglar genom (x1, y1) detövre vänstra hörnet och (x2, y2), det nedre högra – två rader med fyra tali nämnd ordning. Den första raden beskriver rektangeln A och den andraB. Därefter följer en rad med ett tal, som anger för hur många punkter, n,testen ska göras. Filen avslutas sedan med n rader. Varje rad innehåller x-och y-koordinat för en punkt.Programmet ska producera en lista med punkternas koordinater, samt pas-sande text:

– Ligger i båda

– Ligger endast i A

– Ligger endast i B

– Ligger inte i någon

Alla tal i denna uppgift är heltal. En punkt som ligger på periferin (på lin-jen) till en rektangel betraktas som den ligger i rektangeln. Testfilen ska geföljande utskrift:

2 1 Ligger inte i någon9 2 Ligger endast i A8 7 Ligger i båda5 8 Ligger i båda

12 8 Ligger endast i B

Del 7 Heltal

• Problem 19 I gruppen finns n personer. För att ta reda på sannolikheten p

för att ingen i gruppen har samma födelsedag använder man sig av följandeformel:

p =365

365·364

365·363

365· . . . ·

365− n+ 1

365

För en grupp med 40 medlemmar n = 40 är sannolikheten p = 0.1088

eller ungefär 11% att ingen är född samma dag på året som någon annan i

Håkan Strömberg 4 KTH STH

Page 5: TentamensTräning - KTHingforum.haninge.kth.se/c/TentaTraning.pdf · •Problem 17 Matematikern Richard Hamming har gjort en del arbeten in-om området felkorrigerande kod.Han introducerade

gruppen. Skriv ett program som beräknar sannolikheten för ett givet värde pån. Använd sedan programmet för att ta reda på för vilket n som sannolikhetenp är så nära 0.5 som möjligt. Svar: För n = 23 är den sökta sannolikhetenp = 0.4927

• Problem 20 Här efterlyser vi ett program som ska testa boolska uttryck ochskriva ut för vilka värden på de fyra ingående boolska variablerna, a, b, c ochd uttrycket är sant.

(a&&!b&&c||b&&!c&&d||a&&d&&b)

är uttrycket du ska testa. Variablerna a, b, c och d kan alltså endast antavärdena sant eller falskt. Svar: Uttrycket är sant då

a b c d

falskt sant falskt santsant falskt sant falsktsant falskt sant santsant sant falskt santsant sant sant sant

• Problem 21 Skriv ett program som tar emot ett heltal t, 0 ≤ t < 1000000000

och som utifrån det skapar ett nytt tal där siffrorna i t är sorterade i fallandeordning. Till exempel ska det inmatade talet 86934 ge utskriften 98643 .

Del 8 Binärfiler

• Läs kapitel 12 (sid 456-464)

• Problem 22 Vid en underökning frågade man 100 par om deras årsinkomst.Uppgifterna registrerades på binärfilen uppg22.dat med följande postbeskrivn-ing:

struct lon{int manlon;int kvinlon;

};

Skriv ett program som tar reda i hur många familjer mannen har högre lönkvinnan. Svar: 61 män har högre lön än kvinnan.

• Problem 23 Filen uppg23.dat är en binärfil där följande struct har använts

struct persontyp{char namn[20];int antal;int typ;

};

Håkan Strömberg 5 KTH STH

Page 6: TentamensTräning - KTHingforum.haninge.kth.se/c/TentaTraning.pdf · •Problem 17 Matematikern Richard Hamming har gjort en del arbeten in-om området felkorrigerande kod.Han introducerade

En post innehåller ett herrnamn, damnnamn eller efternamn. De i Sverigevanligaste i varje kategori. Tillsammans med namn finns också antal, somanger hur många invånare som bär detta namn. Fältet typ antar tre olikavärden enligt följande tabell

1 Efternamn2 Herrnamn3 Damnamn

Skriv ett program som tar reda på och skriver ut, den troligtvis vanligastenamnkombinationen för ett älskande par i Sverige! Det vill säga en mening:<vanligaste damnamnet> och <vanligaste herrnamnet> <vanligaste efter-

namnet>. Svar: Maria och Erik Johansson.

• Problem 24 På binärfilen uppg24.dat finns ett antal poster enligt följandepostbeskrivning:

struct paket {char adressat[40];int bredd, hojd, langd;

};

Vissa av paketen levereras direkt till adressaten, medan andra anses vara förskrymmande för att delas ut. Dessa paket måste därför hämtas på posten.Skriv ett program som skriver ut adressaten hos de paket, som är för stora,har en volym > 25000 cm3 och alltså måste ta sig till posten i julbrådskan.Alla mått i filen är givna i cm.För testfilen får vi denna dialog

Ange filnamn: uppg24.datFöljande personer har paket att hämta:

Maria KarlssonKristina SvenssonHans BergströmArne FredrikssonLeif BjörkEmanuel BergqvistBerit JosefssonFredrik Lund

Det finns 8 för stora paket

Håkan Strömberg 6 KTH STH

Page 7: TentamensTräning - KTHingforum.haninge.kth.se/c/TentaTraning.pdf · •Problem 17 Matematikern Richard Hamming har gjort en del arbeten in-om området felkorrigerande kod.Han introducerade

Lösningsförslag

Problem 1

1 #include <stdio.h>2 int main( void){3 FILE * infil;4 int summa=0,tal,antal,i;5 infil=fopen("uppg1.dat","rt");6 fscanf(infil,"%d",&antal);7 for (i=1;i<=antal;i++){8 fscanf(infil,"%d",&tal);9 summa=summa+tal;

10 }11 printf("Summan av talen är %d\n",summa);12 fclose(infil);13 }

Observera:

• I samband med textfiler finns i allmänhet, inledningsvis, ett tal som angerhur många poster som följer i filen. Eftersom feof är en ganska klumpigfunktion i C. Vill du trots det kunna hantera feof hänvisas till boken, sidan457.

Håkan Strömberg 7 KTH STH

Page 8: TentamensTräning - KTHingforum.haninge.kth.se/c/TentaTraning.pdf · •Problem 17 Matematikern Richard Hamming har gjort en del arbeten in-om området felkorrigerande kod.Han introducerade

Problem 2

1 #include <stdio.h>2 int main( void){3 FILE * fil;4 int lista[100];5 int n,i,j,tmp;6 fil=fopen("Uppg2.dat","rt");7 fscanf(fil,"%d",&n);8 for (i=0;i<n;i++)9 fscanf(fil,"%d",&lista[i]);

10 fclose(fil);11 for (i=0;i<n-1;i++)12 for (j=i+1;j<n;j++)13 if (lista[i]<lista[j]){14 tmp=lista[i];15 lista[i]=lista[j];16 lista[j]=tmp;17 }18 printf("Störst är %d\n",lista[0]);19 printf("Näst störst är %d\n",lista[1]);20 }

Observera:

• Här har vi låtit sortera talen för att finna det näst största. Detta kan betraktassom ”overkill” eftersom det finns metoder som kräver mindre datorresurser.Se till att du kan sortera en vektor med tal.

Håkan Strömberg 8 KTH STH

Page 9: TentamensTräning - KTHingforum.haninge.kth.se/c/TentaTraning.pdf · •Problem 17 Matematikern Richard Hamming har gjort en del arbeten in-om området felkorrigerande kod.Han introducerade

Problem 3

1 #include <stdio.h>2 int main( void){3 FILE * fil;4 int s,t,m=0,nr,i,j;5 fil=fopen("Uppg3.dat","rt");6 for (i=1;i<=20;i++){7 s=0;8 for (j=1;j<=5;j++){9 fscanf(fil,"%d",&t);

10 s=s+t;11 }12 if (s>=m){13 m=s;14 nr=i;15 }16 }17 printf("Högsta summan %d, erhölls i omgång %d\n",m,nr);18 }

Observera:

• Här ska du förstå att det handlar om två loopar, en för antalet kast och en förde fem tärningarna i varje kast.

12-15 Vi söker ett maximivärde och samtidigt sparar vi undan numret på det kastdå maximivärdet inträffade.

Håkan Strömberg 9 KTH STH

Page 10: TentamensTräning - KTHingforum.haninge.kth.se/c/TentaTraning.pdf · •Problem 17 Matematikern Richard Hamming har gjort en del arbeten in-om området felkorrigerande kod.Han introducerade

Problem 4

1 #include <stdio.h>2 int main( void){3 int i,a[100],n;4 printf("Hur många tal: ");5 scanf("%d",&n);6 for (i=0;i<n;i++){7 printf("? ");8 scanf("%d",&a[i]);9 }

10 for (i=n-1;i>=0;i--)11 printf("%d ",a[i]);12 printf("\n");13 }

Håkan Strömberg 10 KTH STH

Page 11: TentamensTräning - KTHingforum.haninge.kth.se/c/TentaTraning.pdf · •Problem 17 Matematikern Richard Hamming har gjort en del arbeten in-om området felkorrigerande kod.Han introducerade

Problem 5

1 #include <stdio.h>2 int main( void){3 FILE * fil;4 int elev[50][2];5 int sum=0,n,i;6 fil=fopen("uppg5.dat","rt");7 fscanf(fil,"%d",&n);8 for (i=0;i<n;i++){9 fscanf(fil,"%d %d",&elev[i][0],&elev[i][1]);

10 sum=sum+elev[i][1];11 }12 fclose(fil);13 for (i=0;i<n;i++)14 if (elev[i][1]>=( float)sum/n)15 printf("%d\n",elev[i][0]);16 }

Observera:

• Här ska du förstå att det handlar om två genomgångar av data. Först läservi in data och placerar i en matris, samtidigt summerar vi resultatet för varjestudent.

• I andra genomgången jämför vi studenternas resultat med medelvärdet. Detär bättre att, före loopen, räkna ut medelvärdet en gång för alla och lagraresultatet i en variabel medel , istället som här, för var varje student.

Håkan Strömberg 11 KTH STH

Page 12: TentamensTräning - KTHingforum.haninge.kth.se/c/TentaTraning.pdf · •Problem 17 Matematikern Richard Hamming har gjort en del arbeten in-om området felkorrigerande kod.Han introducerade

Problem 6

1 #include <stdio.h>2 int main( void){3 FILE * fil;4 int i,sum,j,lista[20],max=0;5 fil=fopen("uppg6.dat","rt");6 for (i=0;i<20;i++)7 fscanf(fil,"%d",&lista[i]);8 fclose(fil);9 for (i=0;i<=17;i++){

10 sum=0;11 for (j=0;j<3;j++)12 sum=sum+lista[i+j];13 if (sum>max)14 max=sum;15 }16 printf("Den största summan är %d\n",max);17 }

Observera:

• Det finns 18 starter för de tre talen, index 0 . . . 17. För varje tal ska vi summeratre tal. Vi tar till en loop (kanske inte nödvändigt eftersom det endast ärtre tal som ska summeras) som summerar de tre talen. Du måste först vadlista[i+j] står för!

13-14 Vi kollar om det är ett nytt ’rekord’

Håkan Strömberg 12 KTH STH

Page 13: TentamensTräning - KTHingforum.haninge.kth.se/c/TentaTraning.pdf · •Problem 17 Matematikern Richard Hamming har gjort en del arbeten in-om området felkorrigerande kod.Han introducerade

Problem 7

1 #include <stdio.h>2 #include <time.h>3 #include <stdlib.h>4 int main( void){5 int s=1,n=0,j;6 srand(time(0));7 do{8 s+=rand()%6+1;9 if (s%10==0)

10 n++;11 } while(s<1000);12 printf("Antal petatde pjäser %d\n",n);13 }

Observera:

• Här är det lämpligt med en do- eller while -loop eftersom vi inte vet hurmånga kast vi måste göra för att nå målet.

9-10 Här kontollerar vi om vi hamnat på en ruta vars nummer slutar på 0. Om såär fallet har vi petat en päs.

Håkan Strömberg 13 KTH STH

Page 14: TentamensTräning - KTHingforum.haninge.kth.se/c/TentaTraning.pdf · •Problem 17 Matematikern Richard Hamming har gjort en del arbeten in-om området felkorrigerande kod.Han introducerade

Problem 8

1 #include <stdio.h>2 #include <time.h>3 #include <stdlib.h>4 int main( void){5 int t[6],i,j,k,n=0,tmp;6 srand(time(0));7 for (i=1;i<=10000;i++){8 for (j=0;j<5;j++)9 t[j]=rand()%6+1;

10 for (j=0;j<=3;j++)11 for (k=j+1;k<=4;k++)12 if (t[j]<t[k]){13 tmp=t[j];14 t[j]=t[k];15 t[k]=tmp;16 }17 if (t[0]==t[2] && t[3]==t[4] && t[2]!=t[3] ||18 t[0]==t[1] && t[2]==t[4] && t[1]!=t[2])19 n++;20 }21 printf("10000 kast gav kåk %d gånger\n",n);22 }

Observera:

• Du ska känna till att funktionen rand nås genom stdlib.h .

• När man skriver simuleringsprogram är det viktigt att programmet ges möj-lighet att variera resultatet. Detta görs genom srand(time(0)) , time fårman tillgång till genom att inkludera time.h .

• Det är genom att utföra ett försök flera gånger som man kan få en uppskat-tning om sannolikheten för en viss händelse,som vi får genom att divideraantalet i n med 10000 (och eventuellt multiplicera med 100 för att få resultateti procent).

10-16 Om vi sorterar resultatet hos de fem tärningarna blir det enklare att avgöraom vi fått en ’kåk’.

17-18 Se till att du förstår det här villkoret!

Håkan Strömberg 14 KTH STH

Page 15: TentamensTräning - KTHingforum.haninge.kth.se/c/TentaTraning.pdf · •Problem 17 Matematikern Richard Hamming har gjort en del arbeten in-om området felkorrigerande kod.Han introducerade

Problem 9

1 #include <stdio.h>2 #include <time.h>3 #include <stdlib.h>4 int main( void){5 int i,n,r,j=0;6 char rad[14]="1XX2X2X111X12";7 srand(time(0));8 do{9 j++;

10 n=0;11 for (i=0;i<13;i++){12 r=rand()%3+1;13 if (r==1 && rad[i]==’1’)14 n++;15 if (r==2 && rad[i]==’2’)16 n++;17 if (r==3 && rad[i]==’X’)18 n++;19 }20 } while(n<10);21 printf("Det behövdes %d rader\n",j);22 }

Observera:

11-19 I denna loop slumpar vi fram 13 tipstecken och jämför med den rätta raden.Målet är att få minst 10 rätt. Genom do-loopen upprepas försöket tills måletär nått. j är en varvräknare som håller reda på hur många försök som utförts.

Håkan Strömberg 15 KTH STH

Page 16: TentamensTräning - KTHingforum.haninge.kth.se/c/TentaTraning.pdf · •Problem 17 Matematikern Richard Hamming har gjort en del arbeten in-om området felkorrigerande kod.Han introducerade

Problem 10

1 #include <stdio.h>2 int main( void){3 char text[81];4 int i,n=0;5 printf("Texten: ");6 scanf("%s",text);7 for (i=0;text[i]!=’\0’;i++)8 if (text[i]==’(’)9 n=1;

10 else11 if (text[i]==’)’)12 n=0;13 else14 if (n==0)15 printf("%c",text[i]);16 printf("\n");17 }

Observera:

• Loppen stegar igenom strängen och avbryts då ’\0’ påträffas.

• Här använder vi en flagga, n. Varje gång vi träffar på en vänsterparentessätts flaggan till 1 och utskriften i rad 15 stängs av. Så fort en högerparentespåträffas sätts flaggan n till 0 och utskriften görs möjlig.

• Programmet fungerar inte då det finns parentespar inuti andra parentespar –förvissa dig om det!

Håkan Strömberg 16 KTH STH

Page 17: TentamensTräning - KTHingforum.haninge.kth.se/c/TentaTraning.pdf · •Problem 17 Matematikern Richard Hamming har gjort en del arbeten in-om området felkorrigerande kod.Han introducerade

Problem 11

1 #include <stdio.h>2 int main( void){3 FILE * fil;4 int i,j,n,antal;5 char ord[6],strang[6];6 fil=fopen("uppg11.dat","rt");7 fscanf(fil,"%d",&antal);8 printf("Söksträng: ");9 scanf("%s",strang);

10 for (i=1;i<=antal;i++){11 fscanf(fil,"%s",ord);12 n=1;13 for (j=0;j<=4;j++)14 if (strang[j]!=’ * ’ && strang[j]!=ord[j])15 n=0;16 if (n==1)17 printf("%s\n",ord);18 }19 }

Observera:

• Den yttre loopen går igenom alla orden på filen. För varje ord stegar viigenom samtliga tecken, 13 − 15. Om det finns en asterisk i söksträngen, fårdet finnas vad som helst i det inlästa ordet.

• Vi använder en flagga n som får värdet 1 före den inre loopen. Om villkoreti rad 14 är sant slår flaggan om till 0 (här skulle man också kunna ha break ,eftersom ordet nu inte kan komma ifråga). Om värdet 1 har överlevt underden inre loopen, är ordet godkänt och kan skrivas ut.

• Du måste förstå villkoret på rad 14

Håkan Strömberg 17 KTH STH

Page 18: TentamensTräning - KTHingforum.haninge.kth.se/c/TentaTraning.pdf · •Problem 17 Matematikern Richard Hamming har gjort en del arbeten in-om området felkorrigerande kod.Han introducerade

Problem 12

1 #include <stdio.h>2 #include <string.h>3 int main( void){4 char tab[19][11],tmp[11];5 int i,j;6 FILE * fil;7

8 fil=fopen("uppg12.dat","rt");9 for (i=0;i<19;i++)

10 fscanf(fil,"%s",tab[i]);11 fclose(fil);12 for (i=0;i<18;i++)13 for (j=i+1;j<19;j++)14 if (strcmp(tab[i],tab[j])<0){15 strcpy(tmp,tab[i]);16 strcpy(tab[i],tab[j]);17 strcpy(tab[j],tmp);18 }19 i=0;20 while (strcmp(tab[i],tab[i+1])==0)21 i=i+2;22 printf("%s",tab[i]);23 }

Observera:

4 Vi gör plats för 19 ord (namn), som kan vara maximalt 10 tecken långa. Vigör plats för 11 tecken, även för strängavslutningen ’\0’ . Det är viktigt attdu kan deklarera en datastruktur som kan innehålla flera strängar!

• Namnen läses in till tab . Lägg märke till hur man läser in en hel rad i tagettill tab . Det är endast strängar av char som kan läsas in på detta sätt i C.

12-18 Så här sorterar man en array med strängar. Du måste veta hur man jämför tvåsträngar, med strcmp . Inget annat (enkelt) fungerar!.På samma sätt måste du kunna använda strcpy för att flytta strängar mellanrader i tab . Inget annat (enkelt) fungerar.

20-21 Efter sorteringen har dubbletterna hamnat intill varandra, utom på ett ställe.Se till att du förstår denna while -loop.

Håkan Strömberg 18 KTH STH

Page 19: TentamensTräning - KTHingforum.haninge.kth.se/c/TentaTraning.pdf · •Problem 17 Matematikern Richard Hamming har gjort en del arbeten in-om området felkorrigerande kod.Han introducerade

Problem 13

1 #include <stdio.h>2 #include <stdlib.h>3 #include <time.h>4 int frekvens( int a[], int t){5 int i,n=0;6 for(i=0;i<100000;i++)7 if(a[i]==t) n++;8 return n;9 }

10

11 int par( int a[], int t){12 int i,n=0;13 for(i=0;i<99999;i++)14 if(a[i]==t && a[i+1]==t) n++;15 return n;16 }17

18 int langsta( int a[], int t){19 int i,n=0,f=0,m=0;20 for(i=0;i<100000;i++){21 if(a[i]==t && f==1)22 n++;23 if(a[i]!=t && f==1){24 f=0;25 if(n>m) m=n;26 }27 if(a[i]==t && f==0){28 f=1;29 n=1;30 }31 }32 if(f==1 && n>m)33 m=n;34 return m;35 }

Håkan Strömberg 19 KTH STH

Page 20: TentamensTräning - KTHingforum.haninge.kth.se/c/TentaTraning.pdf · •Problem 17 Matematikern Richard Hamming har gjort en del arbeten in-om området felkorrigerande kod.Han introducerade

1

2 int sekvens( int a[]){3 int i,j,n,m=0;4 for(i=0;i<99995;i++){5 n=0;6 for(j=0;j<=5;j++)7 if(a[i+j]==j+1)8 n++;9 if(n==6) m++;

10 }11 return m;12 }13

14 int main( void){15 int a[100000],i;16 srand(time(0));17 for(i=0;i<100000;i++)18 a[i]=rand()%6+1;19 printf("Antal %d:or är %d\n",5,frekvens(a,5));20 printf("Antal par av %d:or är %d\n",3,par(a,3));21 printf("Längsta sekvensen av %d:or är %d\n",4,langsta(a, 4));22 printf("Antal 123456 är %d\n",sekvens(a));23 }

Observera:

• Det viktigaste med detta program är hur man använder sig av arrayer somparametrar och hur man returnerar värden från en funktion till main .

• Det skadar inte att sätta sig in i hur de olika delproblemen är lösta i de olikafunktionerna.

Håkan Strömberg 20 KTH STH

Page 21: TentamensTräning - KTHingforum.haninge.kth.se/c/TentaTraning.pdf · •Problem 17 Matematikern Richard Hamming har gjort en del arbeten in-om området felkorrigerande kod.Han introducerade

Problem 14

1 #include <stdio.h>2 int antal( int a[], int b[]){3 int i,j,m=0,n;4 for (i=0;i<4;i++){5 n=0;6 for (j=0;j<10;j++)7 if (a[j]==b[i])8 n=1;9 if (n==1)

10 m++;11 }12 return m;13 }14 int main( void){15 int x[10]={5,7,8,10,12,5,6,1,5,14};16 int y[4]={5,3,4,14};17 printf("Antal förkomster %d\n",antal(x,y));18 }

Observera:

• Här har vi hårdkodat innehållet i x och y . Bra att kunna. Ska man hårkoda ensträng skriver man char s[]="HEJSANHEJSAN" . Man behöver inte angesträngens längd. Det fixar kompilatorn!

• I den här uppgiften är längderna 4 och 10 också hårdkodade. Om så intevarit fallet måste funktionen antal också få reda på hur många elementsom ingår i x och y genom till exempelint antal(int a[],int b[],int na,int nb)

Håkan Strömberg 21 KTH STH

Page 22: TentamensTräning - KTHingforum.haninge.kth.se/c/TentaTraning.pdf · •Problem 17 Matematikern Richard Hamming har gjort en del arbeten in-om området felkorrigerande kod.Han introducerade

Problem 15

1 #include <stdio.h>2 #include <string.h>3 void rensa( char s[]){4 int i,j=0;5 char t[80];6 for(i=0;s[i]!=’\0’;i++)7 if(s[i]>=’0’ && s[i]<=’9’){8 t[j]=s[i];9 j++;

10 }11 t[j]=’\0’;12 strcpy(s,t);13 }14

15 int main( void){16 char a[]="12KR";17 char b[]="Tel:12 88 34";18 rensa(a);19 rensa(b);20 printf("%s\n",a);21 printf("%s\n",b);22 }

Observera:

• Funktionen rensa tar emot en sträng. Dess längd kan bestämmas genomstrlen eller genom att hålla utkik efter ’\0’ .

• Funktionen stegar igenom indatasträngen. Varje gång ett godkänt teckenpåträffas flyttas detta över till en temporär sträng t . Tänk på att man måstehålla reda på var i t tecknet ska placeras. Här genom j .

• När den nya t strängen är konstruerad lägger man till ’\0’ sist och kopierart till s .

• När man så återkommer till man så finns det rensade resultatet i s .

Håkan Strömberg 22 KTH STH

Page 23: TentamensTräning - KTHingforum.haninge.kth.se/c/TentaTraning.pdf · •Problem 17 Matematikern Richard Hamming har gjort en del arbeten in-om området felkorrigerande kod.Han introducerade

Problem 16

1 #include <stdio.h>2 int main( void){3 int tal,k,n;4 for (tal=1;tal<=3000;tal++){5 n=0;6 for (k=2;k<=6;k++)7 if (tal%k==1)8 n++;9 if (n==5 && tal%7==0)

10 printf("%8d",tal);11 }12 printf("\n");13 }

Observera:

• Du måste känna till hur %-operatorn fungerar!

Håkan Strömberg 23 KTH STH

Page 24: TentamensTräning - KTHingforum.haninge.kth.se/c/TentaTraning.pdf · •Problem 17 Matematikern Richard Hamming har gjort en del arbeten in-om området felkorrigerande kod.Han introducerade

Problem 17

1 #include <stdio.h>2 int main( void){3 FILE * fil;4 int i,j,k,n,r1,r2,max=0;5 char rad[20][80];6 fil=fopen("uppg17.dat","rt");7 for (i=0;i<20;i++)8 fscanf(fil,"%s",rad[i]);9 fclose(fil);

10 for (i=0;i<=18;i++){11 for (j=i+1;j<=19;j++){12 n=0;13 for (k=0;rad[i][k]!=’\0’;k++)14 if (rad[i][k]!=rad[j][k])15 n++;16 if (n>=max){17 r1=i;18 r2=j;19 max=n;20 }21 }22 }23 fclose(fil);24 printf("Största avståndet %d mellan %d och %d\n",max,r1+1 ,r2+1);25 }

Observera:

• Nu vet du väl hur man deklarera och läser in strängar till en array och char ?

• För att kunna jämföra samtliga par av strängar behövs en dubbelloop. Dumåste förstå villkoret rad[i][k]!=rad[j][k] .

Håkan Strömberg 24 KTH STH

Page 25: TentamensTräning - KTHingforum.haninge.kth.se/c/TentaTraning.pdf · •Problem 17 Matematikern Richard Hamming har gjort en del arbeten in-om området felkorrigerande kod.Han introducerade

Problem 18

1 #include <stdio.h>2 int main( void){3 FILE * infil;4 int horn[8],antal,k,f1,f2,x,y;5 infil=fopen("uppg18.dat","rt");6 for (k=0;k<8;k++)7 fscanf(infil,"%d",&horn[k]);8 fscanf(infil,"%d",&antal);9 for (k=1;k<=antal;k++){

10 fscanf(infil,"%d %d",&x,&y);11 f1=0;12 f2=0;13 f1=x>=horn[0] && x<=horn[2] && y>=horn[3] && y<=horn[1];14 f2=x>=horn[4] && x<=horn[6] && y>=horn[7] && y<=horn[5];15 printf("%2d %2d ",x,y);16 if (f1 && f2)17 printf("Ligger i båda\n");18 if (f1 && !f2)19 printf("Ligger endast i A\n");20 if (!f1 && f2)21 printf("Ligger endast i B\n");22 if (!f1 && !f2)23 printf("Ligger inte i någon\n");24 }25 fclose(infil);26 }

Håkan Strömberg 25 KTH STH

Page 26: TentamensTräning - KTHingforum.haninge.kth.se/c/TentaTraning.pdf · •Problem 17 Matematikern Richard Hamming har gjort en del arbeten in-om området felkorrigerande kod.Han introducerade

Problem 19

1 #include <stdio.h>2 int main( void){3 int n,i;4 float p;5 printf("Gruppen storlek: ");6 scanf("%d",&n);7 p=1.0;8 for (i=0;i<n;i++)9 p=p* (365.0-i)/365.0;

10 printf("Sannolikheten är %.4f\n",p);11 }

Observera:

• Den här uppgiften vill bara göra dig observant på skillnaden mellan heltals-och flyttalsdivision.

Håkan Strömberg 26 KTH STH

Page 27: TentamensTräning - KTHingforum.haninge.kth.se/c/TentaTraning.pdf · •Problem 17 Matematikern Richard Hamming har gjort en del arbeten in-om området felkorrigerande kod.Han introducerade

Problem 20

1 #include <stdio.h>2 int main( void){3 int a,b,c,d;4 for (a=0;a<=1;a++)5 for (b=0;b<=1;b++)6 for (c=0;c<=1;c++)7 for (d=0;d<=1;d++)8 if (a&&!b&&c||b&&!c&&d||a&&d&&b)9 printf("Sant då a=%d b=%d c=%d d=%d\n",a,b,c,d);

10 }

Observera:

• Talet 0 används för att beteckna falskt (FALSE). Alla andra värden betraktassom sant (TRUE). Då speciellt värdet 1.

Håkan Strömberg 27 KTH STH

Page 28: TentamensTräning - KTHingforum.haninge.kth.se/c/TentaTraning.pdf · •Problem 17 Matematikern Richard Hamming har gjort en del arbeten in-om området felkorrigerande kod.Han introducerade

Problem 21

1 #include <stdio.h>2 int main( void){3 int t,i=0,n,j,k,a[10],tmp;4 printf("Talet: ");5 scanf("%d",&t);6 while (t>0){7 a[i]=t%10;8 t=t/10;9 i++;

10 }11 n=i-1;12 for (j=0;j<=n-1;j++)13 for (k=j+1;k<=n;k++)14 if (a[j]<a[k]){15 tmp=a[j];16 a[j]=a[k];17 a[k]=tmp;18 }19 t=0;20 for (i=0;i<=n;i++)21 t=10 * t+a[i];22 printf("Nya talet: %d\n",t);23 }

Observera:

• Viktigast i detta problem är hur man packar upp siffrorna i ett tal. Se till attdu förstår raderna 6− 10.

• Raderna 19− 21 visar hur man bygger upp ett tal från givna siffror. Även detviktig kunskap!

Håkan Strömberg 28 KTH STH

Page 29: TentamensTräning - KTHingforum.haninge.kth.se/c/TentaTraning.pdf · •Problem 17 Matematikern Richard Hamming har gjort en del arbeten in-om området felkorrigerande kod.Han introducerade

Problem 22

1 #include <stdio.h>2 #include <stdlib.h>3 #include <time.h>4

5 struct lon{6 int manlon;7 int kvinlon;8 };9

10 int main( void){11 FILE * fil;12 struct lon familj;13 int i,antal=0;14

15 fil=fopen("uppg22.dat","rb");16 for (i=1;i<=100;i++){17 fread(&familj, sizeof( struct lon),1,fil);18 if (familj.manlon>familj.kvinlon)19 antal++;20 }21 fclose(fil);22 printf("%d män har högre lön\n",antal);23 }

Observera:

• När det gäller binära filer (i denna kurs) är det alltid kopplat en struct tillden.

• Du måste förstå vad rad 12 innebär. Vi deklarerar en variabel av datatypenstruct lon .

• Rad 15 visar hur man öppnar en binär fil för läsning. Ofta har textfiler filtil-lägget .txt och binärfiler .dat . Detta är ingen lag! Vilka filtillägg som helstär tillåtna (även om en del är olämpliga).

• Rad 17 är viktig för den som ska läsa från en binärfil. Läs mer i boken omdu är osäker. sizeof är här en viktig funktion för att ta reda på hur mångabyte en variabel av datattypen struct lon tar upp i minnet.

Håkan Strömberg 29 KTH STH

Page 30: TentamensTräning - KTHingforum.haninge.kth.se/c/TentaTraning.pdf · •Problem 17 Matematikern Richard Hamming har gjort en del arbeten in-om området felkorrigerande kod.Han introducerade

Problem 23

1 #include <stdio.h>2 #include <stdlib.h>3

4 struct persontyp{5 char namn[20];6 int antal;7 int typ;8 };9

10 int main( void){11 FILE * in;12 struct persontyp person,max[4];13 int k,antal,t;14

15 in=fopen("uppg23.dat","rb");16

17 fseek(in,0,SEEK_END);18 antal=ftell(in)/ sizeof( struct persontyp);19 printf("%d\n",ftell(in));20 printf("%d\n", sizeof( struct persontyp));21 printf("Det finns %d namnposter\n",antal);22 fseek(in,0,SEEK_SET);23

24 for (k=1;k<=3;k++)25 max[k].antal=0;26

27 for (k=1;k<=antal;k++){28 fread(&person, sizeof( struct persontyp),1,in);29 t=person.typ;30 if (max[t].antal<person.antal)31 max[t]=person;32 }33

34 printf("%s och %s %s\n",max[3].namn,max[2].namn,max[1] .namn);35 fclose(in);36 }

Observera:

17-22 De gånger man inte får reda på hur många poster filen innehåller kan man tareda på det genom följande rader. Rad 17 flyttar filpekaren till slutet av filen.Med hjälp av ftell() får man reda på hur långt ifrån början (i byte räknat)filpekaren står. Eftersom pekaren står sist i filen vet man genom ftell hurstor filen är. Dividerar vi detta tal med sizeof(struct persontyp) harvi direkt antalet poster. Med seek i rad 22 flyttar vi så tillbaka filpekaren tillbörjan av filen. Raderna 10− 21 behövs förstås inte.

Håkan Strömberg 30 KTH STH

Page 31: TentamensTräning - KTHingforum.haninge.kth.se/c/TentaTraning.pdf · •Problem 17 Matematikern Richard Hamming har gjort en del arbeten in-om området felkorrigerande kod.Han introducerade

Problem 24

1 #include <stdio.h>2 struct klapptyp{3 char namn[40];4 int bredd,hojd,langd;5 };6 int main( void){7 FILE * infil;8 struct klapptyp klapp;9 int i,n,antal=0;

10 infil=fopen("uppg24.dat","rb");11 fseek(infil,0,SEEK_END);12 n=ftell(infil)/ sizeof(klapptyp);13 rewind(infil);14 for (i=1;i<=n;i++){15 fread(&klapp, sizeof(klapptyp),1,infil);16 if (klapp.bredd * klapp.hojd * klapp.langd>25000){17 antal++;18 printf("%-40s\n",klapp.namn);19 }20 }21 printf("Det finns %d för stora paket\n",antal);22 fclose(infil);23 }

Observera:

13 Ett alternativt sätt att flytta filpekaren till början av filen.

Håkan Strömberg 31 KTH STH