Koordinatensystem + Graph mittels for-Schleifen Problem
-
Hallo zum Zweiten,
nachdem das erste Problem mit der mathematischen Funktion gelöst ist hab ich mich bei meinem Programm daran gemacht eben diese Funktion abzubilden.
Das Ganze soll wieder in einer html-Datei ausgegeben werden.
Ich möchte mit for-Schleifen und if-Anweisungen ein Koordinatensystem und den dazugehörigen Graphen darstellen. Leider bekomm ich, auch nach langen probieren, die Darstellung nicht gebacken.
So solls ausschaun:
+--------#
+-------#
+------#
+----#
+--#
#+++++++Bei mir ists eher Datensalat
Hat jemand Lust da mal reinzuschaun
#include<iostream> #include<fstream> #include<math.h> using namespace std; #define HK1 "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"" #define HK2 "\"http://www.w3.org/TR/html4/loose.dtd\">" #define HK3 "<html><head><meta http-equiv=\"Content-Type\"" #define HK4 "content=\"text/html; charset=ISO-8859-1\">" #define HT1 "<title>Informatik 1: File I/O Beispiel</title>" #define HS1 "<style type=\"text/css\"> body {font:10pt courier} </style>" #define HBS "</head><body>" #define HBE "</body></html>" #define ZV "<br>" #define ZW " " #define NP '*' #define BP "<span style=\"color:blue;\">*</span>" #define RP "<span style=\"color:red;\">*</span>" #define GP "<span style=\"color:green;\">*</span>" #define YP "<span style=\"color:yellow;\">*</span>" #define CP "<span style=\"color:cyan;\">*</span>" #define MAX 120 float x; // Fariablendeklaration float v; float R1, R2; void funktion (float x); // Funktiondeklaration int main() { cout << "Bitte geben Sie einen Wert fuer Widerstand R1 zwischen 100 Ohm und 100 kOhm ein:\n" << endl; cin >> R1; if (R1 < 100) { cout << "Unzulaessiger Wert . . .\n"; return 0; } else if (R1 > 100000) { cout << "Unzulaessiger Wert . . .\n"; return 0; } else { cout << "Bitte geben Sie einen Wert fuer Widerstand R2 zwischen 100 Ohm und 100 kOhm ein:\n" << endl; } cin >> R2; if (R2 < 100) { cout << "Unzulaessiger Wert . . .\n"; return 0; } else if (R2 > 100000) { cout << "Unzulaessiger Wert . . .\n"; return 0; } else { cout << "\nDanke, den Graphen finden Sie in der Datei Aufgabe1.html." << endl; } // HTML Datei anlegen und Kopfdaten eintragen ofstream out("Aufgabe1.html"); if (!out) { cout << "\nFehler: Datei kann nicht angelegt werden.\n"; return -1; } out << HK1 HK2 HK3 HK4 HT1 HS1 HBS; // HTML Kopf und Titel out << "Test-" << ZV << ZV << ZV; // Blattüberschrift for (x=0; x<=1; x+=0.01) // Funktion aufrufen { funktion (x); out<<v<<endl; } int z; int y; for (y=0; y<=100; y++) { for (z=0; z<=50; z++) { if (y==0) { out << NP << endl; } if (z==50) { out << NP << endl; } if (z==v) { out << BP << endl; } } } // --- hier zeichnen Sie Ihre Funktion mit Hilfe der oben angegebenen Konstanten out << HBE; // HTML Inhalt abschliessen out.close(); // Datei schliessen / speichern return 0; } void funktion (float x) // Funktion definieren { float t; float s; s = 1+(1-x)*x*R1/R2; t = x/s*50; v = int(t+0.5); }
Gruß,
Agrippa
-
Hallo,
hab des Problem jetzt mal bisschen eingegrenzt. Der Fehler ist dass der Brauser die 100 Zeichen nicht in einer Zeile darzustellen kann. Er scheint immer ein Leerzeichen zwischen den einzelnen Zeichen zu machen. So wird die Ausgabe natürlich verzerrt.
Kann man da im Programm über 'out' was einstellen, oder im Browser? Werd mich mal auf die Suche machen.
Wenn jemand eine Idee hat, bitte posten
Agrippa
-
Hallo nochmal,
das problem bei meinem Programm scheint doch ein anderes zu sein.
Hab das ganze jetzt mit einem 2D Array probiert und auch hier klappts nicht. Die Ausgabe wird nicht in Matrizenform dargestellt, sondern hintereinandergereiht. Also so wie es gespeichert wird.
Wie kann ich dem Programm also anweisen, dass nach 100 Zeichen der 1. Zeile die nächste Zeile beginnt?
Hier noch der Code:
//int matrix; int j; int i; const int x = 100; const int z = 50; char matrix [z][x]; for (j = 0; j < z; j++) //Matrix einlesen { for (i = 0; i < x; i++) { matrix [j][i]= NP; } } for (j = 0; j < z; j++) //Matrix ausgeben { for (i = 0; i < x; i++) out<< matrix [j][i] << endl; }
Was ist das Problem?
Agrippa
-
Agrippa schrieb:
Wie kann ich dem Programm also anweisen, dass nach 100 Zeichen der 1. Zeile die nächste Zeile beginnt?
Hallo Agrippa,
eine neue Zeile beginnt man indem man die aktuelle Zeile mit 'endl' (End Line) beendet. Das darfst Du natürlich erst dann machen, wenn das letzte Zeichen der Zeile ausgegeben ist, und nicht schon vorher.
Eine Matrix benötigst Du nicht, in einer etwas performanteren Variante würde ein einfaches Array zum Speichern der Funktionswerte für alle x genügen.
Aber lassen wir dies mal weg - heutige Rechner sind schnell genug, um Dein Problem in akzeptabler Zeit auch so durchzurechnen. Dann sieht das mit Deinem ersten Postings als Grundlage etwa so aus:#include<iostream> #include<fstream> #include<cmath> using namespace std; #define HK1 "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\"" #define HK2 "\"http://www.w3.org/TR/html4/loose.dtd\">" #define HK3 "<html><head><meta http-equiv=\"Content-Type\"" #define HK4 "content=\"text/html; charset=ISO-8859-1\">" #define HT1 "<title>Informatik 1: File I/O Beispiel</title>" #define HS1 "<style type=\"text/css\"> body {font:10pt courier} </style>" #define HBS "</head><body>" #define HBE "</body></html>" #define ZV "<br>" #define ZW " " #define NP '*' #define BP "<span style=\"color:blue;\">*</span>" #define RP "<span style=\"color:red;\">*</span>" #define GP "<span style=\"color:green;\">*</span>" #define YP "<span style=\"color:yellow;\">*</span>" #define CP "<span style=\"color:cyan;\">*</span>" int funktion (double x, double param1); // Funktiondeklaration int main() { double R1, R2; cout << "Bitte geben Sie einen Wert fuer Widerstand R1 zwischen 100 Ohm und 100 kOhm ein:\n" << endl; cin >> R1; if (R1 < 100) { cout << "Unzulaessiger Wert . . .\n"; return 0; } else if (R1 > 100000) { cout << "Unzulaessiger Wert . . .\n"; return 0; } else { cout << "Bitte geben Sie einen Wert fuer Widerstand R2 zwischen 100 Ohm und 100 kOhm ein:\n" << endl; } cin >> R2; if (R2 < 100) { cout << "Unzulaessiger Wert . . .\n"; return 0; } else if (R2 > 100000) { cout << "Unzulaessiger Wert . . .\n"; return 0; } else { cout << "\nDanke, den Graphen finden Sie in der Datei Aufgabe1.html." << endl; } // HTML Datei anlegen und Kopfdaten eintragen ofstream out("Aufgabe1.html"); if (!out) { cout << "\nFehler: Datei kann nicht angelegt werden.\n"; return -1; } out << HK1 HK2 HK3 HK4 HT1 HS1 HBS; // HTML Kopf und Titel out << "Test-" << ZV << ZV << ZV; // Blattüberschrift // --- hier zeichnen Sie Ihre Funktion mit Hilfe der oben angegebenen Konstanten out << "<pre>" << endl; // präformatierter Text folgt for (int y=100; y>=0; --y) // y: Zeilenindex läuft von groß nach klein { for (int z=0; z<=50; z++) // z: Spaltenindex { int v = funktion (z/50., R1/R2 ); // x := z/50; z e[0,50] -> x e[0,1] if (y==0 || z==50 ) // untere Zeile und rechter Rand = NP { out << NP; } else if (y==v) { out << BP; } else { out << " "; } } out << endl; // Zeilenende } out << "</pre>" << endl; out << HBE; // HTML Inhalt abschliessen return 0; } int funktion (double x, double R1_R2 ) // Funktion definieren { double s = 1+(1-x)*x*R1_R2; double t = x/s*50; return int( floor(t+0.5) ); // auf int runden }
Der Spaltenindex muss natürlich in der inneren Schleife laufen, da zunächst alle Zeichen einer Zeile ausgegeben werden müssen, bevor die nächste Zeile folgt.
Gruß
Werner
-
Wahnsinn.
Vielen Dank, Dein Nachname passt.
Werd mir des jetzt nochmal genauer ansehen.
Gibts hier eigentlich nen Bierspendier-button?