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

Losowanie liczby bez powtórzeń proszę o pomoc

Ostatnio zmodyfikowano 2016-08-01 16:23
Autor Wiadomość
Maciekb
Temat założony przez niniejszego użytkownika
Losowanie liczby bez powtórzeń proszę o pomoc
» 2016-07-29 14:28:10
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int a = 0;
int sprawdzanie( int tab[], int liczba, int licznik )
{
   
    if( licznik < 1 )
    {
        return 1;
    }
   
    else
    {
       
        do
        {
           
            if( tab[ licznik ] == liczba )
                 return 0;
           
            licznik--;
           
        }
        while( licznik > 1 );
       
        return 1;
    }
}

int wylosuj()
{
    return( rand() % 10 ) + 1;
}

int main()
{
    srand( time( NULL ) );
    int licznik = 0;
    int tablica[ 5 ];
    int liczba = wylosuj();
   
    do
    {
        do
        {
            liczba = wylosuj();
            if( sprawdzanie( tablica, liczba, licznik ) == 0 )
            {
                liczba = wylosuj();
            }
           
        }
       
        while( sprawdzanie( tablica, liczba, licznik ) == 0 );
       
        tablica[ licznik ] = liczba;
        licznik++;
        cout << liczba << ",";
        int a = 0;
       
       
    }
    while( licznik != 5 );
   
    do
    {
        a++;
    }
    while( a != 5 );
   
}
Program wyświetla liczby ale z powtórzeniami dlaczego?
P-150363
carlosmay
» 2016-07-29 14:54:26
C/C++
int a = 0; // zmienna globalna, zły pomysł (dalej w programie zakrywasz tą zmienną)
Cały kod jest zły. Działania w niewłaściwej kolejności. Niektóre niepotrzebne.

Napisz kod od nowa (tego nie da się uratować, abyś zrozumiał błędy).
Pisz kod po kawałku. Kompiluj i sprawdzaj, czy jest zgodny z oczekiwaniem.
Debugger "lekarstwem na wszystko" (prawie).

edit: wiedzę, że zdążyłeś odczytać przed edycją. Przeoczyłem jeden szczegół i źle oceniłem.
P-150364
karambaHZP
» 2016-07-29 17:24:15
Program losuje osiem z dziesięciu indeksów tablicy wprowadzonej przez użytkownika.
Program losuje indeksy, ponieważ nie ma kontroli wprowadzanych liczb i użytkownik może wprowadzić takie same.
Wprowadzenie trzech takich samych spowodowałoby zapętlenie.
C/C++
#include <iostream>
#include <limits>
#include <cstdlib>
#include <ctime>
using namespace std;

int randomNumber( int rangeBegin, int rangeEnd )
{
    return rand() %( rangeEnd - rangeBegin + 1 ); // rand() jest przestarzały, lepiej korzystać z <random>
}

bool isNumberRepeat( int randomedIndexes[], int size, int indexToCheck )
{
    if( size == 0 ) {
        return false;
    }
   
    int i { 0 };
    do {
        if( randomedIndexes[ i++ ] == indexToCheck ) {
            return true;
        }
    } while( i < size );
   
    return false;
}

int getNumber()
{
    int number;
    do {
        if( !cin.good() ) {
            cin.clear();
            cin.ignore( numeric_limits < streamsize >::max(), '\n' );
        }
        cin >> number;
    } while( !cin.good() );
   
    cin.ignore( numeric_limits < streamsize >::max(), '\n' );
   
    return number;
}

void fillArray( int numbersOfUser[], int size )
{
    int i { 0 };
    do {
        numbersOfUser[ i++ ] = getNumber();
    } while( i < size );
   
}

void printArray( int randomedIndexes[], int size, int numbersOfUser[] ) {
    int i { 0 };
    do {
        cout << numbersOfUser[ randomedIndexes[ i++ ] ] << ' ';
    } while( i < size );
   
}

