Algorytm a programowanie -
Program komputerowy: Program komputerowy można rozumieć jako: kod źródłowy - program komputerowy zapisany w pewnym języku programowania, zestaw poszczególnych instrukcji, plik wykonywalny - program, który można uruchomić.
Etapy tworzenia programu: Kod źródłowy programu w języku C jest to plik tekstowy z rozszerzeniem.c, który może być przygotowany w dowolnym edytorze zapisującym niesformatowane pliki tekstowe. Kompilacja polega na przetłumaczeniu kodu źródłowego na tzw. kod wynikowy, maszynowy (pliki z rozszerzeniem.o lub.obj).
Etapy tworzenia programu: Podczas kompilacji programu mogą wystąpić błędy. Poprawienie tego rodzaju błędów wymaga ponownej edycji kodu źródłowego. Łączenie (konsolidacja) polega na połączeniu kodu wynikowego (.o lub.obj) z odpowiednimi bibliotekami. Podczas łączenia mogą wystąpić błędy spowodowane brakiem odpowiedniej biblioteki. Uruchomienie pliku wykonywalnego.exe.
Etapy tworzenia programu: Po uruchomieniu programu mogą wystąpić błędy. Błędy takie mogą być spowodowany wykonaniem przez program niedozwolonej operacji, np. odwołaniem do zabronionego obszaru pamięci. Innego rodzaju błędem może być zwrócenie przez program niepoprawnego wyniku. W obu przypadkach poprawienie błędu wymaga ponownej edycji kodu źródłowego.
Uruchomienie programu: Skompilowany program (plik wykonywalny.exe) przechowywany jest na nośniku danych (np. dysk twardy, dyskietka, płyta CD/DVD, PenDrive). Uruchomienie programu wymaga jego odczytania z nośnika i załadowania do pamięci operacyjnej komputera (RAM). Za taką operację odpowiedzialny jest system operacyjny. Uruchomiony program nazywany jest procesem. Proces w pamięci komputera ma określoną strukturę, przedstawioną na poniższym rysunku.
Uruchomienie programu: Blok kontrolny procesu jest strukturą danych tworzoną i zarządzaną przez system operacyjny, a opisującą właściwości procesu. Blok kontrolny procesu zawiera m.in. identyfikator, stan procesu, priorytet, licznik programu, wskaźniki pamięci, informacje na temat żądań we/wy.
Uruchomienie programu: Program jest to kod wykonywanego programu (instrukcje programu). Dane są to dane potrzebne programowi podczas wykonywania. Stos jest specjalnym miejscem, w którym przechowywane są tzw. zmienne lokalne oraz kody powrotu z funkcji. Programy komputerowe działają zazwyczaj zgodnie z pewnym algorytmem
Definicje algorytmu: algorytm - skończony, uporządkowany ciąg jasno zdefiniowanych czynności, koniecznych do wykonania pewnego zadania. algorytm - metoda rozwiązania zadania. algorytm - ściśle określona procedura obliczeniowa, która dla właściwych danych wejściowych zwraca żądane dane wyjściowe zwane wynikiem działania algorytmu. algorytm - skończony zbiór reguł, wskazujący kolejność operacji przy rozwiązywaniu problemu pewnego typu.
Podstawowe cechy algorytmu: Algorytm powinien posiadać dane wejściowe (w ilości większej lub równej zeru) pochodzące z dobrze zdefiniowanego zbioru. Algorytm powinien zwracać pewien wynik: - działanie algorytmu niezwracającego wyniku pozbawione jest sensu. Algorytm powinien być precyzyjnie zdefiniowany: - każdy krok algorytmu musi być jednoznacznie określony. Algorytm powinien być zawsze poprawny: - ale dla każdego z założonego dopuszczalnego zestawu danych wejściowych, - w algorytmie mogą (ale nie muszą) być zaimplementowane mechanizmy reakcji na błędne dane wejściowe. Algorytm powinien zawsze kończyć się po skończonej liczbie kroków: - w algorytmie powinna istnieć poprawnie działająca reguła stopu. Algorytm powinien być efektywny: - jak najkrótszy czas wykonania, - jak najmniejsze zapotrzebowanie na pamięć.
Podstawowe cechy algorytmu: Algorytm może zostać zaimplementowany w postaci programu komputerowego lub dla innego urządzenia. Ten sam algorytm może być zaimplementowany w różny sposób przy użyciu różnych języków programowania.
1. Opis słowny algorytmu: Opis słowny przypomina przepis kulinarny z książki kucharskiej
2. Schemat blokowy: Schematy blokowe nie mają jednej, ściśle określonej postaci. Najczęściej na schematach blokowych występują cztery podstawowe elementy (początek algorytmu, koniec algorytmu, blok funkcyjny, blok decyzyjny) oraz strzałki określające kolejność wykonywania operacji. Elementy występujące na schematach blokowych algorytmów:
Algorytm Euklidesa: Rozważmy sposób zapisu jednego z najbardziej znanych algorytmów algorytmu Euklidesa znajdowania największego wspólnego dzielnika dwóch liczb - NWD(a,b) Przykład nr 1.2 Algorytm: Euklidesa (opis algorytmu w punktach) Dane wejściowe: niezerowe liczby naturalne a i b Dane wyjściowe: NWD(a,b) Kolejne kroki: 1. Czytaj liczby a i b. 2. Dopóki a i b są większe od zera, powtarzaj krok 3, a następnie przejdź do kroku 4. 3. Jeśli a jest większe od b, to weź za a resztę z dzielenia a przez b, w przeciwnym razie weź za b resztę z dzielenia b przez a. 4. Przyjmij jako największy wspólny dzielnik tę z liczb a i b, która pozostała większa od zera. 5. Drukuj NWD(a,b).
Działanie powyższego algorytmu sprawdźmy na przykładzie: - szukamy: NWD(1675,3752), czyli a = 1675, b = 3752 - dzielimy większą liczbę przez mniejszą: b/a = 3752/1675 = 2 reszta 402; za b podstawiamy resztę z dzielenia, czyli teraz: a = 1675, b = 402 - dzielimy większą liczbę przez mniejszą: a/b = 1675/402 = 4 reszta 67; za a podstawiamy resztę z dzielenia, czyli teraz: a = 67, b = 402 - dzielimy większą liczbę przez mniejszą: b/a = 402/67 = 6 reszta 0; za b podstawiamy resztę z dzielenia, czyli teraz: a = 67, b = 0 - za NWD przyjmujemy tę z liczb a i b, która jest większa od zera, czyli: NWD(1675,3752) = 67
Przykład nr 1.3
Przykład nr 1.4 Zapis algorytmu Euklidesa w pseudokodzie. NWD(a,b) while a>0 i b>0 do if a>b then a a mod b else b b mod a if a>0 then return a else return b
Przykład nr 1.5 Zapis algorytmu Euklidesa jako funkcja w języku C. int NWD(int a, int b) { while (a>0 && b>0) if (a>b) a = a % b; else b = b % a; if (a>0) return a; else return b; }
Przykład nr 1.6 Narysuj schemat blokowy algorytmu wyznaczającego wartość bezwzględną (moduł) liczby. Wartość bezwzględna liczby określana jest następującym wzorem:
Wczytaj(x) można rozumieć jako podanie przez użytkownika wartości x (wczytanie z klawiatury) lub też przekazanie argumentu do funkcji, która wyznacza wartość bezwzględną liczby. Drukuj(x) można rozumieć jako wyświetlenie na ekranie wyniku lub też zwrócenie go przez funkcję. W językach programowania do obliczenia wartości bezwzględnej liczby stosowane są funkcje (x jest argumentem przekazywanym do funkcji): - C, C++ - abs(x), fabs(x), - Fortran - abs(x),
Przykład nr 1.7 Narysuj schemat blokowy algorytmu sprawdzającego parzystość liczby całkowitej.
Zasada działania powyższego algorytmu jest następująca: - wczytujemy liczbę x, - jeśli liczba x jest ujemna, to zamieniamy ją na dodatnią: x = -x, - jeśli liczba x jest większa od 1, to odejmujemy od niej wartość 2 - operację tę powtarzamy do momentu, aż x będzie mniejsze lub równe 1, - jeśli x jest równe 0, to liczba była parzysta, w przeciwnym wypadku (czyli, gdy x jest równe 1) - liczba była nieparzysta
Przykład nr 1.8 Parzystość liczby całkowitej można sprawdzić w prostszy sposób, wykorzystując dzielenie modulo. Dzielenie modulo zwraca resztę z dzielenia. Jeżeli liczbę całkowitą podzielimy modulo 2 to w wyniku możemy otrzymać: - 0 - jeśli liczba jest parzysta, - 1 lub -1 - jeśli liczba jest nieparzysta. Schemat blokowy algorytmu sprawdzającego parzystość liczby przy wykorzystaniu dzielenia modulo 2 przedstawiony jest na poniższym rysunku.
Przykład nr 1.9 Narysuj schemat blokowy algorytmu obliczającego silnię liczby n. Silnią liczby naturalnej n (w notacji matematycznej n!) nazywamy iloczyn wszystkich liczb naturalnych nie większych niż n. n!= 1 2 3... n przy czym 0!=1, 1!=1, 2!=1 2, 3!=1 2 3,...
Przykład nr 1.10 Narysuj schemat blokowy algorytmu rozwiązującego równanie kwadratowe. ZADANIE DOMOWE