bobby.hl Temat założony przez niniejszego użytkownika |
Rozdział 22, ćwiczenie 3 - próba dodania funkcji bool uniemożliwiającej powtórne wylosowanie tej samej liczby » 2017-01-28 18:46:56 hej, dodałem do tego zadania funkcję bool, która ma uniemożliwić dodanie do tablicy drugi raz tej samej liczby, na wzór poprzedniego rozdziału, ale niestety nie działa. próbowałem na różne sposoby ale nic z tego. trzeba dodac dodatkową tablicę or sth? Możecie pomóc? #include <iostream> #include <ctime> #include <cstdlib>
using namespace std;
bool czyByla( int i, int tab[], int ile ) { if( ile <= 0 ) return false; int licznik = 0; do { if( tab[ licznik ] == i ); { return true; i++; } } while( i < ile ); return false; }
int wylosuj( int tab[], int ile ) { for( int i = 0; i < ile; i++ ) tab[ i ] =( rand() %( 30 - 10 + 1 ) ) + 10; }
void wypiszTablice( int tab[], int ile ) { for( int i = 0; i < ile; i++ ) cout << "Liczba " << i + 1 << " to " << tab[ i ] << endl; }
void wypiszTabliceOdTylu( int tab[] ) { for( int i = 9; i > - 1; i-- ) cout << "Liczba " << i + 1 << " to " << tab[ i ] << endl; }
int znajdzMIN( int tab[], int ile ) { int liczba = tab[ 0 ]; for( int i = 1; i < ile; i++ ) if( liczba > tab[ i ] ) liczba = tab[ i ]; return liczba; }
int znajdzMAX( int tab[], int ile ) { int liczba = tab[ 0 ]; for( int i = 1; i < ile; i++ ) if( liczba < tab[ i ] ) liczba = tab[ i ]; return liczba; } wypiszMinMax( int iMIN, int iMAX ) { cout << "Najmniejsza liczba to: " << iMIN << endl; cout << "Największa liczba to: " << iMAX << endl; } int main() { srand( time( 0 ) ); int tablica[ 10 ]; int i = 0; do { int liczba = wylosuj( tablica, 10 ); if( czyByla( liczba, tablica, i ) == false ) tablica[ i ] = liczba; i++; } while( i < 10 ); wypiszTablice( tablica, 10 ); cout << endl; wypiszTabliceOdTylu( tablica ); cout << endl; int iMIN = znajdzMIN( tablica, 10 ); int iMAX = znajdzMAX( tablica, 10 ); wypiszMinMax( iMIN, iMAX ); return 0; }
EDIT: do { if( tab[ licznik ] == i ); { return true; i++; }
ten błąd już znalazłem, zmieniłem na licznik++ ale nadal nie dziala |
|
mateczek |
» 2017-01-28 21:04:53 Uważaj gdzie stawiasz średniki if( tab[ licznik ] == i );
{ }
tutaj po poprawkach : #include <iostream> #include <ctime> #include <cstdlib>
using namespace std;
bool czyByla( int liczba, int tab[], int ile ) { for( int i = 0; i < ile; i++ ) { if( tab[ i ] == liczba ) return true; } return false; }
int wylosuj() { return( rand() %( 30 - 10 + 1 ) ) + 10; }
void wypiszTablice( int tab[], int ile ) { for( int i = 0; i < ile; i++ ) cout << "Liczba " << i + 1 << " to " << tab[ i ] << endl; }
void wypiszTabliceOdTylu( int tab[] ) { for( int i = 9; i > - 1; i-- ) cout << "Liczba " << i + 1 << " to " << tab[ i ] << endl; }
int znajdzMIN( int tab[], int ile ) { int liczba = tab[ 0 ]; for( int i = 1; i < ile; i++ ) if( liczba > tab[ i ] ) liczba = tab[ i ]; return liczba; }
int znajdzMAX( int tab[], int ile ) { int liczba = tab[ 0 ]; for( int i = 1; i < ile; i++ ) if( liczba < tab[ i ] ) liczba = tab[ i ]; return liczba; } wypiszMinMax( int iMIN, int iMAX ) { cout << "Najmniejsza liczba to: " << iMIN << endl; cout << "Największa liczba to: " << iMAX << endl; } int main() { srand( time( 0 ) ); int tablica[ 10 ]; int i = 0; do { int liczba = wylosuj(); if( czyByla( liczba, tablica, i ) == false ) tablica[ i++ ] = liczba; } while( i < 10 ); wypiszTablice( tablica, 10 ); cout << endl; wypiszTabliceOdTylu( tablica ); cout << endl; int iMIN = znajdzMIN( tablica, 10 ); int iMAX = znajdzMAX( tablica, 10 ); wypiszMinMax( iMIN, iMAX ); return 0; }
|
|
bobby.hl Temat założony przez niniejszego użytkownika |
Dzięki :) » 2017-01-28 21:42:28 @mateczek o super, dzięki wielkie, właśnie takiej odpowiedzi oczekiwałem :) czyli problem tkwił w funkcji losuj, bo nawet jak nie zmieniłem czyByla to działa teraz poprawnie ciekawe czemu pętla for w int main nie sprawdza się w przypadku używania czyByla, a do...while działa jak należy? jeszcze jedno pytanie: zapis if( czyByla( liczba, tablica, i ) == false ) { tablica[ i ] = liczba; i++; } jest równoważny do zapisu? if( czyByla( liczba, tablica, i ) == false ) tablica[ i++ ] = liczba; |
|
mateczek |
» 2017-01-28 21:55:44 nawet jak nie zmieniłem czyByla to działa teraz poprawnie |
W funkcji "czyByła" jest, źle średnik i namieszane ze zmiennymi; Jeśli to poprawiłeś to ok. poprawione mniej więcej tak: bool czyByla( int i, int tab[], int ile ) { if( ile <= 0 ) return false; int licznik = 0; do { if( tab[ licznik ] == i ) { return true; } licznik++; } while( licznik < ile ); return false; }
Ad2. tak te zapisy są równoważne Ale muszą być te klamry{}. W kodzie u góry brak klamer, Więc z rozpędu dodałem inkrementacje przy zapisie do tablicy. |
|
bobby.hl Temat założony przez niniejszego użytkownika |
» 2017-01-28 22:28:22 dokładnie, u mnie jedyna różnica to to, że nie mam w ogóle klamer w miejscu gdzie funkcja zwraca true może tak być? chyba tak, bo po if jest tylko jedna komenda, zgadza się? generalnie Twój zapis jest znacznie krótszy i bardziej przejrzysty dzięki for ten średnik, który postawiłem po if powodował, że funkcja nigdy by nie zwróciła true ? bool czyByla( int i, int tab[], int ile ) { if( ile <= 0 ) return false; int licznik = 0; do { if( tab[ licznik ] == i ) return true; licznik++; } while( licznik < ile ); return false; }
|
|
« 1 » |