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

Rozdział 21, zadanie o losowaniu bez powtórzeń.

Ostatnio zmodyfikowano 2014-06-03 19:47
Autor Wiadomość
rdh
Temat założony przez niniejszego użytkownika
Rozdział 21, zadanie o losowaniu bez powtórzeń.
» 2014-06-03 19:05:33
Witam, mam problem z zadaniem polegającym na wylosowaniu 5, niepowtarzających się liczb od 1 do 10. W sumie napisałem już program, ale COŚ nie hula. Pierwszą liczbą zawsze jest -2, trzy kolejne są zbyt wysokie, dopiero ostatnia jest w przedziale od 1-10.   Przed rozpoczęciem funkcji "sprawdzanie" zmienna "wylosowana" jest w dobrym przedziale, potem dopiero dzieje się z nią coś dziwnego.. Moglibyście mnie nakierować, gdzie mniej więcej tkwi usterka?:)
C/C++
#include<iostream>
#include<cstdlib>
#include<ctime>
using namespace std;


bool sprawdzanie( int wylosowana, int tablica[], int licznik )
{
   
    int licznikn = 0;
   
    if( licznik == 0 )
         return false;
   
    do {
        if( wylosowana == tablica[ licznikn ] )
             return true;
       
        ++licznikn;
    } while( licznikn < licznik );
   
    return false;
   
}



int main()
{
    srand( time( NULL ) );
   
    int wylosowana;
    int licznik = 0;
    int tablica[ 4 ];
   
   
   
    do {
        do {
            wylosowana =( rand() % 10 ) + 1;
            sprawdzanie( wylosowana, tablica, licznik );
        } while( sprawdzanie( wylosowana, tablica, licznik ) == 1 );
       
        wylosowana = tablica[ licznik ];
       
        ++licznik;
    } while( licznik < 5 );
   
   
   
   
    licznik = 0;
    cout << "wylosowane liczby to: " << endl;
    do {
        cout << licznik + 1 << ".  " << tablica[ licznik ] << endl;
        ++licznik;
       
       
    } while( licznik < 5 );
   
   
   
    return 0;
}


TAAK.. 5 min po utworzeniu tematu wpałem na to jak naprawić... Sory za zamieszanie - można usunąć temat ;D
P-111376
PaSaSaP
» 2014-06-03 19:22:41
sprawdzanie( wylosowana, tablica, licznik );

Co powyższa linijka robi w kodzie? Zostaje wyliczone wyrażenie i nie korzystasz z niego. Funkcja zwraca pewną wartość, z której nie korzystasz. Poniżej znajduje się takie samo wywołanie funkcji jako warunek. Inna sprawa: funkcja zwraca wartość typu bool, porównujesz ją ze stałą typu int. bool zostanie rzutowany na int, ale to taki szczegół. Losujesz 5 elementów, ale deklarujesz tablicę przechowującą wylosowane wartości w tablicy 4-elementowej. int tab[4]; oznacza zadeklarowanie miejsca dla czterech elementów, przy czym indeksowanie rozpoczyna się od zera, nie od jedynki. Na indeksach poprawnie operujesz. Najważniejsze to to, że operator przypisania działa inaczej niż tobie się wydaje, mianowicie przypisuje wartość znajdującą się po prawej stronie znaku do l-wartości znajdującej się po lewej stronie znaku. Nie inicjowałeś tablicy żadnymi danymi, więc znajdują się w niej jakieś śmieciowe wartości. Wystarczy zmienić kolejność przy tym operatorze i będzie działało.
P-111377
rdh
Temat założony przez niniejszego użytkownika
» 2014-06-03 19:47:59
Faktycznie, teraz widzę te niedociągnięcia o których mówisz. Wynikają oczywiście z tego, że nie jestem oswojony z tematem i dopiero raczkuję w C++ ;D Błędem powodującym to wszystko oczywiście było to, że przypisywałem wartość tablicy do liczby wylosowanej a nie na odwrót. Dzięki :)
P-111380
« 1 »
  Strona 1 z 1