Wstęp do programowania - fuw.edu.pldward/wdp_wyk1.pdf · Dlaczego warto uczyć się programowania...

Post on 04-Jul-2020

7 views 0 download

Transcript of Wstęp do programowania - fuw.edu.pldward/wdp_wyk1.pdf · Dlaczego warto uczyć się programowania...

Wstęp do programowania

Dariusz Wardecki, wyk. I

Kontakt

• dward@fuw.edu.pl

• http://www.fuw.edu.pl/~dward/wdp

• ul. Hoża 69, pok. 114

• tel. 22 55 32 181

Zasady zaliczenia

• Wykład (2h/tydzień)

• Egzamin pisemny

• Test wyboru 15 pkt.

• Ćwiczenia (2h/tydzień)

• 3 kolokwia po 15 pkt.

• 3 zadania po 5 pkt.

Łącznie można zdobyć max 60 pkt.

Materiał na ćwiczenia• Algorytmy.

• Podstawy programowania w C++

• Funkcja main(), nagłówek i treść funkcji

• Obsługa wej/wyj

• Wyrażenia i zmienne

• Pętle

• Programowanie prostych obliczeń

• Liczby pseudolosowe

• Formatowanie wydruków i drukowanie wzorów

• Tablice i sortowanie liczb

• Wskaźniki i referencje

• Wej/wyj z wykorzystaniem plików

• Złożone typy danych i ich zastosowanie

Plan wykładu• Kod źródłowy w C++ i kompilator g++

• Algorytmy

• Złożoność obliczeniowa algorytmów

• Składnia języka C++, elementy składowe programów

• Proste typy danych

• Operatory i wyrażenia, konwerscje typów danych

• Pętle, instrukcja warunkowa i instrukcje sterujące w C++

• Wskaźniki i tablice, operacje na wskaźnikach, Referencje

• Dynamiczne rezerwowanie pamięci i zwalnianie pamięci

• Tablice wskaźników i argumenty programu

• Złożone typy danych i ich zastosowania

Dlaczego warto uczyć się programowania komputerów

• Żeby zobaczyć na czym to polega

• Jeżeli mamy nietypowe zadanie, to czasem szybciej jest napisać własny program, niż szukać gotowego

• Czasami musimy być pewni, że program działa w ściśle określony sposób

• Może to być interesujące

• Stanowiska pracy związane z programowaniem bywają dobrze płatne

Na czym polega programowanie?

• Określenie problemu (co chcemy osiągnąć).

• Wybranie algorytmu, czyli metody poszukiwania rozwiązania (jak będziemy to robić).

• Tworzenie kodu źródłowego (ang. source code), stanowiącego reprezentację wybranego algorytmu.

• Kompilowanie kodu źródłowego, czyli tworzenie kodu wykonywalnego (ang. executable code) gotowego do wykonania.

• Sprawdzanie i testowanie (ang. debugging) programu. Jeżeli znajdziemy błąd, wracamy do etapu tworzenia kodu źródłowego (lub nawet do etapu wyboru algorytmu)

Trochę historii

• język C - początek lat siedemdziesiątych, Dennis Ritchie

• język C++ - koniec lat osimdziesiątych, Bjarne Stroustrup

Kod źródłowy i kompilator

#include<iostream>using namespace std;

int main(){

cout << ”Hello World!!!” << endl;return 0;

}

g++ -o nazwa nazwa.cc

Kod źródłowy w pliku nazwa.cc Kompilator

./nazwa

Program

Logowanie na Primusa

primus.okwf.fuw.edu.pl

Kompilator: g++Edytor: nano, pico

Domssh

putty

ssh login@primus.okwf.fuw.edu.plssh login@tempac.fuw.edu.pl

Kod źródłowy

#include<iostream>using namespace std;

int main(){cout << ”Hello World!!!” << endl;return 0;

}

Polecenie preprocesora

Przestrzeń nazw

Funkcja main

Instrukcje

AlgorytmyAlgorytmy Podstawy

Co to jest algorytm

AlgorytmSkoÒczony zbiór dobrze zdefiniowanych instrukcji przeznaczony dowykonania okreúlonego zadania, który przy ustalonym stanie poczπtkowympozwala na uzyskanie odpowiedniego, rozpoznawalnego stanu koÒcowegow skoÒczonym czasie.

