TentamensTräning. Läsanvisningar

Relevanta dokument
Fråga 13. Skriv en loop som fyller arrayen int v[100] med talen

HI1024, Programmering, grundkurs, 8hp KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: Fredagen den 21 oktober 2011,

Enkla uppgifter. Uppgift 1. Uppgift 2

Dagens problem. Tal på fil. Förvandla heltal till sträng. Dialog

1,3,5,7,9,...,99. Skriv ett program som genererar en multiplikationstabell med följande utseende

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl Tentamen i Programmering C, Fri, Kväll,

TENTAMEN. Programmering Grundkurs (HI1900) Skrivtid 13:15-18:15. Fredagen 14 januari Tentamen består av 8 sidor

Programmering, grundkurs, 8.0 hp, Elektro, KTH, hösten Detta är andra problemlösningsföreläsningen, vi diskuterar problemen ur Problem II.

Arrays (indicerade variabler) Föreläsning 6

BMI = (vikt i kg) / (längd i m) 2. Lösningsförslag

Programmering Grundkurs (HI1900) Teoridel

Indicerade variabler

Arrays (indicerade variabler) Föreläsning 4

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl Omtentamen i Programmering C, Fri, Kväll,

Programmering, grundkurs, 8.0 hp HI1024, HI1900 etc., Tentamen TEN1. Måndagen den 10 januari 2011,

Programmering Grundkurs (6H2950) Grundläggande Programmering (6A2001)

Fråga 11. Vad skrivs ut? Fråga 12. Vad skrivs ut? Fråga 13. Vad skrivs ut? x=x+y; y=x-y; x=x-y;

KTH STH TENTAMEN. HI1024:TEN2 - Praktisk tentamen Tid: 8-13, den 18 februari 2012

C++ Slumptalsfunktioner + switch-satsen

TENTAMEN. Programmering Grundkurs (HI1900) Skrivtid 13:15-18:15. Tisdagen 26 april Tentamen består av 8 sidor

Belopp Belopp > procent

Uppgifter till praktiska tentan, del A. (7 / 27)

Lösningar till tentauppgifterna sätts ut på kurssidan på nätet idag kl

Switch, Array (fält) switch break, continue, goto (scary) Sammansatta tilldelningar Kommentarer Array Sortering

översiktskurs (5DV031)

Lösningar till uppgifterna sätts ut på kurssidan och på WebCT (Gamla Tentor) i dag kl 19. Tentamen i Programmering C, 5p, Distans, övriga,

Uppgifter att lösa 1,1,2,3,5,8,13,21...

Planering Programmering grundkurs HI1024 HT TIDAA

Planering Programmering grundkurs HI1024 HT 2014

Följande, ur problemsynpunkt enkla uppgifter, är till för att nöta in dagens teori.

Skriv i mån av plats dina lösningar direkt i tentamen. Skriv ditt kodnummer längst upp på varje blad.

HI1024, Programmering, grundkurs, 8hp KTH STH TENTAMEN. HI1024:TEN1 - Teoretisk tentamen Tid: Torsdagen den 20 oktober 2011,

Alla datorprogram har en sak gemensam; alla processerar indata för att producera något slags resultat, utdata.

Programmering i C, 7,5 hp

4 Sammansatta datatyper

Uppgift 1 ( Betyg 3 uppgift )

HI1024 Programmering, grundkurs TEN

Lösningar till tentauppgifterna sätts ut på kurssidan på nätet idag kl 19. Omtentamen i Programmering C, 5p, fristående, kväll,

Planering Programmering grundkurs HI1024 HT data

Enkla datatyper minne

Övning från förra gången: readword

LÖSNINGSFÖRSLAG TILL Tentamen i objektorienterad programmering i C++ I

Föreläsning 9. Repetition och exempelproblem

Johan Karlsson Datavetenskap för teknisk kemi, 10p, moment 1 Datavetenskap Umeå Universitet. Tentamen

Lösningar till uppgifterna sätts ut på kurssidan på nätet idag kl Omtentamen i Programmering C, 5p, A1, D1, E1, Fri, Pr1, Te/Ek1,

HI1024 Programmering, grundkurs TEN

Funktioner och programstruktur. Föreläsning 5

En kort text om programmering i C.

*Pekarvärden *Pekarvariabler & *

Fråga 15. Följande deklarationer är givna

2 Pekare och dynamiska variabler.

Tentamen ges för: Tentamensdatum: Tid:

Fråga 5. Vad krävs av funktionen undersok(a) för att b ska ökas med 1 respektive minskas med 1?

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp

Tentamen TANA17 Matematiska beräkningar Provkod: DAT1 Godkänd: 8p av totalt 20p Tid: 21:a April klockan

[] Arrayer = Indexerad variabel

Programmeringsteknik med C och Matlab

