C++ | Napisz program, który wypisze w dwóch kolumnach x i f(x), gdzie x jest liczbą rzeczywistą z przedziału [0.5,10], zmieniającą się w n- iteracjach, Rozwiązanie przedstaw z wykorzystaniem funkcji, której argumentem formalnym jest wskaźnik na funkcję. Sprawdź działanie programu dla funkcji log10, log i exp z biblioteki cmath, zależnie od wyboru użytkownika.
Odpowiedź:
#include <cmath>
#include <iostream>
void func_table(double (*f)(double), float min, float max, int steps) {
// potrzebne do wyliczenia kolejnego X na podstawie numeru iteracji
float ratio = (max - min) / (steps - 1);
for (int i = 0; i < steps; i++) {
float x = (i * ratio) + min;
std::cout << x << "\t" << (*f)(x) << std::endl;
}
}
int main() {
int steps = 10; // ilość iteracji
float min = 0.5; // początek dziedziny
float max = 20; // koniec dziedziny
// przykłady
func_table(log, min, max, steps);
func_table(log10, min, max, steps);
func_table(exp, min, max, steps);
return 0;
}
Wynik działania programu:
---log--
0.5 -0.693147
2.66667 0.980829
4.83333 1.57554
7 1.94591
9.16667 2.21557
11.3333 2.42775
13.5 2.60269
15.6667 2.75154
17.8333 2.88107
20 2.99573
---log10--
0.5 -0.30103
2.66667 0.425969
4.83333 0.684247
7 0.845098
9.16667 0.962211
11.3333 1.05436
13.5 1.13033
15.6667 1.19498
17.8333 1.25123
20 1.30103
---exp--
0.5 1.64872
2.66667 14.3919
4.83333 125.629
7 1096.63
9.16667 9572.67
11.3333 83561.1
13.5 729416
15.6667 6.36718e+06
17.8333 5.558e+07
20 4.85165e+08
Mam nadzieje, że o takie coś chodziło.
Uwagi:
Jeżeli chodziło o przedział 0.5 do 10 co np. 0.5 to wystarczy zamienić funkcję na taką z nie do końca poprawnym forem:
void func_table(double (*f)(double)) {
for (float i = 0.5; i <= 10; i+=0.5) {
std::cout << i << "\t" << (*f)(i) << std::endl;
}
}