Podstawy Programowania

Podobne dokumenty
Podstawy Programowania. Obsługa błędów, przeszukiwanie i sortowanie tablic

Podstawy Programowania. Obsługa błędów, przeszukiwanie i sortowanie tablic

Podstawy Programowania. Obsługa błędów, przeszukiwanie i sortowanie tablic

Podstawy Programowania

Programowanie proceduralne INP001210WL rok akademicki 2015/16 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

Informatyka 1. Rekordy, przeszukiwanie i sortowanie tablic

Informatyka 1. Rekordy, przeszukiwanie i sortowanie tablic

Definicja. Ciąg wejściowy: Funkcja uporządkowująca: Sortowanie polega na: a 1, a 2,, a n-1, a n. f(a 1 ) f(a 2 ) f(a n )

Informatyka 1. Złożoność obliczeniowa

Ćwiczenie 4. Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1.

Podstawy Programowania

Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1. Kraków 2013

wykład II uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C - funkcje, tablice i wskaźniki wykład II dr Jarosław Mederski Spis

Podstawy Programowania. Złożoność obliczeniowa

Algorytm selekcji Hoare a. Łukasz Miemus

Podstawy Programowania. Specyfikacja funkcji, operacje wejścia i wyjścia na plikach, rekurencja, tablice i wskaźniki

Podstawy Programowania. Złożoność obliczeniowa

Podstawy Programowania

Laboratorium Systemów Operacyjnych. Ćwiczenie 4. Operacje na plikach

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

WYKŁAD 8. Funkcje i algorytmy rekurencyjne Proste przykłady. Programy: c3_1.c..., c3_6.c. Tomasz Zieliński

Łącza nienazwane(potoki) Łącza nienazwane mogą być używane tylko pomiędzy procesami ze sobą powiązanymi.

Podstawy programowania w języku C++

funkcje rekurencyjne Wykład 12. Podstawy programowania (język C) Funkcje rekurencyjne (1) Funkcje rekurencyjne (2)

Wstęp do Programowania, laboratorium 02

Poprzedni wykład [ ] :

Operacje wejścia/wyjścia odsłona pierwsza

Pobieranie argumentów wiersza polecenia

Wykład VI. Programowanie. dr inż. Janusz Słupik. Gliwice, Wydział Matematyki Stosowanej Politechniki Śląskiej. c Copyright 2014 Janusz Słupik

Program wykonujący operację na plikach powinien zachować schemat działania zapewniający poprawną pracę:

Podstawy Programowania. Specyfikacja funkcji, operacje wejścia i wyjścia na plikach, rekurencja, tablice i wskaźniki

۰ Elementem jednostkowym takiego pliku jest bajt. ۰ Format pliku binarnego: [bajty pliku][eof]

Podstawy programowania. Wykład Pętle. Tablice. Krzysztof Banaś Podstawy programowania 1

Pliki w C/C++ Przykłady na podstawie materiałów dr T. Jeleniewskiego

Strategia "dziel i zwyciężaj"

Ćwiczenie nr 6. Poprawne deklaracje takich zmiennych tekstowych mogą wyglądać tak:

Wykład 5_2 Algorytm ograniczania liczby serii za pomocą kopcowego rozdzielania serii początkowych

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

Operacje wejścia/wyjścia (odsłona druga) - pliki

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

Pliki. Informacje ogólne. Obsługa plików w języku C

Języki programowania. Przetwarzanie plików amorficznych Konwencja języka C. Część siódma. Autorzy Tomasz Xięski Roman Simiński

Wyjątki. Wyjątki. Bogdan Kreczmer. Katedra Cybernetyki i Robotyki Politechnika Wrocławska

Tablice i struktury. czyli złożone typy danych. Programowanie Proceduralne 1

Programowanie w VB Proste algorytmy sortowania

Podstawy Programowania

Podstawowe algorytmy i ich implementacje w C. Wykład 9

Analiza algorytmów zadania podstawowe

Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak

Jeszcze o algorytmach

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Lab 8. Tablice liczbowe cd,. Operacje macierzowo-wektorowe, memcpy, memmove, memset. Wyrażenie warunkowe.

Programowanie proceduralne INP001210WL rok akademicki 2017/18 semestr letni. Wykład 3. Karol Tarnowski A-1 p.

Informatyka 1. Przetwarzanie tekstów

Wartości domyślne, przeciażenia funkcji

Część 4 życie programu

Obsługa plików. Systemy Operacyjne 2 laboratorium. Mateusz Hołenko. 25 września 2011

Wartości domyślne, przeciażenia funkcji

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

Lab 9 Podstawy Programowania

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

5 Przygotował: mgr inż. Maciej Lasota

Argumenty wywołania programu, operacje na plikach

main( ) main( void ) main( int argc, char argv[ ] ) int MAX ( int liczba_1, liczba_2, liczba_3 ) źle!

Języki i paradygmaty programowania 1 studia stacjonarne 2018/19. Lab 9. Tablice liczbowe cd,. Operacje na tablicach o dwóch indeksach.

Algorytmy sortujące i wyszukujące

Podstawy Programowania. Składnia wyrażeń i instrukcji, złożoności obliczeniowej, operacje wejścia i wyjścia, definicja

Sortowanie. LABORKA Piotr Ciskowski

Programowanie w językach wysokiego poziomu

Języki programowania. Karolina Mikulska-Rumińska Pokój 573, tel Konsultacje wtorek 9-10.

4. Tablica dwuwymiarowa to jednowymiarowa tablica wskaźników do jednowymiarowych tablic danego typu.

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

4. Wyrzuć wyjątek jeśli zmienna ist nie istnieje bloki: try, catch i wyrzucanie wyjątku

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 9 - sem.iii. Dr inż. M. Czyżak

Laboratorium 5: Tablice. Wyszukiwanie binarne

Tablice, funkcje - wprowadzenie

Biblioteka standardowa - operacje wejścia/wyjścia

Metodyki i Techniki Programowania 2

Tablice deklaracja, reprezentacja wewnętrzna

Programowanie Procedurale. Pliki w języku C++

Wskaźniki. Informatyka

Pliki. Informacje ogólne. Obsługa plików w języku C

Podstawy programowania skrót z wykładów:

tablica: dane_liczbowe

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 12. Karol Tarnowski A-1 p.

Podstawy Programowania Podstawowa składnia języka C++

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

Referencje do zmiennych i obiektów

Zasady programowania Dokumentacja

TABLICE W JĘZYKU C/C++ typ_elementu nazwa_tablicy [wymiar_1][wymiar_2]... [wymiar_n] ;

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

Rozwiązanie. #include <cstdlib> #include <iostream> using namespace std;

Algorytmy sortowania w języku C. Autor: mgr inż. Sławomir Samolej. Zagadnienie 1. (Sortowanie)

Kolokwium ze wstępu do informatyki, I rok Mat. (Ściśle tajne przed godz. 10 : grudnia 2005.)

Pliki wykład 2. Dorota Pylak

Zaprojektować i zaimplementować algorytm realizujący następujące zadanie.

Transkrypt:

Podstawy Programowania Wykład VIII Obsługa błędów, przeszukiwanie i sortowanie tablic Robert Muszyński ZPCiR IIAiR PWr Zagadnienia: źródła błędów, organizacja obsługi błędów, standardowe funkcje obsługi błędów, przeszukiwanie tablic: liniowe, binarne, sortowanie tablic: przez wstawianie, drzewiaste, bąbelkowe, szybkie, przez scalanie. Copyright c 2007 2014 Robert Muszyński Niniejszy dokument zawiera materiały do wykładu na temat podstaw programowania w językach wysokiego poziomu. Jest on udostępniony pod warunkiem wykorzystania wyłącznie do własnych, prywatnych potrzeb i może być kopiowany wyłącznie w całości, razem ze stroną tytułową. Skład FoilTEX Obsługa błędów, przeszukiwanie i sortowanie tablic 1 Ogólne uwagi o postępowaniu z błędami W naszych małych programach ilustracyjnych zazwyczaj nie martwiliśmy się o stan zakończonego programu. W poważnym programie koniecznie trzeba dbać o zwracanie sensownych i użytecznych wartości opisujących ten stan. ma jednego, najlepszego sposobu przekazywania informacji o błędach pojawiających się w programie można to robić zarówno centralnie jak i lokalnie. Do tego pojawiają się pytania: Czy jest obowiązkowe testowanie i obsługiwanie absolutnie wszystkich sytuacji nienormalnych? Czy próby wybrnięcia z nieoczekiwanych błędów mają w ogóle sens? Rozsądna zasada: jeśli wystąpił błąd to jesteśmy w kłopotach lepiej nie kombinujmy za dużo, tylko starajmy się wybrnąć z całej sytuacji w najprostszy możliwy sposób. W braku lepszego pomysłu możemy WKZP (wyświetlić komunikat i zakończyć program). Inny wniosek: własne funkcje piszmy tak, aby w razie porażki ich użytkownik uzyskał informacje o miejscu i przyczynie powstania błędu i mógł podjąć właściwe decyzje co do sposobu dalszego postępowania.

Obsługa błędów, przeszukiwanie i sortowanie tablic 2 Ogólne uwagi o postępowaniu z błędami cd. Ważne jest by przy wystąpieniu błędu program zwrócił odpwiednią wartość i/lub właściwie sformułowany komunikat o błędzie. Przyjmuje się, że zwracana przez program wartość zero świadczy o poprawnym wykonaniu programu, natomiast jakakolwiek niezerowa wartość sygnalizuje sytuację awaryjną. Komunikat wypisywany w przypadku błędu musi dawać użytkownikowi programu szansę na podjęcie dalszych działań. Dobra zasada: Mów to, o czym naprawdę myślisz, zdawaj sobie sprawę z tego, co mówisz, bądź zwięzły. Należy zadbać o to, by wypisywany komunikat nie ugrzązł gdzieś wśród danych wyjściowych lub w potoku. Rodzaje typowych błędów: błędy ochrony pamięci błędy zakresu błędy wejścia/wyjścia błędy obliczeniowe (dzielenie przez zero, przekroczenie zakresu itp.) błędy konwersji Obsługa błędów, przeszukiwanie i sortowanie tablic 3 Przykład kopiowanie plików #include <stdio.h> main(int argc, char *argv[]) { FILE *fp1, *fp2; int c; fp1 = fopen(argv[1], "r"); fp2 = fopen(argv[2], "w"); while ((c = getc(fp1))!= EOF) putc(c,fp2); Na pozór działa poprawnie, ale co będzie w przypadku jakiegoś błędu, np.: niepoprawnej liczby argumentów, niepoprawnej nazwy pliku(ów), braku pliku źródłowego, braku praw dostępu do pliku źródłowego, braku prawa do zapisu pliku docelowego, niedostępnego dysku jednego z plików, braku miejsca na dysku itd. Uwzględniając błędy funkcji systemowych dostajemy:

Obsługa błędów, przeszukiwanie i sortowanie tablic 4 main(int argc, char *argv[]) { /* wersja 2: z wykrywaniem bledow */ FILE *fp1, *fp2; int c; /* funkcji systemowych */ if (argc!= 3) { fprintf(stderr,"%s: wymagane 2 argumenty (podane %d)\n",argv[0],argc-1); exit(1); if ((fp1 = fopen(argv[1], "r")) == NULL) { fprintf(stderr,"%s: blad otwarcia pliku %s do odczytu\n",argv[0],argv[1]); exit(2); if ((fp2 = fopen(argv[2], "w")) == NULL) { fprintf(stderr,"%s: blad otwarcia pliku %s do zapisu\n",argv[0],argv[2]); exit(3); while ((c = getc(fp1))!= EOF) if (putc(c, fp2) == EOF) { fprintf(stderr,"%s: blad zapisu na pliku %s\n",argv[0],argv[2]); exit(4); if (ferror(fp1)!= 0) { fprintf(stderr,"%s: blad czytania z pliku %s\n",argv[0],argv[1]);/*******/ exit(5); /* pomijamy zamykanie plikow */ exit(0); /* i bledy z tym zwiazane */ /*****************************/ Obsługa błędów, przeszukiwanie i sortowanie tablic 5 Obsługa błędów przykłady Funkcja kopiująca napisy /* kopiuj napis wskazywany przez wej do wyj */ /* PRE: poprawnie zainicjowane wej i wyj */ /* POST: skopiowanie napisu *wej na *wyj */ void KopiujNapis(char *wej, char *wyj) { while ((*wyj++ = *wej++)!= \0 ); Kopiowanie plików całkiem podobne /* kopiuj zawartosc pliku wej do pliku wyj */ /* PRE: poprawnie zainicjowane wej i wyj */ /* POST: skopiowanie strumienia wej na wyj */ void KopiujPlik(FILE *wej, FILE *wyj) { int c; while ((c = getc(wej))!= EOF) putc(c,wyj);

Obsługa błędów, przeszukiwanie i sortowanie tablic 6 #include <stdio.h> /* cat: sklej zawartosc plikow */ main(int argc, char *argv[]) { FILE *fp; void filecopy(file *, FILE *); char *prog = argv[0]; /* nazwa programu do komunikatow */ if (argc == 1) /* wywolanie bez arg.: kopiuj stdin */ filecopy(stdin, stdout); else while (--argc > 0) if ((fp = fopen(*++argv, "r")) == NULL) { fprintf(stderr, "%s: nie moge otworzyc %s\n", prog, *argv); exit(1); else { filecopy(fp, stdout); fclose(fp); if (ferror(stdout)) { fprintf(stderr, "%s: wystapil blad zapisu stdout\n", prog); exit(2); exit(0); Obsługa błędów, przeszukiwanie i sortowanie tablic 7 Uwagi o postępowaniu z błędami cd. Wszystkie błędy pojawiające się w programie można podzielić na krytyczne (zakończenie działania programu) i niekrytyczne (mimo wszystko coś się da zrobić). W programie można skonstruować cetralny system obsługi błędów, w którym to funkcje w przypadku napotkania błędu albo wywołują centralną funkcję obsługi błędów i przekazują jej sterowanie, albo odpowiednio przygotowują i zwracają kod błędu, który po dotarciu na sam szczyt obsługiwany jest przez odpowiednią funkcję obsługi błędów. Można także wykorzystać rozproszony system obsługi błędów każda funkcja sama obsługuje napotkane błędy, wysyłając odpowiednie komunikaty i ewentualnie kończąc program. W każdym razie przy obsłudze błędów można wesprzeć się standardową funkcją void perror(const char *s), która wypisuje tekst z tablicy s i zależny od implementacji komunikat o błędzie, odpowiadający wartości zmiennej errno, czy też funkcją char *strerror(int nr), zwracającą wskaźnik do zależnego od implementacji tekstu komunikatu odpowiadającego błędowi o numerze nr (nagłówki stdio.h, errno.h i string.h).

Obsługa błędów, przeszukiwanie i sortowanie tablic 8 Obsługa błędów, przeszukiwanie i sortowanie tablic 9 main(int argc, char *argv[]) { /* wersja 2: z wykrywaniem bledow */ FILE *fp1, *fp2; int c; /* funkcji systemowych */ if (argc!= 3) { fprintf(stderr,"%s: wymagane 2 argumenty (podane %d)\n",argv[0],argc-1); exit(1); if ((fp1 = fopen(argv[1], "r")) == NULL) { fprintf(stderr,"%s: blad otwarcia pliku %s do odczytu\n",argv[0],argv[1]); exit(2); if ((fp2 = fopen(argv[2], "w")) == NULL) { fprintf(stderr,"%s: blad otwarcia pliku %s do zapisu\n",argv[0],argv[2]); exit(3); while ((c = getc(fp1))!= EOF) if (putc(c, fp2) == EOF) { fprintf(stderr,"%s: blad zapisu na pliku %s\n",argv[0],argv[2]); exit(4); if (ferror(fp1)!= 0) { fprintf(stderr,"%s: blad czytania z pliku %s\n",argv[0],argv[1]);/*******/ exit(5); /* pomijamy zamykanie plikow */ exit(0); /* M I E L I S M Y */ /* i bledy z tym zwiazane */ /*****************************/ main(int argc, char *argv[]) { /* wersja 3: wyswietlane */ FILE *fp1, *fp2; int c; /* komunikaty o bledach */ if (argc!= 3) { fprintf(stderr,"%s: wymagane 2 argumenty (podane %d)\n",argv[0],argc-1); exit(1); if ((fp1 = fopen(argv[1], "r")) == NULL) { perror("blad otwarcia pliku do odczytu"); exit(2); if ((fp2 = fopen(argv[2], "w")) == NULL) { perror("blad otwarcia pliku do zapisu"); exit(3); while ((c = getc(fp1))!= EOF) if (putc(c, fp2) == EOF) { perror("blad zapisu na pliku"); exit(4); if (ferror(fp1)!= 0) { perror("blad czytania z pliku");/****************************************/ exit(5); /* niby troche krocej, ale nie wszystko */ exit(0); /* M A M Y */ /* wyswietlamy co poprzednio */ /****************************************/

Obsługa błędów, przeszukiwanie i sortowanie tablic 10 #include <errno.h> /* wersja 4: jawnie formatowane */ int errno; /* komunikaty o bledach */ main(int argc, char *argv[]) { FILE *fp1, *fp2; int c; if (argc!= 3) { fprintf(stderr, "%s: wymagane 2 argumenty (podane %d)\n",argv[0],argc-1); exit(1); if ((fp1 = fopen(argv[1], "r")) == NULL) { fprintf(stderr,"%s: blad otwarcia do odczytu pliku %s, %s",argv[0],argv[1],strerror(errno)); exit(2); if ((fp2 = fopen(argv[2], "w")) == NULL) { fprintf(stderr,"%s: blad otwarcia do zapisu pliku %s, %s",argv[0],argv[2],strerror(errno)); exit(3); while ((c = getc(fp1))!= EOF) if (putc(c, fp2) == EOF) { fprintf(stderr, "%s: blad zapisu na pliku %s, %s", argv[0], argv[2], strerror(errno)); exit(4); if (ferror(fp1)!= 0) { fprintf(stderr, "%s: blad czytania z pliku %s, %s", argv[0], argv[1], strerror(errno));... /* P O L A C Z E N I E D W O C H P O P R Z E D N I C H */ Obsługa błędów, przeszukiwanie i sortowanie tablic 11 Obsługa błędów podsumowanie Należy dbać o zwracanie sensownych i użytecznych komunikatów i wartości informujących o pojawiających się błędach. Zdecydowanie nie należy dążyć do obsłużenia wszystkich możliwych błędów. W przypadku interfejsu do systemu (czytanie plików, komunikacja między procesami) można ograniczyć obsługę błędów do rzeczy podstawowych przy konstruowaniu interfejsu do użytkownika (menu, ręcznie wprowadzane dane) obsługa błędów powinna być bardziej rozbudowana. Porządny projekt programu pozwoli na uniknięcie wielu potknięć już na samym starcie w tym zaplanowanie poprawnego systemu obsługi błędów. Informacje o błędach wysyłać w odpowiednie miejsca (return, exit, fprintf(stderr,...)). Wykorzystywać dostępne mechanizmy obsługi błędów (perror, strerror), pamiętając o ich właściwościach, np. o tym, że zmienna errno jest ustawiana przez funkcje, które wykrywają i sygnalizują sytuacje nienormalne, lecz nie zmienia wartości, gdy wynik działania funkcji jest poprawny (zatem wartość errno może odnosić się do wcześniejszego niż ostatnie wywołania funkcji, albo do późniejszego niż to, o które nam chodzi).

Obsługa błędów, przeszukiwanie i sortowanie tablic 12 Przeszukiwanie tablic liniowe binarne Tab[min] = wzorzec lub min = max? Srodek = (min + max) div 2 Tab[Srodek] = wzorzec lub min=max? Poszukiwanie wzorca wœród elementów tablicy jednowymiarowej od elementu min do max min = min + 1 Poszukiwanie wzorca wœród elementów tablicy jednowymiarowej od elementu min do max max = Srodek - 1 min = Srodek + 1 Tab[Srodek] < wzorzec? Obsługa błędów, przeszukiwanie i sortowanie tablic 13 Przeszukiwanie liniowe int Przeszukaj(int tab[], int Klucz, int min,max,domysl) /* Wyszukuje wartosc Klucz w tablicy tab */ /* pomiedzy indeksami min i max */ /* Zwraca jej ind. lub domysl gdy!znaleziona */ { int znaleziony; znaleziony = 0; while ((!znaleziony) && (min <= max)) { if (Porownanie(tab[min],Klucz)) znaleziony = 1; else min := min + 1; if (znaleziony) return min; else return domysl; /* Przeszukaj */ Przeszukiwanie binarne /*... POSORTOWANEJ */ srodek = (min + max) / 2; switch (Porownanie(tab[srodek],Klucz)) { case 0: znaleziony = 1; break; case -1: max = srodek - 1; break; case 1: min = srodek + 1; break;

Obsługa błędów, przeszukiwanie i sortowanie tablic 14 Obsługa błędów, przeszukiwanie i sortowanie tablic 15 Sortowanie Sortowanie przez proste wstawianie przez wstawianie przez proste wstawianie przez wstawianie połówkowe j = 2 Sortowanie tablicy przez wstawianie przez wybieranie temp = Tab[j] i = j - 1 Wstaw Tab[j] w posortowany ci¹g Tab[1..j-1] drzewiaste przez zamianę 5 2 4 6 1 3 Tab[i] > temp i i > 0? Tab[i+1] = Tab[i] i = i - 1 bąbelkowe szybkie przez scalanie hybrydowe 2 5 4 6 1 3 2 4 5 6 1 3 2 4 5 6 1 3 1 2 4 5 6 3 1 2 3 4 5 6 Tab[i+1] = temp Czy element j-ty jest ostatni? j = j + 1

Obsługa błędów, przeszukiwanie i sortowanie tablic 16 Sortowanie drzewiaste Obsługa błędów, przeszukiwanie i sortowanie tablic 17 Sortowanie bąbelkowe Przekszta³æ tablicê w drzewo binarne Sortowanie tablicy drzewiaste krok I 5 2 4 6 1 3 5 j = 1 i = 1 Sortowanie tablicy b¹belkowe 5 2 4 6 1 3 ObejdŸ drzewo w porz¹dku "najpierw w lewo" i wypisz ka dy element przy okazji drugich jego odwiedzin 1 2 4 6 Tab[i] > Tab[i+1]? Zamieñ Tab[i] z Tab[i+1] 2 4 5 1 3 6 2 4 1 3 5 6 3 i = i + 1 2 1 3 4 5 6 krok II 5 2 1 1 1 2 4 3 3 3 4 4 2 5 6 6 6 5 Czy element i-ty jest przedostatni? 1 2 3 4 5 6 1 2 3 4 5 6 j < n - 1? j = j + 1

Obsługa błędów, przeszukiwanie i sortowanie tablic 18 Sortowanie bąbelkowe Obsługa błędów, przeszukiwanie i sortowanie tablic 19 Sortowanie szybkie j = 1 i = 1 Sortowanie tablicy b¹belkowe Sortuj (l, p) i = l j = p x = Tab[(i + j) div 2] Szybkie sortowanie elementów l..p tablicy Sortuj (1, n) Sortowanie tablicy szybkie Tab[i] > Tab[i+1]? i = i + 1 Czy element i-ty jest przedostatni? j < n - 1? Zamieñ Tab[i] z Tab[i+1] j = j + 1 void BubbleSort(int Tab[], int min, max) { int i, j; for(j = min; j < max; j++) for(i = min; i < max; i++) if (Tab[i] > Tab[i+1]) Zamien(Tab[i], Tab[i+1]); /* BubbleSort */ Tab[i] < x? Tab[j] > x? i <= j? l < j? i < p? i = i + 1 j = j - 1 Zamieñ Tab[i] z Tab[j] i = i + 1; j = j - 1 Sortuj (l, j) Sortuj (i, p) l 5 5 1 2 4 6 7 8 1 3 j 2 4 3 1 8 7 6 2 3 4 5 6 7 8 i p

Obsługa błędów, przeszukiwanie i sortowanie tablic 20 Sortowanie szybkie funkcja standardowa W nagłówku stdlib.h znajduje się funkcja void qsort(void *base, size_t nel, size_t width, int (*compar)(const void *, const void *)); int porownaj_int(const void *p1, const void *p2) { int *i = (int *)p1; int *j = (int *)p2; if (*i > *j) return (1); if (*i < *j) return (-1); return (0); /* porownaj_int */ #define TSIZE 10 int main() { int a[tsize] = { 9, 8, 7, 6, 5, 4, 3, 2, 1, 0 ; qsort((void *)a, (size_t) TSIZE, sizeof(int), porownaj_int); Obsługa błędów, przeszukiwanie i sortowanie tablic 21 Podziel tablicê na dwie czêœci Posortuj otrzymane tablice u ywaj¹c rekurencyjnie sortowania przez scalanie Po³¹cz postortowane tablice w posortowan¹ tablicê Sortowanie przez scalanie Sortowanie tablicy przez scalanie rekurencyjne wywo³anie sortowania przez scalanie 5 2 4 6 7 8 1 3 5 2 4 6 7 8 1 3 5 2 4 6 7 8 1 3............ 2 5 4 6 7 8 1 3 scalenie scalenie 5 podzial 2 4 6 2 4 5 6 1 3 7 8 6 5 4 2 podzial scalenie 8 7 1 2 3 4 5 6 7 8 1 3 podzial 7 8 3 1

Obsługa błędów, przeszukiwanie i sortowanie tablic 22 Obserwacja: Sortowanie hybrydowe Sortowanie szybkie jest szybkie, ale nie dla małych tablic i nie gdy podziały w kolejnych iteracjach sortowania szybkiego są zdegenerowane Pomysł: Użyjmy w takich przypadkach innego, efektywniejszego sposobu sortowania Efekt hybrydowe sortowanie introspektywne: If (poziom rekurencji w sort. szybkim ponizej wyznaczonego) posortuj przez kopcowanie podziel tablice w/g alg. sortowania szybkiego If (lewa podtablica zawiera conajmniej 9 elementow) wywolaj rekurencyjnie proc. sortowania szybkiego dla niej If (prawa podtablica zawiera conajmniej 9 elementow) wywolaj rekurencyjnie proc. sortowania szybkiego dla niej posortuj przez wstawianie Obsługa błędów, przeszukiwanie i sortowanie tablic 23 Podsumowanie Zagadnienia podstawowe 1. W jaki sposób można obsługiwać błędy wewnątrz programu? 2. Porównaj wady i zalety scentralizowanego i rozproszonego systemu obsługi błędów w programie. 3. Czy można zapisać dane do standardowego wyjścia błędów, nawet jeśli nie wystąpił żaden błąd w programie? 4. Do czego służą funkcje perror i strerror? Jaka jest ich składnia? 5. Jakie błędy mogą wystąpić w przedstawionej z opisem programu do przetwarzania obrazów (zobacz tabela z zadaniami na laboratorium) funkcji zapisującej obraz do pliku? 6. Kiedy można stosować liniowe a kiedy binarne przeszukiwanie tablic? 7. Jaka jest różnica złożoności obliczeniowej między przeszukiwaniem prostym a binarnym? 8. Wymień wady i zalety sortowania bąbelkowego. 9. Czym się różni sortowanie tablic od sortowania plików? Które z metod pokazanych na wykładzie mogą być użyte do sortowania tablic, a które do sortowania plików? Zagadnienia rozszerzające 1. W jaki sposób można zwracać błąd wywołania funkcji (np. jak to jest zrobione w bibliotece stdio)?

Obsługa błędów, przeszukiwanie i sortowanie tablic 24 Obsługa błędów, przeszukiwanie i sortowanie tablic 25 2. Czy zawsze należy stosować sortowanie o najmniejszej złożoności obliczeniowej? zmieniają się wyniki dla różnych rozmiarów tablic. 3. Przeanalizuj złożoność algorytmów sortowania tablic; jakie są mocne i słabe strony poszczególnych algorytmów? ki sposób, aby liczby o wartościach parzystych znajdowały się na najpierw, a liczby o 5. Utworzyć i napisać program porządkujący ciąg n liczb całkowitych a1, a2,...an w ta- 4. Zapoznaj się z algorytmami sortowania przez kopcowanie, Shella, grzebieniowym; porównaj z algorytmami przedstawionymi na wykładzie. (wskazówka: http://www.zgapa.pl/zgapedia/sortowanie.html) uporządkowane w kolejności rosnącej. Podać liczbę elementów wartościach nieparzystych po nich. Zarówno liczby parzyste jak i nieparzyste mają być nieparzystych. Zadania 1. Przejrzyj napisane dotychczas programy pod kątem analizy możliwości wystąpienia błędów w ich działaniu. Dopisz fragmenty kodu, które zapobiegną ich wystąpieniu. Czy dopisany kod nie wymaga kolejnych zabiegów wykrywających sytuacje błędne? 2. Przeprowadź ręczną symulację algorytmu sortowania bąbelkowego dla następujących danych: {1, 3, 56, 4, 90, 67, 3, 8, 12, 90 {2, 10, 2, 0, -12, 98, 67, 45, 0, 27, -12 3. Przeprowadź ręczną symulację algorytmu sortowania szybkiego dla następujących danych: {1, 3, 56, 4, 90, 67, 3, 8, 12, 90 {2, 10, 2, 0, -12, 98, 67, 45, 0, 27, -12 4. Napisz funkcje implementujące (wybrane) funkcje sortowania tablicy, porównaj czas działania funkcji, liczbę porównań i zamian dla tablic wypełnionych losowymi elementami, a także wstępnie uporządkowanymi we właściwej i odwrotnej kolejności. Sprawdź, jak 6. Napisz program do przechowywania danych w postaci (data,wartość) z możliwością sortowania danych rosnąco lub malejąco, zarówno według daty, jak i wartości; wykorzystaj funkcję qsort(). 7. Napisz program, który znajduje najczęściej występujące elementy w ciągu danych. Na wejściu programu podawana jest pewna liczba zestawów danych (co najwyżej 1000). Każdy z zestawów ma postać: n x1 x2 <85> xn, gdzie n jest liczbą naturalną (z zakresu 1-1000), po której następuje n liczb całkowitych x1 x2 <85> xn (z zakresu od -1000 do 1000). Poszczególne liczby w zestawie zostaną rozdzielone znakiem spacji, a poszczególne zestawy znakiem nowej linii. Dla każdego z wczytanych zestawów należy wyznaczyć wartość, która w ciągu x1 x2 <85> xn występuje najczęściej i wypisać ją na wyjściu programu. Jeżeli takich wartości jest więcej należy je wypisać w kolejności rosnącej, rozdzielając liczby znakiem spacji. Wyniki dla poszczególnych zestawów należy rozdzielić znakiem nowej linii. Przykład:

Obsługa błędów, przeszukiwanie i sortowanie tablic 26 Wejście: 5 1 3 11 1 7 6 4 2 1 2 4 3 7 3 5 2 2 2 2 2 6 4 4 4 4 4 4 Wyjście: 1 2 4 2 4