ZASADY PROGRAMOWANIA STRUKTURALNEGO ( ZAP ) rok...

26
POLITECHNIKA WARSZAWSKA Instytut Automatyki i Robotyki ZASADY PROGRAMOWANIA STRUKTURALNEGO ( ZAP ) rok ak. 2012/2013 prof. nzw. dr hab. inż. Barbara Putz pok. 306 Język programowania: C/C++ Środowisko programowania: Code::Blocks Wykład 1 : Podstawowe pojęcia, najprostsze programy

Transcript of ZASADY PROGRAMOWANIA STRUKTURALNEGO ( ZAP ) rok...

POLITECHNIKA WARSZAWSKA

Instytut Automatyki i Robotyki

ZASADY PROGRAMOWANIA STRUKTURALNEGO

( ZAP )

rok ak. 2012/2013

prof. nzw. dr hab. inż. Barbara Putz pok. 306

Język programowania: C/C++

Środowisko programowania: Code::Blocks

Wykład 1 : Podstawowe pojęcia, najprostsze programy

ZASADY PROGRAMOWANIA STRUKTURALNEGO

TYGODNIOWY WYMIAR ZAJĘĆ

Rok ak. Semestr W L P ECTS

2012/2013 I 1E 2 - 5

2012/2013 II - - 1 3

Regulamin, harmonogram zajęć, prezentacje do wykładu :

na witrynie przedmiotu ZAP w systemie komunikacji ze studentami (SKS) - tam będą

zamieszczane oceny z laboratorium i egzaminu:

http://iair.mchtr.pw.edu.pl/studenci

(wejście przez login i hasło, które każdy student otrzyma w mailu).

Tymczasowo – prezentacje będą pod adresem: http://iair.mchtr.pw.edu.pl/bputz

Informacje organizacyjne 2

Program wykładu

Temat 1: Podstawowe pojęcia i proste programy. Pojęcia algorytmu, programu, kodu

wykonywalnego. Kompilacja i wykonanie programu. Sieci działań. Struktura programu.

Komentarze i dokumentacja programu. Zmienne i ich nazwy, podstawowe typy: całkowite,

rzeczywiste, znakowe i napisowe. Definicje zmiennych. Instrukcje: czytania, pisania,

przypisania. Klasyfikacja typów. Stałe, wyrażenia i funkcje standardowe. Instrukcje:

warunkowa, złożona. Instrukcje cykliczne: pętla for, pętle sterowane warunkiem. Instrukcje

przerywające wykonanie pętli. Instrukcja wielokrotnego wyboru.

Temat 2: Tablice, rekordy i pliki. Tablice: definiowanie tablic, zmienna tablicowa i

indeksowana. Operacje na tablicach. Algorytmy sortowania i przeszukiwania w tablicach,

porównanie złożoności obliczeniowej. Struktury i rekordy, operacje wykonywane na rekordach.

Definiowanie plików, zasady dostępu, operacje wejścia – wyjścia.

Temat 3: Funkcje i rekurencja. Zasady definiowania i wywołania funkcji. Parametry

formalne i aktualne. Wiązanie parametrów przez wartość i referencję. Zasięg nazw, zasłanianie.

Rekurencja jako jedna z podstawowych technik konstruowania algorytmów. Zasada działania

rekurencji i warunek końca. Przykłady algorytmów rekurencyjnych.

3

Program wykładu (c.d.)

Temat 4: Wskaźniki i listy. Zmienne dynamiczne i wskaźniki. Przydział i zwalnianie

pamięci. Dynamiczna rezerwacja tablic. Listy jednokierunkowe: zasada tworzenia, podstawowe

operacje na listach. Listy dwukierunkowe i cykliczne. Iteracyjne i rekurencyjne algorytmy

przetwarzania list.

Temat 5: Struktury drzewiaste. Drzewa binarne i binarne drzewa sortowane (BST).

Podstawowe operacje na drzewach z wykorzystaniem rekurencji. Drzewa wyważone (AVL i

RBT). Kopce, B-drzewa, zastosowania do baz danych. Złożoność obliczeniowa.

Temat 7: Przegląd algorytmów, algorytmy grafowe. Przegląd zasad konstruowania

algorytmów: programowanie typu „dziel i zwyciężaj”, programowanie dynamiczne, algorytmy z

powrotami, metody zachłanne. Grafy i algorytmy grafowe: przeszukiwanie grafu, problem

najkrótszej ścieżki, minimalne drzewa rozpinające grafów.

Temat 6: Przygotowanie do egzaminu. Przykłady zadań egzaminacyjnych z

rozwiązaniami. Przegląd najczęściej popełnianych błędów, wskazówki, jak ich unikać.

4

Literatura uzupełniająca

1. P. Wnuk, B. Putz: Informatyka 2 - Programowanie. Wersja w języku C/C++.

