pendrakk14 Temat założony przez niniejszego użytkownika |
[Lekcja - 21] Analiza przykładu oraz zadanie domowe » 2012-07-17 14:00:28 Mam problem z jedna linijka w poniższym przykładzie: #include <iostream> #include <cstdlib> #include <ctime>
bool czyBylaWylosowana( int iLiczba, int tab[], int ile ) { if( ile <= 0 ) return false; int i = 0; do { if( tab[ i ] == iLiczba ) return true; i++; } while( i < ile ); return false; }
int wylosuj() { return( rand() % 10 ) + 1; }
int main() { srand( time( 0 ) ); int wylosowane[ 5 ]; int wylosowanych = 0; do { int liczba = wylosuj(); if( czyBylaWylosowana( liczba, wylosowane, wylosowanych ) == false ) { wylosowane[ wylosowanych ] = liczba; wylosowanych++; } //if } while( wylosowanych < 5 ); wylosowanych = 0; do { std::cout << wylosowane[ wylosowanych ] << std::endl; wylosowanych++; } while( wylosowanych < 5 ); return 0; }
konkretnie chodzi o "if( ile <= 0 )" w funkcji czyBylaWylosowana, kiedy zmienna ile przyjmuje wartosci mniejsze od zera? przeciez nie moze byc ujemna ilosc liczb wylosowanych? |
|
kubawal |
» 2012-07-17 14:06:14 Jeśli miała by to być funkcja, która używa się w wielu programach, to owszem - sprawdzenie argumentów. Ale w tym kontekście? Równie dobrze mogło by jej tam nie być! |
|
pendrakk14 Temat założony przez niniejszego użytkownika |
» 2012-07-17 14:16:52 a ja się dwa dni głowiłem do czego ta linijka ;p po prostu wole do wszystkiego dojsc sam ale jak widac nie zawsze to wychodzi na dobre ;p
btw, przydałoby się usunąć/skomentowac jakos te linijke w kursie |
|
xevuel |
» 2012-07-17 14:40:23 Wbrew pozorom nie jest to bezsensowna linijka, więc nie trzeba w kursie nic zmieniać. Po pierwsze, należy zawsze filtrować dane wejściowe, a po drugie takie sprawdzenie argumentów może nieznacznie przyspieszyć działanie programu. |
|
pendrakk14 Temat założony przez niniejszego użytkownika |
» 2012-07-17 19:30:53 proszę o sprawdzenie pierwszego zadania domowego 1. Napisz program, który wczyta 3 liczby podane przez użytkownika do tablicy, a następnie wylosuje 2 z nich bez powtórzeń. Wynik wypisz na ekran. Postaraj się napisać ten program w oparciu o funkcje. #include <iostream> #include <cstdlib> #include <ctime>
using namespace std;
void wczytanie_liczb( int tab[], int iRozmiar ) { int i = 0; do { cout << "Podaj liczbe: "; cin >> tab[ i ]; ++i; } while( i < iRozmiar ); }
bool czyBylaWylosowana( int iLiczba, int tab[], int ile ) { int i = 0; do { if( tab[ i ] == iLiczba ) return true; i++; } while( i < ile ); return false; }
int wylosuj() { return rand() % 3; }
int main() { srand( time( 0 ) ); int tablica[ 3 ]; int wylosowane[ 2 ]; wczytanie_liczb( tablica, 3 ); int wylosowanych = 0; int licznik = 0; do { int indeks_tab = wylosuj(); if( czyBylaWylosowana( indeks_tab, wylosowane, wylosowanych ) == false ) { wylosowane[ licznik ] = tablica[ indeks_tab ]; ++licznik; } } while( licznik < 2 ); licznik = 0; do { cout << wylosowane[ licznik ] << endl; ++licznik; } while( licznik < 2 ); return 0; }
chyba mam cos zle bo liczby czasem sie powtarzaja przy losowaniu |
|
diego997 |
» 2012-07-17 21:22:25 Zauważ, że za każdym razem losujesz liczby od 0 do 2, następnie ktoras z tych liczb wysylasz do czyByłaWylosowan. I tak się dzieje za każdym razem. Program działa tylko w przypadku podania na początku liczb 0,1,2 |
|
pendrakk14 Temat założony przez niniejszego użytkownika |
» 2012-07-18 12:50:56 mógłbyś trochę rozwinąć wskazówke? masz racje sprawdziłem w kilkudziesieciu próbach dla liczb 0,1,2 i nie powtorzyły sie ani razu
sprawdzam tylko liczby 0,1,2 bo to indeksy elementow tablic za ktorymi kryja sie podane liczby i jesli one sie nie powtarzaja to liczby tez nie powinny sie powtarzac jednak tak sie nie dzieje
prosze o wskazówke |
|
Sungrazer |
» 2012-07-18 17:10:13 Błąd jest tylko w tym miejscu, w funkcji czyBylaWylosowana: if( tab[ i ] == iLiczba ) . W tej chwili działa to w taki sposób, że sprawdzasz czy wartość z tablicy wylosowanych jest równa wartości wylosowanego indeksu (0, 1 lub 2). Prawidłowo powinno wyglądać to tak: if( tab[ i ] == tablica[ iLiczba ] ) . Druga tablica to ta, w której masz zapisane 3 liczby podane przez użytkownika. Oczywiście musisz przesłać ją wcześniej do funkcji sprawdzającej. Chyba wszystko jasne? Swoją drogą, mógłbyś dla ułatwienia nadawać argumentom funkcji te same nazwy, jakie mają zmienne, które tam przekazujesz:P |
|
« 1 » 2 |