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

[C++] Wczytywanie poleceń

Ostatnio zmodyfikowano 2014-03-27 18:28
Autor Wiadomość
Malina94
Temat założony przez niniejszego użytkownika
[C++] Wczytywanie poleceń
» 2014-03-25 19:04:18
Witam! Na wejściu podaję ciąg poleceń, np:
l p 5 d d 10 d d l g (odpowiednie litery i liczby rozdzielone spacjami)
itd.
Do wczytywania ich stworzyłam zmienną polecenie. Następnie zrobiłam cin>>polecenie oraz pętlę do wywoływania odpowiednich funkcji:
C/C++
do {
    if( polecenie == 'p' ) {
        //wywoluje odpowiednia funkcje
    }
   
    if( polecenie == 'd' ) {
        //wywoluje odpowiednia funkcje
    }
   
    //itd
   
} while( polecenie );


Mam tutaj dwa pytania:
1. Jaki dać warunek kończący pętle? Aktualnie while kręci się w nieskończoność... Domyślam się, że while powinien działać aż nie wyłapie entera czy tam znaku nowej linii - jak to zapisać?
2. Jak skonstruować if, aby wyłapało mi liczbę z wejścia, a potem odpowiednia funkcja wywołała mi się tą liczbę razy? Np. 5 d ?
P-107185
Monika90
» 2014-03-25 19:28:25
2. Jak skonstruować if, aby wyłapało mi liczbę z wejścia, a potem odpowiednia funkcja wywołała mi się tą liczbę razy? Np. 5 d ?
Wczytujesz znak, sprawdzasz czy to cyfra za pomocą std::isdigit(), jeżeli to jest cyfra, to wstawiasz ten znak z powrotem do strumienia za pomocą std::cin.unget(), następnie wczytujesz liczbę za pomocą operator>>(int&).

1. Jaki dać warunek kończący pętle? Aktualnie while kręci się w nieskończoność... Domyślam się, że while powinien działać aż nie wyłapie entera czy tam znaku nowej linii - jak to zapisać?
Znaku końca linii nie wczytasz za pomocą operator>>(char&) bo on pomija (domyślnie) białe znaki, ale sądzę że możesz sprawdzać czy osiągnięto koniec strumienia w typowy sposób: while (std::cin) { }, lub while (std::cin >> znak) { }
P-107190
Malina94
Temat założony przez niniejszego użytkownika
» 2014-03-25 19:54:34
Okej, dziękuję :)
Mam w związku z tym jeszcze jedno pytanie. Dzięki temu co napisałaś, pobiorę liczbę z polecenia, jeśli występuje. A jak mam ją odnieść do literki, która znajduje się tuż za nią?
P-107192
Monika90
» 2014-03-25 20:05:17
Zrób zmienną (np.: int repeat;), która przechowuje ilosć powtórzeń, jeżeli na wejściu jest cyfra to wczytujesz liczbę do tej zmiennej, tak jak pisałam, w przeciwnym wypadku przypisujesz tej zmiennej 1.
Potem możesz użyć tej zmiennej, żeby wywołać polecenie tyle razy ile trzeba:
C/C++
if( polecenie == 'p' ) {
    for( int i = 0; i < repeat; ++i )
         p();
   
}
P-107193
Malina94
Temat założony przez niniejszego użytkownika
» 2014-03-25 20:12:37
Tak, tak, to rozumiem. :) Ale mam na myśli to, że wczytuję za jednym razem cały ciąg znaków i liczb, a potem po wciśnięciu enter wszystko się mieli.
I jak mam p p p l 3 d 5 p 2 l
to mój while wywołuje te wszystkie funkcje po kolei jak są wypisane, a jak trafi (w tym przykładzie) na 3, to wie, że akurat funkcję ukrytą pod kolejnym znakiem ma wywołać 3 razy. Potem leci dalej i jak spotyka 5, to wie że odnosi się ona do kolejnego znaku, tutaj: 'p' i funkcję pod 'p' wywołuje 5 razy.

Edit: czy mogę w ifie, który znalazł liczbę, wywołać nowe ify, które znowu będą odróżniały funkcje, a następnie wywoływały wyznaczoną ilość razy?
P-107194
Monika90
» 2014-03-25 20:33:42
Dla mnie napisanie takiego kodu jest łatwiejesze, niż wytłumaczenie jak go napisać, zobacz
http:/​/coliru.stacked-crooked.com/a​/a0e7c4eefc93ad5f w 10 minut można coś takiego napisać

Można inaczej http:/​/coliru.stacked-crooked.com/a​/992f58a18f5fca16 to nawet lepsze bo krótsze, choć zakłada, że ciąg wejściowy zawsze jest poprawny, tzn. zakłąda że po liczbie zawsze występuje polecenie
P-107197
Malina94
Temat założony przez niniejszego użytkownika
atoi
» 2014-03-25 21:49:38
Bardzo Ci dziękuję :) Teraz wszystko pięknie śmiga.

Edit:
Jak można to zrobić za pomocą funkcji atoi?
Miałam podpowiedź, by:
-sprawdzić czy znak jest liczbą, jeśli tak, to
-wczytać go do tablicy
-funkcja wczytuje kolejne znaki, aż nie napotka litery;
-sczytać cyfry ukryte pod kolejnymi indeksami tablicy funkcją atoi.
-mam liczbę: powtorzenieFunkcji = atoi(chwilowa_tablica);

No właśnie, ale gdy robię coś takiego:
C/C++
int powtorzenieFunkcji = 1;
char polecenie;
cin >> polecenie;
char tab[ 10 ];

//to jest w moim while
if( isdigit( polecenie ) ) {
    tab = polecenie;
    powtorzenieFunkcji = atoi( tab );
}
to kompilator czepia się o to, że używam niekompatybilnych typów -> char i char[10].

Niestety musiałam z pewnych przyczyn wczytywać polecenia z pliku i z tego powodu powyższa propozycja nie czyta już liczb, choć świetnie działała na cin>>
P-107208
Malina94
Temat założony przez niniejszego użytkownika
» 2014-03-27 17:42:11
odświeżam! czy mógłby ktoś odpowiedzieć na wcześniejszy post? ;)
P-107288
« 1 » 2
  Strona 1 z 2 Następna strona