Podręcznik internetowy, OKNO PW, 2004-2010.

http://iair.mchtr.pw.edu.pl/studenci/witryna/login.php

2. B. Putz, A. Putz jr, P. Wnuk : Algorytmy i struktury danych. Podręcznik internetowy,

OKNO PW, 2006-2010.

3. S. Prata: Język C++. Wydanie V, Helion 2006.

4. J. Grębosz: Symfonia C++ standard. Tom I. Edition 2000 Kraków, 2005-2008.

4. B. Eckel: Thinking in C++. Edycja polska. Helion 2002.

6. N. Wirth: Algorytmy+struktury danych=programy. WNT 2004.

7. P. Wróblewski: Algorytmy, struktury danych i techniki programowania. Wyd. IV,

Helion 2010.

8. T.H. Cormen et al.: Wprowadzenie do algorytmów. WNT 2007, PWN 2012 (nowe

wydanie).

Poz. 1, 2 - PODRĘCZNIKI wydane przez OKNO- Ośrodek Kształcenia na Odległość (dostępne online z witryny przedmiotu, napisane dla studiów internetowych PW).

5

PROBLEM ALGORYTM PROGRAM

Algorytmizacja Kodowanie

Programowanie

Założony cel zajęć:

• Nabycie umiejętności algorytmizacji różnorodnych problemów

• Nabycie umiejętności kodowania algorytmów z wykorzystaniem języka

wysokiego poziomu

6

Dane do programu i wyniki z programu 7

Kompilacja i wykonanie programu

• Błędy kompilacji – jeśli kompilator „nie rozumie” programu źródłowego.

• Błędy wykonania programu – jeśli program po kompilacji nie daje się wykonać.

• Błędy logiczne – jeśli program wykonuje się nieprawidłowo.

8

Konsolidacja programu (linkowanie)

9

Prezentacja algorytmu w postaci sieci działań

Algorytmy przedstawiane są z różnym stopniem szczegółowości. Najczęściej

stosuje się: opis słowny lub sieci działań (schematy blokowe).

Symbole graficzne do budowy sieci działań

Przykład:

Warunek

prawdziwy ?

Początek Koniec

5 5

Realizacja operacji Opis realizowanej w algorytmie

czynności

Tak Nie

pisz a, b, c czytaj a, b, c

Oznaczenie początku, końca sieci działań

Łączniki dzielące sieć działań na fragmenty

Rozgałęzienie - przejście do części

algorytmu wynikającej ze spełnienia warunku

Odpowiednio: wczytanie lub wydrukowanie

wartości: a, b, c

10

Przykład sieci działań

Początek

Koniec

k 3

Tak

pisz N, " jest pierwsza"

czytaj N

reszta z dzielenia N przez k = 0 Tak

k k +2

k >

Tak

Nie

Nie

Koniec

pisz N, " nie jest pierwsza "

k – zmienna pomocnicza

Sprawdzić, czy wczytana liczba całkowita N>3 jest pierwsza (dzieli się tylko przez jeden i

siebie). (Przykład z: D. van Tassel: „Praktyka programowania”. WNT Warszawa)

N

reszta z dzielenia N przez 2 = 0

Nie

11

liczby pierwsze: 2, 3, 5, 7, 11,

13, 17, 19, 23, 29, 31, ...

Program w C/C++

STRUKTURA PROGRAMU

# include <iostream> dołączanie plików nagłówkowych bibliotek

.....

using namespace std; udostępnienie nazw ze standardowych bibliotek

int main ( )

{

definicje, deklaracje funkcja main (główna) - musi być w programie

i instrukcje

return 0;

}

..... inne funkcje - niekonieczne

12

Przykłady programów

int main ( )

{

return 0;

}

# include <iostream>

using namespace std; komentarze

int main ( )

{

double x, y; // definicje zmiennych x i y

cin >> x >> y; // wczytywanie zmiennych x i y

if (x>y) // jeśli x>y

cout << x << endl; // wydrukuj x

else // w przeciwnym razie

cout << y << endl; // wydrukuj y

return 0;

}

1) Najprostszy program: 2) Wydrukować większą wartość spośród dwóch wczytanych:

#include <iostream>

using namespace std;

int main ( ) {

const double pi=3.14159; // definicja stałej pi

double r, obwod, pole; // definicje zmiennych

cout << "Podaj promien kola" << endl; // drukowanie napisu zapraszającego do pisania

cin >> r; // wczytywanie wartości r podanej przez użytkownika

obwod = 2*pi*r; // obliczenie wartości zmiennej obwod

pole = pi*r*r; // obliczenie wartości zmiennej pole

cout << "Obwod = " << obwod << " Pole = " << pole << endl; // drukowanie wyników

return 0;

}

