Podstawy Informatyki. Algorytmy i ich poprawność

Podobne dokumenty
Matematyka Dyskretna. Andrzej Szepietowski. 25 czerwca 2002 roku

Poprawność algorytmów

Poprawność semantyczna

Algorytm. a programowanie -

Indukcja. Materiały pomocnicze do wykładu. wykładowca: dr Magdalena Kacprzak

3. Podaj elementy składowe jakie powinna uwzględniać definicja informatyki.

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 7 Algorytmy

Definicje. Algorytm to:

1. Liczby wymierne. x dla x 0 (wartością bezwzględną liczby nieujemnej jest ta sama liczba)

START. Wprowadź (v, t) S:=v*t. Wyprowadź (S) KONIEC

1 Wprowadzenie do algorytmiki

Algorytm poprawny jednoznaczny szczegółowy uniwersalny skończoność efektywność (sprawność) zmiennych liniowy warunkowy iteracyjny

Matematyka dyskretna

1. Liczby naturalne, podzielność, silnie, reszty z dzielenia

Indukcja matematyczna

Zadanie 1. Test (6 pkt) Zaznacz znakiem X w odpowiedniej kolumnie P lub F, która odpowiedź jest prawdziwa, a która fałszywa.

EGZAMIN MATURALNY Z INFORMATYKI

Wprowadzenie do algorytmiki

Wstęp do Programowania potok funkcyjny

ALGORYTMY MATEMATYCZNE Ćwiczenie 1 Na podstawie schematu blokowego pewnego algorytmu (rys 1), napisz listę kroków tego algorytmu:

Instrukcje sterujące. wer. 11 z drobnymi modyfikacjami! Wojciech Myszka :53:

Matematyka Dyskretna 2/2008 rozwiązania. x 2 = 5x 6 (1) s 1 = Aα 1 + Bβ 1. A + B = c 2 A + 3 B = d

Algorytm. Krótka historia algorytmów

Podstawowe elementy programu. patrz: następne 2 slajdy. Podstawowe elementy programu. Komendy proste:

Podstawy Informatyki. Programowanie. Inżynieria Ciepła, I rok. Co to jest algorytm? Istotne cechy algorytmu

Wyszukiwanie. Wyszukiwanie binarne

6. Liczby wymierne i niewymierne. Niewymierność pierwiastków i logarytmów (c.d.).

Indukcja matematyczna. Matematyka dyskretna

Język ludzki kod maszynowy

Za pierwszy niebanalny algorytm uważa się algorytm Euklidesa wyszukiwanie NWD dwóch liczb (400 a 300 rok przed narodzeniem Chrystusa).

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 5. Karol Tarnowski A-1 p.

Dr inż. Robert Wójcik, p. 313, C-3, tel Katedra Informatyki Technicznej (K-9) Wydział Elektroniki (W-4) Politechnika Wrocławska

Podzielność, cechy podzielności, liczby pierwsze, największy wspólny dzielnik, najmniejsza wspólna wielokrotność.

Podstawy i języki programowania

Matematyka dyskretna. Andrzej Łachwa, UJ, /15

Wstęp do informatyki- wykład 2

Wykład 4. Określimy teraz pewną ważną klasę pierścieni.

Technologie informacyjne - wykład 12 -

Indukcja matematyczna, zasada minimum i maksimum. 17 lutego 2017

Wstęp do programowania

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

Technologia informacyjna Algorytm Janusz Uriasz

2. Liczby pierwsze i złożone, jednoznaczność rozkładu na czynniki pierwsze, największy wspólny dzielnik, najmniejsza wspólna wielokrotność.

EGZAMIN MATURALNY Z INFORMATYKI. 10 maja 2017 POZIOM ROZSZERZONY. Godzina rozpoczęcia: 14:00 CZĘŚĆ I

EGZAMIN MATURALNY Z INFORMATYKI

Aproksymacja diofantyczna

Wstęp do programowania

Programowanie w języku Python. Grażyna Koba

Zestaw zadań dotyczących liczb całkowitych

Programowanie I. O czym będziemy mówili. Plan wykładu nieco dokładniej. Plan wykładu z lotu ptaka. Podstawy programowania w językach. Uwaga!

Zapis algorytmów: schematy blokowe i pseudokod 1

Matematyka dyskretna. Andrzej Łachwa, UJ, /14