W uproszczeniu

Metoda poszukiwania (lub tworzenia) rozwiπzania zadanego problemu.

Nie dla kaødego problemu istnieje skuteczny algorytm pozwalajπcy znaleüÊrozwiπzanie.

Problemy nieobliczalne (algorytm nie istnieje, np. busy beaver).

Problemy, dla których algorytmy sπ zbyt z≥oøone (wykonywanieprogramu trwa≥oby zbyt d≥ugo).

Rafa≥ J. Wysocki (rwys@fuw.edu.pl) WstÍp do programowania, czÍúÊ I 12 paüdziernika 2011 7 / 67

Algorytmy Podstawy

Co to jest algorytm

AlgorytmSkoÒczony zbiór dobrze zdefiniowanych instrukcji przeznaczony dowykonania okreúlonego zadania, który przy ustalonym stanie poczπtkowympozwala na uzyskanie odpowiedniego, rozpoznawalnego stanu koÒcowegow skoÒczonym czasie.

W uproszczeniu

Metoda poszukiwania (lub tworzenia) rozwiπzania zadanego problemu.

Nie dla kaødego problemu istnieje skuteczny algorytm pozwalajπcy znaleüÊrozwiπzanie.

Problemy nieobliczalne (algorytm nie istnieje, np. busy beaver).

Problemy, dla których algorytmy sπ zbyt z≥oøone (wykonywanieprogramu trwa≥oby zbyt d≥ugo).

Rafa≥ J. Wysocki (rwys@fuw.edu.pl) WstÍp do programowania, czÍúÊ I 12 paüdziernika 2011 7 / 67

Algorytmy Podstawy

Co to jest algorytm

AlgorytmSkoÒczony zbiór dobrze zdefiniowanych instrukcji przeznaczony dowykonania okreúlonego zadania, który przy ustalonym stanie poczπtkowympozwala na uzyskanie odpowiedniego, rozpoznawalnego stanu koÒcowegow skoÒczonym czasie.

W uproszczeniu

Metoda poszukiwania (lub tworzenia) rozwiπzania zadanego problemu.

Nie dla kaødego problemu istnieje skuteczny algorytm pozwalajπcy znaleüÊrozwiπzanie.

Problemy nieobliczalne (algorytm nie istnieje, np. busy beaver).

Problemy, dla których algorytmy sπ zbyt z≥oøone (wykonywanieprogramu trwa≥oby zbyt d≥ugo).

Rafa≥ J. Wysocki (rwys@fuw.edu.pl) WstÍp do programowania, czÍúÊ I 12 paüdziernika 2011 7 / 67

AlgorytmyAlgorytmy Podstawy

PoprawnoúÊ algorytmów

Stan poczπtkowy dla algorytmu

Dane wejúciowe (ang. input data).

Stan koÒcowy dla algorytmu

Wynik (ang. result).

Definicja poprawnoúci algorytmu

Algorytm jest poprawny (ang. correct), gdy dla kaødych dopuszczalnychdanych wejúciowych jednoczeúnie spe≥nione sπ dwa nastÍpujπce warunki:1 Wynik jest otrzymywany w skoÒczonej liczbie kroków — problemzatrzymania (stopu).

2 Wynik stanowi rozwiπzanie problemu, dla którego algorytm zosta≥stworzony.

Rafa≥ J. Wysocki (rwys@fuw.edu.pl) WstÍp do programowania, czÍúÊ I 12 paüdziernika 2011 8 / 67

Algorytmy Podstawy

PoprawnoúÊ algorytmów

Stan poczπtkowy dla algorytmu

Dane wejúciowe (ang. input data).

Stan koÒcowy dla algorytmu

Wynik (ang. result).

Definicja poprawnoúci algorytmu

Algorytm jest poprawny (ang. correct), gdy dla kaødych dopuszczalnychdanych wejúciowych jednoczeúnie spe≥nione sπ dwa nastÍpujπce warunki:1 Wynik jest otrzymywany w skoÒczonej liczbie kroków — problemzatrzymania (stopu).

