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

Zadanie domowe rozdział 21.

Ostatnio zmodyfikowano 2015-02-23 23:01
Autor Wiadomość
Czdum
Temat założony przez niniejszego użytkownika
Zadanie domowe rozdział 21.
» 2015-02-16 15:32:15
Witam serdecznie. Otóż starając się wykonać zadanie domowe przykład 2 z tego rozdziału natknąłem się na pewien problem. Chcąc wylosować liczbę z utworzonej wcześniej tablicy napotykam błąd w czasie kompilacji,
too many arguments to function int rand
 Rozumiem o co chodzi kompilatorowi, ale jak zwalczyć ten problem? poniżej kod źródłowy programu:
C/C++
#include <ctime>
#include <iostream>
#include <cstdlib>
using namespace std;
int wpisywanie()
{
    int a;
    bool poprawnosc;
    do
    {
        cout <<( "Wpisz liczbe" ) << endl;
        cin >> a;
        poprawnosc = cin.good();
        cin.clear();
        cin.sync();
    } while( poprawnosc == 0 );
   
    return a;
}
void wpisywanieDoTablicy( int tab[], int ile )
{
    int i = 0;
    do
    {
        tab[ i ] = wpisywanie();
        i++;
    } while( i < ile );
   
}
void wypisanieTablicy( int tab[], int ile )
{
    int i = 0, b = 1;
    do
    {
        cout <<( "W tablicy pod numerem " ) << b <<( " jest " ) << tab[ i ] << endl;
        i++;
        b++;
    } while( i < ile );
   
}
bool czybylawylosowana( int tablicaZwpisanymi[], int tablicaZwylosowanymi[], int ilewpisanych, int ilewylosowanych )
{
    int a = 0, i = 0;
    if( ilewylosowanych <= 0 )
         return false;
   
    do
    {
        if( tablicaZwylosowanymi[ i ] == tablicaZwpisanymi[ a ] )
             return true;
       
        do
        {
            if( tablicaZwylosowanymi[ i ] == tablicaZwpisanymi[ a ] )
                 return true;
           
            a++;
        } while( a < ilewpisanych );
       
        i++;
    } while( i < ilewylosowanych );
   
    return false;
}
int losowanie( int tab[], int ileliczb )
{
    int i = 0;
    int tablica[ 8 ];
    do
    {
        tablica[ i ] =( rand( tab ) );
        i++;
    } while( i < ileliczb );
   
    return tablica[ i ];
}

int main()
{
    srand( time( NULL ) );
    int wpisaneLiczby[ 10 ];
    int wylosowaneLiczby[ 8 ];
    int i = 0;
    wpisywanieDoTablicy( wpisaneLiczby, 10 );
    wypisanieTablicy( wpisaneLiczby, 10 );
    do
    {
        wylosowaneLiczby[ i ] = losowanie( wpisaneLiczby, 8 );
        czybylawylosowana( wpisaneLiczby, wylosowaneLiczby, 10, 8 );
        i++;
    } while( i < 8 );
   
    wypisanieTablicy( wylosowaneLiczby, 8 );
    system( "PAUSE" );
    return EXIT_SUCCESS;
}
P-126675
darko202
» 2015-02-17 10:28:29
spójrz na
http://cpp0x.pl/dokumentacja​/standard-C/rand/580

C/C++
// składnia
#include <cstdlib>
int rand();

w twoim kodzie użyłeś  rand(tab);
stąd komunikat
uzyskanie liczby w określonym zakresie znajdziesz na
http://cpp0x.pl/kursy/Kurs-C++​/Poziom-2​/Pseudolosowe-liczby-calkowite​/290
P-126699
Czdum
Temat założony przez niniejszego użytkownika
» 2015-02-17 12:45:47
Dobrze, ale w tym zadaniu ewidentnie nie mamy losowania z podanego zakresu, tylko z całkowicie losowych liczb wpisanych przez użytkownika, przez co tamta lekcja nijak się ma do tego co ma być wykonane w zadaniu.

Edit:
Okej teraz wiem jak to powinno wyglądać
C/C++
int losowanie( int tab[], int ileliczb )
{
    return tab[ rand() % ileliczb ];
}

