Programowanie Dodatki

Z Skrypty dla studentów Ekonofizyki UPGOW

Spis treści

Dodatek 1

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 1

Losowanie liczby całkowitej z przedzialu <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;  	}    }