Ja, lav noget i stil med nedenstånde:
antag at dit vindue (DOS vindue?) er 80 tegn bredt og 24 tegn højt som på gamle tty-terminaler.
Såfremt du skriver ud på papir kan du jo bare ændre dimensionerne tilsvarende.
Så skal du skalere din funktion til at tage input i området 0-79, samt levere output i området 0-23.
Dette gøres ved en lineær transformation i x-aksen på simpel vis af det oprindelige interval [a,b]. I y-aksen er det igen en lineær transformation fra [f-min,f-max], hvor
f-min: den mindste værdi din funktion antager
f-mamx: den største værdi din funktion antager.
Lav et 2-dimensionelt array af tegn,
char output[24][80];
initialiser alle tegn til blank \' \' i output;
for (x=0; x<24; x++)
{
output[x][f(x)] = \'x\';
};
for (i=0; i<24; i++)
{
for (j=0; j<80; j++) cout<<output[i][j];
cout << endl;
}
Meget smart løsning ! Takker så mye !
Hvilken kurve skulle det så beskrive?
For det som jeg får ud af det ligner ikke noget andet end underlige tegn...
x og f(x) ligger jo som nøgler i arrayet, men skulle de ikke ligge som værdierne i stedet for?
Ikke fordi at jeg er ekspert på området men jeg ville da tro at det er derfor jeg selv får så mærkeligt et resultat ud af det...
Nu beskrev jeg kun princippet, og overlod detaljerne i implementationen til langbein,
men prøv at oversætte og køre flg. program fra en DOS-prompt i fuld-skærm:
// Ønsker at tegne funktionen f(x)=sin(x) i intervallet [-pi,+pi]
// på simpel tekstuel vis på en tty-skærm med 71x21 tegn
#include \"stdafx.h\"
#include \"ostream.h\"
#include \"math.h\"
double f(double x)
{
return sin(x);
}
int main(int argc, char* argv[])
{
int i,j;
double a = -3.14, b = 3.14;
double min = f(a), max = f(a);
double h = (b-a)/70;
char output[70+1][20+1];
// Beregn maximal og minimal værdi af funktionen f (til skalering i y-aksen)
for (i=0; i<=70; i++)
{
double x = a + i*h;
double y = f(x);
if (y<min) min = y;
if (y>max) max = y;
}
// Lav \"tom\" output
for (i=0; i<=70; i++)
{
for (j=0; j<=20; j++)
{
output[i][j] = \' \';
}
}
// \"Tegn\" funktionen f i output
for (i=0; i<=70; i++)
{
double x = a + i*h;
double y = f(x);
j = (int) ((20*(y-min)/(max-min)) + 0.5); // Skalering i y-aksen; 0.5 er for korrekt afrunding
output[i][j] = \'x\';
}
// Skriv output ud på skærmen
// Bemærk: Omvendt udskrivning i y-aksen pga. skærm-koordinater
// starter i øverste venstre hjørne og ikke i nederste venstre hjørne
for (j=20; j>=0; j--)
{
for (i=0; i<=70; i++)
{
cout << output[i][j];
}
cout << endl;
}
return 0;
}
Tak for det fine eksempel:)
Jeg kunne ikke selv få det til at virke(dit eksempel virker fint):(