2 Wynik stanowi rozwiπzanie problemu, dla którego algorytm zosta≥stworzony.

Rafa≥ J. Wysocki (rwys@fuw.edu.pl) WstÍp do programowania, czÍúÊ I 12 paüdziernika 2011 8 / 67

Algorytmy Podstawy

PoprawnoúÊ algorytmów

Stan poczπtkowy dla algorytmu

Dane wejúciowe (ang. input data).

Stan koÒcowy dla algorytmu

Wynik (ang. result).

Definicja poprawnoúci algorytmu

Algorytm jest poprawny (ang. correct), gdy dla kaødych dopuszczalnychdanych wejúciowych jednoczeúnie spe≥nione sπ dwa nastÍpujπce warunki:1 Wynik jest otrzymywany w skoÒczonej liczbie kroków — problemzatrzymania (stopu).

2 Wynik stanowi rozwiπzanie problemu, dla którego algorytm zosta≥stworzony.

Rafa≥ J. Wysocki (rwys@fuw.edu.pl) WstÍp do programowania, czÍúÊ I 12 paüdziernika 2011 8 / 67

Algorytmy

• Oblicznie reszty z dzielenia (operacja modulo)

• Algorytm Euklidesa

• Sito Eratostenesa

• Dodawanie liczb w systemie dwójkowym

• Uniwersalny algorytm mnożenia (russian peasant algorithm)

• Przeszukiwanie binarne (ang. binary search) lub bisekcja (ang. bisection)

Przykłady:

AlgorytmyObliczanie reszty z dzielenia niech n i m będą liczbami naturalnymi, n > m

1.Niech k = n

2.Jeśli k < m, to k jest resztą z dzielenia, k = n%m

3.Niech k = k - m

4.Przejdź do kroku 2

AlgorytmyAlgorytm Euklidesa

Niech n i m będą liczbami nauralnymi, n > m. Wyznaczamy największy wspólny dzielnik n i m, czyli NWD(n, m)

ObserwacjaJeśli r jest resztą z dzielenia n przez m, to n = km + r (dla pewnego całkowitego k), więc NWD(n, m) = NWD(m, r)

AlgorytmyAlgorytm Euklidesa

Niech a, b i r będą miejscami do przechowywania wyników

1.Niech a = n i b = m.2.Niech r = a%b (resztę z dzielenia a/b zapisujemy w r).3.Jeśli r = 0, to NWD(n, m) = b.4.Niech a = b i b = r.5.Przejdź do kroku 2.

AlgorytmySito Eratostenesa - chcemy ustalić, które z liczb naturalnych nie

większych od zadanego N są liczbami pierwszymi.

1) Niech k = 2

2) Jeśli k² > N, zbiór A zawiera tylko liczby

pierwsze

3) Usuwamy z A wszystkie wielokrotności k,

począwszy od k²

4) W m zapisz najmniejszą liczbę ze zbioru A

większą od k.

5) Niech k = m.

6) Przejdź do kroku 2).

A = {2,3, …, N}, k i m - miejsca do przechowywania pośrednich wyników

AlgorytmyDodawanie liczb w systemie dwójkowym

a b c

0 0 0

1 0 1

0 1 1

1 1 10

1 1 0 11 1 0 1

1 1 1 0

1 1 0 1

1 1 1 0

1

1 1 0 1

1 1 1 0

1 1

1

1 1 0 1

1 1 1 0

0 1 1

1 1

1 1 0 1

1 1 1 0

1 0 1 1

1 1

0 1 1 0 1

0 1 1 1 0

1 1 0 1 1

1 1

0 1 1 0 1

0 1 1 1 0

1 1 0 1 1

AlgorytmyMamy dwie liczby N-cyfrowe w zapisie dwójkowym:

a =N�1X

j=0

aj2j b =

N�1X

j=0

bj2j

a+ b = w =NX

j=0

wj2j

aj bj

aj , bj 2 {0, 1}wj 2 {0, 1}

gdzie są cyframi. Chcemy wyznaczyć współczynniki (cyfry) w rozwinięciu ich sumy.

dla danych oraz .

AlgorytmyDodawanie liczb w systemie dwójkowym

Algorytmy Przyk≥ady algorytmów

