HI1024 TEN2 2013-10-28 Betygsgränser: Fx-8, E-9, D-11, C-12, B-14, A-16 (MAX-18) Generella rättningsnormer: Mycket dåliga variabelnamn ger -1p totalt på provet vid andra tillfället Inga eller dåliga kommentarer ger -0p på provet Dålig struktur ger avdrag varje gång Generellt gäller: -1p per avvikelse, minst -1p om koden ej kompilerar 1. BMI (Body Mass Index) 4p Skriv ett program som ger användaren möjlighet att beräkna BMI värden. Programmet ska fråga användaren efter dennes vikt i kg och sedan efter dennes längd i cm och sedan presentera BMI. Därefter får användaren välja om denne vill göra en ny beräkning eller avsluta. Resultatet ska presenteras med en decimals noggrannhet. En körning ska kunna se ut så här: Hur mycket vager du (kg)? 83 Hur lang ar du (cm)? 182 Da har du BMI: 25.1 kg/m2 Vill du gora en berakning till (1-ja 0-nej)?0 Tack och valkommen ater! BMI = (vikt i kg) / (längd i m) 2 Lösningsförslag #include <stdio.h> int main() int fortsatt=1; int vikt,langd; while(fortsatt) printf("hur mycket vager du (kg)?"); scanf("%d",&vikt); printf("hur lang ar du (cm)?"); scanf("%d",&langd); printf("da har du BMI: %.1f kg/m2\n",((float)vikt*10000)/(langd*langd)); printf("vill du gora en berakning till (1-ja 0-nej)?"); scanf("%d",&fortsatt); return 0; Rättning uppgift 1: %f istället för %.1f, while(i) med icke-initierad variabel och sortfel (cm) gav -1p vardera.
2. Åldersstatistik 4p Skriv ett program som slumpar fram X personers ålder där X bestäms av användaren under körning (0<X<10000). Åldern skall för varje person slumpas fram så att alla åldrar 20 år till 40 år är lika sannolika (åldern anges endast som hela år). Programmet ska sedan presentera medelvärde och typvärde. Programmet skall använda en array för att lagra åldrarna och skall använda funktioner på ett bra sätt. En körning ska kunna se ut så här: Hur manga personer vill du gora statistik pa? 100 Medelvardet blev 32.6 ar Typvardet blev 38 ar. Typvärdet är det vanligaste värdet. Om flera värden delar förstaplatsen är de alla typvärden men det duger om ditt program anger ett av dem. Använd inga globala variabler. Lösningsförslag #include <stdio.h> #include <stdlib.h> #define MAX 10000 void init(int aldrar[], int *antal) srand(7); printf("hur manga personer vill du gora statistik pa?"); scanf("%d",antal); int i; for(i=0;i<*antal;i++) aldrar[i]=rand()%21+20; float medel(int aldrar[],int antal) float medel=0; int i; for(i=0;i<antal;i++) medel+=aldrar[i]; medel/=(float)antal; return medel; int typvarde(int aldrar[], int x) int i; int antal[41]; for(i=20;i<41;i++) antal[i]=0; for(i=0;i<x;i++)
antal[aldrar[i]]++; //for(i=20;i<41;i++) // printf("%d,",antal[i]); int maxantal=0; int typvarde; for(i=20;i<41;i++) if(maxantal<antal[i]) typvarde=i; maxantal=antal[i]; return typvarde; int main() int x,i; int aldrar[max]; init(aldrar,&x); //for(i=0;i<x;i++) // printf("%d,",aldrar[i]); printf("\nmedelvardet blev %.1f ar\n",medel(aldrar,x)); printf("typvardet blev %d ar.\n",typvarde(aldrar,x)); return 0; Rättning uppgift 2: fel typvärde (-1p) algoritm för typvärde saknas, irrelevant eller knappt påbörjad (-1p) fel medelvärde (oftast felaktig heltalsdivision) (-1p) ingen funktion används (-2p) dåligt använda funktioner (-1p) ingen array används (-3p) dåligt använd array (-2p) indexgräns överskrides (-1p) global variabel används (-1p) fel antal slumpade tal som ger åldrar i [20,40] (-1p) smärre slarvfel typ [20,39] istället för [20,40], eller något förvirrande struktur. (ej avdr.) flera grova fel utöver ovan nämnda (-2p) ett grovt fel utöver ovan nämnda (-1p)
3. I denna uppgift ska vi representera personer och deras positioner med en struct: struct person float x,y; char namn[20]; ; typedef struct person Person; a) Skriv en funktion som tar två in-parametrar av typen Person och returnerar avståndet mellan dem som en float. Skriv också en main som initierar två variabler av typen Person och som anropar funktionen med dessa som in-parametrar och skriver ut resultatet. Initiera personerna som: Armin på position (1,3) och Nedjelika på position (4,7). Avståndet mellan (x 1,y 1 ) och (x 2,y 2 ): avstån det ( x x ) ( y y 2p 2 2 2 1 2 1) b) I samma fil som ovan skriv en funktion som man kan anropa för att byta x-koordinat på en variabel av typen Person till valfritt värde. Anropa funktionen innan du anropar avståndsfunktionen och ändra x-värdet på Armin till 0. 2p c) Fortfarande i samma fil lägg till en funktion som man kan anropa för att byta namn på en variabel av typen Person. Anropa funktionen med en av variablerna och gör en utskrift i main så att du ser att det fungerar. 2p Lösningsförslag #include <stdio.h> #include <math.h> #include <string.h> struct person float x,y; char namn[20]; ; typedef struct person Person; void andrax(person *p, float nyttx) p->x=nyttx; void andranamn(person *p,char namn[]) strcpy(p->namn,namn);
float avstand(person p1, Person p2) return sqrt((p2.x-p1.x)*(p2.x-p1.x)+(p2.y-p1.y)*(p2.y-p1.y)); int main() Person p1=1,3,"armin",p2=4,7,"nedjelika"; andrax(&p1,0.0); andranamn(&p1,"kalle"); printf("avstand: %.1f till %s\n",avstand(p1,p2),p1.namn); return 0;
4. I denna lite mera kreativa uppgift ska du konstruera ett program som låter användaren spela sänka skepp mot programmet. Programmet slumpar fram positionen för en båt i ett 5*5 koordinatsystem. Båten tar upp tre rutor vågrätt. Användaren får sedan välja koordinater att bomba. Om denne träffar båten svarar programmet träff annars miss. Om tredje rutan av båten träffas svarar programmet träff och sänkt och programmet avslutar. Om användaren inte sänkt båten efter 6 försök avslutas programmet och meddelar användaren att denne misslyckats. I en körning där programmet slumpat fram båten enligt nedan: 1 2 3 4 5 1 2 3 4 5 skulle en körning kunna se ut så här: Vilken position vill du beskjuta? 2 3 MISS Vilken position vill du beskjuta? 4 4 TRAFF Vilken position vill du beskjuta? 4 3 TRAFF Vilken position vill du beskjuta? 4 2 TRAFF och SANKT Den första siffran anger rad och den andra kolumn. För full poäng krävs förutom ett fungerande program att programmet är välstrukturerat och har bra variabelnamn. 4p Lösningsförslag #include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> #include <string.h>
void printhav(int hav[][6]) int i,j; for(i=1;i<6;i++) for(j=1;j<6;j++) printf("%d,",hav[i][j]); printf("\n"); int sankt(int hav[][6]) int i,j,sankt=1; for(i=1;i<6;i++) for(j=1;j<6;j++) if(hav[i][j]!=0) sankt=0; return sankt; int init(int hav[][6]) int i,j; srand(time(0)); for(i=1;i<6;i++) for(j=1;j<6;j++) hav[i][j]=0; int poskol =rand()%3+1; int posrad =rand()%5+1; hav[posrad][poskol]=1; hav[posrad][poskol+1]=1; hav[posrad][poskol+2]=1;
int spela(int hav[][6]) int vunnit=0; int i,rad,kol; for(i=0;i<6;i++) printf("vilken position vill du beskjuta?"); scanf("%d %d",&rad,&kol); if(hav[rad][kol]==1) printf("traff"); hav[rad][kol]=0; else printf("miss"); if(sankt(hav)) printf(" OCH SANKT\n"); vunnit=1; break; printf("\n"); return vunnit; int main() int i,j,hav[6][6]; init(hav); printhav(hav); if(spela(hav)) printf("du vann!"); else printf("du misslyckades"); return 0; Rättning uppgift 4: Löst endast delar av problemet max 2p Löst ett till stora delar annat problem som är enklare tex ej kräver minne max 1p Hårdkodat positionen och använt detta i lösningen i övrigt max 1p Man kan sänka båten med tre träffar på samma ruta max 2p