Code zum "Auflisten" von Buchstaben
-
Ihr kennt ja alle bestimmt einen Code für ein Programm das von 1 bis 100 zählt. Ich auch - aber was ich brauche ist ein Code der nicht von 1 bis 100 zählt sondern von a bis zzzz. Fürs verdeutlichen hier die von mir angestrebte ausgabe des Programms
a b c ... x y z aa ab ac ad ... ax ay az ba bb bc bd be ... ... zx zy zz aaa aab aac aad aae ... ... ... zzzx zzzy zzzz
und so weiter ( also er soll mit einem a anfangen und mit 4 Z aufhöhren ).
Ich weiss nicht ob das Realisierbar ist aber es wäre sehr praktisch.
Ich hoffe ich konnte es deutlich genug erklären was ich gerne Programmieren möchte.
-
Klar ist das realisierbar. Aber eine Komplettlösung wirst du hier nicht bekommen. Wie sieht denn dein bisheriger Versuch aus?
-
Guten Morgen.
Stichwort ist hier die ASCI Tabelle und der Modulo. Heißt du zählst bis 1000 oder wie weit auch immer, dann prüfst du mit dem mudolu ob du am ende bist (z) und fügst einen Buchstaben hinzu. Ich würde das so machen, das du dir den letzten striung merkst, dann entweder einen buchstaben hinzufügst oder den letzten ersetzt.ich hoffe ich konnte dir helfen.
Bis Neulich
-
Und noch ein Tipp: char ist ein numerischer Typ. Wenn du also einem char 'a' zuweist und ihn dann um 1 erhöhst, hast du 'b' (du kannst also ganz simpel mit einer for-Schleife von 'a' bis 'z' durchzählen).
-
ja aber wie soll ich ihn um eins erhöhen ? Wenn ich plus eins mache geht das nicht - und einfach die zählschleife umbauen hat auch nix geholfen ...
Wenn ich zählen will von 1 bis 10
for (int i=0; i<10; i++) { cout << i << endl; }
alles klar ... aber wenn ich nun "i" mit char definiere
for (char* i="a"; i < "z" ; i++ ) { cout << i << endl; }
dann steht nur "a" am bildschirm ...wie soll ich denn a um eins erhöhen ? mit ++ ja scheinbar nicht
-
Vielleicht hilft dir das etwas weiter
int i = 65; cout << (char)i << endl;
-
Oder das....
char _letter = 'a'; for(int _counter = 0; _letter <= 'z'; _counter++) { cout << _letter << endl; _letter++;//Buchstabe um 1 erhöhen: }
kannst Du auch in eine while-Schleife packen, wie dem Herrn belieben..
-
oder etwas kürzer ohne zusätzliche Zählvariable
for(char _letter = 'a'; _letter <= 'z'; _letter++) { cout << _letter << endl; }
-
"a" ist ein String, eine Zeichenkette, ein array of char (im Speicher sind das 2 Zeichen, nämlich 'a' und '\0'). Du musst aber den Typ char nehmen (z.B. 'a', entspricht 65), und der ist auch wirklich ein numerischer Typ, den du um 1 erhöhen kannst. Also sieh dir den Unterschied zwischen "a" und 'a' nochmal genau an.
-
Ja cool -
char _letter = 'a'; for(int _counter = 0; _letter <= 'z'; _counter++) { cout << _letter << endl; _letter++;//Buchstabe um 1 erhöhen: }
hat schoneinmal von a bis z durchzählen können - aber giebt es auch code der mehrere buchtaben nebeneinander durchzählen kann - so z.b
a b c ... x y z aa ab ac ad ... ax ay az ba bb bc bd be ... ... zx zy zz aaa aab aac aad aae ... ... ... zzzx zzzy zzzz
also mit einem a anfängt und mit 4 z aufhöhrt - ist sowas auch so leicht zu schreiben ?
-
Ich hatte da für jemanden mal was in JavaScript gemacht, der hats in Java umgeschrieben und schließlich hab ichs in C++ gemacht
Hier das Ergebnis:
std::string something(unsigned int iIndex) { std::string sReturn; char *cTemp; int iRest = 0; if (iIndex >= 1 && iIndex <= 26) { char c = 64 + iIndex; return std::string(&c); } else { while(iIndex > 0) { iRest = iIndex % 26; if(iRest == 0) { iRest = 26; iIndex = ((iIndex - 26) / 26); } else { iIndex = (iIndex - iRest) / 26; } sReturn = ((char)(iRest + 64)) + sReturn; } } return sReturn; }
Aufruf:
int main() { for (unsigned int i = 0; i < 1000; i++) { std::cout << something(i) << std::endl; } return 0; }
-
Wozu den Extra-Counter? Die char-Variable kann doch dein Counter sein (du zählst einfach von 'a' bis 'z')...
-
@ Max0r
Bingo vielen Dank ! soetwas wollte ich !
Nurnoch eine Frage - wie kann ich die Ausgabe der Schleife in eine Dati schreiben lassen ? Einfach nur "something(i) in der schleife jedesmal in ene datei schreiben ? oder geht das anders ?
-
C++Laie1 schrieb:
@ Max0r
Bingo vielen Dank ! soetwas wollte ich !
Nurnoch eine Frage - wie kann ich die Ausgabe der Schleife in eine Dati schreiben lassen ? Einfach nur "something(i) in der schleife jedesmal in ene datei schreiben ? oder geht das anders ?
Google is bei solchen Sachen dein Freund. Z. B. hier findest du das was du suchst.
Was du mit "geht das auch anders" meinst is mir net ganz klar. Wie soll es denn sonst in die Datei gelangen, wenn du es net rein schreibst?
-
Hab mich aus Spaß an einer rekursiven Lösung versucht, die ich hiermit poste
#include <iostream> #include <string> using namespace std; void printChars ( unsigned int recDepth, string prevChars = "") { for ( char c = 'a'; c <= 'z'; ++c ) { string chr ( &c, 1 ); if ( recDepth > 0 ) printChars ( recDepth - 1, prevChars + chr ); else cout << prevChars << chr << endl; } } int main () { for ( unsigned int numChars = 0; numChars < 4; ++numChars ) printChars ( numChars ); return 0; }
Das zeigt deine 475254 gewünschten Zeilen an
-
@cubeman - perfekt - mit der methode bekomme ich sogar groß und klein buchstaben raus ... besser geht nicht
aber eine frage bleibt immernoch ... wie bekomme ich die ausgabe in eine Datei ? Ich habe aus der schleife von cubeman das gemacht :
for ( unsigned int numChars = 0; numChars < 4; ++numChars ) { printChars ( numChars ); fstream f; f.open("LISTE.TXT", ios::out|ios::app ); f << numChars << endl; f.close(); }
eine Datei wird immerhin angelgt ... nur leider steht da nur 0 und darunter 1 ... !? mehr wird nichtmehr reingemacht ...
muss ich da was beachten ?
----
das beispiel von Max0r hingegen hat gut mit der "In-eine-Datei-Schreiben-methode" funktiniert - nur das ich hier keine groß und kleinbuchstaben wie bei cubeman definieren/anzeigen kann - aber es klappt.
for (unsigned int i = 0; i < 475255; i++) { std::cout << something(i) << std::endl; fstream f; f.open("LISTE_001.TXT", ios::out|ios::app ); f << something(i) << endl; f.close(); }
hier ist die Ausgabe in die Datei wie erwartet ...
nur nicht bei dem Code von cubeman - da gehts wohl anders oder ?
-
du könntest die Datei an der Stelle füllen, wo der Text auf dem Monitor erscheint. Also im else-Zweig von printChars.
Wenn du dies machst, wäre es aber von Vorteil, die Datei nicht bei jedem Schleifendurchlauf zu öffnen oder zu schließen. Einmal reicht das.
so zum Beispiel:
fstream f; f.open("LISTE.TXT", ios::out|ios::app ); for ( unsigned int numChars = 0; numChars < 4; ++numChars ) printChars ( numChars, f ); f.close();
deine fstream-Deklaration kannst du ohne weiteres gleich in der Funktion mitgeben. Somit sparst du globale Variablen.
void printChars ( unsigned int recDepth, fstream &f, string prevChars = "") { for ( char c = 'a'; c <= 'z'; ++c ) { string chr ( &c, 1 ); if ( recDepth > 0 ) printChars ( recDepth - 1, f, prevChars + chr ); else f << prevChars << chr << endl; } }