http://forum.pasja-informatyki.pl/139072/c-problem-z-wyswietlaniem-kolejno-po-sobie
Hej, mam pewnie dosyc prosty problem, szukam pomocy.
http://forum.pasja-informatyki.pl/139072/c-problem-z-wyswietlaniem-kolejno-po-sobie
Hej, mam pewnie dosyc prosty problem, szukam pomocy.
Witam,
Ucze sie podstaw C++, mam problem z nizej opisanym zadaniem, mimo udzielonej na koncu podpowiedzi. Robie cos zle, najpewniej robiac jakis podstawowy blad, Czy moge liczyc na poprawiony kod w odpowiedzi, lub jeszcze bardziej precyzyjna rade. Dzieki !
**
Tresc zadania:**
Wczytywać znaki (zmienne typu char) pojedynczo (znak po znaku) aż pierwszy lub drugi wczytany znak powtórzą się dwa razy. Wydrukować informację:
a) których znaków wczytano więcej: małych liter czy cyfr (lub informację, że było ich tyle samo)
b) ile razy dwa średniki stały obok siebie (tzn. wczytano kolejno po sobie dwa średniki).
#include <iostream>
#include <cstdlib>
using namespace std;
**
moja proba:**
int main()
{
// Deklaracja zmiennych
char akt_znak;
char poprz_znak;
int licznik;
char check1;
char check2;
int warunek1;
int warunek2;
int cyfry;
int malelitery;
//int reszta;
cout << "Pierwsze dwa wczytane znaki zostana zapamietane. Nastepnie dwukrotnie powtorzenie ktoregos z nich powoduje zakonczenie programu i wyswietlenie podsumowania.\r\nTeraz podawaj dowolne znaki: \r\n";
//wartosci poczatkowe
warunek1 = 0;
warunek2 = 0;
cyfry = 0;
malelitery = 0;
//reszta = 0;
//wczytanie znakow do zapamietania
cin >> check1;
cin >> check2;
if (check1 != ';'&& check2 !=';') {licznik = 0;}
else if (check1 == ';'&& check2 !=';') {licznik = 0;}
else if (check1 == ';'&& check2 ==';') {licznik = 2;}
else if (check1 != ';'&& check2 ==';') {licznik = 1;}
while (warunek1 < 2 && warunek2 < 2)
{
poprz_znak = akt_znak;
cin >> akt_znak;
if (akt_znak >= '0' && akt_znak <= '9'){cyfry++;}
else if (akt_znak >= 'a' && akt_znak <= 'z'){malelitery++;}
else if (poprz_znak == ';' && akt_znak == ';'){licznik++; }
//else {reszta++;}
//licznik powtorzen
if(akt_znak == check1){warunek1++;}
else if (akt_znak == check2){warunek2++;}
};
//podsumowanie
cout<<"Wczytano kolejno po sobie \t"<<licznik<<"\t srednikow.";
if(malelitery>cyfry){cout << "\tWiecej razy wpisano Male Litery" << endl;}
else if(malelitery<cyfry){cout << "\t Wiecej razy wpisano Cyfry" << endl;}
else{cout << "\t Tyle samo Malych Liter i Cyfr" << endl;}
system("PAUSE");
return 0;
}
Podpowiedz mi udzielona:
"ogolnie jest dobrze, pojawiają się problemy, jeśli jako jeden z pierwszych znaków wpisany jest średnik (np a ; a a - wyświetla jedno wystąpienie średników po sobie).
przemysl warunki (tylko jeden jest potrzebny):
if (check1 != ';'&& check2 !=';') {licznik = 0;}
else if (check1 == ';'&& check2 !=';') {licznik = 0;}
else if (check1 == ';'&& check2 ==';') {licznik = 2;}
else if (check1 != ';'&& check2 ==';') {licznik = 1;}
oraz ustawienie wartości zmiennej akt_znak przed pętlą while."
Robisz to niesamowicie źle, ale zaczynając od początku:
Pokaż przykładowe wejście i odpowiadające mu oczekiwane wyjście.
Z klawiatury wprowadzamy cały wiersz i analizujemy znak po znaku.
{
char ch;
bool flag = false;
int digits = 0;
int alphas = 0;
int double_semicolons = 0;
while (cin.get(ch) && ch != '\n') // analizę kończy znak nowego wiersza (enter)
{
if (ch >= 'a' && ch <= 'z')
{
++alphas;
flag = false;
}
else if (ch >= '0' && ch <= '9')
{
++digits;
flag = false;
}
else if (ch == ';')
{
if (flag == false)
flag = true;
else
{
++double_semicolons;
flag = false;
}
}
else
{
flag = false;
}
}
}