Funktioner och programstruktur. Föreläsning 5

Tentamen TAIU07 Matematiska beräkningar med MATLAB för MI

TENTAMEN MOM1 GRUNDLÄGGANDE PROGRAMMERINGSTEKNIK OCH

Programmering, grundkurs, 8.0 hp HI1024, omtentamen, TEN1. Tisdagen den 7 juni 2011,

Pekare. Pekare. Varför använder vi pekare? Vad är en pekare? Pekare. Deklaration/initiering av pekare

Inledande programmering med C# (1DV402) Summera med while"-satsen

Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl 13. Omtentamen i Programmering C, 5p, A1, D1, PA1, Fri,

Indexerade variabler

Programmeringsteknik med C och Matlab

TDIU01 - Programmering i C++, grundkurs

Programmering, grundkurs, 8.0 hp, Elektro, KTH, hösten 2010

Klassdeklaration. Metoddeklaration. Parameteröverföring

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Tentamen i. för D1 m fl, även distanskursen. lördag 26 februari 2011

Uttryck och villkor. Föreläsning 2

Programmering, grundkurs, 8.0 hp HI1024, extra tentamen, TEN1, för TIDAA1. Fredagen den 11 mars 2011,

Operatorer Tilldelning Kodblock { } if satsen Logiska uttryck Att programmera

Tentamen TANA17 Matematiska beräkningar Provkod: DAT1 Godkänd: 8p av totalt 20p Tid: 14:e januari klockan

HI1024 Programmering, grundkurs TEN

Datalogi I, grundkurs med Java 10p, 2D4112, Fiktiv tentamen, svar och lösningar och extra kommentarer till vissa uppgifter 1a) Dividera förs

Föreläsning 11. Strängar

Programmering, grundkurs, 8.0 hp HI1024, TEN1. Fredagen den 2 mars 2012

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Användarhandledning Version 1.2

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp

Data, typ, selektion, iteration

Tentamen i Programmering grundkurs och Programmering C

Lämna in en ifylld kursvärdering tillsammans med tentan! Lösningar till uppgifterna sätts ut på kurssidan på nätet i dag kl

Loopar och datatyper. Föreläsning 3

Tentamen i. för D1 m fl, även distanskursen. lördag 28 maj 2011

Loopar och datatyper. Föreläsning 3

Lösningsförslag: Instuderingsfrågor, del D

BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X

UPPGIFT 1 V75 FIGUR 1.

Föreläsning 2. Variabler, tilldelning och kodblock{} if-satsen Logiska operatorer Andra operatorer Att programmera

Datorlära 6. Arbeta med strängar Inmatning med tangentbordet Bygga ett program med inmatning, funktioner, osv

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp

#include <stdio.h> #include <string.h>

Tentamen *:58/ID100V Programmering i C Exempel 3

Föreläsning REPETITION & EXTENTA

Visual Basic, en snabbgenomgång

kl Tentaupplägg

Grundläggande programmering med C# 7,5 högskolepoäng

Transkript:

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 program 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

Problem 5 På filen uppg5.dat finns resultaten från senaste tentamen. För varje student (en rad på filen) anges studentkod, ett tresiffrigt heltal och resultat ett annat heltal. Filen inleds med ett tal som anger hur många studenter som ingår. Skriv ett program skriver ut studentkoden för de studenter vars resultat ä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.dat och placerar i arrayen lista. Bygg nu ut detta program så att det bestämmer den största summan man kan få genom att addera tre på varandra följande tal i listan. Svar: Den största summa som kan erhållas är 202, som bildas med det 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 ruta 1000. På varje ruta vars nummer slutar på 0 står en motståndarpjäs, som du kommer att peta ut ur spelet om du hamnar på den rutan. Skriv ett program som 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äser bör bli petade. Problem 8 Skriv ett program som tar reda på hur ofta man får en kåk när man kastar fem tärningar. En kåk uppkommer då tre av tärningarna visar samma antal ögon och de två andra också är lika, men skilda ifrån de första tre. 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 slumpar fram nya rader och som tar reda på hur många det behövs innan en tagits fram, 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 komma betydligt 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 parenteser ska dessa tillsammans med inneslutna texten inte återfinnas i utskriften. Till exempel från AB(CD)EFGH(IJK)L ska utskriften bli ABEFGHL. Indata kan bara innehålla korrekt använda parenteser. Problem 11 För korsordslösaren skriver vi detta program. På filen uppg11.dat finns en mängd ord, ett på varje rad och alla med fem bokstäver. Första raden i filen anger antalet ord. Skriv ett program som tar emot en söksträng och söker igenom filen och skriver ut ord, som matchar söksträngen. En söksträng kan innehålla förutom små bokstäver (gemener) också asterisker (*). Håkan Strömberg 2 KTH STH

