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
Det miniprogrammet skulle var at få akse intervallerne til at vise sig på skærmen. Men det kan åbenbart ikke lade sig gøre.


Og ja du har nok ret med at jeg skal koncentrere mig om en ting ad gangen.

Det vil sige jeg først lige skal have ordnet min min. og max. Lige nu når jeg kører mit program:

#include <stdio.h>
#include <string.h>

char xText[] = "Tid(sek)";
char yText[] = "Temp(C)";

char a[19][45] =
{

" ",
" ^ ",
" | ",
" | ",
" | ",
" | ",
" | ",
" | ",
" | ",
" | ",
" | ",
" | ",
" +---|---|---|---|---|->"
};

int main()
{
int s;
double minX = 0.0;
double maxX = 100.0;
double minY = 0.0;
double maxY = 100.0;


printf("Minimums og maksimums værdi på x-aksen: ");
fflush(stdout);
scanf("%lf, %lf", &minX, &maxX);
scanf("%lf, %lf", &minY, &maxY);
printf("Minimums og maksimums værdi på y-aksen: ");

memcpy(a[1]+ 19 - strlen(yText), yText, strlen(yText));
memcpy(a[12] + 45 - strlen(xText), xText, strlen(xText));

for(s = 0; s < 14; s++)
{
printf("%s\n", a);
}

return 0;
}

starter programmet med at plotte følgende sætning, og beder om at indtaste en værdi:

(Minimums og maksimums værdi på x-aksen: )
men lige så snart jeg indtaster en værdi og trykker enter, plottter den følgende ud:

Minimums og maksimums værdi på y-aksen:
Temp(C)
|
|
|
|
|
|
|
|
|
|
+---|---|---|---|---|->Tid(sek)

jeg får slet ikke mulighed for at taste en værdi ind for y-aksen.

Hvad er det jeg gør forskert i koden??






Den første fejl er at du ikke putter din kode ind i en kode-box når du poster på udvikleren.dk. For at gøre det skal du trykke på dokumentet med den lille gule box der er på knappen lige over boxen du skriver teksten i på udvikleren.dk. Derpå placerer du din kode mellem de to [ ] blokke:

Fold kodeboks ind/udKode 


Det jeg ville vise med koden ovenover er, udover at vise dig hvordan kode-boxen virker, at du kan ændre din kode så den ser ud på den måde, så kan du faktisk indtaste dine min og max værdier. Da du har komma mellem de to %lf skal du indtaste et komma mellem de to værdier.

Derudover har du lavet det om så teksten ikke længere bliver vist på akserne i dit koordinatsystem. Men det har virket en gang, så det burde være muligt at få det til at virke igen, ved at finde en version hvori det virker.



Okay så har jeg fået ordnet max. og min. jeg har også ændret lidt i print sætningen til den nederste string. Min lærer mente den vil give problemer længere i opgaven. Hvilket jeg synes slet ikke giver mening da den nye print sætning jeg har lavet giver næsten præcis det samme.

Fold kodeboks ind/udKode 


Jeg har bare ikke forstå hvorfor jeg ikke kan få akse intervallerne til at vise de værdier jeg angiver. Istedet skriver den værdierne ud som 0. Er det fordi jeg angiver den til kun at se på lige netop det punkt hvilket svarer til 0???



ja så fik jeg lært at bruge kode boksen:).. he he



Det her går ikke:

Fold kodeboks ind/udKode 


a er et 2d Array, a[...] er et array af chars (eller en streng) og a[][] er én char (/karakter).

'20.0' er ikke gyldigt, '' bruges til én char.
Du skal have "20.0" da der er mere end 1 char, dvs, der er en streng. Man kan ikke bruge = til at kopiere strenge, så du skal bruge en memcpy.



Okay jeg er med på at jeg skal konvertere til strenge og så bruge memcpy. Men problemet her er at hvis jeg bruger memcpy så tager den den værdi jeg har indlæst og sætter det på den ønskede plads.

Men jeg har lige idag fået af vide af min lærer at jeg ikke må bruge memcpy til at vise akseintervallerne med. Han mener det er en forkert måde at gøre det på. Har du eventuelt en anden måde man kan gøre det på. Min lærer sagde jeg skulle lave det på følgende måde:
Fold kodeboks ind/udKode 


Men jeg kan simpelthen ikke se hverken hoved eller røv ved den kode.








Og det ha mener er forkert ved at gøre brug af memcpy er at det så bliver hardcoding.



Men problemet her er at hvis jeg bruger memcpy så tager den den værdi jeg har indlæst og sætter det på den ønskede plads.

Jeg har lidt svært ved at se at det skulle være et problem at det virker som det skal...

Men jeg har lige idag fået af vide af min lærer at jeg ikke må bruge memcpy til at vise akseintervallerne med

Tja, skolelærer er indimellem lidt besværlige.

Du kan jo pakke din memcpy ind i en pæn funktion, som din lærer foreslår.

Jeg ville nok lave noget i stil med:
Fold kodeboks ind/udKode 


Så kan du bruge den fra din kode:
PutStr(1, 10, "20.0");

Jeg kan ikke se at der skulle være noget galt i at bruge memcpy, men du kan naturligvis også lave funktionen som:
Fold kodeboks ind/udKode 

Det er lidt mere bøvlet, men hvis det gør din lærer glad...

Jeg synes at den "pristr" funktion din lærer tager bruger temmelig mange argumenter, jeg kan ikke rigtigt se hvad de laver...



Ja det er præcis det samme jeg sagde til ham, men han er simpelthen for langt ude. Tror at de nok fyrer ham fra kurset til næste semester da han har fået så mange klager over undervisningen.

den sidste kode du bruger:

Fold kodeboks ind/udKode 


skal koden så laves med hver en værdi, altså på følgende måde:

Fold kodeboks ind/udKode 





Det ser rigtigt ud, men vigtigere, virker det?

Du kunne også bruge PutStr til at skrive teksten på x og y akserne.



t