Prezentace se nahrává, počkejte prosím

Prezentace se nahrává, počkejte prosím

OSNOVA: a) Základní struktura programu b) Algoritmy c) Vyjádření čísel a řetězcůd) Data a proměnné e) Výrazyf) Aritmetické konverze g) Operátoryh) Příkazy.

Podobné prezentace


Prezentace na téma: "OSNOVA: a) Základní struktura programu b) Algoritmy c) Vyjádření čísel a řetězcůd) Data a proměnné e) Výrazyf) Aritmetické konverze g) Operátoryh) Příkazy."— Transkript prezentace:

1 OSNOVA: a) Základní struktura programu b) Algoritmy c) Vyjádření čísel a řetězcůd) Data a proměnné e) Výrazyf) Aritmetické konverze g) Operátoryh) Příkazy C – úvod i) Příkazy pro větvení j) Příkazy pro cykly I. Jiří Šebesta Ústav radioelektroniky, FEKT VUT v Brně Počítače a programování 1 pro obor EST KPC1E TUTORIÁL 2

2 Základní struktura programu (1/10) Co je program? Jak program v C vytváříme? Jazyk symbolických adres = assembler = zčitelněný strojový (spustitelný) kód strojový (spustitelný) kód - instrukce (JSA) = operační kód - operandy (data, adresy)

3 vložené hlavičkové soubory knihoven //precompiled header files #include //standard inputs/outputs int main(void) //header of main function { //body of main function char c; //variable declaration printf("ahoj"); //printing fnc. (stdio.h) scanf("%c", &c);//wait until key pressed (stdio.h) return 0; } komentáře hlavička hlavní funkce deklarace proměnných tělo (definice) funkce volané knihovní funkce příkaz návratu z funkce s předáním návratové hodnoty (0) Základní struktura programu (2/10)

4 Způsoby řešení aplikací v C: KONZOLOVÁ APLIKACE (platformově nezávislá) – ANSI C APLIKACE PLATFORMOVĚ ZÁVISLÁ (pro konkrétní OS s využitím jeho funkcí, pro konkrétní kontrolér s využitím jeho konkrétních periferií) – rozsáhlé knihovní funkce, např. API, MFC, Active X Integrovaná vývojová prostředí IDE – kompletní nástroje pro tvorbu aplikací + průvodci (Wizards) pro nastavení projektu, například v MS Visual Studiu – open sourcová prostředí, např. Code::Blocks nebo Eclipse nebo CodeLite (není třeba licence) Základní struktura programu (3/10)

5 Code::Blocks – náš pracovní nástroj Založení nebo otevření projektu nový projekt otevřít už vytvořený projekt konzolová aplikace = textový výstup v DOS boxu projekty pro jednočipy AVR 8 bitový ARM 32 bitový Základní struktura programu (4/10)

6 Nastavení jazyka překladače (ANSI-C) Základní struktura programu (5/10)

7 Nastavení jména projektu Základní struktura programu (6/10)

8 Nastavení kompilátoru (GNU GCC) GNU – otevřený svobodný software (pakůň) GCC = GNU Compiler Collection Základní struktura programu (7/10)

9 Debug verze vs. release verze DEBUG – ladící verze – dokonalé ladění ale neoptimalizováno RELEASE – finální verze – optimalizovaný kód pro distribuci Základní struktura programu (8/10)

10 ladění a spuštění aplikace – menu DEBUG spustí ladění zastavuje se na ladících zarážkách krokuje v programu včetně vstupu do funkcí, předčasně lze funkci opustit krokuje v programu podle zdrojáku bez vstupu do funkcí vložení ladící zarážky Příklad: KPC1E_Ex01.c zastaví ladění (program se může zacyklovat) Základní struktura programu (9/10)

11 Kde Code::Blocks stáhnout ? UŽITEČNÉ CZ WEBY: Základní struktura programu (10/10) Co stáhnout ? codeblocks mingw- setup.exe

