ROSZDZIAŁ

advertisement
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
Download