Wstęp do Informatyki i Programowania



Podobne dokumenty
Wstęp do Programowania, laboratorium 02

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

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

Język C zajęcia nr 11. Funkcje

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

Języki i metodyka programowania. Wprowadzenie do języka C

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

Funkcja (podprogram) void

Podstawy programowania C. dr. Krystyna Łapin

2 Przygotował: mgr inż. Maciej Lasota

Temat 1: Podstawowe pojęcia: program, kompilacja, kod

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

Język C część 1. Sformułuj problem Zanalizuj go znajdź metodę rozwiązania (pomocny może byd algorytm) Napisz program Uruchom i przetestuj czy działa

Tablice, funkcje - wprowadzenie

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 Informatyki sem. I 2014/2015 studia zaoczne Elektronika i Telekomunikacja!

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

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

Proste algorytmy w języku C

C++ wprowadzanie zmiennych

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

1 Podstawy c++ w pigułce.

Informatyka I. Typy danych. Operacje arytmetyczne. Konwersje typów. Zmienne. Wczytywanie danych z klawiatury. dr hab. inż. Andrzej Czerepicki

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

Programowanie I C / C++ laboratorium 02 Składnia pętli, typy zmiennych, operatory

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

Programowanie w języku Python. Grażyna Koba

1 Podstawy c++ w pigułce.

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

Programowanie I C / C++ laboratorium 03 arytmetyka, operatory

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

Programowanie I C / C++ laboratorium 01 Organizacja zajęć

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

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

Język ludzki kod maszynowy

Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Ćwiczenie 1. Podstawy. Wprowadzenie do programowania w języku C. Katedra Metrologii AGH

Wskaźniki. Programowanie Proceduralne 1

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

Programowanie strukturalne i obiektowe

Wykład II Tablice (wstęp) Przykłady algorytmów Wstęp do języka C/C++

Podstawy programowania w języku C

lekcja 8a Gry komputerowe MasterMind

int tab[5]; tab[1]; ciągły obszar pamięci, w którym umieszczone są elementy tego samego typu macierz [ ] - dwuargumentowy operator indeksowania

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

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

#include <stdio.h> int main( ) { int x = 10; long y = 20; double s; s = x + y; printf ( %s obliczen %d + %ld = %f, Wynik, x, y, s ); }

Instytut Mechaniki i Inżynierii Obliczeniowej Wydział Mechaniczny Technologiczny Politechnika Śląska

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

Programowanie - wykład 4

Wstęp do programowania INP003203L rok akademicki 2018/19 semestr zimowy. Laboratorium 2. Karol Tarnowski A-1 p.

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

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

Wstęp do Informatyki i Programowania (kierunek matematyka stosowana)

Wstęp do Informatyki i Programowania Laboratorium: Lista 0 Środowisko programowania

Zadanie 1 Przygotuj algorytm programu - sortowanie przez wstawianie.

Część 4 życie programu

Instrukcja do ćwiczeń nr 4 typy i rodzaje zmiennych w języku C dla AVR, oraz ich deklarowanie, oraz podstawowe operatory

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

Wstęp do programowania INP003203L rok akademicki 2016/17 semestr zimowy. Laboratorium 1. Karol Tarnowski A-1 p.

Lab 10. Funkcje w argumentach funkcji metoda Newtona. Synonimy nazw typów danych. Struktury. Tablice struktur.

I - Microsoft Visual Studio C++

Wstęp do programowania. Wykład 1

Jak napisać program obliczający pola powierzchni różnych figur płaskich?

Algorytm. a programowanie -

Operatory. Operatory bitowe i uzupełnienie informacji o pozostałych operatorach. Programowanie Proceduralne 1

Podstawy Programowania.

Zadanie 1. Suma silni (11 pkt)

do instrukcja while (wyrażenie);

Wprowadzenie do języka Java

#include <stdio.h> void main(void) { int x = 10; long y = 20; double s; s = x + y; printf ( %s obliczen %d + %ld = %f, Wynik, x, y, s ); }

Informatyka 1. Plan dzisiejszych zajęć. zajęcia nr 1. Elektrotechnika, semestr II rok akademicki 2008/2009

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

Prof. Danuta Makowiec Instytut Fizyki Teoretycznej i Astrofizyki pok. 353, tel danuta.makowiec at gmail.com

Spis treści WSTĘP CZĘŚĆ I. PASCAL WPROWADZENIE DO PROGRAMOWANIA STRUKTURALNEGO. Rozdział 1. Wybór i instalacja kompilatora języka Pascal

Podstawy programowania w języku C++

( wykł. dr Marek Piasecki )

Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227 WYKŁAD 7 WSTĘP DO INFORMATYKI

Zmienne, stałe i operatory

Podstawy Informatyki. Algorytmy i ich poprawność

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

Wstęp do programowania

Laboratorium 5: Tablice. Wyszukiwanie binarne

Programowanie strukturalne i obiektowe : podręcznik do nauki zawodu technik informatyk / Adam Majczak. Gliwice, cop

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

Programowanie C++ Wykład 2 - podstawy języka C++ dr inż. Jakub Możaryn. Warszawa, Instytut Automatyki i Robotyki

I. KARTA PRZEDMIOTU CEL PRZEDMIOTU WYMAGANIA WSTĘPNE W ZAKRESIE WIEDZY, UMIEJĘTNOŚCI I INNYCH KOMPETENCJI EFEKTY KSZTAŁCENIA

