Błędne wczytywanie ilości znaków
Ostatnio zmodyfikowano 2017-01-20 20:52
Panniikt Temat założony przez niniejszego użytkownika |
Błędne wczytywanie ilości znaków » 2017-01-19 20:43:52 Witajcie mam takie zadanie: Zadanie 2 Napisać program działający na ciągu znaków, który: 1. wczytuje znak będący symbolem końca ciągu, wymuszając, by był on cyfrą; 2. wczytuje ciąg znaków pojedynczo (znak po znaku) aż do napotkania tego końca ciągu 3. drukuje informację: a) których znaków wczytano więcej: małych liter czy dużych liter (lub informację, że było ich tyle samo) b) ile razy dwa znaki & stały obok siebie (tzn. wczytano kolejno po sobie dwa takie znaki). Wskazówka do 1 i 3a: Małe litery to znaki zawarte między ‘a‘ i ‘z’ , cyfry to znaki zawarte między ‘0’ i ‘9’. Znaki należy wczytywać instrukcją cin (będą się wczytywały tylko znaki widoczne). Wskazówka do 3b: przed wczytaniem nowego znaku należy zapamiętać poprzednio wczytany znak.
Problem mam taki że źle mi zlicza litery duże i małe, drugi problem to taki że gdy cyfrą kończącą jest '0' i użytkownik poda ciąg &&0 to program wyświetla że znaki '&' wystąpiły po sobie 2 razy a to nie prawda bo nastąpiło to tylko raz.
Może mi ktoś powiedzieć gdzie robię błąd??
#include <iostream> #include <cstdlib>
using namespace std;
int main(int argc, char *argv[]) { char koniec_c, aktualny, wczytany; int l_m, l_d, i_z; l_m = 0; l_d = 0; i_z = 0;
while (koniec_c<'0' || koniec_c >'9') {
cout << " podaj koniec ciagu : "; cin >> koniec_c;
if (koniec_c>='0' && koniec_c <='9') { cout << " koniec ciagu to : " << koniec_c << endl; } else cout << " Wprowadzony znak nie jest cyfra. \n" << endl; } do {
if (aktualny >='a' && aktualny <='z') l_m++; if (aktualny >='A' && aktualny <='Z') l_d++; if (aktualny=='&' || wczytany=='&') i_z ++;
cin >> aktualny;
}while (aktualny != koniec_c);
if (l_m > l_d) cout << " wiecej jest liter malych " << endl; else if (l_m < l_d) cout << " wiecej jest liter duzych " << endl; else cout << " Wprowadzono tyle samo malych i duzych liter " << endl;
cout << " Znak '&' wystapil bezposrednio po sobie: " << i_z;
return 0; }
|
|
j23 |
» 2017-01-20 10:54:42 char koniec_c, aktualny, wczytany; ...
while( koniec_c < '0' || koniec_c > '9' ) {...} |
Jaką ma wartość koniec_c przy wejściu w pętle? do { if( aktualny >= 'a' && aktualny <= 'z' ) l_m++; if( aktualny >= 'A' && aktualny <= 'Z' ) l_d++; if( aktualny == '&' || wczytany == '&' ) i_z++; cin >> aktualny; } while( aktualny != koniec_c ); |
Podobnie jak wyżej: jaką wartość ma aktualny przy pierwszej iteracji? A ten wczytany po co tam jest? Jaką ma wartość? Takie uwagi na początek. p.s. kod wstawiaj w znacznik [cpp] kod [/cpp] . |
|
Panniikt Temat założony przez niniejszego użytkownika |
» 2017-01-20 17:10:02 I aktualny i koniec_c powinny mieć wartość 0. Zmienną wczytany dodałem żeby móc wykonać polecenie zliczania dwóch znaków "&&" po sobie chodź jak się teraz temu przyglądam to nie za bardzo bedzie to działać. Wiesz może co powinienem zrobić żeby mi pokazywalo ile razy te znaki wystąpiły po sobie?? |
|
j23 |
» 2017-01-20 18:46:08 ...
char poprzedni = 0;
while( cin >> aktualny && aktualny != koniec_c ) { if( aktualny >= 'a' && aktualny <= 'z' ) ++l_m; else if( aktualny >= 'A' && aktualny <= 'Z' ) ++l_d; else if( aktualny == '&' && poprzedni == '&' ) { ++i_z; aktualny = 0; } poprzedni = aktualny; }
|
|
Panniikt Temat założony przez niniejszego użytkownika |
» 2017-01-20 20:52:19 Dzięki za pomoc teraz już wszystko działa i wiele mi się wyjaśniło.:) |
|
« 1 » |