Edit2@:
Jednak dalej mój program nie działa. Wpisuje do tablicy, następuje losowanie elementów z tablicy, ale niestety z losowaniem. Czy ktoś widzi może gdzie jest problem?
C/C++
#include <ctime>
#include <iostream>
#include <cstdlib>
using namespace std;
int wpisywanie()
{
    int a;
    bool poprawnosc;
    do
    {
        cout <<( "Wpisz liczbe" ) << endl;
        cin >> a;
        poprawnosc = cin.good();
        cin.clear();
        cin.sync();
    } while( poprawnosc == 0 );
   
    return a;
}
void wpisywanieDoTablicy( int tab[], int ile )
{
    int i = 0;
    do
    {
        tab[ i ] = wpisywanie();
        i++;
    } while( i < ile );
   
}
void wypisanieTablicy( int tab[], int ile )
{
    int i = 0, b = 1;
    do
    {
        cout <<( "W tablicy pod numerem " ) << b <<( " jest " ) << tab[ i ] << endl;
        i++;
        b++;
    } while( i < ile );
   
}
bool czybylawylosowana( int tab1[], int tab2[], int ileliczb )
{
    if( ileliczb <= 0 )
         return false;
   
    int i = 0, a = 0;
    do
    {
        if( tab1[ i ] == tab2[ a ] )
             return true;
       
        do
        {
            if( tab1[ i ] == tab2[ a ] )
                 return true;
           
            a++;
        } while( a < ileliczb );
       
        i++;
    } while( i < ileliczb );
   
    return false;
}
int losowanie( int tab[], int ileliczb )
{
    return tab[ rand() % ileliczb ];
}

int main()
{
    srand( time( NULL ) );
    int wpisaneLiczby[ 10 ];
    int wylosowaneLiczby[ 8 ];
    int tab[ 8 ];
    int i = 0, a = 0;
    wpisywanieDoTablicy( wpisaneLiczby, 10 );
    wypisanieTablicy( wpisaneLiczby, 10 );
    do
    {
        wylosowaneLiczby[ i ] = losowanie( wpisaneLiczby, 8 );
        if( czybylawylosowana( wylosowaneLiczby, wpisaneLiczby, 8 ) == false );
       
        { tab[ a ] = wylosowaneLiczby[ i ];
            a++;
            i++;
        }
    } while( i < 8 );
   
    wypisanieTablicy( tab, 8 );
    system( "PAUSE" );
    return EXIT_SUCCESS;
}
P-126708
jasiu
» 2015-02-20 22:31:36
Udało mi się uruchomić poprawnie działający program z Twoimi funkcjami ale zrobiłem kilka drobnych poprawek.

C/C++
int losowanie( int tab[], int ileliczb )
{
    return tab[ rand() % ileliczb ];
}

...

losowanie( wpisaneLiczby, 8 );

Masz wylosować 8 liczb (8 razy wykonać losowanie) z DZIESIĘCIO elementowej tablicy, a nie z pierwszych 8 elementów tej dziesięcio elementowej tabilcy. Mam nadzieję, że nie zamieszałem za bardzo.

C/C++
if( czybylawylosowana( wylosowaneLiczby, wpisaneLiczby, 8 ) == false );

{ tab[ a ] = wylosowaneLiczby[ i ];
    a++;
    i++;
}

To napisze wprost, tu źle wstawiony średnik po warunku if. Osobiście myślałem, że kompilator wykryje niewłaściwe zastosowanie znaków { oraz }. W Twoim kodzie tak zapisany warunek się nie spełni ale mimo to kolejne polecenia są wykonane, między innymi dlatego pętla zdołała się zakończyć i program dochodził do końca.

czybylawylosowana( wylosowaneLiczby, wpisaneLiczby, 8 )