3) Wczytać promień koła, a następnie obliczyć i wydrukować jego obwód i pole:

int main ( ) {

return 0;

}

To samo w innej konwencji

zapisu nawiasów klamrowych:

13

Środowisko programowania

Na zajęciach laboratoryjnych obowiązuje:

środowisko programowania Code::Blocks (w skrócie C::B) -

wieloplatformowe, bezpłatne, typu open source

- do ściągnięcia ze strony:

http://www.codeblocks.org/downloads/26 Należy pobrać wersję binarną z kompilatorem, np. dla Windows:

codeblocks-10.05mingw-setup.exe (74 MB)

Jeśli chwilowo wersji dla Widows nie można pobrać ze wskazanego źródła

(BerliOS) z powodu „Too many clients” , to można pobrać ją stąd:

http://apt.jenslody.de/downloads/cb-release-10.05

14

Tworzymy tylko aplikacje konsolowe:

Create a new project > Console application

select C++ language, GNU GCC compiler

Szkielety aplikacji konsolowych w Code::Blocks

Szkielet nowego programu – po wykonaniu

Create a new project >Console application > C++

Tu dołączamy ew. inne biblioteki

A tu wpisujemy własne definicje i instrukcje

15

Okno wynikowe - po wykonaniu Build and run

Wynik działania programu

Tę linię możemy usunąć

Zmienne, ich typy, deklaracje i definicje

• Zmienną nazywa się daną mogącą przyjmować różne wartości.

• Każda zmienna występująca w programie ma swoją nazwę i przyjmuje wartości z określonego zbioru ( zdefiniowanego przez typ zmiennej )

Definicja zmiennej

Informuje o typie zmiennej i przydziela na nią pamięć. Definicja jest zarazem deklaracją, ale nie na odwrót (deklaracja polega tylko na określeniu typu zmiennej). UWAGA: Dalej będziemy używać wyłącznie definicji będących zarazem deklaracjami.

Wszystkie zmienne występujące w programie muszą być zdefiniowane przed ich pierwszym użyciem.

Najprostsze typy zmiennych:

• całkowite (int) 10 -243 +78

• rzeczywiste (double) 1.5 3.14 -2450.138 (kropka zamiast przecinka)

• znakowe (char) 'a' 'A' '?'

• napisowe (string) "Wcisnij jakis klawisz" "Napisz swoje imie"

Nazwa zmiennej

Dowolny ciąg liter i cyfr zaczynający się od litery. Znak podkreślenia też jest literą. Małe i duże litery są rozróżniane.

16

Definiowanie zmiennych

Definicje zmiennych

• Najpierw podaje się typ, a potem wymienia nazwy wszystkich zmiennych tego typu.

• Zmienne tego samego typu można zgrupować w listę, oddzielając je przecinkami.

Definicja zmiennych typ zmienna1, zmienna2, ....;

Zmienne mogą być definiowane w dowolnym miejscu, jak tylko zajdzie potrzeba ich wykorzystania.

Definicja zmiennej może być nawet wpleciona w instrukcje, np. połączona z instrukcją przypisania wartości początkowej (to jest zalecane - przykłady dalej).

Przykład definicji zmiennych prostych :

int i,j,k;

double x1,x2,y1,y2 ;

char znak_wczytany, znakWczytany;

string nazwa_pliku, nazwaPliku, fileName;

17

zalecany styl

nazwy zmiennych zaczynać z małej litery

styl1 styl2 Przykładowy zalecany styl programowania:

http://geosoft.no/development/cppstyle.html

Wyrażenia

Wyrażenia - zapis tworzony z wykorzystaniem stałych, zmiennych, funkcji i

łączących je operatorów i nawiasów ( okrągłych )

OPERATORY ARYTMETYCZNE

+ - * / %

dodawanie odejmowanie mnożenie dzielenie reszta z dzielenia (modulo)

OPERATORY RELACJI

> >= (większy równy) < <= == (równy) != (nierówny)

OPERATORY LOGICZNE

|| (suma logiczna) && (iloczyn logiczny) ! (negacja)

UWAGI:

1. Dzielenie dwóch liczb całkowitych daje wynik całkowity (!!) powstały przez

obcięcie części ułamkowej wyniku dzielenia:

8/3 = 2 8.0 /3 = 2.6667

-8/3 = -2 -8.0/3 = -2.6667

2.Resztę z dzielenia można wyznaczyć tylko dla argumentów całkowitych:

5%2 = 1 (reszta z dzielenia 5 przez 2=1) 6%3 = 0

18

Wyrażenia - priorytet operatorów

PRIORYTET OPERATORÓW - wewnątrz jednej pary nawiasów okrągłych

1. ! (negacja)

2. * / %

3. + -

4. operatory relacji nierównościowych: > >= < <=

5. operatory relacji: równy == nierówny !=

