mikrocontroller.net

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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: Paulchen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
for (int n = 0; n < Text_lenght; n++) {
    modifiedText1 = originalText;    
    modifiedText1[n] ^= 0x20;
    cout << modifiedText1 << endl;
}


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


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?

Autor: Dr. Sommer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit Rekursion, d.h. einer Funktion welche sich selbst wieder aufruft.

Autor: Paulchen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: foobar (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beispiel:
#include <stdio.h>
#include <stdlib.h>

void
foo(char *str, int i, int n)
{
    if (str[i] && n > 0)   
    {    
        str[i] ^= 0x20;
        printf("%s\n", str);
        foo(str, i+1, n-1);
        str[i] ^= 0x20;
        foo(str, i+1, n);
    }
}
    
int 
main(int argc, char **argv)
{   
    if (argc == 3) 
        foo(argv[1], 0, atoi(argv[2])); 
    
    return 0;
}

Autor: foobar (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
void
grossklein(char *str, int ab_pos, int wieviele)
{        
    if (wieviele > 0)
        for (int i = ab_pos; str[i]; i++)
        {
            str[i] ^= 0x20;
            printf("%s\n", str);
            grossklein(str, i+1, wieviele-1);
            str[i] ^= 0x20;
        }
}   

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.

Autor: Paulchen (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
besten Dank!!

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

Autor: Freddy (Gast)
Datum:

Bewertung
1 lesenswert
nicht 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.

Autor: Peter D. (peda)
Datum:

Bewertung
2 lesenswert
nicht 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.
Autor: vn n. (wefwef_s)
Datum:

Bewertung
0 lesenswert
nicht 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:
#include <array>
#include <iostream>
#include <algorithm>
#include <cctype>

int main()
{
    const std::array<std::string, 2> textSnippets = {"testString123!?", "testString456()"};
    
    for(const std::string &snippet: textSnippets) {
        std::string modifiedText;
        modifiedText.resize(snippet.size());
        std::transform(snippet.begin(), snippet.end(), modifiedText.begin(), ::toupper);
        
        std::cout << snippet << "-->" << modifiedText << "\n";
    }
}

Runs as expected:
testString123!?-->TESTSTRING123!?
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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.