Dodawanie liczb w systemie dwójkowym c. d.

Wprowadzamy funkcje:

PAR(x , y , z) = (x + y + z) % 2

MAJ(x , y , z) = (x + y + z)/2

gdzie x , y , z œ {0, 1}, a znak / oznacza dzielenie z pominiÍciem reszty.

Definiujemy ciπg c0 = 0, cj = MAJ(aj≠1, bj≠1, cj≠1) dla j = 1, 2, . . . ,N.

Wtedy cj jest przeniesieniem (ang. carry) z pozycji (j ≠ 1) na pozycjÍ jpodczas dodawania, wiÍc mamy wN = cN oraz wj = PAR(aj , bj , cj) dlaj = 0, 1, . . . ,N ≠ 1.

Rafa≥ J. Wysocki (rwys@fuw.edu.pl) WstÍp do programowania, czÍúÊ I 12 paüdziernika 2011 14 / 67

Algorytmy Przyk≥ady algorytmów

Dodawanie liczb w systemie dwójkowym c. d.

Wprowadzamy funkcje:

PAR(x , y , z) = (x + y + z) % 2

MAJ(x , y , z) = (x + y + z)/2

gdzie x , y , z œ {0, 1}, a znak / oznacza dzielenie z pominiÍciem reszty.

Definiujemy ciπg c0 = 0, cj = MAJ(aj≠1, bj≠1, cj≠1) dla j = 1, 2, . . . ,N.

Wtedy cj jest przeniesieniem (ang. carry) z pozycji (j ≠ 1) na pozycjÍ jpodczas dodawania, wiÍc mamy wN = cN oraz wj = PAR(aj , bj , cj) dlaj = 0, 1, . . . ,N ≠ 1.

Rafa≥ J. Wysocki (rwys@fuw.edu.pl) WstÍp do programowania, czÍúÊ I 12 paüdziernika 2011 14 / 67

Algorytmy Przyk≥ady algorytmów

Dodawanie liczb w systemie dwójkowym c. d.

Wprowadzamy funkcje:

PAR(x , y , z) = (x + y + z) % 2

MAJ(x , y , z) = (x + y + z)/2

gdzie x , y , z œ {0, 1}, a znak / oznacza dzielenie z pominiÍciem reszty.

Definiujemy ciπg c0 = 0, cj = MAJ(aj≠1, bj≠1, cj≠1) dla j = 1, 2, . . . ,N.

Wtedy cj jest przeniesieniem (ang. carry) z pozycji (j ≠ 1) na pozycjÍ jpodczas dodawania, wiÍc mamy wN = cN oraz wj = PAR(aj , bj , cj) dlaj = 0, 1, . . . ,N ≠ 1.

Rafa≥ J. Wysocki (rwys@fuw.edu.pl) WstÍp do programowania, czÍúÊ I 12 paüdziernika 2011 14 / 67

AlgorytmyAlgorytmy Przyk≥ady algorytmów

Dodawanie liczb w systemie dwójkowym c. d.

Algorytm dodawaniaNiech C bÍdzie miejscem s≥uøπcym do przechowywania poúrednichwartoúci, natomiast k bÍdzie licznikiem.1 Niech C = 0, k = 0.2 Niech wk = PAR(ak , bk ,C ).3 Niech C = MAJ(ak , bk ,C ).4 Niech k = k + 1.5 Jeúli k < N, przejdü do kroku 2.6 Niech wN = C .7 Ciπg cyfr w0,w1,w2, . . . ,wN stanowi wynik.

Rafa≥ J. Wysocki (rwys@fuw.edu.pl) WstÍp do programowania, czÍúÊ I 12 paüdziernika 2011 15 / 67

AlgorytmyAlgorytmy Przyk≥ady algorytmów

Uniwersalny algorytm mnoøenia

Russian peasant algorithm

Obliczamy wynik mnoøenia dwóch nieujemnych liczb ca≥kowitych a i b:1 Niech a0 = a, b0 = b i k = 0.2 Niech k = k + 1.3 Niech ak = ak≠1/2 (dzielenie bez reszty) i bk = 2bk≠1.4 Jeúli ak > 1, to przejdü do kroku 2.5 Wynik mnoøenia jest sumπ wszystkich bk (k = 0, 1, 2, . . .), dlaktórych odpowiadajπce im ak sπ nieparzyste.

