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

Wyjątki

Ostatnio zmodyfikowano 2019-01-22 15:23
Autor Wiadomość
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?

C/C++
#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;
    } );
}
 
P-173641
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.
P-173642
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 ;/
P-173643
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.
P-173644
Monika90
» 2019-01-21 23:31:55
Nie mogę uzywać pętli
To użyj rekurencji.
P-173645
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.
P-173646
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.
C/C++
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ć
P-173650
« 1 »
  Strona 1 z 1