Wykłady z podstaw programowania f& Język C/C++
Podstawy programowania
Język C/C++
1. Wprowadzenie
System i oprogramowanie
System komputerowy jest to ogół składników związanych bezpośrednio
lub pośrednio z pojęciem komputera. Do systemu komputerowego zaliczamy
obok sprzętu fizycznego (procesor CPU, pamięć RAM/ROM, urządzenia
we/wy, ...) przede wszystkim warstwy oprogramowania, systemowego,
narzędziowego lub użytkowego.
1
PDF created with pdfFactory Pro trial version www.pdffactory.com
Wykłady z podstaw programowania f& Język C/C++
W ogólności przez oprogramowanie rozumiemy zbiór programów
komputerowych. Każdy program jest przy tym ciągiem rozkazów i danych
przeznaczonych do przetwarzania przez procesor systemu komputerowego.
Oprogramowanie systemowe, czyli system operacyjny, jest
najistotniejszym elementem programowym składającym się na system
komputerowy. W ogólności system operacyjny to program sterujący, który
nadzoruje wykonywanie innych programów i działanie sprzętu fizycznego. Jest
to zatem środowisko, w którym użytkownik może wykonywać własne,
zewnętrzne programy.
Pozostałe oprogramowanie obejmuje programy narzędziowe, np.:
programy do administrowania systemem, do zarzÄ…dzania plikami na dysku,
translatory języków programowania, oraz programy użytkowe, np.: edytory
tekstu, arkusze kalkulacyjne, programy do obliczeń matematycznych, gry.
W pierwszych prostych systemach wsadowych wykonywanie przez
komputer programów użytkownika było zadaniem złożonym. Wszystkie
czynności związane z wprowadzaniem zadania powierzane były zatem
operatorowi systemu. Wsad, czyli zadanie do przetworzenia, składał się z kodu
programu i wartości danych, zapisanych na specjalnym nośniku (np. karta
perforowana), oraz z dyrektyw dla operatora systemu. Praca systemu polegała
na wprowadzeniu, wykonaniu i usunięciu jednego zadania. Wyniki obliczeń
były wyprowadzane na proste urządzenia wyjściowe, np. drukarkę.
2
PDF created with pdfFactory Pro trial version www.pdffactory.com
Wykłady z podstaw programowania f& Język C/C++
W celu ułatwienia dialogu między użytkownikiem a komputerem
(najczęściej poprzez tzw. konsolę = monitor + klawiatura) współczesne
systemy konwersacyjne oferują warstwą pośrednią zwaną interfejsem
użytkownika (interfejs tekstowy, linii poleceń, graficzny GUI, ...), w której
interakcja użytkownika z systemem składa się z wielu krótkich operacji, tj.
poleceń użytkownika i odpowiedzi systemu - wyników obliczeń.
W ogólności z punktu widzenia systemu komputerowego dowolny
program komputerowy stanowi ciÄ…g instrukcji zapisanych w odpowiednim
języku maszynowym, zrozumiałym przez procesor systemu. Natomiast z
punktu widzenia człowieka (programisty, użytkownika) program to zapis dany
w pewnym na ogół symbolicznym języku programowania, wyrażający
przekształcanie danych wejściowych w dane wyjściowe według pewnego
algorytmu, a także dotyczący innych operacji składających się na wykonanie
programu w systemie komputerowym.
3
PDF created with pdfFactory Pro trial version www.pdffactory.com
Wykłady z podstaw programowania f& Język C/C++
Przez dane wejściowe rozumiemy informację dołączoną statycznie do
programu lub wprowadzonÄ… w trakcie jego wykonywania przez system i
będącą przedmiotem przetwarzania zgodnie z algorytmem zapisanym w
programie.
Natomiast dane wyjściowe to informacja tworzona przez wykonywany
w systemie program i będąca wynikiem przetwarzania zgodnie z algorytmem
zapisanym w programie.
Dowolny algorytm to uporządkowany i jednoznaczny zbiór czynności
składających się na przekształcenie danych wejściowych w dane wyjściowe
zgodnie z pewnym celem. Algorytm posiada zatem charakter abstrakcyjny,
matematyczny, natomiast program jest jego konkretnÄ…, technicznÄ… realizacjÄ… w
wybranym języku, nierzadko zależną od systemu komputerowego.
Przez programowanie rozumiemy przy tym na ogół złożony proces
implementacji algorytmów, czyli ich zapisywania w postaci kodów
składających się na program wykonywalny przez system komputerowy. Ze
względu na charakter języka stosowanego w programowaniu wyróżniamy kod
zródłowy programu, czyli zapis w języku symbolicznym zrozumiałym przez
człowieka, oraz kod wynikowy, który najczęściej uzyskuje się w wyniku
automatycznej translacji kodu zródłowego. Kod wynikowy jest ciągiem liczb
binarnych reprezentujących rozkazy i dane w języku maszynowym procesora.
Uwaga: Słowo program może być używane zarówno w odniesieniu do kodu zródłowego
zapisanego przez programistÄ™ w pliku tekstowym, jak i w odniesieniu do kodu
wynikowego otrzymanego wskutek translacji i zachowanego w pliku wykonywalnym.
4
PDF created with pdfFactory Pro trial version www.pdffactory.com
Wykłady z podstaw programowania f& Język C/C++
Języki i paradygmaty programowania
Język programowania, rozumiany jako system zapisu algorytmów, opisu
danych oraz przekazu komputerowi poleceń, należy do rodziny języków
sztucznych, których gramatyka została formalnie skonstruowana w przeciwie-
ństwie do języków naturalnych (etnicznych), powstających spontanicznie.
Gramatyka języka programowania, podobnie jak w przypadku innych
języków, składa się z następujących działów:
leksyka określa alfabet języka, czyli zbiór legalnych znaków
(zwykle z tabeli ASCII), oraz podaje zasady tworzenia słów, czyli
tzw. jednostek leksykalnych, będących ciągami znaków alfabetu
syntaktyka (składnia) podaje zasady tworzenia z jednostek
leksykalnych języka bardziej złożonych struktur (zdań, zwrotów),
takich jak np. deklaracje, instrukcje
semantyka nadaje konkretne znaczenie poszczególnym
strukturom składniowym (uwaga: w danym języku nie wszystkie
składniowo poprawne struktury mogą posiadać swoje znaczenie).
pragmatyka wyznacza zastosowanie i cele języka
Podstawowy podział języków wykonywany jest ze względu na charakter
bezpośredniego odbiorcy informacji zapisanych w języku. Wyróżniamy:
języki maszynowe lata 40.; są to języki pierwszej generacji;
oparte bezpośrednio na rozkazach maszyny w postaci liczb
binarnych i stÄ…d przeznaczone jedynie do przekazywania
informacji bezpośrednio w komputerze
języki symboliczne nadające się do wymiany informacji wśród
ludzi; ich rozwój obejmuje następujące generacje:
drugą od 1952 r.; języki niskopoziomowe, czyli języki
asemblera, w których instrukcje złożone są z literowych
symboli rozkazów maszyny (tzw. mnemoników), np. ADD,
SUB, MOV, po których podaje się argumenty rozkazu
5
PDF created with pdfFactory Pro trial version www.pdffactory.com
Wykłady z podstaw programowania f& Język C/C++
trzecią od 1957 r.; języki znajdujące się na średnim (np.
język C), wysokim (np. FORTRAN, Pascal) i bardzo
wysokim (np. Python) poziomie podobieństwa do języków
naturalnych
czwartą od 1980 r.; języki wbudowane w graficzne
środowiska szybkiego tworzenia specyficznych aplikacji,
RAD (ang. Rapid Application Development); wykorzystujÄ…
narzędzia zwane kreatorami (np. Delphi) i/lub metody
programowania wizualnego oparte na diagramach (np.
LabView, UML)
piątą od 1990 r.; języki zbliżone do charakterystyki
człowieka; systemy te dzięki zastosowaniu metod sztucznej
inteligencji samoczynnie projektujÄ… i implementujÄ…
algorytmy do rozwiązywania problemów postawionych
przez człowieka (np. język Mercury)
Obecnie programy pisane są wyłącznie w językach symbolicznych, a
następnie są tłumaczone na kod maszynowy. Proces translacji tekstu
zródłowego napisanego w języku symbolicznym na kod maszynowy wymaga
odpowiednich programów narzędziowych zwanych translatorami.
Translatory dzielimy na:
interpretery tekst zródłowy jest tłumaczony instrukcja po
instrukcji, przy czym bieżąca instrukcja jest tłumaczona na kod
maszynowy, który jest od razu wykonywany przez procesor
kompilatory cały tekst zródłowy jest tłumaczony do kodu
wynikowego, który następnie w postaci osobnego pliku może być
wielokrotnie wykonywany przez procesor.
Na ogół proces translacji dla języków przyjmuje jedną z dwóch p/w
postaci. Stąd spotyka się dodatkowy podział języków na języki interpretowane
(głównie skryptowe, np. Perl, Python, oraz inne, takie jak BASIC) i języki
kompilowane (np. FORTRAN, C, Pascal).
Podziału języków symbolicznych dokonuje się również ze względu na
zastosowanie języka i wspierany styl lub paradygmat programowania.
6
PDF created with pdfFactory Pro trial version www.pdffactory.com
Wykłady z podstaw programowania f& Język C/C++
Dalsza klasyfikacja języków symbolicznych:
języki asemblerowe i makroasemblerowe
języki imperatywne oparte na poleceniach (np. C, Pascal)
języki logiczne oparte na twierdzeniach (np. Prolog)
języki deklaratywne oparte na relacjach i regułach (np. Prolog)
języki proceduralne i modularne (np. C, Pascal, Modula)
języki funkcyjne oparte na wartościowaniu (np. Lisp, Haskell)
języki obiektowo zorientowane (np. C++, Java, C#)
(równoległego, rozproszonego)
języki programowania współbieżnego (np. Ada) a sekwencyjnego
języki skryptowe bardzo wysokiego poziomu (np. Perl, Python)
języki opisu danych i zapytań do baz danych (np. SQL)
języki poleceń powłoki (np. csh, bash w systemie UNIX)
metajęzyki do definicji innych języków (np. XML)
Przez paradygmat programowania rozumiemy rozbudowany styl, oparty
na spójnym zbiorze technik tworzenia oprogramowania, których wspólnym
celem jest ułatwienie pisania, czytania, testowania i następnie wielokrotnego
użycia programów lub ich fragmentów.
Przykłady paradygmatów programowania:
programowanie bez struktury
Najprostszy styl programowania, w którym programy tworzone są w postaci
ciągłego potoku instrukcji bez wyraznego podziału na fragmenty. Cechą
charakterystyczną tego stylu jest również występowanie licznych skoków
bezwarunkowych w kodzie.
7
PDF created with pdfFactory Pro trial version www.pdffactory.com
algorytmiczne
Wykłady z podstaw programowania f& Język C/C++
programowanie strukturalne (proceduralne, modularne)
Umożliwia hierarchiczne dzielenie kodu na proste fragmenty zwane
procedurami. Fragmenty te są następnie łączone we większe moduły, które
dodatkowo zawierają własne struktury danych. Użycie modułów odbywa się
jedynie poprzez dobrze określone interfejsy.
8
PDF created with pdfFactory Pro trial version www.pdffactory.com
Wykłady z podstaw programowania f& Język C/C++
programowanie zorientowane na abstrakcjÄ™ danych
Umożliwia definiowanie nowych typów danych cechujących się wysoką
hermetyzacjÄ… danych i operacji na nich wykonywanych; np. definicja nowego
typu wektorowego do wykonywania operacji na wektorach geometrycznych.
programowanie zorientowane obiektowo
Umożliwia budowanie programu za pomocą obiektów posiadających swój stan
(dane) oraz metody (procedury) jego odczytu i zmiany. Program jest zbiorem
dynamicznie tworzonych obiektów oddziaływujących ze sobą. Podejście to
różni się od programowania proceduralnego, gdzie dane i procedury nie są ze
sobą związane, i od programowania modularnego, gdzie moduły są statyczne.
programowanie aspektowe
Wspomaga separację zagadnień i rozdzielenie tekstu programu na części,
zwane aspektami, o zapisie w jak największym stopniu niezwiązanym.
9
PDF created with pdfFactory Pro trial version www.pdffactory.com
Wykłady z podstaw programowania f& Język C/C++
Lista języków programowania
Istnieje około 2500 oficjalnie opublikowanych języków1. Najczęściej
stosowane języki od momentu powstania maszyn programowalnych2:
Rok Język Pełna nazwa, przeznaczenie, twórca, wersje
1952 asemblery Bliskie kodu maszynowego
1957 Fortran FORmula TRANslation, obliczenia num., John Backus, IBM,
Fortran IV (1966), Fortran 77 (1977), Fortran 90 (1991)
1960 LISP LISt Processing, j. funkcyjny, sztuczna intelig., J. McCarthy,
MIT, InterLisp, MacLisp, PSL, Common LISP (1984)
1960 Algol Algor. Language, obliczenia numeryczne, Algol 60, Algol 68
1960 COBOL Common Business Oriented Language, biznes, finanse, główne
zmiany w 1968 i 1974, ostatnia wersja COBOL 85
1962 APL A Programming Language, oblicz. num., Ken Iverson (Harvard)
1962 SIMULA Symulacje numeryczne, Kristen Nygaard & Ole-Johan Dahl,
pierwsza implementacja 1964, SIMULA 67
1964 BASIC Begginers All-purpose Symbolic Instruction Code, John G.
Kemeny & Thomas E. Kurtz, Dartmouth College
1971 Prolog PROgramming in LOGic, prog. logiczne, Alain Colmerauer and
Phillipe Roussel, Prolog-2, Prolog++
1972 C Język uniwersalny, Dennis Ritchie, Bell Labs
1975 Pascal Język uniwersalny, N. Wirth, Pascal Plus, TurboPascal
1977 Modula-2 Język uniwersalny, N. Wirth, Modula-2+, Modula-3, Modula-P,
Modula/R
1980 dBASE II Bazy danych, dBASE III, III+, IV, V
1983 Smalltalk Obiektowo zorientowany, Xerox PARC pod kierownictwem
Alana Kay'a, Smalltalk/V na PC.
1983 Ada Ada Lovelace pierwsza programistka, język uniwersalny, Jean
Ichbiah, standard Ada 83, Ada++, Ada 95
1983 C++ Obiektowo zorientowany, Bjarne Stroustrup, AT&T
1995 Java Obiektowo zorientowany dla maszyny wirtualnej, SunLabs
2000 C# Obiek. zorient. dla środ. uruchomieniowego .NET, Microsoft
1
patrz "On About 2500 Computer Languages", http://people.ku.edu/~nkinners/LangList/Extras/langlist.htm.
2
Włodzisław Duch, Fascynujący świat programów komputerowych, NAKOM 1997.
10
PDF created with pdfFactory Pro trial version www.pdffactory.com
Wykłady z podstaw programowania f& Język C/C++
Charakterystyka programowania strukturalnego
Ogólne zalecenia programowania strukturalnego dotyczące organizacji
kodu algorytmów i danych:
kod algorytmów programu powinien zawierać instrukcje sterujące
jedynie o charakterze strukturalnym, takie jak instrukcje
warunkowe, instrukcje wyboru, pętle ze sprawdzeniem warunku
powtarzania itp.
należy ograniczyć do niezbędnego minimum stosowanie skoku
bezwarunkowego
należy zagnieżdżać jedne konstrukcje składniowe we innych
stosujÄ…c instrukcje grupujÄ…ce
zbiór wszystkich danych programu powinien mieć bardziej
złożoną organizację poprzez stosowanie struktur danych, takich
jak tablice, rekordy itp.
należy zadbać o porządek i czytelność tekstu programu.
Cechy programowania proceduralnego:
podział kodu złożonego programu z wieloma algorytmami na
niezależne procedury
jedna procedura najczęściej wykonuje jeden algorytm
dane wejściowe algorytmu są przekazywane w postaci
parametrów wywołania procedury
dane wyjściowe algorytmu są otrzymywane najczęściej poprzez
rezultat wykonania procedury (wtedy nazywane sÄ… funkcjami)
procedury nie powinny korzystać ze zmiennych globalnych (w
miarę możliwości), lecz pobierać i przekazywać wszystkie dane
jako parametry wywołania
możliwość wielokrotnego wykonywania algorytmu poprzez
wywoływanie procedury w dowolnym miejscu programu.
11
PDF created with pdfFactory Pro trial version www.pdffactory.com
Wykłady z podstaw programowania f& Język C/C++
Przykład
1) Program zapisany bez podziału na procedury:
// program główny
double y, a=2.1, b=3.2, c=4.3;
y = a + b5 Å" c
// kod obliczania wyrażenia:
int i;
double u=1.0;
for (i=1; i<=10; i++)
u=0.5*(u+c/u);
double v=1.0;
for (i=0; i<5; i++)
v*=b;
double w=a+v*u;
double r=1.0;
for (i=1; i<=10; i++)
r=0.5*(r+w/r);
y = r;
2) Program zapisany zgodnie z paradygmatem proceduralnym:
double sqrt(double par) // parametr
{
// algorytm obliczania pierwiastka kwadratowego
int i;
double rez=1.0;
for (i=1; i<=10; i++)
rez=0.5*(rez+par/rez);
return rez; // rezultat
}
12
PDF created with pdfFactory Pro trial version www.pdffactory.com
Wykłady z podstaw programowania f& Język C/C++
double pow(double x, int n) // parametry
{
// algorytm obliczania potęgi x do n
int i;
double rez=1.0;
for (i=0; i
rez*=x;
return rez; // rezultat
}
// program główny
double y, a=2.1, b=3.2, c=4.3;
y = sqrt( a + pow(b,5)*sqrt(c) ); // wywołanie
Cechy programowania modularnego:
podział kodu i danych programu na niezależne moduły
moduł najczęściej jest zbiorem powiązanych ze sobą procedur
oraz danych, na których te procedury działają
moduł posiada interfejs deklarujący zbiór publicznych danych i
procedur do komunikacji z innymi modułami
moduł może ukrywać pewne dane i procedury stanowiące
prywatną część jego wewnętrznej implementacji
Przykład
a) Deklaracja interfejsu publicznego modułu stos znaków w pliku stos.h:
// zadeklarowanie danych publicznych ...
void umieść(char); // oraz procedur publicznych
char zdejmij();
13
PDF created with pdfFactory Pro trial version www.pdffactory.com
Wykłady z podstaw programowania f& Język C/C++
b) Implementacja modułu stos znaków w pliku stos.c:
#include stos.h // dołączenie interfejsu modułu
void umieść(char c)
{
// sprawdz, czy nie ma przepełnienia
// umieść element c na stosie
}
char zdejmij()
{
// sprawdz, czy stos nie jest pusty
// zdejmij element ze stosu
}
// zdefiniowanie procedur i danych prywatnych ...
Cechy programowania obiektowego
zorganizowanie kodu i danych programu w postaci klas obiektów
klasa jest zbiorem obiektów o jednakowej strukturze podanej w
deklaracji klasy
obiekt klasy zawiera składowe dane zadeklarowane w klasie, na
których działają składowe metody znajdujące się w klasie
obiekty klas są na ogół dynamicznie tworzone i usuwane w
dowolnym momencie działania programu
stan obiektu klasy jest wyznaczony przez bieżące wartości danych
obiektu, a jego odczyt i zmiana powinna odbywać się wyłącznie
poprzez metody klasy
klasy i obiekty w programie mogą tworzyć dowolne powiązania,
przy czym interakcja pomiędzy nimi powinna odbywać się poprzez
publiczny interfejs klasy
klasa może ukrywać pewne składowe, dane i metody stanowiące
prywatną część jej wewnętrznej implementacji.
14
PDF created with pdfFactory Pro trial version www.pdffactory.com
Wykłady z podstaw programowania f& Język C/C++
Wykonywanie programu
Wykonywanie przez system komputerowy programu utworzonego w
wybranym języku symbolicznym jest operacją składającą się z kilku etapów,
wymagającą podania na wejściu kodu programu zrozumiałego dla komputera.
W przypadku języka kompilowanego kod taki otrzymywany jest jednorazowo
wskutek translacji kodu zródłowego, a następnie jest zachowywany w pamięci
masowej systemu w postaci wynikowego pliku, wykonywalnego przez system.
Plik z kodem wynikowym programu wraz z danymi staje siÄ™ zadaniem
przeznaczonym do wielokrotnego wykonywania przez komputer. Dane dla
programu mogą być umieszczone statycznie w pliku programu, dołączone na
starcie do programu w postaci osobnego pliku lub wprowadzane w trakcie
działania programu.
Operacja wykonywania zdania rozpoczyna się od jego załadowania do
pamięci operacyjnej systemu, przydzielenia mu przez system niezbędnych
zasobów i zainicjowania zmiennych danymi statycznymi. Następnie system
uruchamia program zadania, który od tego momentu staje się tzw. procesem.
Po wykonaniu zadanie jest zakończone i usuwane z pamięci systemu.
15
PDF created with pdfFactory Pro trial version www.pdffactory.com
Wykłady z podstaw programowania f& Język C/C++
Taki przebieg operacji wykonywania zdania jest prosty i występuje
jedynie w systemach jednozadaniowych. W systemach wielozadaniowych z
podziałem czasu pojedynczego procesora każdy równocześnie działający
proces jakiegoś zadania podlega szeregowaniu ze względu na dostęp do
procesora.
Szeregowanie umożliwia procesorowi wykonywanie na przemian wiele
różnych procesów, przy czym przełączenia pomiędzy procesami występują tak
często, że użytkownik systemu ma wrażenie jednoczesnego przetwarzania
zadań, czyli współbieżnego (pseudo-równoległość).
Ponadto, jednoczesne wykonywanie wielu zadań wymaga, aby system
przydzielał w sposób dynamiczny wszystkim bieżącym procesom inne zasoby
niezbędne do ich działania oraz gwarantował bezpieczeństwo wykonywania
zadań (np. ochronę przed ingerencją innych zadań).
Współbieżne przetwarzanie wielu procesów przez współczesne systemy
jest realizowane poprzez odpowiednią kolejkę procesów. Kolejka ta zawiera
procesy gotowe do wykonywania, spośród których tylko jeden jest aktywny,
czyli jest aktualnie wykonywany. Stan aktywnego wykonywania nie może
trwać długo, stąd po upływie pewnego krótkiego czasu wykonywanie procesu
zostaje przerwane i proces powraca do kolejki. Proces może również przejść w
stan oczekiwania na pewne zdarzenie, po którym wraca do kolejki. Wyjście ze
stanu aktywnego może zajść również na skutek zakończenia procesu.
16
PDF created with pdfFactory Pro trial version www.pdffactory.com
Wykłady z podstaw programowania f& Język C/C++
Obok trybu współbieżnego, w którym różne zadania są wykonywane na
przemian tylko przez jeden procesor, istnieje również w pełni równoległe
wykonywanie zadań. Tryb taki polega na wykonywaniu przez różne procesory
systemu różnych fragmentów danego zadania dokładnie w tym samym czasie.
Równoległe wykonywanie zadań jest zatem możliwe do zrealizowania
jedynie przez systemy wieloprocesorowe, monolityczne lub rozproszone,
często w związku z tym określane mianem systemów równoległych.
Uwaga: Zgodnie z p/w opisem proces jest uruchomionym program składającym się na
pewne zadanie dla systemu komputerowego. Należy jednak podkreślić, że mimo różnic
pomiędzy charakterem statycznym i dynamicznym terminy program, zadanie i proces
często używa się zamiennie.
17
PDF created with pdfFactory Pro trial version www.pdffactory.com
Wykłady z podstaw programowania f& Język C/C++
Proces danego programu jest nie tylko elementem ogólnej dynamiki
systemu operacyjnego, ale jednocześnie jest środowiskiem, któremu system
przydziela swoje zasoby niezbędne do wykonania programu.
Na środowisko procesu składają się następujące elementy1:
segment kodu programu - ciąg rozkazów dla procesora
licznik rozkazów - rejestr z indeksem bieżącego rozkazu
segment zmiennych z danymi statycznymi
stos zmiennych automatycznych
sterta zmiennych dynamicznych
pozostałe rejestry procesora oraz inne zasoby systemu
1
Diagram środowiska procesu zawiera oznaczenia rejestrów i rozkazów procesora Intel 8086. Rejestry DS, SS, CS zawierają
adresy początków segmentów w jednostkach 16 bajtowych (paragrafy). Rejestry SP, IP zawierają przesunięcia bieżącego bajta
liczone względem początku segmentu. Rejestry są szesnastobitowe. Stos powiększa się w kierunku malejących adresów.
18
PDF created with pdfFactory Pro trial version www.pdffactory.com
Wykłady z podstaw programowania f& Język C/C++
Rozwój języków C i C++
Język C został utworzony w 1972 r. przez Denisa Ritchie'go we
współpracy z Brianem Kernighan'em z Bell Lab. w New Jersey.
Pierwowzorem dla tego języka był język B, zdefiniowany dwa lata wcześniej
przez Kena Thompsona. Język B był adaptacją języka BCPL (1969, Martin
Richards, Cambridge) dla pierwszej instalacji systemu operacyjnego UNIX.
Początkowo język C był przeznaczony do tworzenia oprogramowania
systemowego, przy jego pomocy został napisany system operacyjny UNIX,
kompilatory, większość programów usługowych, co początkowo było
przeznaczone wyłącznie dla maszyny DEC PDP-11. W miarę upływu czasu C
stał się językiem ogólnego przeznaczenia.
Pierwsze wersje systemu UNIX były rozpowszechniane w szkołach
wyższych wraz z pełnym kodem zródłowym napisanym w języku C. Dlatego
język ten dość szybko stał się bardzo popularny. Ponieważ, korzystało z niego
wiele osób, więc stworzono amerykański standard tego języka - ANSI C w
1989 r. zwany w skrócie C89. Rok pózniej powstał standard ogólnoświatowy
C90, tzn. ISO C w 1990 r.
W latach osiemdziesiątych powstało rozszerzenie języka C
umożliwiające programowanie obiektowe. Początkowo nowy język nazwany
został C z klasami (1980 r.). Jego autorem jest Bjarne Stroustrup z AT&T.
Ostatecznie językowi nadano nazwę C++ (1983 r.) - wskazując, że jest to
przyrostowa modyfikacja języka C.
Często przy omawianiu gramatyki języków C i C++ wprowadza się
nazwę "C/C++" podkreślając, że język C (wersja C89 i C90) jest podzbiorem
języka C++, a jednocześnie wśród nowych elementów gramatycznych języka
C++ znajdują się ulepszone elementy języka C, nazywane "lepszym C".
Oczywiście język C++ oprócz swego podjęzyka C/C++, czyli lepszego C,
zawiera wiele zupełnie nowych elementów związanych bezpośrednio z
programowaniem obiektowym.
Po wielu latach prac nad językiem C++ jego wersja doczekała się
oficjalnego standardu amerykańskiego C++93: ANSI C++ w 1993 r. oraz
światowego C++98: ISO C++ w 1998r. W rok pózniej po opublikowaniu
ostatecznego standardu języka C++ powstał kolejny standard języka C99: ISO
C w 1999 r. Język C99 nie jest już częścią języka C++98.
19
PDF created with pdfFactory Pro trial version www.pdffactory.com
Wykłady z podstaw programowania f& Język C/C++
Tworzenie programu
Z punktu widzenia ogólnej inżynierii oprogramowania proces tworzenia
programu w językach C i C++ obejmuje następujące etapy:
analiza problemu
Obejmuje analizÄ™ dziedziny i istoty rozwiÄ…zywanego problemu, w wyniku
czego powstaje ogólny model dziedziny, a także wyspecyfikowanie
przypadków użycia i zadań dla projektowanego programu. Ponadto,
przeprowadza się analizę możliwości i sposobów spełnienia tych zadań przez
system komputerowy, dla którego dane oprogramowanie jest tworzone.
projektowanie i programowanie
Utworzenie projektu programu w postaci diagramów (stosując np. UML)
prezentujÄ…cych opracowane algorytmy i struktury danych programu, a
następnie na tej podstawie napisanie kodu zródłowego w wybranym języku
programowania. Do tworzenia programów używa się obecnie zintegrowanych
20
PDF created with pdfFactory Pro trial version www.pdffactory.com
Wykłady z podstaw programowania f& Język C/C++
środowisk rozwojowych IDE (ang. Integrated Development Environment),
których podstawowym składnikiem jest edytor nieformatujący pozwalający na
czytelny zapis kodu zródłowego oraz jego dalszą edycję. Po zakończeniu
edycji kod zródłowy zapamiętywany jest w osobnych plikach tekstowych (pliki
*.c dla języka C lub *.cpp dla C++).
kompilacja kodu zródłowego
Program w językach C i C++ składa się z wielu oddzielnie kompilowanych
plików zródłowych. Każdy z plików zródłowych jest kompilowany do modułu
wynikowego zawierajÄ…cego kod binarny (pliki *.obj), co wykonywane jest
przez kompilator składnik środowiska IDE. Proces kompilacji może
zakończyć się niepowodzeniem, gdy kod zródłowy zawiera błędy gramatyczne,
czyli konstrukcje niezgodne z gramatyką języka. W takim przypadku kod
zródłowy należy poprawić, a następnie proces kompilacji należy powtórzyć.
Uwaga: Przed właściwą kompilacją plik zródłowy jest poddawany wstępnemu
przetworzeniu przez preprocesor, którego zadaniem jest usunięcie komentarzy z tekstu
programu i przetworzenie tekstu programu zgodnie z dyrektywami preprocesora tj.
rozkazami rozpoczynajÄ…cymi siÄ™ znakiem # (np. #include, #define, #ifdef itd.).
konsolidacja plików skompilowanych i bibliotecznych
Następnie wszystkie moduły wynikowe (pliki *.obj) i biblioteki systemowe,
języka (pliki *.lib) są łączone w wynikowy program wykonywalny (plik
*.exe). AÄ…czenia dokonuje konsolidator (ang. linker). Proces ten podobnie jak
kompilacja również może zakończyć się niepowodzeniem, czego powodem
jest zwykle brak jakiegoś modułu wynikowego lub biblioteki.
uruchamianie i testowanie programu
Do wykrywania błędów logicznych programu, czyli błędów powstających
jedynie w czasie jego uruchamiania i testowania, służą specjalne programy
uruchomieniowe zwane debuggerami, również dostępne w IDE. Pozwalają one
na śledzenie wartości poszczególnych zmiennych, pracę krokową programu,
21
PDF created with pdfFactory Pro trial version www.pdffactory.com
Wykłady z podstaw programowania f& Język C/C++
ustawianie pułapek. W przypadku wystąpienia błędów logicznych należy
powrócić do edycji i poprawy kodu zródłowego, a następnie proces tworzenia
programu należy powtórzyć.
wdrożenie końcowej aplikacji
Po zakończeniu głównych etapów tworzenia programu należy wdrożyć
otrzymany produkt w postaci końcowej aplikacji, na co składa się instalacja
oprogramowania w docelowym systemie oraz dołączenie dokumentacji,
instrukcji użytkowania itd. Do utworzenia osobnego programu instalującego
aplikację, czyli instalatora, służą specjalne narzędzia dostępne w IDE. Ponadto,
istnieją również osobne narzędzia do automatycznego tworzenia dokumentacji
programu.
Najprostszy program w językach C i C++
Podany niżej program wypisuje na ekranie tekst Hello world!".
Wersja w języku C90
/* Włączenie deklaracji elementów biblioteki we/wy */
#include
/* Główna funkcja programu */
void main(void)
{
printf( Hello world!\n );
}
22
PDF created with pdfFactory Pro trial version www.pdffactory.com
Wykłady z podstaw programowania f& Język C/C++
Wersja w podjęzyku C/C++98
/* Włączenie deklaracji elementów biblioteki we/wy */
#include
/* użycie przestrzeni nazw biblioteki standardowej */
using namespace std;
/* Główna funkcja programu */
int main()
{
printf( Hello world!\n );
return 0; /* wartość dla środowiska operacyjnego */
}
Wersja w języku C++98
// Włączenie deklaracji elementów biblioteki we/wy
#include
// użycie przestrzeni nazw biblioteki standardowej
using namespace std;
// Główna funkcja programu
int main()
{
cout << Hello world! << endl;
return 0; // wartość dla środowiska operacyjnego
}
23
PDF created with pdfFactory Pro trial version www.pdffactory.com
Wykłady z podstaw programowania f& Język C/C++
Program w języku C i C++ składa się z funkcji. Funkcja jest wydzieloną
częścią programu (procedurą), realizującą pewne algorytmy.
Kompletny program musi zawierać dokładnie jedną funkcję o nazwie
zastrzeżonej main - od niej rozpoczyna się wykonanie programu. Funkcja main
może być umieszczona w dowolnym miejscu.
Instrukcje składające się na kod funkcji umieszcza się w nawiasach
klamrowych { i }. Każda instrukcja musi być zakończona średnikiem ';'.
Do programu można dołączać pliki zawierające deklaracje elementów
zdefiniowanych w innych plikach lub elementów standardowej biblioteki
języka. Dokonuje się tego za pomocą dyrektywy: #include .
Plik zawiera deklaracje standardowych funkcji
wejścia/wyjścia języka C. Jedną z nich jest funkcja printf służąca do
wypisywania wartości różnych typów na ekranie.
W odróżnieniu od języka C w programach napisanych w języku C++
zgodnie ze standardem z 1998 r. należy używać standardowych plików
nagłówkowych o nazwach bez rozszerzenie '.h', przy czym pliki standardowe
języka C (podjęzyk C/C++) posiadają nazwę rozpoczynającą się od litery 'c',
np. .
Aby można było użyć jakiejkolwiek nazwy z przestrzeni biblioteki
standardowej języka C++ należy nazwę tę poprzedzić kwalifikatorem
zawierajÄ…cym identyfikator samej przestrzeni, np.: std::cout. Zamiast tego dla
skrócenia zapisu można na początku programu (za dyrektywami #include)
umieścić dyrektywę użycia przestrzeni standardowej std.
Ponadto, w nowym standardzie języka C++ funkcja main musi zwracać
wartość typu int poprzez swój rezultat, co nie jest tak ściśle przestrzegane
przez niektóre kompilatory języka.
Plik zawiera deklaracje standardowych obiektów dla
operacji wejścia/wyjścia języka C++. Jednym z nich jest obiekt cout służący do
wypisywania wartości różnych typów na ekranie.
Komentarze w C90 przyjmują postać blokową /*...*/, natomiast w
C++98 mogą być postaci liniowej //... lub blokowej /*...*/. Duże i małe litery w
językach C i C++ są rozróżnialne.
24
PDF created with pdfFactory Pro trial version www.pdffactory.com
Wykłady z podstaw programowania f& Język C/C++
Rozpoczęcie i zakończenie programu
Wykonywanie programu rozpoczyna siÄ™ od prologu funkcji main,
którego niejawny kod umieszczony jest przed ciałem funkcji. Zakończenie
programu poprzedzone jest wykonaniem niejawnego epilogu funkcji main.
Istnieje kilka przypadków rozpoczynania i kończenia programu:
1. Zakończenie programu prostą instrukcją powrotu
void main(void) /* nagłówek funkcji main */
{ /* Prolog programu (poczÄ…tek funkcji main) */
/* Główny kod programu (ciało funkcji main) */
return; /* Epilog programu (instrukcja powrotu ze
funkcji main do systemu operacyjnego) */
} /* koniec funkcji main */
2. Zakończenie instrukcją powrotu i zwrot rezultatu
int main(void) /* nagłówek funkcji main
z rezultatem */
{ /* Prolog programu (poczÄ…tek funkcji main) */
/* Główny kod programu (ciało funkcji main) */
return 1; /* Epilog programu (instrukcja powrotu
ze funkcji main do systemu operacyjnego
i przekazania wartości 1 do środowiska
systemu poprzez rezultat) */
} /* koniec funkcji main */
25
PDF created with pdfFactory Pro trial version www.pdffactory.com
Wykłady z podstaw programowania f& Język C/C++
3. Zakończenie programu funkcją exit z podaniem wartości
#include
void main(void) /* nagłówek funkcji main */
{ /* Prolog programu (poczÄ…tek funkcji main) */
/* Główny kod programu (ciało funkcji main) */
exit(1); /* Epilog programu
(funkcja przerwania programu
i przejścia do systemu operacyjnego
oraz przekazania podanej wartości 1
do środowiska systemu) */
} /* koniec funkcji main */
4. Zakończenie funkcją abort ze skróconym epilogiem
#include
void main(void) /* nagłówek funkcji main */
{ /* Prolog programu (poczÄ…tek funkcji main) */
/* Główny kod programu (ciało funkcji main) */
abort(); /* Epilog programu
(funkcja natychmiastowego przerwania
programu i przejścia do systemu
operacyjnego) */
} /* koniec funkcji main */
26
PDF created with pdfFactory Pro trial version www.pdffactory.com
Wykłady z podstaw programowania f& Język C/C++
5. Rozpoczęcie programu z podaniem argumentów
void main(int argc, char *argv[]) /* naglowek
funkcji main z parametrami:
argc - liczba napisow w poleceniu
wywolujacym program
argv[0] - nazwa programu
argv[1]..argv[argc-1] - argumenty wywolania
programu */
{ /* Prolog programu (poczatek funkcji main) */
/* Glowny kod programu (cialo funkcji main) */
} /* Epilog programu (koniec funkcji main) */
27
PDF created with pdfFactory Pro trial version www.pdffactory.com
Wyszukiwarka
Podobne podstrony:
w08 PodstPrzy roznor
KOMUNIKACJA PODSTPSYCH WYK2
w02 PodstPrzy zycie
podstprog02
podstpr
w04 PodstPrzy proddekomp
w07 PodstPrzy krajobrazy
podstprog07
podstprog04
podstprog10
podstprog09
w05 PodstPrzy cykle
podstprog06
w06 PodstPrzy klimat
więcej podobnych podstron