Niespodziewany przebieg działania programu...

0

Piszę więc Pokemon translator o następującym kodzie:

#include <cstdlib>
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <string>

using namespace std;

/*
 * 
 */
string zwroc_duze(string zmienna, string litera);
int main(int argc, char** argv) {

    string duze = "ABCDEFGHIJKLMNOPRSTUW";
    string male = "abcdefghijklmnoprstuw";

    cout << "Podaj tekst: " << endl;
    string tekst;
    cin >> tekst;
    string literka;
    cout << "Jaką literkę chcesz zamienić na duży odpowiednik?" << endl;
    cin >> literka;
    tekst = zwroc_duze(tekst, literka);
    cout << tekst << endl;
}


string zwroc_duze(string zmienna, string literka){
    string duze = "ABCDEFGHIJKLMNOPRSTUW";
    string male = "abcdefghijklmnoprstuw";
    int index;
    index = male.find(literka);
    for (int i = 0; i < zmienna.length(); i++){
        if(zmienna.at(i) == literka[0]){
            zmienna.at(i) = duze[index];
        }
    } return zmienna;
}

Widać, że napisałem do niego pierwszy moduł/funkcję zwroc_duze, który zamienia w tekście wybraną literę, na duży odpowiednik. Jednak przebieg działania programu jest trochę niepoprawny...

user image

Jeżeli w tekście zastosuję spację, to wszystko się sypie.

0

Zamiast cin>>tekst daj getline(cin, tekst);

0

Przebudowałem trochę program i dla zwiększenia czytelności przesunąłem trochę kodu w main do funkcji void. Jak mówiłem mój pokemon translator będzie miał kilka modułów, ale jest pewien problem, który uniemożliwia mi napisanie dalszej części programu. Na razie mam tak:

/* 
 * File:   main.cpp
 * Author: jerzy
 *
 * Created on July 26, 2011, 3:01 PM
 */

#include <cstdlib>
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <string>

using namespace std;
int licznik = 0;
/*
 * 
 */
string zwroc_duze(string zmienna, string litera);
bool czy_true(string literka);
void wybrana_litera();
int main(int argc, char** argv) {
    int wybor;
    cout << "Witaj w POKEMON Translator! Tutaj możesz przetłumaczyć tekst z języka polskiego na język dzieci neo. Jest to przydatne szczególnie w grach MMORPG/MMO" << endl;
    cout << "Wybierz 1, aby zmienić daną literę w tekście na wielką" << endl;
    cin >> wybor;
    switch(wybor){
        case 1:
            wybrana_litera(); break;
    }
    


}













string zwroc_duze(string zmienna, string literka){
    string duze = "ABCDEFGHIJKLMNOPRSTUW";
    string male = "abcdefghijklmnoprstuw";
    int index;
    index = male.find(literka);
    for (int i = 0; i < zmienna.length() ; i++){
        if(zmienna.at(i) == literka[0]){
            zmienna.at(i) = duze[index];
        }
    }return zmienna;

}
bool czy_true(string literka){

        string duze = "ABCDEFGHIJKLMNOPRSTUW";
        for (int i = 0; i < duze.length(); i++){
            if(duze.at(i) == literka.at(0)){
                return true;
            }
        }
}
void wybrana_litera(){
        string duze = "ABCDEFGHIJKLMNOPRSTUW";
    string male = "abcdefghijklmnoprstuw";

    cout << "Podaj tekst: " << endl;
    string tekst;
    getline(cin, tekst);


    string literka;
    bool kontynuowac;
   do{
       if(::licznik == 0){
    cout << "Jaką literkę chcesz zamienić na duży odpowiednik?" << endl;
       }
       if(::licznik > 0){
           cout << "Jaką literkę chcesz zamienić na duży odpowiednik? (podaj małą litere)" << endl;
       }
    literka.clear();
    cin >> literka;
    kontynuowac = czy_true(literka);
    ::licznik = 1;
   } while(kontynuowac == true);
   tekst = zwroc_duze(tekst, literka);
   cout << tekst << endl;
}

Jak widać, możemy wybrać, z którego modułu skorzystać do przekształcenia tekstu za pomcą int wybor, ale...

http://img840.imageshack.us/img840/8492/zrzutekranu1z.png

Nie wiem dlaczego pomijany zostaje fragment kodu, w kŧórym wprowadzamy tekst do obróbki.... ale jak usunie strumień:

 cin >> wybor;

To wszystko działa, tzn. działa wprowadzanie tekstu.

0

przed getline(cin, tekst); dodaj linijkę cin.sync(); getline pobiera do napotkania znaku nowej linii, a po cin >> wybor; w strumieniu pozostaje taki znak.

0

Niestety nadal jest to samo.

0

To daj teraz cały kod, bo ja sprawdziłem i to rozwiązało problem.

0

Proszę:

/* 
 * File:   main.cpp
 * Author: jerzy
 *
 * Created on July 26, 2011, 3:01 PM
 */

#include <cstdlib>
#include <iostream>
#include <string.h>
#include <stdlib.h>
#include <string>

using namespace std;
int licznik = 0;
/*
 * 
 */
string zwroc_duze(string zmienna, string litera);
bool czy_true(string literka);
void wybrana_litera();
int main(int argc, char** argv) {
    int wybor;
    cout << "Witaj w POKEMON Translator! Tutaj możesz przetłumaczyć tekst z języka polskiego na język dzieci neo. Jest to przydatne szczególnie w grach MMORPG/MMO" << endl;
    cout << "Wybierz 1, aby zmienić daną literę w tekście na wielką" << endl;
    cin >> wybor;
    switch(wybor){
        case 1:
            wybrana_litera(); break;
    }


}













string zwroc_duze(string zmienna, string literka){
    string duze = "ABCDEFGHIJKLMNOPRSTUW";
    string male = "abcdefghijklmnoprstuw";
    int index;
    index = male.find(literka);
    for (int i = 0; i < zmienna.length() ; i++){
        if(zmienna.at(i) == literka[0]){
            zmienna.at(i) = duze[index];
        }
    }return zmienna;

}
bool czy_true(string literka){

        string duze = "ABCDEFGHIJKLMNOPRSTUW";
        for (int i = 0; i < duze.length(); i++){
            if(duze.at(i) == literka.at(0)){
                return true;
            }
        }
}
void wybrana_litera(){
        string duze = "ABCDEFGHIJKLMNOPRSTUW";
    string male = "abcdefghijklmnoprstuw";

    cout << "Podaj tekst: " << endl;
    string tekst;
    cin.sync();
    getline(cin, tekst);


    string literka;
    bool kontynuowac;
   do{
       if(::licznik == 0){
    cout << "Jaką literkę chcesz zamienić na duży odpowiednik?" << endl;
       }
       if(::licznik > 0){
           cout << "Jaką literkę chcesz zamienić na duży odpowiednik? (podaj małą litere)" << endl;
       }
    literka.clear();
    cin >> literka;
    kontynuowac = czy_true(literka);
    ::licznik = 1;
   } while(kontynuowac == true);
   tekst = zwroc_duze(tekst, literka);
   cout << tekst << endl;
}

Znalazłem trochę inne rozwiązanie. Zamiast do inta wybór można wrzucić do stringa, a potem w switchu dać:

switch(wybor[0]){
case '1' : ...... // case '1' bo 1 to znak typu char
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1