Programowanie Proceduralne

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

Podstawy Informatyki

Algorytmy i Struktury Danych.

Algorytmy i Struktury Danych.

Laboratorium nr 7 Sortowanie

Analiza algorytmów zadania podstawowe

Wstęp do Informatyki

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

Algorytmy i Struktury Danych.

Algorytm selekcji Hoare a. Łukasz Miemus

Wstęp do programowania

Podstawy algorytmiki i programowania - wykład 6 Sortowanie- algorytmy

Informatyka A. Algorytmy

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

Algorytmy i Struktury Danych

Programowanie Procedurale

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

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

Wstęp do programowania

Wykład 4. Sortowanie

Algorytmy i Struktury Danych.

Programowanie w VB Proste algorytmy sortowania

Algorytmika i programowanie. Wykład 2 inż. Barbara Fryc Wyższa Szkoła Informatyki i Zarządzania w Rzeszowie

Programowanie i struktury danych

Wybrane algorytmy tablicowe

Strategia "dziel i zwyciężaj"

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 )

Wykład 5. Sortowanie w czasie liniowologarytmicznym

Sortowanie danych. Jolanta Bachan. Podstawy programowania

Wstęp do programowania

Rekurencja. Dla rozwiązania danego problemu, algorytm wywołuje sam siebie przy rozwiązywaniu podobnych podproblemów. Przykład: silnia: n! = n(n-1)!

Sortowanie - wybrane algorytmy

Analiza algorytmów zadania podstawowe

Wstęp do programowania

WYKŁAD 9. Algorytmy sortowania elementów zbioru (tablic) Programy: c4_1.c... c4_3.c. Tomasz Zieliński

Algorytmy i Struktury Danych.

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 5 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 41

tablica: dane_liczbowe

Podstawy algorytmiki i programowania - wykład 3 Funkcje rekurencyjne Wyszukiwanie liniowe i binarne w tablicy

Kontrola przebiegu programu

Wykład 1_2 Algorytmy sortowania tablic Sortowanie bąbelkowe

Algorytmy. 1. Sortowanie 2. Statki i okręty. programowanie cz.7. poniedziałek, 2 marca 2009

Wstęp do programowania

Programowanie w C++ Wykład 2. Katarzyna Grzelak. 4 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 44

PODSTAWY INFORMATYKI wykład 10.

Algorytmy sortujące i wyszukujące

PDF stworzony przez wersję demonstracyjną pdffactory Pro Program 15

Wstęp do programowania

Zajęcia nr 5 Algorytmy i wskaźniki. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Algorytmy i Struktury Danych.

Programowanie - wykład 4

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

Wstęp do Informatyki

INFORMATYKA Z MERMIDONEM. Programowanie. Moduł 5 / Notatki

wykład IV uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C, a C++. wykład IV dr Jarosław Mederski Spis Język C++ - wstęp

Wykład 2. Poprawność algorytmów

Tablice jednowymiarowe

Zaawansowane algorytmy i struktury danych

Sortowanie bąbelkowe

Algorytmy i struktury danych

Algorytmy i Struktury Danych, 2. ćwiczenia

Proste programy w C++ zadania

Rekurencja. Przygotowała: Agnieszka Reiter

ZASADY PROGRAMOWANIA KOMPUTERÓW ZAP zima Uwagi przed sprawdzianem nr 1.

Algorytmy i struktury danych. Wykład 4

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

Algorytmy i struktury danych. Co dziś? Tytułem przypomnienia metoda dziel i zwyciężaj. Wykład VIII Elementarne techniki algorytmiczne

Matematyka dyskretna - wykład - część Podstawowe algorytmy kombinatoryczne

Sortowanie w czasie liniowym

ALGORYTMY I STRUKTURY DANYCH

Wstęp do Informatyki zadania ze złożoności obliczeniowej z rozwiązaniami

Liczby całkowite i rzeczywiste

Wrocław, Wstęp do informatyki i programowania: liczby pierwsze. Wydział Matematyki Politechniki Wrocławskiej.

(3 kwiecień 2014) Marika Pankowska Kamila Pietrzak

MACIERZE. Sobiesiak Łukasz Wilczyńska Małgorzata

Podstawy Informatyki. Sprawność algorytmów

Wstęp do informatyki- wykład 12 Funkcje (przekazywanie parametrów przez wartość i zmienną)

1,3,4,2,3,4,0,1,4,5,0. Wówczas największa suma trzech kolejnych liczb (zaznaczone na czerwono) wynosi:

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

wykład V uzupełnienie notatek: dr Jerzy Białkowski Programowanie C/C++ Język C++ klasy i obiekty wykład V dr Jarosław Mederski Spis Język C++ - klasy

INFORMATYKA SORTOWANIE DANYCH.

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

Sortowanie. Bartman Jacek Algorytmy i struktury

Język C++ wykład VIII

Jeszcze o algorytmach

1. Znajdowanie miejsca zerowego funkcji metodą bisekcji.

