• 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

0 głosów
1,020 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 351 wizyt
pytanie zadane 28 września 2020 w PHP przez vingilot85 Obywatel (1,150 p.)
0 głosów
2 odpowiedzi 731 wizyt
pytanie zadane 11 kwietnia 2022 w OpenGL, Unity przez letmestay Użytkownik (520 p.)
0 głosów
2 odpowiedzi 1,240 wizyt

93,742 zapytań

142,680 odpowiedzi

323,299 komentarzy

63,329 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

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...