En asterisk står för en godtycklig bokstav. Om programmet till exempel ges sö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 pojknamn. Alla namn utom ett förekommer två gånger. Skriv ett program som tar reda 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 funktioner. Var och en av dem ska ta emot en vektor a innehållande 100000 framslumpade 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 returnerar hur många gånger talet t förekommer i par. I sekvensen...35554... bildar 5 två par. Funktionen langsta med samma parametrar som funktionerna ovan ska ta reda på den längsta sekvensen där enbart talet t förekommer. Funktionen sekvens ska räkna och returnera antalet gånger sekvensen 123456 förekommer i a. Svar: När jag körde programmet fick jag följande resultat: Antal 5:or är 16415 Antal par av 3:or är 2823 Längsta sekvensen av 4:or är 7 Antal 123456 är 3 Problem 14 Skriv en funktion antal, som tar emot två heltalsvektorer a och b. 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 och som plockar bort alla tecken som inte är siffror. Inledningen till programmet ges 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 resten 0 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

Problem 17 Matematikern Richard Hamming har gjort en del arbeten inom området felkorrigerande kod. Han introducerade bland annat Hammingavstånd som förklaras här: Två vektorer v 1 = {1011110101011100010} och v 2 = {0010101100010111010} har avståndet 8, eftersom v 1 och v 2 skiljer sig åt på 8 platser. På filen uppg17.txt finns 20 vektorer, en på varje rad. Vektorerna innehå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 har det 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 (x 1,y 1 ) det övre vänstra hörnet och (x 2,y 2 ), det nedre högra två rader med fyra tal i nämnd ordning. Den första raden beskriver rektangeln A och den andra B. 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 passande 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å linjen) till en rektangel betraktas som den ligger i rektangeln. Testfilen ska ge följande utskrift: 2 1 Ligger inte i någon 9 2 Ligger endast i A 8 7 Ligger i båda 5 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öljande formel: p = 365 365 364 365 363 365 n+1... 365 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

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 vilketnsom sannolikheten p är så nära 0.5 som möjligt. Svar: För n = 23 är den sökta sannolikheten p = 0.4927 Problem 20 Här efterlyser vi ett program som ska testa boolska uttryck och skriva ut för vilka värden på de fyra ingående boolska variablerna, a,b,c och d 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 anta värdena sant eller falskt. Svar: Uttrycket är sant då a b c d falskt sant falskt sant sant falskt sant falskt sant falskt sant sant sant sant falskt sant sant 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 fallande ordning. 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 postbeskrivning: struct lon{ int manlon; int kvinlon; }; Skriv ett program som tar reda i hur många familjer mannen har högre lön kvinnan. 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

En post innehåller ett herrnamn, damnnamn eller efternamn. De i Sverige vanligaste i varje kategori. Tillsammans med namn finns också antal, som anger hur många invånare som bär detta namn. Fältet typ antar tre olika värden enligt följande tabell 1 Efternamn 2 Herrnamn 3 Damnamn Skriv ett program som tar reda på och skriver ut, den troligtvis vanligaste namnkombinationen för ett älskande par i Sverige! Det vill säga en mening: <vanligaste damnamnet> och <vanligaste herrnamnet> <vanligaste efternamnet>. Svar: Maria och Erik Johansson. Problem 24 På binärfilen uppg24.dat finns ett antal poster enligt följande postbeskrivning: struct paket { char adressat[40]; int bredd, hojd, langd; }; Vissa av paketen levereras direkt till adressaten, medan andra anses vara för skrymmande 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 cm 3 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.dat Följande personer har paket att hämta: Maria Karlsson Kristina Svensson Hans Bergström Arne Fredriksson Leif Björk Emanuel Bergqvist Berit Josefsson Fredrik Lund Det finns 8 för stora paket Håkan Strömberg 6 KTH STH

Lösningsförslag Problem 1 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 } I samband med textfiler finns i allmänhet, inledningsvis, ett tal som anger hur många poster som följer i filen. Eftersom feof är en ganska klumpig funktion i C. Vill du trots det kunna hantera feof hänvisas till boken, sidan 457. Håkan Strömberg 7 KTH STH

Problem 2 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 } Här har vi låtit sortera talen för att finna det näst största. Detta kan betraktas som 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

Problem 3 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 } Här ska du förstå att det handlar om två loopar, en för antalet kast och en för de fem tärningarna i varje kast. 12-15 Vi söker ett maximivärde och samtidigt sparar vi undan numret på det kast då maximivärdet inträffade. Håkan Strömberg 9 KTH STH

Problem 4 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

Problem 5 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 } Här ska du förstå att det handlar om två genomgångar av data. Först läser vi in data och placerar i en matris, samtidigt summerar vi resultatet för varje student. 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 lagra resultatet i en variabel medel, istället som här, för var varje student. Håkan Strömberg 11 KTH STH

