Programowanie Dodatki

Z Skrypty dla studentów Ekonofizyki UPGOW

Dodatek

W naszym kursie programowania posługujemy się pakietem obliczeniowo-programistycznym MATLAB (lub GNU Octave). Wspomniałem we Wstępie, iż pakiet MATLAB obecnie jest tworzony przy pomocy języka C++. W tym dodatku zamieszczam garść elementarnych informacji o C++ (materiał nadobowiązkowy) , abyś miał/a wyobrażenie, jaki formalizm (silnik) działa w tle, "za sceną" przyjaznego interfejsu MATLAB.

C++ rozróżnia duże i małe litery, format zapisu jest swobodny, tak zwane białe znaki (np. spacja, tab, ...) są pomijane przez kompilator. Łańcuch znaków (komentarz) zawarty pomiędzy /* */ , służy programiście tylko do zwiększenia czytelności tekstu programu. Komentarzem jest także łańcuch znaków pisany po dwóch ukośnikach // , ale tylko do końca linii (tzw. krótki komentarz). Zmienne przed pierwszym użyciem muszą być zadeklarowane, np. zapis

int wynik; 
float X;
double Y; 
char Z;
bool P;

oznacza, że w programie będą używane zmienne o nazwach; wynik (liczba całkowita), X (liczba zmiennoprzecinkowa), Y (liczba zmiennoprzecinkowa podwójnej precyzji), Z (pojedynczy znak alfanumeryczny), P (zmienna logiczna, mogąca przyjmować tylko jedną z dwóch wartości; true lub false). Nazwy zmiennych mogą zaczynać się od litery (dużej lub małej) lub znaku podkreślenia, nie mogą zaczynać się np. od cyfry, znaków $, @, itp. Naturalnie, muszą też być różne od słów kluczowych języka, takich jak if, for, do, …itp.

Większą ilość zmiennych jednego typu można zgromadzić w tablicy, np.

int tab[10];

oznacza deklarację 10-elementowej tablicy liczb całkowitych. Numeracja elementów tablicy zaczyna się od zera.

int szachy [8][8];

oznacza deklarację tablicy dwuwymiarowej o 8 wierszach i 8 kolumnach. Wymienię kilka najczęściej używanych operatorów:

= podstawienie
== jest równy
!= jest różny
<= mniejszy lub równy
<= większy lub równy
|| suma logiczna, inaczej alternatywa czyli logiczne „lub”
&& iloczyn logiczny, inaczej koniunkcja czyli logiczne „i”
% dzielenie modulo, otrzymujemy resztę z dzielenia dwóch liczb

Program C++ składa się z jednej lub większej ilości funkcji. Funkcja jest zbiorem deklaracji i instrukcji przeznaczonych do wykonania jakiegoś zadania. Definicja funkcji zawiera

typ_wartości nazwa_funkcji (lista parametrów)
{
// treść (ciało) funkcji czyli deklaracje zmiennych i instrukcje do wykonania
..............
}

Przykład,

int suma (int i, int j) {
int k;
k = i + j;
return k;               }

Wywołanie funkcji to po prostu podanie jej nazwy, wraz z parametrami w nawiasach np.

int i = 50, j = 100, m;
m = suma (i, j);

Po wywołaniu (uruchomieniu) funkcji wykonywane są instrukcje zawarte w jej ciele, aż do napotkania na słowo kluczowe return, wówczas zwracana jest wartość stojąca na prawo od return i kończy się działanie funkcji. Jeżeli funkcja nie zwraca żadnej wartości, to należy ją poprzedzić słowem void, w funkcji typu void instrukcja return nie musi wystąpić. Każdy program musi zawierać funkcję o nazwie main( ), wykonywanie programu rozpoczyna się zawsze od funkcji main( ), może ona być tylko typu void lub int.

Zwykle w przygotowywanym programie korzystamy z pewnych standardowych funkcji tzw. funkcji bibliotecznych lub specjalnych operacji np. wejścia/wyjścia. Przykładowo, instrukcja

