[C++] zatrzymanie FOR'a

Awatar użytkownika
alchem
Użytkownik
Użytkownik
Posty: 252
Rejestracja: 10 cze 2014, o 19:10
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 83 razy
Pomógł: 5 razy

[C++] zatrzymanie FOR'a

Post autor: alchem »

Mam pewną funkcje:

Kod: Zaznacz cały

bool pitagoras(int bok)
{
 int a,b,d,e;

 if(bok<=0)
    {
     e=0;
    }
 else
 {
 for(a=1;a<=bok;a++)
 {
   for(b=1;b<=bok;b++)
   {
    d=(bok*bok)-(a*a)-(b*b);
    if(d=0)
        e=1;
    else e=0;
   }
 }
 }

  return e=1;
}

Chce później wywołać test, w którym podam przeciwprostokątne (dobre lub złe) i program odpowiednio na to zareaguje, tylko że nie wiem jak sobie poradzić z tym kodem tak aby kiedy znajdzie pewne \(\displaystyle{ a}\) i \(\displaystyle{ b}\), takie że \(\displaystyle{ d}\) będzie równe \(\displaystyle{ 0}\) to "for" się zatrzyma i zwróci wartość \(\displaystyle{ e=1}\), jeśli takiej wartości nie znajdzie to \(\displaystyle{ e=0}\), bo z tego co mi się wydaje to w tym kodzie wartość \(\displaystyle{ d}\) zostaje zachowana dla \(\displaystyle{ a=b=bok}\), bo poprzedniki są "kasowane" przez następniki.
lukequaint
Użytkownik
Użytkownik
Posty: 219
Rejestracja: 5 maja 2010, o 18:27
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 1 raz
Pomógł: 75 razy

[C++] zatrzymanie FOR'a

Post autor: lukequaint »

Możesz w miejscu

Kod: Zaznacz cały

e = 1;
wpisać

Kod: Zaznacz cały

return 1;
Albo:

Kod: Zaznacz cały

e = 1;
break;
Innym sposobem jest ustawienie jakiejś zmiennej, np. typu bool, która będzie mówiła o tym, czy na końcu zwrócić 1 czy 0.
Awatar użytkownika
Vardamir
Użytkownik
Użytkownik
Posty: 1913
Rejestracja: 3 wrz 2010, o 22:52
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 6 razy
Pomógł: 410 razy

[C++] zatrzymanie FOR'a

Post autor: Vardamir »

Jeśli chcesz coś wykonać pewną (nieznaną) liczbę kroków to powinieneś użyć while. Pętli for powinno się używać jeśli znana jest dokładna liczba wywołań.
Awatar użytkownika
alchem
Użytkownik
Użytkownik
Posty: 252
Rejestracja: 10 cze 2014, o 19:10
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 83 razy
Pomógł: 5 razy

[C++] zatrzymanie FOR'a

Post autor: alchem »

Kod: Zaznacz cały

#include <iostream>
#include <cassert>

using namespace std;

bool pitagoras(int bok)
{
 int a,b,d,e=0;

 if(bok<=0)
    {
    return e=0;
    }
 else
 {
  for(a=1;a<=bok;a++)
  {
    for(b=1;b<=bok;b++)
    {
     d=(bok*bok)-(a*a)-(b*b);
     if(d=0)
     {
      e=1;
      break;
     }

    }

  }
 }

return e=1;
}

void test_pitagoras(void)
  {
  assert(pitagoras(3));
  assert(pitagoras(13));
  assert(pitagoras(10));
  assert(pitagoras(25));
  assert(pitagoras(26));
  }





int main()
{
  test_pitagoras();
  cout << "Podaj liczbe aby sprawdzic czy jest ona przekatna pewnego trojkata: ";
  int z;
  cin >> z;
   if(z<=0)
    cout << "Przekatna trojkata musi byc dodatnia!"<< endl;
   else
    {
        if(pitagoras(z)==true)
          cout << "Ta przeciwprostokatna  trojkata  wystepuje dla pewnych dwoch przyprostokatnych o wartosciach naturalnych"<< endl;
     else
          cout << "Ta przeciwprostokatna nie wystepuje dla dowolnych dwoch liczb naturalnych !"<< endl;
    }
    return 0;
}

Nie za bardzo wiem jak mogę zrobić to z while, ale robiąc z break"iem program nadal uważa że np 3 jest dobrym rozwiązaniem. na początku zadeklarowałem że \(\displaystyle{ e=0}\), jeśli znajdzie takie \(\displaystyle{ a}\) i \(\displaystyle{ b}\) że \(\displaystyle{ d=0}\) to ma przypisać do \(\displaystyle{ e}\) wartość \(\displaystyle{ 1}\) i się zatrzymać, jeśli takiej nie znajdzie to \(\displaystyle{ e}\) zostaje z wartością \(\displaystyle{ 0}\) i w testach wyskakuje błąd bo funkcja nie zwraca prawdy, wie ktoś co tu jest nie tak?
lukequaint
Użytkownik
Użytkownik
Posty: 219
Rejestracja: 5 maja 2010, o 18:27
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 1 raz
Pomógł: 75 razy

[C++] zatrzymanie FOR'a

Post autor: lukequaint »

Prosta rada - nie rób przypisania przy zwracaniu wartości. A problem jest w tym, że na koniec funkcji pitagoras, czyli gdy nie uda się znaleźć takich boków a i b, dla których d jest równe \(\displaystyle{ 0}\) zwracasz \(\displaystyle{ 1}\), czyli potwierdzasz, że jednak udało się znaleźć właściwe długości przyprostokątnych.

Druga sprawa, tutaj:

Kod: Zaznacz cały

if(d=0)
brakuje jednego znaku równości, czyli powinno być tak:

Kod: Zaznacz cały

if(d==0)
W pierwszej wersji warunek zawsze jest fałszywy, bo wynikiem przypisania jest przypisana wartość (innymi słowy d=0 zwraca \(\displaystyle{ 0}\)).

Po trzecie, to skoro deklarujesz, że funkcja zwróci wartość typu bool, powinna tak robić. Ale na tym etapie to nie jest aż tak istotne (\(\displaystyle{ 0}\) i \(\displaystyle{ 1}\) zostaną przekonwertowane odpowiednio do false i true) .
ODPOWIEDZ