Dlaczego program w pętli do while działa a w for nie działa poprawnie
Ostatnio zmodyfikowano 2017-08-14 21:44
Lentyl Temat założony przez niniejszego użytkownika |
Dlaczego program w pętli do while działa a w for nie działa poprawnie » 2017-08-14 19:26:49 Pytanie jest banalne dlaczego ten sam Program działa z pętlą do while a z for nie koniecznie #include <iostream> #include <cstdlib> #include <windows.h> #include <ctime> using namespace std;
bool czy_poprawan( int liczba_f, int tablica_f[] )
{ for( int i = 0; i < 6; i++ ) { if( tablica_f[ i ] == liczba_f ) return true; } return false; }
int main() { srand( time( 0 ) ); int tablica[ 6 ]; cout << "witamy serdecznie w Lotto" << endl; for( int i = 0; i < 6; i++ ) { int liczba =( rand() % 10 ) + 1; if( czy_poprawan( liczba, tablica ) == false ) { tablica[ i ] = liczba; } } for( int i = 0; i < 6; i++ ) { Sleep( 1000 ); system( "cls" ); cout << tablica[ i ] << "\a" << endl; } cout << "twoje liczby zostaly wylosowane : " << endl; for( int i = 0; i < 6; i++ ) { cout << tablica[ i ] << ", " << endl; } return 0; } . Teraz to mi to nie działa nawet w do while. #include <iostream> #include <cstdlib> #include <windows.h> #include <ctime> using namespace std;
bool czy_poprawan( int liczba_f, int tablica_f[], int ile_f )
{ if( ile_f <= 0 ) return false; int i = 0; do { if( tablica_f[ i ] == liczba_f ) return true; i++; } while( i < ile_f ); return false; }
int main() { srand( time( 0 ) ); int tablica[ 6 ]; int ile = 0; cout << "witamy serdecznie w Lotto" << endl; do { int liczba =( rand() % 10 ) + 1; if( czy_poprawan( liczba, tablica, ile ) == false ) tablica[ ile ] = liczba; ile++; } while( ile < 6 ); ile = 0; do { Sleep( 1000 ); system( "cls" ); ile++; cout << tablica[ ile ] << "\a" << endl; } while( ile < 6 ); cout << "twoje liczby zostaly wylosowane : " << endl; ile = 0; do { cout << tablica[ ile ] << ", " << endl; ile++; } while( ile < 6 ); return 0; } . Teraz to ten przykład jest żywcem zerżnięty z instrukcji jakie podawane są w kursie dodałem również trzeci argument jak można zauważyć i if-a na samym topie którego w pierwszym moim autorskim nie ma i nadal nie działa a wczoraj działało dziadostwo ten pierwszy przykład tylko, że z pętlą do while. Dzięki bardzo za pomoc mam nadzieje, że się kiedyś tego c++ nauczę jeszcze raz dzięki Pozdrawiam. |
|
Rashmistrz |
» 2017-08-14 20:06:34 Zedytuj post i wstaw dla porównania oba kody w znaczniki [cpp]...[/cpp].
Zauważ że do...while wykonuje ciało pętli co najmniej raz, a for zawsze sprawdza warunek przed wejściem w pętlę. |
|
mateczek |
» 2017-08-14 21:44:45 masz poprawiony kod #include <iostream> #include <ctime> using namespace std; bool czy_poprawan( int liczba_f, int tablica_f[] ) { for( int i = 0; i < 6; i++ ) { if( tablica_f[ i ] == liczba_f ) return true; } return false; }
int main() { srand( time( 0 ) ); int tablica[ 6 ] { 0 }; cout << "witamy serdecznie w Lotto" << endl; for( int i = 0; i < 6; ) { int liczba =( rand() % 10 ) + 1; if( czy_poprawan( liczba, tablica ) == false ) { tablica[ i ] = liczba; i++; } } cout << "twoje liczby zostaly wylosowane : " << endl; for( int i = 0; i < 6; i++ ) { cout << tablica[ i ] << ", " << endl; } return 0; }
albo wersja bez zerowania tablicy #include <iostream> #include <ctime> using namespace std; bool czy_poprawan( int liczba_f, int tablica_f[], int zajetosc ) { for( int i = 0; i < zajetosc; i++ ) { if( tablica_f[ i ] == liczba_f ) return true; } return false; }
int main() { srand( time( 0 ) ); int tablica[ 6 ]; cout << "witamy serdecznie w Lotto" << endl; for( int i = 0; i < 6; ) { int liczba =( rand() % 10 ) + 1; if( czy_poprawan( liczba, tablica, i ) == false ) { tablica[ i++ ] = liczba; } } cout << "twoje liczby zostaly wylosowane : " << endl; for( int i = 0; i < 6; i++ ) { cout << tablica[ i ] << ", " << endl; } return 0; }
Wyzerowanie tablicy jest ważne tylko wtedy gdy sprawdzasz całą tak jak robisz w twoim kodzie. Chodzi o to że tablica może mieć przypadkowe wartości np: {3, 33333, 452345325, 6 ,9436545, 8} Przeanalizuj co się stanie gdy wylosujesz powiedzmy 6 jako pierwszą liczbę ?? twoje sprawdzenie wyrzuci, że już taka liczba jest w tablicy i niepotrzebnie powtórzysz losowanie. Więc albo zerujesz tablice, albo testujesz tylko jej ważną część (tak jak w drugim przykładzie). Drugi błąd to inkrementacja w każdym obiegu pętli. A inkrementacja indexu powinna być dokonana tylko w momencie wpisania do tablicy. |
|
« 1 » |