Gå til innhold

[Løst]Trenger hjelp med en struct- oppgave


Anbefalte innlegg

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
Videoannonse
Annonse

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 av GeirGrusom
Lenke til kommentar

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

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

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

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 av ze5400
Lenke til kommentar

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

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

Har du lest leksene dine? :tease:

 

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 av ze5400
Lenke til kommentar

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

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 av ze5400
Lenke til kommentar

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...