Code zum "Auflisten" von Buchstaben



  • @_matze

    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;
        }
    }
    

Anmelden zum Antworten