C++ Dezimalzahl in Excelspaltennamen umwandeln
-
Hallo Community,
ich habe bei einem vermeintlich Funktionierenden kleinen Programm das Dezimalzahlen in in Excel Spaltennamen umwandelt durch Zufall einen Bug
entdeckt den ich mir nicht erklären kann.
Es ist bei der Zahl 1248 als Ergebnis liefert er mir AV@ jedoch müsste es eigentlich AUZ sein.
Ich dache schon an einen Rundungsfehler jedoch muss man ja immer abrunden sonst sind viele anderen Werte auch Falsch.int main() { int zahl = 0; int reste[26]; int zaehler = 0; int neu = 0; cout << "Dezimal: "; cin >> zahl; neu = zahl; do { reste[zaehler++] = neu % 26; neu /= 26; } while (neu != 0); string erg = "Excelspalte: "; for (int l = zaehler - 1; l>-1; l--) { erg += (char)(64 + reste[l]); } cout << erg << endl; cin >> erg; return 0; }PS: ich bin C++ Anfänger also bitte nicht zu komplizierte Erklärungen

LG
DerGast
-
Es liegt an der Zählweise. Du bildest 1 auf A ab und 26 auf Z. Das Modulo gibt dir aber Zahlen von 0 bis 25. Es ist in der Informatik auch eher üblich bei 0 mit den Zählen anzufangen.
Du müsstest also deinen Code so ändern das 0 => A und 25 => Z umgewandelt wird. Damit funktioniert der Algorithmus, ist allerdings aus Sicht des Benutzers immer um 1 daneben, weil der ja mit 1 anfängt zu zählen. Dafür brauchst du von der Eingabe einfach nur 1 abziehen.
-
for (int l = zaehler - 1; l>-1; l--) { erg += (char)(64 + reste[l]); }lbzw.1sind schwer auseinanderzuhalten.list von daher ein schlechter Variablenname.
Üblicherweise nimmt mani, dannj, dannk. Spätestens, wenn man dann auch nochlbraucht, sollte man über ein Refactoring nachdenken - vielleicht aber auch schon beij.
2. Wiederverwende doch einfach
zaehlerund lern den "going-to"-Operator kennen*while(zaehler-->0) erg += 'A'+reste[zaehler];(*) den "going-to" operator gibt es nicht. Ueberleg mal, wie der Compiler
zaehler-->0interpretiert.