Programowanie Dodatki

Z Skrypty dla studentów Ekonofizyki UPGOW

Spis treści

Dodatek

Zamieszczam tutaj nieco bardziej rozbudowane przykłady programów wykorzystujących instrukcje sterujące. Napisane są wg reguł C++, dla ich zrozumienia kilka wstępnych informacji. 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;

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). 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

</source> 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));

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>.

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 liczbę z przedziału <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 << "Mnożenie liczb całkowitych\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 mnożenia \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 << "Świetnie 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 jest liczbą pierwszą  */ 
 
int main(){ 
int N, m; 
char a = ‘t’;
cout << "Test liczby pierwszej \n \n";
while (a = ='t'  || a = = 'T'){
 cout << "Wpisz liczbę całkowita dodatnią;  "; 
 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 wartości 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 liczbę naturalną: ";
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 dokladność tj. na ile odcinków dzielisz przedział  <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 << 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 liczbę pi, metoda Monte Carlo!\n";
while (a = ='t' || a = ='T'){
cout << "Podaj liczbe strzałów" << 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 << "Przyliżona 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;}