Algorytmy komputerowe. dr inŝ. Jarosław Forenc

Wykład 1. Na początku zajmować się będziemy zbiorem liczb całkowitych

Elżbieta Kula - wprowadzenie do Turbo Pascala i algorytmiki

Jarosław Wróblewski Matematyka Elementarna, lato 2012/13. W dniu 21 lutego 2013 r. omawiamy test kwalifikacyjny.

Algorytmy i struktury danych. Wykład 4

Teoria liczb. Zajmuje się własnościami liczb, wszystkim całkowitych

Indukcja matematyczna. Zasada minimum. Zastosowania.

Języki i metodyka programowania

PROGRAMOWANIE W PYTHONIE OD PIERWSZYCH KROKÓW

Ćwiczenie 3 z Podstaw programowania. Język C++, programy pisane w nieobiektowym stylu programowania. Zofia Kruczkiewicz

ZADANIE 1. Ważenie (14 pkt)

Teoria liczb. Magdalena Lemańska. Magdalena Lemańska,

EGZAMIN MATURALNY Z INFORMATYKI MAJ 2010 POZIOM ROZSZERZONY CZĘŚĆ I WYBRANE: Czas pracy: 90 minut. Liczba punktów do uzyskania: 20 WPISUJE ZDAJĄCY

Wykład IV Algorytmy metody prezentacji i zapisu Rzut oka na język PASCAL

3. Instrukcje warunkowe

Definicja algorytmu brzmi:

Logika Stosowana. Wykład 1 - Logika zdaniowa. Marcin Szczuka. Instytut Informatyki UW. Wykład monograficzny, semestr letni 2016/2017

Programowanie komputerów

Czas pracy: 60 minut

Metody numeryczne. Janusz Szwabiński. nm_slides.tex Metody numeryczne Janusz Szwabiński 2/10/ :02 p.

Jarosław Wróblewski Matematyka Elementarna, zima 2015/16

Matematyka dyskretna. Andrzej Łachwa, UJ, /10

EGZAMIN MATURALNY Z INFORMATYKI 13 MAJA 2019 POZIOM ROZSZERZONY. Godzina rozpoczęcia: 14:00 CZĘŚĆ I WYBRANE: Czas pracy: 90 minut

1. Nagłówek funkcji: int funkcja(void); wskazuje na to, że ta funkcja. 2. Schemat blokowy przedstawia algorytm obliczania

EGZAMIN MATURALNY Z INFORMATYKI

Przykładowe zadania z teorii liczb

Wielomiany. dr Tadeusz Werbiński. Teoria

ALGORYTMY I PROGRAMY

Wiadomości wstępne Środowisko programistyczne Najważniejsze różnice C/C++ vs Java

WHILE (wyrażenie) instrukcja;

Algorytm. Algorytmy Marek Pudełko

Podstawy Informatyki. Metalurgia, I rok niestacjonarne. Wykład 2 Algorytmy

Algorytm. Krótka historia algorytmów

KURS MATURA ROZSZERZONA część 1

Logika Stosowana. Wykład 2 - Logika modalna Część 2. Marcin Szczuka. Instytut Informatyki UW. Wykład monograficzny, semestr letni 2016/2017

Treść wykładu. Pierścienie wielomianów. Dzielenie wielomianów i algorytm Euklidesa Pierścienie ilorazowe wielomianów

Kongruencje pierwsze kroki

MATERIAŁY DO ZAJĘĆ I. Podstawowe pojęcia. Algorytm. Spis treści Przepis

LX Olimpiada Matematyczna

EGZAMIN MATURALNY Z INFORMATYKI POZIOM PODSTAWOWY MAJ 2014 CZĘŚĆ I WYBRANE: Czas pracy: 75 minut. Liczba punktów do uzyskania: 20 WPISUJE ZDAJĄCY

Metody numeryczne I. Janusz Szwabiński. Metody numeryczne I (C) 2004 Janusz Szwabiński p.1/61

0 --> 5, 1 --> 7, 2 --> 9, 3 -->1, 4 --> 3, 5 --> 5, 6 --> 7, 7 --> 9, 8 --> 1, 9 --> 3.

Funkcja kwadratowa. f(x) = ax 2 + bx + c = a

ALGORYTMY I STRUKTURY DANYCH

1. Informatyka - dyscyplina naukowa i techniczna zajmująca się przetwarzaniem informacji.