12 Algoritmy (1/6) Algoritmus – definuje postup činností (operací) „programu“ nad daty Základní rysy algoritmu: Konečnost – algoritmus se skládá z jednotlivých kroků, jejichž počet musí být konečný Determinovanost – algoritmus musí být přesně a jasně definovaný Vstupy/výstupy – algoritmus musí mít definovaný jednoznačné vstupy a výstupy (data, např. soubor) Efektivita – algoritmus musí být efektivní a optimálně využívat možnosti systému, na kterém je prováděn (efektivita z hlediska výkonného času vs. efektivita z hlediska využití operační paměti, příp. velikosti kódu)

13 Univerzálnost – algoritmus musí být schopen pracovat s požadovanou množinou dat v definovaném rozsahu Základní elementy algoritmu: Proměnné Začátek algoritmu Konec algoritmu Kroky algoritmu Podprogramy Podmínky (binární relace) Rozhodování Sekvence Cykly Skoky (minimalizovat) Algoritmy (2/6)

14 Prostředky pro definici algoritmu: Slovní – přirozená forma: textový (myšlenkový) návod, vyhláška, zákon – často nepřesná definice, pak převod do programovacího jazyka není možný Grafický – vývojový diagram – přehledného znázornění složitějších algoritmů včetně větvení pomocí definovaných značek s popisem a orientovaných spojnic Symbolický – popis algoritmu pomocí přesně definované syntaxe (klíčová slova programovacího jazyka, který bude využit; metajazyk – generativní gramatika) Algoritmy (3/6)

15 Vývojový diagram - značky: začátek/konec algoritmu běžný příkaz podmíněné větvení cyklus s určeným počtem opakování cyklus s pod- mínkou na konci cyklus s pod- mínkou na začátku ruční vstup zobrazení výstupu zpracování souboru uložení dat do souboru podprogram spojovací značka spojovací čára (tok algoritmu) Algoritmy (4/6)

16 pro program, který vypočítá kořeny libovolné kvadratické rovnice: ax 2 + bx + c = 0 Hodnoty koeficientů nechť jsou načteny jako vstupy z konzolového okna. Vyjdou-li kořeny komplexní, vypíše se chybové hlášení. Příklad vývojového diagramu Algoritmy (5/6)

17 float a, b, c, y1, y2, r; printf("a = "); scanf("%f", &a); printf("b = "); scanf("%f", &b); printf("c = "); scanf("%f", &c); getchar(); r = b*b-4*a*c; if(r>=0) { y1 = (-b+sqrt(fabs(r)))/(2*a); y2 = (-b-sqrt(fabs(r)))/(2*a); printf("\n 1st root: %.3f", y1); printf("\n 2nd root: %.3f", y2); } else printf("\n Result is not real"); Příklad: KPC1E_Ex02.c Algoritmy (6/6)

18 Obecná definice vyjádření : Používané soustavy : Vyjádření čísel a řetězců (1/12)

19 Používají se symboly 0 – 9, pro soustavy se základem nad 10 se přidávají písmena z abecedy: např. pro hexadecimální soustavu: A = 10B = 11 C = 12 D = 13E = 14F = 15 Příklad hexadecimálního vyjádření : Číslo 0x3CF0 reprezentuje hodnotu: 3 · · · 16 = Vyjádření čísel a řetězců (2/12)

20 Numerické typy Vyjádření čísel a řetězců (3/12)

21 Numerické typy bez desetinné čárky pro celá čísla - bezznaménkové (unsigned) - uložení v paměti - znaménkové (signed) - uložení v paměti Vyjádření čísel a řetězců (4/12)

22 Příklad pro unsigned char (8 bitů) Příklad pro signed char (8 bitů) – standardní vyjádření Vyjádření čísel a řetězců (5/12)

23 Doplňkové kódování Od absolutní hodnoty kódo- vaného záporného čísla je ode- čtena jednička, číslo je převede- no do dvojkové soustavy a je provedena jeho negace. Příklad pro signed char (8 bitů) – doplňkové vyjádření Jednodušší hardware ALU Vyjádření čísel a řetězců (6/12)