Tą funkcją porównujesz wszystkie dotychczas wylosowane do wszystkich liczb podanych przez użytkownika, jeśli któraś jest taka sama to Twoja tablica tab[] nie otrzyma nowej wartości ani też nie zwiększy się jej indeks (przez co Twoja pętla nigdy się nie skończy). Spróbuj porównać jedną aktualnie wylosowaną liczbę do tablicy która już zawiera wylosowane, nie powtarzające się liczby. Ja wykorzystałem do tego Twoją funkcje czybylawylosowana() ale zmieniłem argumenty.
P-126919
Czdum
Temat założony przez niniejszego użytkownika
» 2015-02-23 20:03:01
Jasiu na wstępie chciałbym podziękować za odpowiedź. Zgodnie z Twoimi wskazówkami spróbowałem zmienić kod źródłowy programu i okazało się że idzie mi to! Program wygląda u mnie następująco:
C/C++
#include <ctime>
#include <iostream>
#include <cstdlib>
using namespace std;
int wpisywanie()
{
    int a;
    bool poprawnosc;
    do
    {
        cout <<( "Wpisz liczbe" ) << endl;
        cin >> a;
        poprawnosc = cin.good();
        cin.clear();
        cin.sync();
    } while( poprawnosc == 0 );
   
    return a;
}
void wpisywanieDoTablicy( int tab[], int ile )
{
    int i = 0;
    do
    {
        tab[ i ] = wpisywanie();
        i++;
    } while( i < ile );
   
}
void wypisanieTablicy( int tab[], int ile )
{
    int i = 0, b = 1;
    do
    {
        cout <<( "W tablicy pod numerem " ) << b <<( " jest " ) << tab[ i ] << endl;
        i++;
        b++;
    } while( i < ile );
   
}
int losowanie( int tab[], int ileliczb )
{
    int wylosowana_liczba;
    wylosowana_liczba = tab[ rand() % ileliczb ];
    return wylosowana_liczba;
}
bool czybylawylosowana( int tab[], int ilejuzwpisanych, int wylosowanaliczba )
{
    if( ilejuzwpisanych <= 0 )
         return false;
   
    int i = 0;
    do
    {
        if( wylosowanaliczba == tab[ i ] )
             return true;
       
        i++;
    } while( i < ilejuzwpisanych );
   
    return false;
}
int main()
{
    srand( time( NULL ) );
    int wpisane_liczby[ 10 ];
    int wylosowane_liczby[ 8 ];
    int i = 0;
    int wylosowanaliczba;
    wpisywanieDoTablicy( wpisane_liczby, 10 );
    wypisanieTablicy( wpisane_liczby, 10 );
    do
    {
        wylosowanaliczba = losowanie( wpisane_liczby, 10 );
        cout << wylosowanaliczba << endl; //tylko po to żeby widzieć jaka wylosowal
        if( czybylawylosowana( wylosowane_liczby, i, wylosowanaliczba ) == false )
        { wylosowane_liczby[ i ] = wylosowanaliczba;
            i++;
        }
    } while( i < 8 );
   
    wypisanieTablicy( wylosowane_liczby, 8 );
    system( "PAUSE" );
    return EXIT_SUCCESS;
}
Ale mam jedno pytanie. przy początkowym rozmyślaniu nad ułożeniem rozwiązania tego zadania  w miejsce i w linijce
if( czybylawylosowana( wylosowane_liczby, i, wylosowanaliczba ) == false )
 wpisałem 10, przez co pętla nigdy się nie kończyła. Jest ktoś w stanie może mi powiedzieć czemu tak się działo?
P-127273
jasiu
» 2015-02-23 20:22:48
Nie ma za co:)

C/C++
bool czybylawylosowana( int tab[], int ilejuzwpisanych, int wylosowanaliczba )
.
.
.
do
{
    if( wylosowanaliczba == tab[ i ] )
         return true;
   
    i++;
} while( i < ilejuzwpisanych );


Jeżeli argument 'ilejuzwpisanych' przybierze wartość 10 to pętla będzie zwiekszać 'i' aż do 9 co spowoduje porownanie 'wylosowanaliczba' z 'tab[9]'. Skoro zadeklarowałeś, ze tablica tab składa się z 8 elementów to jej ostatnim elementem jest tab[7] (ilość elementów jest liczona od 0).

