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

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

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

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

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

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

Belopp Belopp > procent

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

Enkla uppgifter. Uppgift 1. Uppgift 2

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

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

Programmering Grundkurs (HI1900) Teoridel

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

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

HI1024 Programmering, grundkurs TEN

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

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

HI1024 Programmering, grundkurs TEN

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

HI1024 Programmering, grundkurs TEN

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

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

TENTAMEN. Programmering Grundkurs (HI1900) Skrivtid 8:15-13:15. Onsdagen 10 juni Tentamen består av 8 sidor

a = a a a a a a ± ± ± ±500

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

Programmering i C, 7,5 hp

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

TENTAMEN MOM1 GRUNDLÄGGANDE PROGRAMMERINGSTEKNIK OCH

HI1024 Programmering, grundkurs TEN

HI1024 Programmering, grundkurs TEN

Tentamen ges för: Tentamensdatum: Tid:

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

HI1024 Programmering, grundkurs TEN

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,

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

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

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

Loopar och datatyper. Föreläsning 3

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

Enkla datatyper minne

Loopar och datatyper. Föreläsning 3

Tentamen TEN1 HI

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

Tentamen i Programmering

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,

Tentamen TEN1 HI

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING. Övningstentamen 1

översiktskurs (5DV031)

Tentamen i Grundläggande Programvaruutveckling, TDA548

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

Tentamen i Programmering grundkurs och Programmering C

TENTAMEN. HF1002, 6H3120, 6H3117 Diskret Matematik. Skrivtid 13:15-18:15. Torsdagen 7 juni Tentamen består av 5 sidor.

Tentamen i Programmering grundkurs och Programmering C

Planering Programmering grundkurs HI1024 HT 2014

UPPGIFT 1 V75 FIGUR 1.

Problemlösning. Veckodagsproblemet Gissa talet Siffersumman

Funktioner och programstruktur. Föreläsning 5

En kort text om programmering i C.

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

OBJEKTORIENTERAD PROGRAMVARUUTVECKLING

Tecken & Strängar. Kapitel 7

ÖVNINGSTENTAMEN. HF1002, 6H3120, 6H3117 Diskret Matematik. Skrivtid 10:15-13:15. Torsdagen 20 maj Tentamen består av 4 sidor.

Komposanter, koordinater och vektorlängd Ja, den här teorin gick vi igenom igår. Istället koncentrerar vi oss på träning inför KS3 och tentamen.

Tentamen i TDP004 Objektorienterad Programmering Praktisk del

Funktioner. Räta linjen

kl Tentaupplägg

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;

*Pekarvärden *Pekarvariabler & *

Arrays (indicerade variabler) Föreläsning 6

Programmeringsolympiaden 2011 Kvalificering

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

Funktioner och programstruktur. Föreläsning 5

Den räta linjens ekvation

TENTAMEN. HF1002, 6H3120, 6H3117 Diskret Matematik. Skrivtid 8:15-13:15. Måndag 8 juni Tentamen består av 4 sidor.

Den räta linjens ekvation

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp

2 Pekare och dynamiska variabler.

TENTAMEN I PROGRAMMERING. På tentamen ges graderade betyg:. 3:a 24 poäng, 4:a 36 poäng och 5:a 48 poäng

kl Tentaupplägg

C++ Funktioner 1. int summa( int a, int b) //funktionshuvud { return a+b; //funktionskropp } Värmdö Gymnasium Programmering B ++ Datainstitutionen

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp

Problemlösning. Veckodagsproblemet Gissa talet Siffersumman

Tentamen i Programmering grundkurs och Programmering C

Föreläsning 11. Strängar

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

Det är principer och idéer som är viktiga. Skriv så att du övertygar examinatorn om att du har förstått dessa även om detaljer kan vara felaktiga.

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

1 Sifferkryss 21,15,9,22,15,8. i vårt exempel. Programmet ska i en tabell skriva ut de 9 talen, som för vårt exempel ger. Håkan Strömberg 1 KTH STH

Agenda. Arrayer deklaration, åtkomst Makron Flerdimensionella arrayer Initiering Strängar Funktioner och arrayer. Övningar nu och då

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

Föreläsning 9. Repetition och exempelproblem

TDP Regler

Programmeringsuppgifter 1

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

tentamensdags och lab 3

