Wyjątki
Ostatnio zmodyfikowano 2019-01-22 15:23
werter Temat założony przez niniejszego użytkownika |
Wyjątki » 2019-01-21 22:54:11 Cześć, jedna z części mojego zdania zakłada wypełnienie kontenera A 100 000 pseudolowowymi wynikami z rozkładu gamma gdzie alfa=3,71 beta=1. W przypadku gdy wynik wartosć rozkladu bedzie wieksza niż 18.0 to ma zostać rzucony wyjątek.Obsługa wyjątku będzie polegać na wypisaniu w oknie konsoli że liczba jest wieksza od 18 i pominięciu tej liczby. Po obsłużeniu wyjątku program kontynuuje pobieranie kolejnych wartości z generatora i zapisywanie ich do kontenera A. Nie mogę uzywać pętli(RAZ MOGE UZYC FOR-a OPARTEGO O ZASIEG),tylko algorytmy z STL. No to mam cos takiego i dziala natomiast jak w sekcji catch mam zapisać żeby ten element przez ktory zostal wyrzucony wyjątek był pomijany i w jego miejsce został wylosowana nowa wartosc? #include <iostream> #include <vector> #include <functional> #include <algorithm> #include <random> #include <string> using namespace std;
random_device rd; double rozkladGamma() { mt19937 gen( rd() ); gamma_distribution < double > distribution( 3.71, 1.0 ); return distribution( gen ); }
int main() { vector < double > A( 100000 ); generate( A.begin(), A.end(),[]() { double gamma_val = rozkladGamma(); try { if( gamma_val > 18.0 ) { string exc = "Wartosc wieksza od 18"; throw exc; } } catch( string mess ) { cout << mess << endl; } return gamma_val; } ); }
|
|
pekfos |
» 2019-01-21 23:08:18 Najprościej będzie jak dla wektora tylko zarezerwujesz pamięć zamiast tworzyć elementy. Użyj std::generate_n() i std::back_inserter(). Ilość elementów w wektorze będzie wskazywać, gdzie jesteś w procesie losowania liczb. |
|
werter Temat założony przez niniejszego użytkownika |
» 2019-01-21 23:18:35 ok ale jak w generate_n mam zaimplementowac obsluge tych wyjątków? Bo w tym zadaniu to własnie głównie o nie chodzi ;/ |
|
pekfos |
» 2019-01-21 23:30:42 Nie w generate_n(), tylko poza. Nie ma sensu używać wyjątków, jeśli masz je obsługiwać w miejscu rzucenia. |
|
Monika90 |
» 2019-01-21 23:31:55 |
|
werter Temat założony przez niniejszego użytkownika |
» 2019-01-21 23:45:18 Pewnie masz racje ale w treść zadania jest taka . Wygeneruj serię 100000 liczb losowych z generatora liczb pseudolosowych o rozkładzie gamma dla parametrów rozkładu gamma: a = 3.71 i b = 1 , reprezentujących czasy odpowiedzi pewnego serwera www na zapytania użytkowników i zapisz w kontenerze A. W przypadku wygenerowania liczby losowej większej od 18 rzuć wyjątek. Obsługa wyjątku polega na wypisaniu w oknie konsoli komunikatu o wystąpieniu liczby większej od 18 i pominięciu tej liczby. Po obsłużeniu wyjątku program kontynuuje pobieranie kolejnych wartości z generatora i zapisywanie ich do kontenera A. |
|
darko202 |
» 2019-01-22 15:23:42 1. masz źle zrobione użycie losowania powinna byc A. inicjalizacja B. wielokrotne losowanie ty powtarzasz krok A i B wielokrotnie spójrz na http://www.cplusplus.com/reference/algorithm/generate/2. >>Nie ma sensu używać wyjątków, jeśli masz je obsługiwać w miejscu rzucenia. np. double Los() { string exc = "Wartosc wieksza od 18"; mt19937 los = rd(); if( los > 18.0 ) throw exc; return los; }
int main() { ... try { generate( A.begin(), A.end(), Los() ) } catch( string mess ) { cout << mess << endl; } ... }
jest lepsze, ale przerywa proces generowania pomyśl jak to usprawnić |
|
« 1 » |