Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Problem z string'iem w switchu i if'ie

Ostatnio zmodyfikowano 2013-04-28 13:36
Autor Wiadomość
wuldemar95
Temat założony przez niniejszego użytkownika
Problem z string'iem w switchu i if'ie
» 2013-04-28 10:30:34
Witam! Mam mały problem, mam jutro sprawdzian z tablic znakowych i będę musiał utworzyć MENU z wykorzystaniem switcha, jednak gdy wrzuce kod w switcha to po kompilacji i uruchomieniu program wypisuje tylko to co umieściłem w cout, bez możliwości wprowadzenia jakichkolwiek danych, po czym się kończy. Jeśli ten sam kod wrzucę w IF'a, dzieje się to samo.. Używam Dev-C++ 5.2.0.3

Oto kod:
C/C++
#include <cmath>
#include <iostream>
#include <cstdlib>
using namespace std;

void jeden();
int main()
{
    cout << "        M E N U\n";
    cout << "  1. Wypisywanie tekstu w odwrotnej kolejnosci.\n";
    int q;
    cout << "     Wybierz nr zadania: "; cin >> q;
    switch( q )
    {
    case 1: { jeden(); } break;
        default: cout << "\n\n  Nie ma takiego zadania!\n\n";
    }
    system( "PAUSE" );
    return 0;
};

void jeden()
{
    string tekst;
    cout << "\n\n  Wypisuje tekst w pionie i w odwrotnej kolejnosci.\n\n";
    cout << "  Wprowadz tekst: "; getline( cin, tekst );
    cout << "\n";
    unsigned short int dl;
    dl = tekst.length();
    for( int i = dl; i >= 0; i-- )
         cout << tekst[ i ] << "\n";
   
    cout << "\n\n";
}

Dodam jeszcze że gdy nie używam funkcji tylko wrzucę kod bezpośrednio do switcha dzieje się to samo..

PROSZĘ O SZYBKĄ POMOC! Z góry dziękuję!
P-81328
Berux
» 2013-04-28 11:06:52
1. Kod umieść pomiędzy znacznikami:
[cpp][/cpp]
2. Czyż nie czytelniej byłoby umieszczanie każde instrukcji w osobnej linii? To nie jest jakiś błąd, tylko chodzi mi tu o czytelność kodu. Chyba, że tak wolisz.
3. Nie polecam używanie
system( "PAUSE" );
4. Wrzuć
cin.sync();
 przed getline i będzie działało
5. Nie wiem czy o to chodzi w tym programie, ale czy program nie powinien wypisywać każdej litery wyrazu w osobnej linii? Jeśli tak, to zamiast string'a zastosuj tablicę char lub przekonwertuj string na char.
6.
break;
 umieszczaj w bloku, który odpowiada danemu case'owi, a nie za blokiem:

Zamiast:
C/C++
case 1:
{
    //...
}
break;

napisz:
C/C++
case 1:
{
    //...
    break;
}


Jeśli coś źle napisałem, to poprawcie. :D

PS Powodzenia na sprawdzianie :)
P-81330
Canar
» 2013-04-28 11:07:14
for( int i = dl - 1; i >= 0; i-- )
 
dl - 1,
 bo pokazujesz na pole poza stringiem, bo nie liczy od zera (tak mi sie wydaje)

cout << tekst[ i ] << "\n";

bo od końca po kolei lecisz. Możesz tak jak napisałem zrobić, bo ze stringiem, tak jak z tablicą charów możesz wywoływać.
P-81331
Berux
» 2013-04-28 11:09:27
@Canar

Dobrze  mówisz(piszesz). Tylko "tekst" musi być tablicą char .
P-81332
Canar
» 2013-04-28 11:20:59
Podsumowując:

C/C++
for( int i = dl - 1; i >= 0; i-- )
     cout << tekst[ i ] << endl; // czy tam "\n", jak wolisz


C/C++
#include <string>
#include <iostream>

A reszta, nie mam pojęcia po co Ci ;)

Był gotowiec, ale użytkownik na dole ma racje.
P-81334
Berux
» 2013-04-28 11:24:30
Rzeczywiście. Masz rację. Tylko nie potrzebnie dałeś gotowca - lepiej, żeby autor tematu sam na to wpadł, wtedy się więcej nauczy.
P-81335
pekfos
» 2013-04-28 12:01:52
6.
break;
 umieszczaj w bloku, który odpowiada danemu case'owi, a nie za blokiem:
To nie ma znaczenia.
P-81341
RazzorFlame
» 2013-04-28 13:01:36
BTW. Tomczyk nie ma znaczenia czy przekonwertujesz stringa na tablice char bo tak naprawde string to klasa (dziedzicząca jeden z kontenerów STL-a) z tymi twoimi char-ami. Nie podawaj błędnych odpowiedzi. Zanim to napisałeś mogłeś sprawdzić w dokumentacji operator "[]". Zwraca i-ty znak z kontenera (tu stringa). Tak więc ten zapis:
C/C++
string tekst;
//wczytywanie stringa
char * znaki =( char * ) tekst.c_str();
for( int i = 0; znaki[ i ] != '/0'; i++ )
//...
Jest równoważny z:
C/C++
string tekst;
//wczytywanie
for( int i = 0; tekst[ i ] != '/0'; i++ )
//...
Tylko 2 sposób jest krótszy i łatwiejszy :P
P-81345
« 1 » 2
  Strona 1 z 2 Następna strona