Boken?!?! Vad är ett program? Kompilerande-Interpreterande Programmeringsmiljö Hello World! Att programmera och ett enkelt program Variabler printf

Tentamen *:58/ID100V Programmering i C Exempel 3

Tentamen i Programmering grundkurs och Programmering C

UPPGIFT 1 TVÅPOTENSER. UPPGIFT 2 HISSEN I LUSTIGA HUSET.

4 Sammansatta datatyper

Planering Programmering grundkurs HI1024 HT TIDAA

Transkript:

TENTAMEN Programmering Grundkurs (HI1900) Skrivtid 8:15-13:15 Tisdagen 13 januari 2009 Tentamen består av 8 sidor Hjälpmedel Förutom dator med installerad Borland C++ 5.02, och DevCPP Utforskaren, Acrobat reader och Notepad (inga andra program), den kurslitteratur som använts under kursen, samt egna anteckningar, programlistningar och böcker. Dock inga egna disketter, CD-ROM eller USB-minne. Under W:\PROV\C finns program- och datafiler som kan komma till användning vid lösandet av uppgifterna. Kopiera över dessa till ditt konto. Till alla uppgifter ska ett program levereras i form av källkod (C eller CPP-fil). Dina bidrag lägger du i en katalog i roten på H:. Katalogen ska ha samma namn som prefixet i din mailadress. Exempelvis för Kalle Kula: HDI02KEKA. Namnen på lösningarna ska ges UPPG1.C till UPPG8.C. De är endast dessa filer som kommer att bedömas. Samtliga, till problemen hörande datafiler, där bokstäverna Å, Ä, Ö, ingår är lagrade i extended ASCII, vilket innebär att texten återges på rätt sätt då den skrivs ut i DOS-fönstret. Ange ditt namn som kommentar i varje programfil Rättningen görs genom att programmen körs ett antal gånger för olika indata. Om resultatet överensstämmer med det förväntade bedöms programmet som korrekt och ger 2 poäng. Om ett program ej kan kompileras utan fel, är det knappast troligt att det kommer att ge några poäng. I det fall där programmet läser från och eller skriver till en fil, testas programmet oftast med en annan fil än den bifogade. Betygsgränser (HI1900): Poäng 14-16 12-13 10-11 8-9 7 6 Betyg A B C D E Fx Resultatet anslås på kursens hemsida ingforum.haninge.kth.se/c i kodat skick. Lycka till! Håkan Strömberg Håkan Strömberg 1 KTH STH

Uppgift 1. Hemligt meddelande Genom att ersätta varje bokstav i ett meddelande med en annan får man meddelandet svårläst för alla som inte känner till nyckeln. Skriv ett program som tar emot ett chiffrerat meddelande, innehållande < 80 tecken, och som dechiffrerar det (översätter det till klartext) med hjälp av den givna nyckeln. I både klartext och det chiffrerade meddelandet kan endast ingå versaler, de 26 stora bokstäverna A till Z, alltså inte Å, Ä Ö, men däremot W. Dessutom kan mellanslag ingå, som inte ska översättas. Kod J K M X A N O Y V P E Q R Klartext A B C D E F G H I J K L M Kod H T D Z F G L C I S U B W Klartext N O P Q R S T U V W X Y Z Ett körningsexempel: Kodat? PJO EQJFJF LAHLJH Klartext? JAG KLARAR TENTAN Håkan Strömberg 2 KTH STH

Uppgift 2. Spelgalen Adam har sedan början av 80-talet spelat på hästar. Ibland flera gånger i veckan. Det är det där med att sluta när vinsten är som störst som är svårt. Man vet ju aldrig... Adam har under alla år fört dagbok över insatser och vinster. På filen dagbok.txt finns alla uppgifter. Filen inleds med ett tal som anger hur många. Därefter följer lika många rader. Först på raden återfinns ett datum på formen ÅÅÅÅMMDD, sedan följer det belopp som han vunnit (ett positivt heltal) eller förlorat (ett negativt heltal) vid det tillfället. Skriv ett program som tar reda på vid vilket datum hans totala vinst (som man får genom att summera alla vinster och förluster fram till det datumet) var som störst och hur stort beloppet då var. Det är inte säkert att detta belopp är positivt och då är det förstås den minsta förlusten vi är ut efter, en negativ vinst! Ett körningsexempel: 19850511 var hans vinst 311533 kr Håkan Strömberg 3 KTH STH

