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

Podobne dokumenty
Podstawy Programowania

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

Informatyka 1. Złożoność obliczeniowa

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

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 )

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

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

Podstawy Programowania

Poprzedni wykład [ ] :

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

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

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

Podstawy programowania w języku C++

Pobieranie argumentów wiersza polecenia

Wstęp do Programowania, laboratorium 02

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

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

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

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.

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

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

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

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

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

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

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

Strategia "dziel i zwyciężaj"

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

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

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

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

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

Podstawy Programowania

Programowanie w VB Proste algorytmy sortowania

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

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

Analiza algorytmów zadania podstawowe

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

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

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

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

Jeszcze o algorytmach

Część 4 życie programu

5 Przygotował: mgr inż. Maciej Lasota

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

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

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

Informatyka 1. Przetwarzanie tekstów

Argumenty wywołania programu, operacje na plikach

Biblioteka standardowa - operacje wejścia/wyjścia

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

Wartości domyślne, przeciażenia funkcji

Wartości domyślne, przeciażenia funkcji

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

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

Lab 9 Podstawy Programowania

Algorytmy sortujące i wyszukujące

Metodyki i Techniki Programowania 2

Programowanie w językach wysokiego poziomu

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

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

Tablice deklaracja, reprezentacja wewnętrzna

Programowanie Procedurale. Pliki w języku C++

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

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

Wskaźniki. Informatyka

Zasady programowania Dokumentacja

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

tablica: dane_liczbowe

Tablice, funkcje - wprowadzenie

Laboratorium 5: Tablice. Wyszukiwanie binarne

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

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

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

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

Język C++ wykład VIII

Programowanie Proceduralne

Wstęp. #define include include include include include include

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

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

Sortowanie. LABORKA Piotr Ciskowski

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

Referencje do zmiennych i obiektów

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.

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. Nie ma jednego, najlepszego sposobu przekazywania informacji o błędach pojawiających się w programie można to robić zarówno centralnie jak i lokalnie.

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. Nie 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?

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. Nie 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).

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. Nie 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.

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ą.

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.

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.

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

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

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.)

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); }

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.

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 Funkcja kopiująca napisy Obsługa błędów przykłady /* 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 ); }

Obsługa błędów, przeszukiwanie i sortowanie tablic 5 Funkcja kopiująca napisy Obsługa błędów przykłady /* 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 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 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 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 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 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 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 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ć).

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.

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.

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 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 */ } /*****************************/

Obsługa błędów, przeszukiwanie i sortowanie tablic 9 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.

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.

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.

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.

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,...)).

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

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 START Poszukiwanie wzorca wœród elementów tablicy jednowymiarowej od elementu min do max Tab[min] = wzorzec lub min = max? Tak STOP Nie min = min + 1

Obsługa błędów, przeszukiwanie i sortowanie tablic 12 Przeszukiwanie tablic liniowe START Poszukiwanie wzorca wœród elementów tablicy jednowymiarowej od elementu min do max Tab[min] = wzorzec lub min = max? Tak STOP Nie min = min + 1 binarne START Poszukiwanie wzorca wœród elementów tablicy jednowymiarowej od elementu min do max Srodek = (min + max) div 2 max = Srodek - 1 min = Srodek + 1 Nie Tab[Srodek] = wzorzec lub min=max? Nie Tab[Srodek] < wzorzec? Tak Tak STOP

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 */

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; 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; } } if (znaleziony) return min; else return domysl; } /* Przeszukaj */

Obsługa błędów, przeszukiwanie i sortowanie tablic 14 przez wstawianie Sortowanie

Obsługa błędów, przeszukiwanie i sortowanie tablic 14 przez wstawianie Sortowanie przez proste wstawianie przez wstawianie połówkowe

Obsługa błędów, przeszukiwanie i sortowanie tablic 14 przez wstawianie Sortowanie przez proste wstawianie przez wstawianie połówkowe przez wybieranie

Obsługa błędów, przeszukiwanie i sortowanie tablic 14 przez wstawianie Sortowanie przez proste wstawianie przez wstawianie połówkowe przez wybieranie drzewiaste

Obsługa błędów, przeszukiwanie i sortowanie tablic 14 przez wstawianie Sortowanie przez proste wstawianie przez wstawianie połówkowe przez wybieranie drzewiaste przez zamianę

Obsługa błędów, przeszukiwanie i sortowanie tablic 14 przez wstawianie Sortowanie przez proste wstawianie przez wstawianie połówkowe przez wybieranie drzewiaste przez zamianę bąbelkowe

Obsługa błędów, przeszukiwanie i sortowanie tablic 14 przez wstawianie Sortowanie przez proste wstawianie przez wstawianie połówkowe przez wybieranie drzewiaste przez zamianę bąbelkowe szybkie

Obsługa błędów, przeszukiwanie i sortowanie tablic 14 przez wstawianie Sortowanie przez proste wstawianie przez wstawianie połówkowe przez wybieranie drzewiaste przez zamianę bąbelkowe szybkie przez scalanie

Obsługa błędów, przeszukiwanie i sortowanie tablic 14 przez wstawianie Sortowanie przez proste wstawianie przez wstawianie połówkowe przez wybieranie drzewiaste przez zamianę bąbelkowe szybkie przez scalanie hybrydowe

Obsługa błędów, przeszukiwanie i sortowanie tablic 15 Sortowanie przez proste wstawianie

