Podstawy programowania PP - WYK1 Wojciech Pieprzyca
Pojęcia podstawowe Program – określa proces przekształcania danych wejściowych w dane wyjściowe (wyniki) według pewnego algorytmu. Dane wejściowe – informacje dostarczone do programu przez użytkownika, w celu umożliwienia wykonania algorytmu Dane wyjściowe – generowane przez program wyniki działania Algorytm – określa sposób przekształcania danych wejściowych w dane wyjściowe zgodnie z zadanym celem.
Pojęcia podstawowe Programowanie – polega na zapisywaniu algorytmów w formie zrozumiałej dla komputera. Kod źródłowy – program napisany w konkretnym języku programowania (np. Pascal, C++) – czytelny dla programisty Kod wynikowy (wykonywalny) – program zapisany jako ciąg rozkazów w kodzie maszynowym, zrozumiały dla maszyny cyfrowej.
Proces tworzenia programu Kod źródłowy zapisywany jest przez programistę w edytorze kodu w ramach określonego środowiska programowania (w przypadku języka C++ są to pliki *.cpp) Kompilator kompiluje kod źródłowy i tworzy kod wynikowy (pliki *.obj) Linker łączy kod wynikowy z wymaganymi bibliotekami, powstaje plik wykonywalny exe.
Problem informatyczny sformułowanie problemu, określenie danych wejściowych, określenie celu działania, sformułowanie algorytmu działania (sposobu rozwiązania problemu), przedstawienie algorytmu w postaci : opisu słownego, listy kroków, schematu blokowego, jednego z języków programowania. Analiza poprawności rozwiązania, Testowanie rozwiązania dla różnych danych oraz ocena efektywności przyjętej metody.
Algorytm Algorytm to przepis postępowania, który doprowadza do uzyskania pożądanego efektu – rozwiązania zadania. W życiu codziennym spotykamy się z rozmaitymi algorytmami, niekoniecznie związanymi z informatyką. Za algorytmy (choć często nieścisłe) można uznać przepisy kucharskie, zapis nutowy muzyki, instrukcje montażu, itp. Ludzie nie muszą otrzymywać algorytmów objaśnianych dokładnie – wiele mogą sobie dopowiedzieć, wywnioskować z kontekstu czy doświadczenia.
Algorytm Jednak zapis algorytmu w postaci słownej jest wysoce nieskuteczny ze względu na duże możliwości niejednoznacznej interpretacji takiego zapisu. Komputer nie posiada zdolności domyślania się, wyciągania wniosków z danego kontekstu działania, nie rozumie języka naturalnego. W związku z tym konieczne jest szczegółowe i jednoznaczne określenie czynności, które mają zostać wykonane. Jest to sposób ogólny, tak by na jego podstawie można było zaimplementować program w dowolnym języku programowania.
Schematy blokowe Jednym ze sposobów ścisłego zapisu algorytmu jest forma graficzna zapisu w postaci schematu blokowego. Schemat blokowy obrazuje za pomocą umownych symboli sekwencje wykonywanych operacji oraz kierunek przepływu informacji. Jest to diagram, na którym wykonywane operacje reprezentowane są przez figury geometryczne, połączone strzałkami zgodnie z kolejnością wykonywania czynności wynikających z przyjętego algorytmu działania.
Schematy blokowe Blok graniczny (etykieta) – używane do oznaczenia początku i końca algorytmu Blok wejścia/wyjścia – służy do wprowadzania danych z zewnątrz (odczyt danych) lub wyprowadzania wyników np. na ekran (zapis danych) Blok wykonawczy (operand) – jedna lub kilka instrukcji, które mają zostać wykonane. W ramach tego elementu mogą być wykorzystane instrukcje przypisania (=) oraz operatory arytmetyczne (+,-,*,/).
Schematy blokowe Blok decyzyjny (predykat) – element z jednym wejściem i dwoma wyjściami. Element posiada część warunkową w postaci wyrażenia logicznego. W zależności od tego czy warunek został spełniony czy też nie. Łącznik wewnętrzny – służy do łączenia odrębnych części schematu, znajdujących się na tej samej stronie, powiązane ze sobą łączniki oznaczone są tym samym napisem Łącznik zewnętrzny – służy do łączenia odrębnych części schematu, znajdujących się różnych stronach, powiązane ze sobą łączniki oznaczone są tym samym napisem
Schematy blokowe Przykład prostego schematu blokowego dla programu obliczającego sumę dwóch liczb
Instrukcje programowania Instrukcja przypisania Jest to instrukcja postaci v:=E, gdzie v to zmienna czyli obiekt, który może przyjmować wartości określonego typu (np. liczba całkowita, liczba rzeczywista, znak, ciąg znaków, itp.). E to wyrażenie. Najpierw wyliczana jest wartość wyrażenia E występującego po prawej stronie instrukcji przypisania, a potem obliczona wartość zostaje przypisana do zmiennej v. a := a+b; i := 2+5; //i=7 i := i+1; //i=8 j := i; //j=8
Instrukcje programowania Instrukcja warunkowa Instrukcja warunkowa ma postać: if warunek then instrukcja1 else instrukcja2 Warunek jest wyrażeniem logicznym, które może być spełnione (wartość true) lub niespełnione (wartość false). Instrukcja warunkowa pozwala nam wybrać jeden z dwóch wariantów dalszego wykonania programu w zależności od tego, czy warunek jest spełniony, czy nie.
Instrukcje programowania Instrukcja warunkowa W pierwszym kroku obliczana jest wartość wyrażenia warunkowego i jeśli jest ono równe true, to wykonujemy ciąg instrukcji oznaczony jako instrukcja1, a jeżeli nie, wykonujemy ciąg instrukcji oznaczony jako instrukcja2. Przykład: if a<b then c:=a else c:=b;
Instrukcje programowania Instrukcja warunkowa
Instrukcje programowania Instrukcja pętli Instrukcja pętli ma postać: while wyrazenie do instrukcja1 Wyrażenie jest warunkiem logicznym, a instrukcja1 jest ciągiem instrukcji, które pętla ma powtarzać, tak długo aż spełniony jest warunek podany w wyrażeniu. Wykonanie pętli zaczyna się od obliczenia wartości warunku.
Instrukcje programowania Instrukcja pętli Jeśli wartość ta wynosi false, to pętla nie robi niczego i kończy swoje działanie, ale jeśli wynosi true, to pętla wykonuje instrukcje, a następnie wraca do sprawdzenia warunku. Pętla jest wykonywana tak długo, aż warunek przestanie być spełniony. Może się zdarzyć, że warunek nigdy nie przestanie być spełniony i pozostanie prawdziwy na zawsze. Program wtedy nie zatrzyma się nigdy i mówimy o takiej sytuacji, jako o zapętleniu programu.
Instrukcje programowania Instrukcja pętli Przykład: while b>1 do b:=b/2;
Narzędzie pracy Programy na laboratorium piszemy w środowisku Borland Builder C++, Programujemy w trybie konsoli tekstowej tzn. na zajęciach PP uczymy się programować a nie obsługiwać środowisko wizualne.
Jak wejść do trybu konsoli?(1) Po uruchomieniu BBC++ klikamy na ikonę znajdującą się w lewym górnym rogu programu, Następnie wybieramy Console Wizard
Jak wejść do trybu konsoli?(2) Opcje konfiguracyjne konsoli pozostawiamy bez zmian i klikamy OK, W ten oto prosty sposób udało się nam przejść do trybu konsoli i jesteśmy gotowi by napisać pierwszy program
Pierwszy program (1) Po uruchomieniu konsoli automatycznie generowany jest szkielet programu, Zawiera on dyrektywy kompilatora (rozpoznamy je po tym, że zaczynają się od znaku #), podstawowa dyrektywa kompilatora taka jak np. include pozwala na dołączenie plików nagłówkowych (czyli deklaracji funkcji bibliotecznych, które będą nam potrzebne podczas pisania programów). Przykładem pliku nagłówkowego jest iostream.h.
Pierwszy program (2) Na początku będą nam potrzebne funkcje biblioteczne z 3 plików nagłówkowych: vcl.h – standardowa biblioteka BBC++, której dołączenie jest niezbędne do poprawnej kompilacji, iostream.h – biblioteka wejścia/wyjścia, pozwala m.in. wyświetlać informacje na strumieniu wyjściowym (np. monitorze) i pobierać dane ze strumienia wejściowego (np. klawiatury), conio.h – zawiera interesującą funkcje getch(), oczekującą na naciśnięcie klawisza przez użytkownika. W środowisku konsoli pozwoli nam to zobaczyć okno tekstowe programu (bez getch() okno jest automatycznie zamykane po wykonaniu programu).
Pierwszy program (3) Każdy program w języku C obowiązkowo zawiera funkcję main. Jest to główna funkcja programu od której rozpoczyna się proces wykonywania programu. Treść każdej funkcji (tzw. ciało programu) zawiera się w obszarze ograniczonym przez dwa nawiasy klamrowe. { ….. (ciało) }
Pierwszy program (4) Pierwszy program będzie wyświetlał powitanie na ekranie. //dyrektywy dotyczące plików nagłówkowych #include <vcl.h> #include <iostream.h> #include <conio.h> //definicja funkcji main int main(int argc, char* argv[]) { //wyświetlenie napisu na ekranie cout << ”Witaj w swoim pierwszy programie!”; //oczekiwanie na naciśnięcie klawisza getch(); return 0; }
Pierwszy program (5) Uwagi do programu: - niektóre linie kodu poprzedzone znakami // stanowią komentarz i nie są brane pod uwagę w czasie kompilacji programu, - funkcja main zawiera argumenty wejściowe i wyjściowe, ponieważ jednak tworzona jest ona automatycznie przez środowisko BBC++ to na razie pominiemy ten aspekt i wrócimy do jego omówienia w rozdziale dotyczącym funkcji, - jedyną linią kodu do samodzielnego wpisania jest ta z instrukcją cout powodującą wysłanie tekstu przekazanego po operatorze << na domyślny strumień wyjściowy (zwykle monitor). Tekst jawny używany w programie musi zostać objęty apostrofami. Instrukcja endl wymusza przejście do nowej linii, - instrukcja getch() powoduje zatrzymanie programu aż do naciśnięcia klawisza przez użytkownika, - return w tym przypadku zawraca kod pomyślnego zakończenia funkcji.
Jak skompilować program?(1) W celu kompilacji programu należy nacisnąć klawisze ALT+F9. Zazwyczaj jednak będziemy jednocześnie chcieli skompilować program i go uruchomić (klawisz F9). Kompilujemy program i…
Jak skompilować program?(2) KOMPILACJA Sukces :-) Porażka :-( Nie pojawiają się komunikaty o błędach, pojawia się za to okno programu w trybie tekstowym. Kompilator informuje nas o występujących błędach składni i podświetla linie w której wystąpił pierwszy błąd
Słowa kluczowe Słowa kluczowe są integralną częścią składni języka. Oznacza to, że są one zarezerwowane i nie mogą być używane w innych celach niż to pierwotnie założono, nie można ich np. wykorzystać do nadawania nazw zmiennych czy funkcji. Przyklady slów kluczowych: asm, break, case, catch, char, class, const, continue, default, delete, do, double, else, enum, extern, float, for, friend, goto, if, inline, int, long, new, operator, private, protected, public, register, return, short, signed, sizeof, static, struct, switch, this, throw, try, typedef, unsigned, virtual, void, volatile, while
Zmienne Pod pojęciem zmiennej rozumiemy zwykle komórkę pamięci, której rozmiar zależy od typu danej, którą chcemy w niej przechowywać. Inny będzie więc rozmiar zmiennej dla liczby całkowitej, a inny dla ciągu znaków. Każda zmienna posiada swój adres w pamięci, jednak odwoływanie się do zmiennej poprzez adres byłoby dość kłopotliwe, dlatego też zmiennym można przyporządkować nazwy. Nazwa składa się z ciągu liter i cyfr, nie może jednak zawierać „polskich liter”, spacji ani rozpoczynać się od cyfry. Nie może być oczywiście taka sama jak istniejące słowo kluczowe. W języku C rozróżniane są duże i małe litery.
Typy danych Tak jak już wspomnieliśmy każda zmienna w języku C musi mieć ściśle przyporządkowany typ danych. Wyróżniamy następujące podstawowe typy danych: Typ danych Liczba bitów Zakres wartości char 8 -128:127 lub jeden znak ASCII int 32 -2 147 483 648 : 2 147 483 647 unsigned int 0 : 4 294 967 295 short int 16 -32 768 : 32 767 float 3,4*10-38 : 3,4*1038 double 64 2,2*10-308 : 1,8*10308
Deklarowanie zmiennych Wszystkie wykorzystywane zmienne w programie napisanym w języku C++ muszą być najpierw zadeklarowane. Deklaracja polega na podaniu typu i nazwy zmiennej w postaci: typ_zmiennej nazwa_zmiennej; Przykłady deklaracji zmiennych: int liczbacalkowita; float liczbarzeczywista; char znak;
Przykładowy program (1) #include <vcl.h> #include <iostream.h> #include <conio.h> #include <math.h> //plik naglowkowy z funkcja sqrt int main(int argc, char *argv[]) { //deklaracja zmiennych float a,b,c; float delta,x1,x2; //pobranie danych z klawiatury cout << "Podaj a: "; cin >> a; cout << "Podaj b: "; cin >> b; cout << "Podaj c: "; cin >> c; //obliczenie delty i pierwiastkow delta = b*b-4*a*c; x1 = (-b-sqrt(delta))/(2*a); //sqrt – pierwiastek kwadratowy x2 = (-b+sqrt(delta))/(2*a); //wypisanie wynikow na ekranie cout << "x1 = " << x1 << endl; cout << "x2 = " << x2 << endl; getch(); return 0; }
Przykładowy program (2) Uwagi do programu: jak można łatwo się zorientować program nie jest doskonaly, nie sprawdza chociażby czy wskaźnik delta jest nieujemny co jest warunkiem istnienia rozwiązań równania kwadratowego, podobnie nie jest sprawdzane czy iloczyn w mianowniku wyrażenia na rozwiązania x1 i x2 jest niezerowy, w przypadku gdy a=0 uzyskamy błąd dzielenia przez zero, podobnie jak instrukcja cout służyła do wyprowadzenia wyników na ekran, tak instrukcja cin służy do pobrania danych z klawiatury, ponieważ istniała konieczność użycia funkcji pierwiastkowania sqrt, to konieczne było dołączenie funkcji bibliotecznych z pliku nagłówkowego math.h, po zapoznaniu się z instrukcjami warunkowymi będziemy mogli udoskonalić program.
Zmienne globalne, lokalne, zakresy ważności (1) Zmienne globalne swoim zakresem obejmują cały program, oznacza to, że możemy odwoływać się do nich z dowolnego miejsca w programie, Zmienne lokalne swój zakres ograniczają do bloku programu w którym zostały zadeklarowane, blok programu rozpoczyna się nawiasem klamrowym otwierającym {, a kończy nawiasem zamykającym }. Typowym przykładem bloku jest funkcja. Jeżeli zadeklarujemy zmienną globalną i lokalną o takich samych nazwach, to w ramach bloku z deklaracją zmiennej lokalnej będzie obowiązywała wartość zmiennej lokalnej, a poza nim wartość zmiennej globalnej. Mówimy, wówczas, że zmienna lokalna zasłania wartość zmiennej globalnej.
Zmienne globalne, lokalne, zakresy ważności (2) #include <vcl.h> #include <iostream.h> #include <conio.h> //zmienna globalna int zm=100; int main(int argc, char *argv[]) { cout << ”Zmienna przed deklaracja lokalnej:” << zm << endl; //zmienna lokalna int zm = 200; cout << ”Zmienna po deklaracji lokalnej:” << zm << endl; //nowy blok programu int b = 2; cout << ”Zmienna b w bloku:” << b << endl; } //b=3 BŁĄD! Zmienna b nie jest widoczna poza blokiem getch(); return 0;
Instrukcja warunkowe if (1) Instrukcja if służy do sterowania przebiegiem programu i wyboru jednej z kilku alternatywnych dróg jego realizacji w zależności od aktualnych warunków. Składnia: If (warunek) instrukcja1 else instrukcja2 Warunek jest wyrażeniem, które może przyjmować wartość zero (fałsz) lub wartość różną od zera (prawda), Działanie instrukcji warunkowej if: 1. obliczenie wartości wyrażenia warunkowego, 2. jeżeli wartość wyrażenia jest różna od 0 to wykonywana jest instrukcja1, 3. jeżeli wartość wyrażenia jest równa 0 to wykonywana jest instrukcja2
Instrukcja warunkowe if (2) W poniższym programie wyrażenie warunkowe jest prawdziwe dla każdej liczby różnej od zera (zgodnie z założeniem C): #include <vcl.h> #include <iostream.h> #include <conio.h> int main(int argc, char *argv[]) { int liczba; cout << ”Podaj liczbe: ”; cin >> liczba; if (liczba) cout << ”Liczba rozna od 0 (prawda) – warunek jest spelniony”; else cout << ”Liczba rowna 0 (fałsz) – warunek niespelniony”; getch(); return 0; }
Operatory Podstawowe operatory arytmetyczne +,-,*,/ Operator przypisania = Operatory porównania <,>,>=,<=,== Przykład: if (liczba==10) cout << ”Ta liczba to 10”; Operator modulo (reszta z dzielenia) % if (liczba%10==0) cout << ”Ta liczba jest podzielna przez 10”;