JAVA. Platforma JSE: Środowiska programistyczne dla języka Java. Wstęp do programowania w języku obiektowym. Opracował: Andrzej Nowak

Funkcje. czyli jak programować proceduralne. Programowanie Proceduralne 1

Wykład I. Programowanie II - semestr II Kierunek Informatyka. dr inż. Janusz Słupik. Wydział Matematyki Stosowanej Politechniki Śląskiej

Laboratorium nr 1. i 2.

Języki programowania C i C++ Wykład: Typy zmiennych c.d. Operatory Funkcje. dr Artur Bartoszewski - Języki C i C++, sem.

4. Funkcje. Przykłady

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

Klasa 2 INFORMATYKA. dla szkół ponadgimnazjalnych zakres rozszerzony. Założone osiągnięcia ucznia wymagania edukacyjne na. poszczególne oceny

Podstawy Programowania

Rekurencja (rekursja)

OPERACJE WEJŚCIA / WYJŚCIA. wysyła sformatowane dane do standardowego strumienia wyjściowego (stdout)

Metodyki i Techniki Programowania MECHANIZM POWSTAWANIA PROGRAMU W JĘZYKU C PODSTAWOWE POJĘCIA

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

Podstawy Informatyki. Inżynieria Ciepła, I rok. Wykład 10 Kurs C++

Transkrypt:

Instytut Matematyki i Informatyki Wydział Podstawowych Problemów Techniki Politechnika Wrocławska Wstęp do Informatyki i Programowania Jacek Cichoń Projekt współfinansowany ze środków Unii Europejskiej w ramach Europejskiego Funduszu Społecznego

Spis treści I 1 Wprowadzenie do programowania Pierwszy program: Hello World Uruchomienie Dev-C++ Wpisanie programu Uruchomienie kompilatora Drugi program: prędkość spadania 2 Wprowadzenie do języka C Zmienne Pętla FOR Konstrukcje warunkowe Pętla WHILE Funkcje Tablice Łańcuchy Operacje bitowe

Spis treści II Biblioteki 3 Algorytmy: podstawowe techniki Największy Wspólny Dzielnik Liczby pierwsze Sito Erastotenesa Notacja Duże O Sortowane przez wstawianie Wyszukiwanie w tablicy Szybkie wyszukiwanie w tablicach Rekursja Problem wież z Hanoi Technika Dziel i Rzadź 4 Sortowanie przez scalanie Przeszukiwania z nawrotami

Spis treści III 5 Dodatki Ważne wzory O stylu programowania Zestawienie algorytmów Wybrane zadania

Materiały Literatura 1 J. Cichoń, P. Kobylański, Notatki ze Wstępu do Informatyki, strona WWW kursu 2 B. W. Kernighan, D. M. Ritchie, Język ANSI C, Wydawnictwa Naukowo-Techniczne, Warszawa, 2003 3 A. Aho, J. Ullman, Wykłady z informatyki z przykładami w języku C, Helion, 2003 4 D. Harrell, Rzecz o istocie informatyki. Algorytmika, Państwowe Wydawnictwo Naukowe, Warszawa, 2001 5 Ściąga z języka C:

Zaczynamy Język C Na wykładzie będziemy programować w języku C. Środowisko Dev C++ Znajdziesz je na stronie: http://www.bloodshed.net/devcpp.html Po załadowaniu na swój komputer pliku devcpp_setup.exe uruchom go i stosuj wszystkie domyślne opcje.

IDE programy języka C zapisujemy w plikach tekstowych kompilator tłumaczy plik tekstowy na kod maszynowy Zintegrowane środowisko programistyczne (Integrated Development Environment, IDE): aplikacja lub zespół aplikacji służacych do tworzenia, modyfikowania, testowania i konserwacji oprogramowania.

Hello World - 1 Nasz pierwszy program # include < s t d i o. h> # include < s t d l i b. h> i n t main ( i n t argc, char argv [ ] ) p r i n t f ( " Hello world!\n" ) ; system ( "PAUSE" ) ; return 0 ; W bibliotece stdio znajduj a sie funkcje printf i scanf. W bibliotece stdlib znajduje się funkcja system.

Hello World - 2 Uruchamiamy program Dev-C++. Na ekranie powinno pojawić się mniej więcej następujace okno: Znajdź polecenie Plik/Nowy/Projekt.

Hello World - 3 Pojawi się okno służace do ustalenia parametrów nowego projektu. Wybierz Aplikacja konsolowa, zaznacz Projekt C, wpisz nazwę HelloWorld.

