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
1. 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)
2. Kompilator kompiluje kod źródłowy i tworzy
kod wynikowy (pliki *.obj)
3. Linker łączy kod wynikowy z wymaganymi
bibliotekami, powstaje plik wykonywalny
exe.
Problem informatyczny
1. sformułowanie problemu,
2. określenie danych wejściowych,
3. określenie celu działania,
4. sformułowanie algorytmu działania (sposobu
rozwiązania problemu),
5. przedstawienie algorytmu w postaci :
– opisu słownego,
– listy kroków,
– schematu blokowego,
– jednego z języków programowania.
6. Analiza poprawności rozwiązania,
7. 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
32
0 : 4 294 967 295
short int
16
-32 768 : 32 767
float
32
3,4*10
-38
: 3,4*10
38
double
64
2,2*10
-308
: 1,8*10
308
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)
%
Przykład:
if
(liczba
%
10
==
0)
cout
<< ”Ta liczba jest podzielna przez 10”;