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

Praca domowa 21 rodział - Losowanie bez powtórzeń

Ostatnio zmodyfikowano 2016-12-08 13:41
Autor Wiadomość
polka260
Temat założony przez niniejszego użytkownika
Praca domowa 21 rodział - Losowanie bez powtórzeń
» 2016-11-23 21:52:46
Mam taki mały problemik. To mój kod:
C/C++
/*Napisz program, który wczyta 3 liczby podane przez użytkownika do tablicy, a następnie wylosuje 2 z nich bez powtórzeń.
Wynik wypisz na ekran. Postaraj się napisać ten program w oparciu o funkcje.

1.Uzytkownik wpisuje liczbe, trafia ona do tablicy. x3
2.Program losuje dwie liczby z tablicy...
3. ...bez powtorzen.*/

#include <iostream>
#include <cstdlib>
#include <ctime>
#include <conio.h>
using namespace std;

bool czy_nalezy_do_glownej_tabeli( int liczba, int tab[] )
{
    int i = 0;
    do
    {
        if( liczba != tab[ i ] ) return false;
       
        if( liczba == tab[ i ] ) return true;
       
        i++;
    }
    while( i < 3 );
   
    return false;
}

bool czy_bylo( int liczba, int tab[] )
{
    int i = 0;
    do
    {
        if( liczba != tab[ i ] ) return true;
        else i++;
       
    }
    while( i < 2 );
   
    return false;
}


int wczytywanie( int tab[], int ile )
{
    int i = 0;
    do
    {
        cout << "Wprowadz liczbe z przedzialu 1-10: " << endl;
        int a;
        cin >> a;
        if( a > 0 && a < 11 )
        {
            tab[ i ] = a;
            i++;
        }
        cin.clear();
        cin.sync();
    }
    while( i < ile );
   
    return tab[ i ];
}


int main()
{
    srand( time( NULL ) );
   
   
    int glowna_tablica[ 3 ];
    int wynik_tablica[ 2 ];
    int wynik;
    wczytywanie( glowna_tablica, 3 );
    cout << "Glowna tablica to " << endl;
    int i = 0;
    do
    {
        cout << glowna_tablica[ i ] << endl;
        i++;
    }
    while( i < 3 );
   
    //Sprawdzenie za pomoca boola czy liczba juz byla:
    i = 0;
    do
    {
        wynik =( rand() % 10 ) + 1;
        cout << "Wylosowano " << wynik << endl; //Losowanie liczby 1-10
        if(( czy_nalezy_do_glownej_tabeli( wynik, glowna_tablica ) == true ) &&( czy_bylo( wynik, wynik_tablica ) == false ) )
        {
            cout << "Wynik nalezy do tabeli i nie bylo go w wnikach.\n";
            wynik_tablica[ i ] = wynik;
            i++;
        }
    }
    while( i < 2 );
   
    i = 0;
    cout << "Wylosowane liczby to:\n";
    do
    {
        cout << wynik_tablica[ i ] << endl;
        i++;
    }
    while( i < 2 );
   
    return 0;
}

Wiem, że chaotycznie napisane, poprawię to jak tylko wszystko będzie dobrze działać :)
Prawie wszystkie cout'y są wypisane dla pomocy (oczywiście potem uproszczę), dzięki czemu widzę, że program nie działa od tego momentu:
C/C++
if(( czy_nalezy_do_glownej_tabeli( wynik, glowna_tablica ) == true ) &&( czy_bylo( wynik, wynik_tablica ) == false ) )
Wydaje mi się, że problem jest w
bool czy_bylo
, bo kiedy wcześniej był tylko
bool czy_nalezy_do_glownej_tabeli
 wszytsko było w porządku.
