Obliczenia. Przedstawmy obecnie prosty algorytm dodawania dwóch liczb na kalkulatorze. Najpierw musimy wprowadzić pierwszą z liczb, następnie przycisnąć znak operacji i wprowadzić drugą liczbę. Na zakończenie przyciskamy znak równości mówiący o wykonaniu operacji dodawania. Otrzymany wynik sumowania dwóch liczb ukazuje nam się na wyświetlaczu. Niestety przy programowaniu komputerów algorytm ten musimy sformułować inaczej. Najpierw wprowadzamy liczby, następnie je dodajemy, a na końcu wypisujemy wynik na dostępne urządzenie zewnętrzne np. drukarkę. Algorytm ten możemy przedstawić na schemacie blokowym jak następuje: START Czytaj pierwszą liczbę Czytaj drugą liczbę Dodaj pierwszą liczbę do drugiej . Wypisz wynik sumowania STOP W tym miejscu chcąc zrealizować algorytm, musimy się zdecydować się na wybór języka programowania. W rozdziale tym będzie to ANSI C, ze względu na nie zależność od komputerów, na których jest realizowany. ANSI C jest wynikiem prac prowadzonych przez komitet powołany przez Amerykański Narodowy Instytut Standaryzacji. Jest to, więc jeden z najbardziej uniwersalnych języków programowania, w którym bez obawy na zmiany dotykające informatyki można przedstawić każdy algorytm. Cytowany powyżej algorytm sumowania można zrealizować pisząc program: int main() { double a,b; scanf("%lf",&a); scanf("%lf",&b); printf("a+b=%lf\n",a+b); } Teraz kilka uwag dotyczących programu napisanego w języku ANSI C. Program składa się z funkcji i nagłówka. Funkcja zawiera deklaracje zmiennych i instrukcje umieszczone pomiędzy klamrami { , } oznaczającymi początek i koniec. Program rozpoczyna działanie od pierwszej instrukcji umieszczonej w funkcji main . Inaczej mówiąc każdy algorytm musi zawierać funkcję, od której rozpoczyna działanie, co na schemacie blokowym oznaczmy instrukcją START. int main() { - Funkcja, od której program rozpoczyna działanie - Nawias oznaczający początek funkcji double a,b; - Deklaracja zmiennych a , b scanf("%lf",&a); - Czytanie pierwszej liczby scanf("%lf",&b); - Czytanie drugiej liczby printf("a+b=%f\n",a+b); - Wypisanie wyniku sumy } - Nawias oznaczający koniec funkcji W wyniku wywołania programu i podaniu pierwszej liczby 1 i drugiej 2 otrzymujemy wydruk: a+b=3.000000 Bardzo ważnym elementem przy pisaniu algorytmów jest możliwość podejmowania decyzji w zależności od pojawiających się danych na wejściu. Rozpatrzmy proste zadanie realizujące funkcję f(x) = | x | . Funkcja moduł z x jest zdefiniowana następująco : |x |= -x jeżeli x <0 x jeżeli x≥0 Algorytm obliczania funkcji f(x) zapiszemy za pomocą schematu blokowego: START Czytaj liczbę x Nie Sprawdź, czy x<0 Drukuj x Tak jest mniejsza od zera Drukuj -x STOP Na wykresie możemy przedstawić funkcję znajdowania wartości bezwzględnej dla zadanej wartości x z przedziału domkniętego <-5,5> : y=|x| Y 6 5 4 3 2 1 0 -6 -5 -4 -3 -2 -1 0 1 2 3 4 5 X 6 Rysunek 1. Funkcja y = | x | . Bardziej skomplikowanym zadaniem jest napisanie algorytmu znajdującego znak zadanej liczby rzeczywistej. Podobnie jak poprzednio określimy funkcję za pomocą instrukcji warunkowej. sign( x ) = -1 0 1 jeżeli x < 0 jeżeli x = 0 jeżeli x > 0 Do napisania algorytm obliczania funkcji sign(x) będzie nam potrzebna instrukcja podstawienia, umożliwiająca zmianę wartości zmiennej. Realizacja tej instrukcji ma postać: x = wyrażenie arytmetyczne ; Znak równości w tym wypadku nie oznacza matematycznej relacji porównania dwóch liczb, a przypisanie obliczonej wartości wyrażenia arytmetycznego zmiennej x . Wykonanie instrukcji podstawienia polega zatem na zmianie wartości zmiennej. Jest to niezwykle ważna i użyteczna własność tej instrukcji. Wykorzystamy ją przy konstrukcji następnych algorytmów. Można w tym miejscu dokonać analizy, dlaczego używamy symbolu = a nie jak w językach Algolu czy Pascalu dokonano rezerwacji specjalnego symbolu na potrzeby instrukcji podstawienia. Powód jest bardzo prosty. W algorytmach częściej używamy instrukcji przypisania niż instrukcji logicznego porównywania liczb. Algorytm wyznaczenia funkcji sign(x) przedstawmy najpierw przy pomocy schematu blokowego . START Czytaj liczbę x z = 0 Sprawdź, czy x<0 Nie Tak jest większa od zera Tak jest mniejsza od zera z = -1 Sprawdź, czy x>0 z = 1 Nie Drukuj z STOP Przedstawiony algorytm obliczania funkcji sign ( x ) możemy zrealizować w języku ANSI C w następujący sposób : int sign(double x) { - definicja funkcji sign(x) - nawias oznaczający początek funkcji - deklaracja zmiennej całkowitej z - podstawienie wartości zero - instrukcja warunkowa – przy x>0 - rozpatrzenie warunku przeciwnego - przekazanie liczby do programu - nawias oznaczający koniec funkcji int z; z=0; if(x>0)z=1; else if(x<0)z=-1; return z; } int main() { - definicja funkcji main - nawias oznaczający początek programu - deklaracja zmiennej double a; scanf("%lf",&a); printf("znak %f rowna sie",a); printf(" %d\n",sign(a)); - czytanie zmiennej a - wydruk zmiennej a - wydruk wartości funkcji dla zmiennej a - nawias kończący program } Przedstawiony program jest podzielony na funkcję obliczającą sign( x ) i funkcję main() wykorzystującą tą funkcję do określenia znaku przeczytanej liczby. Mówiąc precyzyjnie funkcja wyznacza liczbę całkowitej równą –1, 0 albo 1 w zależności od przeczytanej liczby rzeczywistej. y=sign(x) 1,5 Y 1 0,5 0 -6 -5 -4 -3 -2 -1 0 -0,5 -1 -1,5 1 2 3 4 5 X 6