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 "&nbsp;" 
    
    #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 "&nbsp;"
    
    #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?


Log in to reply