2D-Vectoren grafisch abbilden (bitte um Hilfe)



  • Hallo,
    ich will einen 2 Dimensionalen Vector in eine .txt speichern und er soll mir alles Spalten und Zeilen mit '0' anfüllen. An gewissen Stellen möchte ich statt der '0' zb eine '7'. Das funktioniert soweit ja aber nun hab ich das Problem, dass ich statt der '0' ein Leerzeichen möchte und statt der '7' zb ein '#'...
    z.B.:

    .txt derzeit:
    0000000077770000
    0000077777000000

    und möchte:
    ...........####
    ........######
    (statt den Punkten aber ein Leerzeichen).

    mit out << ' ' macht er statt den nullen die Leerzeichen aber dann kann ich später auf keine Stellen mehr zugreifen..am Besten hier mal mein Code:

    vector<vector<double> > grafik (zeile);
    	for (int i(0); i < grafik.size(); ++i) {
    		grafik[i] = vector<double>(spalte);
    	}
    
    	double schritt(0);		//schritt vorwärts
    	char s = 35;	//für #					
    
    	std::ofstream out("vector.txt");
    
    	for (int i(0); i < zeile; ++i) {
    
    		for (int j(0); j < spalte; ++j) {
    		//out << grafik[i][j];
    			out << grafik[i][j];
    			//out << ' ';
    
    		//if (grafik[i][j] == 0) {
    
    			//out << s;   
    		}
    
    		grafik[i][null] = 5;
    		schritte = x[i] / f;
    
    		//grafik[i][null + schritte] = 5;
    
    			if (schritte < 0) {
    				while (schritte < 0) {
    					grafik[i][null + schritte] = 3;
    					schritte = (schritte + f);
    
    				}
    			}
    			if (schritte > 0) {
    				schritte = schritte * (-1);
    				schritt = f;
    				while (schritte < 0 ) {
    					grafik[i][null + schritt] = 7;
    					schritte = (schritte + f);
    					schritt = schritt + f;
    				}
    			}
    
    		}
    		out << "\n";
    
    	}
    
    	out.close();
    

    (nur ein Teil des Code).
    etwas unübersichtlich und evtl umständlich geschrieben aber es funktioniert alles bis eben auf das Umwandeln..
    Bitte um Hilfe, Danke
    (für allgemeine Tipps zu 2D-Vectoren wär ich ebenfalls sehr dankbar, besonders in Kombination mit ofstream).

    MfG



  • dann kann ich später auf keine Stellen mehr zugreifen

    Ich habe nicht den Ansatz einer Ahnung, was eigentlich dein Problem ist.



  • manni66 schrieb:

    dann kann ich später auf keine Stellen mehr zugreifen

    Ich habe nicht den Ansatz einer Ahnung, was eigentlich dein Problem ist.

    Dass ich einen Vektor haben möchte mit zb 5 Zeilen und 4 Spalten und ich will ihn befüllen mit zb einer Raute in Zeile 3 und Spalte 2. Der Rest sollen Leerzeichen sein. Also die Raute steht dann irgendwo in der Nähe der Mitte meiner Textdatei.



  • Hi,

    du wirst bevor du in die Datei schreibst noch eine if-Abfrage machen müssen. Du schreibst ja direkt double Werte aus dem Vector in die Datei, was natürlich dann nur Zahlen sind.

    Beispiel:

    if(grafik[i][j]==7)
       out << '#';
    if(grafik[i][j]==0)
       out << '.';
    

    Alternativ nimmst du keinen Vector mit Double Werten, sondern beispielsweise char.



  • CarstenJ schrieb:

    Hi,

    du wirst bevor du in die Datei schreibst noch eine if-Abfrage machen müssen. Du schreibst ja direkt double Werte aus dem Vector in die Datei, was natürlich dann nur Zahlen sind.

    Beispiel:

    if(grafik[i][j]==7)
       out << '#';
    if(grafik[i][j]==0)
       out << '.';
    

    Alternativ nimmst du keinen Vector mit Double Werten, sondern beispielsweise char.

    Vielen Dank für die Antwort.
    1).So funktioniert das leider nicht, wenn ich es so mache dann sage ich ja nur "wenn an der Stelle i,j eine 7 steht, gib eine '#' aus", d.h. das Programm ändert dann ja nicht die Zahl zu einem Symbol sondern hängt das Symbol nur hinter der Zahl an. Ich würde es aber gerne ersetzen.

    1. Leider möchte ich aber einen double vector haben, da ich ja mit Zahlen arbeite.
      Also mein Programm muss folgendes können:

    *Der Benutzer gibt irgendwelche Buchstaben ein (funktioniert).
    *Jeder Buchstabe hat einen bestimmten Dezimal-Wert (funktioniert).
    *Die Werte sollen in einem Vector "gespeichert" werden (funktioniert).
    *Der Benutzer kann sich anschließend einen Wert ausdenken und eingeben, nennen wir diesen Wert mal 'f'. (funktioniert).
    *'f' muss dann durch den Wert im Vector geteilt werden und dies ergibt eine Zahl zb:
    Wert im Vector = 1, f = 0.2, dann soll das Programm (1 : 0,2 = 5)(funktioniert).
    *also 5 mal eine Raute in meine Textdatei speichern (funktioniert NICHT).

    Das Problem hierbei ist, dass die anfänglichen Wert in meinem Vector Zahlen zwischen zb -3 bis 3 sein können.

    z.B.:
    f = 0,2.
    erste Zahl = -1 (f=5), zweite Zahl = 2 (f=10) usw...
    dann soll in der Textdatei folgendes stehen:

    ..........#####0...............
    ...............0##########.....

    also '0' soll genau in der Mitte stehen.
    -3 bis +3 bei f=0,2 ergibt einen vector der Größe 30 Spalten.
    Anzahl der Werte im Vector ergibt meine Anzahl der Zeilen.
    Am Ende soll es dann zb irgendwie so aussehen:

    .............##0...............
    ...............0######.........
    ...............0##.............
    .......########0...............
    ..........#####0...............

    usw...
    (die '0' steht natürlich genau in der Mitte und untereinander, leider wird es mir hier verschoben und sieht deshalb etwas komisch aus).

    bei mir sieht es aber so aus:

    0000000000000777000000000000000
    0000000000000007777770000000000
    0000000000000007770000000000000

    also wie ihr seht, es funktioniert zwar aber leider ist es extrem schwierig anhand der zweiten Abbildung es gut zu erkennen wo die Werte positiv oder negativ sind bzw wie viele Werte darin liegen.
    Bei der ersten Abbildung (mit den Punkten und Rauten) sieht man aber sofort was Sache ist.

    Ist für mich hier echt schwierig zu erklären aber hoffe ihr kennt euch aus was ich meine und wo mein Problem liegt.

    bzw:

    for (int i(0); i < zeile; ++i) {
    
    		for (int j(0); j < spalte; ++j) {
    
    			for (int k(0); k < spalte; ++k) {
    				if (grafik[i][j] == 0) {
    
    					grafik[i][j] = '#';
    
    				}
    			}
    
    			out << grafik[i][j];
    			grafik[i][5] = 4;
    
    		}
    
    		out << "\n";
    	}
    
    	out.close();
    

    dann kommt statt der Raute immer '35' (also der ASCII-Wert)...



  • Goku++ schrieb:

    dann kommt statt der Raute immer '35' (also der ASCII-Wert)...

    Was ja auch kein Wunder ist wenn das noch immer ein Vector von doubles ist. Erstmal frage ich mich was dein Vector überhaupt soll. Soll der Vector eine Art ASCII Grafik darstellen und du schreibst es zuerst in das zweidimensionale Array weil die direkte Ausgabe komplizierter ist? Dafür solltest du auf jeden Fall einen Vector von chars nutzen. Woher kommen überhaupt die Eingaben des Benutzer oder was dort nacher dargestellt werden soll? Das sollte auf jeden Fall ein anderer Vector sein und nicht der indem du versuchst deine ASCII Grafik zu zeichnen.



  • sebi707 schrieb:

    Goku++ schrieb:

    dann kommt statt der Raute immer '35' (also der ASCII-Wert)...

    Was ja auch kein Wunder ist wenn das noch immer ein Vector von doubles ist. Erstmal frage ich mich was dein Vector überhaupt soll. Soll der Vector eine Art ASCII Grafik darstellen und du schreibst es zuerst in das zweidimensionale Array weil die direkte Ausgabe komplizierter ist? Dafür solltest du auf jeden Fall einen Vector von chars nutzen. Woher kommen überhaupt die Eingaben des Benutzer oder was dort nacher dargestellt werden soll? Das sollte auf jeden Fall ein anderer Vector sein und nicht der indem du versuchst deine ASCII Grafik zu zeichnen.

    Vielen Dank für deine Antwort.

    *Der Benutzer gibt zuerst irgendwelche Buchstaben ein, die in einen String gelegt werden.
    *jeder Buchstabe hat einen Wert zB zwischen -5 bis +5.
    *dieser Wert wird anschließend in ein vector "geschoben".
    *dann werden zb jeweils 2 oder 3 (das ist variabel) Werte zusammengefasst und ihr arithmetisches Mittel berechnet.
    *Dieser Wert wird in einen weiteren vector gespeichert.
    *dann bestimmt der Benutzer eine weitere Größe (0,1 oder 0.3..auch wieder variabel den ich zb f nenne).
    *nun wird der Wert des arithmetischen Mittel durch f dividiert.
    *und dieser Wert soll nun in einer Art ASCII-art-Grafik ausgegeben werden.

    Deshalb hab ich einen vector<vector<double>> da es Werte wie zb 1,2 oder -3,2 usw sind.



  • Du willst tatsächlich also einfach nur Zahlen als ascii-art darstellen?



  • roflo schrieb:

    Du willst tatsächlich also einfach nur Zahlen als ascii-art darstellen?

    genau



  • Hat sich erledigt.
    Vielen Dank für den Hinweis Sebi707.
    Mit vector<vector<char>> funktioniert jetzt alles so wie es soll.
    Eigentlich so einfach zu lösen und ich komm nicht drauf weil ich mit double Werten herumprobiere^^ Ärgerlich, so viel Zeit umsonst vergeudet 😮

    Vielen vielen Dank an alle für ihre Antwort und besonders an Sebi707. DANKE 🙂 👍


Log in to reply