znalezienia elementu w zbiorze, gdy w nim jest; dołączenia nowego elementu w odpowiednie miejsce, aby zbiór pozostał nadal uporządkowany.

Algorytmy i złożoność obliczeniowa. Wojciech Horzelski

np. dla p=1 mamy T1(N) N/2 średni czas chybionego wyszukiwania z prawdopodobieństwem q:

Metodyki i Techniki Programowania 2

Tablice są typem pochodnym. Poniżej mamy przykłady deklaracji różnych tablic:

Podstawy Informatyki. Metalurgia, I rok. Wykład 5 Rekurencja

Podstawy Informatyki. Metalurgia, I rok. Rekurencja. skomplikowane zadanie. Rekurencja

Podstawy algorytmiki i programowania - wykład 2 Tablice dwuwymiarowe cd Funkcje rekurencyjne

8. Wektory. Przykłady Napisz program, który pobierze od użytkownika 10 liczb, a następnie wypisze je w kolejności odwrotnej niż podana.

Zaawansowane algorytmy i struktury danych

5. Rekurencja. Przykłady

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

Wstęp do programowania

Transkrypt:

Programowanie Proceduralne Bożena Woźna-Szcześniak bwozna@gmail.com Jan Długosz University, Poland Wykład 1 Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 1 / 59

Cel wykładów z programowania proceduralnego Wykład jest poświęcony wprowadzeniu do języka C++ i jego celem jest nauczenie projektowania i psania programów proceduralnych w tym języku. Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 2 / 59

Cel wykładów z programowania proceduralnego Wykład jest poświęcony wprowadzeniu do języka C++ i jego celem jest nauczenie projektowania i psania programów proceduralnych w tym języku. Zalecana Literatura Prata Stephen. Szkoła programowania. Język C++. Wydanie V. Helion, 2006. Andrzej Stasiewicz. C++. Ćwiczenia praktyczne. Wydanie III. Helion, 2011. Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 2 / 59

Struktura danych - tablica Tablica jednowymiarowa (wektor) jest takim uporzadkowanym zbiorem elementów jednorodnych, że z każdym elementem jest zwiazany uporzadkowany zbiór liczb całkowitych - indeksów. Indeksy w sposób jednoznaczny określaja pozycję każdego elementu tablicy. W tablicach każdy indeks zmienia się ze stałym krokiem od dolnej do górnej granicy. W przypadku tablic z języka C/C++/Java zbiór indeksów przebiega wartości od 0 do n 1, dla pewnej ustalonej liczby naturalnej n. Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 3 / 59

Struktura danych - tablica Tablica jednowymiarowa (wektor) jest takim uporzadkowanym zbiorem elementów jednorodnych, że z każdym elementem jest zwiazany uporzadkowany zbiór liczb całkowitych - indeksów. Indeksy w sposób jednoznaczny określaja pozycję każdego elementu tablicy. W tablicach każdy indeks zmienia się ze stałym krokiem od dolnej do górnej granicy. W przypadku tablic z języka C/C++/Java zbiór indeksów przebiega wartości od 0 do n 1, dla pewnej ustalonej liczby naturalnej n. Przykład: 11 elementowa tablica liczb całkowitych. Indeksy 0 1 2 3 4 5 6 7 8 9 10 Wartości -1 3 5 7 4 55 76-1 4 89 5 Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 3 / 59

Struktura danych - tablica Przykład: 11 elementowa tablica liczb rzczywistych o nazwie A. Indeksy 0 1 2 3 4 5 6 7 8 9 10 Wartości -1.2 3 5.5 7.34 4 55 76.1-1.1 4 89 5.33 Notacja: 1 element tablicy: A[0] 5 element tablicy: A[4] i element tablicy: A[i] Zakres tablicy: A[0].. A[n-1], gdzie n oznacza liczbe elementów w tablicy. Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 4 / 59

Struktura danych - tablica Przykład: 11 elementowa tablica liczb rzczywistych o nazwie A. Indeksy 0 1 2 3 4 5 6 7 8 9 10 Wartości -1.2 3 5.5 7.34 4 55 76.1-1.1 4 89 5.33 Notacja: 1 element tablicy: A[0] 5 element tablicy: A[4] i element tablicy: A[i] Zakres tablicy: A[0].. A[n-1], gdzie n oznacza liczbe elementów w tablicy. wartość 2 elementu tablicy A: A[1] = 3 wartość 9 elementu tablicy A: A[1] = 5.33 Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 4 / 59

Struktura danych - tablica Przykład: 11 elementowa tablica zanków o nazwie C. Indeksy 0 1 2 3 4 5 6 7 8 9 10 Wartości A L A M A K O T A Notacja: 1 element tablicy: C[0] 5 element tablicy: C[4] i element tablicy: C[i] Zakres tablicy: C[0].. C[n-1], gdzie n oznacza liczbe elementów w tablicy. Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 5 / 59

