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