IndexRechnung



  • Guten Morgen Community.

    Ich habe ein Frage zu einer "Rechnung" mit chars.
    Als Index, habe ich wie bei Excel, z.B. "A1", "C8", "D2" usw.
    In einer meiner Methoden gebe ich Positionen aber als Koordinaten an, sprich per xy-Werte. A1 würde bei mir 0,0 entsprechen, B2 wäre 1,1.
    Wenn ich jetzt bei "Z1" angelange, wäre das bei mir die Position 0,25. Danach käme wieder AA1, AB1, wie bei Excel. AB1 wäre dann wiederrum 0,27.
    Ich habe zuerst über den %-Operator nachgedacht, aber mit meiner Rechung hätte das in einer Endlosschleife geendet. Dabei dachte bei dem Beispiel mit AB1 an

    string index;
    int x = 27;
    if(x > 25) //das alphabet hat 26 buchstaben, ich fang aber bei 0 an
        index = "A" + ('A' + (27 % 26)); //ergibt 1, 'A' + 1 = 'B'
    else
        index = 'A' + x;
    

    Das sollte auch funktionieren, wenn man einen Index von nur 2 Buchstaben haben wird, was wohl bei mir der Fall ist, aber ich hätte gerne eine universelle Lösung, wenn es doch mal weitergehen sollte, sodass ich das Programm nicht erweitern muss, sondern es gleich mit drin ist.
    Ich werde wohl eine Schleife brauchen, das weiß ich, aber wie ich schon sagte, wird es für mich da in einer Endlosschleife bleiben, bzw. ich weiß nicht die richtige Abbruchbedingung.
    Sagen wir ich hätte die Zahl 52, welche, wenn ich richtig liege, AAA darstellen soll. Wenn ich jetzt den Modulo 26 darauf setze, kommt direkt 0 raus und damit könnte ich dann höchstens das 2. A hinzufügen.
    Ich denke man müsste vorher noch die Zahl normal durch 26 teilen, damit man weiß, wieviele Buchstaben in der Zahl stecken und dann mit einer for-Schleife so oft den Modulo darauf verwenden, aber ich glaube ich habe irgendwo einen Denkfehler mit den Zahlen.
    Über Hilfe wäre ich erfreut.

    Mit freundlichen Grüßen



  • Mir ist außerdem noch eingefallen, dass wenn ich bei AZ1 angelange, das nächste BA1 sein wird und meine Lösung somit auch wieder nicht geht, da ich konstant A am Anfang einfüge.

    Wie ich schon sagte, über Hilfe wäre ich erfreut.

    Mit freundlichen Grüßen



  • Tip:

    0 - 25 = A - Z
    26 - 701(=2626+25) = AA - ZZ
    702 - 18277(=26*26*26+26
    26+25) = AAA - ZZZ
    ...



  • Das Problem ist gar nicht so trivial, wie es am Anfang scheint, da der Wert jedes Buchstabens davon abhängt, ob er an der letzten oder einer anderen Stelle steht.
    wenn A=0
    dann ist Z=25
    soweit, so gut, aber
    AA = 126 + 0 = 26
    d.h. das erste A steht hier für 1 und das der letzten Stelle für 0
    demnach ist
    BA = 2
    26 + 0 = 52 // hier ist B=2, da nicht an der letzten Stelle
    ZA = 2626 + 0 = 676
    ZZ = 26
    26 + 25 = 701
    AAA = 1*26^2 + 1*26 + 0 = 702

    Vorschlag:

    #include <iostream>
    #include <cassert>
    #include <iterator> // back_inserter
    #include <string>
    
    template< typename Out >
    Out toLetterAZ( int idx, Out out )
    {
        const int Base = 'Z'-'A'+1;
        assert( idx >= 0 );
        const char c = 'A' + idx % Base;
        if( idx >= Base )
            out = toLetterAZ( idx/Base - 1, out ); // Bem.: -1 wegen 'letzter Stelle Problem'
        *out++ = c;
        return out;
    }
    
    int main()
    {
        using namespace std;
        for( int x; cin >> x; )
        {
            string excelLine;
            toLetterAZ( x, back_inserter( excelLine ) );
            cout << "  -> " << excelLine << endl;
        }
        return 0;
    }
    

    ergibt z.B. folgenden Output

    0
      -> A
    25
      -> Z
    26
      -> AA
    27
      -> AB
    676
      -> ZA
    701
      -> ZZ
    702
      -> AAA
    703
      -> AAB
    

    Gruß
    Werner



  • Vielen Dank an euch beide, jetzt leuchtet es mir ein.

    Mit freundlichen Grüßen


Log in to reply