Archiv verlassen und diese Seite im Standarddesign anzeigen : ausgelesene Zahlen anders darstellen
Hallo liebes Forum!
Ich habe mal wieder ein C++ Problem.
Folgende Situation:
Ich habe eine Datei (mit Einsen und Nullen, siehe Anhang), aus der ich ein bestimmes Array aus Einsen und Nullen auslesen und diese dann wieder ausgeben möchte.
Das klappt auch schon.
Zwei Dinge stören mich noch, bzw kann ich nicht umsetzen:
Die Darstellung. In der Konsole wird alles hintereinander ausgegeben. Ich hätte es gerne so, dass die Ausgabe auf der Konsole der Ansicht in der Datei entspricht. Also die Zeilenwechsel eingehalten werden. Meine einzige Idee war mit einer if-Bedingung, hat aber nicht so geklappt, wie erhofft. Als nächstes würde ich gerne alle eingelesenen Einsen als * ausgeben und alle eingelesenen Nullen als Leerzeichen. Da habe ich leider überhaupt keine Idee.
Hier noch der Code:
#include <iostream>
#include <fstream>
using namespace std;
int main(){
const int zeilen = 20;
const int spalten = 51;
float z_auslesen[zeilen][spalten];
ifstream datei;
datei.open("../Dateien/datei.txt");
for (int i = 0; i < zeilen; i = i + 1) // Zeilen
{
for (int j = 0; j < spalten; j = j + 1) // Spalten
{
datei >> z_auslesen[i][j]; // auslesen
}
}
datei.close();
for (int i = 0; i < zeilen; i = i + 1) // ausgeben
{
for (int j = 0; j < spalten; j = j + 1)
{
cout << z_auslesen[i][j];
}
}
return 0;
}
Ich hoffe wieder auf gute Vorschläge und eure Hilfe :)
Gruß Max
Bitte sehr:
#include <iostream>
#include <fstream>
using namespace std;
int main(){
const int zeilen = 20;
const int spalten = 51;
char z_auslesen[zeilen][spalten];
ifstream datei;
datei.open("./datei.txt");
for (int i = 0; i < zeilen; ++i) // Zeilen
{
for (int j = 0; j < spalten; ++j) // Spalten
{
datei >> z_auslesen[i][j]; // auslesen
}
}
datei.close();
char outchar;
for (int i = 0; i < zeilen; ++i) // ausgeben
{
for (int j = 0; j < spalten; ++j)
{
if (z_auslesen[i][j] == '0')
outchar = ' ';
else if (z_auslesen[i][j] == '1')
outchar = '*';
else
continue;
cout << outchar << " ";
}
cout << endl;
}
return 0;
}
Beachte, dass sich float nicht als Datentyp für Zeichen eignet! Ich habe das zu char umgewandelt, weil die Auswahl des auszugebenen Zeichens immer in den else-Teil springt (continue, d.h. das Zeichen wird nicht ausgegeben; evtl. willst du das rausnehmen).
Hey!
Danke für die schnelle Hilfe!
Ich habe das Programm noch etwas umgeschrieben, da es doch noch nicht ganz funktioniert hat mit den Umbrüchen. Eine andere Datei zum Einlesen macht das deutlich (Anhang).
#include <iostream>
#include <fstream>
using namespace std;
int main(){
const int zeilen = 20; // zeilen
const int spalten = 51; // spalten
int z_auslesen[zeilen][spalten]; // ausgelesene Zahl
ifstream datei;
datei.open("../datei2.txt");
for (int i = 0; i < (zeilen-1); i = i++) // zeilen
{
for (int j = 0; j < spalten; j = j++) // spalten
{
datei >> z_auslesen[i][j]; // Array auslesen
}
}
datei.close();
for (int i = 0; i < (zeilen-1); i = i++) // ausgeben der Werte
{
for (int j = 0; j < spalten; j = j++)
{
if (z_auslesen[i][j] == 0)
{
cout<<" ";
}
else
{
cout<<"*";
}
}
cout<<"endl";
}
return 0;
}
Nochmal vielen Dank für die zügige Antwort!
Gruß Max
Autsch, bei dir hapert es etwas mit C++-Kenntnissen.
1. endl heißt "endline", nicht als String quoten, sondern wirklich std:endl verwenden.
2. i=i++ -> ganz böse, da wird Blödsinn ausgeführt! Stattdessen ++i in for-Schleifen verwenden; Beispiel dazu:
int i = 0;
cout << i++ << endl;
cout << i++ << endl;
cout << ++i << endl;
cout << ++i << endl;
gibt
0
1
3
4
aus.
i++ gibt erst den aktuellen Wert von i zurück und erhöht danach, i wird im Speicher gehalten -> langsam, nach Möglichkeit vermeiden.
++i hingegen erledigt das in einem Rutsch: Erst erhöhen, dann zurückgeben.
Solange man keinen Vergleich mit postkrementierten oder prekrementierten Variablen macht, sollte man ++i verwenden.
Ich hab das nochmal überarbeitet:
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
const int zeilen = 20; // zeilen
const int spalten = 50; // spalten
int z_auslesen[zeilen][spalten]; // ausgelesene Zahl
ifstream datei;
datei.open("../datei2.txt");
for (int i = 0; i < zeilen; ++i) // zeilen
for (int j = 0; j < spalten; ++j) // spalten
datei >> z_auslesen[i][j]; // Array auslesen
datei.close();
for (int i = 0; i < zeilen; ++i) // ausgeben der Werte
{
for (int j = 0; j < spalten; j = j++)
if (z_auslesen[i][j] == 0)
cout<<" ";
else
cout << "*";
cout << endl;
}
return 0;
}
Allerdings bin ich durch die merkwürdigen Konstrukte wie i < (zeilen-1) etwas verwirrt, der Sinn erschließt sich mir nicht...
Gib am Besten zu der Beispieldatei auch die Beispiellösung.
i++ gibt erst den aktuellen Wert von i zurück und erhöht danach, i wird im Speicher gehalten -> langsam, nach Möglichkeit vermeiden.
++i hingegen erledigt das in einem Rutsch: Erst erhöhen, dann zurückgeben.
Solange man keinen Vergleich mit postkrementierten oder prekrementierten Variablen macht, sollte man ++i verwenden.
Wobei allerdings jeder halbwegs moderne C(++) Compiler für ein i++, wo der Rückgabewert nicht gebraucht wird, genau den gleichen Code (Assembly/Objectcode) wie für ein entsprechendes ++i generiert!
Fazit: Dass i++ langsam ist, ist heute nicht mehr wahr.
Ich wusste nicht, dass Compiler das können - aber ist dennoch good practice. Und ++i lässt sich auch leichter lesen als i=i++...
Autsch, bei dir hapert es etwas mit C++-Kenntnissen.
Auf jeden Fall, ich lerne es auch gerade ;)
1. endl heißt "endline", nicht als String quoten, sondern wirklich std:endl verwenden.
Was meisnt du hiermit genau? Vllt mal zeigen/Beispiel, dann weiß ich vllt was du meinst.
i++ gibt erst den aktuellen Wert von i zurück und erhöht danach, i wird im Speicher gehalten -> langsam, nach Möglichkeit vermeiden.
++i hingegen erledigt das in einem Rutsch: Erst erhöhen, dann zurückgeben.
Solange man keinen Vergleich mit postkrementierten oder prekrementierten Variablen macht, sollte man ++i verwenden.
Wie i erhöht war mir klar, dass diese Methode jedoch langsamer ist (bzw ja wohl eher war) wusste ich nicht, danke! Habe darüber gar nicht nachgedacht und die Erhöhung mit i++ von meiner Informatik Dozentin übernommen...
Allerdings bin ich durch die merkwürdigen Konstrukte wie i < (zeilen-1) etwas verwirrt, der Sinn erschließt sich mir nicht...
Gib am Besten zu der Beispieldatei auch die Beispiellösung.
Ich habe zeilen und spalten als Konstante definiert. Ich fange in der for Schleife mit 0 an zu zählen. bei
for (int i = 0; i < zeilen; i = i++) würde von 0-zeilen gezählt werden. Habe den code überarbeitet, indem ich die entsprechenen Zähler bei 1 beginnen lasse.
Musterlösung gibt es (jedenfalls noch) nicht, das (und noch eine Erweiterung) muss erst bis Ende der Woche fertig sein.
#include <iostream>
#include <fstream>
using namespace std;
int main(){
const int zeilen = 20;
const int spalten = 51;
float z_auslesen[zeilen][spalten];
ifstream datei;
datei.open("../Dateien/datei.txt");
for (int i = 1; i < zeilen; i = i + 1) // Zeilen
{
for (int j = 0; j < spalten; j = j + 1) // Spalten
{
datei >> z_auslesen[i][j]; // auslesen
}
}
datei.close();
for (int i = 1; i < zeilen; i = i + 1) // ausgeben
{
for (int j = 0; j < spalten; j = j + 1)
{
cout << z_auslesen[i][j];
}
}
return 0;
}
Gruß Max
Ich wusste nicht, dass Compiler das können - aber ist dennoch good practice. Und ++i lässt sich auch leichter lesen als i=i++...
Ja, i=i++ ist auf jeden Fall Blödsinn. Und ++i ist afaik C++ good practice, während i++ eher C good practice ist.
Musterlösung gibt es (jedenfalls noch) nicht, das (und noch eine Erweiterung) muss erst bis Ende der Woche fertig sein.
Du wirst doch wohl wissen, wie die Ausgabe aussehen soll?
BlauerBlitz
04-11-2010, 08:33
Ich habe zeilen und spalten als Konstante definiert. Ich fange in der for Schleife mit 0 an zu zählen. bei
for (int i = 0; i < zeilen; i = i++) würde von 0-zeilen gezählt werden. Habe den code überarbeitet, indem ich die entsprechenen Zähler bei 1 beginnen lasse.
Wenn die Zählung der Zeilen mit 0 beginnt (wie es in C und C++ meiner Meinung nach üblich ist, da Arrays mit Index 0 beginnen), ist die Begrenzung mit "i < zeilen" richtig. Du bearbeitest die Zeilen 0, 1, 2, ... 17, 18, 19 - also genau die angegebenen 20 Zeilen. :)
Wenn Du Deine Zählung mit Zeile eins beginnst, wird das ganze komplizierter und unübersichtlicher, da Du die Arrays größer dimensionieren müsstest. :confused:
Viele Grüße
Werner
Hey!
Es gibt Neuigkeiten, musste doch wieder etwas ändern und ja, ich habe ein Bild der Ausgabe. Melde mich wieder, habe gerade keine Zeit und wollte nur schnell Bescheid geben!
Gruß Max
So, das Problem beim Weglassen von zeilen-1 ist, dass dann eine Zeile zu wenig angezeigt wird.
Es funktioniert mit der Ausgabe jetzt auch alles so weit. Weitere Probleme werden sicher folgen ;)
Ich habe mal ein Bild des Musterbeispiels in den Anhang gepackt.
Außerdem eine neue Datei zum Einlesen (die zur Ausgabe passt).
Gruß Max
LOL - wir hatten die Lösung schon... Lediglich die Spaltenangabe hat nicht gepasst.
#include <iostream>
#include <fstream>
using namespace std;
int main()
{
const int zeilen = 20; // zeilen
const int spalten = 51; // spalten
int z_auslesen[zeilen][spalten]; // ausgelesene Zahl
ifstream datei;
datei.open("../datei2.txt");
for (int i = 0; i < zeilen; ++i) // zeilen
for (int j = 0; j < spalten; ++j) // spalten
datei >> z_auslesen[i][j]; // Array auslesen
datei.close();
for (int i = 0; i < zeilen; ++i) // ausgeben der Werte
{
for (int j = 0; j < spalten; j = j++)
if (z_auslesen[i][j] == 0)
cout<<" ";
else
cout << "*";
cout << endl;
}
return 0;
}
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.