Koordinatsystem

Tags:    c++

Hej alle
Jeg har fået til opgave at lave et, rent ud sagt, sindsygt program?
Jeg skal lave et program (hvor hovedfilen skal kaldes for ”visdata.c”) til at plotte et to-dimentionelt koordinat system på skærmen ved hjælp af ascii tegn. Programmet skal demonstreres til at kunne vise nedenstående output, hvor der (som eksempler) er tal værdier (x0,y0)= (5,10), (x1,y1) = (10,10), (x3,x4)=(15,20), etc. Koordiantsættene skal aflæses og bruges som data for programmet:

(man kan åbenbart ikke sætte koordinatsystemet ind på denne side, så hvis i ønsker at se koordinatsystemet skal i bare angive mail, så sender jeg den til jer.)

Der er følgende funktionelle krav til funktionerne i header filen:

a) Programmet skal kunne vise en string til hver af titlerne på de to akser. Ovenfor er der f.eks. brugt ”Temp (C)” til y-aksen.

b) Det skal kunne modtage en minimum værdi og en maksimum værdi for både x- og y-akserne. Ovenfor er der f.eks. brugt 0.0 og 100.0 til x-aksen.

c) Programmet skal selv kunne udregne og skrive intervalværdierne på akserne.

d) I programmet skal bruges følgende ting: const, extern, pointere, funktioner, headerfiler, #define, #ifndef, makefil, structs, switch, enumeration, typedef, den tertiere operator ”? :” og multidimensionelle arrays.

e) Der må ikke laves hardcoding i programmet. Mest muligt skal laves med ”#define”.

f) Programmet skal organiseres fornuftigt med header filer til forskellige formål, samt fornuftige funktioner til de ting programmet skal gøre.


Jeg synes altid det er lidt svært at komme igang med en opgave, og især når det er så svær en opagve. Jeg har startet med at lave et mini-program der indikerer hvordan man læser fra en fil og i dette tilfælde er det så kun de to første koordinatsæt:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define FILE_NAME "testdata.txt"

int main(void)
{
// Pointer til filen
FILE *fp;

// Variable til en tid og temperatur
double dv, dv1;

// Viser det aktuelle bibliotek hvor programmet ser efter koordinatsættene
printf("%s\n", getcwd(NULL, 0));

fp = fopen(FILE_NAME, "r");

if(fp == NULL)

{
printf("koordinatsættene.");
exit(EXIT_FAILURE);

}

fscanf(fp, "%lf %lf", &dv, &dv1);
printf("%.3lf %lf", dv, dv1);
fclose(fp);

return EXIT_SUCCESS;

}


Men nu er jeg gået i stå.. jeg aner ikke hvor jeg skal begynde.



85 svar postet i denne tråd vises herunder
0 indlæg har modtaget i alt 0 karma
Sorter efter stemmer Sorter efter dato
Om du kalder din funktion Puts eller PutStr er lidt ligegyldigt. puts og Puts er ikke det samme navn.

Du skriver alle dine værdier ud på samme linje, på positioner fra 3 - 13, så det vil komme til at se sådan ud.



Okay så virker det hele med følgende kode:
Fold kodeboks ind/udKode 


Det sidste jeg mangler er at plotte nogle (*) i koordinatsystemet hvor jeg har fundet de præcise 19 koordinatpunkter. Har du nogle foreslag på hvordan det kan gøres på en enkel måde??



Det ville være oplagt at bruge en af dine PutStr funktioner, noget i stil med:
Putstr(x[n], y[n], "*");

Eller du kan bare sætte dem ind i grafen:
a[y[n]][x[n]] = '*';



Okay jamen det har jeg fået fikset nu. Men ved du hvad Bertel jeg har lige opdaget en kæmpe fejl jeg har begået. Jeg har nemlig misforstået et af kravene til opgaven. Programmet skal nemlig selv kunne udregne og skrive intervalværdierne på akserne. Det vi har gjort er jo at sætte intervalværdierne til en bestemt værdi. Forstår du hvad jeg mener??

Altså når vi taster en Maximum=50 og minimum=0 har vi jo skrevet koden således at den stadigvæk skriver akseintervallerne fra 0 til 100.

Kan vi redde koden således at der nu tages højde for max. og min., og programmet derefter selv regner hvilken fordeling der skal være mellem akseintervallerne???



Det er vel noget en simpel for-løkke kan klare.

I dag har du:
Fold kodeboks ind/udKode 


Det ligner meget en for-løkke i mine øjne, ca:
Fold kodeboks ind/udKode 




Okay lige nu kan jeg godt få programmet til at køre. Men problemet er igen at når den spørg om hvad max. og min skal være og jeg sætte den til fx. 0.0, 50.0 kommer den ud med et maximum på x-aksen fordelt fra 0.0-100.0
Og det gør den jo fordi der inde koden står double max=100.0
Er der ikke en måde man kan fravælge at skrive double max=100 inde i selve koden, men derimod er det noget programmet selv skal kunne regne ud. Så der bliver en sammenhæng mellem de max. og min. man taster ind når programmet spørger om det, og det der så vises i koordinatsystemets akser.

En anden ting jeg også lige vil høre er hvordan man man kan få 0.0, 40.0, 80.0 til at stå på linje 14, og 20.0, 60.0, 100.0 på linje 15.

Fold kodeboks ind/udKode 




Ja, man kan godt få programmet til selv at finde nogle rimelige max (og min) værdier på akserne, det er rimeligt trivielt.

Programmet skriver vel det på de linjer, som du beder det om?

Havde du et spørgsmål?



Ja mit spørgsmål er hvordan man kan få programmet til selv at fordele fx. hvis jeg taster max= 50 ud over hele x-aksen. Det vil sige hver streg får 10. Jeg prøvede at fjerne double max=100 i selve koden, men så kom den bare ud med 0.00 hele vejen på x-aksen,



Du finder bare den største x og den største y værdi, og måske runder dem op til det nærmeste pæne tal, og så har du din max for hhv x og y.



Nej jeg tror ikke helt du forstår mit spørgsmål. Jeg prøver at forklare det igen. Problemet er at jeg lige nu er nået frem til følgende kode for programmet:

Fold kodeboks ind/udKode 


Når jeg kører programmet viser det følgende:
Fold kodeboks ind/udKode 


Det jeg godt vil have programmet til at gøre er, at når jeg taster en maximum=50 ind skal programmet selv kunne regne at der ved hver lodret streg på aksen skal stå:

Fold kodeboks ind/udKode 




t