losowanie liczb nie występujących w kolejce ( lista tabu )
Ostatnio zmodyfikowano 2018-01-09 13:21
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 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(); } }
|
|
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. |
|
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 for( int i = 0; i < rozmiar_kolejki; i++ ) { int x = kolejka_oryginalna.front(); kolejka_tymczasowa.push( x ); kolejka_oryginalna.pop(); }
|
|
Monika90 |
» 2018-01-08 16:29:21 Zwyczajnie użyj przypisania kolejka_tymczasowa = kolejka_oryginalna;
|
|
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 " 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 ) { kolejka_tabu.push( liczba ); } else if( nie_ma_w_kolejce( liczba ) == 1 ) { goto TU; } } if( i >= rozmiar_kolejki ) { kolejka_tabu.pop(); } } return 0; }
|
|
Luq |
» 2018-01-08 21:41:46 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. |
|
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 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; } }
|
|
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. |
|
« 1 » 2 |