Jak zrobić wstawianie wskazanej ilości losowych liczb do listy w C++?

0

Witam, otóż mam pewien problem. Muszę zrobić listę, do której będę wpisywał liczby. Nie mogą się one powtarzać. Oprócz tego muszę też zrobić możliwość wpisania X losowych liczb. Np. jako ilość losowych liczb podam 3, to pojawią się 3 losowe liczby (np. 32, 3243, 12). I niestety nie wiem jak to zrobić. Ogólnie też nie wiem czy kod jest w miarę dobry, gdyż dopiero zaczynam się uczyć C++ i robiłem to na podstawie poradników zamieszczonych w internecie.

#include <iostream>
#include <cstdlib>
#include <time.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>

using namespace std;

struct Lista
{
    int element;
    Lista* Next;


void wypisz()
{
    cout << "Element to: " << element << endl;
}
};


void dodaj_element(Lista **korzen)
{
    Lista *nowa = new Lista;
    Lista *pomoc = (*korzen), *pomoc1 = NULL;
    
    while (pomoc !=NULL && (pomoc->element) < (nowa->element))
    {
        pomoc1 = pomoc;
        pomoc = pomoc->Next;
    }
    
    if(pomoc != NULL && (pomoc->element)==(nowa->element))
    {
        cout << "Element " << nowa->element << " juz istnieje." << endl;
        delete nowa;
    }
    
    else if ((*korzen) == NULL || (pomoc == (*korzen) && (pomoc->element) > (nowa->element)))
    {
        nowa->Next = (*korzen);
        (*korzen) = nowa;
    }
    else
    {
        pomoc1->Next = nowa;
        nowa->Next = pomoc;
    }
    
}



void wypisz_liste(Lista *korzen)
{
cout << "Zawartosc listy: " << endl;
 
while(korzen != NULL)
{
korzen->wypisz(); // wypisanie listy
korzen = korzen->Next; // przejscie na kolejny element
}
}



/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main() {
    Lista *korzen = NULL;
    char instrukcja;
    char pierwszy;
    int koko;
    
    cout << "Pro mega obsluga: d aby dodac, w aby wyswietlic, s aby koniec, l aby wiele losowych" << endl << endl;
    
    while (cin >> instrukcja)
    {
        switch(instrukcja)
        {
            case 'd':
                dodaj_element(&korzen);
                break;
                case 'w':
                    wypisz_liste(korzen);
                    break;
                    case 's':
                        system("PAUSE");
                        return 0;
                        return EXIT_SUCCESS;
                        break;
                            case 'l':
                                cout << "test" << endl;
                                
                                break;
                            default:
                            cout << "Musisz cos wybrac!" << endl;
        }
    }
    
    
    system("PAUSE");
    return 0;
    return EXIT_SUCCESS;
}
0

Cześć,

skoro możesz korzystać z kontenerów to skorzystajmy ze standardowego kontenera list biblioteki STL.
Zrobiłbym coś takiego jak poniżej:

#include<iostream>
#include<list>
#include<ctime>

int main(){
    srand(time(NULL));
    unsigned il=0;
    unsigned prz=0;

    do{
        std::cout << "Prosze podac gorna granice przedzialu od <0,N> :"; std::cin >> prz;
        std::cout << "Ile liczb losowych wygenerowac? "; std::cin >> il;
        if(il>prz)std::cout << "Nie mozna wygenerowac " << il << " liczb losowych " 
            << "w przedziale od 0 do " << prz << "\n\n";
    }while(il>prz);

    std::list<int> lista;
    int liczba=0;
    for(unsigned i=0;i<il;i++){

        // Losowanie liczb z przedzialu od 0 do 'prz'
        liczba=rand()%(prz+1);
        if(!lista.empty()){

            // Sprawdzanie czy liczba znajduje sie juz na liscie.
            // Jezeli tak to wylosuj nowa i przelec liste od poczatku.
            for(std::list<int>::iterator it=lista.begin();it!=lista.end();++it){
                if(*it==liczba){
                    liczba=rand()%(prz+1);
                    it=lista.begin();
                }
            }
            lista.push_back(liczba);
        }
        else{
            lista.push_back(liczba);
        }
    }
    lista.sort();
    for(std::list<int>::iterator it=lista.begin();it!=lista.end();++it)std::cout << *it << " ";
    std::cout << std::endl;
    system("PAUSE");
}

Program dba o to, żeby nie przekroczyć przedziału losowania czyli np. nie można wylosować 20 liczb bez powtórzeń z przedziału od 0 do 10.
Program dodatkowo sortuje wszystkie elementy rosnąco.

Aha, no i liczby możesz zawsze wprowadzać ręcznie zamieniając wiersze liczba=rand()%(prz+1); na std::cin >> liczba;

Pozdrawiam
Grzesiek

1 użytkowników online, w tym zalogowanych: 0, gości: 1