Úvod do jazyka c
DESCRIPTION
Úvod do jazyka C. Algoritmizácia úloh. Štruktúry. Štruktúra je zápis viacerých položiek v jednom logickom prvku. Využíva sa najmä pre zápis rozmanitých druhov údajov. Štruktúry - základné pojmy. - PowerPoint PPT PresentationTRANSCRIPT
Úvod do jazyka C
Štruktúra je zápis viacerých položiek v jednom logickom prvku.
Využíva sa najmä pre zápis rozmanitých druhov údajov
Štruktúry
3
Štruktúry - základné pojmy
Štruktúra je súhrn jednej alebo viacerých premenných aj rôznych typov (vrátane ďalších štruktúr), ktoré sú združené pod jedným názvom.
Umožňuje pracovať so súvisiacimi dátami ako s celkom. Prístup k položkám štruktúry sa zadáva názvom štruktúry a názvom položky, oddelených bodkou.
4
Základná definícia štruktúry
Obecná definícia
struct {
položky;
} meno;
Existuje päť spôsobov definície štruktúry.
5
Definícia štruktúry 3
Oddelenie definície štruktúry od definícií premenných
struct udaje {
int vykon_motora;
int maximalna_rychlost;
float spotreba;
};
struct udaje Octavia;
struct udaje Fabia, Roomster;
Definícia štruktúry
Definícia premenných
6
Definícia štruktúry 1
Triviálny spôsob.
Vytvorená štruktúra nie je pomenovaná, z toho vyplýva obmedzená možnosť použitia premenných
struct {
int vykon_motora;
int maximalna_rychlost;
float spotreba;
} Octavia, Fabia, Roomster;
7
Definícia štruktúry 2
Modifikácia základného spôsobu.
Štruktúra je pomenovaná a je ju možné použiť v programe.
struct udaje {
int vykon_motora;
int maximalna_rychlost;
float spotreba;
} Octavia, Fabia, Roomster;
8
Definícia štruktúry 4
Definícia pomocou príkazu typedef.
Štruktúra pomenovaná nie je, ale nový typ áno.
typedef struct {
int vykon_motora;
int maximalna_rychlost;
float spotreba;
} UDAJE;
UDAJE Octavia, Fabia, Roomster;
Definícia typu štruktúry
Definícia premenných
9
Definícia štruktúry 5
Pomenovanie štruktúry aj nového typu struktúry.
typedef struct udaje {
int vykon_motora;
int maximalna_rychlost;
float spotreba;
} UDAJE;
UDAJE Octavia, Fabia, Roomster;
Definícia premenných
Definícia typu štruktúry
10
Odporúčania
Prax ukazuje, že výhodnejšie je používať dva prvé dva typy. Kľúčové slovo struct používame len raz a ďalej sa pracuje už s novým typom.
Štruktúry sa často používajú v kombinácii s poľom. Väčšinou sa používa pole štruktúr.
Na rozdiel od poľa, je možné pracovať s celou štruktúrou naraz, napríklad skopírovať obsah jednej štruktúry do druhej len jedným priraďovacím príkazom.
11
Prístup k prvkom štruktúry
K jednotlivým prvkom štruktúry sa pristupuje pomocou bodkovej notácie.
Príklad:
Octavia.rychlost = 188;
Fabia.rychlost = 168;
Roomster = Octavia;
Práca s celou štruktúrou
Prístup k poľu štruktúr
12
#include <stdio.h>
typedef struct { int vykon, rychlost; float spotreba;} UDAJE;
Prvky štruktúry - príklad
Zadanie
Vytvoriť štruktúru, pomocou ktorej bude možné evidovať údaje o type automobilu, jeho výkone, maximálnej rýchlosti a spotrebe paliva
Definovanie typu
13
Prvky štruktúrypríklad
typedef struct { int vykon, rychlost; float spotreba; } UDAJE;
int main() { UDAJE Octavia,Fabia,Roomster; Octavia.rychlost = 188; Octavia.spotreba = 5.5; Fabia.rychlost = 168; Fabia.spotreba = 6.1; Roomster = Octavia; printf(" Octavia ma rychlost: %d a spotrebu: %.1f \n", Octavia.rychlost, Octavia.spotreba); printf(" Fabia ma rychlost: %d a spotrebu: %.1f \n", Fabia.rychlost, Fabia.spotreba); printf(" Roomster ma rychlost: %d a spotrebu: %.1f \n", Roomster.rychlost, Roomster.spotreba); system("PAUSE"); return 0;}
14
Štruktúra v inej štruktúre
V praktických príkladoch je častý prípad, keď potrebujeme mať ako prvok štruktúry inú štruktúru.
Napríklad v jednej štruktúre budú údaje o bydlisku osoby a v nasledujúcej štruktúre budú údaje o jeho mene, priezvisku, plate,...
Štruktúra, ktorá je prvkom inej štruktúry sa označuje ako vnorená štruktúra.
15
Štruktúra v inej štruktúre príklad (deklarácie)
#include <stdio.h>
typedef struct { char ulica[30]; char cislo[10]; } ADRESA;
typedef struct { char meno[30]; ADRESA bydlisko; float priemer;} OSOBA;
OSOBA student, studenti[10];
Zadanie
Vytvoriť štruktúru, pomocou ktorej bude možné evidovať údaje o mene študenta, jeho bydlisku a výsledku štúdia.
16
Štruktúra v inej štruktúre príklad (hlavný program)
int main(int argc, char *argv[]){ printf("Zadaj meno studenta: "); scanf("%s", &student.meno);
printf("Zadaj nazov ulice: "); scanf("%s", &student.bydlisko.ulica);
printf("Zadaj cislo domu: "); scanf("%s", &student.bydlisko.cislo);
printf("Zadaj priemer "); scanf("%f", &student.priemer);
printf("Student %s", student.meno); printf(" byva na ulici %s %s \n", student.bydlisko.ulica, student.bydlisko.cislo); printf(" ma priemer znamok %.2f \n", student.priemer);}
17
Štruktúra v inej štruktúre príklad (hlavný program)
int main(int argc, char *argv[]){
int i;for(i=0; i<2; i++){
printf("Zadaj meno studenta c.%d: ",i);scanf("%s", &studenti[i].meno);
printf("Zadaj nazov ulice: ");scanf("%s", &studenti[i].bydlisko.ulica);
printf("Zadaj cislo domu: ");scanf("%s", &studenti[i].bydlisko.cislo);
printf("Zadaj priemer ");scanf("%f", &studenti[i].priemer);
}
for(i=0; i<2; i++){
printf("\n\r Student[i] %s", studenti[i].meno);printf(" byva na ulici %s %s \n", studenti[i].bydlisko.ulica, studenti[i].bydlisko.cislo);printf(" ma priemer znamok %.2f \n", studenti[i].priemer);
}}
18
Doplnenie grafiky do Dev-C++
Štandardná inštalácia Dev-C++ neobsahuje knižnice pre prácu s grafikou. Tieto knižnice sa musia dodatočne nainštalovať.
Inštalácia grafického systému Allegro
19
Výber komponentov pre Update Dev-C++
20
Vytvorenie nového grafického projektu
21
Uloženie projektu
Každý projekt musí mať vytvorený vlastný adresárvlastný adresár do ktorého sa ukladajú pomocné súbory.
22
Inicializácia grafického módu
#include <allegro.h>
void init();void deinit();
int main() {init();
while (!key[KEY_ESC]) {/* put your code here */
}
deinit();return 0;
}END_OF_MAIN()
Pôvodné odstránime
doplníme readkey();
23
Inicializácia grafického módu
void init() {int depth, res;allegro_init();depth = desktop_color_depth();if (depth == 0) depth = 32;set_color_depth(depth);
res = set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0);if (res != 0) {allegro_message(allegro_error);exit(-1); }
install_timer();install_keyboard();install_mouse();/* add other initializations here */
}
Nastavenie farebnej hĺbky (počet zobrazovaných farieb)
Funkcia, ktorá štartuje grafiku
Overenie správnosti spustenia grafiky (res=0)
Hlásenie chyby pri štarte grafiky (res0) a ukončenie programu
Inicializácia ďalších zariadení (časovača, klávesnice, myši)
24
Ukončenie grafického módu
void deinit() {clear_keybuf();/* add other deinitializations here */
}
25
Funkcie grafického módu
set_gfx_mode(GFX_AUTODETECT_WINDOWED, 640, 480, 0, 0);
Nastavuje veľkosť grafického oknaGFX_AUTODETECT_WINDOWED – windows oknoGFX_AUTODETECT_FULLSCREEN – celá obrazovka
Rozlíšenie (640x480)
26
Vloženie textu do grafického okna
int main() {init();
clear_to_color(screen, makecol(255, 255, 255)); text_mode(-1); textout_centre(screen, font, „Vitajte na palube!", SCREEN_W/2, SCREEN_H/2, makecol(0,0,0)); readkey();
deinit();return 0;
}END_OF_MAIN()
27
Funkcia pre vyfarbenie obrázku
clear_to_color(screen, makecol(255, 255, 255));
Názov obrázku (v tomto prípade celá obrazovka)
Farby (0 – 255)red, green, blueFunkcia pre tvorbu
farieb
28
Funkcia pre nastavenie textového módu
text_mode(-1);
Nastavenie textového módu(-1 priesvitné pozadie textu)
29
Funkcia pre výpis textu do zadaného obrázku
textout_centre(screen, font, „Vitajte na palube", SCREEN_W/2, SCREEN_H/2, makecol(0,0,0));
Názov obrázku (v tomto prípade celá obrazovka)
Typ fontu(štandardný systémový font)
Text
Umiestnenie textu (x a y súradnice v okne)
Funkcia pre tvorbu farieb
Farby (0, 0, 0) čierna farba
Funkcia SCREEN_W určí veľkosť okna v osi x
SCREEN_H určí veľkosť okna v osi y
30
Kreslenie úsečky
Súradnice obrazovky0,0
0,479 639,479
639,0
Príkaz pre kreslenie úsečkyline(screen, 10, 40, 70, 20, makecol(0, 255,
0));Súradnice
počiatku úsečky (x,y)
Súradnice konca úsečky (x,y)
31
Príklad na kreslenie úsečok
clear_to_color(screen, makecol(255, 255, 255));line(screen, 10, 40, 10, 140, makecol(0, 255, 0)); line(screen, 10, 140, 210, 140, makecol(255, 0, 0));line(screen, 210, 140, 210, 40, makecol(0, 0, 255));line(screen, 210, 40, 10, 40, makecol(0, 255, 255));
32
Vytvorenie obrazca a jeho vyplnenie farbou
Vytvorenie obdĺžnika, kde 30, 70 je jeden vrchol, 160, 140 je protiľahlý vrchol a jeho vyplnenie farbourectfill(screen, 30, 70, 160, 140, makecol(255, 198, 198));
Vytvorenie trojuholníka a jeho vyplnenie farboutriangle(screen, 130, 30, 420, 70, 270, 342, makecol(255, 90, 198));
Vytvorenie viacuholníka. Definovanie jeho vrcholov v poliint bodiky[10] = { 320, 20, 420, 460, 100, 140, 540, 140, 220, 460};polygon(screen, 5, bodiky, makecol(255, 0, 0));
Definovanie bodu v obrazci a jeho vyplnenie farboufloodfill(screen, 320, 200, makecol(200, 200, 200));
33
Výsledok programu
34
Práca s obrázkami
Doteraz sme pracovali s jediným obrázkom -- s obrazovkou. Odvolávali sme sa na ňu s pomocou systémovej premennej screen. Táto premenná mala typ BITMAP* čiže pointer na bitmapu . Práca s pamäťou je rýchlejšia ako práca s obrazovkou. Preto sa obrázok napred vytvorí v pamäti a potom zobrazí. V pamäti sa musí vytvoriť miesto pre uložení obrázku. Tento spôsob práce je vhodný aj pre prácu z obrázky zo súboru. Ten napred načítame zo súboru do pamäte a potom zobrazíme.
35
Vykreslenie obrázku
BITMAP* obrazok;obrazok = load_bitmap("xicht.tga",NULL);blit(obrazok,screen, 0,0, 270,190, 100,100);readkey();destroy_bitmap(obrazok);
Načítanie obrázku z disku(vo formátu bitmapy)
Kopírovanie jedného obrázku do druhého
Uvolnenie pamäte
blit(obrazok,screen, 0,0, 270,190, 100,100);
Prvý obrázok
Druhý obrázok (obrazovka)
Súradnice bodu od ktorého sa
začne kopírovať
Súradnice ľavého horného bodu
cieľového obrázku
Šírka a výška obrázku
36
Podpora práce smyšou
Po inicializácii myši máme k dispozícii premenné mouse_x a mouse_y, v ktorých je uložená aktuálnu pozícia myši.
Okrem toho je tu ešte premenná mouse_b v ktorej je ako v bitovom poli uložené, ktoré tlačidlo na myši je stlačené:
ak je mouse_b = 1, je stlačené ľavé tlačidlo, ak je mouse_b = 2, je stlačené pravé tlačidlo, ak je mouse_b = 4, je stlačené stredné tlačidlo (ak ho
myš má).
37
Kreslenie myšou
Program vykreslí bod, keď je stlačené ľavé tlačidlo myši na aktuálnu pozíciu myši.
while( ! keypressed()){ if (mouse_b & 1) putpixel(screen,mouse_x,mouse_y,makecol(255,255,0));}
38
Zobrazenie súradníc myši
Ak chceme, aby myš bolo vidieť, musíme urobiť dve veci. Za prvé musíme nainštalovať modul timer. install_timer();
Druhá vec ktorú musíme dodržať je, že vždy predtým, než na obrazovku budeme niečo kresliť, musíme myš zhasnúť, pretože inak nám bude robiť na obrazovku šmuhy. Hneď ako dokresíme samozrejme myši povieme, aby sa opäť objavila. Myš sa na obrazovke príkazom:
objavuje show_mouse(screen); zhasína show_mouse(NULL);
39
Vloženie obrázku na pozíciu myši
BITMAP* obrazok;
obrazok = load_bitmap("sln1.tga",NULL); show_mouse(screen); while( ! keypressed()) { if (mouse_b & 1) { show_mouse(NULL); draw_sprite(screen,obrazok,mouse_x-50,mouse_y-50); show_mouse(screen); } }
Funkciou draw_sprite vložíme obrázok na pozíciu myši
40
Kreslenie kružníc
circle(screen, 100, 100, 100, makecol(255,255,255));
Súradnice stredu kružnice x, y
Polomer kružnice
clear_to_color(screen, makecol(255,255,255));circle(screen, 100, 100, 100, makecol(0,0,0));circle(screen, 170, 170, 50, makecol(0,0,255)); floodfill(screen, 165, 165, makecol(0,255,0));
41
Vymenovaný typVymenovaný typ má podobnú konštrukciu ako štruktúra.
typedef enum{ pondelok,utorok,streda,stvrtok,piatok,sobota,nedela }DNI; int main(){ DNI c, d; c = pondelok; d = utorok; printf("%d %d", c, d);}
42
#include <stdio.h>#include "moje.h"typedef enum{ MODRA, CIERVENA, ZELENA, ZLTA }FARBY; int main(){ FARBY farba; farba = ZELENA; switch (farba) { case MODRA : printf(" Zvolena modra farba"); break; case CIERVENA : printf(" Zvolena ciervena farba"); break; case ZELENA : printf(" Zvolena zelena farba"); break; case ZLTA : printf(" Zvolena zlta farba"); break;} cakaj();}
Príklad – výber jednej z definovaných farieb
43
Opakujemedefinícia a naplnenie poľa
#include <stdio.h>#include "moje.h"
int main(){ int i,j; int cislo[]={ 1,2,3,4,5,6,7,8,9,0}; for (i = 0; i < MAX; i++){ printf("%3d %8d\n", i, cislo[i]);} cakaj(); return 0;}
44
Opakujemedefinícia a naplnenie poľa
#include <stdio.h>#include "moje.h"
int main(){ int i,j; int cislo[3][3] = { 1,2,3, 4,5,6, 7,8,9}; printf("\n"); for (i = 0; i < 3; i++){ for (j = 0; j < 3; j++) printf(" %2d %2d %3d\n", i,j, cislo[i][j]);} cakaj(); return 0;}
45
Kontrolné cvičenie
Zadanie:
Vytvorte program, ktorý bude evidovať značky a typy aut, objem valcov a ich maximálnu rýchlosť.
Údaje zadajte z klávesnice a uložte ich do súboru.
Vytvorte ďalší samostatný program, ktorý údaje zo súboru načíta a zobrazí na obrazovke.
Program odovzdajte formou protokolu cvičiacemu. Súčasťou protokolu musí byť aj vývojový diagram.