Programmering Grundkurs (6H2950) Grundläggande Programmering (6A2001) Skrivtid: 8:15-13:15 Datum: Torsdagen 2003-08-21 Tentamen består av 4 sidor Hjälpmedel: Förutom dator med installerad Borland C++ 5.02 och Utforskaren (inga andra program), den kurslitteratur som använts under kursen, samt egna anteckningar, programlistningar och böcker. Dock inga egna disketter eller CD- ROM. Under W:\PROV\C finns 8 mappar, en för varje uppgift. Här kan finnas program- och datafiler till motsvarande uppgift. 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.CPP till UPPG8.CPP. 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. 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: 8 10 poäng ger betyg 3, 11 13 poäng ger betyg 4 och 14 16 poäng ger betyg 5. Resultat anslås på programmets anslagstavla i RII. Lycka till! Niclas Hjelm, Håkan Strömberg Håkan Strömberg 1 KTH STH
Uppgift 1 Samma tal i två följder De två oändliga talföljderna nedan innehåller båda talen 26 och 54 12,19,26,33,40,47,54,61,68,75,82,89,96,103,110... 10,14,18,22,26,30,34,38,42,46,50,54,58,62,66,70... Den första följden startar med talet 12 och ökar sedan med 7, den andra startar med 10 och ökar med 4. Fortsätter vi framåt i de två följderna finner vi fler gemensamma tal. Skriv ett program som tar emot uppgift om följdernas start och steg och som bestämmer summan av de 5 första talen, som finns i båda följderna. Alla tal i uppgiften är positiva heltal. Följd 1 Start: 12 Följd 1 Steg : 7 Följd 2 Start: 10 Följd 2 Steg : 4 Den sökta summan är 410 Uppgift 2 Vita och svarta kulor I en urna finns v vita och s svarta kulor. Man ska nu dra en kula i taget från urnan tills alla vita kulor är dragna. Eftersom man inte lägger tillbaka kulor i urnan är försöket över efter minst v och som mest v+s dragningar. Skriv ett program som tar emot uppgift om antalet vita (v,1 v 10) och antalet svarta (s,1 s 10) kulor och som simulerar 100000 försök. Som resultat skrivs en tabell, som presenterar frekvensen i procent för de olika längderna hos försöken. Antal vita kulor : 5 Antal svarta kulor: 4 5 dragningar 0.79 % 6 dragningar 3.97 % 7 dragningar 11.91 % 8 dragningar 27.78 % 9 dragningar 55.56 % 0.79 % av försöken var över redan efter 5 dragningar. I hela 55.56 % fall behövdes det dock 9 dragningar (alla kulorna). Ditt program kommer troligtvis inte att ge exakt samma resultat. Håkan Strömberg 2 KTH STH
Uppgift 3 Siffersumma och sifferprodukt Talet 327 har siffersumman 12 eftersom 3+2+7 = 12 och och sifferprodukten 42 eftersom 3 2 7 = 42. Skriv ett program som tar emot uppgift om önskad siffersumma och sifferprodukt och som tar reda på det minsta positiva heltalet med just den siffersumman och sifferprodukten. Siffersumma : 12 Sifferprodukt : 42 Det eftersökta talet är 237 Uppgift 4 Överhettning Den anläggning som ska bevakas med hjälp av vårt program får inte bli överhettad. Med överhettad menas att den arbetat i otillåtet hög temperatur, över t grader, i minst m minuter i sträck. Om detta inträffar ska larmet slås på. En givare sänder uppgift om temperaturen till vår dator varje minut. Skriv ett program som utför denna övervakning genom att hämta data från filen temp.txt. På första raden anges maxtemperatur, t. På andra antalet minuter, m, och på tredje ett tal som anger hur många minuter p övervakningen gäller och på efterföljande rader finns temperaturer, från minut 1 till minut p. Alla indata är heltal. Körningsexemplet ger följande utskrifter: Maxtemeperatur 300 grader Intervallets längd är 3 min ALARM kommer efter 29 minuter Uppgift 5 Det mest förväntade ordet På filen fyrord.txt finns alla ord på fyra bokstäver, som också finns i SAOL (Svenska Akademins Ordlista). Skriv ett program som beräknar det mest förväntade ordet! Vi definierar detta ord genom att som inledande bokstav välja den vanligaste begynnelsebokstaven bland de givna orden. På samma sätt väljer vi den vanligaste bokstaven på andra plats och så vidare... Resultatet från denna ordfil blir sara, men när programmet senare ska testas använder vi förstås andra ordfiler, men alltid med en unik lösning.. Håkan Strömberg 3 KTH STH
Uppgift 6 Stulna dokument Det har varit inbrott på företaget och en del viktiga dokument har försvunnit. Detta upptäcktes troligtvis inte förrän långt efter själva stölden. När man nu ska se över säkerheten har man till sitt förfogande en logfil på vilken det finns uppgifter om vilka vakter som arbetat under veckan. Skriv ett program som tar reda på vid vilken tid under veckan som firman varit obevakad. Det handlar om en enda obevakad timme. Filen log.txt är uppbyggd på följande sätt. Filen inleds med ett tal som anger hur många uppgifter den innehåller (läs rader). På varje rad finns information om: dagnummer, vaktnr, starttid, sluttid. Dagnummer är löpande och finns i intervallet 1 till 7. Vaktnr anger vilken vakt som haft detta pass, ett tal 1...5. Starttid anger när vakten började sitt pass, i hela timmar i intervallet 0...23. Sluttid anger när vakten avslutade sitt pass 1...24, även det i hela timmar. Det är fullt möjligt att flera vakter arbetat samtidigt, men som sagt, det är den obevakade timmen vi är ute efter. För enkelhets skull antar vi att inga arbetspass sträcker sig över midnatt. Företaget var obevakat dag 4 timme 12 Uppgift 7 Dela en hemlighet På en arbetsplats finns 100 anställda. Precis som i verkligheten umgås inte alla med varandra, även om det finns gott om polare. Emellanåt dyker det upp intressant skvaller på jobbet. Den som fått tag i nyheten förmedlar den ganska snabbt till sina polare och efter någon arbetsdag, eller så, har alla, som direkt eller indirekt känner källan blivit informerade. Skriv ett program som inleder med att fråga vem som startar skvallret ( källan, ett tal 1..100) och som sedan tar reda på hur många personer på arbetsplatsen som till slut kommer att bli informerade. På filen polare.txt finns uppgifter om vilka som är polare. Alla anställda har ett anställningsnummer 1 till 100. Filen inleds med ett tal p,1 p 500, som anger hur många par av polare det finns. Därefter kommer lika många rader med två tal, som anger ett par av polare. Källa: 61 5 personer kommer att känna till nyheten Nämligen 5,30,57,61 och 64. Håkan Strömberg 4 KTH STH
Uppgift 8 Charterresor På binärfilen charter.dat finns statistik om svenska folkets resvanor med charter under åren 1974 till 1982. Filen hanterar ett land i taget och är uppbyggd av följande struct: struct landtyp{ char namn[20]; int antal[9]; }; Alltså först landets namn i fältet namn och sedan det antal personer som reste till detta land under åren 1974 till 1982 i arrayen antal, i denna ordning. Skriv ett program som tar emot uppgift om vilket år som avses och som därefter skriver ut en sorterad lista över de länder som ingår i filen. Listan ska vara sorterad efter och dessutom innehålla den procentuella andelen (med en decimal) av resenärer till det landet av samtliga charterresenärer det året. Här ett exempel med delar av utskriften: Vilket år: 1978 Spanien 39.3 Grekland 20.0 Storbritannien 9.8 Italien 6.3 Tyskland 4.2... Jugoslavien 0.7 Gambia 0.6 Cypern 0.3 Bulgarien 0.2 Håkan Strömberg 5 KTH STH
Uppgift 1 Samma tal i två följder 2 int main(void){ 3 int s1,d1,s2,d2,n=0,sum=0; 4 printf("följd 1 Start: "); 5 scanf("%d",&s1); 6 printf("följd 1 Steg : "); 7 scanf("%d",&d1); 8 printf("följd 2 Start: "); 9 scanf("%d",&s2); 10 printf("följd 2 Steg : "); 11 scanf("%d",&d2); 12 do{ 13 if (s1==s2) { 14 n++; 15 sum=sum+s1; 16 printf("%d ",s1); 17 s1=s1+d1; 18 s2=s2+d2; 19 } 20 else 21 if (s1<s2) 22 s1=s1+d1; 23 else 24 s2=s2+d2; 25 } while (n<5); 26 printf("den sökta summan är %d\n",sum); 27 } Håkan Strömberg 1 KTH STH
Uppgift 2 Vita och svarta kulor Version 1 2 #include <stdlib.h> 3 #include <time.h> 4 5 int main(void){ 6 int v,v1,s,s1,n,f[21]={0},forsok,i,kula; 7 srand(time(0)); 8 printf("antal vita kulor? "); 9 scanf("%d",&v); 10 printf("antal svarta kulor? "); 11 scanf("%d",&s); 12 for (forsok=1;forsok<=100000;forsok++){ 13 n=0; 14 v1=0; 15 s1=0; 16 while (v1<v){ 17 kula=rand()%(v-v1+s-s1)+1; 18 if (kula<=v-v1) 19 v1++; 20 else 21 s1++; 22 n++; 23 } 24 f[n]++; 25 } 26 for (i=v;i<=v+s;i++) 27 printf("%d dragningar %8.3f %%\n",i,f[i]/1000.0); 28 } Håkan Strömberg 2 KTH STH
Version 2 Detta program har en rekursiv funktion och bestämmer de exakta värdena genom att generera alla möjliga dragningssekvenser. Vi återkommer till detta i kursen Algoritmer och Datastrukturer. 2 int f[10]={0},vita=5,svarta=4; 3 4 void solve(int n,int v,int s){ 5 if (n<=vita+svarta) 6 if (v==vita) 7 f[n]++; 8 else{ 9 solve(n+1,v+1,s); 10 solve(n+1,v,s+1); 11 } 12 } 13 14 int main(void){ 15 int i,sum=0; 16 solve(0,0,0); 17 for (i=vita;i<=vita+svarta;i++) 18 sum+=f[i]; 19 for (i=vita;i<=vita+svarta;i++) 20 printf("%d %8.3f\n",i,100.0*f[i]/sum); 21 } Håkan Strömberg 3 KTH STH
Uppgift 3 Siffersumma och sifferprodukt 2 int main(void){ 3 int tal,tal1,s,p,s1,p1,siffra; 4 printf("vilken siffersumma : "); 5 scanf("%d",&s); 6 printf("vilken sifferprodukt: "); 7 scanf("%d",&p); 8 tal=0; 9 do{ 10 tal++; 11 tal1=tal; 12 p1=1; 13 s1=0; 14 while (tal1>0){ 15 siffra=tal1%10; 16 s1=s1+siffra; 17 p1=p1*siffra; 18 tal1=tal1/10; 19 } 20 }while(s1!=s p1!=p); 21 printf("det sökta talet är %d",tal); 22 } Håkan Strömberg 4 KTH STH
Uppgift 4 Överhettning 2 #include <stdlib.h> 3 #include <math.h> 4 int main(void){ 5 int temp,antal=0,min,intervall,n=0; 6 FILE *in; 7 in=fopen("temp.txt","rt"); 8 fscanf(in,"%d",&temp); 9 fscanf(in,"%d",&intervall); 10 fscanf(in,"%d",&antal); 11 for (min=1;min<=antal;min++){ 12 fscanf(in,"%d\n",&temp); 13 if (temp>300) 14 n++; 15 else 16 n=0; 17 if (n>intervall) 18 printf("alarm efter %d minuter\n",min); 19 } 20 fclose(in); 21 } Håkan Strömberg 5 KTH STH
Uppgift 5 Det mest förväntade ordet 2 int main(void){ 3 FILE *in; 4 char ord[5],p[5]; 5 int f[4][256]={{0}},i,j,max[4]={0},n; 6 7 in=fopen("fyrord.txt","rt"); 8 fscanf(in,"%d",&n); 9 for(i=1;i<=n;i++){ 10 fscanf(in,"%s",ord); 11 for(j=0;j<4;j++) 12 f[j][ord[j]]++; 13 } 14 fclose(in); 15 16 p[4]= \0 ; 17 for(i=0;i<4;i++) 18 for(j=0;j<256;j++) 19 if(f[i][j]>max[i]){ 20 max[i]=f[i][j]; 21 p[i]=j; 22 } 23 24 printf("%s\n",p); 25 } Håkan Strömberg 6 KTH STH
Uppgift 6 Stulna dokument 2 int main(void){ 3 int veckan[7*24]={0}; 4 int i,d,v,t1,t2,s1,s2,j,n,dag,timme; 5 FILE *in; 6 in=fopen("log.txt","rt"); 7 fscanf(in,"%d",&n); 8 for(i=1;i<=n;i++){ 9 fscanf(in,"%d %d %d %d",&d,&v,&t1,&t2); 10 s1=(d-1)*24+t1; 11 s2=(d-1)*24+t2-1; 12 for(j=s1;j<=s2;j++) 13 veckan[j]=1; 14 } 15 for(i=0;i<7*24;i++) 16 if(veckan[i]==0){ 17 dag=i/24+1; 18 timme=i%24; 19 printf("företaget var obevakat dag %d timme %d\n",dag,timme); 20 } 21 } Håkan Strömberg 7 KTH STH
Uppgift 7 Dela en hemlighet 2 3 int main(void){ 4 int vet[101]={0}; 5 int lista[501][2]; 6 int i,j,k,ok,n,p; 7 FILE *in; 8 9 in=fopen("polare.txt","rt"); 10 fscanf(in,"%d",&p); 11 for (i=1;i<=p;i++) 12 fscanf(in,"%d %d",&lista[i][0],&lista[i][1]); 13 fclose(in); 14 printf("källa: "); 15 scanf("%d",&k); 16 vet[k]=1; 17 n=1; 18 do{ 19 ok=0; 20 for (i=1;i<=p;i++){ 21 if (vet[lista[i][0]] vet[lista[i][1]]){ 22 for (j=0;j<=1;j++) 23 if (!vet[lista[i][j]]){ 24 ok=1; 25 n++; 26 vet[lista[i][j]]=1; 27 } 28 } 29 } 30 }while(ok); 31 printf("%d kommer att känna till skvallret\n",n); 32 } Håkan Strömberg 8 KTH STH
Uppgift 8 Charterresor 2 3 struct landtyp{ 4 char namn[20]; 5 int antal[9]; 6 }; 7 8 int main(void){ 9 FILE *in; 10 landtyp alla[100]; 11 float proc[100][2],tmp; 12 int i,j,n,ar,sum=0; 13 14 in=fopen("charter.dat","rb"); 15 fseek(in,0,seek_end); 16 n=ftell(in)/sizeof(landtyp); 17 fseek(in,0,seek_set); 18 fread(&alla,sizeof(landtyp),n,in); 19 20 printf("vilket år: "); 21 scanf("%d",&ar); 22 ar=ar-1974; 23 24 for(i=0;i<n;i++) 25 sum=sum+alla[i].antal[ar]; 26 27 for(i=0;i<n;i++){ 28 proc[i][0]=i; 29 proc[i][1]=100.0*alla[i].antal[ar]/sum; 30 } 31 32 for(i=0;i<n-1;i++) 33 for(j=i+1;j<n;j++) 34 if(proc[j][1]>proc[i][1]){ 35 tmp=proc[j][0]; proc[j][0]=proc[i][0]; proc[i][0]=tmp; 36 tmp=proc[j][1]; proc[j][1]=proc[i][1]; proc[i][1]=tmp; 37 } 38 39 for(i=0;i<n;i++) 40 printf("%-20s %5.1f\n",alla[(int)proc[i][0]].namn,proc[i][1]); 41 fclose(in); 42 } Håkan Strömberg 9 KTH STH