Forum: PC-Programmierung c++ variable Anzahl von for Schleifen


von Paulchen (Gast)


Lesenswert?

Hallo

ich möchte in visual studio ein kleines c++ tool, das einen 
kleingeschriebenen Text liest (originalText) und dann alle Möglichkeiten 
ausgibt, mit jeweils einen großgeschriebenen Buchstaben. Das klappt so 
ganz gut:
1
for (int n = 0; n < Text_lenght; n++) {
2
    modifiedText1 = originalText;    
3
    modifiedText1[n] ^= 0x20;
4
    cout << modifiedText1 << endl;
5
}


Analog dazu gibt der folgende Code maximal 2 großgeschriebene Buchstaben 
aus:
1
for (int n = 0; n < Text_lenght; n++) {
2
    modifiedText1 = originalText;    
3
    modifiedText1[n] ^= 0x20;
4
    cout << modifiedText1 << endl;
5
    for (int m = n+1; m < Text_lenght; m++) {
6
      modifiedText2 = modifiedText1;
7
      modifiedText2[m] ^= 0x20;
8
      cout << modifiedText2 << endl;
9
      }
10
}


Natürlich kann man entsprechende Verschachtelungen auch für max.3, max.4 
usw anwenden.
Wie geh ich aber vor, wenn ich nun maximal n großgeschriebene Buchstaben 
möchte? Zum Beispiel dass n jeweils die Länge des Textes ist?

von Dr. Sommer (Gast)


Lesenswert?

Mit Rekursion, d.h. einer Funktion welche sich selbst wieder aufruft.

von Paulchen (Gast)


Lesenswert?

ich hab mich nun bzgl. Rekursion etwas eingelesen. Bei meiner 
Aufgabenstellung komme ich aber trotzdem nicht weiter, oder ich steh 
einfach auf dem Schlauch...

von foobar (Gast)


Lesenswert?

Beispiel:
1
#include <stdio.h>
2
#include <stdlib.h>
3
4
void
5
foo(char *str, int i, int n)
6
{
7
    if (str[i] && n > 0)   
8
    {    
9
        str[i] ^= 0x20;
10
        printf("%s\n", str);
11
        foo(str, i+1, n-1);
12
        str[i] ^= 0x20;
13
        foo(str, i+1, n);
14
    }
15
}
16
    
17
int 
18
main(int argc, char **argv)
19
{   
20
    if (argc == 3) 
21
        foo(argv[1], 0, atoi(argv[2])); 
22
    
23
    return 0;
24
}

von foobar (Gast)


Lesenswert?

Hmm... mit meinem Beispiel bin ich evtl etwas über's Ziel 
hinausgeschossen und mag einen Anfänger überfordern, deshalb hier ein 
etwas zugänglichere Version der Funktion foo.  Die Endrekursion, die 
hier nicht Thema ist, wurde durch eine Schleife ersetzt und es werden 
sprechende Namen benutzt:
1
void
2
grossklein(char *str, int ab_pos, int wieviele)
3
{        
4
    if (wieviele > 0)
5
        for (int i = ab_pos; str[i]; i++)
6
        {
7
            str[i] ^= 0x20;
8
            printf("%s\n", str);
9
            grossklein(str, i+1, wieviele-1);
10
            str[i] ^= 0x20;
11
        }
12
}

Die Rekursion ist klar zu erkennen und mit etwas Überlegung wird 
deutlich, dass durch sie bis zu wieviele Schleifen gleichzeitig 
aktiv sind.

Übung: Die Funktion so abändern, dass nur Strings, die exakt wieviele 
Zeichen geändert haben, ausgegeben werden.

von Paulchen (Gast)


Lesenswert?

besten Dank!!

ich glaub ich hab viel zu komplizierte Überlegungen angestrengt :)

von Freddy (Gast)


Lesenswert?

nur zur Info:
das was Du schreibst ist C-Code.
In C++ arbeitet man mit den STL wie dann z.B. Vector oder wenn Du in 
einem Framework z.B. Boost oder QT unterwegs bist mit deren Pendats.

von Peter D. (peda)


Lesenswert?

Paulchen schrieb:
> modifiedText1[n] ^= 0x20;

Ich weiß ja nicht, wozu das gut sein soll, aber das wandelt auch 
Großbuchstaben und andere Zeichen um. Willst Du das so?

Besser ist daher toupper(), das wandelt nur a..z um und läßt alle 
anderen Zeichen in Ruhe.
Bzw. mit islower() kann man testen, ob ein Zeichen innerhalb a..z ist.

Beitrag #5960150 wurde vom Autor gelöscht.
von Vn N. (wefwef_s)


Lesenswert?

Erstmal sollte man das ganze in C++ schreiben wie eingangs gefordert, 
dann wirds auch gleich viel simpler...

Als einfaches Beispiel großschreiben des ganzen Strings:
1
#include <array>
2
#include <iostream>
3
#include <algorithm>
4
#include <cctype>
5
6
int main()
7
{
8
    const std::array<std::string, 2> textSnippets = {"testString123!?", "testString456()"};
9
    
10
    for(const std::string &snippet: textSnippets) {
11
        std::string modifiedText;
12
        modifiedText.resize(snippet.size());
13
        std::transform(snippet.begin(), snippet.end(), modifiedText.begin(), ::toupper);
14
        
15
        std::cout << snippet << "-->" << modifiedText << "\n";
16
    }
17
}

Runs as expected:
1
testString123!?-->TESTSTRING123!?
2
testString456()-->TESTSTRING456()
http://www.cpp.sh/6kj2d

Darauf aufbauend sollte es kein Problem sein, mit foobars Ansatz deine 
ursprüngliche Aufgabe zu lösen, nur halt in C++ statt C.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.