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

losowanie liczb nie występujących w kolejce ( lista tabu )

Ostatnio zmodyfikowano 2018-01-09 13:21
Autor Wiadomość
mateczek
» 2018-01-08 22:25:27
A może takie rozwiązanie przypadnie Ci do gustu ?? jak napisanie własnej klasy kolejki, którą wyposażysz w potrzebne Ci metody ??

Poniżej przykład klasy kolejki napisany na bazie klasy std::list.
C/C++
#include <iostream>
#include<ctime>
#include<list>
using namespace std;
class mQuene
    : public list < int >
{
    bool isOnQuene( int el ) { //czy jest w kolejce taki element
        for( auto element:* this ) {
            if( element == el ) return true;
           
        }
        return false;
    }
public:
    void enquene( int el ) { //wrzuć do kolejki
        //sprawdzmy czy element już jest w kolejce
        if( !isOnQuene( el ) ) {
            push_back( el ); // wkładamy do kolejki tylko jeśli takiego nie zawiera
        }
    }
    int dequene() { //pobierz z kolejki
        int el = * begin();
        pop_front();
        return el;
    }
   
};
ostream & operator <<( ostream & s, const mQuene & kolejka ) { // operator do wyświetlenia kolejki na ekranie lub zapisu do pliku
    for( auto el: kolejka ) {
        s << el << " "; // wyświetlenie
    }
    return s;
}
int main()
{
    srand( time( NULL ) );
    mQuene kolejka;
    while( kolejka.size() < 5 ) { //losuj puki kolejka nie osiągnie rozmiaru 5
        kolejka.enquene( rand() % 10 + 1 ); //kolejka sama sprawdza czy ma element wylosowany
    }
    cout << kolejka; // operator przeciążąny
}
P-168512
mikewazowski
Temat założony przez niniejszego użytkownika
» 2018-01-09 11:57:11
po przerobieniu na pętle zamiast instrukcji goto, losowanie liczb działa jak trzeba ale nadal mam problem ze sprawdzeniem czy w kolejce jest liczba 

@mateczek - niestety twój kod nawet jeśli działa nie pomoże mi ponieważ jest dla mnie za bardzo zaawansowany i nie będę potrafiła go wytłumaczyć przy oddawaniu projektu

C/C++
int czy_w_kolejce( int liczba )
{
    queue < int > kolejka_tymczasowa;
    kolejka_tymczasowa = kolejka_tabu;
    int jest = 0;
   
   
    do {
       
        if( kolejka_tymczasowa.empty() ) // kolejka nigdy z góry nie będzie pusta - jedynie po serii ściągnięć
        // w ostatnim warunku może tak się stać
        {
            return 0; // zwraca 0 gdy liczby nie było za zadnej pozycji w kolejce
        }
       
        else if( !kolejka_tymczasowa.empty() )
        {
            if( kolejka_tymczasowa.front() == liczba )
            {
                jest = 1;
            }
            else if( kolejka_tymczasowa.front() != liczba )
            {
                kolejka_tymczasowa.pop();
            }
        }
       
    } while( jest == 1 );
   
    if( jest == 1 ) return 1; // zwraca 1 gdy znalazło wystąpienie liczby w kolejce
   
}
P-168522
mateczek
» 2018-01-09 13:21:07
C/C++
#include <iostream>
#include <queue>
using namespace std;
bool czyWkolejce( int liczba, queue < int > kol ) { // prekazanie przez wartość samo tworzy kolejkę tymczasową
    while( !kol.empty() ) {
        int temp = kol.front();
        kol.pop();
        if( liczba == temp ) return true; //gdy element w kolejce
       
    }
    return false; //gdy elememtu brak;
}
int main()
{
    queue < int > kolejka;
    kolejka.push( 2 );
    kolejka.push( 7 );
    kolejka.push( 5 );
    cout << boolalpha;
    cout << czyWkolejce( 2, kolejka ) << endl;
    cout << czyWkolejce( 8, kolejka ) << endl;
}
a co do kodu z góry to chodziło mi to by samemu napisać klasę wyposażoną w funkcje odkładania i zdejmowania na bazie listy.
w liście masz dostęp do dwóch krańców kontenera i możesz odkładać na wierzch i ściągać ze spodu

a taki kod czy już nie prostrzy. Zamiast dziedziczenia kontener w środku.
C/C++
#include<iostream>
#include<list>
using namespace std;
class mQueue {
    list < int > dane; // kontener na elementy kolejki zrobiony z std::list. Lista ma iterator wydajne usuwanie elementów
public:
    void push( int element ) { //metoda odkładania na kolejkę
        dane.push_back( element ); //kolejka to odkładanie na wierzch
    }
    int pop() {
        int el = dane.front(); // dana ze spodu(początku) listy
        dane.pop_front(); // kolejkja to pobranie z początku listy
        return el;
    }
    bool isOnMQueue( int element ) {
        for( auto el: dane ) {
            if( el == element ) return true; //jeśli element w kolejce to zwróć true;
           
        }
        return false; //jeśli elementu nie było to zwróć false;
    }
};

int main() {
    mQueue kolejka; //nasza kolejka
    kolejka.push( 4 );
    kolejka.push( 5 );
    kolejka.push( 7 );
    cout << boolalpha;
    // test kolejki.
    cout << "czy jest w kolejce 4: " << kolejka.isOnMQueue( 4 ) << endl;
    cout << "sciagam z kolejki: " << kolejka.pop() << endl;
    cout << "czy jest w kolejce 4: " << kolejka.isOnMQueue( 4 ) << endl;
    cout << "czy jest w kolejce 5: " << kolejka.isOnMQueue( 5 ) << endl;
    cout << "czy jest w kolejce 33: " << kolejka.isOnMQueue( 33 ) << endl;
}

jedyne co tu użyłem i może być nowością to pętla for z c++11
ale poniższy przykład pokaże Ci że taki zapis "for" nie dość, że wręcz banalny to  w wielu sytuacjach strasznie wygodny.

C/C++
#include <iostream>
using namespace std;

int main()
{
    int tablica[ 5 ] = { 1, 3, 5, 1, 4 };
    // teraz wyślewtlimy elementy tablicy klasyczna pętla for była by"for(int i=0;i<5,i++)"
    //ale c++11 ma pętlę potrafiącą przelecieć kontener czy tablicę nie martwiąc się o iteracje.
    // po prostu jednym z parametrów pętli jest element, a drugim tablica;
    for( int element: tablica ) { // przegląda tablice po jej elementach (działa na wszystkich kontenerach. Tych które można iterować)
        cout << element << endl;
    }
}
P-168523
1 « 2 »
Poprzednia strona Strona 2 z 2