Karta pracy 5
1. Znajdź błąd w poniższej definicji klasySamochodi podaj dwie metody jego usunięcia(Wskazówka: podczas kompilacji warto użyć opcji-W -Wall).
1 #include <iostream>
class Samochod {
5 public:
Samochod (int n)
: kola (n), sruby (4∗ kola) {
std :: cout << ”Samochod z ” << kola << ” kolami i ”
10 << sruby << ” srubami\n”;
} private:
int sruby;
int kola ;
15 };
int main() {
Samochod s4 (4);
20 Samochod s12 (12);
}
2. Ciąg nieujemnych liczb całkowitych fn taki, że fn+1= 16807fn mod (231− 1)
definiuje popularny generator liczb pseudolosowych Parka i Millera. Zaim- plementuj, w osobnym plikurandom.h, klasęRand, stanowiącą implementację tego generatora o następującym interfejsie:
4 #include<ctime>
class Random {
int fn ;
8 public:
Random(int f1 = time(0));
double operator()();
};
Implementacja powinna spełniać następujące założenia:
• Konstruktor powinien kopiować wartość argumentu f1 na składową prywatną_fn. Liczbę tę traktujemy jako pierwszy element ciągu fn.
• Operator () powinien wyznaczać kolejną wartość elementu ciągu fn
i zapisywać ją w składowej _fn, przy czym aby uniknąć błędu prze- kroczenia zakresu, należy wszystkie obliczenia pośrednie wykonywać na typie long long. Następnie operator ten powinien zwrócić liczbę z przedziału otwartego (0, 1) jako iloraz zmiennopozycyjny f_ni liczby 231− 1 (można ją zapisac jakostd::pow(2.0, 31) - 1.0).
3. Przetestuj swój generator, pisząc (w osobnym pliku!) program obliczający wartość minimalną, maksymalną i średnią n pseudolosowych liczb rzeczywi- stych wygenerowanych przy pomocy obiektu klasyRandom. Liczbę n należy wczytywać z klawiatury poprzez obiektstd::cin. Do inicjalizacji generatora można wykorzystać dowolną liczbę większą od 0 i mniejszą od 2147483647 (co należy sprawdzać asercją). Przykładowe wyniki:
podaj n: 1000000
wygenerowano 1000000 liczb wartosc minimalna: 1.48918e-006 wartosc maksymalna: 0.999999 wartosc srednia: 0.49983
Uwaga: Dla dużych n i porządnego generatora wartość minimalna dąży do 0, maksymalna do 1, a średnia do 1/2.