Bruno Mars Skrevet 21. januar 2010 Del Skrevet 21. januar 2010 Har aldri drevet med struct's før. Oppgave Lag en ’struct’ som du kaller for lengde, den skal inneholde 3 integers: m, cm og mm. Dette forå kunne angi en lengde i meter uten å benytte float for å ta hensyn til desimaler. Lengden 2.475 angis da som 2 meter, 47 centimeter og 5 millimeter. Lag et program i C som oppretter 3 variabler av denne type (lengde) og leser data inn i disse 3 variablene. Lag så en funksjon add_length, som legger sammen 2 slike variabler. La hovedprogrammet ditt kalle opp denne funksjonen slik at du får lagt sammen de 3 lengdene dine og skriv ut resultatet på skjermen. Dette sluttresultatet skal også skrives ut som et ’float’ tall uten at du bruker variabler av type float eller type double. Svar så langt #include <stdio.h> #include <stdlib.h> int add_lentgh(lengde) { struct lengde bLengde; int a = bLengde.m[0] + bLengde.cm[0] + bLengde.mm[0]; int b = bLengde.m[1] + bLengde.cm[1] + bLengde.mm[1]; int c = bLengde.m[2] + bLengde.cm[2] + bLengde.mm[2]; return a; } struct lengde { int m[3]; int cm[3]; int mm[3]; }; int main() { int i; printf("Welcome. Please enter your first lengt;\n"); struct lengde aLengde; for(i=0;i<3;i++) { printf("M: "); scanf("%d", &aLengde.m[i]); printf("CM: "); scanf("%d", &aLengde.cm[i]); printf("MM: "); scanf("%d", &aLengde.mm[i]); } add_lentgh(); system("PAUSE"); return 0; } Vil ikke ha svaret, men noen hint. Sliter litt med å skjønne oppgaven. Koden jeg har nå får forresten feilmelding i første funksjon (storage size of 'bLengde' isn't known). Lenke til kommentar
GeirGrusom Skrevet 21. januar 2010 Del Skrevet 21. januar 2010 du mangler datatype i første funksjon. Husker denne oppgave fra første året ^^ Lenke til kommentar
Bruno Mars Skrevet 21. januar 2010 Forfatter Del Skrevet 21. januar 2010 Huh..? Det fungerer jo i main. Men skjønner ikke hvor du mener. Mener du int foran struct? Eller "int add_lentgh(int lengde)"? Lenke til kommentar
GeirGrusom Skrevet 21. januar 2010 Del Skrevet 21. januar 2010 (endret) int add_lentgh(lengde) (lengde) er helt klart feil ettersom parameteret mangler datatype. Navnet er også det samme som en datatype som blir definert lenger ned. edit: Jeg tror jeg vet hva du mener her dog. int add_length(lengde len) { // ... } Hva er forøvrig poenget med å lagre tre integer for m, cm og mm i denne strukturen? (som forøvrig må ligge før den blir brukt i koden) struct lengde { int m[3]; int cm[3]; int mm[3]; }; Endret 21. januar 2010 av GeirGrusom Lenke til kommentar
Bruno Mars Skrevet 21. januar 2010 Forfatter Del Skrevet 21. januar 2010 Ah, selvsagt! På det siste spørsmålet, så var det bare slik jeg startet. Og det er fikset. #include <stdio.h> #include <stdlib.h> struct lengde { int m[3], cm[3], mm[3]; }; int add_lentgh() { struct lengde bLengde; int a = bLengde.m[0] + (bLengde.cm[0]*10) + (bLengde.mm[0]*0.1); int b = bLengde.m[1] + (bLengde.cm[1]*10) + (bLengde.mm[1]*0.1); int c = bLengde.m[2] + (bLengde.cm[2]*10) + (bLengde.mm[2]*0.1); int sum = a+b+c; return sum; } int main() { int i; printf("Welcome. Please enter your first length;\n"); struct lengde aLengde; for(i=0;i<3;i++) { printf("M: "); scanf("%d", &aLengde.m[i]); printf("CM: "); scanf("%d", &aLengde.cm[i]); printf("MM: "); scanf("%d", &aLengde.mm[i]); } add_lentgh(); system("PAUSE"); return 0; } Men jeg får ikke ut noe. Hva har jeg glemt? Lenke til kommentar
GeirGrusom Skrevet 21. januar 2010 Del Skrevet 21. januar 2010 Igjen: hva er poenget med m[3]? Er det ikke bedre å lage struct lengde { int m; int cm; int mm; }; int main() { struct lengde lens[3]; } fremfor struct lengde { int m[3]; int cm[3]; int mm[3]; }; int main() { struct lengde lens; } ? add_length funksjonen gir også alltid samme resultat, hva er poenget med den? Lenke til kommentar
Bruno Mars Skrevet 21. januar 2010 Forfatter Del Skrevet 21. januar 2010 Men jeg skal ha ut summer fra add_length... Jeg får jo ikke ut no? Lenke til kommentar
ze5400 Skrevet 22. januar 2010 Del Skrevet 22. januar 2010 (endret) Noe som er enda viktigere er at du ikke konverterer mellom enhetene. Om man kombinerer to structer med 75mm, vil man ende opp med 150mm, istedenfor 15cm og 0mm. Endret 22. januar 2010 av ze5400 Lenke til kommentar
Bruno Mars Skrevet 22. januar 2010 Forfatter Del Skrevet 22. januar 2010 Vet jeg ikke har konvertert til float/double enda ja. Men akkurat nå er problemet å få ut et riktig tall. Tester med å bare skrive ut denne: int add_lentgh() { struct lengde bLengde; int a = bLengde.m[0] + (bLengde.cm[0]/100) + (bLengde.mm[0]/1000); int b = bLengde.m[1] + (bLengde.cm[1]/100) + (bLengde.mm[1]/1000); int c = bLengde.m[2] + (bLengde.cm[2]/100) + (bLengde.mm[2]/1000); int sum = a; printf("%d", sum); return sum; } Og hvis jeg taster inn tallet "1" på alle punkter så får jeg ut forskjellige svar hver gang. Altså har jeg gjort en eller annen dum feil. Lenke til kommentar
ze5400 Skrevet 22. januar 2010 Del Skrevet 22. januar 2010 (endret) Uten at jeg kikker så nøye, så vil jeg anta at integerne du referere til ikke er satt, men snarere bruker den verdien som alt ligger i minnet de er blitt allokert til. Du gjør det på en forferdelig dum måte, som Mr. Grusom allerede har påpekt. Hvorfor i alle dager lar du integerne i structen være arrays? Nå er jeg egentlig C#-tilhenger, så mine enver i C er ganske begrensede, men har likevel tatt meg den frihet å lage ett løsningsforslag: Klikk for å se/fjerne spoilerteksten nedenfor #include <stdlib.h> #include <stdio.h> #include <string.h> struct Length { int m; int cm; int mm; }; struct Length add_length(struct Length* LengthArray, int LengthArraySize) { int i = 0; struct Length TmpLength; TmpLength.m = 0; TmpLength.cm = 0; TmpLength.mm = 0; for (i = 0; i < LengthArraySize; i++) { TmpLength.cm += LengthArray[i].cm; TmpLength.mm += LengthArray[i].mm; TmpLength.m += LengthArray[i].m; if (TmpLength.mm > 10) { int Rem = (TmpLength.mm % 10); TmpLength.cm += (TmpLength.mm / 10); TmpLength.mm = Rem; } if (TmpLength.cm > 100) { int Rem = (TmpLength.cm % 100); TmpLength.m += (TmpLength.cm / 100); TmpLength.cm = Rem; } } return TmpLength; } int main() { struct Length* LengthArray; int LengthArraySize; int i; struct Length Added; char* RetCm; printf("%s", "Please input how many structs you want: "); scanf("%i", &LengthArraySize); if (LengthArraySize < 1) return 0; LengthArray = (struct Length*)malloc(sizeof(struct Length) * LengthArraySize); for (i = 0; i < LengthArraySize; i++) { printf("%s%i%s", "Please input the data for struct: #", (i + 1), "\r\nM: "); scanf("%i", &LengthArray[i].m); printf("%s", "\r\CM: "); scanf("%i", &LengthArray[i].cm); printf("%s", "\r\MM: "); scanf("%i", &LengthArray[i].mm); } Added = add_length(LengthArray, LengthArraySize); free(LengthArray); printf("%s%i%s%i%s%i", "Meter: ", Added.m, "\r\nCentimeter: ", Added.cm, "\r\nMillimeter: ", Added.mm); RetCm = (char*)malloc(sizeof(char) * 3); itoa(Added.cm, RetCm, 10); if (Added.mm > 0) { char* Tmp = (char*)malloc(sizeof(char) * 3); for (i = 0; i < (strlen(RetCm) - 2); i++) { strcpy(Tmp, RetCm); strcpy(RetCm, "0"); strcat(RetCm, Tmp); } free(Tmp); } printf("%s%i%s%s%i%s", "\r\n\r\n\"float\" representation: ", Added.m, ".", RetCm, Added.mm, "\r\n\r\n"); free(RetCm); system("pause"); return 0; } EDIT: Og nå snør det i helvete. At jeg poster kode for å hjelpe i C-biten av forumet hadde jeg aldri trodd at kom til å hende. EDIT2: Reparete bug. Endret 23. januar 2010 av ze5400 Lenke til kommentar
Bruno Mars Skrevet 22. januar 2010 Forfatter Del Skrevet 22. januar 2010 Er noe feil med koden, da den mener at 3m + 3cm + 3mm = 3,303m... Men jeg skjønner ikke hva som er feil med det jeg har nå: #include <stdio.h> #include <stdlib.h> struct lengde { int m; int cm; int mm; }; void add_lentgh() { struct lengde aLengde[3]; float a = aLengde[0].m + (aLengde[0].cm/100) + (aLengde[0].mm/1000); float b = aLengde[1].m + (aLengde[1].cm/100) + (aLengde[1].mm/1000); float c = aLengde[2].m + (aLengde[2].cm/100) + (aLengde[2].mm/1000); float sum = a+b+c; printf("%.2f", sum); } int main() { int i; printf("Welcome. Please enter your lengths;\n"); struct lengde aLengde[3]; for(i=0;i<3;i++) { aLengde[i].m = 0; aLengde[i].cm = 0; aLengde[i].mm = 0; printf("M: "); scanf("%d", &aLengde[i].m); printf("CM: "); scanf("%d", &aLengde[i].cm); printf("MM: "); scanf("%d", &aLengde[i].mm); } add_lentgh(); printf("\n\n"); system("PAUSE"); return 0; } Lenke til kommentar
TheMaister Skrevet 22. januar 2010 Del Skrevet 22. januar 2010 void add_lentgh() { struct lengde aLengde[3]; float a = aLengde[0].m + (aLengde[0].cm/100) + (aLengde[0].mm/1000); float b = aLengde[1].m + (aLengde[1].cm/100) + (aLengde[1].mm/1000); float c = aLengde[2].m + (aLengde[2].cm/100) + (aLengde[2].mm/1000); float sum = a+b+c; printf("%.2f", sum); } Dette gir ingen mening. Hvorfor printer du ut data som aldri ble initialisert, eller endret på? Lenke til kommentar
Bruno Mars Skrevet 22. januar 2010 Forfatter Del Skrevet 22. januar 2010 Den skal jo bli endret i main..? for(i=0;i<3;i++) { aLengde[i].m = 0; aLengde[i].cm = 0; aLengde[i].mm = 0; printf("M: "); scanf("%d", &aLengde[i].m); printf("CM: "); scanf("%d", &aLengde[i].cm); printf("MM: "); scanf("%d", &aLengde[i].mm); } Lenke til kommentar
ze5400 Skrevet 22. januar 2010 Del Skrevet 22. januar 2010 Er noe feil med koden, da den mener at 3m + 3cm + 3mm = 3,303m... Beklager Var litt lenge siden jeg hadde fått i meg fôr. Skal virke nå, om jeg ikke tar helt feil. Lenke til kommentar
ze5400 Skrevet 22. januar 2010 Del Skrevet 22. januar 2010 (endret) Den skal jo bli endret i main..? Nei. Du deklarer den i feil scope Så redeklarerer du den igjen i add_lentgh(). Ta heller å pass den som en parameter, eller la den være en global variabel. Endret 22. januar 2010 av ze5400 Lenke til kommentar
GeirGrusom Skrevet 22. januar 2010 Del Skrevet 22. januar 2010 dessuten deler du et integer på et annet, og resultatet vil da bli integer. Lenke til kommentar
ze5400 Skrevet 22. januar 2010 Del Skrevet 22. januar 2010 (endret) Har du lest leksene dine? Spøk til side, sett structen din til static. Ser jo ikke ut som om du har tenkt å ha flere instanser av den uansett. EDIT: Scope ja; Globalt scope - ting her her tilgjenglig, klasse { Klassens scope, ting som deklareres her er aksessabelt for funksjonene i klassen. funksjon() { Lokalt scope. Ting som deklareres her kan ikke aksesseres bortenfra. } } Endret 22. januar 2010 av ze5400 Lenke til kommentar
Bruno Mars Skrevet 22. januar 2010 Forfatter Del Skrevet 22. januar 2010 Aha, Nå funker det. Men kan dere svare meg på om jeg har kodet rett i forhold til oppgaven? #include <stdio.h> #include <stdlib.h> struct lengde { int m; int cm; int mm; }; void add_lentgh() { int i; struct lengde aLengde[3]; for(i=0;i<3;i++) { aLengde[i].m = 0; aLengde[i].cm = 0; aLengde[i].mm = 0; printf("M: "); scanf("%d", &aLengde[i].m); printf("CM: "); scanf("%d", &aLengde[i].cm); printf("MM: "); scanf("%d", &aLengde[i].mm); } float a = aLengde[0].m + (aLengde[0].cm/100.00) + (aLengde[0].mm/1000.00); float b = aLengde[1].m + (aLengde[1].cm/100.00) + (aLengde[1].mm/1000.00); float c = aLengde[2].m + (aLengde[2].cm/100.00) + (aLengde[2].mm/1000.00); float sum = a+b+c; printf("%.4f", sum); } int main() { printf("Welcome. Please enter your lengths;\n"); add_lentgh(); printf("\n\n"); system("PAUSE"); return 0; } Lenke til kommentar
ze5400 Skrevet 22. januar 2010 Del Skrevet 22. januar 2010 (endret) Nei, det har du ikke. Om du leser oppgaven igjen vil du se at add_lentgh() slik du har den nå gjør alt for mye. Dessuten er mattematikken din feil. Husk at 7/5 = 1 i integrenes verden. De har ikke noe konsept om tall mellom heltall, derfor henter vi ut resten med modulus. Endret 22. januar 2010 av ze5400 Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå