Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

funkcje, a return

Ostatnio zmodyfikowano 2014-03-08 21:10
Autor Wiadomość
fenq80
Temat założony przez niniejszego użytkownika
funkcje, a return
» 2014-02-23 11:12:11
C/C++
bool czyGodzinaPoprawna( int godz, int min, int sek )
{
    std::cout << "Jestem w funkcji czyGodzinaPoprawna" << std::endl;
    if( godz < 0 || godz > 23 )
         return false;
   
    std::cout << "Godzina jest poprawna" << std::endl;
    if( min < 0 || min > 59 )
         return false;
   
    std::cout << "Godziny i minuty sa poprawne" << std::endl;
    if( sek < 0 || sek > 59 ) return false;
   
    std::cout << "Czas jest poprawny" << std::endl;
    return true;
}

Jest to wycinek kodu z lekcji 20.
Moje pytanie brzmi: kiedy funkcja ma zwracać true kiedy false i czym to się różni.Jak zmieniłem false na true to niby działała poprawnie ale , w lekcji kolejnej tj. ,,losowanie bez powtórzeń '' już tak nie było. Proszę o pomoc.
P-105137
Nitr0Skay
» 2014-02-23 14:40:13
Otóż w podanym przez Cb przykładzie funkcja zwraca prawdę, jeżeli cała funkcja się wykona, a więc podana godzina będzie poprawna. Jeżeli gdzieś po drodze w funkcji pojawi się nie pożądany błąd, funkcja zwraca fałsz w miejscu, gdzie owy błąd wyskoczył.

Natomiast w lekcji Losowania bez powtórzeń w programie przykładowym występują 2 funkcje - Druga funkcja zwraca po prostu wylosowaną liczbę z przedziału od 1 do 10. Natomiast ta pierwsza sprawdza czy liczba wylosowana była już wylosowana.

Działa ona na takiej zasadzie, że w Warunku if jest wywoływana owa funkcja, do której dajemy 3 argumenty i przyrównujemy ją do false. Czemu do false ?? Otóż na początku tej funkcji jest sprawdzane, czy ilość wylosowanych liczb jest mniejsza lub równa zero. Jeżeli nie ma wylosowanych liczb, to funkcja w tym momencie zwraca prawdę, gdyż wylosowana liczba przez program na pewno się nie powtórzyła.

Następnie Liczba ta jest porównywana ze wszystkimi elementami w tablicy, które zostały wylosowane. Jeżeli jakaś wartość tablicowa będzie równa to wówczas funkcja zwraca prawdę. Gdy to zrobi, wtedy warunek if nie zostanie spełniony i liczba nie zostanie dołączona do porównywanej tablicy.

Tutaj też mógłbyś pozmieniać true na false w ten funkcji, ale warunek też musiałby być porównywany nie do false ale do true. Tylko wtedy nie byłoby to semantyczne, nie sądzisz ??
P-105141
fenq80
Temat założony przez niniejszego użytkownika
» 2014-02-23 17:39:38
Bardzo dziękuje za odpowiedź która dużo mi rozjaśniła ale także spowodowała kolejne pytania.  Mówiąc o funkcji drugiej miał pan na myśli return false po while? Drugie pytanie w jaki sposób jest sprawdzane czy liczba była już wczytana na jakiej zasadzie działa ten kod?
P-105151
Nitr0Skay
» 2014-02-23 18:56:27
Pisząc o drugiej funkcji miałem na myśli tą funkcję:
C/C++
int wylosuj()
{
    return( rand() % 10 ) + 1;
}

A opisałem ją jako pierwszą, ponieważ była ona krótsza i łatwiejsza do wytłumaczenia. Potem przeszedłem do opisu nieco bardziej skomplikowanego.



Co do drugiego pytania, skupmy się na tym ułamku kodu
C/C++
int i = 0;
do
{
    if( tab[ i ] == iLiczba )
         return true;
   
    i++;
} while( i < ile );


Oraz na instrukcji warunkowej, w której jest ta funkcja wywoływana:
C/C++
if( czyBylaWylosowana( liczba, wylosowane, wylosowanych ) == false )
{
    wylosowane[ wylosowanych ] = liczba;
    wylosowanych++;
} //if

Więc tak. Jeżeli ilość elementów w przekazanej do funkcji tablicy jest większa od zera, to przechodzimy do pierwszego wycinku kodu. Deklarujemy i Inicjalizujemy zmienną, która będzie odpowiadać za ilość pętli. Następnie w pętli zaczynamy od Warunku
if( tab[ i ] == iLiczba )
 . Zmienna tab[] jest tablicą wylosowanych liczb, którą przekazaliśmy w instrukcji warunkowej w drugim wycinku kodu jako "wylosowane". Pierwszy argument przekazywany do tej funkcji jest liczba wylosowaną w danej pętli w programie głównym. Liczba wylosowana jest porównywana przez pętlę w funkcji "czyBylaWylosowana" z każdym elementem w przekazanej tam tablicy. Jeżeli któryś z elementów tej tablicy jest równy wylosowanej liczbie, to instrukcja warunkowa się spełni i funkcja ta zwróci prawdę do miejsca, gdzie została wywołana, a więc do
if( czyBylaWylosowana( liczba, wylosowane, wylosowanych ) == false )
 . Jak wiadomo, prawda nie równa się fałszowi, zatem warunek jest fałszywy i się nie spełni, to też liczba nie zostanie dopisana do tablicy w tej instrukcji warunkowej w drugim wycinku kodu. Jak coś będzie nie zrozumiałe, to proszę dalej pytać ;)
P-105156
fenq80
Temat założony przez niniejszego użytkownika
» 2014-03-08 21:10:29
Wielkie dzięki za pomoc. Wkońcu udało mi się to zrozumieć , zreszta tak mysle.
P-105884
« 1 »
  Strona 1 z 1