• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C++ problem z wyswietlaniem kolejno po sobie

Object Storage Arubacloud
+1 głos
1,141 wizyt
pytanie zadane 9 maja 2016 w C i C++ przez Poczatkujacy1 Nowicjusz (210 p.)

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). 

 

moja proba:

 

#include <iostream>
#include <cstdlib>
using namespace std;

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."

 

 

 

 

komentarz 9 maja 2016 przez Poczatkujacy1 Nowicjusz (210 p.)

Wydaje mi sie (o ile wczesniejsza rada jest ok), ze wystarczy sam warunek:

else if (check1 == ';'&& check2 !=';') {licznik = 0;}

 

komentarz 9 maja 2016 przez Poczatkujacy1 Nowicjusz (210 p.)
Ponawiam pytanie

3 odpowiedzi

+1 głos
odpowiedź 9 maja 2016 przez draghan VIP (106,230 p.)
  1. Pamiętaj o inicjalizacji zmiennych, których chcesz używać. Zdaje mi się, że GCC sam o tym przypomina warningiem. Zwróć szczególnie uwagę na zmienną akt_znak - musi być zainicjalizowana przed pętlą, aby program działał poprawnie.
  2. Z warunków dotyczących zmiennych check1 i chceck2, zostaw tylko ten, który faktycznie mówi o tym, że wpisano kolejno dwa średniki. W przeciwnym wypadku ustaw licznik na wartość 0.

Nie spamuj ludziom na PW (specjalnie dodałem wpis na ścianie w moim profilu!), bo to tylko wzmaga niechęć do odpisania.

1
komentarz 9 maja 2016 przez Poczatkujacy1 Nowicjusz (210 p.)
Ok, dzieki

Przepraszam za spam
komentarz 9 maja 2016 przez draghan VIP (106,230 p.)


Przepraszam za spam

Po prostu więcej tego nie rób i będzie okej. ;) Przynajmniej jeśli o mnie chodzi.

Popraw kod i pokaż, co Ci wyjdzie.

0 głosów
odpowiedź 10 maja 2016 przez Poczatkujacy1 Nowicjusz (210 p.)
#include <iostream>
#include <cstdlib>
using namespace std;

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;
akt_znak = ';';
//reszta = 0;

//wczytanie znakow do zapamietania
cin >> check1;
cin >> check2;


if (check1 == ';'&& check2 ==';') {licznik = 1;}
else {licznik = 0;}

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;
}

efekt:

 

Pierwsze dwa wczytane znaki zostana zapamietane. Nastepnie dwukrotnie powtorzenie ktoregos z nich powoduje zakonczenie programu i wyswietlenie podsumowania.
Teraz podawaj dowolne znaki:
a
;
a
a
Wczytano kolejno po sobie       0        srednikow.     Wiecej razy wpisano Male Litery
Press any key to continue . . .

 

komentarz 10 maja 2016 przez draghan VIP (106,230 p.)

Mogłeś dać znać pod moją odpowiedzią, to by mi się wyświetliło w powiadomieniach. ;)

Program jeszcze nie działa jak należy. Dla danych wejściowych:

a b ; c d a a

uważa, że raz pojawiły się koło siebie dwa średniki. Wiesz, dlaczego tak się dzieje?

0 głosów
odpowiedź 19 maja 2016 przez Poczatkujacy1 Nowicjusz (210 p.)

Zmienilem kod teraz dziala dobrze, dzieki za uwagi

 

 

 


#include <iostream>
#include <cstdlib>

using namespace std;

int main()
{

    char pierw, drug, aktualny, poprzedni;
    int l_pierw, l_drug, cyfry, litery, kol_sred;



    l_pierw = 0;
    l_drug = 0;
    cyfry = 0;
    litery = 0;

    kol_sred = 0;

    //Znak 1 - zbieramy i sprawdzamy czy jest cyfrą lub małą literą

    cout << "Podaj znak 1: ";
    cin  >> pierw;
    if(pierw >= '0' && pierw <= '9')
        cyfry++;


    if (pierw >= 'a' && pierw <= 'z')
        litery++;

    //Znak 2 - zbieramy i sprawdzamy czy jest cyfrą lub małą literą, po czym robimy go także przeaktualnym i sprawdzamy czy jest średnikiem jak poprzedni

    cout << "Podaj znak 2: ";
    cin  >> drug;
    if(drug >= '0' && drug <= '9')
        cyfry++;


    if (pierw >= 'a' && pierw <= 'z')
        litery++;

    if (drug == ';' && drug == pierw)
        kol_sred++;

    poprzedni = drug;

    //Reszta
    do
    {
        //Zbieramy najnowszy znak od usera

        cout << "Podaj znak: ";
        cin  >> aktualny;



        if (aktualny >= '0' && aktualny <= '9')
            cyfry++;


        if (aktualny >= 'a' && aktualny <= 'z')
            litery++;

        if (aktualny == ';' && aktualny == poprzedni)
            kol_sred++;

        if (aktualny == pierw)
            l_pierw++;
        if (aktualny==drug)
            l_drug++;

        poprzedni = aktualny;
    }
    while (l_pierw < 2 && l_drug < 2);



    if (cyfry > litery)
        cout << "Wiecej cyfr bylo ich: " << cyfry << endl;

    else if (cyfry < litery)
        cout << "Wiecej malych liter bylo ich: "<< litery << endl;

    else
        cout << "Liter i cyfr tyle samo" << endl;


    cout << "Dwa sredniki byly obok siebie " << kol_sred << " razy." << endl;


    return 0;
}

 

 

Podobne pytania

0 głosów
2 odpowiedzi 570 wizyt
pytanie zadane 10 grudnia 2016 w C i C++ przez Jan Dobrakowski Użytkownik (580 p.)
–1 głos
0 odpowiedzi 82 wizyt
pytanie zadane 31 marca 2020 w C i C++ przez Quba Użytkownik (870 p.)
0 głosów
1 odpowiedź 1,608 wizyt
pytanie zadane 22 marca 2016 w C i C++ przez Lukasz95 Bywalec (2,160 p.)

92,575 zapytań

141,424 odpowiedzi

319,649 komentarzy

61,960 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...