5. && (iloczyn logiczny)

6. || (suma logiczna)

W przypadku operatorów o równych priorytetach obowiązuje kolejność od lewej do prawej, np.:

-b / 2*a jest równe

Ale:

-b / (2*a)

-b / 2 / a

ab

2

a

b

2

UWAGA: W sytuacjach wątpliwych najpewniejszym sposobem

jest używanie nawiasów okrągłych.

19

Instrukcje

INSTRUKCJE - polecenia dla komputera - „zmuszają” go do

przetwarzania danych podczas procesu obliczeniowego.

UWAGA: w C++ każda instrukcja kończy się średnikiem.

• instrukcja pisania

• instrukcja czytania

• instrukcja przypisania

• instrukcja złożona

• instrukcja warunkowa

Na początek:

20

Instrukcja pisania (drukowania)

Instrukcja drukowania wyników

Służy do wyprowadzania wyników (wartości wyrażeń) na standardowe

urządzenia wyjściowe komputera (domyślnie – na konsolę, czyli monitor ).

Wymaga dołączenia pliku nagłówkowego biblioteki iostream.

#include <iostream> ....... cout << wyrażenie1 << wyrażenie2 ...;

Np.: cout <<34 <<x << y+5;

cout << endl;

cout << " Wynik = " << x+2*y <<endl;

Funkcja endl oznacza przejście do nowej linii i jest równoważna wstawieniu \n do napisu: cout << " napisz swoje imie " << endl; cout << " napisz swoje imie \n" ;

W rzeczywistości cout jest obiektem tzw. klas strumieni wejścia-wyjścia, zaś << operatorem, ale dla uproszczenia będziemy mówili o instrukcji drukowania.

21

Instrukcja czytania

Instrukcja czytania danych

Służy do wprowadzania danych (nadawania wartości zmiennym) ze

standardowego urządzenia wejściowego komputera (domyślnie – z konsoli, czyli

klawiatury ).

#include <iostream>

// .....

cin >> zmienna1 >>zmienna2 ...;

// UWAGA:

// Tu muszą być pojedyncze zmienne, a nie całe wyrażenia !

Np.:

cin >> x; cin >> y; równoważne

cin >> x >> y;

cin >> znak;

Zmienne, pod które wczytujemy dane, mogą być tylko typu całkowitego,

rzeczywistego, znakowego, napisowego lub logicznego (dopiero go poznamy).

22

Instrukcja przypisania

INSTRUKCJA PRZYPISANIA ( podstawienia )

Służy do nadawania zmiennej nowej wartości:

ZMIENNA = WYRAŻENIE ; // ta zmienna powinna być wcześniej zdefiniowana

lub:

typ ZMIENNA = WYRAŻENIE ; // a tu definiujemy zmienną i nadajemy wartość początkową

Przykłady instrukcji przypisania:

k = 3;

x = k-4.5;

k = k+1; // zwiększ wartość k o 1

double y = 2.5*(x+3)/2;

z = ‘a’;

imie = "Witold ";

23

Instrukcja złożona

INSTRUKCJA ZŁOŻONA ( inaczej: blokowa, grupująca)

Tworzy z ciągu instrukcji jedną. Można używać jej wszędzie tam,

gdzie wolno zastosować tylko jedną instrukcję.

{ ciąg instrukcji

}

• ciąg instrukcji - instrukcje zakończone średnikami, wykonywane

w kolejności zapisania.

Przykład instrukcji złożonej:

{

suma=suma+x;

ile=ile+1;

}

UWAGA: Instrukcja złożona kończy się klamrą, dodatkowy średnik za klamrą nie jest konieczny (ale nie jest błędem).

24

Instrukcja warunkowa if

Instrukcja warunkowa

Uzależnia wykonanie instrukcji w programie od spełnienia lub

niespełnienia warunku.

Uwaga: tu musi być jedna (!) instrukcja; w

szczególności może to być instrukcja złożona:

if (warunek)

instrukcja

Przykład:

if (a>0) {

s = s+a;

k = k+1;

}

25

Przykład:

if (liczba>0)

suma = suma+liczba;

if (warunek) {

ciąg instrukcji

} zalecany styl

zalecany styl

Instrukcja warunkowa if-else

Uwaga: Każda z powyższych instrukcji musi być

jedną (!) instrukcją; w szczególności może to

być instrukcja złożona:

if (warunek)

instrukcja1

else

instrukcja2

26

zalecany styl

if (warunek) {

ciag_instrukcji_1

}

else {

ciag_instrukcji_2

} zalecany styl

Przykład:

if (liczba>0)

s_dod = s_dod+liczba;

else

s_niedod = s_niedod+liczba;

Przykład:

if (a>0) {

sd = sd+a;

kd = kd+1;

}

else {

snd = snd+a;

knd = knd+1;

}