int main()
{
    srand( time( 0 ) );
    constexpr int SIZE = 10;
    constexpr int SIZE_RANDOMED_ARRAY = 8;
    int numbersOfUser[ SIZE ];
    int randomedIndexes[ SIZE_RANDOMED_ARRAY ];
   
    fillArray( numbersOfUser, SIZE );
   
    int i { 0 };
    do {
        int randomedIndex = randomNumber( 0, SIZE_RANDOMED_ARRAY );
        cout << '\n' << randomedIndex << " - los\t"; // dodana linia dla kontrolowania losowanych liczb
        if( !isNumberRepeat( randomedIndexes, i, randomedIndex ) ) {
            cout << randomedIndex << " - zapis"; // dodana linia dla kontrowania zapisywanych liczb
            randomedIndexes[ i++ ] = randomedIndex;
        }
    } while( i < SIZE_RANDOMED_ARRAY );
   
    printArray( randomedIndexes, SIZE_RANDOMED_ARRAY, numbersOfUser );
    cout << '\n';
}
P-150370
Maciekb
Temat założony przez niniejszego użytkownika
» 2016-07-30 17:43:13
Dzięki za pomoc:)
P-150404
Maciekb
Temat założony przez niniejszego użytkownika
» 2016-07-30 19:00:59
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int losowanie()
{
    return( rand() % 10 ) + 1;
}
bool sprawdzanie( int tab[], int wylosowanych, int liczba )
{
    int licznik = 0;
    if( wylosowanych == 0 )
    {
        cout << "wylosowanych:" << wylosowanych << "liczba:" << liczba << "tablica:" << tab[ wylosowanych ];
        return 1;
    }
    do
    {
        if( liczba == tab[ wylosowanych ] )
             return 0;
       
        licznik++;
        cout << "wylosowanych:" << wylosowanych << "liczba:" << liczba << "tablica:" << tab[ wylosowanych ];
       
    }
    while( wylosowanych > licznik );
   
    return 1;
   
}

int main()
{
    srand( time( NULL ) );
    int tablica[ 5 ];
    int wylosowanych = 0;
    int liczba;
    do
    {
        liczba = losowanie();
        if( sprawdzanie( tablica, wylosowanych, liczba ) == 1 )
        {
           
            tablica[ wylosowanych ] = liczba;
            wylosowanych++;
           
        }
    }
    while( wylosowanych < 5 );
   
    wylosowanych = 0;
    do
    {
        cout << "." << tablica[ wylosowanych ] << ".";
        wylosowanych++;
    }
    while( wylosowanych < 5 );
   
}
Poprawiłem program, ale dalej coś nie działa, dlaczego funkcja nie widzi tablicy?
P-150407
carlosmay
» 2016-07-30 20:53:20
Potrzebujesz dwóch tablic:
- jedna na liczby użytkownika,
- druga na wylosowane wartości.
P-150415
XxSPIDUxX
» 2016-08-01 13:16:04
czołem. sam mam problem z tym tematem. wpadłem na pomysł z dwoma tablicami. jednak coś jest tak. może jestem ślepy ale nie wiem. program działa dobrze. jednak po wylosowaniu liczb pojawiają się inne liczby. wpisałem 1,2,3. wyświetliło mi np. 4783124.

btw jak to wrzucić do tego okienka z kodem?
nie widzę takiego artykułu a wyszukiwarka też nie widzi. więc zamiast pisać tytuł gdzie znaleźć może napiszesz jak to zrobić karambaHZP?
C/C++
#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int podaj_liczby( int tab[], int ile )
{
    int i = 0;
    do
    {
        cout << "podaj liczbe " << i + 1 << " : ";
        cin >> tab[ i ];
        i++;
    } while( i < ile );
   
}

bool czy_byla_wylosowana( int ile, int tab[], int iLiczba )
{
    if( ile <= 0 )
         return false;
   
    int i = 0;
    do
    {
        if( tab[ i ] == iLiczba )
             return true;
       
        i++;
    } while( i < ile ); // tutaj chyba nie powinno być ile lecz program jak wstawię 2 lub 3 nie działa gdy ma losować.
   
    return false;
}

int losowanie()
{
    return( rand() % 2 );
}

void wyswietl_liczby( int x, int ilosc, int tab[] )
{
    do
    {
        cout << "Wylosowana liczba to: " << tab[ x ] << endl;
        x++;
    } while( x < ilosc );
   
}

int main()
{
    cout << "Witaj w tym pieknym programie. " << endl;
    srand( time( 0 ) );
    int liczby[ 3 ], wylosowanych, liczby_wylosowane[ 2 ], x;
    wylosowanych = 0;
    x = 0;
    podaj_liczby( liczby, 3 );
    do
    {
        int liczba;
        liczba = liczby[ losowanie() ];
        if( czy_byla_wylosowana( wylosowanych, liczby_wylosowane, liczba ) == false )
        {
            liczba = liczby_wylosowane[ x ];
            x++;
            wylosowanych++;
        }
    } while( wylosowanych < 2 );
   
    x = 0;
    wyswietl_liczby( x, 2, liczby_wylosowane );
   
    return 0;
}
P-150458
karambaHZP
» 2016-08-01 14:19:32
btw jak to wrzucić do tego okienka z kodem?
Przeczytaj artykuł"zakładanie tematów".
P-150461
« 1 » 2
  Strona 1 z 2 Następna strona