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

Losowanie bez powtórzeń, problem.

Ostatnio zmodyfikowano 2014-02-23 12:59
Autor Wiadomość
Goku145
Temat założony przez niniejszego użytkownika
Losowanie bez powtórzeń, problem.
» 2014-02-13 19:22:38
Witam, mam problem z pracą domową w lekcji losowanie bez powtórzeń.
Męczyłem się trochę z tym programem. Na początku działało wszystko oprócz losowania liczb ze swoich podanych liczb. Tzn podawałem liczby, ale nie losowało z tablicy, lecz z innego przedziału ( ale powtórzeń nie było :)). Teraz wpadłem na pomysł z tymi indeksami, ale mam problem z tym, że po kompilacji podawanie liczb nie kończy się 3 liczbach, a mogę je podawać w nieskończoność i nie mogę sprawdzić czy to zrobiłem działa.
Mógłby mi ktoś pomóc z tym problemem? Wytknąć błędy lub po prostu doradzić coś...
Czekam na jakieś odpowiedzi.
Pozdrawiam



C/C++
//============================================================================
// Name        : LosowanieBezPowtorzenCw.cpp
// Author      : Goku145
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

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

void LiczbyUzytkownika( int t[], int ile ) {
    cout << "Podaj 3 liczby: " << endl;
    for( ile = 0; ile <= 2; ile++ ) {
        cin >> t[ ile ];
    }
}

int wylosuj( int t[] ) {
   
    int indeks =( rand() % 2 ) + 0;
    return 0;
}
int main() {
    srand( time( 0 ) );
    cout << "Program pobiera od uzytkownika 3 liczby, ";
    cout << "a następnie losuje 2 z nich bez powtorzen." << endl;
    int tab[ 2 ];
    int i = 0;
   
    LiczbyUzytkownika( tab, i );
   
    do {
        int liczba = wylosuj( tab );
        if( CzyBylaWylosowana( liczba, tab, i ) == false ) {
            tab[ i ] = liczba;
            i++;
        }
    } while( i < 3 );
   
    i = 0;
    do {
        cout << tab[ i ] << endl;
        i++;
    } while( i < 3 );
   
}[ / i ]
P-104610
alixir
» 2014-02-13 20:09:41
Wytykać to my lubimy :) Ale jak dla mnie to musisz na nowo zastanowić się nad tym co twój program ma osiągnąć.
Ewentualnie pomożemy ci w tym:
- program ma pobrać od użytkownika 3 liczby, czyli musisz mieć zadeklarowaną tablicę do ich przechowywania
a) pobierać najlepiej w pętli bez żadnych dodatkowych warunków (na początek)
- program ma losować 2 liczby z wczytanej tablicy:
a) losuje pierwszą liczbę z tablicy podanej przez użytkownika i zapisuje ją gdzieś ( wydaje mi się że kolejna tablica by się przydała :) )
b) losuje kolejną liczbę i sprawdza czy czasami już wcześniej jej nie wylosował ( przegląda nową tablicę )
c) .. jeśli wylosowana liczba się powtarza, to losuje ponownie ... itd. aż do skutku
- program wyświetla nową tablicę i po sprawie

Powodzenia
P-104612
leon_w
» 2014-02-13 20:14:39
Na początek:
1.
C/C++
tab = liczba;
i++;
powinno być:
C/C++
tab[ i ] = liczba;
i++;
2.
Funkcja "wylosuj(tab)" musi zwracać wartość (tutaj wartość zmiennej "indeks"), bo wkońcu zwracaną wartość przypisujesz do "liczba". Jeśli nic nie zwrócisz, nic nie zostanie przypisane.
3.Wysyłasz do funkcji "wylosuj" adres tablicy, ale nic z tą tablicą nie robisz. Losuj tylko indeks tablicy, po czym podstawiaj wylosowaną liczbę do indeksu.
4.Zapisujesz liczby użytkownika do tablicy i w tej samej tablicy chcesz zapisać wylosowane liczby


ojojoj no tyle jest błędów, że nie wiem czy jest sens dalej je wypisywać.
Proponuję, żebyś napisał cały program od nowa, biorąc pod uwagę w/w zastrzeżenia.

Musisz mieć tablicę na liczby użytkownika, drugą tablicę na wylosowane liczby. Losuj tylko indeks tablicy.
P-104613
Goku145
Temat założony przez niniejszego użytkownika
» 2014-02-23 12:59:33
C/C++
/============================================================================
// Name        : 10Liczb.cpp
// Author      :
// Version     :
// Copyright   : Your copyright notice
// Description : Hello World in C++, Ansi-style
//============================================================================

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int wybierz() {
    int liczba = 0;
    cin >> liczba;
    return liczba;
}

int wylosuj( int wybrane[ 10 ] ) {
    int indeks =( rand() % 10 ) + 0;
    return wybrane[ indeks ];
}

bool sprawdzanie( int liczba, int losowane[ 8 ], int wylosowane ) {
    if( wylosowane <= 0 )
         return false;
   
    int licznik;
    for( licznik = 0; licznik < wylosowane; licznik++ ) {
        if( losowane[ licznik ] == liczba )
             return true;
       
    }
    return false;
}

int main() {
    srand( time( NULL ) );
    int wybrane[ 10 ];
    int losowane[ 8 ];
    int wylosowane = 0;
    int licznik;
   
    cout << "Podaj 10 liczb: " << endl;
    for( licznik = 0; licznik <= 9; licznik++ )
         wybrane[ licznik ] = wybierz();
   
    do {
        int liczba = wylosuj( wybrane );
        if( sprawdzanie( liczba, losowane, wylosowane ) == false )
       
        {
            losowane[ wylosowane ] = liczba;
            wylosowane++;
        }
    } while( wylosowane < 8 );
   
    cout << "Losowanie 8 liczb z 10 wpisanych, bez powtorzen." << endl;
    for( licznik = 0; licznik < 8; licznik++ ) {
        if( losowane[ licznik ] > losowane[ licznik + 1 ] )
             swap( losowane[ licznik ], losowane[ licznik + 1 ] );
       
        cout << losowane[ licznik ] << endl;
    }
   
    return 0;
}
Udało się, ale musiałem zainspirować się trochę innym kodem, więc nie jestem do końca zadowolony, ale działa, o ile nie wpisze się takich samych liczb. Może kiedyś to poprawię.
P-105139
« 1 »
  Strona 1 z 1