Úvod do jazyka C Zdroje: Herout: Učebnice jazyka C, Kopp, České Budějovice, 2001 Schildt H: Nauč se sám C, Softpress, Praha, 2001
Pojem programovací jazyk Pod pojmem programovací jazyk rozumíme prostředek pro zápis programů, jež mohou být provedeny na počítači. V tomto smyslu je programovací jazyk komunikačním nástrojem mezi: uživatelem počítače, který jeho jazykovými prostředky specifikuje algoritmus řešení daného problému, a počítačem, jenž svými technickými prostředky algoritmus interpretuje a realizuje tak transformaci vstupních údajů na výstupní. 2002 2
Program Podle slovníku spisovné češtiny program je: 1. Předem stanovený obsah a postup, sled nějakého kulturního podniku, jednání, apod. 2. Tištěné oznámení programu (koupit si divadelní program) 3. Rozvrh vytčených úkolů a cílů, plán 4. Soustava příkazů vložená do počítače Přesnější definice: Program je smysluplná posloupnost příkazů vložených do počítače, která má předem stanovený význam, sleduje nějaký plán a jejímž výsledkem je provedení nějakého úkolu nebo výpočtu. Algoritmus postup skládající se z konečného počtu úkonů k řešení úkolu. 2002 3
Podprogram Dílčí program, který vykonává dílčí činnost. Programy se obvykle skládají z podprogramů, které vykonávají nějaké dílčí úkoly Program pouze zavolá podprogramy ve vhodném pořadí Strukturované programování Hlavní program si volá různé pomocné podprogramy, které vykonávají svou (dílčí) činnost a předají řízení příkazu bezprostředně následujícímu za příkazem, který podprogram vyvolal 2002 4
Historie programovacích jazyků
Vývoj programovacích jazyků Vývoj programovacích jazyků určovaly a určují mnohé faktory; k nejzávažnějším z nich pravděpodobně patří: vývoj technických prostředků vývoj metod strojového překladu jazyků vývoj metod programování stále širší oblasti využívání počítačů 2002 6
Strojový jazyk V prvním období existence počítačů zastával roli programovacího jazyka výhradně strojový kód, nazývaný proto také strojový jazyk. Vyjadřovacími prostředky strojového jazyka jsou instrukce. Jejich sémantika je definována technickými prvky počítače. Nedostatky: závislost na konkrétním typu počítače velmi nízká úroveň popisovaných akcí pro člověka nepohodlný číselný zápis instrukcí. V současné době je používání strojového jazyka jako nástroje programování zcela ojedinělé. 2002 7
Jazyky symbolických instrukcí Prvním krokem ve vývoji programovacích jazyků byla náhrada numericky kódované informace instrukcí strojového jazyka informací symbolickou. Vzniká tak důležitá třída programovacích jazyků - jazyky symbolických instrukcí. Překlad (kompilace) - počítačem realizovaná transformace určitého textu na text reprezentující program ve strojovém jazyce. Assembler - překladač jazyka symbolických instrukcí. Nevýhody: závislost na konkrétním typu počítače Výhody: rychlost překladu a zpracování přeloženého programu možnost programování na elementárních úrovních, která je v některých případech nepostradatelná a ve vyšším programovacím jazyce nedostupná (hodně se používá při vytváření programů operačního systému) 2002 8
Vyšší programovací jazyky Další vývoj směrem k vyšším programovacím jazykům sledoval dva cíle: odstranit strojovou závislost jazyků, vyžadující od programátora detailní znalosti strojového jazyka a znemožňující použití programů vypracovaných pro jeden typ počítače na počítači jiného typu poskytnout programátorům takové prostředky pro popis algoritmů, které odrážejí povahu řešených problémů, a nikoliv technickou realizaci výpočetních procesů na počítači 2002 9
Fortran Zahájil éru skutečných vyšších programovacích jazyků Ve své první podobě byl Fortran opravdu snadno naučitelným jazykem vedoucím k maximálně efektivnímu programu Programování přestalo být výsostnou doménu skupiny úzce specializovaných odborníků Fortran byl však původně jazykem určeným pro vědeckotechnické výpočty, proto nemohl vyřešit úplně všechno Pro vědeckotechnické výpočty se používá dodnes (Digital Fortran Compaq) 2002 10
Algol První programovací jazyk, který poskytoval ucelenou a jednotnou množinu jazykových prostředků pro popis algoritmů Byl to první programovací jazyk, který obsahoval explicitní řídící příkazy pro reprezentaci posloupnosti příkazů, iteraci a výběr alternativ Počátky strukturovaného programování Značná složitost a obtíže spojené s jeho zvládnutím i implementací Malé rozšíření Řada myšlenek, které se zde objevily poprvé, se uplatnila při koncipování jazyků široce používaných v praxi 2002 11
COBOL Jazyk Cobol byl vyvinut společným úsilím výrobců a uživatelů počítačů ve spolupráci s ministerstvem obrany USA. Ve dnech 28. - 29. 5. 1959 se konala konference, jejímž cílem bylo uvážit různé aspekty zavedení společného jazyka pro programování elektronických počítačů. Konference rozhodla o zahájení tohoto projektu s tím, že jazyk byl měl umožňovat sestavení programů v minimálním čase s minimálním programovacím úsilím zápis programů v jazyce blízkém angličtině snadný převod programů na nové typy počítačů úplnou dokumentaci programu 2002 12
Lisp V roce 1960, kdy vznikl COBOL-60, také vznikl na MIT Lisp, první jazyk zcela nového typu. Je to tzv. funkcionální jazyk, který používá jako jediné řídící struktury funkce a jejich skládání. Přinesl i nové pojmy v oblasti rekurzivních datových struktur a stal se základem programů pro symbolické manipulace. AutoLisp programování v AutoCADu 2002 13
BASIC V původní podobě neobsahoval podprogramy v dnešním slova smyslu Nerozlišoval typy číselných proměnných K jeho popularitě přispěla jednoduchost možnost interaktivní práce snadná implementace na mikropočítačích 2002 14
PASCAL Navazoval na ALGOL Navržen profesorem Niklausem Wirthem (Eidgenoessische Technische Hochschule Zurich) v roce 1971 pro potřeby výuky programování. Dnes má Pascal ve světě nejen dominantní postavení při výuce programování, ale velmi se používá i pro běžné programování. Konečný tvar normy jazyka byl vydán v 80. letech pod označením ISO 7105. 2002 15
"Nebuď Béčko, uč se Céčko" Jazyk C
Jazyk C Vyvíjel se společně s OS UNIX C-jazyk se v prapůvodní podobě nazýval B-jazyk (Thomson, Ritchie na PDP-7, 1970) C-jazyk je unikátní, neboť je jakési střední úrovně. Není to jazyk vysoké úrovně jako BASIC nebo PASCAL, Není to však ani jazyk nízké úrovně jako assembler. Jazyk C může pracovat na úrovni systému a umožňuje programátorovi napsat téměř všechno, co ho napadne (funkce assembleru). Navíc je C-jazyk dostatečně univerzální i pro aplikační programování (funkce jazyka vyšší úrovně). Největší předností jazyka C je jeho schopnost rozšiřovat sama sebe. Knihovny C-jazyka se snadno rozšiřují co do velikosti a je snadné napsat novou funkci, jakmile ji potřebuji. 2002 17
Úvod Jazyk C je obvykle považován za světově nejdůležitější profesionální programovací jazyk. Je bránou ke dvěma dalším celosvětovým profesionálním programovacím jazykům: C++ : vystavěn na C Java : vystavěna na C++ Jazyk C je tak základem veškerého moderního programování a znalost C je základem pro úspěšné vytváření vysoce výkonného a kvalitního softwaru. Původně byl jazyk C používán převážně pro vytváření systémového softwaru (OS, překladače, editory). Dnes je jazyk C používán programátory pro téměř libovolné programovací úlohy. 2002 18
C versus C++ C++ je rozšířenou verzí C, která byla vytvořena pro podporu objektově orientovaného programování (OOP). C++ obsahuje a podporuje úplný jazyk C, a navíc má sadu objektově orientovaných rozšíření (C++ je nadstavbou C). Jelikož je C++ vystavěn na základech C, není možné se učit C++ bez znalosti C. 2002 19
ANSI C (1) Dnešní oficiální standard je tzv. ANSI C z roku 1990 Jeho součástí je i přesná specifikace množiny knihovních funkcí a hlavičkových souborů (.H), které musí každá implementace ANSI C kompilátoru obsahovat Této normě by měla vyhovovat naprostá většina dnešních překladačů a další text popisuje právě ANSI C. Výhoda ANSI C: Program napsaný podle tohoto standardu a pouze s využitím knihovních funkcí (v ANSI C specifikovaných) je téměř 100% přenositelný na libovolný počítač pod libovolný operační systém. 2002 20
ANSI C (2) V roce 2001 byly vydány zatím poslední opravy normy pro jazyk C ISO/IEC 9899:1999/Cor. 1:200 (E) Nejdůležitější změny: Součástí jazyka se staly nástroje a knihovny pro práci s vícebajtovými znaky a znaky v kódování UNICODE Odstraněno pravidlo implicitní int Přibyly nové celočíselné typy Součástí jazyka se staly nástroje pro práci s komplexními čísly Jednořádkový komentář, který začíná dvojicí znaků // a končí na řádku atd. Překladače zřejmě nějakou dobu nebudou plně respektovat tyto změny (budou hlásit třeba varování místo chyby) CHIP 9/02 září 2002 2002 21
Způsob zpracování programu (1) Základní zpracování programu v C probíhá několika fázemi schématicky vyjádřenými následujícím obrázkem:.h.lib ladění Editor Preprocessor Compiler Linker Debugger.C.OBJ.EXE.LIS spuštění 2002 22
Způsob zpracování programu (2) Editor Pomocí něj se vytváří a opravuje zdrojový (.c) soubor (source file) Preprocessor Je to součást překladače, která předzpracovává (upravuje) zdrojový soubor tak, aby měl překladač snadnější práci. Např. vynechává komentáře, zajišťuje správné vložení hlavičkových (.h) souborů, rozvoj maker, atd. Výsledky své činnosti předává "svému nadřízenému" kompilátoru. 2002 23
Způsob zpracování programu (3) Compiler Nazývaný též překladač nebo počeštěně kompilátor. Provádí překlad zdrojového souboru do relativního (objektového) kódu počítače vzniká.obj soubor (object file). Relativní kód (oficiálně jazyk relativních adres) je téměř hotový program. Slovo relativní znamená, že adresy proměnnách nebo funkcí ještě nejsou vůbec známy a jsou tedy v.obj souboru zapsány relativně. Vedlejší produkt překladače je protokol o překladu (.LIS), ve kterém je uložena informace o chybách nalezených překladačem (většinou se vytváří pouze na speciální přání uživatele). 2002 24
Způsob zpracování programu (4) Linker Neboli sestavovací program přidělí relativnímu kódu (resp. jeho relativním adresám) absolutní adresy a provede všechny odkazy (najde adresy) na dosud neznámé identifikátory (např. na volané knihovní funkce uložené v souborech.lib). Výsledkem práce linkeru je přímo spustitelný program (.EXE) (executable file). Debugger Jeho český překlad je "odvšivovač", ale spíše se používá pojem ladicí program. Slouží pro ladění, neboli nalézání chyb, které nastávají při běhu progrmau. Po nalezení chyby se celý cyklus (editor, compiler, linker, debugger) opakuje tak dlouho, až si myslíme, že náš program žádnou chybu neobsahuje. 2002 25
Překladače jazyka C Unix (Linux) integrovaný překladač jazyka C (gcc) Windows Samotné překladače - obsahují pouze preprocesor, překladač se obvykle volá z příkazové řádky V textovém editoru (externím) vytvoříme zdrojový kód. Překladač zkontroluje správnost, provede překlad a v případě úspěchu vyprodukuje relativní kód a následně spustitelný.exe Integrovaná prostředí (IDE) editor, překladač, linker, debugger, komfortní ovládání Zdrojový kód se vytváří přímo v IDE, překlad se provádí volbou z hlavní nabídky, linkování je provedeno automaticky, prostředí podporuje projekty (programy složené z většího množství zdrojových kódů), apod. 2002 26
Volně dostupné překladače a IDE - UNIX Projekt GNU (Gnu s Not Unix) kompletní softwarový systém kompatibilní s UNIXem, zdarma (např. LaTeX) GNU Compiler Collection (gcc) standardní součást UNIXu gcc program.c provede se překlad a vytvoří se spustitelný soubor a.out (příp. a.exe) Bližší informace o překladači http://gcc.gnu.org 2002 27
Volně dostupné překladače a IDE - Windows MinGW http://www.mingw.org ovládání z příkazové řádky DJGPP + RHIDE http://www.delorie.com/djgpp - překladač lze doplnit o integrované prostředí RHIDE (obdoba Borlandu), umí zvýrazňovat syntaxi, projekty, debugger Borland C++ - uznávaná klasika. Borland C++ 5.5 je k dispozici zdarma (řádkový překladač, bez IDE) http://www.borland.cz lcc-win32 integrované prostředí včetně editoru, snadná instalace http://www.cs.virginia.edu/~lcc-win32 Dev-C++ - asi jeden z nejlepších bezplatných produktů, komplexní IDE, podpůrné nástroje http://www.bloodshed.net/devcpp.html 2002 28
Komerční systémy Borland C++ Builder Komplexní produkt pro vývoj okenních aplikací, kzerý je založen na programovacím jazyku C++. Obsahuje výkonný, osvědčený překladač, kvalitní debugger a řadu dalších podpůrných nástrojů. C++ Builder se řadí do kategorie tzv. nástrojů RAD (Rapid Application Development), jejichž princip spočívá v tom, že značná část návrhu aplikace se vytváří pomocí vizuálních nástrojů (není nutné psát tolik zdrojového kódu) http://www.borland.cz zkušební verze na 2 měsíce Microsoft Visual C++ Další velmi kvalitní a rozsáhlé vývojové prostředí http://msdn.microsoft.com/vstudio 2002 29
C++ Builder Postaven na objektově orientované architektuře Vizuální programování (základní pojmy): formulář komponenty objekty hlavní okno "Form1" základní parametry komponent: prvky, které můžeme umístit na formulář (tlačítka, nápisy, dialogy, atd.), jsou to základní stavební prvky aplikace» vlastnosti (velikost, barva, font, styl, okraj, viditelnost, atd.)» události (co se v systému stane při jejich použití) reprezentují komponenty Object Inspector nástroj pro manipulaci s komponentami Vlastní programování v podstatě se programuje jen vlastní činnost komponent výkonný kód se píše v první řadě do funkcí které ošetřují jednotlivé události (event handlers) - událostmi řízené programování Běh programu = úvodní inicializace a následné čekání na událost 2002 30
Kdo chce C používat, překladač si najde 2002 31
Prvky programu v jazyku C (1) Všechny programy v C se skládají z jedné nebo více funkcí Každá funkce obsahuje jeden nebo více příkazů Funkce: pojmenované podprogramy, které lze volat z jiných částí programu základní stavební kameny jazyka C Příkazy: určují činnost, kterou má program provést provádějí operace všechny příkazy končí středníkem 2002 32
Prvky programu v jazyku C (2) Obecný formát funkce v jazyku C: návratový-typ jméno-funkce (seznam-parametrů) { posloupnost příkazů } návratový-typ: určuje typ dat vracených funkcí jméno-funkce: název funkce velká a malá písmena anglické abecedy, číslice 0-9, podtržítko nesmí začínat číslicí C rozlišuje malá a velká písmena (prom Prom PROM) seznam-parametrů: parametry předávají informace funkci posloupnost-příkazů: jeden nebo více příkazů 2002 33
Prvky programu v jazyku C (3) Program může mít několik funkcí jediná, kterou musí mít je main(). Funkce main() je místem, kde začíná provádění programu Další obvyklou součástí většiny programů v C je hlavičkový soubor. Obsahuje informace o standardních knihovních funkcích (např. knihovní funkce printf()) Hlavičkové soubory mají příponu.h Nejčastěji používaný hlavičkový soubor je stdio.h #include <stdio.h> #include je direktiva preprocesoru, není to příkaz, tedy nekončí středníkem 2002 34
Příklad nejjednoduššího programu #include <stdio.h> int main(void) { printf("toto je kratky program v C"); return 0; } Jiný příklad: #include <stdio.h> int main(void) { printf("toto je "); printf("jiny"); printf(" program v C"); return 0; } 2002 35
Vytvoření a překlad programu Postup vytváření a překladu programu závisí na překladači a operačním systému Na PC jsou nejznámější integrovaná vývojová prostředí: Microsoft Visual C++ Borland C++ Builder Základní postup 1. Vytvořit program pomocí editoru 2. Přeložit program 3. Spustit program Téměř všechny moderní překladače jazyka C jsou zároveň také překladače jazyka C++. Náš program musí být přeložen jako program v jazyku C (přípona.c), ne jako program v C++ (přípona.cpp). 2002 36
Identifikátory Jazyk C je case sensitive jazyk (rozlišuje malá a velká písmena). prom Prom PROM jsou tři různé identifikátory! Klíčová slova C (např. if, while, register, ) musí být psána malými písmeny. Jsou-li zapsána velkými nebo kombinací malých a velkých písmen, berou se jako identifikátory. C dovoluje u identifikátorů používat znak podtržítko "_": _prom nepoužívat, znamená to systémový identifikátor prom_ prom_ používat často, zpřehledňuje text nepoužívat, na konci se často přehlédne Délka identifikátoru není omezena, ale ANSI C rozeznává obecně pouze prvních 31 znaků (32. další jsou bezvýznamné) 2002 37
Komentáře Přestože jsou velmi často opomíjeny, jsou důležitou součástí programu: zpřehledňují, někdy na první pohled dost nepochopitelný, program slouží k tomu, aby se ve vašem programu vyznal někdo cizí nebo i vy sami, když se k němu vrátíte třeba za několik let doporučuje se komentovat své programy během vytváření, a ne až po odladění ( Až na to někdy zbude čas. ) /* toto je komentar */ /* viceradkovy komentar */ x=3*a+b; /* popis prikazu */ 2002 38
Extrémní příklad programu v jazyku C #include <stdio.h> main(t,_,a) char *a; {return!0<t?t<3?main(-79,- 13,a+main(-87,1-_, main(-86, 0, a+1 )+a)):1,t<_?main(t+1, _, a ):3,main ( -94, -27+t, a )&&t == 2?_<13?main ( 2, _+1, "%s %d %d\n" ):9:16:t<0?t<- 72?main(_, t,"@n'+,#'/*{}w+/w#cdnr/+,{}r/*de}+,/*{*+,/w{%+,/w#q#n+, /#{l,+,/n{n+\,/+#n+,/#;#q#n+,/+k#;*+,/'r :'d*'3,}{w+k w'k:'+}e#';dq#'l q#'+d'k#!/\ +k#;q#'r}ekk#}w'r}ekk{nl]'/#;#q#n'){)#}w'){){nl]'/+#n';d }rw' i;# ){n\ l]!/n{n#'; r{#w'r nc{nl]'/#{l,+'k {rw' ik{;[{nl]'/w#q#\ n'wk nw' iwk{kk{nl]!/w{%'l##w#' i; :{nl]'/*{q#'ld;r'}{nlwb!/*de}'c \ ;;{nl'- {}rw]'/+,}##'*}#nc,',#nw]'/+kd'+e}+;\ #'rdq#w! nr'/ ') }+}{rl#'{n' ')# }'+}##(!!/") :t<-50?_==*a?putchar(a[31]):main(-65,_,a+1):main((*a == '/')+t,_,a\ +1 ):0<t?main ( 2, 2, "%s"):*a=='/' main(0,main(- 61,*a, "!ek;dc \ i@bk'(q)-[w]*%n+r3#l,{}:\nuwloca-o;m.vpbks,fxntdceghiry"),a+1);} 2002 39