24 Numerické typy s desetinnou čárkou pro racionální čísla - uložení v paměti (obecně podle IEEE754 normy) S je hodnota znaménkového bitu E je binární hodnota v exponentu M je binární hodnota v mantise Vyjádření čísel a řetězců (7/12)

25 Numerické typy s desetinnou čárkou pro racionální čísla Float (4 byty)Double (8 bytů) Vyjádření čísel a řetězců (8/12)

26 Float (4 byty) Vyjádření čísel a řetězců (9/12)

27 Double (8 bytů) Vyjádření čísel a řetězců (10/12)

28 Řetězec: pole znaků (v paměti: 1 byte/znak – kód ASCII) NTS (Null Terminated Strings) : posledním znakem null – spec. znak v C/C++ ’\0’ Složky pole: ukazatele na znaky Vyjádření čísel a řetězců (11/12)

29 Řetězec jako pole ASCII kódů znaků v paměti : Vyjádření čísel a řetězců (12/12)

30 Data a proměnné (1/8) Data – vstupní – I (Input), výstupní – O (Output), pomocná (použité pro mezivýsledky algoritmu) Zdroje a cíle dat – soubor (I/O – binární, textový), klávesnice (I), konzola (O), tiskárna (O), komunikační brána (port) (I/O) - často jsou funkce pro práci se zdroji a cíli dat definovány jako funkce pro práci se souborem Druhy dat (proměnných) – numerické (celá nebo racionální čísla), znaky a řetězce (řetězec je pole znaků zakončené znakem NULL), pole (jednorozměrná = vektory, vícerozměrná = matice, 3D matice, …), ukazatel (odkaz na pozici v paměti), struktura (definovaná zapouzdřená množina proměnných různých typů)

31 #include // standard inputs and outputs int a = 5; // global variable int main(void) // main function { int b = 10; // local variable char c; printf("global: %d\r\n", a); printf("local: %d\r\n", b); scanf("%c ", &c); return 0; } Proměnná = pojmenované místo v paměti s požadovanou velikostí (v Bytech) – GLOBÁLNÍ – platí v celém programu – LOKÁLNÍ – platí jen v těle dané funkce Příklad: KPC1E_Ex03.c Data a proměnné (2/8)

32 Numerické typy v ANSI-C Data a proměnné (3/8) short int = stačí definovat jen jako short V C99 celočíselný typ long long (8 B) v rozsahu

33 Speciální znaky: \b - backspace BS \f - form feed FF (také clear screen) \n - new line NL \r - carriage return CR \t - horizontal tab HT \v - vertical tab (ne všechny verze) \“ - znak uvozovka (ne všechny verze) \' - znak apostrof \\ - znak zpětného lomítka \ddd - znak ddd, kde ddd je ASCII kód znaku v okt. soustavě \xhh - znak hh, kde hh je ASCII kód znaku v hex. soustavě Řetězec = pole znaků (typ char ) kódovaných dle ASCII zakončené znakem NULL Řetězec se zapisuje do uvozovek: "toto je retezec" znak NULL se dosadí automaticky Znak = typ char, znak se zapisuje do apostrofů: ’a’, tím se do dané proměnné vloží ASCII hodnota tohoto znaku Data a proměnné (4/8)

34 int main(void) { int A[5] = {0, 1, 2, 3, 4}; int B[3][2] = {0, 1, 2, 3, 4, 5}; int i,j;char c; for(i=0; i<5; i++) printf("A[%d] = %d\r\n", i, A[i]); B[0][0] = A[4]; for(i=0; i<3; i++) { for(j=0; j<2; j++) printf("B[%d,%d] = %d\r\n", i, j, B[i][j]); } return 0; } Pole Příklad: KPC1E_Ex04.c Data a proměnné (5/8)

