Hallo alle Zusammen,
Programmiersprache: C++ (Visual Studio 2010)
Ich habe eigentlich einen kleinen Problem mit einem txtAusgabe.
Ich versuche einen Prog zu schreiben der einen txtDateiInput liesst und
das Ergebnis in einen anderen txtDateiOutput ausgibt.
Es lauft fast alles richtig mit einen Ausnahme.
Ich will die Ausgabe (txtDateiOutput) wie folgenden formatieren:
ZB:
1
3 5 6 7
2
4 9 1
3
3 11
4
8
Die ausgabe sollte so eine Pyramide aussehen haben.
datei schreibe ich mit diesen befehl:
Dennis schrieb:> hat jemenden eine Idee ?
Ich kenn zwar auch nicht alle Formatter der stream Library, aber:
Nicht alle Probleme kann man dadurch lösen, dass man einfach alles in
einem Rutsch von A nach B kopiert. Irgenwann muss man auch mal die
Bequemlichkeit von
lösen, wenn die Formattierung der Eingabedatei das erlaubt. Wenn nicht,
dann eben andere Vorgehensweise.
Nicht alle Probleme lassen sich mit 3 Zeilen STL Code lösen. Irgendwann
muss man auch mal selber ran, und was programmieren anstatt nur
vorgefertigte Teile zu kombinieren oder, der Herr sei mit uns, auch mal
was berechnen.
Robert L. schrieb:> wenn in der Hausaufgabe steht: STL Code (was auch immer das ist)
Standard Template Library
> dann wird man das so machen müssen, auch wenn es anders einfacher wäre> ;-)
Richtig.
Wenn das so in der Hausaufgabe steht, dann hat er aber auch in der
Schule das Handwerkszeug gelernt, welches er verwenden kann.
Wir wissen ja auch nicht, was in seinem Beispiel v ist, wo er herkommt,
wie er entsteht. Ich vermute zur Zeit, das es ein std::vector ist, ist
aber nur eine Vermutung aus dem Bauch heraus. Wir wissen auch nicht, wie
seine Eingabedatei aussieht, etc. etc.
Es könnte auch sein, dass er im Prinzip am Programm gar nicht viel
ändern muss, und einfach nur vor der Ausgabe eine entsprechende Anzahl
an Leerzeichen pro Zeile ausgeben muss (weil das std::copy eine einzelne
Zeile ausgibt).
Karl Heinz Buchegger schrieb:> Wir wissen ja auch nicht, was in seinem Beispiel v ist, wo er herkommt,> wie er entsteht
V ist einen Vector und ich lese die auch als Vector.
Ich will auf jeden Element des Vectors zugreifen und entsprechen
leerzeichen anhängen.
Dennis schrieb:> Karl Heinz Buchegger schrieb:>> Wir wissen ja auch nicht, was in seinem Beispiel v ist, wo er herkommt,>> wie er entsteht>> V ist einen Vector und ich lese die auch als Vector.> Ich will auf jeden Element des Vectors zugreifen und entsprechen> leerzeichen anhängen.
Schön.
Und was hindert dich jetzt daran, vor dem
eine entsprechende (möglicherweise aus der Anzahl der Elemente im Vector
errechnete) Anzahl an Leerzeichen auszugeben, so dass die nachfolgende
Ausgabe der Vector-Elemente eben nicht am linken Rand anfängt, sondern
entsprechend eingerückt?
Vielleicht gibts ja dafür wirklich einen guten Grund.
Es tut mir leid, wenn ich euch störe mit meiner anfängliche Probleme
aber ich bin einfach anfänger was C++ betrifft und möchte mich
verbessern deswegen frage ich nach, wenn es lästig manchmal....
Problem ist ich lese Daten aus einem txtdatei dann überprüfe ich die und
schreibe ich das Ergebnis in einen andere txtDatei, aber das Output muss
formatiert werden.
Die Zahlen varieren sich zwischen einen stellige und drei stellige Zahl.
Damit es richtig formatiert werden (Pyramid),müssen die Zahlen als
Blöcke betrachtet werden.
Karl Heinz Buchegger schrieb:> Ausgabe der Vector-Elemente eben nicht am linken Rand anfängt, sondern> entsprechend eingerückt?> Vielleicht gibts ja dafür wirklich einen guten Grund.
Derartige Spielchen mit Formatierungen sind eigentlich Dinge, die nach
der allerersten Unterrichtsstunde C-Programmierung zum Standardrepertoir
von Hausaufgaben gehört. Mehr als (in C) printf, ein paar for-Schleifen
und die ersten Variablen braucht man nämlich dazu nicht, um eine
Pyramide aus Sternchen ausgeben zu können. Bei dir sinds eben nicht
Sternchen sondern die Werte in einem Vektor, und um die Werte
auszugebenn benutzt du einen std::copy (was ja auch ok ist). Was
allerdings nicht heißt, dass man die vorhergehenden Leerzeichen in einer
Zeile nicht mittels einer banalen for-Schleife ausgeben kann - es sei
denn, deine Hausaufgaben sagen was anderes.
1
3 5 6 7
^ kein Leerzeichen
1
4 9 1
^ 1 Leerzeichen
1
3 11
^ 2 Leerzeichen
1
8
^ 3 Leerzeichen
In Summe
1
3 5 6 7
2
4 9 1
3
3 11
4
8
sieht es wohl so aus, dass bei jeder folgenden Zeile einfach 1
Leerzeichen mehr ausgegeben werden muss, ehe dann die eigentlichen Daten
aus dem Vector kommen und die Zeile mit einem \n abgeschlossen wird.
1
for(i=0;i<n;i++)
2
cout<<' ';
gibt n Stück Leerzeichen aus.
Und dein n wird mit jeder Zeile die ausgegeben wurde um 1 größer.
>> gibt n Stück Leerzeichen aus.> Und dein n wird mit jeder Zeile die ausgegeben wurde um 1 größer.
Eine andere Möglichkeit besteht in der Verwendung eines std::string.
Dort gibt es einen Konstruktor
1
string(size_tn,charc);
der einen entsprechenden String der Länge n, gefüllt mit dem Zeichen c
erzeugt.
Ein
1
cout<<std::string(n,' ');
gibt also ebenfalls eine entsprechende Anzahl n an Leerzeichen aus.
Dennis schrieb:> --> das ist aber keine richtige Pyramid> ich muss irgendwie anders vorgehen?> ....
Ja.
Analysieren, was das Problem ist.
Das Problem ist, dass in der Ausgabe "1" nun mal textuell gesehen kürzer
ist als "150".
Also wäre es eine ziemlich gut Idee, wenn die Textrepräsentierungen
ALLER Zahlen erst mal gleich lang sind. Da deine größten Zahlen
3-stellig sind, ist es daher eine ziemlich gute Idee, dafür zu sorgen,
dass ausnahmslos alle Zahlenausgaben 3-stellig gemacht werden.
Sieht man ja auch hier, in deinem initialen Beispiel
1
3567
2
491
3
311
4
8
Die dritte Zeile passt nicht so recht. Woran liegt es? Es liegt daran,
dass 11 eine Stell mehr braucht, weil es eine 2-stellige Zahl ist. Würde
da 2 stehen (einstellige Zahl)
1
3567
2
491
3
32
4
8
wärs wieder perfekt.
Nun ist das in diesem Beispiel trivial zu sehen, weil da nur eine
einzige 2-stellige Zahl vorkommt. Sobald das aber mehrere pro Zeile
sind, verschlimmert sich die Sache weiter.
Programmieren heißt auch Beispiele studieren, Beispiele analysieren,
Problemkreise aus den Beispielen ableiten. Und sich dann natürlich für
diese Problemkreise Lösungsmöglichkeiten überlegen.
Und: ganz wichtig - die Problemkreise, die du selbst nicht lösen kannst,
auch kommunizieren können.
Dennis schrieb:> --> das ist aber keine richtige Pyramid
Das liegt an der "breite" der Zahlen.
Schau dir mal die Pyramide an, von oben nach unten...
in Zeile drei (beginnend mit 104) hast du mehrere Zahlen mit nur zwei
Ziffern, die Zeile danach hat aber nur Zahlen mit drei Ziffern...
drei Ziffern brauchen logischer Weise mehr platz als zwei ziffern, und
deswegen wird es keine richtige pyramide.
Du solltest die Formatierung nicht mit Leerzeichen sondern mit einer
"festen breite" machen, dafür gibt es auch formatierungs möglichkeiten
im printf()-Style.
Oder um dein Problem anders zu beschreiben:
du machst zwei Leerzeichen + drei Ziffern + zwei Leerzeichen = sieben
Zeichen
zwei Leerzeichen + zwei Ziffern + zwei Leerzeichen = sechs Zeichen
Was du brauchst:
Nehme den Platz für (als Beispiel) acht zeichen (feste breite) und in
diesen bereich kommen die Ziffern, also:
Platz für acht Zeichen - Anzahl Ziffern / 2 = Anzahl "Leerzeichen"
rechts und Links von der Zahl.
Grüße
Ich habe das Problem so gelöst:
datei.fill('0');
for(size_t i= 0;i<v.size();++i)
{
datei.width(3);
datei<<v[i]<< " ";
}
jetzt sind alle zahlen 3 stellig
nur ausgabe formatierung (pyramid Form)oh jeh