BI-PA1 Programování a algoritmizace 1 Katedra teoretické informatiky

Podobné dokumenty
int t1, t2, t3, t4, t5, t6, t7, prumer; t1=sys.readint();... t7=sys.readint(); prume pru r = r = ( 1+t 1+t t3+ t3+ t4 t5+ t5+ +t7 +t7 )/ ;

BI-PA1 Programování a algoritmizace 1 Katedra teoretické informatiky

BI-PA1 Programování a algoritmizace 1, ZS Katedra teoretické informatiky

BI-PA1 Programování a Algoritmizace 1. Miroslav Baĺık, Ladislav Vagner a Josef Vogel. 7., 9. a 10. listopadu 2017

Funkce, intuitivní chápání složitosti

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

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

BI-PA1 Programování a algoritmizace 1 Katedra teoretické informatiky

BI-PA1 Programování a algoritmizace 1, ZS Katedra teoretické informatiky

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

Rozklad problému na podproblémy, rekurze

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

Rozklad problému na podproblémy, rekurze

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

Řídící struktury, if, while, switch

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

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:

Jazyk C++, některá rozšíření oproti C

Paměť počítače. alg2 1

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

Racionální čísla, operátory, výrazy, knihovní funkce

Pointery II. Jan Hnilica Počítačové modelování 17

Řídící struktury, if, while, switch

Základy programování (IZP)

Algoritmizace a programování

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

Mělká a hluboká kopie

BI-PA1 Programování a algoritmizace 1 Katedra teoretické informatiky

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

Programovanie v jazyku C - pole treba poorat...

Algoritmizace a programování

Např.: // v hlavičkovém souboru nebo na začátku // programu (pod include): typedef struct { char jmeno[20]; char prijmeni[20]; int rok_nar; } CLOVEK;

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

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

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

Racionální čísla, operátory, výrazy, knihovní funkce

11a Dynamické dvourozměrné pole (obdobně vícerozměrné)

IAJCE Přednáška č. 8. double tprumer = (t1 + t2 + t3 + t4 + t5 + t6 + t7) / 7; Console.Write("\nPrumerna teplota je {0}", tprumer);

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

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

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

Základy programování. Úloha: Eratosthenovo síto. Autor: Josef Hrabal Číslo: HRA0031 Datum: Předmět: ZAP

Programovací jazyk Pascal

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

Algoritmizace a programování

Programování v jazyce C

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

Úvod do programování. Lekce 5

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

ZÁPOČTOVÝ TEST. Zpracoval Vilém Závodný, #include "stdafx.h" #include "stdio.h"

Základy programování (IZP)

2 Základní funkce a operátory V této kapitole se seznámíme s použitím funkce printf, probereme základní operátory a uvedeme nejdůležitější funkce.

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

Ukazatele. Paměť počítače Víte, jak velkou paměť má váš počítač? Ovládací panely/systém Víte, kolik je 1KiB,1kB, 1MB, 1GiB(ČSN IEC , 1998)?

2 Datové typy v jazyce C

Základy algoritmizace a programování

Základy jazyka C. Základy programování 1 Martin Kauer (Tomáš Kühr)

3. přednáška. Obsah: Řídící struktury sekvence, if-else, switch, for, while, do-while. Zpracování posloupnosti

Maturitní otázky z předmětu PROGRAMOVÁNÍ

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

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

Řešení sady 1. Úvod do programování 1 Tomáš Kühr

Pole stručný úvod do začátku, podrobně později - zatím statická pole (ne dynamicky) - číslují se od 0

Formátové specifikace formátovací řetězce

Základní datové typy, proměnné - deklarujeme předem - C je case sensitive rozlišuje malá a velká písmena v názvech proměnných a funkcí

Řídicí struktury. alg3 1

Větvení a cykly. Úvod do programování 1 Tomáš Kühr

Algoritmizace a programování

Dynamická vícerozměrná pole. Základy programování 2 Tomáš Kühr

Začínáme vážně programovat. Řídící struktury Přetypování Vstupně výstupní operace Vlastní tvorba programů

Úvod do programovacích jazyků (Java)

Úvod do programování. Lekce 1

10 Práce s řetězci - pokračování

Datové struktury. alg12 1

Ukazatel (Pointer) jako datový typ - proměnné jsou umístěny v paměti na určitém místě (adrese) a zabírají určitý prostor (počet bytů), který je daný