35 Tisková funkce printf() (z knihovny stdio.h ) Data a proměnné (6/8) int printf(const char* format, …) Zapíše formátovaný řetězec na standardní výstup Řetězec format obsahuje příslušný text v uvozovkách jako konstantní řetězec s speciálními znaky pro dosazovaní hodnot proměnných (a konstant): %d nebo %i – celočíselné dekadické vyjádření %o – celočíselné oktalové vyjádření %x – celočíselné hexadecimální vyjádření %f – vyjádření racionálního čísla %e – vyjádření racionálního čísla ve tvaru mantisa + exponent %c – znak (proměnná nebo konstanta nese ASCII kód znaku

36 Data a proměnné (7/8) Speciální znaky mohou obsahovat modifikátory, obecně: %[flags][width][.precision][length]specifier Např. kód: printf("Characters: %c %c \n", 'a', 65); printf("Decimal: %d \n", 500); printf("Floats: %4.2f %+.0e %E \n", , , ); má výstup: Characters: a A Decimal: 500 Floats: e E+000

37 #include int main(void) { float x = 3.14, y = 2.27; float* p; // address of float variable p = &x; // address of x to p *p = y; // content of y on address in p return 0; } Ukazatel (= adresa proměnné v paměti) Příklad: KPC1E_Ex05.c Data a proměnné (8/8)

38 Výrazy (1/3) Výraz: – konstrukce sloužící k výpočtu hodnot – sestavujeme z operandů a operátorů Operand: – proměnná, konstanta nebo volání funkce, která vrací hodnotu Operátor: – symbol definující aritmetickou, logickou, přiřazovací, relační a další operaci nad operandy

39 int main(void) { int y1, y2, a=10, b=6; char c; y1 = a + b; // a, b are operands y2 = a / b; // +, / are operators printf("%3d\n", y1); printf("%3d\n", y2); scanf("%c", &c); return 0; } Operandy jako proměnné Příklad: KPC1E_Ex06.c + KPC1E_Ex07.c Výrazy (2/3)

40 ... #include "math.h" // library for math. functions int main(void) { double y, x= ; char c; y = sqrt(x); printf("Square root of %10.4f is %10.8f\n", x, y); scanf("%c", &c); return 0; } Operand jako návratová hodnota po volání funkce Příklad: KPC1E_Ex08.c Výrazy (3/3)

41 Aritmetické konverze (1/2) Všechny operandy typu … – … char, short převedeny na int – … float převedeny na double Je-li jeden z operandů typu … – … double, druhý převeden též na double – … long, druhý převeden též na long – … unsigned, druhý převeden též na unsigned V ANSI-C platí:

42 int a, b, c; float d, e; char f = 'A'; a = 3/5; // {int} = {int}/{int} b = 3/5.0; // {int} = {int}/{float} c = f+1;// {int} = {char->int}+{int} d = 3/5; // {float} = {int}/{int} e = 3/5.0; // {float} = {int}/{float} printf("%3d\n", a); // 0 printf("%3d\n", b);// 0 printf("%3d\n", c);// 66 (ASCII of 'A' is 65) printf("%6.2f\n", d); // 0.00 printf("%6.2f\n", e); // 0.60 Příklad aritmetických konverzí Příklad: KPC1E_Ex09.c Aritmetické konverze (2/2)

43 Operátory (1/10) Unární (jediný operand): – změna znaménka; – logická negace; – atd. int a=1, b=6; a = -a; // changing sign b = !b; // negation printf("%3d\n", a); //-1 printf("%3d\n", b); //0 Binární (dva operandy): – aritmetické (sčítání, odčítání, násobení, dělení); – logické (and, or, xor, …); – relační (>, , ==, , <, , …); – přiřazovací (=, …). int a=1, b=6, c, d, e; c = a<=b; d = a!=b; // not equal e = a==b; printf("%3d\n", c); //1 printf("%3d\n", d); //1 printf("%3d\n", e); //0 Příklad: KPC1E_Ex10.c + KPC1E_Ex11.c

44 Aritmetické Operátory (2/10)

45 Příklad: priorita aritmetických operátorů (vyšší hodnota priority = nižší priorita) Příklad: KPC1E_Ex12.c int a = 3, b = 12, c = 7; int x, y, z; x = -a + b % c; //-3 + (12 % 7) = = 2 y = -(a + b) % c; //-(3 + 12) % 7 = -15 % 7 = -1 z = (-a + b) % c; //( ) % 7 = 9 % 7 = 2 printf("%3d\n", x); printf("%3d\n", y); printf("%3d\n", z); Operátory (3/10)

46 Relační Příklad: KPC1E_Ex13.c int a = 1, b = 6, c, d, e; c = a <= b;//a is smaller or equals b, c = 1 d = a != b;//a does not equal b, d = 1 e = a == b;//a equals b, e = 0 Operátory (4/10)

47 výsledkem relačního operátoru je 0 = nepravda nebo 1 = pravda relační operátory lze využít ve složených výrazech pro testování složitých podmínek Příklad: KPC1E_Ex14.c int a = 3, b = 12, c = 7; x = a + b == c; //(3 + 12) == 7 => x = 0 y = a + (b == c); //3 + (12 == 7) = => y = 3 z = a z = 1; Operátory (5/10)

48 Logické Příklad: KPC1E_Ex15.c int a = 3, b = 12, c = 7; x = !a || b; //!3 || 12 => 0 || 1 => x = 1 y = !(a || b);//!(3 || 12) => !(0 || 1) => y = 0 z = a || b && c;//3 || (12 && 7) => 0 || (1 && 1) //=> z = 1 Operátory (6/10)

49 Bitové Příklad: KPC1E_Ex16.c int b = 12, c = 7; x = b >> 2; //1100b => 0011b = 3 y = b & c; //1100b & 0111b = 0100b = 4 z = b ^ c; //1100b ^ 0111b = 1011b = 11 Operátory (7/10)

50 Pravdivostní tabulka pro bitové operátory Operátory (8/10)

51 double r1, r2, a1 = 5.1, a2 = 5.1, b = 4.2; r1 = a1++ + b; // =9.3 r2 = ++a2 + b; // =10.3 printf("%6.2f\n", a1); printf("%6.2f\n", r1); printf("%6.2f\n", a2); printf("%6.2f\n", r2); Inkrementace, dekrementace: priorita = 2 Inkrementace / dekrementace Příklad: KPC1E_Ex17.c Operátory (9/10)

52 double r1=2.2, r2=3.3, a1=4.4, a2=5.5; int s1=4, s2=4; r1 += a2-a1; // r1=r1+(a2-a1) = 3.3 r2 /= a2-a1; // r2=r2/(a2-a1) = 3.0 printf("%6.2f\n", r1); printf("%6.2f\n", r2); s b => 16d s2 >>= 2; // b => b => 1d printf("%3d\n", s1); printf("%3d\n", s2); Přiřazovací Příklad: KPC1E_Ex18.c Operátory (10/10)

53 Příkazy C – úvod (1/4) Program:posloupnost příkazů (vč. příkazů výrazové, např. volání funkcí) Pokud příkaz – nepřenese řízení do jiné části programu – nezpůsobí přerušení programu (interrupt) jsou příkazy vykonávány sekvenčně (za sebou) Příkaz standardní (ANSII C): uvozen rezervovaným slovem (např. for, if, else) pozn. rezervovaná slova jsou v Code::Blocks modře, nelze je používat jako jména proměnných

54 Stejný význam jako prázdný příkaz má prázdný blok { } if(err) goto lab1; // in case of error go to lab1 c++; // otherwise increment lab1: ; // label and empty command Prázdný příkaz Výrazový příkaz: – přiřazení – volání funkcí – atd. Příkazy C – úvod (2/4)

55 C++; A=cos(b)+c; Výrazový příkaz - příklad Složený příkaz: –posloupnost příkazů uzavřená do složených závorek –může obsahovat další složený příkaz: vnořený blok nadřazený blok Příkazy C – úvod (3/4)

56 int main(void) { char text[40]="The momentary laps of..."; int n, conv=0; for(n=0; n

57 Příkazy pro větvení (1/7) if(test) statement; if(test) statement_this; else statement_that; char day = '1'; if(day 57) printf("Not a number\n"); else if(day>48 && day<56) // 1,2,3,…7 printf("Now is the %cth day\n", day); else printf("An invalid day number\n"); Podmíněný příkaz: podmínka - pravdivá - nepravdivá příkaz

58 Větvení typu if Příkazy pro větvení (2/7)

59 Větvení typu if - else Příkazy pro větvení (3/7)

60 Kombinované větvení if – else if – else Příkazy pro větvení (4/7)

61 Test ? Statement_this : Statement_that; Podmínkový operátor ?: podmínka příkaz pro pravdivost příkaz pro nepravdivost Výběr z větší hodnoty: Příklad: KPC1E_Ex19.c int a, b, c; a = 3; b = 9; c = (a > b) ? a : b; // c = 9 // if (a>b) c = a; // else c = b; Příkazy pro větvení (5/7)

62 Přepínač swich-case : pro případy, kdy vybíráme z více než dvou možností výraz s výsledkem celočíselné hodnoty switch(value) { case 1 : statement_1; break; case 2 : statement_2; break; case 3 : statement_3; break; case 4 : statement_4; break; default: statement_other; } vystoupení z přepínače - není povinné příkaz vykonaný v případě jakékoli jiné hodnoty value Příkazy pro větvení (6/7)

63 printf("Which girl should go to the cinema with me?\n"); srand(time(NULL)); switch(rand()%9)// random number from 0 to 8 { case 0: printf("Jana"); break; //if rand()%9 is 0 case 1: printf("Eva"); break; //if rand()%9 is 1 case 2: printf("Klara"); break; //if rand()%9 is 2 case 3: printf("Milena"); break; //if rand()%9 is 3 case 4: printf("Dominika"); break; //if rand()%9 is 4 case 5: printf("Erika"); break; //if rand()%9 is 5 case 6: printf("Petra"); break; //if rand()%9 is 6 case 7: printf("Zuzana"); break; //if rand()%9 is 7 default: printf("alone"); //if rand()%9 is not from 0 to 7, i.e. 8 } Přepínač – příklad Příklad: KPC1E_Ex20.c Příkazy pro větvení (7/7)

64 Příkazy pro cykly I. (1/5) Ani jeden parametr není povinný: for( ; ; ) je nekonečná smyčka for(init; test; update) statement; char text[] = "Vjku\"oguucig\"ku\"ugetgv#"; unsigned int n; for(n=0; text[n]!='\0'; n++) // loop for all chars if(text[n]!=' ') // excluding space text[n] -= 2; // character code shift printf("%s\n", text); Cyklus for Příklad: KPC1E_Ex21.c

65 for Příkazy pro cykly I. (2/5)

66 Lichoběžníková aproximace: obsah pro jeden úsek: Příklad - numerická integrace Obecně: Integrál: je součet všech dílčích ploch pro jednotlivé úseky Příkazy pro cykly I. (3/5)

67 Výpočet: Příklad - numerická integrace sin(x) pro interval 0 až π Program: #include #define pi int main(void) { double a[101], f[101]; //a = angle, f = func. value int n, i; double sum = 0, step; //step = lenght of interval int start = 3, stop = 100; // max. is 100 Příkazy pro cykly I. (4/5)

68 Příklad: KPC1E_Ex22.c for(n=start; n<=stop; n++) { sum = 0; for(i=0; i<=n; i++) { a[i] = 180.0*i/(n*1.0); f[i] = sin(a[i]*pi/180.0); } step = pi/(1.0*n); for(i=0; i

69 Téma následujícího tutoriálu DĚKUJI ZA POZORNOST –Příkazy pro cykly II. –Řetězce –Pole


Stáhnout ppt "OSNOVA: a) Základní struktura programu b) Algoritmy c) Vyjádření čísel a řetězcůd) Data a proměnné e) Výrazyf) Aritmetické konverze g) Operátoryh) Příkazy."

Podobné prezentace


Reklamy Google