Upload
doduong
View
225
Download
0
Embed Size (px)
Citation preview
POLITECHNIKA WARSZAWSKA
Instytut Automatyki i Robotyki
ZASADY PROGRAMOWANIA STRUKTURALNEGO
( ZAP - zima 2015 )
prof. nzw. dr hab. inż. Barbara Putz pok. 306
Język programowania: C/C++
Środowisko programowania: Qt Creator 5.0.2
Wykład 1 : Podstawowe pojęcia, proste programy,
instrukcje warunkowe
ZASADY PROGRAMOWANIA STRUKTURALNEGO
TYGODNIOWY WYMIAR ZAJĘĆ
Rok ak. Semestr W L P ECTS
2015/2016 I 1E 2 - 5
2015/2016 II - - 1 3
Program, regulamin i harmonogram zajęć, literatura, prezentacje do
wykładu:
na witrynie przedmiotu ZAP w systemie komunikacji ze studentami (SKS) -
tam też będą zamieszczane oceny z zajęć laboratoryjnych i egzaminu:
https://iair.mchtr.pw.edu.pl/studenci
(wejście przez login i hasło, które każdy student otrzyma w mailu).
Tymczasowo – niniejsza prezentacja jest pod adresem:
https://iair.mchtr.pw.edu.pl/bputz/2015_ZAP
Informacje organizacyjne 2
Zespół prowadzący zajęcia
nr pokoju
• dr inż. Anna Sztyber 339
• dr inż. Marcin Stachura 341
• mgr inż. Łukasz Chechliński 30
• mgr inż. Bartłomiej Fajdek 341
• mgr inż. Jan Klimaszewski 307
• mgr inż. Maciej Przybylski 307
• mgr inż. Kornel Rostek 339
Bliższe dane (godziny konsultacji, e-mail) – na
stronie Instytutu Automatyki i Robotyki:
https://iair.mchtr.pw.edu.pl
3
Efekty kształcenia
1. WIEDZA: uporządkowana wiedza ogólna obejmująca:
• kluczowe zagadnienia z zakresu konstrukcji języka strukturalnego i
programowania strukturalnego w języku C/C++
• zagadnienia konstruowania algorytmów dla prostych zadań przetwarzania danych
• klasyfikację algorytmów i dobór struktur danych
2. UMIEJĘTNOŚCI:
• praktyczna umiejętność opracowania algorytmu i wynikającego stąd programu
strukturalnego w języku C/C++ (z wykorzystaniem struktur dynamicznych
włącznie) dla prostego zadania programistycznego
• praktyczną umiejętność napisania i uruchomienia w trakcie 45 min. zajęć
programu w środowisku C/C++ na podstawie otrzymanego zadania
• umiejętność posługiwania się kompilatorem i debuggerem
3. KOMPETENCJE SPOŁECZNE:
• nawyk ustawicznego kształcenia się i wyszukiwania nowych informacji, aby radzić
sobie z rozwiązywaniem nowych, nietypowych zadań.
4
Szczegółowy program wykładów, bibliografia – za tydzień
Weryfikacja efektów kształcenia
1. ZALICZENIE ĆWICZEŃ LABORATORYJNYCH:
• 2 sprawdziany złożone z części teoretycznej (2 zadania do opracowania w rękopisie) i
praktycznej (1 zadanie do uruchomienia w postaci programu na komputerze) – każda
część do napisania na jednej godzinie zajęć, oceniana w skali 0-6 pkt, max. 2 pkt
dodatkowe za aktywność na zajęciach.
• sprawdzian nr 1: 23-26 listopada, sprawdzian nr 2: 19-25 stycznia
• sprawdzian poprawkowy: 26stycznia – 1 lutego (tylko dla 1 części teor. i 1 prakt.)
• warunek zaliczenia ćwiczeń i dopuszczenia do egzaminu: min. 6 pkt z każdego
sprawdzianu (na 12 możliwych).
2. EGZAMIN:
• część zadaniowa (18 pkt ) - opracowanie w rękopisie kilku zadań wymagających napisania
funkcji lub całych programów, czas trwania: 60 minut
• część testowa (8 pkt) – 8 pytań jednokrotnego wyboru z zakresu algorytmów i struktur
danych, czas trwania: 5 minut
• warunek zdania egzaminu: uzyskanie min. 13 pkt łącznie z obu części egzaminu.
• możliwość zwolnienia z pisemnej części egzaminu: min. 11 pkt z każdego sprawdzianu,
min. 23 pkt łącznie.
SZCZEGÓŁY: REGULAMIN ZAJĘĆ – w SKS, tymczasem:
https://iair.mchtr.pw.edu.pl/bputz/2015_ZAP
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.
7
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
8
Program w C/C++
STRUKTURA PROGRAMU
# include <iostream> dołączanie plików nagłówkowych bibliotek
.....
using namespace std; // udostępnienie nazw ze standardowych bibliotek
// po znakach // wpisujemy komentarze ignorowane przez kompilator
int main ( )
{
definicje, deklaracje funkcja main (główna) - musi być w programie
i instrukcje
return 0;
}
..... inne funkcje - niekoniecznie
SYMBOLE SPECJALNE:
• jednoznakowe: + - * / = < > ( ) [ ] { } . , ; : ' ^ ” % ~
• dwuznakowe (dwa znaki traktowane jako całość): != <= >= == ++ -- || && itd.
SŁOWA KLUCZOWE:
ciąg znaków o ściśle określonym znaczeniu; np. (tych będziemy używać):
bool break case char const continue do else extern false float for goto if int
namespace new not or return short sizeof struct switch true using void while
9
Przykłady programów
int main ( )
{
return 0;
}
# include <iostream> // dołączamy bibliotekę wejścia-wyjścia
using namespace std; // standardowy początek programu
int main ( )
{
double x, y; // definicje zmiennych rzeczywistych x i y
cin >> x >> y; // wczytywanie zmiennych x i y
if (x > y) // jeśli x>y
cout << x; // wydrukuj x
else // w przeciwnym razie
cout << y; // wydrukuj y
return 0;
}
1) Najprostszy program: 2) Wczytać dwie wartości i wydrukować większą z nich:
#include <iostream>
using namespace std;
int main ( ) {
int nrGrupy; string imie; // definicje zmiennych: całkowitej (int) i napisowej (string)
cout << "Podaj imie: \n"; // drukowanie tekstu zapraszającego do pisania i przejście do nowej linii (\n)
cin >> imie; // wczytywanie tekstu napisanego przez użytkownika
cout << "Podaj numer grupy: " ; // drukowanie tekstu zapraszającego do pisania
cin >> nrGrupy; // wczytywanie liczby napisanej przez użytkownika
cout << "Witaj " << imie << " w grupie " << nrGrupy << "!" << endl; // drukowanie powitania
return 0; // i przejście do nowej linii (endl)
}
3) Wczytać imię i numer grupy, a następnie wydrukować powitanie:
int main ( ) {
return 0;
}
To samo w innej konwencji
zapisu nawiasów klamrowych:
10
Środowisko programowania
Na zajęciach laboratoryjnych obowiązuje:
środowisko programowania Qt Creator z biblioteki Qt w wersji
5.0.2 (z roku 2013) – biblioteka wieloplatformowa, bezpłatna, typu
open source, z kompilatorem MinGW4.7, qt-windows-opensource-
5.0.2-mingw47_32-x86-offline.exe , do pobrania ze strony:
http://download.qt.io/archive/qt/5.0/5.0.2/ Zmiana wersji językowej: Narzędzia>Opcje>Środowisko>Język
Można też używać wersji najnowszej 5.5.0, do pobrania stąd:
http://www.qt.io/download-open-source/
Tworzymy tylko aplikacje konsolowe:
Sesje i projekty > Utwórz projekt > Projekt nieużywający Qt > Zwykły projekt C++
Tymczasowo – wprowadzenie do obsługi Qt Creator jest pod adresem:
https://iair.mchtr.pw.edu.pl/bputz/2015ZAP
11
Szkielety aplikacji konsolowych w Qt Creator
Szkielet nowego programu – po wykonaniu
Utwórz projekt > Projekt nieużywający Qt > Zwykły projekt C++
Tu dołączamy ew. inne biblioteki
A zamiast niej wpisujemy tutaj własne definicje i instrukcje
Okno wynikowe - po wykonaniu Uruchom : Ctrl-R albo
Wynik działania programu
(Naci – w polskiej wersji językowej „skrót” od:
Naciśnij Enter, aby zamknąć to okno)
Tę całą linię możemy usunąć
12
Zmienne, ich typy i nazwy
• Zmienną nazywa się daną mogącą przyjmować różne wartości.
• Każda zmienna występująca w programie ma swoją nazwę i musi mieć określony typ
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
• 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 (tylko litery alfabetu łacińskiego). Znak podkreślenia jest traktowany jak litera. Małe i duże litery są rozróżniane. Nazwy zmiennych muszą się różnić od słów kluczowych.
• Nazwy poprawne: a A4 a4 _A4 liczbaPunktow przyklad_1 NowyTyp
• Nazwy błędne: 5gr przykład_1 przyklad-1 a+b a[4]
13
Definiowanie zmiennych
Definicja zmiennej Informuje o typie zmiennej i przydziela na nią pamięć. Najpierw podaje się typ, a potem wymienia nazwy wszystkich zmiennych tego typu.
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;
14
zalecany styl
nazwy zmiennych zaczynać z małej litery
styl1 styl2 Przykładowy zalecany styl programowania:
http://geosoft.no/development/cppstyle.html
Wyrażenia arytmetyczne
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) lub plus lub minus jednoargumentowy jednoargumentowy
Resztę z dzielenia można wyznaczyć tylko dla argumentów całkowitych:
5%2 czyli 1 (reszta z dzielenia 5 przez 2=1) 6%3 czyli 0
15
PRIORYTET OPERATORÓW - wewnątrz jednej pary nawiasów okrągłych
1. jednoargumentowy + oraz - (symbol liczby dodatniej oraz ujemnej)
2. * / %
3. + - (dodawanie i odejmowanie)
Przykłady:
-b / 2*a oznacza -b / (2*a)
-b / 2 / a oznaczają
Wyrażenie z dwoma jednoargumentowymi minusami -5+3*-8 daje wynik -29,
bo kolejność obliczeń odpowiada wyrażeniu (-5) + (3* (-8))
a
b
2
ab
2
UWAGA: W sytuacjach wątpliwych
najpewniejszym sposobem jest
używanie nawiasów okrągłych.
Konwersja typów
Dzielenie można wykonać dla różnych typów argumentów. W razie
potrzeby kompilator dokonuje niejawnej konwersji typów, np.
zamienia liczbę rzeczywistą na całkowitą, obcinając ją.
UWAGA: 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
Operatory rzutowania postaci:
typ (nazwa zmiennej)
lub: (typ) nazwa zmiennej
służą do jawnej konwersji typów, np. double(x) zamienia dowolny typ
zmiennej x na typ double. To samo wykona się dla (double)x .
Dzięki temu np. możemy policzyć dokładnie iloraz x/y w przypadku,
gdy x i y są typu int, pisząc: double(x)/y albo (double)x/y
Można napisać też po prostu: x*1.0/y
Ale uwaga: nie wolno napisać tak: double(x/y), to niczego nie
zmienia!
16
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:
17
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 (mamy to gotowe w szkielecie Qt):
#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.
18
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;
19
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ą
Typ zmiennej i wyrażenia nie muszą się zgadzać. Np. w przypadku
podstawienia wartości rzeczywistej pod zmienną całkowitą następuje obcięcie
części ułamkowej - jest to niejawna konwersja typów (niezalecane!)
int k = -10.6; // k będzie równe -10
int k = int (-10.6); // k będzie równe -10
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 ";
20
zalecany styl
jawna konwersja typów
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).
21
Instrukcje warunkowe - wprowadzenie
Instrukcja if Instrukcja if-else
if (a<0)
cout <<“ujemna” ;
if (a<0)
cout <<“ujemna” ;
else
cout <<“nieujemna” ;
if (serce)
na_niebiesko ;
if (serce)
na_niebiesko ;
else
na_czerwono ;
22
Instrukcja warunkowa if
Instrukcja warunkowa uzależnia wykonanie instrukcji w programie od
spełnienia lub niespełnienia warunku. Najprostsze warunki zawierają
wyrażenia arytmetyczne, operatory relacji i nawiasy okrągłe.
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;
}
23
Przykład:
if (liczba>0)
suma = suma+liczba;
if (warunek) {
ciąg instrukcji
} zalecany styl
zalecany styl
OPERATORY RELACJI
> >= (większy równy) < <= == (równy) != (nierówny)
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
24
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;
}
Instrukcje warunkowe zagnieżdżone (1)
if (...)...
else if (...)...
if (serce)
na_niebiesko ;
else
if (trojkat)
na_czerwono ;
if (a<0)
cout <<“ujemna” ;
else
if (a>0)
cout <<“dodatnia” ;
25
Instrukcje warunkowe zagnieżdżone (2)
if (a<0)
cout <<“ujemna” ;
else
if (a>0)
cout <<“dodatnia” ;
else
cout <<“zero”;
if (a<0)
cout <<“ujemna” ;
if (a>0)
cout <<“dodatnia” ;
else
cout <<“zero”;
Błąd logiczny !!!
26
Instrukcje warunkowe zagnieżdżone (3)
Przykłady konstrukcji instrukcji warunkowych zagnieżdżonych:
if (w1) if (w1)
i1 if (w2)
else i1
if (w2) else
i2 i2;
else
i3;
UWAGA: Również w sytuacjach wątpliwych najpewniejszym
sposobem jest tworzenie instrukcji złożonych za pomocą klamer.
Obowiązuje zasada:
W sytuacjach wymagających zmiany tej zasady konieczne jest ujęcie
instrukcji if w klamry {.....} :
if (w1)
{ if (w2)
i1 }
else
i2;
else przyporządkowane jest najbliższemu wstecz if
27