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

Rozdział 21. Problem z zadaniem

Ostatnio zmodyfikowano 2016-07-13 22:41
Autor Wiadomość
neferx
Temat założony przez niniejszego użytkownika
Rozdział 21. Problem z zadaniem
» 2016-07-13 16:26:30
Mam problem z zadaniem z 21 rozdziału. Udało mi się napisać coś takiego, ale program mimo wszystko losuje liczby, które się powtarzają, a ja nie mogę dojść jak temu zapobiec.
C/C++
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;

int losowanie()
{
    return( rand() % 9 + 1 );
}

bool sprawdzenie( int * liczby, int ktora, bool abc )
{
    for( int i = 0; i < 5; i++ )
    {
        if( liczby[ ktora ] == liczby[ i ] )
        {
            return abc = true;
        }
    }
    ktora++;
    return abc = false;
}

int main()
{
    srand( time( 0 ) );
    bool abc = false;
    int wylosowane[ 5 ];
    int ktora = 0;
   
    for( ktora; ktora < 5; ktora++ )
    {
        do {
            abc = sprawdzenie( wylosowane, ktora, abc );
            if( abc == true )
            {
                wylosowane[ ktora ] = losowanie();
            }
        } while( abc == false );
       
    }
   
    for( int i = 0; i < 5; i++ )
    {
        cout << wylosowane[ i ] << endl;
    }
   
    return 0;
}
P-149904
marcolo2307
» 2016-07-13 18:03:13
1. Dlaczego deklarujesz
ktora
 przed for, skoro i tak z niej później nie korzystasz? Powinieneś mieć chociaż ostrzeżenie, że
for( ktora;...)
 nie ma efektu.
2.
return true
 albo
return false
. Zmiana wartości
abc
 i tak ci nic nie da bo to kopia, a nie oryginał.
3. To samo ze zmienną
ktora
. W funkcji sprawdz inkrementujesz jej kopię, a nie ją samą. Dodatkowo potem inkrementujesz ją w pętli w mainie, tak więc coś pominiesz. Poczytaj sobie o referencjach.
4. W funkcji sprawdz robisz coś w stylu:
C/C++
int a = 0;
if( tab[ a ] ==[ tab[ 0 ] )
. Popraw to.
5. Popraw co napisałem wyżej i spróbuj jeszcze raz napisać main'a.
P-149908
neferx
Temat założony przez niniejszego użytkownika
» 2016-07-13 19:03:51
Czy teraz punkty 1-4 są dobrze?
C/C++
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;

int losowanie()
{
    return( rand() % 9 + 1 );
}

bool sprawdzenie( int * liczby, int ktora, bool abc, int i )
{
    if( liczby[ ktora ] == liczby[ i ] )
    {
        return true;
    }
    else
    {
        return false;
    }
   
}

int main()
{
    srand( time( 0 ) );
    bool abc = false;
    int wylosowane[ 5 ];
   
    for( int ktora = 0; ktora < 5; ktora++ )
    {
        do {
            for( int i = 0; i < 5; i++ )
            {
                abc = sprawdzenie( wylosowane, ktora, abc, i );
            }
            if( abc == true )
            {
                wylosowane[ ktora ] = losowanie();
            }
        } while( abc == false );
       
    }
   
    for( int i = 0; i < 5; i++ )
    {
        cout << wylosowane[ i ] << endl;
    }
   
    return 0;
}
P-149912
marcolo2307
» 2016-07-13 19:22:37
if( wylosowane[ ktora ] == wylosowane[ i ] )
 zwróci
true
, jeśli wywołasz ją dla
i == ktora
.
Poprzednia funkcja do sprawdzania była nawet OK, tylko musisz dodać ten warunek i usunąć z argumentów
bool abc
.
Pętla wykonuje się tak długo, jak spełniony jest warunek.
Punkt 4 się nie zmienił. Wystarczy w
if
 dodać jeszcze jeden warunek do pierwszej wersji
sprawdzenie
 (po poprawkach, które opisałem w punktach 2. i 3.).
Co do main'a, to podpowiem Ci, że musisz losować tak długo, dopóki na nowo wylosowana liczba nie zwróci ci
abc == false
.
P-149914
neferx
Temat założony przez niniejszego użytkownika
» 2016-07-13 20:35:50
C/C++
bool sprawdzenie( int * wylosowane, int ktora )
{
    for( int i = 0; i < 5; i++ )
    {
        if( wylosowane[ ktora ] == wylosowane[ i ] )
        {
            if( wylosowane[ ktora ] == wylosowane[ ktora ] )
            {
               
            }
            else
            {
                return true;
            }
           
        }
    }
    return false;
}

Teraz jesli np.
wylosowane[ 0 ]
 porowna sie do
wylosowane[ 0 ]
 to nie zwroci prawdy, dobrze rozumiem?
P-149919
marcolo2307
» 2016-07-13 21:03:19
if( wylosowane[ ktora ] == wylosowane[ ktora ] )
 zwróci zawsze prawdę. Do warunku pierwszego if'a dopisz tylko
&& ktora != i
 i jeśli to prawda, zwróć prawdę. Dzięki temu masz gwarancję, że nie pozostaną porównane te same indeksy.
P-149923
neferx
Temat założony przez niniejszego użytkownika
» 2016-07-13 21:17:31
Niemożliwe :o! Wygląda na to, że działa.

C/C++
#include <iostream>
#include <ctime>
#include <cstdlib>
using namespace std;

int losowanie()
{
    return( rand() % 9 + 1 );
}

bool sprawdzenie( int * wylosowane, int ktora )
{
    for( int i = 0; i < 5; i++ )
    {
        if( wylosowane[ ktora ] == wylosowane[ i ] && ktora != i )
        {
           
            return true;
        }
       
    }
    return false;
}

int main()
{
    srand( time( 0 ) );
    bool nowaliczbatest;
    int wylosowane[ 5 ];
   
    for( int ktora = 0; ktora < 5; ktora++ )
    {
        wylosowane[ ktora ] = losowanie();
        nowaliczbatest = sprawdzenie( wylosowane, ktora );
        if( nowaliczbatest == true )
        {
            do
            {
                wylosowane[ ktora ] = losowanie();
                nowaliczbatest = sprawdzenie( wylosowane, ktora );
            } while( nowaliczbatest == true );
           
        }
       
    }
   
   
    for( int i = 0; i < 5; i++ )
    {
        cout << wylosowane[ i ] << endl;
    }
   
    return 0;
}
P-149925
marcolo2307
» 2016-07-13 21:23:31
Tego if'a możesz usunąć, do while zadziała tak samo. I zamknij temat.
P-149926
« 1 » 2
  Strona 1 z 2 Następna strona