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

Dlaczego program w pętli do while działa a w for nie działa poprawnie

Ostatnio zmodyfikowano 2017-08-14 21:44
Autor Wiadomość
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
C/C++
#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.

C/C++
#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.

P-163973
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ę.
P-163979
mateczek
» 2017-08-14 21:44:45
masz poprawiony kod
C/C++
#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 }; //---------------------->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>tutaj
    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++; //------------------------------>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>tutaj
        }
    }
    cout << "twoje liczby zostaly wylosowane : " << endl;
    for( int i = 0; i < 6; i++ ) {
        cout << tablica[ i ] << ", " << endl;
    }
   
    return 0;
}

albo wersja bez zerowania tablicy

C/C++
#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.
P-163983
« 1 »
  Strona 1 z 1