Dagens problem Tal på fil På filen tal.txt finns ett antal tal. Man vill nu veta hur många av talen som är större än 100. Filen inleds med ett tal som anger hur många tal filen innehåller. Eftersom filen inte finns, måste vi först skapa den i ett eget program, genom att slumpa fram ett antal tal. För detta tänker vi oss följande dialog Hur många tal? 1000 Undre gräns? 72 Övre gräns? 112 Programmet ska alltså skapa en fil som innehåller 1000 tal i intervallet [72,112] Förvandla heltal till sträng Skriv ett program med följande dialog Ge mig ett tal? 123456 Talet är 123456 Ett enkelt program eller hur? Problemet är att då programmet tar emot talet är det i form av en int. När talet skrivs ut är det i form av en sträng (char)! Det finns en funktion, itoa (integer to ascii) som fixar detta, men här ska vi försöka ordna detta utan att använda den funktionen. En anledning är att itoa inte tillhör ANSI C. En annan anledning är att det är bra träning. Dialog Skriv ett program som startar med att fråga Vill du fortsätta? Om svaret blir ja,ja,ja eller JA ska detta upplevas som ett att man vill fortsätta och då ska programmet skriva ut Trevligt. Om svaret blir Nej eller nej skrivet med någon annan kombination av stora och små bokstäver av ordet nej ska programmet skriva ut Det var tråkigt. För alla andra svar ska programmet åter fråga Vill du fortsätta? efter att först ha skrivit ut Svara JA eller NEJ. Håkan Strömberg 1 STH KTH
Vad heter du? Skriv ett program med följande dialog: Vad heter du? Håkan Strömberg Hej Strömberg, får jag kalla dig Håkan? Vi läser in namnet med gets och tänker oss att det endast finns ett mellanslag, det mellan för- och efternamn och inga andra mellanslag. Ordlistan På filen 4ord.txt finns ett stort antal svenska ord, alla fyra bokstäver långa. På filen frågeord.txt finns ett mindre antal ord, också med fyra bokstäver. Skriv ett program som tar reda på vilka ord i den senare filen som kan återfinnas i den större. Exempel på utskrift besk finns svid finns satt finns tror finns ej grrr finns ej höst finns vårt finns ej vitt finns blev finns ej matt finns Håkan Strömberg 2 STH KTH
Avstånd mellan svenska städer Filen avstand.txt innehåller data som gör det möjligt att bestämma avståndet mellan en del svenska städer. Skriv ett program som inleder med att skriva ut en tabell över ingående städer och därefter tar emot numren på de städer mellan vilka man är intresserad av avståndet. Ett körningsexempel: 1 Falun 2 Gävle 3 Göteborg 4 Halmstad 5 Helsingborg 6 Jönköping 7 Kalmar 8 Karlskrona 9 Karlstad 10 Kristianstad 11 Linköping 12 Luleå 13 Malmö 14 Motala 15 Norrköping 16 Nyköping 17 Skellefteå 18 Stockholm 19 Sundsvall 20 Trelleborg 21 Umeå 22 Uppsala 23 Vänersborg 24 Västervik 25 Västerås 26 Växjö 27 Örebro 28 Örnsköldsvik 29 Östersund Från vilken stad (nr): 18 Till vilken stad (nr): 5 Avståndet mellan Stockholm och Helsingborg är 564 km Filen avstand.txt inleds med ett tal n < 50 som anger hur många städer den innehåller. Därefter kommer n rader med ett stadsnamn på varje (endast bokstäver, < 20 stycken). På följande n rader finns n avstånd, heltal som anger avståndet i km. På den i:e raden anger det j:e talet avståndet mellan stad i och stad j. Vokaler På filen ORD.DAT finns ett antal svenska ord alla fyrbokstaviga med enbart små bokstäver. Skriv ett program som räknar antalet ord med 0(!), 1, 2, 3 respektive 4(!) vokaler. Utskriften kommer att se ut som nedan: 0 vokaler 2 1 vokaler 1451 2 vokaler 1070 3 vokaler 13 4 vokaler 0 Till vokaler räknas bokstäverna a, e, i, o, u, y, å, ä och ö. Håkan Strömberg 3 STH KTH
Ett kortare ord Skriv ett program som tar emot ett ord bestående av fem bokstäver (a-z) och som tar reda på och skriver ut de fyrbokstaviga ord som kan bildas genom att ta bort en bokstav ur det ursprungliga ordet. Endast de fyrbokstaviga ord som finns i den medskickade filen, ord.txt godkänns. Ett testexempel Vilket ord (5 bokstäver, a-z): lekar ekar leka Filen ord.txt inleds med ett tal som anger antalet ord i filen och därefter lika många rader med ett ord på varje. Inuti rektanglarna Skriv ett program som avgör om givna punkter ligger inuti en, två eller ingen av två givna rektanglar. På filen REKTANG.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 Håkan Strömberg 4 STH KTH
Ord med wild cards På filen ORD.TXT finns ett antal ord med sex bokstäver. Hur många, anges som första rad i filen. Vi önskar ett program som listar ord ingående i filen som överensstämmer med det ord, inklusive wild cards (jokrar), som anges i indata (endast små bokstäver). Programmet ska söka upp ord i filen som innehåller samma bokstäver på samma platser som sökordet. En asterisk i en position i sökordet kan dock ersättas med vilken bokstav som helst i ordet från filen. Ett testexempel förklarar: Sökord: nu***a numera nutida Det finns 2 ord Programkörningen ska avslutas med en rapport som talar om hur många ord som återfunnits. Håkan Strömberg 5 STH KTH
Lösningsförslag Tal på fil Först skapar vi filen #include <stdlib.h> #include <time.h> FILE *fil; int i,n,ug,og,tal; fil=fopen("tal.txt","wt"); printf("hur många tal? "); scanf("%d",&n); printf("undre gräns? "); scanf("%d",&ug); printf("övre gräns? "); scanf("%d",&og); fprintf(fil,"%d\n",n); for(i=1;i<=n;i++){ tal=rand()%(og-ug+1)+ug; fprintf(fil,"%d\n",tal); fclose(fil); Sedan tar vi rätt på svaret: include <stdio.h> #include <conio.h> FILE *infil; int n=0,i,tal,antal; infil=fopen("tal.txt","rt"); fscanf(infil,"%d",&antal); for(i=1;i<=antal;i++){ fscanf(infil,"%d",&tal); if(tal>100) n++; printf("%d tal är >100\n",n); Håkan Strömberg 6 STH KTH
Förvandla heltal till sträng #include <string.h> int main(void) { char svar[4]; int i,ok=0; do { printf("vill du fortsätta? "); scanf("%s",svar); for (i=0;i<=strlen(svar)-1;i++) if (svar[i]>= a && svar[i]<= z ) svar[i]=svar[i]-32; if (strcmp(svar,"ja")==0) { printf("trevligt\n"); ok=1; else if (strcmp(svar,"nej")==0) { printf("det var tråkigt\n"); ok=1; else printf("svara JA eller NEJ\n"); while (!ok); Dialog #include <string.h> char namn[20],fornamn[10],efternamn[10]; int i,p; printf("ditt namn? "); gets(namn); for(i=0;i<strlen(namn);i++) if(namn[i]== ) p=i; for(i=0;i<p;i++) fornamn[i]=namn[i]; fornamn[p]= \0 ; for(i=p+1;i<strlen(namn);i++) efternamn[i-(p+1)]=namn[i]; efternamn[strlen(namn)-(p+1)]= \0 ; printf("hej %s får jag kalla dig %s\n",efternamn,fornamn); Håkan Strömberg 7 STH KTH
Vad heter du? #include <string.h> int main(void) { char namn[20],fornamn[10],efternamn[10]; int i,p; printf("ditt namn? "); gets(namn); for (i=0;i<strlen(namn);i++) if (namn[i]== ) p=i; for (i=0;i<p;i++) fornamn[i]=namn[i]; fornamn[p]= \0 ; for (i=p+1;i<strlen(namn);i++) efternamn[i-(p+1)]=namn[i]; efternamn[strlen(namn)-(p+1)]= \0 ; printf("hej %s får jag kalla dig %s\n",efternamn,fornamn); Ordlistan FILE *fil1,*fil2; char ord1[5],ord2[5]; int ord,antal1,antal2,f,i; fil1=fopen("4ord.txt","rt"); fscanf(fil1,"%d",&antal1); fil2=fopen("frågeord.txt","rt"); fscanf(fil2,"%d",&antal2); for(ord=1;ord<=antal2;ord++){ fscanf(fil2,"%s",ord2); rewind(fil1); f=0; for(i=1;i<=antal1;i++){ fscanf(fil1,"%s",ord1); if(strcmp(ord1,ord2)==0){ printf("%s finns\n",ord2); f=1; break; if(f==0) printf("%s finns inte\n",ord2); Håkan Strömberg 8 STH KTH
Avstånd mellan svenska städer FILE *fil,*utfil; int antal,i,j,fran,till,avst; char namnen[50][20]; fil=fopen("avstand.txt","rt"); fscanf(fil,"%d",&antal); for(i=1;i<=antal;i++) fscanf(fil,"%s",namnen[i]); printf("från vilken stad (nr): "); scanf("%d",&fran); printf("till vilken stad (nr): "); scanf("%d",&till); for(i=1;i<fran;i++) for(j=1;j<=antal;j++) fscanf(fil,"%d",&avst); for(i=1;i<=till;i++) fscanf(fil,"%d",&avst); printf("avståndet mellan %s och %s är %d km\n", namnen[fran],namnen[till],avst); fclose(fil); Håkan Strömberg 9 STH KTH
Vokaler FILE *infil; char ord[5]; int k,n[5],antal,m; char v[]="aeiouyåäö"; for(k=0;k<=4;k++) n[k]=0; infil=fopen("ord.txt","rt"); while (!feof(infil)){ fscanf(infil,"%s",ord); if (infil>0){ antal=0; for(k=0;k<=3;k++) for(m=0;m<=8;m++) if (ord[k]==v[m]) antal++; n[antal]++; fclose(infil); for(k=0;k<=4;k++){ printf("%d vokaler i %5d fall\n",k,n[k]); Håkan Strömberg 10 STH KTH
Ett kortare ord #include <string.h> char ord[6],filord[5],nyttord[5]; FILE *fil; int antal,k,n,l,i; printf("vilket ord (5 bokstäver, a-z): "); scanf("%s",ord); fil=fopen("ord.txt","rt"); fscanf(fil,"%d",&antal); for(k=1;k<=antal;k++){ fscanf(fil,"%s\n",filord); for(i=0;i<=4;i++){ n=-1; for(l=0;l<=4;l++) if (l!=i){ n++; nyttord[n]=ord[l]; nyttord[4]= \0 ; if (strcmp(nyttord,filord)==0) printf("%s\n",filord); Håkan Strömberg 11 STH KTH
Inuti rektanglarna FILE *infil; int horn[8],antal,k,f1,f2,x,y; infil=fopen("rektang.dat","rt"); for(k=0;k<8;k++) fscanf(infil,"%d",&horn[k]); fscanf(infil,"%d",&antal); for(k=1;k<=antal;k++){ fscanf(infil,"%d %d",&x,&y); f1=0; f2=0; f1=x>=horn[0] && x<=horn[2] && y>=horn[3] && y<=horn[1]; f2=x>=horn[4] && x<=horn[6] && y>=horn[7] && y<=horn[5]; printf("%2d %2d ",x,y); if(f1 && f2) printf("ligger i båda\n"); if(f1 &&!f2) printf("ligger endast i A\n"); if(!f1 && f2) printf("ligger endast i B\n"); if(!f1 &&!f2) printf("ligger inte i någon\n"); fclose(infil); Håkan Strömberg 12 STH KTH
Ord med wild cards FILE *fil; char ord[7],sokord[7]; int antal,funna=0,i,j,n; fil=fopen("ord.txt","rt"); fscanf(fil,"%d",&antal); printf("sökord: "); scanf("%s",sokord); for(i=1;i<=antal;i++){ fscanf(fil,"%s",ord); n=0; for(j=0;j<=5;j++) if(sokord[j]== * sokord[j]==ord[j]) n++; if(n==6){ printf("%s\n",ord); funna++; fclose(fil); printf("det finns %d ord\n",funna); Håkan Strömberg 13 STH KTH