Programování v jazyce C pro chemiky (C2160) 10. Grafická knihovna g2

Podobné dokumenty
Preprocesor a koncepce (větších) programů. Úvod do programování 2 Tomáš Kühr

Algoritmizace a programování

Preprocesor. Karel Richta a kol. katedra počítačů FEL ČVUT v Praze. Karel Richta, Martin Hořeňovský, Aleš Hrabalík, 2016

Operační systémy. Cvičení 3: Programování v C pod Unixem

Koncepce (větších) programů. Základy programování 2 Tomáš Kühr

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

8. lekce Úvod do jazyka C 3. část Základní příkazy jazyka C Miroslav Jílek

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme:

Příkazy preprocesoru - Před překladem kódu překladačem mu předpřipraví kód preprocesor - Preprocesor vypouští nadbytečné (prázdné) mezery a řádky -

Pokročilé programování v jazyce C pro chemiky (C3220) Třídy v C++

Operační systémy. Cvičení 4: Programování v C pod Unixem

Pokročilé programování v jazyce C pro chemiky (C3220) Úvod do jazyka C++

Pokročilé programování v jazyce C pro chemiky (C3220) Vstup a výstup v C++

Lekce 6 IMPLEMENTACE OPERAČNÍHO SYSTÉMU LINUX DO VÝUKY INFORMAČNÍCH TECHNOLOGIÍ JAZYK C

Základy programování (IZP)

Úvod do jazyka C. Ing. Jan Fikejz (KST, FEI) Fakulta elektrotechniky a informatiky Katedra softwarových technologií

6. lekce Úvod do jazyka C knihovny datové typy, definice proměnných základní struktura programu a jeho editace Miroslav Jílek

Programování v jazyce C pro chemiky (C2160) 3. Příkaz switch, příkaz cyklu for, operátory ++ a --, pole

Pokročilé programování v jazyce C pro chemiky (C3220) Operátory new a delete, virtuální metody

Jazyk C Program v jazyku C má následující strukturu: konstanty nebo proměnné musí Jednoduché datové typy: Strukturované datové typy Výrazy operátory

Obsah. Předmluva 13 Zpětná vazba od čtenářů 14 Zdrojové kódy ke knize 15 Errata 15

Úvod do programování. Lekce 1

IUJCE 07/08 Přednáška č. 1

for (i = 0, j = 5; i < 10; i++) { // tělo cyklu }

Základy programování (IZP)

Programovací jazyk C++ Hodina 1

Programovací jazyk C(++) C++ area->vm_mm->locked_vm -= len >> PAGE_SHIFT;

int => unsigned int => long => unsigned long => float => double => long double - tj. bude-li:

Pokročilé programování v jazyce C pro chemiky (C3220) Statické proměnné a metody, šablony v C++

Programování v C++ 1, 1. cvičení

Dílčí příklady použití jazykových konstrukcí v projektu. Jazyk C Příklady. Pravidla překladu v gmake. Zadání

9. lekce Úvod do jazyka C 4. část Funkce, rekurze Editace, kompilace, spuštění Miroslav Jílek

PROGRAMOVÁNÍ V C++ CVIČENÍ

2 Datové typy v jazyce C

Základy programování (IZP)

Správné vytvoření a otevření textového souboru pro čtení a zápis představuje

8 Třídy, objekty, metody, předávání argumentů metod

Pokročilé programování v jazyce C pro chemiky (C3220) Dědičnost tříd v C++

PROMĚNNÉ, KONSTANTY A DATOVÉ TYPY TEORIE DATUM VYTVOŘENÍ: KLÍČOVÁ AKTIVITA: 02 PROGRAMOVÁNÍ 2. ROČNÍK (PRG2) HODINOVÁ DOTACE: 1

IUJCE Přednáška č. 11. další prvky globální proměnné, řízení viditelnosti proměnných, funkcí

Abstraktní datové typy, moduly

Základy programování (IZP)

Algoritmizace a programování

7 Formátovaný výstup, třídy, objekty, pole, chyby v programech

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

Programování v jazyce C pro chemiky (C2160) 4. Textové řetězce, zápis dat do souboru

Základy C++ I. Jan Hnilica Počítačové modelování 18

02. HODINA. 2.1 Typy souborů a objektů. 2.2 Ovládací prvky Label a TextBox

Programovací jazyk Pascal

IUJCE 07/08 Přednáška č. 4. v paměti neexistuje. v paměti existuje

DUM 06 téma: Tvorba makra pomocí VBA

Martin Flusser. Faculty of Nuclear Sciences and Physical Engineering Czech Technical University in Prague. October 17, 2016

Algoritmizace a programování

- dělají se také pomocí #define - podobné (použitím) funkcím - předpřipravená jsou např. v ctype.h. - jak na vlastní makro:

2 Grafický výstup s využitím knihovny

Aplikace Embedded systémů v Mechatronice. Michal Bastl A2/713a

Funkce, podmíněný příkaz if-else, příkaz cyklu for

Algoritmy I. Cvičení č. 2, 3 ALGI 2018/19

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE LEXIKÁLNÍ ANALÝZA

Bitové operátory a bitová pole. Úvod do programování 2 Tomáš Kühr

Čtvrtek 8. prosince. Pascal - opakování základů. Struktura programu:

přetížení operátorů (o)

for (int i = 0; i < sizeof(hodnoty) / sizeof(int); i++) { cout<<hodonoty[i]<< endl; } cin.get(); return 0; }