Uppgift 3. Maxtemperatur Från SMHI har vi fått data med temperaturuppgifter från några orter i Sverige under åren 1961-2007. Dessa data har konverterats till en binärfil, TEMP6107.DAT. Filen har följande postbeskrivning: struct dagtyp{ int stad; int datum; float temp[6]; }; I stad finns ett heltal tillförande följande orter 1 2 3 Karesuando Stockholm Falsterbo I datum finns ett 8-siffrigt heltal där dagens datum presenteras på formen ÅÅÅÅMMDD. I temp finns sex olika temperaturuppgifter för aktuell dag enligt Index Förklarning 0 Temperatur kl 06:00 1 Temperatur kl 12:00 2 Temperatur kl 18:00 3 Dygnets lägsta temperatur 4 Dygnets medeltemperatur 5 Dygnets högsta temperatur Skriv ett program som frågar efter ett årtal i det givna intervallet och som bestämmer den högsta uppmätta temperaturen under året för de tre orterna och som presenterar den tillsammans med det datum då temperaturen uppmättes. Ett körningsexempel Vilket årtal? 1972 Karesuando 30.6 19720703 Stockholm 30.5 19720629 Falsterbo 25.8 19720721 Totalt finns 17166 dygn mellan 19610101-2071231. I de fall då uppgift saknas noteras det med temperaturen 999.0. Håkan Strömberg 4 KTH STH

Uppgift 4. Sifferlek Termen digital root för heltalet n innebär att man upprepade gånger summerar talets ingående siffror tills summan blir < 10. Till exempel för talet 34783 får man Talet 34783 har digital root 7. 34783 3 + 4 + 7 + 8 + 3 = 25 25 2 + 5 = 7 På liknande sätt definieras multiplicative digital root för heltalet n, där man istället upprepade gånger multiplicerar ingående siffror tills produkten blir < 10. Till exempel för talet 34783 får man 34783 3 4 7 8 3 = 2016 2016 2 0 1 6 = 0 Talet 34783 har multiplicative digital root 0. Hos talet 34783 är alltså multiplicative digital root och digital root olika. Skriv ett program som tar reda på hur många tal i ett givet intervall som har samma digital root som multiplicative digital root. Ett körningsexempel: Från talet? 1000 Till talet? 2000 33 tal har den eftersökta egenskapen Bland dessa till exempel 1124, 1355, 1473 och 1977 Håkan Strömberg 5 KTH STH

Uppgift 5. Bildad triangel Figur 1: Adam har en 1 meter lång stav, med markeringar för varje centimeter. Han väljer ut två slumpmässiga markeringar och bryter staven i dessa. Hur stor är sannolikheten att han med hjälp av de tre uppkomna bitarna kan bilda en triangel? Skriv ett program som 100000 gånger väljer ut två brytpunkter och testar om det är möjligt att konstruera en triangel med en area > 0 av dessa. Ett körningsexempel: I 24.2% av försöken går det att bilda en triangel I figur 1 ser du en betydligt kortare stav, där då bitarna har längderna 5, 5, 5 det är möjligt att bilda en triangel. Däremot går det sämre då bitarna har längderna 3, 4, 8. Håkan Strömberg 6 KTH STH

Uppgift 6. Skärningspunkter I figuren finns 7 segment inritade. Tillsammans åstadkommer de 6 stycken skärningspunkter. Ett segment är en sträcka given genom två ändpunkter. Skriv ett program som med hjälp av den givna funktionen intersect bestämmer hur många skärningspunkter segmenten på filen segment.txt har tillsammans. Filen inleds med ett tal n < 100 som anger hur många segment den innehåller. Därefter följer n rader med 4 positiva heltal på varje, som var och en beskriver ett segment. Först på raden ges (x 1, y 1 ) till första ändpunkten, som följs av (x 2, y 2 ) till andra ändpunkten. Funktionen intersect, som finns på filen intersect.c tar emot en array 4 2. De två första raderna ska innehålla x och y för de två ändpunkterna till det första segmentet, en punkt på varje rad i den ordningen. De två avslutande raderna hos arrayen ska på samma sätt innehålla x och y för de två ändpunkterna till det andra segmentet. Om de två segmenten skär varandra returneras talet 1. Annars returneras 0. Ett körningsexempel: Det finns 6 skärningspunkter Håkan Strömberg 7 KTH STH

