[C++] skąd te powtórzenia?

0

Witam! Na sam początek wkleję kodzik:

void wprowadz()
{
  int dlugosc;
  string wyraz;
  
  cout<<"Podaj wyraz: ";
  cin>>wyraz;
  getchar();
  dlugosc=wyraz.length();
  sprawdz(wyraz,dlugosc);
};

void sprawdz(string wyraz, int dlugosc)
{
  bool blad = 0;
  for(int i = 0; i<dlugosc; i++)
    if (!((wyraz[i]>=48 && wyraz[i]<=57) || (wyraz[i]>=65 && wyraz[i]<=90) || wyraz[i]>=97 && wyraz[i]<=122))
    {
      cout<<"UWAGA: Niedozwolony znak o indeksie: "<<i+1<<" - popraw\n";
      blad = 1; 
    }       
  if (blad==1) wprowadz();
  cout<<"SPRAWDZ";
};

Jest on niepełny ale myślę, że powinno wystarczyć. Otóż gdy za pierwszym razem wpisze poprawnie dane (tz. z przedziału od 0-9, a-z, A-Z) to wszystko działa dobrze tekst SPRAWDZ wyświetla się tylko raz. Jednak jeśli wpisze jakąś liczbę z poza przedziału tekst się powtarza tz. jeżeli najpierw zrobię błąd, a później wpisze prawidłowe dane tekst SPRAWDZ wyświetla się dwa razy i tak to wygląda:
SPRAWDZSPRAWDZ
Jeżeli zrobię najpierw dwa błędy, a później poprawnie to tekst SPRAWDZ powtarza się 3 razy itd.

No i tu jest moje pytanie co powoduje ten błąd?
Z góry dzięki za odpowiedz.

0
void wprowadz()
{
  int dlugosc;
  string wyraz;

  cout<<"Podaj wyraz: ";
  cin>>wyraz;
  cout<<"SPRAWDZ\n";
  getchar();
  dlugosc=wyraz.length();
  sprawdz(wyraz,dlugosc);
}

void sprawdz(string wyraz, int dlugosc)
{
  bool blad = 0;
  for(int i = 0; i<dlugosc; i++)
    if (!((wyraz[i]>=48 && wyraz[i]<=57) || (wyraz[i]>=65 && wyraz[i]<=90) || wyraz[i]>=97 && wyraz[i]<=122))
    {
      cout<<"UWAGA: Niedozwolony znak o indeksie: "<<i+1<<" - popraw\n";
      blad = 1;
    }
  if (blad==1) wprowadz(); 
}

Sprawdz czy o takie cos chodzilo, to cout bylo w zlym miejscu troszke i to wszystko :]

0

Problem jest w kolejnosci instrukcji:

if (blad==1)  wprowadz();
  cout<<"SPRAWDZ";

Zamien to miejscami

  cout<<"SPRAWDZ\n";
if (blad==1)  wprowadz();

Teraz gdy tylko znajdzie blad wyswietli SPRAWDZ a potem zazada ponownego wprowadzenia wyrazu.

Edit:
Nie zauwazylem, Rapson juz odpowiedzial to samo

0

Dzięki za odpowiedź ale nie zupełnie o to mi chodziło. Teraz rzeczywiście SPRAWDZ wypisuje tylko raz ale wypisuje za każdym razem niezależnie od tego czy podam dobre czy złe dane. Ten cout nie służy do niczego konkretnego on miał mi tylko pokazać czy program dobrze działa. Ma się on wyświetlić tylko raz i to wtedy gdy podam prawidłowe dane. Jeśli ktoś ma jeszcze jakieś pomysły to proszę o pomoc.

0

Jesli ma sie wyswietlic tylko raz gdy podasz wlasciwe dane to wystarczy:

if (blad==1)  wprowadz();
else cout<<"SPRAWDZ";
0

W sumie masz racje. Nie pomyślałem o tym:D.

Tak z ciekawości zapytam dlaczego tekst SPRAWDZ wyświetlał się kilka razy? Przecież w kodzie jest napisane że jeżeli wystąpi błąd to ponownie wywołana jest funkcja wprowadz(), a jeżeli błędu już nie ma to wtedy wyświetla raz tekst.

0

Nie tak. Funkcja wprowadz() wywoluje funkcje sprawdz(). Jesli wpisales dane blednie to funkcja sprawdz() wywoluje znowu funkcje wprowadz(), ktora wywoluje kolejna funkcje sprawdz(). Tym sposobem funkcja sprawdz() jest wywolywana tyle razy ile funkcja wprowadz(). Czyli tym samym tekst "SPRAWDZ" byl wyswietlany tyle razy ile ile wywolywana byla funkcja wprowadz().

1 użytkowników online, w tym zalogowanych: 0, gości: 1