cout <<  ” STOP” ;

wyprowadza na monitor (cout to skrót od ang. console output) łańcuch znaków zawartych w cudzysłowie, w naszym przykładzie to STOP. Przy pomocy cout potrafimy również skierować do standardowego wyjścia (monitor) liczbę np.

cout << 555;                     // wyświetli na ekranie liczbę 555

Aby przejść do nowej linii, w C++ stosuje się często endl (ang. end of line) np. ,

cout  << 5 << endl << 6 << endl << 7 ;

powoduje wyświetlenie

5

6

7

Do wczytywania danych z klawiatury używa się cin (ang. console input) np.

int liczba;  
cin >> liczba;      // za zmienną liczba podstaw wartość wpisaną przy użyciu klawiatury,
                    // tym samym widoczną na ekranie

Jeżeli chcemy w programie korzystać z funkcji bibliotecznych lub operacji na strumieniach danych (cin, cout, …), należy dołączyć (dyrektywa #include) odpowiednie pliki, zawierające niezbędne informacje dla kompilatora. W prostych programach wystarczy zwykle na początku napisać

#include <iostream>
using namespace std;

Zobaczmy niewielki, ale kompletny program, w którym występują wspomniane wyżej elementy języka C++

#include <iostream>
using namespace std;
 
void main ( )                                                    {
  int liczba;          
  cout  << ” Napisz liczbe i nacisnij ENTER” ;
  cin >> liczba;
  cout << ”Twoja ulubiona liczba:<<  liczba  <<  endl;       }

Biblioteka standardowa C++ zawiera rozmaite funkcje matematyczne, omówię teraz funkcję int rand( ), która generuje losowe (ściśle mówiąc pseudolosowe) liczby całkowite dodatnie z przedziału <0,RAND_MAX>, RAND_MAX jest stałą zależną od platformy sprzętowej i używanego kompilatora C++. Wartość stałej RAND_MAX możemy zobaczyć na monitorze po uruchomieniu poniższego programu, jest to liczba 32 767 lub większa

#include <cstdlib> 
#include <iostream>
using namespace std;
int main(){ 
cout << "Wartość RAND_MAX wynosi  " <<  RAND_MAX << endl;      }

Zaimplementowany w ciele funkcji rand() algorytm obliczania liczby losowej wymaga podania przy starcie pewnej liczby naturalnej, tzw. zarodka (ang. seed). Zajmuje się tym biblioteczna funkcja o nazwie srand( ), której argumentem może być liczba naturalna. Często za argument funkcji srand( ) wstawia się liczbę dostarczaną przez inną funkcje biblioteczną time(). Wywołanie time(0) mianowicie zwraca pobrany z zegara systemowego aktualny czas, mierzony w sekundach od 00:00 1.01.1970 UTC. Instrukcja,

srand(time(0));

powoduje podanie losowego „zarodka” funkcji rand( ) - przy każdym uruchomieniu programu. Użycie funkcji rand() i time() wymaga dołączenia, odpowiednio, <cstdlib> i <ctime>. Funkcja rand( ) generuje liczby przypadkowe od 0 do RAND_MAX, często interesuje nas sekwencja liczb losowych w określonym przedziale, np w grach typu LOTTO liczby naturalne z przedzialu <1, 49>. Wystarczy w tym celu posłużyć się operatorem dzielenia modulo, instrukcja

rand( )%10;

generuje liczbę naturalna z przedziału < 0, 9>.

Wspomnę jeszcze o instrukcjach sterujących, które służą do podejmowania decyzji w programie. Omówię je w składni występującej w języku C. W języku C nie występują zmienne typu logicznego, czyli takie, które mogą przyjmować tylko dwie wartości true (prawda) lub false (fałsz). W zamian sprawdza się po prostu wartość danej zmiennej lub wyrażenia. Jeżeli wyrażenie ma liczbową wartość zero, to jego logiczna wartość (stan)jest false. Gdy wartość liczbowa wyrażenia różni się od zera, wówczas jego stan logiczny jest true. Naturalnie, stan logiczny true albo false otrzymamy również gdy w danym wyrażeniu występują operatory logiczne (np. > , < , = =, ...). W MATLAB także nie występuje expicite typ logiczny, obowiązuje w zamian taka sama konwencja, jak w języku C. W C++, który jest nadzbiorem (rozszerzeniem) wcześniej istniejącego języka C, występuje już obecnie explicite typ logiczny zmiennej (bool). Jednakże, z uwagi na kompatybilność z C, opisana wyżej konwencja funkcjonuje nadal także w C++.

Instrukcja warunkowa if ma postać:

if (warunek)
instrukcja;

Gdy wyrażenie w nawiasie ma wartość różną do zera czyli jest logicznie prawdziwe, instrukcja jest wykonywana, w przeciwnym wypadku pomijana. Słowo „wyrażenie” w nawiasie lepiej ze względów dydaktycznych zastąpić słowem „warunek”, które bezpośrednio oddaje sens logiczny wyrażenia, o to właśnie chodzi przy instrukcjach sterujących. Przykład,

int i = 2, j = 4, k;
if (i < j)
k = i + j;

Opcja zastąpienia pojedynczej instrukcji przez blok instrukcji obowiązuje także dla innych instrukcji sterujących, nie będę już tego powtarzał przy ich omawianiu poniżej. Występuje bardziej rozbudowana forma instrukcji warunkowej if;

if (warunek)

instrukcja_A;

else

instrukcja_B;

Jeżeli warunek w nawiasie jest prawdziwy (wartość wyrażenia różna od zera), wykonywana jest instrukcja_A, w przeciwnym wypadku instrukcja_B. Przykład

int i, j, k;               
if (i < j)                                        
k = j - i;
else
k = i - j;

Pętla while ma postać

while (warunek)

instrukcja;

Jeżeli warunek jest spełniony/prawdziwy, to instrukcja zostaje wykonywana i ponownie przystępuje się do testowania prawdziwości warunku w nawiasie. Instrukcja wykonywana jest tak długo, jak długo jest prawdziwy warunek. Dopiero, gdy wyrażenie w nawiasie przyjmie wartość zero (warunek nieprawdziwy), nastąpi przerwanie pętli i przejście do wykonywania instrukcji programu poniżej pętli. Instrukcja występująca w pętli while w ogóle nie będzie wykonywana, gdy warunek od razu nie jest prawdziwy. Przykład

int i = 0, j = 6, r;
while (i < j)    {   
r = j - i; 
i = i + 1;       }

Pętla zostaje wykonana 6 razy, po zakończeniu iteracji zmienna r = 1.

Pętla do ... while Pętla iteracyjna do … while przyjmuje postać

do

instrukcja;

while(warunek)

Najpierw wykonywana jest instrukcja, następnie sprawdzany warunek logiczny, jeżeli jest prawdziwy, wykonanie instrukcji zostanie powtórzone. Znowu jest sprawdzany warunek w nawiasie, i tak w kółko, dopóki warunek jest prawdziwy. Warunek jest badany po wykonaniu instrukcji, a nie przed, jak w pętli while. Instrukcja zostanie wykonana co najmniej jeden raz, nawet gdy warunek nie będzie prawdziwy od początku. Przykład

int i = 1, s = 0;
do 
s = s + i * i;
while (i < 6);

pętla liczy sumę s kwadratów liczb naturalnych od 1 do 5, po jej zakończeniu s = 1 + 4 + 9 + 16 + 25 = 55.

Pętla for Pętla for ma postać:

for (instr_pocz; warunek; instr_krok)

instrukcja;

Najpierw wykonywana jest instr_pocz (początkowa), potem sprawdza się warunek, jeżeli warunek prawdziwy, to wykonywana jest instrukcja będąca treścią pętli. Na zakończenie każdego obiegu pętli wykonywana jest instr_krok. Instrukcja instr_pocz nie musi być tylko jedną instrukcją, może być ich kilka, wtedy są oddzielone przecinkami, podobnie jest w przypadku instr_krok. Składniki pętli: instr_pocz, warunek, instr_krok - niekoniecznie muszą wystąpić. Możliwe jest pominięcie któregokolwiek z nich, zachowując jednak średnik oddzielający go od sąsiedniego składnika. Opuszczenie warunku traktowane jest tak, jak gdyby był tam warunek prawdziwy.

Przykład,

int i, suma = 0;
for (i = 0; i < 10; i = i + 1)
suma = suma + i;

W pętli odbywa się sumowanie liczb całkowitych od 0 do 10, po zakończeniu pętli for zmienna suma = 55.

Instrukcja wyboru switch Instrukcja wyboru switch wygląda następująco

switch (wyrażenie) {

case wart_1:
instr 1;
break;
case wart_2:
instr 2;
break;
.......
case wart_n;
instr n;
break;
default:
instr ;
break;

Obliczane jest wyrażenie w nawiasie przy słowie switch, może to być tylko wyrażenie typu całkowitego. Jeżeli jego wartość odpowiada którejś z wartości podanej w jednej z etykiet case, wówczas wykonywane są instrukcje począwszy od tej etykiety, wykonywanie ich kończy się po napotkaniu instrukcji break. Powoduje to wyjście z instrukcji switch, za jej klamrę zamykającą. Jeżeli wartość wyrażenia nie zgadza się z żadną z wartości podanych przy etykietach case, to wykonywane są instrukcje po etykiecie default. Etykieta default może być w dowolnym miejscu instrukcji switch, np. na jej początku. Etykiety default może w ogóle nie być. Jeżeli wartość wyrażenie nie zgadza się z żadną z wartości przy etykietach case, a etykiety default nie ma, to instrukcja switch nic nie robi. Instrukcji występujących po etykiecie case nie musi kończyć instrukcja breake, gdy jej nie ma, to wykonywane są instrukcje po następnej etykiecie case. Po napotkaniu przypadku zgodnego z badanym wyrażeniem i braku break zakłada się, że wszystkie umieszczone po tym przypadku wartości wyrażeń przy kolejnych słowach case w klamrach instrukcji switch są także równe wyrażeniu, a więc następujące po nich instrukcje są wykonywane, aż do wystąpienia w którejś z nich break.

Przykład

int m, n;
switch (m) {
case 10 :  n = m ;
break;
case 20 :  n = m + 1 ;
break;
case 30 :  n = m - 1 ;
break;     }

W zależności od wartości zmiennej m wystąpią następujące wartości zmiennej n; n = 10 gdy m = 10, n= 21 gdy m = 20, n = 29 jeżeli m = 30. Dla innych wartości m instrukcja switch nie zmieni wartości zmiennej n. Jeżeli w powyższym kodzie usuniemy słowa kluczowe break

int m, n;
switch (m)                   {
case 10 :  n = m ;
case 20 :  n = m + 1 ;
case 30 :  n = m - 1 ;       }

wówczas n = 10 dla m = 10, n = 20 jeżeli m = 20, n = 29 gdy m = 30. Dla innych wartości m instrukcja switch nie zmieni wartości zmiennej n, tj. nic nie zrobi.

Instrukcja break Przerywa instrukcję switch, powoduje także natychmiastowe zakończenie/przerwanie wykonywania pętli; for, while, do ... while.

Jeżeli mamy do czynienia z kilkoma pętlami, zagnieżdżonymi jedna wewnątrz drugiej, to instrukcja break powoduje przerwanie tylko tej najbardziej wewnętrznej pętli, w której występuje. To przerwanie pętli z wyjściem o jeden poziom wyżej.

Instrukcja continue Instrukcja continue występuje zwykle wewnątrz pętli while, for, do ... while. Powoduje ona zaniechanie wykonywania instrukcji będących treścią pętli, jednak sama pętla nie zostaje przerwana. Instrukcja continue przerywa tylko bieżący obieg pętli i zaczyna następny obieg, kontynuując pracę pętli. Innymi słowy, napotkanie instrukcji continue odpowiada natychmiastowemu przejściu/skokowi na sam koniec pętli, do etykiety stojącej przed klamrą zamykającą pętlę, komputer "pomyśli", że wykonał treść pętli i przystąpi do następnego obiegu. W ten sposób instrukcje pętli leżące poniżej continue, aż do końca pętli, nie będą realizowane.

Poniżej pokazuję bardziej rozbudowane przykłady. Przypominam, iż zwykle na początku należy dołączyć (dyrektywa #include ) odpowiednie pliki do obsługi funkcji bibliotecznych, tak jak w kodach powyżej. Od tego miejsca w przykładach prezentowanych poniżej będę pomijał dołączenia typowych plików, które musiałyby powtarzać się za każdym razem zwiększając niepotrzebnie rozmiar kodu. Pamiętajmy jednak, iż przed kompilacją poniższych przykładów, na początku kodów źródłowych należy dołączyć linie:

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

Przykłady

Losowanie liczby całkowitej z przedziału <1,3>

void main(void) {
int i, j, t;
char a;
a = 't';
cout << "                      Trzy liczby      \n";
cout << endl << endl << endl;
while (a = = 't'  || a = = 'T') {
srand(time(0));
j= 1 + rand()%3;
cout << "Podaj liczbe z przedzialu <1,3> i nacisnij ENTER\n\n";
cin >> i;
t=time(0);
cout << "\n\nDziekuje, a zatem postawiles na liczbe: " << i;
cout << ". Powodzenia w losowaniu. \n\n";
cout << "Losowanie sie zaczyna, prosze czekac (please wait)...\n" << endl;
do { } while(time(0) < t+4);
cout << "Oto wylosowana liczba:   ";
cout << j;
cout << endl;
if (j = = i)
cout << "Gratuluje trafnego wyboru, odbior wygranej w kasie" << endl;
else
cout << "Niestety, moze nastepnym razem sie uda" << endl;
cout << "Chcesz zagrac jeszcze raz ? T/N" << endl;
cin >> a;
cout << endl << endl;  	}    }

Sprawdzanie umiejętności mnożenia

int main() {
int i, j, iloczyn, wynik, wybor;
char a = 't';
cout << "Pouczymy sie trochę matematyki\n";
cout << "Mnozenie liczb calkowitych\n";
while (a = = 't' || a = = 'T') {
srand(time(0));
i=1+rand()%10;
j=1+rand()%10;
iloczyn = i*j;
cout << "Ile wynosi iloczyn liczb: " << i
<< " * " << j << endl; 
cin >> wynik;
if (wynik == iloczyn ) 
cout << "Brawo" << endl;
else
cout << "No niestety,.... kiepsko" << endl;
cout << "\n Czy chcesz kontynuowac ? T/N \n";
cin >> a; }  
return 0; }

Nauczanie arytmetyki

int main() {
int i, j, suma, roznica, iloczyn, m, wybor;
char a = 't';
cout << "nauczanie arytmetyki\n";
while (a=='t' || a=='T') {
cout << "Wybierz dzialanie: \n\n\n";
cout << "1. Dodawanie " << endl << endl;
cout << "2. Odejmowanie " << endl << endl;
cout << "3. Mnozenie " << endl << endl;
cin >> wybor;
switch(wybor) {
case 1: {
srand(time(0));
i =1+rand()%100;
j =1+rand()%100;
suma = i + j;
cout << "Ile wynosi suma liczb: " << i << " + " << j << endl << endl; }
break;
case 2: {
srand(time(0));
i = 1 + rand()%100;
j = 1 + rand()%100;
roznica = i - j;
cout << "Ile wynosi roznica liczb: " << i  << " - " << j << endl << endl; }
break;
case 3: {
srand(time(0));
i = 1 + rand()%10;
j = 1 + rand()%10;
iloczyn = i*j;
cout << "Ile wynosi iloczyn liczb: " << i << " * " << j << endl << endl; }
break;     }
cin >> m;
if (wybor = =1 && m= =suma)
cout << "Brawo "<< endl  << endl  << endl;
if (wybor = =1 && m! = suma)
cout << "Niestety..." << endl << endl << endl;
if (wybor = =2 && m = = roznica)
cout << "Brawo "<< endl << endl  << endl;
if (wybor = =2 && m ! = roznica)
cout << "Niestety..." << endl << endl << endl;
if (wybor = =3 && m = = iloczyn)
cout << "Brawo "<< endl << endl << endl;
if (wybor = =3 && m !=  iloczyn)
cout << "Niestety..." << endl << endl << endl;
cout << "Czy chcesz kontynuowac ? T/N " << endl << endl << endl;
cin >> a;
if (a = = 'n' || a = = 'N')
cout << "bye, bye, bye,...." << endl << endl; 
else
system("cls"); }
return 0;   }

Tabliczka mnożenia

#include <windows.h>
 
int main() {
int i, j, iloczyn, wynik, wybor;
char a = 't';
cout << "Nauka tabliczki mnozenia \n \n";
cout << "Mnożenie liczb naturalnych \n \n";
while (a = ='t' || a = = 'T')  {
srand(time(0));
i = 1 + rand()%10;
j = 1 + rand()%10;
iloczyn = i * j;
cout << "Ile wynosi iloczyn liczb: " << i << "*" << j << endl<< endl;
cin >> wynik;
if (wynik = = iloczyn)  {
wybor = 1 + rand()%6;
switch(wybor) {
case 1: cout << "Wspaniale \n \n";
break;
case 2: cout << "Swietnie sobie radzisz \n \n";
break;
case 3: cout << "Bardzo dobrze, zadziwiasz mnie \n \n";
break;
case 4: cout << "Doskonale \n \n";
break;
case 5: cout << "Gratuluję, czynisz postępy \n \n";
break;
case 6: cout  << "Bardzo fajnie, tak trzymaj \n \n";
break;         }    }
if (wynik != iloczyn)   {
srand(time(0));
wybor = 1 + rand()%6;
switch(wybor) {
case 1: cout << "Niestety,...źle \n \n";
break;
case 2: cout << "Pomyśl trochę, to niepoprawna odpowiedź \n \n";
break;
case 3: cout << "Źle, musisz jeszcze popracowac \n \n";
break;
case 4: cout << "Przykro mi, ale popelnileś błąd \n \n";
break;
case 5: cout << "Błędna odpowiedź, spróbuj jeszcze raz \n \n";
break;  
case 6: cout << "Na gratulacje jeszcze za wcześnie, podałeś zły wynik \n \n";
break;        }      }
cout << "Czy chcesz kontynuować ? T/N \n \n";
cin >> a; 
system("cls"); }
cout << "Bye, bye, bye,... \n \n";
return 0; }

Liczby pierwsze

/* Sprawdzanie, czy podana liczba to liczba pierwsza  */ 
 
int main(){ 
int N, m; 
char a = ‘t’;
cout << "Test liczby pierwszej \n \n";
while (a = ='t'  || a = = 'T'){
 cout << "Wpisz liczbe (calkowita dodatnia);  "; 
 cin >> N; 
 for ( m = 2; m < N;  m = m + 1) 
  if (N % m = = 0){ 
   cout << "Wpisana liczba nie jest pierwsza.  "  <<  endl << endl << endl; 
  else                   
   cout << "Podana liczba jest pierwsza" << endl << endl;   
  }
 cout  <<  ” Nowy test  ?  t/n  ”  << endl << endl ;
 cin >> a;
}
return 0;
}

Funkcja silnia

/ *  obliczanie wartosci funkcji silnia      */
 
int silnia (int i){
int wynik = 1;
while (i > 0){
 wynik = wynik * i;
 i = i - 1;
}
return wynik;             
}
 
int main (){
int n;
cout << "Podaj liczbe naturalna: ";
cin >> n;
while (n < 0)   {
 cout << "Liczba naturalna jest ujemna  ! ";
 cin >> n;     
}
cout << n << "! = " << silnia(n) << endl << endl;
return 0;
}

Całkowanie metodą Monte Carlo

double randf(){
return 1.0*rand()/RAND_MAX;   
}
 
double fun(double y){
return y*y;
}
 
void main(){
char a='t';
long n, i;
double calka, x;
cout << "Calka z funkcji: f(x) = x*x, przedział <0,1>, metoda Monte Carlo" << endll;	
while (a=='t' || a=='T')         {
srand(time(0));
calka=0.0;
cout << "Podaj, ile punktów losujesz w badanym przedziale " << endl << endl;
cin >> n;
for (i = 0; i < n; i++)    {
x = randf();
calka = calka + fun(x); }
calka = calka/double(n);
cout << "Obliczona calka wynosi:  " << calka << endl << endl;
cout << "Liczyc jeszcze raz ? t/n" << endl << endl;
cin >> a;                         }
cout << "Bye, bye, ....." << endl << endl;               
}

Pochodne funkcji

// pierwsza i druga pochodna funkcji, obliczane numerycznie
 
#define max 1000
double fun(double x) {
return sin(x);
}
 
void main(){
char s = 't';
int i, n;
double a, b, dn, dx, x[max], f[max], p1[max], p2[max];
cout << "Numeryczna pochodna funkcji f(x)=sin(x) w przedziale a<x<b ";
cout << endl << endl;
while (s == 't' || s == 'T'){
cout << "Podaj a oraz b (poczatek i koniec przedzialu ) " << endl;
cin >> a >> b;
cout << "Podaj, na ile odcinkow dzielisz przedzial  <a, b> "  <<  endl;
cin >> n;
dn = (double) n;
dx = (b-a)/dn;
for (i = 0; i < n ; i++){
x[i] = i * dx;
f[i] = fun(x[i]);
}
 
for (i=1; i < n-1; i++){
p1[i] = (f[i+1] - f[i-1])/(2.0 * dx);
p2[i] = (f[i+1] - 2.0 * f[i] + f[i-1])/(dx * dx);    
} 
 
p1[0] = 2.0 * f[1] - f[2];
p1[n-1] = 2.0 * f[n-2] - f[n-3];
p2[0] = 2.0 * f[1] - f[2];
p2[n-1] = 2.0 * f[n-2] - f[n-3];                                             
cout << "x    Funkcja pierwotna    Pierwsza pochodna     Druga pochodna";
cout << endl << endl;
for (i=0; i < n; i++)
cout <<  x[i] <<"          "<< f[i] <<"           " << p1[i] <<"         "<< p2[i] << endl;
cout << "Liczyc jeszcze raz ?  t/n " << endl;
cin >> s;  
system("cls");
}  
cout << "Bye, bye, bye, ...." << endl;
}

Obliczanie liczby Pi metodą Monte Carlo

double randf(){
return 1.0 * rand()/RAND_MAX;}
 
void main(void){
char a = 't';
long int k, n, nk=0;
double x, y, r, pi;
cout << "Znajdujemy liczbe pi, metoda Monte Carlo!\n";
while (a = ='t' || a = ='T'){
cout << "Podaj liczbe strzałow" << endl << endl;
cin >> n;
cout << endl << endl;
srand(time(0));
for (k = 0; k < n; k++){ 
x = randf();
y = randf();
r = sqrt(x*x + y*y); 
if (r <= 1.0) 
nk = nk + 1;}
pi = 4.0 * double (nk);
pi = pi/double (n);
cout << "Oddano " << n << " strzalow" << endl << endl;
cout << "Liczba trafien w kolo wynosi:  " << endl << endl;
cout << nk << endl << endl;
cout << "Przylizona wartość liczby pi wynosi: " << endl << endl;
cout << pi << endl << endl;
nk = 0;
cout << "Jeszcze raz ? t/n " << endl << endl;
cin >> a;  
system("cls");}
cout << "Bye, bye, ..." << endl << endl;}