Problem 6 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 } Det finns 18 starter för de tre talen, index 0...17. För varje tal ska vi summera tre tal. Vi tar till en loop (kanske inte nödvändigt eftersom det endast är tre tal som ska summeras) som summerar de tre talen. Du måste först vad lista[i+j] står för! 13-14 Vi kollar om det är ett nytt rekord Håkan Strömberg 12 KTH STH

Problem 7 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 } Här är det lämpligt med en do- eller while-loop eftersom vi inte vet hur må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

Problem 8 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 } 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öjlighet att variera resultatet. Detta görs genom srand(time(0)), time får man 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 uppskattning om sannolikheten för en viss händelse,som vi får genom att dividera antalet i n med 10000 (och eventuellt multiplicera med 100 för att få resultatet i procent). 10-16 Om vi sorterar resultatet hos de fem tärningarna blir det enklare att avgöra om 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

Problem 9 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 } 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

Problem 10 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 else 11 if (text[i]== ) ) 12 n=0; 13 else 14 if (n==0) 15 printf("%c",text[i]); 16 printf("\n"); 17 } 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änsterparentes sätts flaggan till 1 och utskriften i rad 15 stängs av. Så fort en högerparentes på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

Problem 11 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 } Den yttre loopen går igenom alla orden på filen. För varje ord stegar vi igenom samtliga tecken, 13 15. Om det finns en asterisk i söksträngen, får det 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 villkoret i 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 under den 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

Problem 12 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 } 4 Vi gör plats för 19 ord (namn), som kan vara maximalt 10 tecken långa. Vi gör plats för 11 tecken, även för strängavslutningen \0. Det är viktigt att du 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 taget till 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 mellan rader 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

Problem 13 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

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 } Det viktigaste med detta program är hur man använder sig av arrayer som parametrar 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 olika funktionerna. Håkan Strömberg 20 KTH STH

Problem 14 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 } Här har vi hårdkodat innehållet i x och y. Bra att kunna. Ska man hårkoda en sträng skriver man char s[]="hejsanhejsan". Man behöver inte ange strängens längd. Det fixar kompilatorn! I den här uppgiften är längderna 4 och 10 också hårdkodade. Om så inte varit fallet måste funktionen antal också få reda på hur många element som ingår i x och y genom till exempel int antal(int a[],int b[],int na,int nb) Håkan Strömberg 21 KTH STH

Problem 15 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 } Funktionen rensa tar emot en sträng. Dess längd kan bestämmas genom strlen eller genom att hålla utkik efter \0. Funktionen stegar igenom indatasträngen. Varje gång ett godkänt tecken påträffas flyttas detta över till en temporär sträng t. Tänk på att man måste hå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 kopierar t till s. När man så återkommer till man så finns det rensade resultatet i s. Håkan Strömberg 22 KTH STH

Problem 16 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 } Du måste känna till hur %-operatorn fungerar! Håkan Strömberg 23 KTH STH

Problem 17 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 } 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. Du måste förstå villkoret rad[i][k]!=rad[j][k]. Håkan Strömberg 24 KTH STH

Problem 18 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

Problem 19 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 } Den här uppgiften vill bara göra dig observant på skillnaden mellan heltalsoch flyttalsdivision. Håkan Strömberg 26 KTH STH

Problem 20 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 } Talet 0 används för att beteckna falskt (FALSE). Alla andra värden betraktas som sant (TRUE). Då speciellt värdet 1. Håkan Strömberg 27 KTH STH

Problem 21 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 } Viktigast i detta problem är hur man packar upp siffrorna i ett tal. Se till att du förstår raderna 6 10. Raderna 19 21 visar hur man bygger upp ett tal från givna siffror. Även det viktig kunskap! Håkan Strömberg 28 KTH STH

Problem 22 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 } När det gäller binära filer (i denna kurs) är det alltid kopplat en struct till den. Du måste förstå vad rad 12 innebär. Vi deklarerar en variabel av datatypen struct lon. Rad 15 visar hur man öppnar en binär fil för läsning. Ofta har textfiler filtillä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 om du är osäker. sizeof är här en viktig funktion för att ta reda på hur många byte en variabel av datattypen struct lon tar upp i minnet. Håkan Strömberg 29 KTH STH

Problem 23 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 } 17-22 De gånger man inte får reda på hur många poster filen innehåller kan man ta reda 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 hur stor filen är. Dividerar vi detta tal med sizeof(struct persontyp) har vi direkt antalet poster. Med seek i rad 22 flyttar vi så tillbaka filpekaren till början av filen. Raderna 10 21 behövs förstås inte. Håkan Strömberg 30 KTH STH

Problem 24 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 } 13 Ett alternativt sätt att flytta filpekaren till början av filen. Håkan Strömberg 31 KTH STH