Rafa≥ J. Wysocki (rwys@fuw.edu.pl) WstÍp do programowania, czÍúÊ I 12 paüdziernika 2011 16 / 67

Uniwersalny algorytm mnożenia

AlgorytmyUniwersalny algorytm mnożenia

Algorytmy Przyk≥ady algorytmów

Uniwersalny algorytm mnoøenia – przyk≥ad

Obliczamy iloczyn 156◊ 181 Wyznaczamy ciπgi ak i bk :k ak bk

0 156 181 78 362 39 723 19 1444 9 2885 4 5766 2 11527 1 2304

2 156◊ 18 = 2304+ 288+ 144+ 72 = 2808

Rafa≥ J. Wysocki (rwys@fuw.edu.pl) WstÍp do programowania, czÍúÊ I 12 paüdziernika 2011 17 / 67

AlgorytmyUniwersalny algorytm mnożenia

Algorytmy Przyk≥ady algorytmów

Uniwersalny algorytm mnoøenia – przyk≥ad c. d.

Obliczamy iloczyn 156◊ 181 Moøna sumowaÊ na bieøπco:k ak bk sk

0 156 18 01 78 36 02 39 72 723 19 144 2164 9 288 5045 4 576 5046 2 1152 5047 1 2304 2808

2 156◊ 18 = s7 = 2808

Rafa≥ J. Wysocki (rwys@fuw.edu.pl) WstÍp do programowania, czÍúÊ I 12 paüdziernika 2011 18 / 67

AlgorytmyAlgorytmy Przyk≥ady algorytmów

Uniwersalny algorytm mnoøenia z sumowaniem na bieøπco

Obliczamy iloczyn dwóch nieujemnych liczb ca≥kowitych a i bNiech A, B i S bÍdπ miejscami s≥uøπcymi do przechowywania poúrednichwyników.1 Niech A = a, B = b i S = 0.2 Jeúli A% 2 = 1 (wartoúÊ w A jest nieparzysta), to S = S + B.3 Jeúli A = 1, przejdü do kroku 6.4 Niech A = A/2 (dzielenie bez reszty) i B = 2B.5 Przejdü do kroku 2.6 Wynik mnoøenia jest zapisany w S .

Rafa≥ J. Wysocki (rwys@fuw.edu.pl) WstÍp do programowania, czÍúÊ I 12 paüdziernika 2011 19 / 67

Uniwersalny algorytm mnożenia

AlgorytmyPrzeszukiwanie binarne (bisekcja)

Algorytmy Przyk≥ady algorytmów

Przeszukiwanie binarne (bisekcja)

Poszukiwanie elementu r w skoÒczonym i uporzπdkowanym zbiorze B1 Niech B0 = B i k = 0.2 Jeúli wszystkie elementy zbioru Bk sπ jednakowe lub Bk jest zbiorempustym, przejdü do kroku 6.

3 Niech mk oznacza medianÍ zbioru Bk .4 Jeúli r ˛ mk , to niech Bk+1 = {b œ Bk : b ˛ mk}, a w przeciwnymwypadku niech Bk+1 = {b œ Bk : b > mk}.

5 Niech k = k + 1 i przejdü do kroku 2.6 Jeúli r œ Bk , to r œ B.

Rafa≥ J. Wysocki (rwys@fuw.edu.pl) WstÍp do programowania, czÍúÊ I 12 paüdziernika 2011 20 / 67

AlgorytmyAlgorytmy Przyk≥ady algorytmów

Przeszukiwanie binarne (bisekcja) – przyk≥ad

Weümy B = {3, 7, 21, 48, 56, 122, 141, 218, 225, 248} i r = 225k Bk mk

0 {3, 7, 21, 48, 56, 122, 141, 218, 225, 248} 561 {122, 141, 218, 225, 248} 2182 {225, 248} 2253 {225} 225

Rafa≥ J. Wysocki (rwys@fuw.edu.pl) WstÍp do programowania, czÍúÊ I 12 paüdziernika 2011 21 / 67

Przeszukiwanie binarne (bisekcja) - przykład