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

Rozdzial 21 Loowanie bez powtorzen

Ostatnio zmodyfikowano 2017-03-25 16:23
Autor Wiadomość
Chowan
Temat założony przez niniejszego użytkownika
Rozdzial 21 Loowanie bez powtorzen
» 2017-03-25 15:18:14
Dlaczego wyrzuca mi dane z poza przedziału?

C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
//1. Losujê liczbê z przedzia³u od 1 do 10;
//2. Sprawdzam, czy wylosowana liczba przypadkiem wczeœniej ju¿ nie pad³a;
//3. Je¿eli wylosowana liczba nie pad³a zapisujê j¹ do puli liczb wylosowanych i zwiêkszam liczbê wylosowanych liczb.
//4. Je¿eli wylosowana liczba pad³a wracam do kroku 1.
//5. Sprawdzam, czy wylosowa³em ju¿ 5 liczb. Je¿eli nie - przechodzê do punktu 1

int losowanie()
{
    return( rand() % 10 ) + 1;
}
bool sprawdzanie( int liczba, int tablica[], int ile_liczb )
{
    if( ile_liczb <= 0 )
         return false;
   
    int i = 0;
    while( i < ile_liczb )
    {
        if( tablica[ i ] == liczba )
             return false;
       
        i++;
    }
   
    return true;
}
int main()
{
    srand( time( NULL ) );
    int tablica[ 5 ];
    for( int i = 0; i < 5; i++ )
    {
        int a = losowanie();
        if( sprawdzanie( a, tablica, i ) == true )
        {
            tablica[ i ] = a;
        }
    }
    for( int i = 0; i < 5; i++ )
    {
        cout << tablica[ i ] << endl;
    }
    return 0;
   
   
   
}
[ \c pp ]
P-159388
mateczek
» 2017-03-25 15:42:15
po poprawkach
C/C++
#include <iostream>
#include <ctime>
using namespace std;
int losowanie()
{
    return( rand() % 10 ) + 1;
}
bool sprawdzanie( int liczba, int tablica[], int ile_liczb ) // ta funkcja przekombinowana i generowała błąd
{
    for( int i = 0; i < ile_liczb; i++ ) {
        if( tablica[ i ] == liczba ) return false;
       
    }
    return true;
}
int main()
{
    constexpr int rozmiar = 10;
    srand( time( NULL ) );
    int tablica[ rozmiar ];
    for( int i = 0; i < rozmiar; )
    {
        int a = losowanie();
        if( sprawdzanie( a, tablica, i ) == true )
        {
            tablica[ i ] = a;
            i++; // tutaj poprawiłem zwiększaj indeks gdy zapis poprawny
        }
    }
    for( int i = 0; i < rozmiar; i++ )
    {
        cout << tablica[ i ] << endl;
    }
    return 0;
}
P-159389
Chowan
Temat założony przez niniejszego użytkownika
» 2017-03-25 16:08:53
ta funkcja przekombinowana to z kursu bezpośrednio, ale dzięki bo ta Twoja dużo czytelniejsza. A mogę wiedzieć dlaczego zamieniłeś i<5 na i<rozmiar??
P-159390
mateczek
» 2017-03-25 16:23:56

A mogę wiedzieć dlaczego zamieniłeś i<5 na i<rozmiar??
Aby sprawdzić czy wylosuje dziesięć z dziesięciu. Chodziło mi o ostatnie losowanie, które musi wykonać się tyle razy aż w końcu trafi na ostatnią wolną cyfrę. Taki test.
Wszystko po to by w jednym miejscu zmienić ilość losowanych liczb.


ta funkcja przekombinowana to z kursu bezpośrednio
OK moje niedopatrzenie.
C/C++
bool sprawdzanie( int liczba, int tablica[], int ile_liczb )
{
    if( ile_liczb <= 0 )
         return true; //tu był błąd
   
    int i = 0;
    while( i < ile_liczb )
    {
        if( tablica[ i ] == liczba )
             return false;
       
        i++;
    }
   
    return true;
}
P-159391
« 1 »
  Strona 1 z 1