P-127278
Czdum
Temat założony przez niniejszego użytkownika
» 2015-02-23 21:23:03
dzięki jeszcze raz;) Bawiąc się tym wcześniejszym programem zauważyłem, że powstaje problem kiedy wpisze się kilka takich samych liczb, więc postanowiłem tak zmodyfikować program, by było to niemożliwe. Kod źródłowy :
C/C++
#include <ctime>
#include <iostream>
#include <cstdlib>
using namespace std;
int wpisywanie()
{
    int a;
    bool poprawnosc;
    do
    {
        cout <<( "Wpisz liczbe" ) << endl;
        cin >> a;
        poprawnosc = cin.good();
        cin.clear();
        cin.sync();
        if( poprawnosc == 0 )
             cout << "Masz wprowadzic liczbe" << endl;
       
    } while( poprawnosc == 0 );
   
    return a;
}
bool czybylawpisana( int wpisanaliczba, int tablicazapisu[], int numerwtablicy )
{
    if( numerwtablicy <= 0 )
         return false;
   
    int i = 0;
    do
    {
        if( wpisanaliczba == tablicazapisu[ i ] )
             return true;
       
        i++;
    } while( i < numerwtablicy );
   
    return false;
}
void wpisywanieDoTablicy( int tab[], int ile )
{
    int i = 0;
    int a;
    do
    {
        tab[ i ] = a = wpisywanie();
        if( czybylawpisana( a, tab, i ) == true )
        {
            cout << "Wpisana liczba juz sie pojawila, wprowadz inna " << endl;
            i--;
        }
        i++;
    } while( i < ile );
   
}
void wypisanieTablicy( int tab[], int ile )
{
    int i = 0, b = 1;
    do
    {
        cout <<( "W tablicy pod numerem " ) << b <<( " jest " ) << tab[ i ] << endl;
        i++;
        b++;
    } while( i < ile );
   
}
int losowanie( int tab[], int ileliczb )
{
    int wylosowana_liczba;
    wylosowana_liczba = tab[ rand() % ileliczb ];
    return wylosowana_liczba;
}
bool czybylawylosowana( int tab[], int ilejuzwpisanych, int wylosowanaliczba )
{
    if( ilejuzwpisanych <= 0 )
         return false;
   
    int i = 0;
    do
    {
        if( wylosowanaliczba == tab[ i ] )
             return true;
       
        i++;
    } while( i < ilejuzwpisanych );
   
    return false;
}
int main()
{
    srand( time( NULL ) );
    int wpisane_liczby[ 10 ];
    int wylosowane_liczby[ 8 ];
    int i = 0;
    int wylosowanaliczba;
    wpisywanieDoTablicy( wpisane_liczby, 10 );
    wypisanieTablicy( wpisane_liczby, 10 );
    cout << "Teraz nastepuje losowanie" << endl;
    do
    {
        wylosowanaliczba = losowanie( wpisane_liczby, 10 );
        //cout << wylosowanaliczba << endl; //tylko po to żeby widzieć jaka wylosowal
        if( czybylawylosowana( wylosowane_liczby, i, wylosowanaliczba ) == false )
        { wylosowane_liczby[ i ] = wylosowanaliczba;
            i++;
        }
    } while( i < 8 );
   
    wypisanieTablicy( wylosowane_liczby, 8 );
    system( "PAUSE" );
    return EXIT_SUCCESS;
}
jeżeli ktoś jeszcze by zauważył tu coś nielogicznego/nieprawidłowego to niech da znać ;)
P-127285
jasiu
» 2015-02-23 23:01:19
C/C++
int i = 0, b = 1;
do
{
    cout <<( "W tablicy pod numerem " ) << b <<( " jest " ) << tab[ i ] << endl;
    i++;
    b++;
} while( i < ile );


To nie błąd ani nic nielogicznego/nieprawidłowego ale możesz zaoszczędzić trochę miejsca pracując na jednej zmiennej.
Wpisz
cout <<( "W tablicy pod numerem " ) << i + 1 <<( " jest " ) << tab[ i ] << endl;
 , a zmienna 'b' nie będzie Ci potrzebna.
P-127294
« 1 »
  Strona 1 z 1