Gå til innhold

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


Anbefalte innlegg

Videoannonse
Annonse

Beklager :blush:

 

Du har så klart rett :blush:

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 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.

 

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

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
Du har ikke den siste versjonen i en mindre rotete form da? :p

 

 

Nei, jeg har ikke det :tease:

Jeg skriver nesten aldri C, og da blir det rotete :p

 

Men det er ikke sååå rotete. Dessuten er det god trening for deg i å lese andres kode  :innocent:

 

EDIT: Hvilket IDE bruker du, forresten?

EDIT2: Hvem er Helge, Henning?

En i en annen tråd, eller en IRL?

Endret av ze5400
Lenke til kommentar

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 :tease:

 

 

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

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

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

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

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

#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

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...