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

[ lekcja 21 ]Problemik z losowanie bez powtórzeń

Ostatnio zmodyfikowano 2013-06-28 15:51
Autor Wiadomość
Proleks
Temat założony przez niniejszego użytkownika
» 2013-06-27 17:48:27
Hmm jak napiszę w kodzie samo
C/C++
return wczytane; // edit
 to się nie skompiluje :
wistu\Pulpit\C++\uczymyreturn1.cpp|17|error: invalid conversion from 'int*' to 'int'|

P-86377
pekfos
» 2013-06-27 17:49:33
Bo wczytane to tablica, a zwracasz liczbę (jedną).
P-86378
Proleks
Temat założony przez niniejszego użytkownika
» 2013-06-27 17:53:13
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int wczytujemy( int wczytane[], int a )
{
    int licznik = 0;
    cout << "Podaj 3 liczby " << endl;
    do
    {
        cin >> wczytane[ licznik ];
        licznik++;
       
    } while( licznik < 3 );
   
    return wczytane;
}

int wylosuj_liczby()
{
    return( rand() % 3 );
}

bool czybyla( int ile, int tablica[], int licznik )
{
    if( licznik <= 0 )
         return false;
   
    int i = 0;
    do
    {
        if( tablica[ i ] == ile )
       
             i++;
       
        return true;
    } while( i < licznik );
   
    return false;
}
int main()
{
    srand( time( NULL ) );
    int wczytane[ 3 ];
    int wylosowane = 0;
    wczytujemy( wczytane, 3 );
    int ile[ 0 ]; // Myślałem nad tym by to usunąć i zamiast tego ,żeby było  int wczytane[ 3 ]; ale nw :p
    int licznik = 0;
   
    do
    {
        wylosowane = wczytane[ wylosuj_liczby() ];
        if( czybyla( wylosowane, ile, licznik ) );
       
        {
            cout << ile[ licznik ] << " , ";
            licznik++;
        }
    } while( licznik < 2 );
   
    system( "pause" );
    return 0;
}
[ cpp ]

chyba na dzisiaj nie mam łba do tego :/ ( dać sobie spokój ? )
P-86379
jankowalski25
» 2013-06-27 17:57:40
P-86380
Proleks
Temat założony przez niniejszego użytkownika
» 2013-06-27 22:17:57
Przeczytałem na nowo od tego momentu skąd podał administrator wyżej i napisałem taki kod prawie działa , lecz po takie mam błedy :
2 razy każe mi wpisywać liczby i na końcu mi nie losuje dwóch liczb tylko wyświetla 1 z góry i podaje jako drugą zawsze 1 :/

Oto kodzik :
Mam nadzieje ,że jest owiele lepszy od tego pierwszego :p
Chociaż możliwe ,że skopałem coś z funkcją
int losuj()
 ,ponieważ ją pisałem jako ( jakby to nazwać ) wymysł dlaczego mi nie losowało liczby na końcu ale nadal nie działa :/
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int podaj( int podaj[] )
{
    int licznik = 0;
    cout << "Podaj 3 liczby " << endl;
    do
    {
       
        cin >> podaj[ licznik ];
        licznik++;
       
    } while( licznik < 3 );
   
    return false;
}

int czybyla( int iliczba, int tab[], int ile )
{
    if( ile <= 0 )
         return false;
   
    int licznik = 0;
    do
    {
        if( tab[ licznik ] == iliczba )
             return true;
       
        licznik++;
    } while( licznik < ile );
   
    return false;
}

