ZASADY PROGRAMOWANIA STRUKTURALNEGO ( ZAP ) rok...
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
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
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;
}