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ść
mikewazowski
Temat założony przez niniejszego użytkownika
losowanie liczb nie występujących w kolejce ( lista tabu )
» 2018-01-08 15:32:53
Zadaniem kodu jest:
1. wylosowanie liczby
2. wstawienie jej do kolejki jeśli nie ma takiej liczby w kolejce (jeśli liczba jest powinno wylosować ponownie)
3. po osiągnięciu przez pętle for iteracji >= nadanemu wcześniej rozmiarowi kolejki będzie odbywało się ściąganie po jednej wartości z początku kolejki w każdej iteracji ale także kolejne losowania i dokładanie kolejnych liczb na koniec

Moim problemem jest sprawdzenie w funkcji czy_liczba_w_kolejce() czy w kolejce znajduje się liczba wylosowana w konkretnej iteracji - prosiłabym o jakieś wskazówki jak mogłabym to sprawdzić by nie tracić danych z kolejki oraz nie naruszać ich kolejności

zależy mi by odbywało się to na strukturze FIFO


C/C++
int losuj()
{
    int liczba =( rand() % 10 ) + 1;
    return liczba;
}
queue < int > kolejka_tabu;

int czy_liczba_w_kolejce( int liczba )
{
    if( liczba jest w kolejce )
         return 1;
    else if( liczby nie ma w kolejce )
         return 0;
   
}

int main()
{
   
    int rozmiar_kolejki = 5;
    int ilosc_iteracji = 50;
   
    for( int i = 0; i < ilosc_iteracji; i++ )
    {
        HM:
        int liczba = losuj();
       
        if( czy_liczba_w_kolejce == 0 )
             kolejka_tabu.push( liczba );
        else if( czy_liczba_w_kolejce == 1 )
             goto HM;
       
        if( i >= rozmiar_kolejki )
        {
            kolejka_tabu.pop();
        }
       
    }
P-168493
pekfos
» 2018-01-08 15:40:27
Przenieś dane po kolei do tymczasowej kolejki, testując wartości. Podstaw tymczasową kolejkę w miejsce właściwej.
P-168495
mikewazowski
Temat założony przez niniejszego użytkownika
» 2018-01-08 15:49:37
możliwe że dosyć głupie pytanie - w jaki sposób mogę skopiować dane z kolejki oryginalnej do tymczasowej nie tracąc danych z kolejki oryginalnej? przychodzi mi do głowy tylko coś takiego, no ale w taki sposób stracę dane z oryginalnej kolejki

C/C++
for( int i = 0; i < rozmiar_kolejki; i++ )
{
    int x = kolejka_oryginalna.front();
    kolejka_tymczasowa.push( x );
    kolejka_oryginalna.pop();
}
P-168496
Monika90
» 2018-01-08 16:29:21
Zwyczajnie użyj przypisania
C/C++
kolejka_tymczasowa = kolejka_oryginalna;
P-168498
mikewazowski
Temat założony przez niniejszego użytkownika
» 2018-01-08 21:21:37
Ponownie poproszę o pomoc - program nie kompiluje się z błędem " segmentation fault "

C/C++
int losuj()
{
    int liczba =( rand() % 12 ) + 1;
    return liczba;
}


queue < int > kolejka_tabu;
queue < int > kolejka_tymczasowa;

int nie_ma_w_kolejce( int liczba )
{
    kolejka_tymczasowa = kolejka_tabu;
   
    TUTAJ:
    if( kolejka_tymczasowa.front() == liczba )
    {
        return 1;
    }
    else if( kolejka_tymczasowa.front() != liczba )
    {
        kolejka_tymczasowa.pop();
        goto TUTAJ;
    }
   
    if( kolejka_tymczasowa.empty() )
         return 0;
   
}

int main()
{
   
    srand( time( NULL ) );
   
    int rozmiar_kolejki = 5;
    int ilosc_iteracji = 20;
   
    for( int i = 0; i < ilosc_iteracji; i++ )
    {
        TU:
        int liczba = losuj();
        if( kolejka_tabu.empty() )
        {
            kolejka_tabu.push( liczba );
        }
        else if( !kolejka_tabu.empty() )
        {
           
            if( nie_ma_w_kolejce( liczba ) == 0 ) /// nie ma w kolejce
            {
                kolejka_tabu.push( liczba );
            }
            else if( nie_ma_w_kolejce( liczba ) == 1 ) /// jest w kolejce
            {
                goto TU;
            }
        }
       
        if( i >= rozmiar_kolejki )
        {
            kolejka_tabu.pop();
        }
       
    }
   
    return 0;
}
P-168506
Luq
» 2018-01-08 21:41:46
C/C++
TUTAJ:
if( kolejka_tymczasowa.front() == liczba )
{
    return 1;
}
else if( kolejka_tymczasowa.front() != liczba )
{
    kolejka_tymczasowa.pop();
    goto TUTAJ;
}

if( kolejka_tymczasowa.empty() )
     return 0;

Zanim się wywoła front trzeba mieć pewność, że kolejka nie jest pusta. W przeciwnym przypadku można dostać segmentation fault (który nie jest błędem kompilacji btw).

Zamiast
goto
 używaj zwykłych pętli.

Nie nadużywaj też zmiennych globalnych. Zwłaszcza robienie z kolejka_tymczasowa zmiennej globalnej jest kompletnie bez sensu.
P-168507
mikewazowski
Temat założony przez niniejszego użytkownika
» 2018-01-08 22:12:29
niestety dodanie warunku sprawdzającego czy kolejka nie jest pusta nic nie zmieniło i nadal pojawia się ten sam błąd


C/C++
int nie_ma_w_kolejce( int liczba )
{
    queue < int > kolejka_tymczasowa;
    kolejka_tymczasowa = kolejka_tabu;
    if( !kolejka_tymczasowa.empty() )
    {
       
        TUTAJ:
        if( kolejka_tymczasowa.front() == liczba )
        {
            return 1;
        }
        else if( kolejka_tymczasowa.front() != liczba )
        {
            kolejka_tymczasowa.pop();
            goto TUTAJ;
        }
       
        if( kolejka_tymczasowa.empty() )
             return 0;
       
    }
   
}
P-168510
pekfos
» 2018-01-08 22:15:46
Napisz to pętlą, jak człowiek.. Teraz błąd masz tylko przez niekompetentne użycie goto. Najlepiej w ogóle zapomnij o tej instrukcji.
P-168511
« 1 » 2
  Strona 1 z 2 Następna strona