Hässlicher Code, was kann ich tun
-
Guten Morgen!
Ich habe Code, welcher eine Tabelle in eine Textdatei schreibt. Nun soll die Textdate ja immer schön formatiert sein, sprich sie soll gut aussehen und somit leserlich sein.
Dafür hab ich folgenden Code:
m_protocollogfile<<"Zeit(s) | Anzahl | Prozent "<<'\n'; m_protocollogfile<<"---------------------------"<<'\n'; // Werte in Datei schreiben for(i=0; i < velements.size(); ++i) if(velements[i][0] != 0) { // Spalte "Zeit(s)" if(i<10) m_protocollogfile<<" "<<i; else if(i>=10 && i<100) m_protocollogfile<<" "<<i; else if(i>=100 && i<1000) m_protocollogfile<<" "<<i; else if(i>=1000 && i<10000) m_protocollogfile<<" "<<i; else m_protocollogfile<<i; // Spalte "Anzahl" if(velements[i][0] < 10) m_protocollogfile<<" | "<<velements[i][0]; else if(velements[i][0]>=10 && velements[i][0] < 100) m_protocollogfile<<" | "<<velements[i][0]; else if(velements[i][0]>=100 && velements[i][0] < 1000) m_protocollogfile<<" | "<<velements[i][0]; else if(velements[i][0]>=1000 && velements[i][0] < 10000) m_protocollogfile<<" | "<<velements[i][0]; else if(velements[i][0]>=10000 && velements[i][0] < 100000) m_protocollogfile<<" | "<<velements[i][0]; else m_protocollogfile<<" | "<<velements[i][0]; percentage = Round((100*velements[i][0])/cnt); // Spalte "Prozent" if(percentage < 10) { // Sind Nachkommastellen vorhanden? if(percentage == (int)percentage) m_protocollogfile<<" | "<<percentage<<".0"<<'\n'; else m_protocollogfile<<" | "<<percentage<<'\n'; } else if(percentage >= 10 && percentage <= 100) { if(percentage == (int)percentage) m_protocollogfile<<" | "<<percentage<<".0"<<'\n'; else m_protocollogfile<<" | "<<percentage<<'\n'; } else if(percentage > 100) { if(percentage == (int)percentage) m_protocollogfile<<" | "<<percentage<<".0"<<'\n'; else m_protocollogfile<<" | "<<percentage<<'\n'; } }
Ich prüfe also die Größe der Zahl, je kleiner sie ist desto weiter rechts landet sie damit das ganze einheitlich aussieht.
Und so schaut das Ergebnis aus:
**```
Zeit(s) | Anzahl | Prozent0 | 92 | 8.5 1 | 114 | 10.5 2 | 313 | 28.9 3 | 297 | 27.4 4 | 69 | 6.3 5 | 16 | 1.4 6 | 47 | 4.3 7 | 59 | 5.4 8 | 14 | 1.2 9 | 4 | 0.3
12 | 3 | 0.2
13 | 2 | 0.1
14 | 4 | 0.3
15 | 2 | 0.1
16 | 1 | 0.0
18 | 3 | 0.2
19 | 3 | 0.2
20 | 2 | 0.1
21 | 2 | 0.1
28 | 2 | 0.1
51 | 3 | 0.2
63 | 2 | 0.1
73 | 1 | 0.0
77 | 4 | 0.3
79 | 1 | 0.0
98 | 2 | 0.1
105 | 2 | 0.1
1326 | 6 | 0.5
1327 | 5 | 0.4
1328 | 3 | 0.2
1329 | 3 | 0.2
25201 | 1 | 0.0Kann man das nicht doch irgendwie anders machen, so ist das für mich uglycode und wenn mein Nachfolger mal das Programm erweitern muss blickt der im ersten Moment gar nicht durch. Kann man das if(zahl > 10) if(zahl > 10 && zahl < 100) usw. nicht umgehen? Und bei der Spalte "Prozent" prüfe ich auch immer ob die Zahl z.B. 4 oder 4.3 ist, damit ich aus 4 eine 4.0 machen kann was einfach viel leserlicher ist. Was meint ihr dazu?
-
Hab deinen Code nur überflogen, aber wenn ich mir deine Tabelle anschaue, dann könnte vielleich ne map mit nem int als key und nem pair als value passend sein. Zu den Einrückungen: Schau dir mal die Formatierer der streams an (z.B. setw usw http://www.uni-bayreuth.de/departments/math/~rbaier/lectures/c/html/node49.html )
Keine Ahnung was du mit dem double meinst. Wenn prozent nen double is, dann sollte er automatisch z.b. als 4.0 ausgegeben werden.
-
Das ist merkwürdig,
int main() { double a= 5; cout<<a<<endl; return(0); }
wird als 5 ausgegeben und nicht als 5.0 ?
-
das kannste mit precision einstellen.
-
#include <iostream> #include <iomanip> using namespace std; int main() { double a= 5; cout<< std::fixed << setprecision(2) << a << endl; return 0; }
So?
-
glaub schon, oder? Wenn Du jetzt noch ein setw(5) dazunimmst, dann machst Du den OP wahrscheinlich sehr glücklich.
-
Stimmt ihr mir denn im großen und ganzen zu das man es nicht anders mach kann als immer zu testen
zahl < 10
zahl > 10 und < 100
zahl > 100 und < 1000
zahl > 100 und < 10000und dementsprechend text auszugeben?
-
nein
#include <iostream> #include <iomanip> using namespace std; int main() { cout << setw(5) << 3 << '\n'; cout << setw(5) << 1000 << '\n'; }
MfG Jester
-
Lies ab und zu auch mal wer meine Postings?
-
oh gott wie peinlich
Danke schön!
-
wurgs schrieb:
oh gott wie peinlich
Danke schön!
-
Falls es noch jemanden interessiert: Aus dem uglycode ist folgendes geworden
// Werte in Datei schreiben for(i=0; i < velements.size(); ++i) if(velements[i][0] != 0) { m_protocollogfile<<setw(7)<<i; m_protocollogfile<<" |"; m_protocollogfile<<setw(7)<<velements[i][0]; m_protocollogfile<<" |"; m_protocollogfile<<setw(6)<<fixed<<setprecision(1)<<(100*velements[i][0])/cnt<<'\n'; }
*freu*