Schreibe eine Methode, die Spaltennamen (wie aus Excel, Calc, Numbers, etc. bekannt) zurückliefert. Also:
A, B, C, D, ..., Z, AA, AB, AC, AD, AE, ..., AZ, BA, BB, BC, ...
Die Methode nimmt einen Int, der die Spaltennummer darstellt. Wobei 0 = A, 1 = B, 2 = C, usw. und liefert den entsprechenden Spaltennamen als String zurück.
Mfg ~ Frase
_________________ "Für kein Tier wird so viel gearbeitet wie für die Katz'."
print(" ".join("{0:15s}".format(col)for col in row))
ans Herz gelegt . Anstatt der List Comprehension für cells kann man auch wunderbar eine bestehendes 2D-Array mit erstem Index ≙ Spalte und zweitem Index ≙ Zeile nehmen. Wenn das Array transponiert ist, lässt man einfach den *zip()-Aufruf um *cells herum weg (also *zip(*cells) => *cells). Dank des unendlichen Generators ist der Ausdruck unabhängig von den Dimensionen des Arrays.
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
@Horazont: Das Divmod sieht ja putzig aus Die Generatoren-Lösung ist alles andere als putzig. Die ist eher... strange. Klingt nach einem Konzept, was man sich mal zu Gemüte führen sollte.
@Aya: Yay, eine iterative C++ Lösung Muss man den QString nicht erst mit irgendwas initialisieren? Oder liegt der da jetzt schon so auf dem Stack herum? Der Aufruf an result.insert kommt mir etwas spanisch vor ansonsten.
_________________ "Für kein Tier wird so viel gearbeitet wie für die Katz'."
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Frase hat geschrieben:
@Horazont: Das Divmod sieht ja putzig aus Die Generatoren-Lösung ist alles andere als putzig. Die ist eher... strange. Klingt nach einem Konzept, was man sich mal zu Gemüte führen sollte.
Nun, ein Generator ist nichts weiter als ein parametrisierter Iterator. Jedes yield gibt ein neues Element zurück (d.h. die Funktion wird dort bis zum nächsten aufruf von next() praktisch unterbrochen). Wenn nichts mehr rauskommt (return oder einfach ende der Funktion) wird implizit ne EndOfIteration Exception geworfen… Die Python-Schleifen wissen dann, das Schluss ist . Der Benutzer merkt davon nichts, wenn er nicht per Hand next() aufruft.
greetings
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Di Mai 18, 2004 16:45 Beiträge: 2622 Wohnort: Berlin
Programmiersprache: Go, C/C++
Code:
void GetColumnName(Int32 Index, String& Result)
{
Int32 columnCount=0;
Int32 ind=Index;
while(ind>=0)
{
ind=ind/26-1;
++columnCount;
}
String result(columnCount);
char* ptr=const_cast<char*>(result.c_str());
for(Int32 i=columnCount-1;i>=0;--i)
{
ind=(Index%26);
Index=Index/26-1;
ptr[i]='A'+ind;
}
Result.Swap(result);
}
Die Variante ist auf Performance ausgelegt, es wird zuerst die Anzahl der Spalten errechnet, um dann den benötigten Speicher zu allozieren und direkt auf einen Array zu arbeiten. Ich muss aus meiner Stringklasse den char* pointer ziehen, da der Array operator[] ein Funktionsaufruf ist und entsprechend overhead und unnötig mehr CPU aufwand produziert(im release build kann je nach compiler das natürlich inlined werden aber halt je nach compiler und nicht für alle). Der erzeugte String wird dann mit dem übergebenen ausgetauscht(ist die Stringklasse aus Radon Framework, die arbeitet intern mit nen Array pointer). Das Resultat wird als Referenz-Parameter zurück gegeben, damit nicht noch zwischenobjekte auf dem Stack erzeugt werden, wie bei der Funktionsrückgabe(C# z.B. würde Speicher für object erzeugen und dann den pointer hin und her kopieren aber bei C++ würde er die Klasse neu anlegen, copy constructor aufrufen und ne riesen sauerei produzieren).
CPU's sind immer schneller als der Speicher(je mobiler des so stärker der Unterschied) daher kann man unmengen an Berechnungen machen, bevor Speicherzugriffe günstiger sind und wenn man dann noch dynamische Speicheralloziierung im Code hat, dann sowieso. Ich hab noch ein bisschen mit Caching experimentiert aber das macht hier kein Sinn, das es zu wenig Daten und zu einfache Berechnungen sind. Da reicht das CPU interne Caching und Predicted-Caching aus.
Ich hab beim experimentieren noch ein Bug in meiner Insert Methode, von der Stringklasse, gefunden und gefixt
_________________ "Wer die Freiheit aufgibt um Sicherheit zu gewinnen, der wird am Ende beides verlieren" Benjamin Franklin
Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.