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
ved du så hvorfor den slet ikke printer koordinatsystemet nu???

Okay så nu har jeg kun brugt double:

double minX = 0.0;
double maxX = 100.0;
double minY = 0.0;
double maxY = 100.0;



Hvis jeg skriver:
1, 2, 3, 4
Efterfulgt af enter, når programmet starter, skriver det:
1.000000, 2.000000, 3.000000, 4.000000
Og tegner koordinatsystemet.



kan man på en eller anden måde få programmet til at udregne og skrive intervalværdierne på akserne. Kan man gøre det vha. en fil, hvor man så taster x akse værdierne og så y akse værdierne og så åbne det i selve programmet???



Ja, det kan man godt, der er sådan set ikke noget man ikke kan...

Prøv at lave det, hvis det ikke virker så spørg igen.



okay så har jeg prøvet at få programmet til at udregne og skrive intervalværdierne på akserne, men det ser ikke ud til at virke:

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

#define FILE_NAME "testopg1akse.txt"

int printFile(void)
{
FILE *fp;

double Xaksen, Yaksen;
// Viser det aktuelle bibliotek hvor programmet ser efter testopg1akse.txt

fp = fopen(FILE_NAME, "r");
if(fp == NULL) {
printf("Fandt ikke filen.");
exit(EXIT_FAILURE);
}
fscanf(fp, "%lf %lf", &Xaksen, &Yaksen);
printf("%lf %lf", Xaksen, Yaksen );
fclose(fp);
return EXIT_SUCCESS;
}

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);
printf("Minimums og maksimums værdi på y-aksen: ");
scanf("%lf, %lf", &minY, &maxY);

//Så bruges funktionen memcpy der kopierer et antal bytes/chars fra et sted til et andet.
//Den første af de to memcpy i koden nedenunder skriver yText ind i 2D-arrayet, i første
//linje fra venstre. Den anden skriver xText ind på sidste linje, men højrestillet.

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;
printFile();
}




Jeg kan ikke se at du forsøger "at udregne og skrive intervalværdierne på akserne", hvor i koden mener du at det skulle ske?

Hvad mener du at printFile funktionen skal gøre?
Den bliver aldrig kaldt..



jamen det er her problemet ligger.

Inde i printFile prøvede jeg først at skrive:

printFile(testopgakse1);

men så gik det fuldstændig galt.



Helt overordnet. Vi har nu brugt 37 indlæg på at diskutere denne ret trivielle opgave, vi har fået genereret ca 70 linjer kode, eller 2 linjer kode pr indlæg, fortsætter vi på den måde ender vi med langt over 100 indlæg. Og her ringer mine alarmklokker! Jeg har andet at lave, og du skal vel også være færdig en gang?

Prøv lige at bruge lidt mere tid på at tænke over mit seneste indlæg, og besvar de to spørgsmål.

Jeg er ikke sikker på at jeg kan finde nogen reel mening i dit sidste indlæg.



Det kan godt være at mit problem angående opgaven er ret triviel for dig, men set for mine øjne er det en skide svær opgave da jeg først lige har lært at programmere.

Mit problem lige nu er hvordan jeg kan få følgende mini-program indlæst i selve hovedprogrammet hvor koordinatsystemet er:

(mini-program):

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#define FILE_NAME "testopg1akse.txt"

int main(void) {


FILE *fp;

double dv, dv1;
double dv2, dv3;
double dv4, dv5;
double dv6, dv7;
double dv8, dv9;
double dv10, dv11;


fp = fopen(FILE_NAME, "r");
if(fp == NULL) {

printf("Fandt ikke filen.");
exit(EXIT_FAILURE);
}

fscanf(fp, "%lf %lfn", &dv, &dv1);
fscanf(fp, "%lf %lf", &dv2, &dv3);
fscanf(fp, "%lf %lf", &dv4, &dv5);
fscanf(fp, "%lf %lf", &dv6, &dv7);
fscanf(fp, "%lf %lf", &dv8, &dv9);
fscanf(fp, "%lf %lf", &dv10, &dv11);

printf("%lf %lf\n", dv, dv1);
printf("%lf %lf\n", dv2, dv3);
printf("%lf %lf\n", dv4, dv5);
printf("%lf %lf\n", dv6, dv7);
printf("%lf %lf\n", dv8, dv9);
printf("%lf %lf\n", dv10, dv11);

fclose(fp);

return EXIT_SUCCESS;
}


(hovedprogrammet):

#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);
printf("Minimums og maksimums værdi på y-aksen: ");
scanf("%lf, %lf", &minY, &maxY);

//Så bruges funktionen memcpy der kopierer et antal bytes/chars fra et sted til et andet.
//Den første af de to memcpy i koden nedenunder skriver yText ind i 2D-arrayet, i første
//linje fra venstre. Den anden skriver xText ind på sidste linje, men højrestillet.

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;

Er det en funktion jeg skal bruge??




Well, al begyndelse er svær. Det to mig et par dage at lave mit første Basic program tilbage i 83, mest fordi jeg ikke vidste hvad Basic var og ikke kendte nogen der kunne programmere. Mit første program var en bille der kunne flytte sig på skærmen, computeren var en VIC 20.

Nå, tilbage til sagen. Grundlæggende har jeg svært ved at tro at du selv ved hvad du laver. Det ser ud som om du padler lidt rundt til højre og til venstre, forsøger at løse ét problem på én måde, og går så videre, uden at løse det første problem til et nyt problem som du så heller ikke ved hvad du skal stille op med.

Før stillede jeg et par spørgsmål, dem har du stadig ikke forsøgt at besvare. I stedet poster du noget nyt kode, et "miniprogram". Det eneste dette program gør er at læse nogle tal fra en fil og skrive dem ud på skærmen. Jeg kan ikke rigtigt se formålet hermed, eller hvordan det har nogen sammenhæng med resten (koordinat-systemet).

Jeg synes du skal prøve at koncentrere dig om ét problem af gangen, og få det problem løst inden du går videre.

Det var nok en god ide at lave en liste over de ting du skal lave, og udfør dem derpå i rækkefølge.

Hvis vi kikker på den oprindelige opgave er vi vist nået til:
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.

Jeg ved ikke rigtigt hvad der menes med "kunne modtage", men måske skal brugeren indtaste dem? Det ser ud til at du har forsøgt at løse denne del?
Så mangler du bare at skrive værdierne på akserne.

Start med at indlæse værdierne, konverter værdierne til strenge med sprintf og skriv dem ud de rigtige steder, som vi gjorde med teksterne til x- og y-akserne.



t