Hello World - 3 Oto efekt dotychczasowych czynności: W panelu edytora wpisz jedna brakujac a linijkę kodu, czyli: printf("hello world!\n );

Hello World - 4 Oto spodziewany efekt dotychczasowych czynności: Teraz znajdź polecenie Uruchom/Kompiluj i uruchom.

Hello World - 5 Pojawi się okno, w którego polu File name wprowadź nazwę HelloMain Po wprowadzeniu tej nazwy naciśnij przycisk Save.

Hello World - 6 Na ekranie powinno pojawić się mniej więcej następujace okno: Jeśli ci to się nie powiedzie, to przeczytaj uważnie komunikaty kompilatora. Bład pewnie polega na braku średnika badź na użyciu złych nawiasów.

Hello World - 6 W przyszłości nie będziemy już tak dokładnie opisywali procesu kompilacji kodu. Zalecenia Powtórz samodzielnie wszystkie kroki wykonane podczas uruchamiania kodu programu Hello World. Powtarzaj samodzielnie czynności pierwsza, aż potrafisz bez korzystania z notatek napisać i uruchomić ten program. Korzystajac z polecanych materiałów zrozum dokładnie każdy znak powyższego kodu. Możesz również zapytać się osobę prowadzac a laboratorium o detale.

Prędkość i czas spadania - I Jeśli puścimy jakiś obiekt z wysokości h to uderzy on o ziemię po czasie 2G t = h z szybkościa v = 2Gh. CEL: napisanie programu, który po podaniu przez użytkownika wysokości h wyświetli mu na ekranie obie liczby (t oraz v).

Prędkość i czas spadania - II Funkcje pomocnicze # define G 9. 8 1 f l o a t Czas ( f l o a t h ) return s q r t (2 h/g ) ; f l o a t Predkosc ( f l o a t h ) return s q r t (2 h G) ; 1 sqrt jest funkcja, która zwraca pierwiastek kwadratowy 2 funkcja ta znajduje się w bibliotece math 3 słowo float oznacza liczbę rzeczywista (później omówimy pewne szczegóły) 4 w pierwszej linijce zdefiniowaliśmy stała

Prędkość i czas spadania - III Funkcja main i n t main ( i n t argc, char argv [ ] ) f l o a t H; printf ( " Podaj wysokosc w metrach : " ) ; scanf ( "%f ",&H) ; p r i n t f ( " Wysokosc : %f [m]\n",h) ; p r i n t f ( " Czas : %f [ sec ]\n", Czas (H) ) ; p r i n t f ( " Predkosc : %f [m/sec ]\n", Predkosc (H) ) ; p r i n t f ( "\n" ) ; system ( "PAUSE" ) ; return 0 ; 1 Funkcja printf służy do wyświetlenia napisu jej pierwszy parametr jest łańcuchem formatujacym %f oznacza miejsce do wstawienia wartości zmiennej typu float 2 Funkcja scanf służy do wczytywania zwróć uwagę na znak &

Prędkość i czas spadania - IV Całość - część I # include <stdio. h> # include <stdlib. h> # include <math. h> # define G 9. 8 1 f l o a t Czas ( f l o a t h ) return sqrt (2 h/g ) ; f l o a t Predkosc ( f l o a t h ) return sqrt (2 h G) ; Całość - część 2 i n t main ( i n t argc, char argv [ ] ) f l o a t H; printf ( " Podaj wysokosc w metrach : " ) ; scanf ( "%f ",&H) ; p r i n t f ( " Wysokosc : %f [m]\n",h) ; p r i n t f ( " Czas : %f [ sec ]\n", Czas (H) ) ; p r i n t f ( " Predkosc : %f [m/sec ]\n", Predkosc (H) ) ; p r i n t f ( "\n" ) ; system ( "PAUSE" ) ; return 0 ;

Zmienne Podstawowe typy zmiennych 1 char: znak 2 int: liczba całkowita 3 long: długa liczba całkowita 4 short: krótka liczba całkowita 5 float: liczba rzeczywista 6 double: dluga liczba rzeczywista 7 file: plik 8 void: pusty

Pętla FOR - I Czy rok jest przestepny? i n t Przestepny ( i n t r ) return ( ( r % 4 == 0)&&( r % 100!= 0 ) ) ( r % 400 ==0); i n t main ( i n t argc, char argv [ ] ) for ( i n t i = 2000; i <2020; i ++) p r i n t f ( "%d %d\n", i, Przestepny ( i ) ) ; return 0 ; 1 == oznacza równość,!= oznacza negację równości 2 && oznacza koniunkcję 3 oznacza alternatywę 4 konstrukcję for omówimy za chwilę

Pętla FOR - II for ( i n t i = 2 0 0 0 ; i <2020; i ++) polecenie ; 1 Podstaw i := 2000 2 Jeśli i < 2020 to idź do (3); jeśli nie to idź do (5) 3 Wykonaj polecenie 4 Zmień i := i + 1 i idź do (2) 5 Zakończ pętlę.

Pętla FOR - III CEL: obliczenie liczby S = 100 k=1 1 k 2 1 i n t main ( i n t argc, char argv [ ] ) 2 3 i n t k ; 4 double suma=0; 5 6 for ( k =1;k<=100;k++) 7 suma += 1.0/( k k ) ; 8 9 printf ( "Suma = %f \n",suma ) ; 10 11 return 0 ; 12 Linię (7) można zastapić suma= suma+1.0/(k*k); Uwaga: pomysł zastapienia (7) kodem suma += 1/(k*k); nie jest zbyt madry!!!

Konstrukcje warunkowe Konwencja i f (W) Block ; i f (W) Blok1 ; e lse Blok2 ; 1 TRUE = wartość = 0 2 FALSE = wartość 0

Pętla WHILE - I (Hipoteza Collatz a) unsigned i n t D2OrM3( unsigned i n t x ) unsigned i n t L=0; while ( x > 1) //x j e s t nieparzyste L++; i f ( x%2) x = 3 x +1; else x/= 2 ; //to samo co x= x/2 //koniec p e t l i while return L ; i n t main ( i n t argc, char argv [ ] ) for ( i n t i =1; i <=100; i ++) p r i n t f ( "%3d : %d\n", i, D2OrM3( i ) ) ; return 0 ; Do tej pory nie wiadomo, czy dla każdej liczby naturalnej n funkcja D2OrM3 zatrzymuje się po skończonej liczbie kroków!!!

Pętla WHILE - II (interpretacja) while ( Warunek ) Polecenie ; 1 Jeśli Warunek jest prawdziwy, to idż do (2); jesli nie, to idź do (4) 2 Wykonaj Polecenie 3 Idź do (1) 4 Zakończ petlę

Zamiana zmiennych void SwapInt ( i n t a, i n t b ) i n t r ; r= a ; a= b ; b= r ; i n t main ( i n t argc, char argv [ ] ) i n t x, y ; x = 2 ; y = 5 ; p r i n t f ( "%d %d\n", x, y ) ; SwapInt(&x,&y ) ; p r i n t f ( "%d %d\n", x, y ) ; return 0 ; Parametrami funkcji SwapInt sa wskaźniki do zmiennych a i b Wewn atrz funkcji pracujemy na kopiach parametrów prostych!!!

Tablice 1 int T[100]; : tablica 100 liczb typu int 2 float T[200]; : tablica 200 liczb typu float 3 elementy tablicy numerowane sa od zera 4 do itego elementów tablicy odwołujemy się za pomoc a konstrukcji T[i]

Tablice - liczby Fibbonacciego 1 # define MAX 20 2 3 void Fibbonacci ( i n t F [ ], i n t rozmiar ) 4 5 i n t i ; 6 F [ 0 ] = 1 ; 7 F [ 1 ] = 1 ; 8 for ( i =2; i <rozmiar ; i ++) 9 F [ i ]= F [ i 1]+F [ i 2]; 10 11 12 i n t main ( i n t argc, char argv [ ] ) 13 14 i n t F [MAX] ; //deklaracja t a b l i c y 15 Fibbonacci ( F,MAX) ; 16 for ( i n t i =0; i <MAX; i ++) 17 p r i n t f ( "%d ", F [ i ] ) ; 18 p r i n t f ( "\n" ) ; 19 return 0 ; 20 Tablice sa przekazywane przez wskaźniki W linii 14 zadeklarowaliśmy tablicę 20 liczb całkowitych Elementy tablicy numerujemy od zera!

Łańcuchy znaków 1 void s t r r e v ( char s [ ] ) 2 i n t L, P ; 3 char crob ; //zmienna robocza 4 L= 0 ; //numer pierwszego znak lancucha 5 P= strlen ( s ) 1; //numer ostatniego znaku lancucha 6 while ( L<P ) 7 crob= s [ P ] ; //zamiana s [ L ] z s [ P ] 8 s [ P]= s [ L ] ; 9 s [ L]= crob ; 10 L++; 11 P ; 12 13 14 i n t main ( i n t argc, char argv [ ] ) 15 char s t r [ 2 5 6 ] ; 16 17 p r i n t f ( " Podaj lancuch : " ) ; 18 gets ( s t r ) ; 19 s t r r e v ( s t r ) ; 20 printf ( "Odwrocony : %s\n", str ) ; 21 system ( "PAUSE" ) ; 22 return 0 ; 23 Język C traktuje łańcuchy nonszalancko: s a to tablice znaków zakończone znakiem char(0)

Struktura bajtu Bajt = 8 bitów. (b 7 b 6 b 5 b 4 b 3 b 2 b 1 b 0 ) (2) = (00000000) (2) = 0 7 i=0 b i 2 i (11111111) (2) = 1 + 2 2 +... + 2 7 = 28 1 2 1 = 257

Operacje bitowe / Zapalenie k tego b i t u l i c z b y a / unsigned ZapalBit ( unsigned a, i n t k ) return a (1<<k ) ; / Zgaszenie k tego b i t u l i c z b y a / unsigned ZgasBit ( unsigned a, i n t k ) return a &(~(1<<k ) ) ; / Sprawdzenie, czy k ty bit liczby a j e s t zapalony / i n t Zapalony ( unsigned a, i n t k ) return a&(1<<k ) ; / Liczba zapalonych bitów w a / i n t card ( unsigned a ) i n t L =0; while ( a ) L++; a&= a 1; // c z y l i a= a & ( a 1); return L ; 1 &: bitowa koniunkcja 2 : biowa alternatywa 3 : bitowa negacja 4 : bitowe XOR 5 a << k: przesunięcie a o k bitów w lewo 6 a >> k: przesunięcie a o k bitów w prawo

Operacje bitowe - II

Najważniejsze biblioteki języka C Biblioteki 1 <stdio.h>: podstawowe funkcje wejścia i wyjścia 2 <stdlib.h>: konwersja między typami numerycznymi, generator liczb pseudo-losowych, alokowanie pamięci 3 <math.h>: podstawowe funkcje matematyczne 4 <string.h>: funkcje obsługi łańcuchów 5 <time.h>: funkcje obsługi daty i czasu 6...

Algorytmy Co nas czeka: Podstawowe algorytmy teorio-liczbowe Notacja f = O (g) Go Podstawowe algorytmy wyszukowania i sortowania Rekursja Go Technika Dziel i Rzadź Algorytmy z nawrotami Go Go Go Go oraz różne potrzebne do zrozumienia analizowanych algorytmów metody i fakty matematyczne.

Największy Wspólny Dzielnik NWD NWD(a, b) = maxk N : k a k b jeśli b a to NWD(a, b) = b jeśli a = k b + r i 0 < r < b to NWD(a, b) = NWD(b, r) unsigned i n t NWD( unsigned i n t a, unsigned i n t b ) unsigned i n t r ; r = a%b ; while ( r ) a = b ; b = r ; r = a%b ; // dzielenie calkowito liczbowe return b ;

Czy dana liczba jest pierwsza? Liczba p N jest pierwsza, jeśli z tego, że k p wynika, że k = 1 lub k = p Jeśli liczba n nie jest pierwsza, to istnieje k n taka, że k n 1 # define TRUE 1 2 # define FALSE 0 3 4 i n t IsPrime ( unsigned n ) 5 unsigned i n t bound, i ; 6 i f ( n < 2) 7 return FALSE ; 8 bound = ( unsigned int ) sqrt ( n ) ; //zrzutowanie na typ unsigned int 9 for ( i =2; i <=bound ; i ++) 10 i f ( n%i ==0) 11 return FALSE ; 12 return TRUE; 13

Sito Erastotenesa Generujemy tablicę S[0,..., n 1] taka, że S[k] = k Primes 1 void SitoErastotenesa ( i n t S [ ], i n t n ) 2 unsigned i n t bound, i, j ; 3 4 bound = ( unsigned i n t ) s q r t ( n ) ; 5 S [ 0 ] = FALSE ; 6 S [ 1 ] = FALSE ; 7 for ( i =2; i < n ; i ++) 8 S [ i ]=TRUE; 9 10 for ( i =2; i <=bound ; i ++) 11 12 j = i 2; 13 while ( j < n ) 14 15 S [ j ]=FALSE ; 16 j += i ; 17 18 19 / S i t o Erastotenesa /

Notacja Duże O - I Definicja Niech f, g : N R. Wtedy f = O (g) ( C > 0)( N)( n > N) ( f (n) C g(n) ) f (n) = 50 + 10 n g(n) = n 2 f = O (g) 50 + 10 n = O ( n 2)

Notacja Duże O - II Z pomoca przychodzi nam Analiza Matematyczna. Twierdzenie Załóżmy, że f, g : N R. Wtedy ( ) lim f (n) n g(n) < (f = O (g)) ( 50 + 10n 50 lim n n 2 = lim n n 2 + 10 ) = 0 + 0 = 0 <, n więc 50 + 10n = O ( n 2).

Notacja Duże O - III Definicja Niech f, g : N R. Wtedy 1 f = Θ(g) f = O (g) g = O (f ) 2 f = o(g) lim n f (n) g(n) = 0 Twierdzenie Niech f, g : N R. Wtedy 1 f = o(g) f = O (g) f (n) 2 0 < lim n < f = Θ(g) g(n)

Największy Wspólny Dzielnik - II Twierdzenie Załóżmy, że a, b N oraz 0 < b a. Wtedy a mod b < a 2. Twierdzenie Algorytm NWD(a,b) działa w czasie O (maxlog a, log b)

Sortowanie przez wstawianie - I Sortujemy tablicę X[0,..., n 1] liczb typu double. 1 void InSort ( double X [ ], i n t n ) 2 3 i n t i, j ; 4 double m; 5 6 for ( i =1; i <n ; i ++) 7 8 m = X[ i ] ; 9 j =i 1; 10 while ( ( j >=0)&&(X[ j ] >m) ) 11 12 X[ j +1]=X[ j ] ; 13 j ; 14 15 X[ j +1]=m; 16 17 / I n S o r t /

Sortowanie przez wstawianie - II 1 L n = liczba porównań użytych dla tablicy rozmiaru n 2 L n n 1 3 L n 1 2n(n 1) L n 1 + 2 +... + (n 1) = (n 1)((n 1) + 1) 2 = (n 1)n 2 Bardzo Ważny Wzór n n(n + 1) k = 2 k=1

Sortowanie przez wstawianie - III L n = liczba porównań użytych do sortowania tablicy rozmiaru n Wniosek L n = O (n 2) Oznaczamy (na chwilę): f g f = o(g). Klasy złożoności obliczeniowej 1 log(n) n n log n n 2 n 3... 2 n 3 n... wielomianowe wykladnicze

Wyszukiwanie w tablicy Dane: 1 X = tablica liczb całkowitych rozmiaru n 2 a = poszukiwana liczba CEL: Rozstrzygnięcie, czy a występuje w tablicy X 1 i n t Find ( i n t X [ ], i n t n, i n t a ) 2 3 i n t i ; 4 5 for ( i =0; i <n ; i ++) 6 i f (X[ i ]==a ) return TRUE; 7 8 return FALSE ; 9 / Find / Liczba porównań: O (n)

Wyszukiwanie w tablicy uporzadkowanej Dane: 1 X = uporzadkowana tablica liczb całkowitych rozmiaru n 2 a = poszukiwana liczba CEL: Rozstrzygnięcie, czy a występuje w tablicy X 1 i n t BFind ( i n t X [ ], i n t n, i n t a ) 2 i n t L, P, S ; 3 L=0; 4 P=n 1; 5 while ( L<=P ) 6 7 S = L + (P L ) / 2 ; 8 i f (X[ S]==a ) 9 return TRUE; 10 else i f (X[ S]<a ) 11 L = S +1; 12 else 13 P = S 1; 14 15 return FALSE ; 16 / BFind / Liczba porównań: O (log n)

Definicje rekurencyjne Silnia 0! = 1, n > 0 n! = (n 1)! n Liczby Fibbonacciego F 0 = 1, F 1 = 1, n > 1 F n = F n 2 + F n 1 Funkcja Ackermana n + 1 : m = 0 A(m, n) = A(m 1, n) : m > 0 n = 0 A(m 1, A(m, n 1)) : m > 0 n > 0

Rekursja: problem wież z Hanoi - I void H( i n t Ile, i n t i, i n t j ) i n t k ; i f ( I l e ==1) p r i n t f ( "(%d,%d)\n", i, j ) ; else k= 6 ( i + j ) ; H( I l e 1, i, k ) ; p r i n t f ( "(%d,%d)\n", i, j ) ; H( I l e 1,k, j ) ; Wynik wywołania funkcji H z parametrami (3,1,3): (1,3) (1,2) (3,2) (1,3) (2,1) (2,3) (1,3) h n = 1 : n = 1 2 h n 1 + 1 : n > 1

Rekursja: problem wież z Hanoi - I void H( i n t Ile, i n t i, i n t j ) i n t k ; i f ( I l e ==1) p r i n t f ( "(%d,%d)\n", i, j ) ; else k= 6 ( i + j ) ; H( I l e 1, i, k ) ; p r i n t f ( "(%d,%d)\n", i, j ) ; H( I l e 1,k, j ) ; Wynik wywołania funkcji H z parametrami (3,1,3): (1,3) (1,2) (3,2) (1,3) (2,1) (2,3) (1,3) h n = 1 : n = 1 2 h n 1 + 1 : n > 1

Rekursja: problem wież z Hanoi - I void H( i n t Ile, i n t i, i n t j ) i n t k ; i f ( I l e ==1) p r i n t f ( "(%d,%d)\n", i, j ) ; else k= 6 ( i + j ) ; H( I l e 1, i, k ) ; p r i n t f ( "(%d,%d)\n", i, j ) ; H( I l e 1,k, j ) ; Wynik wywołania funkcji H z parametrami (3,1,3): (1,3) (1,2) (3,2) (1,3) (2,1) (2,3) (1,3) h n = 1 : n = 1 2 h n 1 + 1 : n > 1

Rekursja: problem wież z Hanoi - I void H( i n t Ile, i n t i, i n t j ) i n t k ; i f ( I l e ==1) p r i n t f ( "(%d,%d)\n", i, j ) ; else k= 6 ( i + j ) ; H( I l e 1, i, k ) ; p r i n t f ( "(%d,%d)\n", i, j ) ; H( I l e 1,k, j ) ; Wynik wywołania funkcji H z parametrami (3,1,3): (1,3) (1,2) (3,2) (1,3) (2,1) (2,3) (1,3) h n = 1 : n = 1 2 h n 1 + 1 : n > 1

Rekursja: problem wież z Hanoi - I void H( i n t Ile, i n t i, i n t j ) i n t k ; i f ( I l e ==1) p r i n t f ( "(%d,%d)\n", i, j ) ; else k= 6 ( i + j ) ; H( I l e 1, i, k ) ; p r i n t f ( "(%d,%d)\n", i, j ) ; H( I l e 1,k, j ) ; Wynik wywołania funkcji H z parametrami (3,1,3): (1,3) (1,2) (3,2) (1,3) (2,1) (2,3) (1,3) h n = 1 : n = 1 2 h n 1 + 1 : n > 1

Rekursja: problem wież z Hanoi - I void H( i n t Ile, i n t i, i n t j ) i n t k ; i f ( I l e ==1) p r i n t f ( "(%d,%d)\n", i, j ) ; else k= 6 ( i + j ) ; H( I l e 1, i, k ) ; p r i n t f ( "(%d,%d)\n", i, j ) ; H( I l e 1,k, j ) ; Wynik wywołania funkcji H z parametrami (3,1,3): (1,3) (1,2) (3,2) (1,3) (2,1) (2,3) (1,3) h n = 1 : n = 1 2 h n 1 + 1 : n > 1

Rekursja: problem wież z Hanoi - I void H( i n t Ile, i n t i, i n t j ) i n t k ; i f ( I l e ==1) p r i n t f ( "(%d,%d)\n", i, j ) ; else k= 6 ( i + j ) ; H( I l e 1, i, k ) ; p r i n t f ( "(%d,%d)\n", i, j ) ; H( I l e 1,k, j ) ; Wynik wywołania funkcji H z parametrami (3,1,3): (1,3) (1,2) (3,2) (1,3) (2,1) (2,3) (1,3) h n = 1 : n = 1 2 h n 1 + 1 : n > 1

Rekursja: problem wież z Hanoi - I void H( i n t Ile, i n t i, i n t j ) i n t k ; i f ( I l e ==1) p r i n t f ( "(%d,%d)\n", i, j ) ; else k= 6 ( i + j ) ; H( I l e 1, i, k ) ; p r i n t f ( "(%d,%d)\n", i, j ) ; H( I l e 1,k, j ) ; Wynik wywołania funkcji H z parametrami (3,1,3): (1,3) (1,2) (3,2) (1,3) (2,1) (2,3) (1,3) h n = 1 : n = 1 2 h n 1 + 1 : n > 1

Rekursja: problem wież z Hanoi - II Równanie rekurencyjne h n = 1 : n = 1 2 h n 1 + 1 : n > 1 1 Kolejne wartości h n : 1,3,7,15,31,63,... 2 Hipoteza: h n = 2 n 1 3 Dowód (indukcja matematyczna): h 1 = 2 1 1 = 2 1 = 1 h n+1 = 2 h n + 1 = 2(2 n 1) + 1 = 2 2 n 1 = 2 n+1 1.

Rekursja: problem wież z Hanoi - II Równanie rekurencyjne h n = 1 : n = 1 2 h n 1 + 1 : n > 1 1 Kolejne wartości h n : 1,3,7,15,31,63,... 2 Hipoteza: h n = 2 n 1 3 Dowód (indukcja matematyczna): h 1 = 2 1 1 = 2 1 = 1 h n+1 = 2 h n + 1 = 2(2 n 1) + 1 = 2 2 n 1 = 2 n+1 1.

Rekursja: problem wież z Hanoi - II Równanie rekurencyjne h n = 1 : n = 1 2 h n 1 + 1 : n > 1 1 Kolejne wartości h n : 1,3,7,15,31,63,... 2 Hipoteza: h n = 2 n 1 3 Dowód (indukcja matematyczna): h 1 = 2 1 1 = 2 1 = 1 h n+1 = 2 h n + 1 = 2(2 n 1) + 1 = 2 2 n 1 = 2 n+1 1.

Dziel i rzadź Idea Podziel zadanie na mniejsze część, rozwiaż oddzielnie każde z podzadań i scal rozwiazania częściowe w rozwiazanie całego zadania

Dziel i rzadź Idea Podziel zadanie na mniejsze część, rozwiaż oddzielnie każde z podzadań i scal rozwiazania częściowe w rozwiazanie całego zadania

Dziel i rzadź Idea Podziel zadanie na mniejsze część, rozwiaż oddzielnie każde z podzadań i scal rozwiazania częściowe w rozwiazanie całego zadania

Dziel i rzadź Idea Podziel zadanie na mniejsze część, rozwiaż oddzielnie każde z podzadań i scal rozwiazania częściowe w rozwiazanie całego zadania

Dziel i rzadź Idea Podziel zadanie na mniejsze część, rozwiaż oddzielnie każde z podzadań i scal rozwiazania częściowe w rozwiazanie całego zadania

Dziel i rzadź Idea Podziel zadanie na mniejsze część, rozwiaż oddzielnie każde z podzadań i scal rozwiazania częściowe w rozwiazanie całego zadania

Rekursja: Sortowanie przez scalanie - I double T [MAX] ; double rob [MAX] ; void MS( i n t L, i n t P ) i n t S, i, j, k ; i f ( L==P ) return ; S= (L+P ) / 2 ; //punkt srodkowy MS( L, S ) ; // r e k u r s j a MS( S +1,P ) ; // r e k u r s j a i = L ; j = S +1; k= 0 ; while ( ( i <=S)&&( j <=P ) ) // s c a l a n i e i f ( T [ i ] <T [ j ] ) rob [ k]= T [ i ] ; i ++; else rob [ k]= T [ j ] ; j ++; k++; while ( i <=S ) rob [ k]= T [ i ] ; i ++;k ++; while ( j <=P ) rob [ k]= T [ j ] ; j ++;k ++; for ( i =L ; i <=P ; i ++) //kopiowanie T [ i ]= rob [ i L ] ; i n t main ( i n t argc, char argv [ ] ) T [ 0 ] = 1 0 ; T [ 1 ] = 5 ; T[2]= 8 8. 8 ; T[3]= 1 2 ; MS( 0, 3 ) ; p r i n t f ( "%f %f %f %f \n\n", T [ 0 ], T [ 1 ], T [ 2 ], T [ 3 ] ) ; system ( "PAUSE" ) ; return 0 ; 1 L(n) = liczba porównań 2 L(1) = 0 3 L(n) 2 L( n 2 ) + n 4 Jak oszacować L(n)?

Sortowanie przez scalanie - II Część 1 Rozważamy funkcję f : N R taka, że f (1) = d oraz n f (n) = 2f ( ) + b n. 2 Wprowadzamy pomocnicza funkcję g(n) = f (2 n )/2 n. Wtedy g(0) = d oraz g(n + 1) = f (2n+1 ) 2 n+1 = 2f (2n ) + b2 n+1 2 n+1 = f (2n ) 2 n + b = g(n) + b

Sortowanie przez scalanie - III Część 2: analiza równania Z tego, że g(0) = d i g(n + 1) = g(n) + b wynika, że g(n) = bn + d, więc f (2 n ) = 2 n g(n) = 2 n (bn + d). Niech N = 2 n. Wtedy n = log 2 N, więc f (N) = N(b log 2 N + d)

Sortowanie przez scalanie - IV TWIERDZENIE O SORTOWANIU PRZEZ SCALANIE Dla N postaci 2 k mamy N 1 L N N log 2 N Mniej dokładna wersja Dla dowolnego N mamy L N = O (N log N)

Porównanie (siła ALGORYTMIKI) 1 rozmiar tablicy: N = 10 7 2 taktowanie procesora: ω = 3GH 3 jedno porównanie: n = 10 taktów procesora Sortowanie przez wstawianie Sortowanie przez scalanie T = kod 1 2 N2 n = 1 10 15 ω 2 3 10 9 [sek] = 3 2 106 [sek] 17.4[dni] kod T = N log 2 N n ω 0.56[sek]

Przeszukiwanie z nawrotami: Problem Hetmanów i n t OK( i n t H[ ], i n t L ) i n t i ; for ( i =1; i <L ; i ++) i f ( (H[ i ]==H[ L ] ) ( abs (H[ i ] H[ L])==L i ) ) return 0 ; return 1 ; i n t main ( i n t argc, char argv [ ] ) i n t H[ 9 ] ; UstawHetmany (H, 1 ) ; return EXIT_SUCCESS ; void UstawHetmany ( i n t H[ ], i n t L ) i n t i ; i f ( L>8) for ( i =1; i <=8; i ++) p r i n t f ( "%d ",H[ i ] ) ; p r i n t f ( "\n" ) ; return ; for ( i =1; i <=8; i ++) H[ L]= i ; i f (OK(H, L ) ) UstawHetmany (H, L + 1 ) ;

Co dalej was czeka? Kursy zwiazane z Algorytmika 1 Matematyka Dyskretna 2 Kursy programowania 3 Algorytmy i Struktury Danych 4 Paradygmaty Programowania 5 Probabilistyka 6 Języki Formalne 7 Różne kursy do wyboru

Ważne fakty Wzory 1 1 + 2 +... + n = 1 2n(n + 1) 2 1 2 + 2 2 +... + n 2 = 1 6n(n + 1)(2n + 1) 3 1 + q + q 2 +... + q n = 1 qn+1 1 q dla q = 1 4 ( n k ) = n! k!(n k)! = X 1,..., n : X = k 5 Reguła de l Hospitala: lim n f (n) g(n) = lim n f (n) g (n) 6 log a b = log c b/ log c a

O stylu programowania Ogólne zasady 1 Pisz kod dla czlowieka a nie dla maszyny 2 Stosuj jednolita konwencję formatowania kodu 3 Stosuj tylko sensowne nazwy zmiennych (poza iteratorami) 4 Stosuj zasadę KISS ( Keep it Simple, Stupid ) 5 Komentuj istotne fragmenty kodu 6 Nie komentuj oczywistości 7 Dokumentuj kod (autor, data powstania, modyfikacji,...)

Złożoności obliczeniowe omawianych algorytmów Algorytm Złożoność Naiwny test pierwszości O ( n ) Wyszukiwanie w dowolnej tablicy O (n) Wyszukiwanie w tablicy uporzadkowanej O (log n) Sortowanie przez wstawianie O ( n 2) Sortowanie przez scalanie O (n log n) NWD(a,b) O (maxlog a, log b)

Wybrane zadania I Liczby bliźniacze Liczby bliźniacze to takie dwie liczby pierwsze, których różnica wynosi 2. Napisz funkcję która dla zadanej liczby naturalnej n wyznaczy ilość par liczb bliźniaczych mniejszych od n. Liczby zaprzyjaźnione Niech σ(n) oznacza sumę wszystkich dzielników liczby naturalnej n mniejszych od liczby n (na przykład σ(5) = 1 oraz σ(6) = 1 + 2 + 3 = 6. Liczbę n nazywamy doskonała jeśli σ(n) = n. Parę liczb (n, m) nazywamy zaprzyjaźniona, jeśli σ(n) = m oraz σ(m) = n. Znajdź wszystkie liczby doskonałe mniejsze od 1000. Wyznacz wszystkie zaprzyjaźnione pary liczb mniejszych niż 1000. Rozwiazywanie równań liniowych w liczbach całkowitych Napisz program który dla danych liczb całkowitych a, b, c znajduje, jeśli istnieje, przynajmniej jedno rozwiazanie liczbach całkowitych równania a X + b Y = c. Sito Erastotenesa Przerób algorytm wyznaczania sita Erastotenesa tak aby pracował on na pojedynczych bitach, czyli tak aby do reprezentacji jednej liczby naturalnej wykorzystywał tylko jeden bit. Zamiana baz Napisz funkcję, która dla zadanej liczby naturalnej n zwraca jej reprezentacje binarna oraz w układzie szesnastkowym. Generowanie podzbiorów Napisz procedurę, która generuje wszystkie podzbiory k - elementowe zbioru 1, 2,..., n.

Wybrane zadania II Generowanie permutacji Napisz procedurę, która generuje wszystkie permutacje zbioru 1, 2,..., n. Tautologie Napisz program, który wczytuje formułę rachunku zdań zapisana w notacji polskiej, zbudowana ze zmiennych zdaniowych p, q, r, s, t, drukuje jej tablice zero-jedynkowa i sprawdza, czy jest ona tautologia. Funkcja Ackremana Pokaż, że funkcja Ackremana jest poprawnie zdefiniowana. Wyznacz wartości funkcji Ackremana dla małych wartości parametrów. Liczba zapalonych bitów Napisz funkcję, która dla podanej liczby typu unsigned oblicza liczbę jej zapalonych bitów. Anagramy Słowo A nazywamy anagramem słowa B jeśli słowo A można otrzymać ze słowa B za pomoca przestawienia kolejność liter. Napisz procedurę, który dla podanych dwóch ciagów znaków rozstrzyga, czy sa one wzajemnymi anagramami. Problem skoczka szachowego Napisz procedurę, który wyznaczy taka sekwencję ruchów skoczka szachowego, aby obszedł on cała szachownicę, przechodzac przez każde pole dokładnie jeden raz.