Úvod do programovacích jazyků (Java)

Standardní algoritmy vyhledávací.

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

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

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

Základní pojmy. Úvod do programování. Základní pojmy. Zápis algoritmu. Výraz. Základní pojmy

Programování v jazyce JavaScript

Algoritmizace a programování

Úvod do programování - Java. Cvičení č.4

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

Programy na PODMÍNĚNÝ příkaz IF a CASE

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

Programování: základní konstrukce, příklady, aplikace. IB111 Programování a algoritmizace

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

Vyučovací hodina. 1vyučovací hodina: 2vyučovací hodiny: Opakování z minulé hodiny. Procvičení nové látky

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

- znakové konstanty v apostrofech, např. a, +, (znak mezera) - proměnná zabírá 1 byte, obsahuje kód příslušného znaku

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

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

Algoritmizace a programování

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

Abstraktní třídy, polymorfní struktury

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

Příklad : String txt1 = new String( Ahoj vsichni! ); //vytvoří instanci třídy String a přiřadí ji vnitřní hodnotu Ahoj vsichni!

Transkript:

Příprava studijního programu Informatika je podporována projektem financovaným z Evropského sociálního fondu a rozpočtu hlavního města Prahy. Praha & EU: Investujeme do vaší budoucnosti Pole, řetězce BI-PA1 Programování a algoritmizace 1 Katedra teoretické informatiky Miroslav Balík Fakulta informačních technologií České vysoké učení technické

Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti Pole, řetězce BI-PA1 Programování a algoritmizace 1 Katedra teoretické informatiky Miroslav Balík Fakulta informačních technologií České vysoké učení technické v Praze

vektory Pole y úsečky [x 22,y 22 ] [x 12,y 12 ] 15 2 5 4 [x 21,y 22 ] 5 10 2 3 [x 11,y 11 ] 10-8 1 1 tabulky x deklarace pole označení prvků pole pole pro uložení posloupnosti pole jako tabulka pole jako parametr funkce řetězce vícerozměrná pole (matice) Ing. Miroslav Balík, Ph.D. - BI-PA1-07 3/39

Pole Příklad: přečíst teploty naměřené v jednotlivých dnech týdnu, vypočítat průměrnou teplotu a pro každý den vypsat odchylku od průměrné teploty Řešení s proměnnými typu int (prog7-teploty1.c): /* prog7-teploty1.c*/ #include <stdio.h> #include <stdlib.h> int main(void) { int t1, t2, t3, t4, t5, t6, t7, prumer; printf("zadejte teploty v sedmi dnech v tydnu\n"); scanf("%d", &t1); scanf("%d", &t2); scanf("%d", &t3); scanf("%d", &t4); scanf("%d", &t5); scanf("%d", &t6); scanf("%d", &t7); prumer = (t1+t2+t3+t4+t5+t5+t6+t7)/7; printf("%d\n", prumer); printf("%d\n", t1-prumer); printf("%d\n", t2- prumer); printf("%d\n", t3-prumer); printf("%d\n", t4-prumer); printf("%d\n", t5-prumer); printf("%d\n", t6-prumer); printf("%d\n", t7- prumer); return 0; Ing. Miroslav Balík, Ph.D. - BI-PA1-07 4/39

Teploty Řešení je těžkopádné a bylo by ještě horší, kdyby vstupními daty byly teploty za měsíc nebo za celý rok Příklad vyřešíme pomocí pole Pole je obecně strukturovaný datový typ skládající se z pevného počtu složek (prvků) stejného typu, které se vzájemně rozlišují pomocí indexu V jazyku C se pole indexuje celými čísly 0, 1,... (počet prvků 1), kde počet prvků je dán při vytvoření pole a je neměnitelný. Ing. Miroslav Balík, Ph.D. - BI-PA1-07 5/39

Pole Řešení pomocí pole (prog7-teploty2.c) pro uložení teplot vytvoříme pole obsahující 7 prvků typu int int teploty[7] první prvek pole má označení teploty[0], druhý teploty[1] atd. vstupní data přečteme a do prvků pole uložíme cyklem for (i=0; i<7; i++) scanf("%d", &teploty[i]); průměrnou teplotu vypočteme jako součet prvků pole dělený 7 int prumer=0; for (i=0; i<7; i++) prumer += teploty[i]; prumer = prumer/7; na závěr pomocí cyklu vypíšeme odchylky od průměru for (i=0; i<7; i++) printf("%d ", teploty[i]-prumer); Ing. Miroslav Balík, Ph.D. - BI-PA1-07 6/39

