Jump to content
Blaviken

[C++] Różnice między funkcjami

Recommended Posts

Witam drogich forumowiczów,

ostatnio na lekcji informatyki mieliśmy napisać funkcje, która sprawdza, czy podana liczba jest pierwsza. Ja użyłem czegoś takiego:


bool LiczbaPierwsza(int Liczba)
{
if (Liczba == 2) return true;
for (int i = 2; i <= sqrt(Liczba); ++i)
{
if (Liczba % i == 0)
{
return false;
break;
}
}
return true;
}

Nauczyciel zgodził się, że działa dobrze, ale było widać że coś mi nie pasuje. Niedługo potem ta wersja funkcji zaczęła królować w całej klasie. W tym momencie nauczyciel nauczyciel się przyczepił, bo stwierdził, że ta funkcja działa, ale nie powinno się tego tak robić, a skoro tak dużo ludzi jej używa, on nie może na to pozwolić. Argumentował to tym, że jest ona okropna dla komputera, szczególnie połączenie for i break, a w tym przypadku inne pętle lepiej się sprawdzą. Kazał nam napisać ją jeszcze raz, ale używając pętli do lub while i warunków, które podał. Efekt końcowy wyglądał mniej więcej tak:


bool Pierwszanr2(int Liczba)
{
int i = 2;
int reszta;
if (Liczba == 2) return true;
do
{
reszta = Liczba % i;
i++;
}while (reszta!=0 && i < sqrt(Liczba));
if (reszta == 0)
return false;
else
return true;
}

Zaczęliśmy z kolegą kłócić z nim, że ta funkcja jest mniej przejrzysta, na same warunki nigdy byśmy nie wpadli itd.

No więc tu pojawia się moje pytanie: czy nasz nauczyciel rzeczywiście ma racje i ja, jako człowiek mający ambicje zostać programistą powinien się wystrzegać takich funkcji, czy jednak nie robi to większej różnicy, a ja mogę spokojnie korzystać z pierwszej wersji, nie bojąc się, że zabiję komputer?

Link to comment
Share on other sites

Czy powinno się używać break/continue?

Raczej powinno się tego unikać.

Użycie go zazwyczaj nieco utrudnia czytanie i dowodzenie poprawności programu, dużo bardziej elegancki kod najczęściej uzyskamy przez dodanie warunku do pętli while.

Czasami jednak użycie tego jest potrzebne, bo dzięki temu kod będzie czytelniejszy/prostszy etc.

goto.png

Bardziej niż o tego breaka martwiłbym się o sam warunek:


i <= sqrt(Liczba)

Pierwiastek nie jest niczym przyjemnym do liczenia, można ten problem rozwiązać lepiej (mianowicie podnosząc i do kwadratu).

EDIT

Oczywiście moja wypowiedź na temat break tyczy się tyko pętli, w switch jest to najczęściej konieczne i się tego nie obejdzie.

Edited by Hakken
Link to comment
Share on other sites

Ja bym tę funkcję zrobił tak:

bool PierwszaNr3(int liczba)
{
bool wynik = true;
int pierwiastekLiczby = pierwiastek(liczba);

for (int i = 2; i <= pierwiastekLiczby; ++i)
{
if (liczba % i == 0)
{
wynik = false;
break;
}
}
return wynik;
}

Moim zdaniem to jest najbardziej czytelne rozwiązanie. Posiada tylko jeden punkt wyjścia z metody - użycie wielu return, szczególnie w dłuższej funkcji, potrafi być irytujące.

do-while jest dobre, jeśli pętla musi się wykonać przynajmniej jeden raz - oszczędzasz sobie jedno sprawdzenie warunku. Zysk prawdopodobnie zerowy, ale ładniej wygląda.

Pętle z pierwszego postu są porówywalne. Ja bym wziął "for", bo i tak potrzebujemy licznika, więc wygodniej niż klepać ekstra zmienną poza pętlą (w Visual Studio użyłbym po prostu snippetu "for").

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.



  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...