Podstawy
programowania
Ćwiczenie laboratoryjne:
Środowiska projektowe IDE, organizacja projektu
autor: dr inż. Michał Łabowski
▪ michal.labowski@wat.edu.pl
▪ www.mlabowski.wel.wat.edu.pl
IDE – czym jest, popularne rozwiązania
2
IDE – ang. Integrated Development Environment (pol. Zintegrowane Środowisko Programistyczne): zestaw narzędzi służących do tworzenia i utrzymania oprogramowania. Najczęściej zawiera edytor tekstu, kompilator/interpreter, linker i debugger.
Popularne środowiska IDE:
- Microsoft Visual Studio - Eclipse
- Embarcadero Rad Studio - Code::Blocks
Wybrane zalety:
- ułatwienie pisania kodu: kolorowanie składni - podpowiedzi (uzupełnianie składni)
- formatowanie kodu Alternatywa wobec IDE:
wykorzystanie dowolnego edytora tekstu (Windows – notatnik, Linuks – gedit, vi,
vim itp.), następnie uruchomienie kompilacji w oknie terminala, np. w Linux
poleceniem g++ main.cpp wykonamy kompilację kodu zawartego w pliku main.cpp,
zaś wynik możemy uruchomić wpisując komendę ./a.out
Zadanie 1: Hello World
Przykład. Napisz program wypisujący na ekranie komunikat „Hello world!”.
Zadanie 1: Hello World
4
Przykład. Napisz program wypisujący na ekranie komunikat „Hello world!”.
Nr linii Opis
1 Dyrektywa preprocesora (zawsze zaczynają się znakiem „#”), mówiąca:
„dołącz w tym miejscu kod zawarty w bibliotece iostream, tzw. plik nagłówkowy z deklaracjami funkcji bibliotecznych”. Preprocesor wykonuje tę operację przed kompilacją kodu [1]. Nawiasy <…>
oznaczają, że plik będzie wyszukiwany w katalogach o ścieżkach zdefiniowanych w kompilatorze lub w opcjach projektu. Gdy dołączamy stworzony przez nas plik nagłówkowy wykorzystujemy znak cudzysłowu
”…” – wtedy przeszukiwany będzie w pierwszej kolejności folder z
naszym projektem, później standardowe ścieżki.
Zadanie 1: Hello World
Nr linii Opis
3 Dyrektywa using mówiąca: „użyj przestrzeni nazw standard”. Przestrzeń ta dotyczy obiektów zawartych w pliku nagłówkowym iostream. Od tej pory można do nich odnosić się bez przedrostka z nazwą przestrzeni, tzn. gdyby pominąć dyrektywę using… linia 7 wyglądałaby następująco:
std::cout << „Hello world! << std::endl.
Przykład. Napisz program wypisujący na ekranie komunikat „Hello world!”.
Zadanie 1: Hello World
6
Przykład. Napisz program wypisujący na ekranie komunikat „Hello world!”..
Nr linii Opis
5 Nagłówek funkcji main. Funkcja ta musi pojawić się w każdym programie. Składnia: typ_zwracany nazwa_funkcji (lista_argumentów).
Typ_zwracany to nazwa typu argumentu zwracanego przez funkcję za pomocę słowa kluczowego return. Nazwa_funkcji - nazwy obiektów w C++ nie mogą zawierać znaków specjalnych (np. polskich znaków, spacji), nie mogą zaczynać się od cyfry. Lista_argumentów – w tym przypadku funkcja nie przyjmuje żadnych argumentów.
Typ zwracany
Nazwa funkcji
Lista argumentów
Nagłówek funkcji
Zadanie 1: Hello World Przykład. Napisz program wypisujący na ekranie komunikat „Hello world!”.
Nr linii Opis
6-9 Ciało funkcji, czyli zestaw instrukcji wykonywanych w momencie wywołania funkcji (linie 7, 8), ograniczony klamrami.
7 Obiekt cout z biblioteki iostream, służący m.in. do wyświetlenia strumienia wyjściowego z programu (tutaj jest nim ciąg znaków Hello wordl!) na ekranie. Znaki << to operator wstawienia danych do strumienia (łatwo je zapamiętać, ponieważ pokazują kierunek przepływu danych). Endl to manipulator z biblioteki iostream, który powoduje
Nagłówek funkcji Ciało funkcji
Definicja
funkcji
Zadanie 1: Hello World
8
Przykład. Napisz program wypisujący na ekranie komunikat „Hello world!”.
Nr linii Opis
8 Dyrektywa return powoduje zakończenie wykonywania funkcji (tzn., że jest ostatnia instrukcją wykonaną w funkcji), przekazuje argument zwracany (tutaj zero) na zewnątrz (czyli do obiektu wywołującego funkcję i czekającego na rezultat jej działania)
Nagłówek funkcji Ciało funkcji
Definicja
funkcji
Zadanie 2: Imię i nazwisko Przykład. Napisz program, który wyświetli na ekranie Twoje imię i nazwisko. Imię i nazwisko powinny znajdować się w osobnych wierszach. Spróbuj osiągnąć to wywołując jednokrotnie obiekt cout.
Polskie znaki mogą nie być wyświetlane poprawnie
Komentarze
10
Komentarz – linia lub linie tekstu w kodzie programu, które nie są tłumaczone na kod wynikowy (są pomijane przez kompilator).
Używanie komentarzy do opisu kodu jest dobrą praktyką programistyczną.
Komentarze są niezbędne w skomplikowanych programach. Ułatwiają zrozumienie
kodu innego programisty lub własnego (kiedy wracamy do niego po pewnym
czasie). Z drugiej strony dobry kod powinien być samokomentujący, tzn. nazwy
obiektów powinny być dobrane tak, aby jednoznacznie wskazywały na to, co dzieje
się w programie.
Zmienne Zmienna – obiekt służący do przechowywania informacji, która może ulec zmianie w trakcie wykonywania programu.
Definicja zmiennej: typ_zmiennej nazwa_zmiennej;
„Zarezerwuj w pamięci obszar na obiekt typu typ_zmiennej i przypisz mu etykietę nazwa_zmiennej” [1, 2]
0x472000 0x472006 0x472008
Obszar zmiennej pewnego typu
Obszar zmiennej innego typu
Obszar zmiennej kolejnego typu
Rozmiar pamięci zajmowanej przez zmienną zależy więc od jej typu, dlatego przed
użyciem zmiennej musimy poinformować kompilator (za pomocą definicji) czym
ona jest i jaki obszar pamięci zajmuje (adres początku + liczba bajtów).
Nazwy zmiennych
12
Nazwy zmiennych:
• Mogą zaczynać się tylko od litery lub znaku _
• Po pierwszym znaku mogą zawierać cyfry
• Duże i małe litery są rozróżnialne, zatem cena i Cena to dwie różne zmienne
• Nazwa zmiennej nie może pokrywać się ze słowami kluczowymi C++
Zadanie 3. Wskaż niepoprawne nazwy zmiennych:
a) marchewki b) _rezystory
c) __kondensatory
d) _obwody drukowane e) _płytkiPCB
f) int
Popularne sposoby zapisu nazw składających się z kilku wyrazów:
int metodaPomiaru lub int metoda_pomiaru
Typy zmiennych Typy wbudowane – zawarte w standardzie C++ [1]:
• Przeznaczone do pracy z liczbami całkowitymi:
short int int
long int
Każdy z nich może być typem ze znakiem (np. signed int) lub bez znaku (np.
unsigned int), domyślnie typ jest „ze znakiem” (typ int oznacza signed int)
• Przeznaczone do przechowywania znaków alfanumerycznych:
char
• Przeznaczone do pracy z liczbami zmiennoprzecinkowymi:
float double
long double
• Przeznaczone do pracy ze stanami logicznymi:
bool
W zależności od typu zmiennej można przechować w niej liczby z różnych zakresów, tzn. pracując z małymi liczbami całkowitymi możemy wybrać typ
short int lub char, lecz pracując z liczbami wielkimi wybierzemy long int.
Typy zmiennych
14
Typy o precyzyjnie określonej szerokości [1]:
• Ze znakiem:
int8_t int16_t int32_t int64_t
• Bez znaku:
uint8_t uint16_t uint32_t uint64_t Zastosowanie:
Przechowywanie danych pomiarowych o określonej długości.
Przykład. Załóżmy, że czujnik temperatury umieszczony w kanale chłodzącym
reaktora atomowego przesyła wyniki pomiarów w postaci liczby 32-bitowej oraz, że
wynik pomiaru jest zawsze liczbą dodatnią. Który typ o precyzyjnie określonej
szerokości wykorzystasz do przechowania wyniku ostatniego pomiaru?
Przypisanie wartości do zmiennej Instrukcja przypisania:
Inicjalizacja (przypisanie wartości w momencie narodzin zmiennej) [1]:
Inicjalizacja w C++ 11 (jeśli Twój kompilator ich nie rozpoznaje to w opcjach
kompilatora dodaj –std=c++11):
Zadanie 5
16
Przykład. W prostym programie zadeklaruj zmienne typów bool, char, int, float
oraz double, przypisz im wybrane przez Ciebie wartości początkowe i wypisz je na
ekranie.
cout Wyświetlenie tekstu za pomocą obiektu cout:
Znak specjalny Opis
\n Nowa linia
\t Tabulacja pozioma (do wyrównywania tekstów o różnej długości)
\r Powrót kursora na początek wiersza
\b Cofnięcie kursora o jeden znak
\a Generowanie sygnału dźwiękowego
setw
18
setw() - modyfikacja szerokości pola wykorzystywanego do wyświetlenia wartości:
Szerokość pola: 5 znaków
Szerokość pola: 10 znaków
Nr linii Opis
2 Dołączenie pliku nagłówkowego iomanip zawierającego deklarację metody setw()
8-9 Wykorzystanie metody setw() do modyfikacja szerokości pola, na którym
wyświetlana jest wartość zmiennej my_pi. Modyfikacja szerokości pola
obowiązuje jedynie dla kolejnej wyświetlanej wartości.
setprecision setprecision() - modyfikacja dokładności (liczby cyfr) w wyświetlanej liczbie:
Nr linii Opis
2 Dołączenie pliku nagłówkowego iomanip zawierającego deklarację metody setprecision()
7 Wyświetlane jest pięć cyfr
8 Wyświetlane są wszystkie cyfry w liczbie, jest ich mniej niż 9
5 cyfr
5 cyfr po
przecinku
dec, hex, oct
20
dec, hex, oct - modyfikacja systemu, w którym wyświetlana jest liczba:
Nr linii Opis
6 Modyfikator dec powoduje wyświetlenie liczby w zapisie dziesiętnym 7 Modyfikator hex powoduje wyświetlenie liczby w zapisie szesnastkowym 8 Modyfikator oct powoduje wyświetlenie liczby w zapisie ósemkowym
cin
Obiekt cin z biblioteki iostream (i z przestrzeni nazw standard) wykorzystuje
operator >> do pobrania danych ze strumienia wejściowego. Zwykle po prawej
stronie tego operatora podaje się zmienną, do której mają być pobrane dane [2].
printf
22
Funkcja printf to znana z języka C funkcja służąca do przekierowania ciągu znaków do strumienia wyjściowego (wyświetlenia na ekranie).
Nr linii Opis
1 Definicja funkcji printf znajduje się w bibliotece stdio.h
8 Proste zastosowanie funkcji printf do wyświetlenia ciągu znaków
9 W funkcji printf liczby wprowadzane są do sformatowanego ciągu znaków za pomocą specyfikatorów konwersji, rozpoczynających się od znaku %. Po zamknięciu cudzysłowu wymieniane są zmienne, w kolejności takiej, w jakiej mają pojawić się w tekście.
printf Wykaz specyfikatorów (ze stronu http://www.cplusplus.com/reference/)
specifier Output Example
d or i Signed decimal integer 392
u Unsigned decimal integer 7235
o Unsigned octal 610
x Unsigned hexadecimal integer 7fa
X Unsigned hexadecimal integer (uppercase) 7FA
f Decimal floating point, lowercase 392.65
F Decimal floating point, uppercase 392.65
e Scientific notation (mantissa/exponent), lowercase 3.9265e+2 E Scientific notation (mantissa/exponent), uppercase 3.9265E+2 g Use the shortest representation: %e or %f 392.65 G Use the shortest representation: %E or %F 392.65
a Hexadecimal floating point, lowercase -0xc.90fep-2 A Hexadecimal floating point, uppercase -0XC.90FEP-2
c Character a
printf
24
Modyfikatory specyfikatorów konwersji – litery wstawiane pomiędzy znak % a specyfikator konwersji, zmieniające sposób działania tegoż specyfikatora [3].
Modyfikator Opis
znacznik - wyrównuje wartość do lewej krawędzi pola (np. %-20s) + wyświetla wartość ze znakiem plus lub minus (np. %+6.2f)
odstęp wyświetla wartość z odstępem na początku (bez znaku plus), lub ze znakiem minus jeśli jest ujemna (np. % 6.2f)
liczba Minimalna szerokość pola (jeśli wartość się nie mieści zostanie użyte większe pole)
.liczba Dokładność, w przypadku %e, %E i %f to liczba cyfr po przecinku. Dla %g i
%G to maksymalna liczba cyfr znaczących, dla %s – maksymalna liczba wyświetlanych znaków. Dla liczb całkowitych – minimalna liczba wyświetlanych cyfr (w razie potrzeby na początku dodawane są zera)
printf
Przykład. Napisz program, w którym zadeklarujesz dwie zmienne: dlugosc typu
float oraz numer typu integer. Przy pomocy funkcji printf wyświetl wartości obu
zmiennych w polu o szerokości 10 znaków, liczba zmiennoprzecinkowa powinna
mieć 4 liczby w części dziesiętnej, tak, aby uzyskać efekt:
scanf
26
Funkcja scanf, znana z języka C, to odpowiednik obiektu cin z C++. Stosowana jest do odczytywania ciągu znaków ze standardowego wejścia i przekształcania ich na wartość zmiennej zgodnie z podanym formatem. Składnia:
scanf(lancuch_formatujacy , adres_zmiennej_docelowej);
Nr linii Opis
3 Funkcja scanf konwertuje wejściowy ciąg znaków na liczbę zmiennoprzecinkową pojedynczej precyzji (%f), zaś wynik przypisuje do zmiennej odleglosc. Znak &
(ang. ampersand) powoduje, że do funkcji scanf przekazywany jest adres zmiennej odleglosc.
Podstawowe operatory arytmetyczne W C++ występuje pięć operatorów arytmetycznych.
Operator Opis Przykład
* mnożenie x * y
/ dzielenie, jeśli wynik przypisywany jest do zmiennej całkowitej to część dziesiętna wyniku dzielenia jest
ucinana
x / y
% dzielenie modulo (reszta z dzielenia, tylko liczby całkowite)
x % y
+ dodawanie x + y
- odejmowanie x - y
Operatory unarne
28
Operator Opis Przykład
++ operator zwiększenia (inkrementacji) ++a jest równoważne a = a + 1 a++
-- operator zmniejszenia (dekrementacji) --a jest równoważne a = a - 1 a--
Operacja ++a (forma przedrostkowa) zwiększa wartość zmiennej a o jeden przed jej użyciem
Operacja a++ (forma przyrostkowa) zwiększa wartość zmiennej a o jeden po
użyciu jej wartości
Arytmetyczne operatory przypisania
Zapis Opis Przykład Znaczenie
+= przypisanie sumy a += b a = a + b
-= przypisanie różnicy a -=b a = a – b
*= przypisanie iloczynu a *= b a = a * b
/= przypisanie ilorazu a /= b a = a / b
%= przypisanie reszty a %= b a = a % b
Zadania
30
Zadanie 1. Napisz program, w którym utworzysz zmienne typów bool, char, int,
long int, float, double oraz long double. Wykorzystując operator sizeof() wypisz
komunikat o rozmiarze każdej zmiennej, przykład:
Zadania
Zadanie 2. Zmodyfikuj program z zadania 7 tak, aby każda wartość wyświetlana
była w polu o szerokości 15 znaków, z wyrównaniem do prawej strony. Wykorzystaj
funkcję printf. Przykładowy rezultat:
Zadania
32