Jarosław Wróblewski Matematyka Elementarna, lato 2014/15

Zadania do samodzielnego rozwiązania

Opis problemu i przedstawienie sposobu jego rozwiązania w postaci graficznej. Gimnazjum nr 3 im. Jana Pawła II w Hrubieszowie 1

Transkrypt:

Podstawy Informatyki Algorytmy i ich poprawność

Błędy Błędy: językowe logiczne Błędy językowe Związane ze składnią języka Wykrywane automatycznie przez kompilator lub interpreter Prosty sposób usuwania Przykład: //fragment programu w języku C++... if(a){ } Else{ } błąd!!! Komunikat kompilatora: Else brak deklaracji tego identyfikatora. Słowo kluczowe else powinno być napisane z małej litery

Błędy logiczne (1) Błędy semantyczne Związane z semantyką języka programowania Kompilator w niektórych przypadkach sugeruje (ostrzega), że dana konstrukcja może nie działać poprawnie Stosunkowo prosto można je zdiagnozować i usunąć Przykład: //fragment programu w języku C++... if(i=8){ }... Błąd semantyczny Zamiarem programisty było sprawdzenie czy i jest równe 8 (i==8), a nie dokonanie podstawienia i=8 (co zawsze jest prawdziwe)

Błędy algorytmiczne Przykład Błędy logiczne (2) Błędy logiczne wynikające z niepoprawnego rozwiązania zadania algorytmicznego (błędny algorytm rozwiązania) Są niezależne od języka, w którym zaimplementowano algorytm Najtrudniej wykrywalne struktura Lista{ Dane info; Wskaźnik_Lista next; //next jest wskaźnikiem do obiektu typu Lista }; void main(){ Wskaźnik_Lista head=λ; //lista pusta head utworz_liste(head,plik); //utworz liste z danych w pliku plik //i niech head wskazuje na pierwszy element //tej listy while(head){ //operacje na liscie... head = head->next; } } //przegladanie elementow listy błąd algorytmiczny Struktura Lista info next Λ

Testowanie programów Testowanie odbywa się poprzez uruchamianie programu dla danych testowych Debugging proces wielokrotnego uruchamiania programu dla wykrycia i usunięcia błędów. Większość środowisk programistycznych jest wyposażona w narzędzia wspomagające proces debuggowania Obydwie metody nie dają gwarancji wykrycia i usunięcia wszystkich błędów. Niepoprawność algorytmu Wykonanie algorytmu rozwiązania zadania dla pewnego zestawu danych zakończy się prawidłowo, ale wyniki są niepoprawne np. źle sformułowany warunek, powinna być silna nierówność, a jest słaba Działanie algorytmu dla pewnego zestawu danych zostanie przerwane; np. dzielenie przez zero, obliczenie pierwiastka kwadratowego z liczby ujemnej Algorytm dla pewnego zestawu danych działa w nieskończoność (pętle nieskończone); np. przy przeglądaniu listy wskaźnikowej, wskaźnik nie jest przesuwany do następnego elementu listy

Poprawność algorytmu Poprawność algorytmu Zadanie algorytmiczne: 1. I zbiór dopuszczalnych danych wejściowych 2. R zależności między danymi wejściowymi a żądanymi wynikami Przykład: Zbiór I = <N,L>, gdzie N ℵ +, L lista słów. Zależność R wynikiem ma być lista N-elementowa L, utworzona ze słów z listy L, uporządkowana leksykograficznie Zbiór I i relacja R są specyfikacją zadania uporządkowania listy L, opisanego algorytmem A. Algorytm A jest częściowo poprawny względem I i R: X I, jeżeli A uruchomiony dla I zatrzyma się relacja R między X a otrzymanym wynikiem jest spełniona Algorytm A zatrzymuje się dla zbioru I, tzn. algorytm A zatrzymuje się X I Algorytm A jest całkowicie poprawny względem I i R: X I algorytm A zatrzymuje się i daje wynik spełniający relację R

Poprawność algorytmu Indukcja matematyczna Niech P(n) będzie pewnym stwierdzeniem o liczbie całkowitej n. Chcemy udowodnić, że P jest prawdziwe dla n ℵ +. Korzystamy z indukcji matematycznej: 1. Przedstaw dowód, że P(1) jest prawdziwe 2. Przedstaw dowód, że jeśli wszystkie P(1), P(2),.., P(n) są prawdziwe, to P(n+1) jest też prawdziwe Algorytm Euklidesa (rozszerzony) Dane są dwie dodatnie liczby całkowite m i n. Oblicz ich największy wspólny dzielnik (nwd) d, oraz dwie liczby całkowite a i b takie, że am + bn = d. K1. Inicjowanie. a b 1; a b 0; c m; d n; K2. Dzielenie. Niech q i r będą odpowiednio ilorazem i resztą z dzielenia c przez d: c = qd + r i 0 r < d; K3. Czy reszta zero? Jeśli r = 0, zakończ algorytm; w tym przypadku am + bn = d; K4. Ponowienie. Przyjmij c d; d r; t a ; a a; a t qa; t b ; b b; b t qb; wróć do K2. Przykład Niech m = 2884, n = 364 a a b b c d q r 1 0 0 1 2884 364 7 336 0 1 1-7 364 336 1 28 1-1 -7 8 336 28 12 0 (-1)*2884 + 8*364 = -2884 + 2912 = 28

Poprawność algorytmu Dowód poprawności algorytmu Euklidesa dla dowolnych m i n. Lemat Równości a m + b n = c, am + bn = d są prawdziwe po każdym wykonaniu kroku K2 (na podstawie faktu, że równości są prawdziwe po pierwszym dojściu do K2 i krok K4 nie zmienia ich prawdziwości). Stwierdzenie Pary {m, n} i {n, r} mają ten sam zbiór wspólnych dzielników Indukcja względem n. 1. Jeśli m jest wielokrotnością n, to algorytm działa poprawnie (pierwsze wykonanie kroku K3). Tak jest zawsze, gdy n = 1. 2. Jeśli n > 1 i m nie jest wielokrotnością n. Algorytm po pierwszym przebiegu przechodzi do wykonania przypisania c d; d r, oraz r <n z założenia indukcyjnego stwierdzamy, że końcowa wartość d jest nwd liczb n i r. Ze stwierdzenia że, pary {m, n} i {n, r} mają te same wspólne dzielniki wspólny nwd. Stąd d jest nwd liczb m i n. Z lematu am + bn = d.

Poprawność algorytmu Ogólna metoda dowodzenia poprawności dowolnego algorytmu: opis schematu blokowego algorytmu asercjami. Asercje Opisuje stan rzeczy w chwili, gdy wykonywane jest obliczenie strzałki w schemacie blokowym algorytmu związanej z tą asercją. start A1: m > 0, n > 0 K1. a 1; b 1; a 0; b 0; c m; d n; K2. q iloraz(c / d); r reszta(c / d); K3. r == 0? nie tak K1. c d; d r; t a ; a a; a t qa; t b ; b b; b t qb; stop A2: c = m > 0, d = n > 0, a = b =0, a =b = 1 A3: am + bn = d, a m + b n = c = qd + r, 0 <= r < d, nwd(c, d) = nwd(m, n) A4: am + bn = d = nwd(m, n) A5: am + bn = d, a m + b n = c = qd + r, 0 < r < d, nwd(c, d) = nwd(m, n) A6: am + bn = d, a m + b n = c = qd + r, d > 0, nwd(c, d) = nwd(m, n)

Poprawność algorytmu Ogólna metoda polega na udowodnieniu, że dla każdego bloku zachodzi warunek: Jeśli asercja związana z jakąkolwiek strzałką prowadzącą do bloku jest prawdziwa zanim zostanie wykonana operacja opisywana przez blok, to wszystkie asercje związane ze strzałkami wychodzącymi z bloku są prawdziwe po wykonaniu tej operacji. Z prawdziwości powyższego twierdzenia dla każdego bloku wynika, że wszystkie asercje są prawdziwe podczas każdego wykonania algorytmu (dowód przez indukcję względem liczby kroków obliczenia w sensie liczby strzałek w schemacie blokowym, po którym przeszło obliczenie). Metoda dowodzenia poprawności algorytmów przez asercje i indukcję pochodzi od R.W. Floyda: definicja każdej operacji języka programowania może być sformułowana jako reguła logiczna mówiąca, że pewne asercje można udowodnić po operacji przy założeniu, że pewne asercje były prawdziwe przed operacją. Metoda została rozwinięta przez C.A.R. Hoare a jako metoda niezmienników.