Pole v jazyku C Pole p obsahující n prvků typu T vytvoříme deklarací T p[n]; kde T může být libovolný typ a n musí být celočíselný konstantní výraz s nezápornou hodnotou Je-li deklarace pole na úrovni souboru (globální, mimo funkce), pak prvky pole mají nulové počáteční hodnoty Je-li deklarace pole lokální ve funkci, pak prvky pole mají nedefinované počáteční hodnoty Zápis p[i] kde i je celočíselný výraz, má vlastnosti proměnné typu T jestliže hodnota výrazu i je nezáporná a menší než počet prvků, pak p[i] označuje prvek pole p s indexem i v opačném případě p[i] označuje nedefinované místo v paměti (nedovolený index se při běhu programu netestuje!!) Ing. Miroslav Balík, Ph.D. - BI-PA1-07 7/39

Příklad: int p[4]; Pole v jazyku C p[0] p[1] p[2] p[3] označení prvků pole p 0 1 2 3 indexy prvků pole p[0] = 2; p[1] = 25 p 2 25 0 1 2 3 Příklad použití špatného indexu: prog7-pole.c Ing. Miroslav Balík, Ph.D. - BI-PA1-07 8/39

Pole pro uložení posloupnosti Příklad teplot zobecníme: z klávesnice zadáme počet dní a pak teploty Jak velké pole máme deklarovat? V jazyku C musí být /* prog7-teploty3.c*/ počet prvků deklarovaného #include <stdio.h> #include <stdlib.h> #define MAXPOCET 100 pole dán konstantním výrazem, int main(void) { proto musíme počet dní shora omezit int teploty[maxpocet], pocet, prumer=0, i; printf("zadejte pocet dni (cislo od 1 do %d): ", MAXPOCET); scanf("%d", &pocet); printf("zadejte teploty ve %d. dnech \n", pocet); for (i=0; i<pocet; i++) scanf("%d", &teploty[i]); /* cteni teplot do pole */ for (i=0; i<pocet; i++) prumer += teploty[i]; /* vypocet prumerne teploty */ prumer = prumer/pocet; printf("prumerna teplota je %d\n", prumer); /* vypis odchylek od prum. teploty */ printf("odchylky od prumerne teploty:\n"); for (i=0; i<pocet; i++) printf("%d ", teploty[i]-prumer); printf("\n"); return 0; Ing. Miroslav Balík, Ph.D. - BI-PA1-07 9/39

Teploty ještě jednou Program prog7-teploty4.c kontroluje (pomocí funkce), zda zadaný počet dní není větší než maximum #define MAXPOCET 100 int ctiint(int min, int max) { int x; scanf("%d", &x); while (x<min x>max) { printf("spatne, zadejte znovu: "); scanf("%d",&x); return x; int main(void) { int teploty[maxpocet], pocet, prumer=0, i; printf("zadejte pocet dni (cislo od 1 do %d): ", MAXPOCET); pocet = ctiint(1, MAXPOCET); printf("zadejte teploty ve %d. dnech \n", pocet);... Ing. Miroslav Balík, Ph.D. - BI-PA1-07 10/39

Obracení posloupnosti pomocí pole Program, který přečte posloupnost čísel zakončenou nulou a vypíše ji obráceně (tentokrát pomocí pole) /* prog7-obrat.c*/ #include <stdio.h> #include <stdlib.h> #define MAXPOCET 100 int main(void) { int pole[maxpocet], dalsi, i=0; printf("zadejte posloupnost nanejvys %d cisel " "zakoncenou nulou\n", MAXPOCET); do { scanf("%d", &dalsi); pole[i] = dalsi; i++; while (dalsi!=0 && i<maxpocet); for (i=i-1; i>=0; i--) printf("%d ", pole[i]); printf("\n"); return 0; Ing. Miroslav Balík, Ph.D. - BI-PA1-07 11/39

