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

Lekcja 2.21

Ostatnio zmodyfikowano 2016-08-15 13:25
Autor Wiadomość
chrust
» 2016-08-14 19:21:25
Dopiero się uczę więc już więcej nie będę się udzielał, bo nie wychodzi mi to :D
P-150859
CCbolt
Temat założony przez niniejszego użytkownika
» 2016-08-14 19:25:28
Wynik mi nie wychodzi, randomowe liczby się pojawiają, teraz to pod zgadywanie mi moja nauka podchodzi.
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

bool czyBylaWylosowana( int iLiczba, int tab[], int ile )
{
    if( ile <= 0 )
         return false;
   
    int i = 0;
    do
    {
        if( tab[ i++ ] == iLiczba )
             return true;
       
    } while( i < ile );
   
    return false;
}


void podjaliczbe( int tab2[] )
{
    int i = 0;
    int liczba = 0;
    cout << "Podaj 3 liczby: " << endl;
    do
    {
        cout << "Liczba: ";
        cin >> liczba;
        tab2[ i++ ] = liczba;
    } while( i < 3 );
   
}

int losowanie()
{
    int liczba = rand() % 3;
    return liczba;
}
int main()
{
    srand( time( NULL ) );
    int tab2[ 3 ];
    int tab[ 2 ] = { - 1, - 1 };
    int liczba = 0;
    int i = 0;
    podjaliczbe( tab2 );
   
    do
    {
        int liczba = losowanie();
        if( czyBylaWylosowana( liczba, tab, i ) == false )
             tab[ i++ ] = liczba;
       
    } while( i < 2 );
   
    i = 0;
    do {
        cout << tab[ i++ ] << endl;
    } while( i < 2 );
   
   
    return 0;
   
}
P-150860
carlosmay
» 2016-08-14 19:26:31
Dopiero się uczę więc już więcej nie będę się udzielał, bo nie wychodzi mi to :D
Nie myli się ten, kto nic nie robi.

edit: edytowałem poprzedni post, bo złego for'a skopiowałem.
P-150861
CCbolt
Temat założony przez niniejszego użytkownika
» 2016-08-14 19:34:55
Mam , mam wypisywanie liczb zrypałem, dzięki panowie, wróciłem się do do wypowiedzi z wskazówkami i była jasna odpowiedź.
Jeszcze mam pytanie do douczenia się.
int tab[ 2 ] = { - 1, - 1 };
 stosować ten zapis czy nie? Z tym zapisem jak i bez tego losowanie jest poprawne.


Do kolegi wyżej, pytaj się człowieku, pytaj, jak kto mówią kto pyta nie błądzi ja zadaję tu nieraz głupie pytania ale dostaję odpowiedzi i wiem że coś warto a coś nie warto robić, poza tym poznasz opinie innych odnośnie X działania a to wyjdzie na plus.

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

using namespace std;

bool czyBylaWylosowana( int iLiczba, int tab[], int ile )
{
    if( ile <= 0 )
         return false;
   
    int i = 0;
    do
    {
        if( tab[ i++ ] == iLiczba )
             return true;
       
    } while( i < ile );
   
    return false;
}


void podjaliczbe( int tab2[] )
{
    int i = 0;
    int liczba = 0;
    cout << "Podaj 3 liczby: " << endl;
    do
    {
        cout << "Liczba: ";
        cin >> liczba;
        tab2[ i++ ] = liczba;
    } while( i < 3 );
   
}

int losowanie()
{
    int liczba = rand() % 3;
    return liczba;
}
int main()
{
    srand( time( NULL ) );
    int tab2[ 3 ];
    int tab[ 2 ];
    int liczba = 0;
    int i = 0;
    podjaliczbe( tab2 );
   
    do
    {
        int liczba = losowanie();
        if( czyBylaWylosowana( liczba, tab, i ) == false )
             tab[ i++ ] = liczba;
       
    } while( i < 2 );
   
    i = 0;
    do {
        cout << tab2[ tab[ i++ ] ] << endl;
    } while( i < 2 );
   
   
    return 0;
   
}
P-150862
chrust
» 2016-08-14 19:36:34
Zmien ta linijke:

int liczba = losowanie();

na to:

int liczba = tab2[losowanie()];
P-150863
carlosmay
» 2016-08-14 19:40:39
@Gibas11 dał na to już na to pytanie odpowiedź.
Indeksy zawsze są większe lub równe zeru, dzięki -1 mam pewność że 0 w tablicy będzie wylosowanym indeksem a nie domyślną wartością komórki.

edit:
int liczba = tab2[losowanie()];
Nie bardzo może tak zrobić, bo program losuje indeksy i sprawdza czy indeksy się nie powtarzają.
Pomysł może być dobry, jeśli w kodzie będzie zabezpieczenie, aby użytkownik nie wprowadzał takich samych liczb.
Podanie trzech takich samych liczb spowoduj zapętlenie programu, a my nie wiemy jaki to będą liczby, więc opieramy
swoje działanie o niepowtarzające się indeksy.
P-150864
CCbolt
Temat założony przez niniejszego użytkownika
» 2016-08-14 19:58:57
Z tą wiedzą mogę kombinować jak zabezpieczyć program przed wpisaniem 2 identycznych liczb? Czy to jest jeszcze za ciężkie jak na ten poziom? // To przez mój nawyk typu "a co jeśli?"
P-150866
chrust
» 2016-08-14 22:18:58
Jeśli chodzi o zabezpieczenie. Parę dni już próbuje, to zrobić. Program działa, ale nie do końca spełnia powierzoną funkcję.
Gdy funkcja "sprawdzanie" zwróci 4 razy true, wtedy losuje liczbę przez rand. Mam problem by sprawdzić wylosowaną liczbę przez 'rand', czy już jest w zbiorze wylosowanych i czasem może się powtórzyć. Dzięki za pomoc.
 
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int wczytanie_liczb( int tab[], int przedzial )
{
    int petla = 0;
    do
    {
        cout << "Podaj liczbe: ";
        cin >> tab[ petla ];
        cin.fail();
        if( cin.fail() )
        {
            cout << "Blad! Nie podales liczby!" << endl;
            cin.clear();
            cin.sync();
        }
        else petla++;
       
    }
    while( petla < przedzial );
   
}
bool sprawdzanie( int liczba, int tablica[], int l_wyl )
{
    if( l_wyl <= 0 )
         return false;
   
    int numer_tab = 0;
    do
    {
        if( tablica[ numer_tab++ ] == liczba )
             return true;
       
    }
    while( numer_tab < l_wyl );
   
    return false;
}

int losy( int tab[] )
{
    return rand() % 10;
}

int main()
{
    srand( time( 0 ) );
    int l_powt = 0;
    int l_wylosowanych = 0;
    int ile_wylosowac = 8;
    int zbior_liczb[ 10 ];
    int wylosowane[ 8 ];
    wczytanie_liczb( zbior_liczb, 10 );
    do
    {
        int losowanie = zbior_liczb[ losy( zbior_liczb ) ];
        if( sprawdzanie( losowanie, wylosowane, l_wylosowanych ) == false )
        {
            wylosowane[ l_wylosowanych++ ] = losowanie;
        }
        else
        {
            l_powt++;
            if( l_powt > 3 ) // ochrona przed zawieszeniem
            {
                cout << "Podales za duzo tych samych liczb. Automatyczna zmiana liczby..." << endl;
                wylosowane[ l_wylosowanych++ ] =( rand() % 100 ) + 1;
                l_powt = 0;
            }
        }
    }
    while( l_wylosowanych < ile_wylosowac );
   
    l_wylosowanych = 0;
    do
    {
        cout << "Wybrana liczba: " << wylosowane[ l_wylosowanych++ ] << endl;
    }
    while( l_wylosowanych < ile_wylosowac );
   
    return 0;
}
P-150867
1 2 « 3 » 4
Poprzednia strona Strona 3 z 4 Następna strona