int losuj()
{
    return(( rand() % 3 ) + 1 );
}
int main()
{
    srand( time( NULL ) );
    int podan[ 3 ];
    int wybrane = 0;
    do
    {
        podaj( podan );
        int podane = losuj();
        if( czybyla( podane, podan, wybrane ) );
       
        podan[ wybrane ] = podane;
        wybrane++;
    } while( wybrane < 2 );
   
    wybrane = 0;
   
    do
    {
        cout << podan[ wybrane ] << " ,  ";
        wybrane++;
    } while( wybrane < 2 );
   
}
P-86406
Geniusz
» 2013-06-27 23:01:04
Umieściłeś wywołanie funkcji "podaj( int podaj[] )" w pętli, która się wykonuje dwa razy.
C/C++
do
{
    podaj( podan );
    int podane = losuj();
    if( czybyla( podane, podan, wybrane ) );
   
    podan[ wybrane ] = podane;
    wybrane++;
} while( wybrane < 2 );

W rezultacie kompilator poprosi cię dwukrotnie o podanie trzech liczb.

#edit1 I nie losuje Ci trzech liczb, ponieważ ustawiłeś, że pętla do...while przerywa się gdy "wybrane" nie jest mniejsze od 2, więc po wylosowaniu dwóch liczb, pętla się przerywa.
} while( wybrane < 2 );


#edit2 Po warunku w if nie stawia się średnika
if( czybyla( podane, podan, wybrane ) );


#edit3 Ogólnie to bezsensu jest to podawanie liczb, skoro i tak do tablicy przypisujesz całkiem inne liczby, wylosowane funkcją "losuj()"
C/C++
//...
int podane = losuj();
if( czybyla( podane, podan, wybrane ) );

podan[ wybrane ] = podane;
//...
P-86410
Proleks
Temat założony przez niniejszego użytkownika
» 2013-06-27 23:26:17
Ok przeniosłem
podaj( podan );
 usunąłem średnik po if , ale nie zrozumiałeś mnie do końca ja chce żeby pokazywały się dwie liczby tylko chodzi o to by były one losowane z 3 co podał ktoś tzn :
Ktoś podał liczby np. :
3
5
7

I teraz chce zrobić tak by program losował dwie liczby z tych trzech które mają zostać wpisane na sam koniec :p o coś takiego mi chodzi jak się wyraziłem nie jasno to sory .

// Edit : wywaliłem ta funkcje
int losuj()
 myślałem ,że będzie ona robiła to co opisałem wyżej  .

mój odświeżony kod :

C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int podaj( int podaj[] )
{
    int licznik = 0;
    cout << "Podaj 3 liczby " << endl;
    do
    {
       
        cin >> podaj[ licznik ];
        licznik++;
       
    } while( licznik < 3 );
   
    return false;
}

int czybyla( int iliczba, int tab[], int ile )
{
    if( ile <= 0 )
         return false;
   
    int licznik = 0;
    do
    {
        if( tab[ licznik ] == iliczba )
             return true;
       
        licznik++;
    } while( licznik < ile );
   
    return false;
}


int main()
{
    srand( time( NULL ) );
    int podan[ 3 ];
    int wybrane = 0;
    int podane = podaj( podan );
   
    do
    {
        if( czybyla( podane, podan, wybrane ) )
       
             podan[ wybrane ] = podane;
       
        wybrane++;
    } while( wybrane < 2 );
   
    wybrane = 0;
   
    do
    {
        cout << podan[ wybrane ] << " ,  ";
        wybrane++;
    } while( wybrane < 2 );
   
}
P-86411
Geniusz
» 2013-06-27 23:55:24
W funkcji "podaj( int podaj[] )" to zwracanie false możesz spokojnie usunąć, bo i tak nie ma to żadnego wpływu na działanie programu a typ zwracanego rezultatu zamienić na void.

Tą losującą funkcję wstaw, ale to co zwraca przypisuj nie do tablicy, tylko do zmiennej określającej element tablicy.

Czyli coś w tym stylu :
C/C++
do
{
    wybrane = losuj();
    cout << podan[ wybrane ] << " ,  ";
    wybrane++;
} while( wybrane < 2 );

P-86413
1 2 « 3 » 4 5 6
Poprzednia strona Strona 3 z 6 Następna strona