Struktura danych - tablica Przykład: 11 elementowa tablica zanków o nazwie C. Indeksy 0 1 2 3 4 5 6 7 8 9 10 Wartości A L A M A K O T A Notacja: 1 element tablicy: C[0] 5 element tablicy: C[4] i element tablicy: C[i] Zakres tablicy: C[0].. C[n-1], gdzie n oznacza liczbe elementów w tablicy. wartość 2 elementu tablicy C: C[1] = L wartość 9 elementu tablicy C: C[1] = A Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 5 / 59

Sumowanie elemantów z tablicy, instrukacja while Require: tablica A o rozmiarze n {A=[0],...,A[n-1] Algorytm: Suma 1: suma := 0; 2: i := 0; 3: while i < n do 4: suma := suma+a[i]; 5: i := i + 1; 6: end while 7: return suma; Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 6 / 59

# include <iostream > using namespace std ; i n t main ( ) { i n t A [ 1 0 ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 1 0 ; i n t suma = 0, i =0, n=10; while ( i < n ) { suma = suma + A[ i ] ; i = i +1; cout << "suma = " << suma << endl ; Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 7 / 59

Sumowanie elemantów z tablicy, instrukacja for Require: tablica A o rozmiarze n {A=[0],...,A[n-1] Algorytm: Suma 1: suma := 0; 2: for i := 0 n 1 do 3: suma := suma+a[i]; 4: end for 5: return suma; Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 8 / 59

# include <iostream > using namespace std ; i n t main ( ) { i n t A [ 1 0 ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 1 0 ; i n t suma = 0, i =0, n=10; f o r ( i n t i =0 ; i < n ; i ++){ suma = suma + A[ i ] ; cout << "suma = " << suma << endl ; Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 9 / 59

# include <iostream > using namespace std ; i n t main ( ) { long tab [12]={31,28,31,30,31,30,31,31,30,31,30,31; i n t k = 0 ; while ( k < 12) { cout << tab [ k ] << " " ; ++k ; cout << endl ; long s = 0 ; k = 0 ; while ( k < 12) { s += tab [ k ] ; ++k ; cout << s ; r e t u r n 0 ; Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 10 / 59

# include <iostream > using namespace std ; i n t main ( ) { long a []={31,28,31,30,31,30,31,31,30,31,30,31; i n t const n = s i z e o f ( a ) / s i z e o f ( a [ 0 ] ) ; i n t k ; f o r ( k = 0 ; k < n ; ++k ) { cout << a [ k ] << " " ; cout << endl ; long s = 0 ; f o r ( k = 0 ; k < n ; ++k ) { s += a [ k ] ; cout << s ; r e t u r n 0 ; Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 11 / 59

Sumowanie elemantów parzystych z tablicy, instrukacja while Require: tablica A o rozmiarze n {A=[0],...,A[n-1] Algorytm: Suma 1: suma := 0; 2: i := 0; 3: while i < n do 4: if A[i] mod 2 = 0 then 5: suma := suma+a[i]; 6: end if 7: i := i + 1; 8: end while 9: return suma; Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 12 / 59

# include <iostream > using namespace std ; i n t main ( ) { i n t A [ 1 0 ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 1 0 ; i n t suma = 0, i =0, n=10; while ( i < n ) { i f (A[ i ]%2==0) suma = suma + A[ i ] ; i ++; cout << "suma = " << suma << endl ; Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 13 / 59

Sumowanie elemantów parzystych z tablicy, instrukacja for Require: tablica A o rozmiarze n {A=[0],...,A[n-1] Algorytm: Suma 1: suma := 0; 2: for i := 0 n 1 do 3: if A[i] mod 2 = 0 then 4: suma := suma+a[i]; 5: end if 6: end for 7: return suma; Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 14 / 59

# include <iostream > using namespace std ; i n t main ( ) { i n t A [ 1 0 ] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 1 0 ; i n t suma = 0, n=10; f o r ( i n t i =0; i < n ; i ++){ i f (A[ i ]%2==0) suma = suma + A[ i ] ; cout << "suma = " << suma << endl ; Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 15 / 59

Losowe wypełnianie tablicy # include <iostream > # include <ctime > # include < c s t d l i b > using namespace std ; i n t main ( ) { i n t a [ 1 0 0 ] ; srand ( time ( 0 ) ) ; f o r ( i n t k = 0 ; k < 100; ++k ) { a [ k ] = rand ( ) % 100; f o r ( i n t k = 0 ; k < 100; ++k ) { cout << a [ k ] << " " ; r e t u r n 0 ; Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 16 / 59

Losowe wypełnianie tablicy #include<iostream> #include<ctime> #include<cstdlib> using namespace std; int wypelnij(int [], int); int wypisz(const int [], int); int main() { int a[100]; wypelnij(a, 100); wypisz(a, 100); return 0; Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 17 / 59

Losowe wypełnianie tablicy int wypelnij(int a[], int n) { srand(time(0)); for (int k = 0; k < n; ++k) { a[k] = rand() % 100; int wypisz(const int a[], int n) { for (int k = 0; k < n; ++k) { cout << a[k] << " "; Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 18 / 59

Element minimalny i maksymalny zbioru Definicja problemu: Dane: n - liczba elementów zbioru a 1, a 2, a 3,...,a n - ciag elementów Szukane: Elementy największy i najmniejszy zbioru. Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 19 / 59

Element minimalny zbioru Require: tablica A o rozmiarze n {A=[0],...,A[n-1] Algorytm: MIN 1: min := 0; 2: for all i := 1 to n do 3: if A[i] < A[min] then 4: min := i; 5: end if 6: i := i + 1; 7: end for 8: return min; Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 20 / 59

Element minimalny tablicy #include<iostream> #include<ctime> #include<cstdlib> using namespace std; int wypelnij(int [], int); int wypisz(const int [], int); int min(const int [], int); int main() { int a[100]; wypelnij(a, 10); wypisz(a, 10); int m = min(a, 10); cout << "Element minimalny: " << m << endl; return 0; Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 21 / 59

Element minimalny tablicy int min(const int a[], int n) { int m = 0; for (int i=0; i<n ; i++){ if (a[i] < a[m]) m = i; return a[m]; Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 22 / 59

Element maksymalny zbioru Require: tablica A o rozmiarze n {A=[0],...,A[n-1] Algorytm: MAX 1: max := 0; 2: for all i := 1 to n do 3: if A[i] > A[max] then 4: max := i; 5: end if 6: i := i + 1; 7: end for 8: return max; Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 23 / 59

Element maksymalny tablicy #include<iostream> #include<ctime> #include<cstdlib> using namespace std; int wypelnij(int [], int); int wypisz(const int [], int); int max(const int [], int); int main() { int a[100]; wypelnij(a, 10); wypisz(a, 10); int m = max(a, 10); cout << "Element maksymalny: " << m << endl; return 0; Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 24 / 59

Element maksymalny tablicy int max(const int a[], int n) { int m = 0; for (int i=0; i<n ; i++){ if (a[i] > a[m]) m = i; return a[m]; Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 25 / 59

Wyszukiwanie binarne Wyszukiwanie binarne pozwala na szybkie wyszukiwanie wartości w posortowanych zbiorach (np. tablicy). Skuteczność wyszukiwania binarnego wynika z tego, że zamiast przegladać wszystkie elementy posortowanego zbioru po kolei, wykorzystujemy informację o tym, że jest on uporzadkowany. Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 26 / 59

Wyszukiwanie binarne Algorytm: Dana jest tablica A oraz poszukiwany element key. Sprawdź środkowy element tablicy. Jeśli jest równy key, to koniec. Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 27 / 59

Wyszukiwanie binarne Algorytm: Dana jest tablica A oraz poszukiwany element key. Sprawdź środkowy element tablicy. Jeśli jest równy key, to koniec. Jeśli środkowy element jest większy niż key, to poszukiwany element jeśli jest w tablicy, to jest w jej lewej części. Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 27 / 59

Wyszukiwanie binarne Algorytm: Dana jest tablica A oraz poszukiwany element key. Sprawdź środkowy element tablicy. Jeśli jest równy key, to koniec. Jeśli środkowy element jest większy niż key, to poszukiwany element jeśli jest w tablicy, to jest w jej lewej części. Jeśli środkowy element jest mniejszy niż key, to poszukiwany element jeśli jest w tablicy, to jest w jej prawej części. Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 27 / 59

Wyszukiwanie binarne - przykład Znaleźć liczbę 9 w ciagu: 3, 5, 7, 8, 9, 12, 15. Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 28 / 59

Wyszukiwanie binarne - algorytm Require: tablica A o rozmiarze n, wartość key {A=[0],...,A[n-1] Algorytm: Wyszukiwanie binarne 1: left := 0; 2: right := n 1; 3: while left <= right do 4: curr := (left + right)/2; 5: if key = a[curr] then 6: return curr; 7: else 8: if key < a[curr] then 9: right := curr 1; 10: else 11: left := curr + 1; 12: end if 13: end if 14: end while Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 29 / 59

Wyszukiwanie binarne #include<iostream> #include<ctime> #include<cstdlib> using namespace std; int wypelnij(int [], int); int wypisz(const int [], int); int binsearch(int a[], int, int ); int main() { int a[100]; wypelnij(a, 10); wypisz(a, 10); cout << "Podaj liczbe jakiej szukasz: "; int n; cin >> n; int m = binsearch(a, 10, n); if (m == -1) cout << "Podanego elementu nie ma w tablicy" << endl; else cout << "Element znajduje sie na " << m << " pozycji" << endl; return 0; Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 30 / 59

Wyszukiwanie binarne int binsearch(int a[], int n, int key) { int left = 0, right = n - 1; while (left <= right) { int curr = (left + right) / 2; if (key == a[curr]) { return curr; else if (key < a[curr]) { right = curr - 1; else { left = curr + 1; return (-1); Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 31 / 59

Wyszukiwanie binarne int wypelnij(int a[], int n) { srand(time(0)); for (int k = 0; k < n; ++k) { a[k] = k; int wypisz(const int a[], int n) { for (int k = 0; k < n; ++k) { cout << a[k] << " "; cout << endl; Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 32 / 59

Liczby pierwsze Liczby pierwsze już od wieków fascynowały i zastanawiały uczonych. W matematyce pojęcie pierwszości liczb, to fundamentalne zagadnienie dotyczace liczb naturalnych. Jest ich nieskończenie wiele, co udowodnił już Euklides. Liczba pierwsza jest liczba naturalna, która dzieli się bez reszty tylko przez 1 i przez sama siebie, np. 2, 3, 5, 7, 11, 13, 17, 19, 23, 29 itd. Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 33 / 59

Sita Eratostenesa Sito Eratostenesa to algorytm wyznaczania liczb pierwszych z zadanego przedziału [2, n]. Idea: Ze zbioru liczb naturalnych większych od jedności, tj. {2, 3, 4,..., wybieramy najmniejsza, czyli 2, i wykreślamy wszystkie jej wielokrotności większe od niej samej, tj. wszystkie liczby parzyste większe od 2. Z pozostałych liczb wybieramy najmniejsza niewykreślona liczbę, tj. 3, i usuwamy wszystkie jej wielokrotności większe od niej samej: {6, 9, 12,...; nie przejmujemy się tym, że niektóre liczby (np. 6) będa skreślane więcej niż raz. Według tej samej procedury postępujemy dla liczby 5. Potem dla liczby 7, 11, 13, itd., aż do sprawdzenia wszystkich niewykreślonych wcześniej liczb. Dla danej liczby n wszystkie niewykreślone liczby mniejsze od n sa liczbami pierwszymi. Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 34 / 59

Zadanie! Zaimplementować Algorytm na laboratoriach! Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 35 / 59

Algorym wyznaczania liczb pierwszych Twierdzenie 1 Liczba złożona n posiada dzielnik, który jest mniejszy od pierwiastka z tej liczby, tj. sqrt(n). Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 36 / 59

Algorym wyznaczania liczb pierwszych Twierdzenie 1 Liczba złożona n posiada dzielnik, który jest mniejszy od pierwiastka z tej liczby, tj. sqrt(n). Dowód - idea: Niech n będzie liczba złożona. Wtedy n = a b oraz 0 < a b < n. Zatem musi być a sqrt(n), gdyż inaczej otrzymalibyśmy a b > n (sprzeczność). Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 36 / 59

Algorym wyznaczania liczb pierwszych Require: tablica A o rozmiarze n+1 {A=[0,...,n+1] Algorytm: Czy n jest liczba pierwsza 1: i := 2 2: while i < sqrt(n)+1 do 3: if i jest dzielnikiem n then 4: return n jest liczba złożona; 5: end if 6: i := i + 1; 7: end while 8: return n jest liczba pierwsza; Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 37 / 59

Zadanie! Zaimplementować Algorytm na laboratoriach! Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 38 / 59

Liczby doskonałe Liczba doskonała jest liczba naturalna, równa sumie wszystkich swoich dzielników, mniejszych od niej samej. Najmniejsza liczba doskonała jest 6, ponieważ 6 = 3 + 2 + 1. Następna jest 28 (28 = 14 + 7 + 4 + 2 + 1). Kolejne znane to 496, 8128, 33550336... Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 39 / 59

Liczby doskonałe W IX księdze Elementów Euklides podał następujacy sposób znajdowania liczb doskonałych parzystych: obliczać sumy kolejnych potęg dwójki np. 1 + 2 + 4 + 8 +..., jeżeli, któraś z otrzymanych sum okaże się liczba pierwsza, należy pomnożyć ja przez ostatni składnik i otrzymamy liczbę doskonała. Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 40 / 59

Problem Sortowania Definicja problemu Niech (U, ) będzie zbiorem liniowo uporzadkowanym z relacja porzadkuj ac a i niech (a 1, a 2,..., a n ) będzie ciagiem n elementów z U, dla pewnego całkowitego n > 0. Znaleźć permutację (a 1, a 2,..., a n) taka, że (a 1 a 2 a n). Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 41 / 59

Problem Sortowania Definicja problemu Niech (U, ) będzie zbiorem liniowo uporzadkowanym z relacja porzadkuj ac a i niech (a 1, a 2,..., a n ) będzie ciagiem n elementów z U, dla pewnego całkowitego n > 0. Znaleźć permutację (a 1, a 2,..., a n) taka, że (a 1 a 2 a n). Przykład Wejście: 8 2 4 9 3 6 Wyjście: 2 3 4 6 8 9 Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 41 / 59

Problem Sortowania Definicja problemu Niech (U, ) będzie zbiorem liniowo uporzadkowanym z relacja porzadkuj ac a i niech (a 1, a 2,..., a n ) będzie ciagiem n elementów z U, dla pewnego całkowitego n > 0. Znaleźć permutację (a 1, a 2,..., a n) taka, że (a 1 a 2 a n). Przykład Wejście: 8 2 4 9 3 6 Wyjście: 2 3 4 6 8 9 Uwaga! Na U moga składać się zarówno liczby całkowite lub rzeczywiste, jak i U może być zbiorem rekordów, które należy posortować według ich kluczy. Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 41 / 59

Popularne algorytmy sortowania Sortowanie przez porównywanie elementów: Sortowanie przez proste wybieranie (ang. selection sort) Sortowanie przez wstawianie (ang. insertion sort) Sortowanie babelkowe (ang. bubblesort) Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 42 / 59

Popularne algorytmy sortowania Sortowanie przez porównywanie elementów: Sortowanie przez proste wybieranie (ang. selection sort) Sortowanie przez wstawianie (ang. insertion sort) Sortowanie babelkowe (ang. bubblesort) Inne - będa omawiane na przedmiocie ASD Sortowanie przez scalanie (ang. merge sort) sortowanie szybkie (ang. quicksort) Sortowanie przez zliczanie (ang. counting sort) Sortowanie pozycyjne (ang. radix sort) sortowanie przez kopcowanie (ang. heapsort) Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 42 / 59

Sortowanie przez proste wybieranie Idea Sortowanie przez wybieranie polega na tym, że w każdym kroku znajdujemy najmniejszy element w sortowanym ciagu, po czym przenosimy ten element na odpowiednią pozycję do ciagu wynikowego (przez zamianę elementów miejscami). Sortowanie odbywa się w n-1 przebiegach. W i-tym przebiegu szukamy i-tego najmniejszego (największego) elementu. Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 43 / 59

Sortowanie przez proste wybieranie Require: tablica A o rozmiarze n {A=[0],...,A[n-1] 1: for all i := 0 to n 2 do 2: min := i; 3: for all j := i + 1 to n 1 do 4: if A[j] < A[min] then 5: min := j; 6: end if 7: j := j + 1; 8: end for {zamiana elementu A[min] z elementem A[i] w tablicy A 9: zamiana (A, min, i); 10: i := i + 1; 11: end for Ze względu na dwie zagnieżdżone pętle, z których każda wykonuje się dokładnie n razy, algorytm wymaga n n porównań, aby posortować n elementowy ciag, czyli jest w klasie O(n 2 ). Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 44 / 59

Sortowanie przez proste wybieranie - Przykład nr iteracji - i Tablica Minimum 0 [9,1,6,8,4,3,2,0] 0 1 [0,1,6,8,4,3,2,9] 1 - na właściwej pozycji 2 [0,1,6,8,4,3,2,9] 2 3 [0,1,2,8,4,3,6,9] 3 4 [0,1,2,3,4,8,6,9] 4 5 [0,1,2,3,4,8,6,9] 6 6 [0,1,2,3,4,6,8,9] 8 7 [0,1,2,3,4,6,8,9] 9 - na właściwej pozycji Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 45 / 59

Sortowanie przez proste wybieranie - Przykład K r o k i a l g o r y t m u Klucze i = 2 i = 3 i = 4 i = 5 i = 6 44 55 12 42 94 18 06 67 06 55 12 42 94 18 44 67 06 12 55 42 94 18 44 67 06 12 18 42 94 55 44 67 06 12 18 42 44 55 94 67 06 12 18 42 44 55 67 94 Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 46 / 59

void s e l e c t i o n S o r t ( i n t a [ ], i n t size ) { i n t i, j, min, temp ; f o r ( i = 0 ; i < size 1; i ++) { min = i ; f o r ( j = i +1; j < size ; j ++) { i f ( a [ j ] < a [ min ] ) min = j ; temp = a [ i ] ; a [ i ] = a [ min ] ; a [ min ] = temp ; Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 47 / 59

void s e l e c t i o n S o r t ( i n t [ ] a, i n t size ) { f o r ( i n t n = size ; n > 1 ; n ) { i n t j = max( a, n 1); swap ( a, j, n 1 ) ; Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 48 / 59

Sortowanie przez wstawianie Idea Sortowanie przez wstawianie odbywa się w n 1 przebiegach. W i-tym przebiegu elementy na pozycjach 1,...,(i 1) sa już uporzadkowane, a wstawiany i-ty element przepycha się do przodu na właściwe miejsce, tak by stworzył wraz z innymi ciag uporzadkowany długości i. Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 49 / 59

Sortowanie przez wstawianie - przykład 8 2 4 9 3 6 2 8 4 9 3 6 2 4 8 9 3 6 2 4 8 9 3 6 2 3 4 8 9 6 2 3 4 6 8 9 Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 50 / 59

Sortowanie przez wstawianie Require: tablica A o rozmiarze n {A=[0],...,A[n-1] 1: for i := 1 to n 1 do 2: key := A[i]; 3: j := i 1; 4: while j 0 and A[j] > key do 5: A[j + 1] := A[j]; 6: j := j 1; 7: end while 8: A[j + 1] := key; 9: end for Ze względu na dwie zagnieżdżone pętle, z których każda wykonuje się dokładnie n razy, algorytm wymaga n n porównań, aby posortować n elementowy ciag, czyli jest w klasie O(n 2 ). Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 51 / 59

Sortowanie przez wstawianie - Przykład nr iteracji (wartość i ) Tablica Rozważany element 0 [9,1,6,8,4,3,2,0] 9 Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 52 / 59

Sortowanie przez wstawianie - Przykład nr iteracji (wartość i ) Tablica Rozważany element 0 [9,1,6,8,4,3,2,0] 9 1 [1,9,6,8,4,3,2,0] 1 Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 52 / 59

Sortowanie przez wstawianie - Przykład nr iteracji (wartość i ) Tablica Rozważany element 0 [9,1,6,8,4,3,2,0] 9 1 [1,9,6,8,4,3,2,0] 1 2 [1,6,9,8,4,3,2,0] 6 Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 52 / 59

Sortowanie przez wstawianie - Przykład nr iteracji (wartość i ) Tablica Rozważany element 0 [9,1,6,8,4,3,2,0] 9 1 [1,9,6,8,4,3,2,0] 1 2 [1,6,9,8,4,3,2,0] 6 3 [1,6,8,9,4,3,2,0] 8 Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 52 / 59

Sortowanie przez wstawianie - Przykład nr iteracji (wartość i ) Tablica Rozważany element 0 [9,1,6,8,4,3,2,0] 9 1 [1,9,6,8,4,3,2,0] 1 2 [1,6,9,8,4,3,2,0] 6 3 [1,6,8,9,4,3,2,0] 8 4 [1,6,8,4,9,3,2,0] 4 Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 52 / 59

Sortowanie przez wstawianie - Przykład nr iteracji (wartość i ) Tablica Rozważany element 0 [9,1,6,8,4,3,2,0] 9 1 [1,9,6,8,4,3,2,0] 1 2 [1,6,9,8,4,3,2,0] 6 3 [1,6,8,9,4,3,2,0] 8 4 [1,6,8,4,9,3,2,0] 4 [1,6,4,8,9,3,2,0] 4 Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 52 / 59

Sortowanie przez wstawianie - Przykład nr iteracji (wartość i ) Tablica Rozważany element 0 [9,1,6,8,4,3,2,0] 9 1 [1,9,6,8,4,3,2,0] 1 2 [1,6,9,8,4,3,2,0] 6 3 [1,6,8,9,4,3,2,0] 8 4 [1,6,8,4,9,3,2,0] 4 [1,6,4,8,9,3,2,0] 4 [1,4,6,8,9,3,2,0] 4 Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 52 / 59

Sortowanie przez wstawianie - Przykład nr iteracji (wartość i ) Tablica Rozważany element 0 [9,1,6,8,4,3,2,0] 9 1 [1,9,6,8,4,3,2,0] 1 2 [1,6,9,8,4,3,2,0] 6 3 [1,6,8,9,4,3,2,0] 8 4 [1,6,8,4,9,3,2,0] 4 [1,6,4,8,9,3,2,0] 4 [1,4,6,8,9,3,2,0] 4 5 [1,4,6,8,3,9,2,0] 3 Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 52 / 59

Sortowanie przez wstawianie - Przykład nr iteracji (wartość i ) Tablica Rozważany element 0 [9,1,6,8,4,3,2,0] 9 1 [1,9,6,8,4,3,2,0] 1 2 [1,6,9,8,4,3,2,0] 6 3 [1,6,8,9,4,3,2,0] 8 4 [1,6,8,4,9,3,2,0] 4 [1,6,4,8,9,3,2,0] 4 [1,4,6,8,9,3,2,0] 4 5 [1,4,6,8,3,9,2,0] 3 [1,4,6,3,8,9,2,0] 3 Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 52 / 59

Sortowanie przez wstawianie - Przykład nr iteracji (wartość i ) Tablica Rozważany element 0 [9,1,6,8,4,3,2,0] 9 1 [1,9,6,8,4,3,2,0] 1 2 [1,6,9,8,4,3,2,0] 6 3 [1,6,8,9,4,3,2,0] 8 4 [1,6,8,4,9,3,2,0] 4 [1,6,4,8,9,3,2,0] 4 [1,4,6,8,9,3,2,0] 4 5 [1,4,6,8,3,9,2,0] 3 [1,4,6,3,8,9,2,0] 3 [1,4,3,6,8,9,2,0] 3 Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 52 / 59

Sortowanie przez wstawianie - Przykład nr iteracji (wartość i ) Tablica Rozważany element 0 [9,1,6,8,4,3,2,0] 9 1 [1,9,6,8,4,3,2,0] 1 2 [1,6,9,8,4,3,2,0] 6 3 [1,6,8,9,4,3,2,0] 8 4 [1,6,8,4,9,3,2,0] 4 [1,6,4,8,9,3,2,0] 4 [1,4,6,8,9,3,2,0] 4 5 [1,4,6,8,3,9,2,0] 3 [1,4,6,3,8,9,2,0] 3 [1,4,3,6,8,9,2,0] 3 [1,3,4,6,8,9,2,0] 3 Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 52 / 59

Sortowanie przez wstawianie - Przykład nr iteracji (wartość i ) Tablica Rozważany element 0 [9,1,6,8,4,3,2,0] 9 1 [1,9,6,8,4,3,2,0] 1 2 [1,6,9,8,4,3,2,0] 6 3 [1,6,8,9,4,3,2,0] 8 4 [1,6,8,4,9,3,2,0] 4 [1,6,4,8,9,3,2,0] 4 [1,4,6,8,9,3,2,0] 4 5 [1,4,6,8,3,9,2,0] 3 [1,4,6,3,8,9,2,0] 3 [1,4,3,6,8,9,2,0] 3 [1,3,4,6,8,9,2,0] 3 6 [1,2,3,4,6,8,9,0] 2 Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 52 / 59

Sortowanie przez wstawianie - Przykład nr iteracji (wartość i ) Tablica Rozważany element 0 [9,1,6,8,4,3,2,0] 9 1 [1,9,6,8,4,3,2,0] 1 2 [1,6,9,8,4,3,2,0] 6 3 [1,6,8,9,4,3,2,0] 8 4 [1,6,8,4,9,3,2,0] 4 [1,6,4,8,9,3,2,0] 4 [1,4,6,8,9,3,2,0] 4 5 [1,4,6,8,3,9,2,0] 3 [1,4,6,3,8,9,2,0] 3 [1,4,3,6,8,9,2,0] 3 [1,3,4,6,8,9,2,0] 3 6 [1,2,3,4,6,8,9,0] 2 7 [1,2,3,4,6,8,9,0] 0 Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 52 / 59

Sortowanie przez wstawianie - przykład K r o k i a l g o r y t m u Klucze i = 2 i = 3 i = 4 i = 5 i = 6 i = 7 i = 8 44 55 12 42 94 18 06 67 44 55 12 42 94 18 06 67 12 44 55 42 94 18 06 67 12 42 44 55 94 18 06 67 12 42 44 55 94 18 06 67 12 18 42 44 55 94 06 67 06 12 18 42 44 55 94 67 06 12 18 42 44 55 67 94 Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 53 / 59

void i n s e r t ( i n t [ ] a, i n t n, i n t x ) { / / i n s e r t x i n t o a [ 0.. i 1] i n t j ; f o r ( j = i 1 ; j >= 0 && x < a [ j ] ; j ) a [ j + 1 ] = a [ j ] ; a [ j + 1 ] = x ; Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 54 / 59

void i n s e r t S o r t ( i n t [ ] a, i n t n ) { f o r ( i n t i = 1 ; i < n ; i ++) { / / i n s e r t a [ i ] i n t o a [ 0 : i 1] i n s e r t ( a, i, a [ i ] ) ; Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 55 / 59

Sortowanie babelkowe W sortowaniu babelkowym liczby zachowuja się jak babelki, po kolei, jedna po drugiej ida do góry (lub w prawo). Sortowanie babelkowe jest wykonywane w n 1 fazach. W fazie i-tej wyznaczany jest i-ty najmniejszy/największy element. Idea Sprawdzamy cały ciag od końca. Jeżeli trafimy na parę elementów, w której większy poprzedza mniejszy, to zamieniamy je miejscami. Czynność powtarzamy tak długo, aż podczas sprawdzania całego ciagu, nie zajdzie ani jedna zamiana elementów. Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 56 / 59

Sortowanie babelkowe Require: tablica A o rozmiarze n {A=[0],...,A[n-1] 1: for i := 0 to n 1 do 2: for j := n downto i + 1 do 3: if A[j 1] > A[j] then 4: Zamiana(A, j 1, j); 5: end if 6: end for 7: end for Ze względu na dwie zagnieżdżone pętle, z których każda wykonuje się dokładnie n razy, algorytm wymaga n n porównań, aby posortować n elementowy ciag, czyli jest w klasie O(n 2 ). Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 57 / 59

Sortowanie babelkowe - przykład 44 Klucze i = 1 06 55 44 12 55 42 12 94 42 18 94 06 18 67 67 i = 2 K r o k i a l g o r y t m u i = 3 06 06 12 12 44 18 55 44 18 55 42 42 94 67 67 94 i = 4 06 12 18 42 44 55 67 94 i = 5 06 12 18 42 44 55 67 94 i = 6 06 12 18 42 44 55 67 94 i = 7 06 12 18 42 44 55 67 94 Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 58 / 59

void bubblesort ( i n t A [ ], i n t n ) { f o r ( i n t i =0; i <n ; i ++) f o r ( i n t j =n 1; j > i ; j ) i f (A[ j ] < A[ j 1]) { / / zamiana A[ j 1] z A[ j ] i n t temp= A[ j 1]; A[ j 1] = A[ j ] ; A[ j ]= temp ; Bożena Woźna-Szcześniak (AJD) Programowanie Proceduralne Wykład 1 59 / 59