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

Licznik się nie resetuje do zera po pętli

Object Storage Arubacloud
0 głosów
389 wizyt
pytanie zadane 3 maja 2016 w C i C++ przez RycerzAndromedy Użytkownik (670 p.)

Cześć,

Pracuję nad kodem programiku, który ma wykrywać czy dana para liczb to anagramy liczbowe.

Mam tutaj więcej niż jeden błąd, nie proszę o gotwca.

Znalazłem jeden błąd. Z jakiegoś powodu licznikczyAnagram nie przyjmuje zera po każdej pętli, mimo że po każdej pętli zamieszczam instrukcję :  licznikczyAnagram=0; 

Dlaczego?

Oto kod:

#include <iostream>
#include <string>
using namespace std;
int i,d, j, k, licznikczyAnagram;
string liczba1, liczba2;
int main()
{
cout << "ANAGRAMY CYFROWE. Ile par liczb chcesz sprawdzic?" << endl;
cin >> d;
for (i=0; i<d; i++)
{
    cout << "Wprowadz 2 liczby oddzielone od siebie spacja: ";
    cin >> liczba1 >> liczba2;
    cout << "wartosc licznika przed liczeniem: " << licznikczyAnagram;
    licznikczyAnagram=0;
    if (liczba1.size()==liczba2.size())
    {

           for (j=0; j<liczba1.size(); j++)
        {
       for (k=0; k<liczba1.size();k++)
            {
                if (liczba1[j]==liczba2[k])
                {
                    liczba1[j]=='X';
                    liczba2[k]=='X';
                    licznikczyAnagram++;
                }


            }

        }
    }
 cout << "Wartosc licznika: " << licznikczyAnagram << endl;
 if (licznikczyAnagram==liczba1.size())
          cout << "TAK" << endl;
else
            cout << "NIE" <<endl;
}
    return 0;
}

 

2 odpowiedzi

+1 głos
odpowiedź 3 maja 2016 przez draghan VIP (106,230 p.)
wybrane 4 maja 2016 przez RycerzAndromedy
 
Najlepsza
Licznik się resetuje poprawnie, ale masz jeden błąd składniowy oraz jeden logiczny.

Ciekawy sposób na eliminację cyfr. :) Żeby to zadziałało, musisz zrobić dwie rzeczy.

Po pierwsze - zastosuj poprawne przypisanie. Podwójny znak równości nie jest operatorem przypisania.
Po drugie, musisz sprawdzać, czy poszczególne cyfry liczb są sobie równe oraz są różne od wartości wykluczonej. ;)
komentarz 4 maja 2016 przez RycerzAndromedy Użytkownik (670 p.)
edycja 4 maja 2016 przez RycerzAndromedy

dzięki za pomoc!

Ale czy na pewno "musisz sprawdzać czy cyfry są różne od wartości wykluczonej. ;)" ?

Skoro cyfra nie może być 'X' to po co to sprawdzać? Jeżeli w trakcie pętli napotka się na jakiś 'X' to tylko w drugim słowie, bo w pierwszym po znalezieniu tej samej cyfry przeskakuje na kolejną literkę.

Nie potrafię znaleźć wyjątku w którym to się przyda.

komentarz 4 maja 2016 przez draghan VIP (106,230 p.)
Na zdrowie. :)

Tak tylko zasygnalizuję, że można Twój program napisać dużo ładniej. ;) Wykluczyć globale, definiować zmienne w miejscu ich użycia, zastosować jakieś foreach i przede wszystkim - dobrze sformatować kod.

W Code::Blocks masz fajną wtyczkę do automatycznego formatowania kodu (menu plugins/source code formatter (AStyle)), w VS też na pewno coś takiego jest. Polecam.
komentarz 4 maja 2016 przez draghan VIP (106,230 p.)

Ale czy na pewno "Po drugie, musisz sprawdzać, czy poszczególne cyfry liczb są sobie równe oraz są różne od wartości wykluczonej. ;)" ?

Skoro cyfra nie może być 'X' to po co to sprawdzać? Nie jestem w stanie wyobrazić sobie takiego wyjątku