Jakieś sugestie? :D
P-154064
karambaHZP
» 2016-11-23 23:53:37
C/C++
do
{
    if( liczba != tab[ i ] ) return false;
   
    if( liczba == tab[ i ] ) return true;
   
    i++;
}
while( i < 3 );
W tej pętli masz skopaną logikę. Przez te instrukcje warunkowe nic nie przechodzi i pętla kończy działanie na pierwszym obiegu.
Pomyśl: jeśli liczba jest równa to wyjdź z true, jeśli liczba jest różna to wyjdź z false.
Na tym koniec, bo liczba jest albo nie jest równa.
P-154067
Dither
» 2016-11-27 15:59:05
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
int losuj( int tablica[], int ile ) //1.
{
    int i = 0;
    int liczba;
    do
    {
        do
        {
            liczba = std::rand();
            if( tablica[ i ] == liczba )
                 return liczba;
           
            i++;
        } while( i < ile );
       
        i = 0;
    } while( liczba == tablica[ i ] );
   
}
void wczytaj( int tablica[], int ile )
{
    int i = 0;
    do
    {
        std::cout << "liczba nr " << i + 1 << ": ";
        std::cin >> tablica[ i ];
        std::cout << std::endl;
        i++;
    } while( i < ile );
   
    return;
}

void wyswietl( int tablica[], int ile )
{
    if( ile <= 0 )
    {
        std::cout << "Tablica jest pusta." << std::endl;
        return;
    }
   
    int i = 0;
    do
    {
        std::cout << tablica[ i ] << ", ";
        i++;
    } while( i < ile );
   
    std::cout << std::endl;
}

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

int main()
{
    srand( time( NULL ) );
   
    std::cout << "podaj liczby do losowania" << std::endl;
    int licz = 0;
    int licznik = 0;
    int tablicawyn[ 8 ], tablicawej[ 10 ];
    wczytaj( tablicawej, 10 );
    wyswietl( tablicawej, 10 );
    do
    {
        licz = losuj( tablicawej, 10 );
       
        if( spr( licz, tablicawyn, licznik ) )
       
             licznik = dopisz( licz, tablicawyn, licznik );
       
    } while( licznik < 8 );
   
    wyswietl( tablicawyn, licznik );
   
    return 0;
}


napisałem to w ten sposób - kod działa o ile nie wpiszemy tych samych liczb na wejściu. problem polega na tym, że zawsze losuje i podaje w wyniku liczbę nr 1. czy ktoś ma jakiś pomysł aby to poprawić?
P-154187
kirito1996
» 2016-12-08 11:03:38
też jestem przy tym zadaniu i się zastanawiałem czy tak ma to zadanie wyglądać czy może te 2 liczby ma wylosować ale ma sprawdzić całą tablice ;D czy się nie powtarza xD
P-154646
carlosmay
» 2016-12-08 11:11:58
@kirito1996 - albo zadbaj, aby wprowadzane dane były unikatowe, lub zadbaj aby program wylosował unikatowe indeksy.
Druga opcja jest łatwiejsza.
P-154647
kirito1996
» 2016-12-08 11:26:56
racja trzeba być ambitnym ;D
a o co ci chodzi mówiąc "unikatowe indeksy" pokażesz na przykładzie ? hehe
a co do zadania to ma działać w taki sposób "ja podaję 2 3 4 a program wylosuje 2 i 3 ?
P-154649
carlosmay
» 2016-12-08 13:41:19
Losowanie indeksów daje gwarancję powodzenia.
Np. tablica ma 3 elementy. Losujesz dwa indeksy bez powtórzeń i zawsze masz jakieś wynik.
Natomiast dla wprowadzonych liczb 3 3 3 losowanie nigdy się nie skończy.

Możesz spróbować sił w takich rozwiązaniach:
C/C++
#include <vector>
#include <algorithm>
#include <iostream>
#include <random>
#include <chrono>

int main()
{
    auto seed = std::chrono::system_clock::now().time_since_epoch().count();
    std::vector < int > v { 1, 2, 3 };
    std::shuffle( v.begin(), v.end(), std::default_random_engine( seed ) );
    int nNumsToPrint = 2;
    for( int i = 0; i < nNumsToPrint; ++i ) {
        std::cout << v[ i ] << ' ';
    }
}
P-154652
« 1 »
  Strona 1 z 1