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: do { if( polecenie == 'p' ) { } if( polecenie == 'd' ) { } } 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 ? |
|
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) { } |
|
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ą? |
|
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: if( polecenie == 'p' ) { for( int i = 0; i < repeat; ++i ) p(); }
|
|
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? |
|
Monika90 |
» 2014-03-25 20:33:42 |
|
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: int powtorzenieFunkcji = 1; char polecenie; cin >> polecenie; char tab[ 10 ];
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>> |
|
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? ;) |
|
« 1 » 2 |