Sprawdź w działaniu wersję z tym sprawdzaniem i bez niego. Możesz nawet prześledzić program krok po kroku dla lepszego zrozumienia.

komentarz 4 maja 2016 przez RycerzAndromedy Użytkownik (670 p.)
No próbuję, zmieniam dane, ale wyłapuje wszystko i z tym zabezpieczeniem i bez niego. Podaj dane dla których źle działa jeśli możesz proszę :>
komentarz 4 maja 2016 przez RycerzAndromedy Użytkownik (670 p.)
http://ideone.com/t1ceBp tutaj to wrzuciłem.
komentarz 4 maja 2016 przez draghan VIP (106,230 p.)
Już nie mam dzisiaj siły na to patrzeć. Jutro. ;)
komentarz 4 maja 2016 przez draghan VIP (106,230 p.)
W nocy nie zauważyłem dość ważnego szczegółu.

Dodałeś w pętli break, co sprawia że Twój program liczy poprawną liczbę razy. W takim wypadku nie potrzeba sprawdzać, czy cyfra != 'X'. Dla kodu przedstawionego w Twoim poście w tym temacie bez sprawdzenia (albo breaka :) program podaje błędne wyniki.
komentarz 4 maja 2016 przez RycerzAndromedy Użytkownik (670 p.)
Wybacz, że namieszałem, ale co chwilę zmieniałem wersje kodu. Ok, program śmiga, thanks
0 głosów
odpowiedź 3 maja 2016 przez Barus Stary wyjadacz (14,120 p.)
Jeśli chodzi Ci o to co myślę, to zauważ, że "licznikczyAnagram" jest pokazany na ekranie zanim mu to zero przypiszesz. Zamień linię 14 z linią 15.

Pozdrawiam!
komentarz 3 maja 2016 przez RycerzAndromedy Użytkownik (670 p.)
Ten cout w linii 14. jest tylko żeby pokazać sobie w konsoli zmianę, on nie ma nic do rzeczy do działania reszty. To nie to. Mogę całkowicie wyrzucić tę 14. linię i nie zmienia to wyników, które wciąż są błędne.
komentarz 3 maja 2016 przez Barus Stary wyjadacz (14,120 p.)
Opisz dokładnie jakie wyniki według Ciebie są błędne to postaram się pomóc.
komentarz 3 maja 2016 przez RycerzAndromedy Użytkownik (670 p.)
Spójrz pod linkiem

http://ideone.com/t1ceBp

Tu wrzuciłem kompilowany program.

W std in jest 5 par liczb.  Tylko pierwsza para to anagram cyfrowy (11 i 11). Reszta to błędy. Program wychwycił tylko 1 błąd na 4.
komentarz 4 maja 2016 przez Barus Stary wyjadacz (14,120 p.)

Heh, problem jest taki, że w linii 25 i 26 Ty nie przypisujesz zmiennym 'X', ale porównujesz.. :)

liczba1[j]=='X';
liczba2[k]=='X';

Prawidłowo powinno być tak : 

liczba1[j]='X';
liczba2[k]='X';

I teraz powinno śmigać. 

komentarz 4 maja 2016 przez Barus Stary wyjadacz (14,120 p.)
Znaczy zmień to w kodzie z linku, który wysłałeś w komentarzu.
komentarz 4 maja 2016 przez RycerzAndromedy Użytkownik (670 p.)
dzięki za pomoc! Już myślałem że ogarnąłem różnicę między = a ==. Spróbuję wklepać do do głowy poraz kolejny...
komentarz 4 maja 2016 przez Barus Stary wyjadacz (14,120 p.)
== tylko porównuje, natomiast = przypisuje i wszystko się rymuje :D

Pozdrawiam!

Podobne pytania

0 głosów
2 odpowiedzi 121 wizyt
pytanie zadane 28 września 2020 w PHP przez vingilot85 Obywatel (1,150 p.)
0 głosów
2 odpowiedzi 273 wizyt
pytanie zadane 11 kwietnia 2022 w OpenGL, Unity przez letmestay Użytkownik (520 p.)
0 głosów
2 odpowiedzi 957 wizyt

92,575 zapytań

141,424 odpowiedzi

319,650 komentarzy

61,961 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!

...