Bruno Mars Skrevet 22. januar 2010 Forfatter Del Skrevet 22. januar 2010 Sliter litt med tolke. Skal float c flyttes til main da? Hva er galt med matta? Jeg får riktig svar jeg... Lenke til kommentar
ze5400 Skrevet 22. januar 2010 Del Skrevet 22. januar 2010 (endret) Beklager Du har så klart rett Går litt raskt i svingene her for meg... EDIT: NEI DET HAR DU IKKE. Du skulle ikke bruke float! Men du gjør likevel feil i forhold til oppgaven. Lag et program i C som oppretter 3 variabler av denne type (lengde) og leser data inn i disse 3variablene. 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. EDIT: Kan jo legge til at det er derfor jeg sa du fikk feil resultat. Så ikke at du brukte double "ulovlig" (ref: oppgaven). Antok at du brukte int, og da vil du få avrundingsfeil. Endret 22. januar 2010 av ze5400 Lenke til kommentar
Bruno Mars Skrevet 22. januar 2010 Forfatter Del Skrevet 22. januar 2010 Skjønner egentlig lite om hva som skal hvor... Men hvis jeg ikke skal bruke float så må det jo bli noe slikt: int a = aLengde[0].m + aLengde[0].m + aLengde[0].mm; int b = aLengde[1].cm + aLengde[1].cm + aLengde[1].cm; int c = aLengde[2].mm + aLengde[2].mm + aLengde[2].mm; int d = b+c; printf("%s.%s", &a, &d); Mulig noen syntaks feil, men er dette måten å gjøre det på? Lenke til kommentar
ze5400 Skrevet 22. januar 2010 Del Skrevet 22. januar 2010 Eh nei, desverre er det ikke så enkelt. Se mitt (nå reparerte) løsningsforslag for inspirasjon. Lenke til kommentar
Bruno Mars Skrevet 22. januar 2010 Forfatter Del Skrevet 22. januar 2010 Du har ikke den siste versjonen i en mindre rotete form da? Lenke til kommentar
GeirGrusom Skrevet 22. januar 2010 Del Skrevet 22. januar 2010 (endret) Hmmmm vet svaret, men det blir jo hele poenget med oppgaven... Husker du at Helge har nevnt modulo et par ganger? edit: ops, det har ze5400 nevnt ^^ Endret 22. januar 2010 av GeirGrusom Lenke til kommentar
ze5400 Skrevet 22. januar 2010 Del Skrevet 22. januar 2010 (endret) Du har ikke den siste versjonen i en mindre rotete form da? Nei, jeg har ikke det Jeg skriver nesten aldri C, og da blir det rotete Men det er ikke sååå rotete. Dessuten er det god trening for deg i å lese andres kode EDIT: Hvilket IDE bruker du, forresten? EDIT2: Hvem er Helge, Henning? En i en annen tråd, eller en IRL? Endret 22. januar 2010 av ze5400 Lenke til kommentar
GeirGrusom Skrevet 22. januar 2010 Del Skrevet 22. januar 2010 (endret) Helge er læreren i DATFE40 eller hva faget nå heter, hvor dette er en av obligene etter det jeg kan huske. edit: nei vent, dette er introduksjon til java faget, objektorientert programmering. Endret 22. januar 2010 av GeirGrusom Lenke til kommentar
Bruno Mars Skrevet 22. januar 2010 Forfatter Del Skrevet 22. januar 2010 Stemmer det. BTW; Jeg hater C! Hadde C# på VGS og C er jo et helvette i forhold, selvom det er samme språk, bare eldre. I am stuck! Men length_add. Den har du satt som "struct". Det sto at dette skulle være en funksjon, så jeg satte void. Er det feil? Lenke til kommentar
ze5400 Skrevet 22. januar 2010 Del Skrevet 22. januar 2010 (endret) Det er langt i fra samme språk. Den største likheten er vel egentlig at begge bruker C-syntaks... Og en ting til - denne oppgaven hadde ikke gått enklere å løse i C# Samme prinsippene gjelder der. Hadde vært enklere i PHP, da man ikke kan spesifisere (selv om man kan "hinte" - for ett drittspråk) datatyper der, men likevel EDIT: Min length_add() er ikke satt til struct, men den returnerer en struct Det er forsåvidt ikke feil å bruke void, men da må man ta seg av printing-logikken i fuknsjonen, det ville jeg ikke. Tross alt heter funksjonen length_add(), ikke length_add_and_print(). Man kan også bruke en void og returnere noe, dersom man i en parameter mottar en peker til ett objekt man kan skrive til (Ca. det samme som "out" i C#). EDIT: Aah, okay GeirGrusom Skulle ønske jeg lærte å programmere på skolen... Har lagt meg på alt for mye drit og dårlige vaner, takket være at jeg er selvlært... Endret 22. januar 2010 av ze5400 Lenke til kommentar
Bruno Mars Skrevet 22. januar 2010 Forfatter Del Skrevet 22. januar 2010 Det er langt i fra samme språk. Den største likheten er vel egentlig at begge bruker C-syntaks... Og en ting til - denne oppgaven hadde ikke gått enklere å løse i C# Samme prinsippene gjelder der. Hadde vært enklere i PHP, da man ikke kan spesifisere (selv om man kan "hinte" - for ett drittspråk) datatyper der, men likevel . Where C# is just different from C++ - value types and reference types exist (struct is value-type, class is reference-type) - value types live on the stack, reference types on the heap - references can point to null (must not be valid) - code is packaged in assemblies in C# - no automatic conversion from int to bool in C# - main-function is called Main in C# - no semicolon after a class declaration in C# - everything derives from object or can be treated as if Er ikke sikkert dette hadde vært enklere, men jeg syntes iallefall C# er mye bedre og lettfattelig. Men jeg trenger uansett mer hjelp. Jeg ser på koden din men jeg greier ikke å "konvertere" den til min måte. Hvordan har du skrevet din, Henning (om jeg får lov til å kalle deg det, GeirGrusom )? Lenke til kommentar
ze5400 Skrevet 22. januar 2010 Del Skrevet 22. januar 2010 (endret) Jeg er enig i at C# er ett mye mer lettfattelig, mer produktivt, og (subjektivt sett) bedre språk, men det hjelper fint lite her. Nå er det engang slik at C er ett greit språk å kunnet - især om man kommer borti microkontrollere (PIC, AVR, etc.). Samt at det er en fordel å forstå hvordan allokering av minne og slikt foregår. Tilbake til tema: Forstår du denne biten: Det er nemlig her det foregår. for (i = 0; i < LengthArraySize; i++) { TmpLength.cm += LengthArray[i].cm; TmpLength.mm += LengthArray[i].mm; ... if (TmpLength.mm > 10) { int Rem = (TmpLength.mm % 10); TmpLength.cm += (TmpLength.mm / 10); TmpLength.mm = Rem; } ... } Endret 22. januar 2010 av ze5400 Lenke til kommentar
Bruno Mars Skrevet 22. januar 2010 Forfatter Del Skrevet 22. januar 2010 Nja, jeg tror det. Men "struct lengde add_length(struct lengde* LengthArray, int LengthArraySize)" sammen med det er litt mer vanskelig... Denne skjønner jeg ikke noe av: "LengthArray = (struct lengde*)malloc(sizeof(struct lengde) * LengthArraySize);". Lenke til kommentar
ze5400 Skrevet 22. januar 2010 Del Skrevet 22. januar 2010 (endret) Nja, jeg tror det. Men "struct lengde add_length(struct lengde* LengthArray, int LengthArraySize)" sammen med det er litt mer vanskelig... Denne skjønner jeg ikke noe av: "LengthArray = (struct lengde*)malloc(sizeof(struct lengde) * LengthArraySize);". Ikke tenk på return-type eller input-parameterne til funksjonen. Ei heller allokeringen av minne - det er ikke kritisk for å løse oppgaven. Det er for å støtte n-antall structs som kan motta verdier og kombineres. Det er kun dette du må forstå og omgjøre til ditt eget: 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; } Håper du forstår alt som foregår der - hvis ikke er det bare å spør Endret 22. januar 2010 av ze5400 Lenke til kommentar
Bruno Mars Skrevet 22. januar 2010 Forfatter Del Skrevet 22. januar 2010 int main() { struct Length* LengthArray; int LengthArraySize = 3; int i; struct Length Added; char* RetCm; char* RetMm; LengthArray = (struct Length*)malloc(sizeof(struct Length) * LengthArraySize); if (LengthArraySize < 1) return 0; for (i = 0; i < LengthArraySize; i++) { printf("%s%i%s", "Please input the data for struct: #", (i + 1), "\r\nM: "); scanf("%i", &LengthArray.m); printf("%s", "\r\CM: "); scanf("%i", &LengthArray.cm); printf("%s", "\r\MM: "); scanf("%i", &LengthArray.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) { for (i = 0; i < (strlen(RetCm) - 2); i++) { char* Tmp = (char*)malloc(sizeof(char) * 3); strcpy(Tmp, RetCm); strcpy(RetCm, "0"); strcat(RetCm, Tmp); } } RetMm = (char*)malloc(sizeof(char) * 2); itoa(Added.mm, RetMm, 10); printf("%s%i%s%s%i", "\r\n\r\n\"float\" representation: ", Added.m, ".", RetCm, Added.mm); free(RetMm); free(RetCm); system("PAUSE"); return 0; } Det jeg har markert skjønner jeg ikke noe særlig av... Lenke til kommentar
ze5400 Skrevet 22. januar 2010 Del Skrevet 22. januar 2010 (endret) Added = add_length(LengthArray, LengthArraySize); free(LengthArray); Added er en instans av structen, og her kaller jeg funksjonen add_length() med ett structarray som parameter, samt størrelsen dets. LengthArray inneholder flere instanser av Length-structen. Returverdien av add_length (som altså havner i Added) er resultatet av Length-strukturene i LengthArray slått sammen. ... RetCm = (char*)malloc(sizeof(char) * 3); Alloker minne til char-arrayet RetCm, slik at jeg kan fylle informasjon i det. Allokerer plass til to siffer, samt terminering (). itoa(Added.cm, RetCm, 10); IntegerToAplha. Legger integer-centimeterveriden fra Added over i RetCm. Informerer itao om at de er desimaltallsystemet som er brukt (10-base). if (Added.mm != 0) { Dersom tallverdien i Added.mm er ulikt null, gjør mer prosessering. for (i = 0; i < (strlen(RetCm) - 2); i++) { Looper gjennom løkken intill i tilsvarer lengden av RetCm - 2. char* Tmp = (char*)malloc(sizeof(char) * 3); Alloker minne til en midlertidig variabel. ... RetMm = (char*)malloc(sizeof(char) * 2); Mer allokering. itoa(Added.mm, RetMm, 10); Utgår. Se ny versjon på forrige side. ... free(RetMm); free(RetCm); Frigjør minne vi har brukt. Det jeg har markert skjønner jeg ikke noe særlig av... Bedre? Endret 22. januar 2010 av ze5400 Lenke til kommentar
Bruno Mars Skrevet 22. januar 2010 Forfatter Del Skrevet 22. januar 2010 Frykter for å bli tatt for juks om jeg bruker free, itoa og malloc, da vi ikke har lært det og jeg ikke kan noe om det. Men det finnes vel noe forenklinger av det? Lenke til kommentar
ze5400 Skrevet 22. januar 2010 Del Skrevet 22. januar 2010 Egentlig ikke. Du trenger ikke å bruke malloc og free til denne oppgaven, men itoa kan være vrien å komme rundt. Men strengt tatt er alle disse en del av standardbiblioteket til C, og dermed totalt legale. De forventer da at du skal lese dokumentasjon og oppsøke informasjon på egenhånd? 2min, skriver opp ett meget enklere eksempel som ikke inneholder noe dilldall. Lenke til kommentar
Bruno Mars Skrevet 22. januar 2010 Forfatter Del Skrevet 22. januar 2010 #include <stdio.h> #include <stdlib.h> struct lengde { int m; int cm; int mm; }; struct lengde add_length(struct lengde* lengdeArray, int lengdeArraySize) { int i; struct lengde aLengde; aLengde.m = 0; aLengde.cm = 0; aLengde.mm = 0; for (i = 0; i < lengdeArraySize; i++) { aLengde.cm += lengdeArray[i].cm; aLengde.mm += lengdeArray[i].mm; aLengde.m += lengdeArray[i].m; if (aLengde.mm > 10) { int Rem = (aLengde.mm % 10); aLengde.cm += (aLengde.mm / 10); aLengde.mm = Rem; } if (aLengde.cm > 100) { int Rem = (aLengde.cm % 100); aLengde.m += (aLengde.cm / 100); aLengde.cm = Rem; } } return aLengde; } int main() { struct lengde* lengdeArray; int lengdeArraySize = 3, i; struct lengde Added; char* RetCm; char* RetMm; for (i = 0; i < lengdeArraySize; i++) { printf("%s%i%s", "Please input the data for lentgh number ", (i + 1), "\r\nM: "); scanf("%i", &lengdeArray[i].m); printf("%s", "\r\CM: "); scanf("%i", &lengdeArray[i].cm); printf("%s", "\r\MM: "); scanf("%i", &lengdeArray[i].mm); } Added = add_length(lengdeArray, lengdeArraySize); printf("%s%i%s%i%s%i", "Meter: ", Added.m, "\r\nCentimeter: ", Added.cm, "\r\nMillimeter: ", Added.mm); itoa(Added.cm, RetCm, 10); itoa(Added.mm, RetMm, 10); printf("%s%i%s%s%i", "\r\n\r\n\"float\" representation: ", Added.m, ".", RetCm, Added.mm); system("PAUSE"); return 0; } Krasjer etter jeg legger inn første tall. Lenke til kommentar
ze5400 Skrevet 22. januar 2010 Del Skrevet 22. januar 2010 (endret) Det er jo ikke rart. Du benytter jo lengdeArray uten å initialisere den først. Du oppretter en peker, men du må allokere minne til den før du kan bruke den. 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å