Uppgift 7. Bästa spelet Figur 2: Vid en omröstning bland n r röstande korades årets datorspel bland n s kandiderande spel. Varje röstande rangordnade de n s spelen från första till sista plats. Det spel som den röstande rankade högst fick n s poäng. Spelet på andra plats fick n s 1 poäng och så vidare ner till det sämsta spelet som fick 1 poäng. Genom att summera poängen för alla n r rangordningarna fick man så till slut en lista som efter sortering till exempel kunde se ut så här: Spel nr 5 fick 1142 poäng Spel nr 9 fick 1131 poäng Spel nr 7 fick 1124 poäng Spel nr 4 fick 1121 poäng Spel nr 3 fick 1117 poäng Spel nr 6 fick 1110 poäng Spel nr 2 fick 1096 poäng Spel nr 1 fick 1080 poäng Spel nr 10 fick 1055 poäng Spel nr 8 fick 1024 poäng Skriv ett program som hämtar data från filen roster.txt, beräknar, sorterar och skriver ut den totala listan i likhet med den ovan. Filen inleds med ett tal som anger hur många spel 2 n s 20 som ingick i omröstningen. På nästa rad återfinns antalet röstande 1 n r < 1000. Därefter följer n r rader, en för varje röstande, med n s tal på varje. Första talet anger numret på det spel som den röstande rankar högst, andra talet avser det näst högst rankade spelet och så vidare. Håkan Strömberg 8 KTH STH

Uppgift 8. Jämnt fördelat Festen är över. På bordet finns ett antal vinglas. En del är fulla med vin, andra halvfulla eller tomma. De 3 värdarna ska till att börja röja efter festen. Bland annat gäller det att diska vinglasen. De ska diska lika många var och dessutom vill de ha lika mycket av det överblivna vinet utan att för den skull hälla vin mellan glasen. Om vi till exempel antar att det finns 3 tomma, 6 halvfulla och 9 fulla glas kan de delas upp så här Tomma Halvfulla Fulla Värd 1 0 4 2 Värd 2 1 2 3 Värd 3 2 0 4 Som vi ser får alla 6 glas var att diska. Totalt får de också 4 fulla glas vin. Skriv ett program som frågar efter antalet glas av olika typ och som presenterar en lösning på hur glasen ska fördelas. Ett körningsexempel: Antal tomma glas? 1 Antal halvfulla glas? 7 Antal fulla glas? 7 Värd 1 -> T: 0 H: 3 F: 2 Värd 2 -> T: 0 H: 3 F: 2 Värd 3 -> T: 1 H: 1 F: 3 Utskriftens formatering är mindre viktig, så länge det klart framgår vad som är vad. Om problemet har flera lösningar räcker det att ditt program ger en av dessa. Håkan Strömberg 9 KTH STH

Uppgift 1. Hemligt meddelande Plan Ta emot meddelandet Upprepa för varje tecken i meddelandet Om tecknet inte är mellanslag{ Ta reda på viken plats bokstaven har i hemliga alfabetet Skriv ut bokstaven på motsvarande plats i alfabetet } Annars Skriv ut mellanslag Observera Hur man på enklaste sätt kan ge kod och alf värden efter tabellen i uppgiften Att man måste använda gets eftersom meddelandet kan innehålla mellanslag 1 #include <stdio.h> 2 #include <string.h> 3 int main(void){ 4 char kod[]="jkmxanoyvpeqrhtdzfglcisubw"; 5 char alf[]="abcdefghijklmnopqrstuvwxyz"; 6 char s[80]; 7 int i,j; 8 printf("meddelande? "); 9 gets(s); 10 for (i=0;i<strlen(s);i++) 11 if (s[i]!= ){ 12 j=0; 13 while (kod[j]!=s[i]) 14 j++; 15 printf("%c",alf[j]); 16 } 17 else 18 printf(" "); 19 } Håkan Strömberg 1 KTH STH

