Czdum Temat założony przez niniejszego użytkownika |
Zadanie 22 » 2015-03-13 15:20:13 Witam serdecznie, robiąc ostatni podpunkt zadania domowego z tego rozdziału wystąpiły u mnie dwa problemy. Otóż nie działa mi funkcja znajdmax i nie jestem w stanie znaleźć gdzie jest błąd w tym przypadku. #include <iostream> #include <cstdlib> #include <ctime> using namespace std; bool czybylawylosowana( int wpisanaliczba, int tablicazapisu[], int numerwtablicy ) { if( numerwtablicy <= 0 ) return false; for( int i = 0; i <= numerwtablicy; i++ ) if( wpisanaliczba == tablicazapisu[ i ] ) return true; return false; } void losowanie( int wylosowaneliczby[], int ile ) { int i = 0, liczba; do { liczba =(( rand() % 20 ) + 10 ); if( czybylawylosowana( liczba, wylosowaneliczby, 10 ) == false ) { wylosowaneliczby[ i ] = liczba; i++; } } while( i < ile ); } void wypisanieTablicy( int tablicadowypisania[], int jakduza ) { for( int i = 0; i < jakduza; i++ ) cout << "W tablicy pod numerem " << i + 1 << " znajduje sie " << tablicadowypisania[ i ] << endl; } void wypisanieTablicyOdTylu( int tablicadowypisania[], int jakduza ) { for( jakduza; jakduza > 0; jakduza-- ) cout << "W tablicy pod numerem " << jakduza << " znajduje sie " << tablicadowypisania[ jakduza - 1 ] << endl; } void znajdzminimum( int tablica[], int numerowTablicy ) { int a; for( int i = 0; i < numerowTablicy; i++ ) { for( int b = 0; b < numerowTablicy; b++ ) { if( tablica[ b ] > tablica[ b + 1 ] ) { a = tablica[ b ]; tablica[ b ] = tablica[ b + 1 ]; tablica[ b + 1 ] = a; } } } cout << "Najmniejsza liczba to " << tablica[ 0 ] << endl; cout << "Najwieksza liczba to " << tablica[ 9 ] << endl; } void znajdzmax( int tablica[], int numerwpisu ) { int a; for( int b = 0; b < numerwpisu; b++ ) { for( int i = 0; i < numerwpisu; i++ ) { if( tablica[ i ] < tablica[ i + 1 ] ) { a = tablica[ i ]; tablica[ i ] = tablica[ i + 1 ]; tablica[ i + 1 ] = a; } } } cout << "najmniejsza liczba to " << tablica[ 9 ] << endl; cout << "najwieksza liczba to " << tablica[ 0 ] << endl; } int main() { srand( time( NULL ) ); int tablica[ 10 ]; losowanie( tablica, 10 ); wypisanieTablicy( tablica, 10 ); wypisanieTablicyOdTylu( tablica, 10 ); znajdzminimum( tablica, 10 ); znajdzmax( tablica, 10 ); system( "PAUSE" ); return EXIT_SUCCESS; } Drugim co mi nie wychodzi jest zastąpienie polecenia do...while w funkcji losowanie na pętle for . Próbowałem to zrobić w następujący sposób for( i = 0; i < ile; i++ ) { liczba =(( rand() % 20 ) + 10 ); if( czybylawylosowana( liczba, wylosowaneliczby, 10 ) == false ) wylosowaneliczby[ i ] = liczba; } , ale niestety w tym przypadku w pewnym momencie losuje mi jakąś liczbę z kosmosu. Z góry dzięki. |
|
pekfos |
» 2015-03-13 16:07:52 for( int i = 0; i < numerwpisu; i++ ) { if( tablica[ i ] < tablica[ i + 1 ] )
|
Wychodzisz poza tablicę. for( i = 0; i < ile; i++ ) { liczba =(( rand() % 20 ) + 10 ); if( czybylawylosowana( liczba, wylosowaneliczby, 10 ) == false ) wylosowaneliczby[ i ] = liczba; }
|
Jak liczba została już wylosowana, zostawiasz pole tablicy niezainicjalizowane. |
|
Czdum Temat założony przez niniejszego użytkownika |
» 2015-03-13 17:08:26 poradziłem sobie z tym wychodzeniem poza tablicę w następujący sposób: void znajdzmax( int tablica[], int numerwpisu ) { int a; for( int b = 0; b < numerwpisu; b++ ) { for( int i = 0; i < numerwpisu; i++ ) { if( i == 0 ) { if( tablica[ i ] < tablica[ i + 1 ] ) { a = tablica[ i ]; tablica[ i ] = tablica[ i + 1 ]; tablica[ i + 1 ] = a; } } else { if( tablica[ i - 1 ] < tablica[ i ] ) { a = tablica[ i - 1 ]; tablica[ i - 1 ] = tablica[ i ]; tablica[ i ] = a; } } } } cout << "najmniejsza liczba to " << tablica[ 9 ] << endl; cout << "najwieksza liczba to " << tablica[ 0 ] << endl; } Ale mogę prosić o rozszerzenie trochę wypowiedzi z tym brakiem inicjalizacji? |
|
maly |
» 2015-03-13 17:26:36 Chodzi oto że jeśli liczba była wylosowna to zamiast spróbować ponownie losować lecisz dalej nie wypełniając tablicy. |
|
pekfos |
» 2015-03-13 17:42:18 poradziłem sobie z tym wychodzeniem poza tablicę w następujący sposób: |
W efekcie masz dwa razy tyle kodu, gdzie przypadek dla zera i ogólny (dla 1) robią dokładnie to samo. Wystarczyło zmienić parametry pętli.. |
|
Czdum Temat założony przez niniejszego użytkownika |
» 2015-03-13 17:49:58 @pekfos w jaki sposób parametry pętli? |
|
pekfos |
» 2015-03-13 17:51:31 Zaczynaj od 1, zamiast od zera? Dla zera i tak robisz to samo. Druga opcja to kończyć jeden element wcześniej i pierwszy kod będzie poprawny. |
|
Czdum Temat założony przez niniejszego użytkownika |
» 2015-03-13 18:38:49 okej, serdeczne dzięki pekfos, teraz ogarnąłem jak przesortować to krócej. Teraz takie pytanie, czy da się w ogóle zamienić void losowanie( int wylosowaneliczby[], int ile ) { int i = 0, liczba; do { liczba =(( rand() % 21 ) + 10 ); if( czybylawylosowana( liczba, wylosowaneliczby, 10 ) == false ) { wylosowaneliczby[ i ] = liczba; i++; } } while( i < ile ); } tak żeby zamiast do..while była pętla for ? Bo pętli "for" wg tego co przeczytałem powinno się używać wtedy kiedy wiemy dokładnie ile razy ma zostać wykonana pętla, a tu tego nie wiemy (dobrze myślę?) |
|
« 1 » 2 |