Pole jako tabulka Předchozí příklady ilustrovaly použití pole pro uložení posloupnosti Pole lze použít též pro realizaci tabulky (zobrazení), která hodnotám typu indexu (v jazyku C to je pouze interval celých čísel počínaje nulou) přiřazuje hodnoty nějakého typu Příklad: přečíst řadu čísel zakončených nulou a vypsat tabulku četnosti čísel od 1do 100 (ostatní čísla ignorovat) Tabulka četnosti bude pole 100 prvků typu int, počet výskytů čísla x, kde 1 x 100, bude hodnotou prvku s indexem x-1 Tabulku deklarujeme jako globální pole (počáteční hodnoty prvků budou 0) a s pomocí dvou funkcí: void cticisla() přečte čísla a vytvoří tabulku četnosti vypistabulku() vypíše tabulku četnosti Ing. Miroslav Balík, Ph.D. - BI-PA1-07 12/39

Pole jako tabulka /*prog7-cetnost1.c*/ int tabulka[100]; void cticisla(void) { int cislo; printf("zadejte posloupnost celych cisel zakoncenou nulou\n"); scanf("%d", &cislo); while (cislo!=0) { if (cislo>=1 && cislo<=100) tabulka[cislo-1]++; scanf("%d", &cislo); void vypistabulku(void) { int i; for (i=1; i<=100; i++) if (tabulka[i-1]) printf("pocet vyskytu cisla %2d je %d\n",i, tabulka[i-1]); printf("\n"); Ing. Miroslav Balík, Ph.D. - BI-PA1-07 13/39

Pole jako tabulka Nejmenší číslo je dáno konstantou MIN, největší konstantou MAX (jména konstant jsou zavedena direktivou define /* prog7-cetnost2.c*/ #include <stdio.h> #include <stdlib.h> #define MIN 1 #define MAX 100 int tabulka[max-min+1]; void cticisla(void) { int cislo; printf("zadejte posloupnost celych cisel zakoncenou nulou\n"); scanf("%d", &cislo); while (cislo!=0) { if (cislo>=min && cislo<=max) tabulka[cislo-min]++; scanf("%d", &cislo); void vypistabulku(void) { int i; for (i=min; i<=max; i++) if (tabulka[i-min]) printf(... Ing. Miroslav Balík, Ph.D. - BI-PA1-07 14/39

Pole jako parametr funkce Program, který přečte dva vektory s n složkami (n se přečte z klávesnice) a vypíše skalární součin těchto vektorů (prog7-vektory.c) Složky vektorů uložíme do polí, jejichž počet prvků zadáme konstantou MAX (zavedeme direktivou define). Tím bude omezen počet složek vektorů Pro čtení vektoru zavedeme funkci ctivektor, parametrem bude pole, kam mají být uloženy složky vektorů, a počet složek void ctivektor(int v[ ], int n) { int i; printf("zadejte %d celych cisel\n", n); for (i=0; i<n; i++) scanf("%d", &v[i]); skutečným parametrem bude pole prvků typu int Ing. Miroslav Balík, Ph.D. - BI-PA1-07 15/39

Pole jako parametr funkce Pro výpočet skalárního součinu dvou vektorů zavedeme funkci, které dodáme vektory jako parametry, třetím parametrem bude počet složek int skalarnisoucin(int x[], int y[], int n) { int i, s=0; for (i=0; i<n; i++) s += x[i]*y[i]; return s; Ing. Miroslav Balík, Ph.D. - BI-PA1-07 16/39

Pole jako parametr funkce /* prog7-vektory.c*/... #define MAX 100 int ctiint(int min, int max) {... void ctivektor(int v[ ], int n) {... int skalarnisoucin(int x[], int y[], int n) {... int main(void) { int x[max], y[max], n; printf("zadejte pocet slozek vektoru (cislo od 1 do %d): ", MAX); n = ctiint(1, MAX); printf("vektor x\n"); ctivektor(x, n); printf("vektor y\n"); ctivektor(y, n); printf("skalarni soucin vektoru x a y je %d\n", skalarnisoucin(x, y, n)); return 0; Ing. Miroslav Balík, Ph.D. - BI-PA1-07 17/39

Pole jako parametr funkce - shrnutí Deklarace parametru p, kterým má být pole prvků typu T, má v hlavičce funkce tvar: T p[ ] Takto deklarovaný parametr můžeme ve funkci používat jako označení pole prvků typu T, např. p[i] =... ; Přípustným skutečným parametrem je jméno pole prvků typu T Obvykle je třeba předat funkci jako další parametr počet (definovaných) prvků pole (parametrem p je funkci předána pouze adresa prvního prvku pole, nic víc!!) Zadáme-li ve volání funkce špatný parametr (např. pole prvků jiného typu), překladač vypíše pouze varovné hlášení a funkce bude pracovat špatně (prog7-spatnyparametr.c) Ing. Miroslav Balík, Ph.D. - BI-PA1-07 18/39

Řetězce Literál typu řetězec je v jazyku C posloupnost znaků uzavřená do uvozovek Příklady: "\n" "Pepa z Depa" Kocka sedi na bezu" V paměti je řetězec reprezentován posloupností bytů obsahujících kódy znaků řetězce, která je zakončena nulovým bytem Proměnné pro uložení řetězců jsou pole prvků typu char char txt[10]; /* lze ulozit az 9-znakovy retezec */ Operace s řetězci provádějí funkce deklarované v <string.h> Pro přiřazení řetězce do pole znaků slouží knihovní funkce strcpy(kam,co): strcpy(txt, abcd ); Nekontroluje se, zda pole je dostatečně velké! Pro porovnání řetězců slouží knihovní funkce strcmp: strcmp(x, y) < 0 když x < y = 0 když x = y > 0 když x > y Délku řetězce vrátí funkce strlen(x) Ing. Miroslav Balík, Ph.D. - BI-PA1-07 19/39

Řetězce výpis většího slova I Z klávesnice přečteme řetězec pomocí funkce scanf a konverze %s (ignoruje počáteční mezery a oddělovače řádků, čtení skončí na mezeře nebo od. ř.) Na displej řetězec vypíšeme pomocí funkce printf a konverze %s /* prog7-retezce1.c */ #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXDELKA 100 int main(void) { char slovo1[maxdelka], slovo2[maxdelka], vetsi[maxdelka]; printf("zadejte prvni slovo: "); scanf("%s", slovo1); printf("zadejte druhe slovo: "); scanf("%s", slovo2); Ing. Miroslav Balík, Ph.D. - BI-PA1-07 20/39

Řetězce výpis většího slova I Z klávesnice přečteme řetězec pomocí funkce scanf a konverze %s (ignoruje počáteční mezery a oddělovače řádků, čtení skončí na mezeře nebo od. ř.) Na displej řetězec vypíšeme pomocí funkce printf a konverze %s /*slova nactena v promennych slovo1 a slovo2*/ printf("slovo %s ma %d znaku\n", slovo1, strlen(slovo1)); printf("slovo %s ma %d znaku\n", slovo2, strlen(slovo2)); if (strcmp(slovo1, slovo2)>0) else strcpy(vetsi, slovo1); strcpy(vetsi, slovo2); printf("vetsi je %s\n", vetsi); return 0; Ing. Miroslav Balík, Ph.D. - BI-PA1-07 21/39

Řetězce přečtení, otočení a výpis slova /* prog7-retezce2.c */ #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXDELKA 100 void obrat(char slovo[]); int main(void) { char slovo[maxdelka]; printf("zadejte slovo: "); scanf("%s", slovo); obrat(slovo); printf("obracene slovo je %s\n", slovo); system("pause"); return 0; Ing. Miroslav Balík, Ph.D. - BI-PA1-07 22/39

Řetězce Funkce pro obrácení slova v poli void obrat(char slovo[]) { int delka = strlen(slovo), posledni = delka-1, delka2 = delka/2, i; char pom; for (i=0; i<delka2; i++) { pom = slovo[i]; slovo[i] = slovo[posledni-i]; slovo[posledni-i] = pom; Ing. Miroslav Balík, Ph.D. - BI-PA1-07 23/39

Vícerozměrné pole Vícerozměrným polem se obecně rozumí takové pole, k jehož prvkům se přistupuje pomocí více než jednoho indexu V jazyku C se s vícerozměrnými poli pracuje jako s poli, jejichž prvky jsou opět pole Příklad dvojrozměrného pole (matice) prvků typu int: deklarace dvojrozměrného pole (3 řádky, 4 sloupce) prvků typu int int mat[3][4]; součet všech prvků pole mat int suma = 0, i, j; for (i=0; i<3; i++) for (j=0; j<4; j++) suma += mat[i][j]; Má-li být dvojrozměrné pole parametrem funkce, musí být v deklaraci parametru uveden počet sloupců Vše ukážeme na následujícím příkladu Ing. Miroslav Balík, Ph.D. - BI-PA1-07 24/39

Vstupní data: m n Výstup: Příklad součet matic kde m je počet řádků a n je počet sloupců matice prvky první matice m x n prvky druhé matice m x n součet matic Vzhledem k tomu, že počet řádků a počet sloupců musí být dán konstantním výrazem, omezíme počet řádků konstantou MAXR a počet sloupců konstantou MAXS (zavedeme je direktivou define) Řešení: prog7-matice.c Ing. Miroslav Balík, Ph.D. - BI-PA1-07 25/39

Příklad součet matic /* prog7-matice.c*/ #include <stdio.h> #include <stdlib.h> #define MAXR 10 #define MAXS 10 int ctiint(int min, int max) {... /* precte cislo, zkontroluje, zda je v intervalu min az max a kdyz ne, cteni se opakuje */ void ctimatici(int mat[][maxs], int m, int n) {... void soucetmatic(int x[][maxs], int y[][maxs], int z[][maxs], int m, int n) {... void vypismatice(int mat[][maxs], int m, int n) {... int main(void) {... Ing. Miroslav Balík, Ph.D. - BI-PA1-07 26/39

Příklad součet matic... int main(void) { int x[maxr][maxs], y[maxr][maxs], z[maxr][maxs], m, n; printf("zadejte pocet radku matice (max. %d): ", MAXR); m = ctiint(1, MAXR); printf("zadejte pocet sloupcu matice (max. %d): ", MAXS); n = ctiint(1, MAXS); printf("prvni matice\n"); ctimatici(x, m, n); printf("druha matice\n"); ctimatici(y, m, n); soucetmatic(x, y, z, m, n); printf("matice souctu\n"); vypismatice(z, m, n); return 0; Ing. Miroslav Balík, Ph.D. - BI-PA1-07 27/39

Příklad součet matic Čtení matice void ctimatici(int mat[][maxs], int m, int n) { int r, s; printf("zadejte %d x %d celych cisel\n", m, n); for (r=0; r<m; r++) for (s=0; s<n; s++) scanf("%d", &mat[r][s]); Výpis matice void vypismatice(int mat[][maxs], int m, int n) { int r, s; for (r=0; r<m; r++) { for (s=0; s<n; s++) printf("%5d ", mat[r][s]); printf("\n"); Ing. Miroslav Balík, Ph.D. - BI-PA1-07 28/39

Příklad součet matic void soucetmatic(int x[][maxs], int y[][maxs], int z[][maxs], int m, int n) { int r, s; for (r=0; r<m; r++) for (s=0; s<n; s++) z[r][s] = x[r][s] + y[r][s]; Ing. Miroslav Balík, Ph.D. - BI-PA1-07 29/39

Dynamická alokace paměti - malloc void *malloc(unsigned int size) Příklad alokace proměnné typu double double *p; if ((p = (double*)malloc(sizeof(double)))==null) { printf("nedostatek paměti"); exit (1);... *p=4.0; printf("%f", *p); Ing. Miroslav Balík, Ph.D. - BI-PA1-07 30/39

Dynamická alokace paměti calloc, free /* prog7-alokace.c*/ double *p; int i; p = (double *)calloc(10, sizeof(double)); //vynulování pole Totéž pomocí malloc p = (double *)malloc(10 * sizeof(double)); for (i=0; i<10; i++) p[i]=0; uvolnění paměti void free(void *ptr); Ing. Miroslav Balík, Ph.D. - BI-PA1-07 31/39

Eratosthénovo síto Eratosthen z Kyrény, 276 194 př. n. l. Úkol: Najděte všechna prvočísla menší než zadané N, např. 16 Kandidáti 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 není prvočíslo Ing. Miroslav Balík, Ph.D. - BI-PA1-07 32/39

Algoritmus: Eratosthénovo síto 1. vytvoř seznam čísel menších než N 2. najdi prvočíslo 3. vyškrtej jeho násobky 4. dokud je co škrtat, pokračuj od bodu 2. Který je první násobek jež budeme škrtat pro číslo 13? Je to 2*13? Kdy budeme škrtat naposledy, když N je 1000000? Poslední prvočíslo menší než 1000 je 997 Složitost algoritmu - O(N*log(log N)) Ing. Miroslav Balík, Ph.D. - BI-PA1-07 33/39

/* prog7-poleersito.c*/ #include <stdio.h> #include <stdlib.h> #include <math.h> Eratosthénovo síto #define boolean char #define true 1 #define false 0 #define MAX 1000000 void sito(boolean mnozina[], int max) {... void vypis(boolean mnozina[], int max) {... void vypispocet(boolean mnozina[], int max) {... int main(void) {... Ing. Miroslav Balík, Ph.D. - BI-PA1-07 34/39

Eratosthénovo síto void vypispocet(boolean mnozina[], int max) { int i, pocet = 0; for (i = 2; i < max; i++) if (mnozina[i])pocet++; printf("%d\t", pocet); int main(void) { boolean mnozina[max]; sito(mnozina, MAX); printf("prvocisla od 2 do %d:", MAX); vypispocet(mnozina, MAX); system("pause"); return 0; Ing. Miroslav Balík, Ph.D. - BI-PA1-07 35/39

Eratosthénovo síto void sito(boolean mnozina[], int max) { int i, p, pmax; for (i = 2; i < max; i++) mnozina[i] = true; p = 2; pmax = (int) sqrt(max); do { // vypuštění všech násobků prvočísla p for (i = p * p; i < max; i += p) mnozina[i] = false; do { // hledání nejbližšího prvočísla po p p++; while (!mnozina[p]); while (p <= pmax); return; Ing. Miroslav Balík, Ph.D. - BI-PA1-07 36/39

min a max v poli Najděte min a max v poli, použijte, co nejméně porovnání. /*prog7-minmax.c*/ #include <stdio.h> #include <stdlib.h> void vypis(int mnozina[], int max) { int i; for (i = 0; i < max; i++) printf("[%2d]=%5d\n", i, mnozina[i]); int main(void) { int min, max; int p[] = {1, 4, 5, 78, -100, 45, 28, 34, 5; vypis(p, 9); minmax(p, 9, &min, &max); printf("nejvetsi prvek je %d, \n nejmensi prvek je %d\n", max, min); system("pause"); return 0; Ing. Miroslav Balík, Ph.D. - BI-PA1-07 37/39

min a max v poli I Úkol: najděte min a max v poli, použijte, co nejméně porovnání. void minmax(int pole[], int maxindex, int* min, int *max) { int i; *min = *max = pole[0]; for (i = 1; i < maxindex; i++) { if (pole[i] > *max) *max = pole[i]; if (pole[i] < *min) *min = pole[i]; return; Kolik bude potřeba porovnání v nejlepším případě? Kolik bude potřeba porovnání v nejhorším případě? Co se stane pokud bude maxindex = 0? Ing. Miroslav Balík, Ph.D. - BI-PA1-07 38/39

min a max v poli - II void minmax2(int pole[], int maxindex, int* min, int *max) { int i; *min = *max = pole[0]; for (i = 1; i < maxindex; i++) { if (pole[i] > *max) *max = pole[i]; else if (pole[i] < *min) *min = pole[i]; return; Kolik bude potřeba porovnání v nejlepším případě? Kolik bude potřeba porovnání v nejhorším případě? {1,5,12,123,455 {45,25,3,-100 Ing. Miroslav Balík, Ph.D. - BI-PA1-07 39/39

min a max v poli - III void minmax3(int pole[], int maxindex, int* min, int *max) { int i; if (pole[0] > pole[1]) { *max = pole[0]; *min = pole[1]; else { *max = pole[1]; *min = pole[0]; i = 2 - maxindex % 2; for (; i < maxindex - 1; i+=2) { if (pole[i] > pole[i + 1]) { if (pole[i]>*max)*max = pole[i]; if (pole[i + 1]<*min) *min = pole[i + 1]; else { if (pole[i + 1]>*max)*max = pole[i + 1]; if (pole[i]<*min) *min = pole[i]; return; Kolik bude potřeba porovnání v nejlepším případě? Kolik bude potřeba porovnání v nejhorším případě? Jak to bude fungovat pro pole liché délky? Ing. Miroslav Balík, Ph.D. - BI-PA1-07 40/39