Programování v jazyce C pro chemiky (C2160) 12. Specifické problémy při vývoji vědeckého softwaru

DSL manuál. Ing. Jan Hranáč. 27. října V této kapitole je stručný průvodce k tvorbě v systému DrdSim a (v

Hotelová škola, Obchodní akademie a Střední průmyslová škola Teplice,Benešovo náměstí 1, příspěvková organizace

Proměnná a její uložení v paměti

Pole a Funkce. Úvod do programování 1 Tomáš Kühr

ZPRO v "C" Ing. Vít Hanousek. verze 0.3

umenugr JEDNOTKA PRO VYTVÁŘENÍ UŽIVATELSKÝCH GRAFICKÝCH MENU Příručka uživatele a programátora

- tzv. standardní vstupní a výstupní proud (input / output stream)

Programování v jazyce C pro chemiky (C2160) 5. Čtení dat ze souboru

Algoritmy I. Cvičení č.1 ALGI 2015/16

Program převod z desítkové na dvojkovou soustavu: /* Prevod desitkove na binarni */ #include <stdio.h>

- jak udělat konstantu long int: L long velka = 78L;

Strukturu lze funkci předat: (pole[i])+j. switch(výraz) velikost ukazatele

Algoritmizace a programování. Ak. rok 2012/2013 vbp 1. ze 44

Inovace bakalářského studijního oboru Aplikovaná chemie

C2110 Operační systém UNIX a základy programování

Pokročilé programování v jazyce C pro chemiky (C3220) Pokročilá témata jazyka C++

Programovací jazyk C(++) C++ area->vm_mm->locked_vm -= len >> PAGE_SHIFT;

. Grafika a plovoucí prostředí. Zpracování textů na počítači. Ing. Pavel Haluza, Ph.D. ústav informatiky PEF MENDELU v Brně haluza@mendelu.

Polymorfismus. Časová náročnost lekce: 3 hodiny Datum ukončení a splnění lekce: 30.března

Regulární výrazy. Vzory

EVROPSKÝ SOCIÁLNÍ FOND. Úvod do PHP PRAHA & EU INVESTUJEME DO VAŠÍ BUDOUCNOSTI

IUJCE 07/08 Přednáška č. 6

Odvozené a strukturované typy dat

Výčtový typ strana 67

VÝUKOVÝ MATERIÁL. Bratislavská 2166, Varnsdorf, IČO: tel Číslo projektu

DUM 07 téma: Proměnné, konstanty a pohyb po buňkách ve VBA

Čtvrtek 3. listopadu. Makra v Excelu. Obecná definice makra: Spouštění makra: Druhy maker, způsoby tvorby a jejich ukládání

Úvod do programování. Lekce 3

Př. další použití pointerů

Základy algoritmizace a programování

1. lekce. do souboru main.c uložíme následující kód a pomocí F9 ho zkompilujeme a spustíme: Ukončí program. Nula znamená, že vše proběhlo bez chyby.

Výrazy a operátory. Operátory Unární - unární a unární + Např.: a +b

MIKROPROCESORY PRO VÝKONOVÉ SYSTÉMY

C++ přetěžování funkcí a operátorů. Jan Hnilica Počítačové modelování 19

Transkript:

Programování v jazyce C pro chemiky (C2160) 10. Grafická knihovna g2

Preprocesor jazyka C Zdrojový text programu je před kompilací zpracován preprocesorem, který provede vložení externích souborů, vynechání částí kódu, substituci vybraných slov, odstranění komentářů apod. Soubor se po zpracování preprocesorem nikde neukládá, ale je přímo zaslán překladači jazyka C Chceme-li spustit preprocesor samostatně a prohlédnout si zpracovaný soubor spustíme kompilátor s parametrem -E gcc -E vstupni_soubor -o vystupni_soubor (viz. man gcc) nebo spustíme přímo preprocesor: cpp vstupni_soubor vystupni_soubor (viz. man cpp) Činnost preprocesoru je řízena direktivami preprocesoru, každá direktiva preprocesoru začíná znakem # (tzv. hash nebo hashmark), direktivy mají zcela odlišnou syntaxi než příkazy jazyka C, (např. se neukončují středníkem) Další informace: http://en.wikipedia.org/wiki/c_preprocessor http://www.cprogramming.com/tutorial/cpreprocessor.html 2

Direktiva vložení souboru #include Direktiva #include slouží k vložení souboru Jméno souboru píšeme v lomených závorkách nebo v uvozovkách: #include <stdio.h> #include "../include/prog.h" Je-li jméno souboru uvedeno v lomených závorkách, je vkládaný soubor hledán v standardních systémových adresářích (zpravidla /usr/include) Je-li jméno souboru uvedeno v uvozovkách, hledá se soubor v adresáři ve kterém se nachází volající soubor Pokud specifikujeme celou cestu k souboru, nezáleží na tom, kterou metodu zápisu použijeme (obvykle použijeme uvozovky) Direktivu #include používáme nejčastěji pro vkládání tzv. hlavičkových souborů, které obsahují deklarace funkcí a globálních proměnných Hlavičkové soubory mívají obvykle koncovku.h 3

Direktiva definující makro #define Direktiva #define slouží k definování tzv. makra #define JMENO_MAKRA libovolny text rozvoje Direktiva způsobí, že preprocesor nahradí každý výskyt slova JMENO_MAKRA textem libovolny text rozvoje Nahrazovaný text může být libovolně dlouhý včetně mezer; pokud pokračuje na dalším řádku musí být na konci řádku zpětné lomítko #define DLOUHE_MAKRO Tady je nejaky text, který \ se nevejde na jeden radek Substituce definovaná makrem se začne uplatňovat až od řádku na němž je makro definováno Platnost makra lze zrušit direktivou #undefine, od toho ukamžiku nebude výskyt JMENO_MAKRA ničím substituován #undefine JMENO_MAKRA Direktivy #define zpravidla zapisujeme na začátek programu a jejich platnost trvá od daného místa až do konce souboru 4

Symbolické konstanty Direktiva #define se často používá ke specifikaci tzv. symbolických konstant, kdy nahrazovaným textem je číslo, znak nebo řetězec: #define MAX_ATOMS 1000 #define PROGRAM_NAME "Muj programek" #define SEPARATOR '=' #define NUMBER_PI 3.14159 #define DOUBLE_PI (2 * 3.14159) Jména symbolických konstant zpravidla zapisujeme velkými písmeny Symbolické konstanty slouží ke zpřehlednění k programu, navíc umožňují snadnou změnu jejich hodnoty na jednom místě (v definici symbolické konstanty) Pokud je to možné, dáváme v praxi přednost použití globálních proměnných místo symbolických konstant (většinou je pak definujeme jako konstantní pomocí const), např: const char[] program_name = "Muj programek"; Symbolické konstanty používáme tam, kde nelze proměnnou použít (např. při specifikaci velikosti pole, v příkazu switch) nebo by použití proměnné vedlo ke zpomalení programu 5

Direktivy podmíněného překladu Direktiva #if zajistí, že určitá část programu bude ponechána ve zdrojovém souboru jen při splnění podmínky Direktiva #if se často kombinuje s direktivou #defined(jmeno_makra) která vrací pravdivou hodnotu pokud bylo makro JMENO_MAKRA dříve definováno pomocí #define; existuje též zkrácená forma #ifdef a #ifndef Direktiva #error zajistí vypsání textové zprávy: #error Tady je nejaky text který se vypise na vystup #if 0 // Zde muze byt nejaky kod v jazyce C, ktery chceme vynechat // Zmenime li 0 na 1, pak se kod opet bude prekladat #endif #define WIN32 #ifdef WIN32 #include <windows.h> #else #include <unistd.h> #endif 6

Knihovny Knihovny jsou části programového kódu (především funkce) vytvořené jinými programátory a použitelné v dalších programech Knihovna je tvořena souborem (pod UNIXem *.a, *.so, pod Windows *.lib, *.dll), soubory knihoven bývají zpravidla uloženy ve specifickém adresáři (v UNIXu především /lib, /usr/lib, pod Windows především C:\windows\system32) Pod UNIXem začíná název souboru knihovny vždy slovem lib, pak následuje jméno knihovny, koncovka (.a nebo.so) a případně specifikace verze (např.: libc.a, libm.so, libgl.so.1.0) Ke knihovnám jsou dodávány hlavičkové soubory (*.h) které obsahují deklarace funkcí obsažených v knihovně, k jedné knihovně může být dodáváno několik hlavičkových souborů, hlavičkové soubory knihoven se pod UNIXem nachází především v adresáři /usr/include a jeho podadresářích Při použití knihovny musíme vložit hlavičkové soubory pomocí direktivy #include a při překladu specifikovat jméno knihovny Více informací: http://en.wikipedia.org/wiki/library_(computing) 7

Standardní knihovna jazyka C Součást všech překladačů jazyka C je standardní knihovna jazyka C, která obsahuje funkce pro práci se soubory, řetězci a podobně Standardní knihovna se automaticky připojí ke každému programu, není potřeba ji specifikovat, musíme však vždy na začátek programu vložit příslušný hlavičkový soubor, např.: assert.h - obsahuje makro assert() pro ladění programu ctype.h - práce se znaky errno.h - číselné kódy chyb float.h - makra definující max. a min. pro reálná čísla a pod. limits.h - makra definující max. a min. pro celá čísla a pod. stdio.h - souborový a standardní vstup a výstup stdlib.h - základní knihovní funkce, alokace paměti a pod. string.h - funkce pro práci s řetězci time.h - funkce pro práci s časem Více informací: http://en.wikipedia.org/wiki/c_library K překladačům jazyka C je také standardně dodávána matematická knihovna, hlavičkový soubor pro matematickou knihovnu je math.h Pro použití funkcí matematické knihovny musíme vložit hlavičkový soubor a při kompilaci použít parametr -lm (l je zde malé L) Seznam matematických funkcí: 8 http://en.wikipedia.org/wiki/c_mathematical_functions

Make Nástroj make slouží k automatizovanému překladu programů Překlad se řídí instrukcemi zapsanými v souboru Makefile nebo makefile Jméno cíle (tj. jméno spustitelného souboru) zakončujeme dvojtečkou, pak uvádáme jména závislých souborů oddělených mezerou - jedná se zpravidla o zdrojový soubor s programem Dále uvádíme příkazy, každý na samostatném řádku, na začátku řádku musí být znak tabulátoru Překlad spustíme příkazem make jmeno_cile, spustíme-li make bez uvedení názvu cíle provede se první cíl Více informací: http://en.wikipedia.org/wiki/make_(software) http://frank.mtsu.edu/~csdept/facilitiesandresources/make.htm # Soubor muze obsahovat komentare, ktere zacinaji znakem hash # Budeme kompilovat soubor helloworld.c a vytvorime # spustitelny soubor helloworld helloworld: helloworld.c gcc o helloworld helloworld.c Zde musí být tabulátor, ne mezery! 9

Parametry překladače gcc Pro překlad programu v jazyce C používáme pod UNIXem zpravidla překladač gcc: gcc -o spustitelny_soubor zdrojovy_soubor.c Při překladu lze navíc použít následující parametry: -Wall vypisuje upozornění (warnings) na možné problémy v programu -pedantic vypisuje upozornění požadovaná standardem ISO C -std=standard specifikuje standard jazyka C ve kterém je program napsán (např.: -std=c89, -std=c99, -std=c11) -Idir (I je zde velké i) přidá adresář dir do seznamu adresářů ve kterých se hledají standardní hlavičkové soubory (tj. soubory vložené vložené #include <file.h> nikoliv #include "file.h") -Ldir přidá adresář dir do seznamu adresářů ve kterých se hledají knihovny -lname (l je zde malé L) přidá knihovnu, knihovna se musí nacházet v systémových adresářích nebo adresáři specifikovaném -L, soubor s knihovnou se musí jmenovat libname.a, libname.so Při vývoji programů je vhodné používat parametry -std=c99 -Wall a -pedantic které upozorní na problémy v programu Další užitečné parametry jsou -o, -c, -D, -g, -s, -O (více: man gcc) 10

Knihovna g2 Knihovna g2 umožňuje tvorbu jednoduchých grafických programů (http://sourceforge.net/projects/g2) Při kompilaci musíme specifikovat použití knihoven pomocí parametru -l (l je zde malé L). Kromě knihovny g2 je potřeba specifikovat knihovu gd (se kterou g2 spolupracuje) a pod UNIXem navíc musíme přidat knihovnu X11 a také matematickou knihovnu, např.: -lg2 -lgd -lx11 -lm Příkazový řádek bude vypadat např. následovně: gcc -o spustitelny_soubor zdrojovy_soubor.c -std=c99 -Wall -pedantic -lg2 -lgd -lx11 -lm 11

Knihovna g2 Pro základní práci s knihovnou g2 v UNIXovém prostředí je potřeba vložit hlavičkové soubory g2.h a g2_x11.h Funkcí g2_open_x11() otevřeme okno do něhož budeme kreslit; funkce přijímá dva parametry (šířku a výšku okna v pixelech), vrací číslo identifikující výstupní zařízení (tj. okno) int g2_open_x11(int width, int height) Okno zavřeme funkcí g2_close() void g2_close(int win) Dokumentace: http://ncbr.chemi.muni.cz/~martinp/g2/modules.html #include <stdio.h> #include <g2.h> #include <g2_x11.h> int main(int argc, char *argv[]) { int win = 0; win = g2_open_x11(400, 300); // Otevreme okno g2_line(win, 10, 10, 390, 290); // Kreslime caru getchar(); // Cekame na vstup znaku z klavesnice g2_close(win); // Zavreme okno return 0; } 12

Knihovna g2 funkce pro kreslení void g2_line(int win, double x1, double y1, double x2, double y2) Kreslí čáru z bodu x1, y1 do bodu x2, y2 Parametr win je identifikátor okna (tj. návratová hodnota funkce g2_open_x11()) Parametry x1, y1, x2, y2 jsou souřadnice v pixelech (obrazových bodech), při kreslení do okna jsou vždy celočíselné (i když jsou typu double), levý dolní roh okna má souřadnice 0, 0 void g2_set_line_width(int win, double w) Nastaví šířku čáry v pixelech, kterou budou používat kreslící funkce void g2_rectangle(int win, double x1, double y1, double x2, double y2) Kreslí obdélník s protilehlými rohy v pozicích x1, y1 a x2, y2 void g2_filled_rectangle(int win, double x1, double y1, double x2, double y2) Kreslí vyplněný obdélník 13

Knihovna g2 funkce pro kreslení void g2_circle(int win, double x, double y, double r) void g2_filled_circle(int win, double x, double y, double r) Kreslí kružnici se středem v x, y a poloměrem r void g2_ellipse(int win, double x, double y, double r1, double r2) void g2_filled_ellipse(int win, double x, double y, double r1, double r2) Kreslí elipsu se středem v x, y a délkou hlavní a vedlejší poloosy r1 a r2 void g2_arc(int win, double x, double y, double r1, double r2, double a1, double, a2) void g2_filled_arc(int win, double x, double y, double r1, double r2, double a1, double, a2) Kreslí eliptickou výseč se středem elipsy v x, y, délkou hlavní a vedlejší poloosy r1 a r2, počátečním úhlem a1 a koncovým úhlem a2 (úhly se udávají ve stupních tj. v rozsahu 0 až 360) Funkce obsahující v názvu filled kreslí vždy vyplněný obrazec 14

Knihovna g2 funkce pro kreslení void g2_set_font_size(int win, double size) Nastaví velikost fontu pro kreslení textu (velikost je v pixelech) void g2_string(int win, double x, double y, const char *text) Kreslí text řetězce text na pozici x,y void g2_pen(int win, int color) Nastaví aktuální barvu kterou pro kreslení kterou použijí všechny kreslící funkce; hodnoty 0 až 26 reprezentují předdefinované barvy (např. 0 bílá, 1 černá, 3 modrá, 7 zelená, 19 červená, 25 žlutá), dále lze definovat uživatelské barvy pomocí g2_ink() int g2_ink(int win, double red, double green, double blue) Vytvoří uživatelsky definovanou barvu na základě hodnot intenzity červené, zelené a modré (hodnoty v rozsahu 0.0 až 1.0), vrací číslo identifikující barvu, které lze použít ve funkci g2_pen() 15

Knihovna g2 praktická práce s barvami Pokud používáme uživatelsky definované barvy, musíme nejdříve barvu vytvořit funkcí g2_ink() a potom ji nastavit funkcí g2_pen(), pak kreslíme objekty příslušnou barvou Můžeme použít dva přístupy: pro každou barvu definujeme proměnnou, uložíme do ní číslo barvy vytvořené funkcí g2_ink() a potom tyto proměnné používáme při volání g2_pen(): int color1 = 0, color2 = 0; color1 = g2_ink(win, 0.5, 1.0, 1.0); color2 = g2_ink(win, 1.0, 0.4, 0.8); g2_pen(win, color1); // Nasleduji kreslici funkce, kresli se barvou color1 g2_pen(win, color2); // Kresleni barvou color2 případně můžeme g2_ink() volat přímo z g2_pen(): g2_pen(win, g2_ink(win, 0.5, 1.0, 1.0)); // Nasleduji kreslici funkce, ktere budou // kreslit prislusnou barvou 16

Dodržujte následující pravidla Pro překlad programů používejte nástroj make Vyplněné objekty vykreslujte s tloušťkou čáry 0, jinak by byl objekt větší o polovinu tloušťky čáry Při použití operátoru dělení si ujasněte zda-li dochází k celočíselnému nebo reálnéme dělení 17

Úlohy část 1 1. Vytvořte program který pomocí knihovny g2 nakreslí obrazce tak jak je uvedeno na prvním obrázku. 3 body 2. Vytvořte program, který nakreslí kruh se střídajícími se modrými a červenými segmenty (viz. druhý obrázek). Počet segmentů bude specifikován na příkazovém řádku. 1 bod 3. Vytvořte program, který nakreslí segmenty se střídající se modrou a červenou barvou (viz. třetí obrázek). Celkový počet segmentů a počet segmentů na jednom řádku bude specifikován na příkazovém řádku (obrázek dole je tvořen 220 segmenty, 30 na řádku). 1 bod 18