Uppgift 2. Spelgalen Plan Öppna filen Läs in hur många speldagar som finns noterade (n) Läs in första speldagens datum och belopp Upprepa n 1 gånger{ Läs in nästa datum och belopp Addera beloppet till det totala beloppet Om det totala beloppet är nytt rekord{ Spara nya rekordet Spara datum då rekordet slogs } } Skriv ut rekordet och datum då rekordet slogs Observera Att det först inlästa belopp och datum blir startvärden för max respektive maxdatum. 1 #include <stdio.h> 2 int main(void){ 3 FILE *fil; 4 int max,belopp,maxdatum,datum,n,i,tot; 5 fil=fopen("dagbok.txt","rt"); 6 fscanf(fil,"%d",&n); 7 fscanf(fil,"%d %d",&maxdatum,&max); 8 tot=max; 9 for (i=2;i<=n;i++){ 10 fscanf(fil,"%d %d",&datum,&belopp); 11 tot+=belopp; 12 if (tot>max){ 13 maxdatum=datum; 14 max=tot; 15 } 16 } 17 fclose(fil); 18 printf("datum %d hade han %d\n",maxdatum,max); 19 } Håkan Strömberg 2 KTH STH

Plan Öppna filen Läs in, från tangentbordet, aktuellt år Upprepa 3 17166 gånger { Läs in en post från filen Om det är rätt år Om det finns uppgift om högsta temperatur och om rekord för den staden{ Uppdatera rekordet för aktuell stad Uppdatera rekorddatum för aktuell stad } } Skriv ut resultatet, temperatur och datum, för varje stad Uppgift 3. Maxtemperatur Observera Definitionen av dagtyp måste vara exakt den som beskrivs i uppgiften och som utgör en nyckel till informationen på filen Visst klarar man sig med sex variabler, som håller reda på rekord och rekorddatum, men programmet blir betydligt kortare med arrayer. Tanken är att du så småningom automatiskt ska komma att tänka på den lösningen. Vi inför maxdatum[4] och maxtemp[4], där vi inte använder index 0. På samma smidiga sätt kan vi tilldela städernas namn till namn. Detta leder till endast en printf-sats i utskriften. Håkan Strömberg 3 KTH STH

1 #include <stdio.h> 2 3 struct dagtyp{ 4 int stad; 5 int datum; 6 float temp[6]; 7 }; 8 9 int main(void){ 10 FILE *fil; 11 struct dagtyp dag; 12 int i,j,maxdatum[4],ar; 13 float maxtemp[4]={0,-100,-100,-100}; 14 char namn[4][15]={"","karesuando","stockholm ","Falsterbo "}; 15 16 printf("vilket år? "); 17 scanf("%d",&ar); 18 fil=fopen("temp6107.dat","rb"); 19 for (i=1;i<=3*17166;i++){ 20 fread(&dag,sizeof(struct dagtyp),1,fil); 21 if (dag.datum/10000==ar) 22 if (dag.temp[5]!=-999.0 && dag.temp[5]>maxtemp[dag.stad]){ 23 maxtemp[dag.stad]=dag.temp[5]; 24 maxdatum[dag.stad]=dag.datum; 25 } 26 } 27 fclose(fil); 28 for (i=1;i<=3;i++) 29 printf("%s %5.1f %d\n",namn[i],maxtemp[i],maxdatum[i]); 30 } Håkan Strömberg 4 KTH STH

Uppgift 4. Sifferlek Plan Läs in undre gränsen (fran) Läs in övre gränsen (till) Loopa från fran till till{ Bestäm digital root, dr Bestäm multiplicative digital root, mdr Om dt är lika med mdr så Öka räknaren antal } Skriv ut värdet hos antal. Vi behöver till en funktion summa som returnerar digital root Den formella parametern tal får sitt värde från main Loopa så länge tal är större än 9 { Sätt sum lika med 0 Loopa så länge tal är större än 0 { Öka sum med entalssiffran hos tal Dividera tal med 10 (heltaldivision) } Sätt tal till sum } Returnera tal Vi behöver till en funktion produkt som returnerar multiplicative digital root och som är mycket lik den för digital root. Håkan Strömberg 5 KTH STH

1 #include <stdio.h> 2 3 int produkt(int tal){ 4 int p; 5 while (tal>9){ 6 p=1; 7 while (tal>0){ 8 p=p*(tal%10); 9 tal=tal/10; 10 } 11 tal=p; 12 }; 13 return tal; 14 } 15 16 int summa(int tal){ 17 int s; 18 while (tal>9){ 19 s=0; 20 while (tal>0){ 21 s=s+tal%10; 22 tal=tal/10; 23 } 24 tal=s; 25 }; 26 return tal; 27 } 28 29 int main(void){ 30 int fran,till,tal,antal=0; 31 printf("från tal? "); 32 scanf("%d",&fran); 33 printf("till tal? "); 34 scanf("%d",&till); 35 for (tal=fran;tal<=till;tal++) 36 if (summa(tal)==produkt(tal)) 37 antal++; 38 printf("det finns %d tal i intervallet\n",antal); 39 } Håkan Strömberg 6 KTH STH

Uppgift 5. Bildad triangel Plan Staven har 99 centimetermarkeringar. Vi ska slumpmässigt välja två olika markeringar. Vi behöver en loop för att vara säker på att få det. Eftersom det handlar om en simulering och att vi får samma tal två gånger i rad endast inträffar i cirka 1% av fallen, är det inte säkert att det upptäcks vid testkörning att denna loop inte finns med. När markeringarna är valda kan vi bestämma längden hos de tre bitarna. Om de två kortaste bitarna tillsammans är längre än den längsta kan vi konstruera en triangel. Om de däremot är lika långa som den längsta är det en definitionsak, om det ska betraktas som en triangel. 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <time.h> 4 5 int main(void){ 6 int i,b1,b2,s1,s2,s3,antal=0,j,tot=0; 7 srand(time(0)); 8 antal=0; 9 for (i=1;i<=100000;i++){ 10 b1=rand()%99+1; 11 do{ 12 b2=rand()%99+1; 13 }while(b2==b1); 14 if (b1>b2){ 15 s1=b2; 16 s2=b1-b2; 17 s3=100-b1; 18 } 19 else{ 20 s1=b1; 21 s2=b2-b1; 22 s3=100-b2; 23 } 24 if (s1+s2>s3 && s1+s3>s2 && s2+s3>s1) 25 antal++; 26 } 27 tot+=antal; 28 printf("triangel i %.2f%%\n",(float)100*tot/100000); 29 } Håkan Strömberg 7 KTH STH

Uppgift 6. Skärningspunkter Plan Denna uppgift bygger på teorin om räta linjens ekvation, kanske väl matematiskt i detta sammanhang. Funktionen intersect tar emot en matris innehållande x och y koordinater för fyra punkter. Två av dem ligger på en rät linje. De andra två på en annan. Vi bestämmer skärningspunkten för dessa två linjer med matematikens hjälp. Återstår att ta reda på att denna skärningspunkt ligger på båda segmenten. Alla segmenten matchas mot de övriga. 1 #include <stdio.h> 2 3 int intersect(int p[4][2]){ 4 int st,tt,n; 5 double s,t; 6 st=p[0][1]*p[2][0]-p[0][0]*p[2][1]-p[0][1]*p[3][0]+ 7 p[2][1]*p[3][0]+p[0][0]*p[3][1]-p[2][0]*p[3][1]; 8 n=-p[0][1]*p[2][0]+p[1][1]*p[2][0]+p[0][0]*p[2][1]- 9 p[1][0]*p[2][1]+p[0][1]*p[3][0]-p[1][1]*p[3][0]- 10 p[0][0]*p[3][1]+p[1][0]*p[3][1]; 11 tt=p[0][1]*p[1][0]-p[0][0]*p[1][1]-p[0][1]*p[2][0]+ 12 p[1][1]*p[2][0]+p[0][0]*p[2][1]-p[1][0]*p[2][1]; 13 s=(double)-st/n; 14 t=(double)tt/n; 15 return (0<=s && s<=1 && 0<=t && t<=1); 16 } Håkan Strömberg 8 KTH STH

1 int main(void){ 2 FILE *fil; 3 int p[100][4],s[4][2],antal=0,n,i,j; 4 fil=fopen("seg3.txt","rt"); 5 fscanf(fil,"%d",&n); 6 for(i=0;i<n;i++){ 7 for(j=0;j<4;j++) 8 fscanf(fil,"%d",&p[i][j]); 9 } 10 fclose(fil); 11 for(i=0;i<n-1;i++) 12 for(j=i+1;j<n;j++){ 13 s[0][0]=p[i][0]; 14 s[0][1]=p[i][1]; 15 s[1][0]=p[i][2]; 16 s[1][1]=p[i][3]; 17 s[2][0]=p[j][0]; 18 s[2][1]=p[j][1]; 19 s[3][0]=p[j][2]; 20 s[3][1]=p[j][3]; 21 if(intersect(s)){ 22 printf("%2d-%2d\n",i+1,j+1); 23 antal++; 24 } 25 } 26 printf("det finns %d skärningspunkter\n",antal); 27 } Håkan Strömberg 9 KTH STH