Obsługa błędów, przeszukiwanie i sortowanie tablic 15 Sortowanie przez proste wstawianie START Sortowanie tablicy przez wstawianie j = 2 temp = Tab[j] i = j - 1 Wstaw Tab[j] w posortowany ci¹g Tab[1..j-1] 5 2 4 6 1 3 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] > temp i i > 0? Nie Tab[i+1] = temp Czy element j-ty jest ostatni? Tak STOP Tak Tab[i+1] = Tab[i] i = i - 1 Nie j = j + 1

Obsługa błędów, przeszukiwanie i sortowanie tablic 16 Sortowanie drzewiaste START Sortowanie tablicy drzewiaste Przekszta³æ tablicê w drzewo binarne ObejdŸ drzewo w porz¹dku "najpierw w lewo" i wypisz ka dy element przy okazji drugich jego odwiedzin STOP

Obsługa błędów, przeszukiwanie i sortowanie tablic 16 Sortowanie drzewiaste START Przekszta³æ tablicê w drzewo binarne Sortowanie tablicy drzewiaste krok I 5 2 4 6 1 3 5 ObejdŸ drzewo w porz¹dku "najpierw w lewo" i wypisz ka dy element przy okazji drugich jego odwiedzin 1 2 4 6 STOP 3 krok II 5 2 1 1 1 2 4 3 3 3 4 4 2 5 6 6 6 5

Obsługa błędów, przeszukiwanie i sortowanie tablic 16 Sortowanie drzewiaste START Przekszta³æ tablicê w drzewo binarne Sortowanie tablicy drzewiaste krok I 5 2 4 6 1 3 5 ObejdŸ drzewo w porz¹dku "najpierw w lewo" i wypisz ka dy element przy okazji drugich jego odwiedzin 1 2 4 6 STOP 3 krok II 5 2 1 1 1 2 4 3 3 3 4 4 2 5 6 6 6 5

Obsługa błędów, przeszukiwanie i sortowanie tablic 17 Sortowanie bąbelkowe START Sortowanie tablicy b¹belkowe j = 1 i = 1 5 2 4 6 1 3 Tab[i] > Tab[i+1]? Tak Zamieñ Tab[i] z Tab[i+1] 2 4 5 1 3 6 Nie 2 4 1 3 5 6 i = i + 1 2 1 3 4 5 6 Czy element i-ty jest przedostatni? Tak Nie 1 2 3 4 5 6 1 2 3 4 5 6 j < n - 1? Tak j = j + 1 Nie STOP

Obsługa błędów, przeszukiwanie i sortowanie tablic 18 Sortowanie bąbelkowe START Sortowanie tablicy b¹belkowe j = 1 i = 1 Tab[i] > Tab[i+1]? Nie i = i + 1 Tak Zamieñ Tab[i] z Tab[i+1] void BubbleSort(int Tab[], int min, max) { int i, j; Czy element i-ty jest przedostatni? Tak j < n - 1? Nie Nie Tak j = j + 1 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 */ STOP

Obsługa błędów, przeszukiwanie i sortowanie tablic 19 Sortowanie szybkie START Sortuj (l, p) i = l j = p x = Tab[(i + j) div 2] Szybkie sortowanie elementów l..p tablicy START Sortuj (1, n) Sortowanie tablicy szybkie Tab[i] < x? Tak i = i + 1 STOP Nie Tab[j] > x? Tak j = j - 1 l p Nie 5 2 4 6 7 8 1 3 i <= j? Nie l < j? Tak Tak Zamieñ Tab[i] z Tab[j] i = i + 1; j = j - 1 Sortuj (l, j) 5 j i 2 4 3 1 8 7 6 Nie i < p? Tak Sortuj (i, p) 1 2 3 4 5 6 7 8 Nie STOP

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 *));

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 */

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

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 Sortowanie przez scalanie 5 2 4 6 7 8 1 3 podzial START Podziel tablicê na dwie czêœci Sortowanie tablicy przez scalanie 5 2 4 6 7 8 1 3 podzial podzial 5 2 4 6 7 8 1 3 Posortuj otrzymane tablice u ywaj¹c rekurencyjnie sortowania przez scalanie............ Po³¹cz postortowane tablice w posortowan¹ tablicê STOP 2 5 4 6 7 8 1 3 5 scalenie 2 4 6 8 7 scalenie 3 1 2 4 5 6 1 3 7 8 rekurencyjne wywo³anie sortowania przez scalanie 6 5 4 scalenie 2 1 3 7 8 1 2 3 4 5 6 7 8

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

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

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

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

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

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

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 2. Czy zawsze należy stosować sortowanie o najmniejszej złożoności obliczeniowej? 3. Przeanalizuj złożoność algorytmów sortowania tablic; jakie są mocne i słabe strony poszczególnych algorytmów? 4. Zapoznaj się z algorytmami sortowania przez kopcowanie, Shella, grzebieniowym; porównaj z algorytmami przedstawionymi na wykładzie. (wskazówka: http://www.zgapa.pl/zga 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

Obsługa błędów, przeszukiwanie i sortowanie tablic 25 zmieniają się wyniki dla różnych rozmiarów tablic. 5. Utworzyć i napisać program porządkujący ciąg n liczb całkowitych a1, a2,...an w taki sposób, aby liczby o wartościach parzystych znajdowały się na najpierw, a liczby o wartościach nieparzystych po nich. Zarówno liczby parzyste jak i nieparzyste mają być uporządkowane w kolejności rosnącej. Podać liczbę elementów nieparzystych. 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