Uppgift 7. Bästa spelet Plan Öppna filen och läs in antalet spel nl och antalet röstande nr. Deklarera en matris med 2 kolumner. Varje rad 1...nl i matrisen tillhör ett av spelen. I den första kolumnen skriver vi in spelens nummer 1...nl. För varje röstande läser vi in nl spelnummer. För det första tilldelar vi aktuellt spel nl poäng, som adderas till den andra kolumnen. För det andra nl 1 poäng och så vidare. När vi läst all information från filen, finns på rad n i matrisen först spelets nummer och i andra kolumnen den samlade poängen Vi sorterar nu matrisen efter fallande poäng i andra kolumnen. När vi ska byta plats på två rader i matrisen måste vi komma ihåg att ta med båda kolumnerna. Till sist kan vi skriva ut resultatet genom nl rader. 1 #include <stdio.h> 2 int main(void){ 3 FILE *fil,*fil2; 4 int nl,nr,i,j,lat,totp[100][2]={{0,0}},t; 5 fil=fopen("rosterc.txt","rt"); 6 fscanf(fil,"%d",&nl); 7 fscanf(fil,"%d",&nr); 8 for (i=1;i<=nl;i++) 9 totp[i][0]=i; 10 for (i=1;i<=nr;i++) 11 for (j=nl;j>0;j--){ 12 fscanf(fil,"%d",&lat); 13 totp[lat][1]=totp[lat][1]+j; 14 } 15 fclose(fil); 16 for (i=1;i<nl;i++) 17 for (j=i+1;j<=nl;j++) 18 if (totp[i][1]<totp[j][1]){ 19 t=totp[i][0]; 20 totp[i][0]=totp[j][0]; 21 totp[j][0]=t; 22 t=totp[i][1]; 23 totp[i][1]=totp[j][1]; 24 totp[j][1]=t; 25 } 26 for (i=1;i<=nl;i++) 27 printf("spel nr %2d fick %d poäng\n",totp[i][0],totp[i][1]); 28 } Håkan Strömberg 10 KTH STH

Uppgift 8. Jämnt fördelat 1 #include <stdio.h> 2 3 int dela(int glas,int v[][3]){ 4 int g1,g2,n=-1; 5 for (g1=0;g1<=glas;g1++) 6 for (g2=0;g2<=glas;g2++) 7 if (g1+g2<=glas){ 8 n++; 9 v[n][0]=g1; 10 v[n][1]=g2; 11 v[n][2]=glas-g1-g2; 12 } 13 return n; 14 } Håkan Strömberg 11 KTH STH

1 int main(void){ 2 int t1,h1,f1,losning=0; 3 int i,j,k,m,glas[3],vin[3],nt,nh,nf; 4 int t[1000][3],h[1000][3],f[1000][3]; 5 printf("antal tomma glas? "); 6 scanf("%d",&t1); 7 printf("antal halvfulla glas? "); 8 scanf("%d",&h1); 9 printf("antal fulla glas? "); 10 scanf("%d",&f1); 11 nt=dela(t1,t); 12 nh=dela(h1,h); 13 nf=dela(f1,f); 14 15 for (i=0;i<=nt;i++) 16 for (j=0;j<=nh;j++) 17 for (k=0;k<=nf;k++){ 18 for (m=0;m<3;m++){ 19 glas[m]=0; 20 vin[m]=0; 21 } 22 for (m=0;m<3;m++) 23 glas[m]+=t[i][m]+h[j][m]+f[k][m]; 24 for (m=0;m<3;m++) 25 vin[m]+=h[j][m]+2*f[k][m]; 26 if (glas[0]==glas[1] && glas[0]==glas[2] && 27 vin[0]==vin[1] && vin[0]==vin[2]){ 28 losning++; 29 printf("lösning nr %d\n-------------\n",losning); 30 for (m=0;m<3;m++) 31 printf("person %d -> T:%2d H:%2d F:%2d\n",m+1,t[i][m], 32 h[j][m],f[k][m]); 33 } 34 } 35 } Håkan Strömberg 12 KTH STH