Algoritmizace a programování

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

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

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

Základy programování (IZP)

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

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 )/ ;

Algoritmizace a programování

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

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

Algoritmizace a programování

Algoritmizace a programování

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;

Ukazatele, dynamická alokace

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

Základy programování (IZP)

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

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

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

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

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ý

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

Strukturované typy a ukazatele. Úvod do programování 1 Tomáš Kühr

Množina čísel int stl-set-int.cpp

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

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

Vícerozměrná pole. Úvod do programování 2 Tomáš Kühr

Mělká a hluboká kopie

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

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

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

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

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

Úvod do programování. Lekce 5

Zápis programu v jazyce C#

Programovanie v jazyku C - to chce dynamiku

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

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

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.

Programovací jazyk C++ Hodina 1

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

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

Struktura programu v době běhu

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

2 Datové typy v jazyce C

2) Napište algoritmus pro vložení položky na konec dvousměrného seznamu. 3) Napište algoritmus pro vyhledání položky v binárním stromu.

Práce s polem a pamětí

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

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

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

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

Programovací jazyk Pascal

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

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

type Obdelnik = array [1..3, 1..4] of integer; var M: Obdelnik;

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

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

Pascal. Katedra aplikované kybernetiky. Ing. Miroslav Vavroušek. Verze 7

Odvozené a strukturované typy dat

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

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

4. Typ ukazatel, strukturované datové typy

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

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

Základy programování (IZP)

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

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

Jazyk C stručný přehled

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

PB071 Programování v jazyce C Jaro 2015

int ii char [16] double dd název adresa / proměnná N = nevyužito xxx xxx xxx N xxx xxx N xxx N

Michal Krátký. Úvod do programovacích jazyků (Java), 2006/2007

Ukazatele, paměťové třídy, volání funkcí

Řídicí struktury. alg3 1

Úvod do programovacích jazyků (Java)

Ukazatele a pole. Chceme-li vyplnit celé pole nulami, použijeme prázdný inicializátor: 207 Čárka na konci seznamu inicializátorů

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

Více o konstruktorech a destruktorech

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

Práce s pamětí a předávání parametrů. Úvod do programování 1

PREPROCESOR POKRAČOVÁNÍ

Programovanie v jazyku C - pole treba poorat...

Programovanie v jazyku C - funkcie a makra

Jazyk C++ I. Polymorfismus

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

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

Objektově orientované programování

Tabulka symbolů. Vazba (binding) Vazba - příklad. Deklarace a definice. Miroslav Beneš Dušan Kolář

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

Výrazy, operace, příkazy

Základy programování (IZP)

Základy programování (IZP)

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

Střední škola pedagogická, hotelnictví a služeb, Litoměříce, příspěvková organizace

POČÍTAČE A PROGRAMOVÁNÍ

Ukazatele #2, dynamická alokace paměti

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

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

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

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

Transkript:

Algoritmizace a programování Strukturované proměnné Pole (array), ukazatele (pointer) Jazyk C České vysoké učení technické Fakulta elektrotechnická Ver.1.10 J. Zděnek 2015 Pole (array) (1) Pole je množina prvků (proměnných) stejného typu K prvkům pole se přistupuje pomocí pořadového čísla prvku (indexu) Index musí být celéčíslo (konstanta, proměnná, výraz) Index prvního prvku je vždy roven 0 Prvky pole mohou být proměnné libovolného typu (i strukturované) Pole může být jednorozměrné i vícerozměrné (prvky pole jsou opět pole) A8B14ADP Jazyk C - Strukturované proměnné 2 J. Zděnek - 2011 1

Pole (array) (2) Definice pole určuje: - jméno pole - typ prvku pole - počet prvků pole Prvky pole je možné inicializovat Počet prvků statického pole musí být znám v době překladu Prvky pole zabírají v paměti souvislou oblast Velikost pole (byte) = počet prvků pole * sizeof (prvek pole) C - nemá proměnnou typu String, nahrazuje se jednorozměrným polem z prvků typu char. Poslední prvek takového pole je vždy \0 (null char) C - nekontroluje za běhu programu, zda vypočítaný index je platný A8B14ADP Jazyk C - Strukturované proměnné 3 Pole (array) (3) Deklarace pole (array): př: char polea [10]; int poleb[3][3]; // jednorozmerne pole z prvku char // dvourozmerne pole z prvku int Uložení v paměti poleb[0][0],[0][1],[0][2],[1][0],[1][1],[1][2],[2][0],[2][1],[2][2], A8B14ADP Jazyk C - Strukturované proměnné 4 J. Zděnek - 2011 2

Pole (array) (4) Inicializace pole: př: double x[3]={0.1,0.5,1.3; char s[]= abc ; char s1[]={ a, b, c, \0 ; // totez jako abc int ai[3][3]={{1,2,3{4,5,6{7,8,9; char cmd[][10]={ Load, Save, Exit ;//Druhy rozmer nutny Přístup k prvkům pole: př: ai[1][3]=15*2; A8B14ADP Jazyk C - Strukturované proměnné 5 Ukazatel (pointer) Ukazatel (pointer): Ukazatel je proměnná obsahující adresu jiné proměnné (nepřímá adresa) Ukazatel má též typ proměnné na kterou může ukazovat ukazatel na char ukazatel na int atd. Ukazatel může být též bez typu (void), pak může obsahovat adresu libovolné proměnné. Její velikost pak nelze z vlastností ukazatele určit Neplatná adresa v ukazateli má hodnotu konstanty NULL Za běhu programu se nekontroluje zda adresa v ukazateli je platná A8B14ADP Jazyk C - Strukturované proměnné 6 J. Zděnek - 2011 3

Ukazatel (pointer) Adresa proměnné se zjistí adresovým operátorem & K proměnné, na kterou ukazatel ukazuje se přistoupí operátorem nepřímé adresy * (hvězdička) Ukazatel může obsahovat též adresu funkce (ukazatel na funkci) Pomocí ukazatele na funkci lze funkci volat, včetně předání parametrů Pomocí ukazatele lze předávat parametry funkci odkazem (call by reference) (standardní metoda v C pro ostatní případy je volání hodnotou (call by value)) A8B14ADP Jazyk C - Strukturované proměnné 7 Ukazatel (pointer) Ukazatel (pointer): př: adresa hodnota adresa hodnota int x,y; px NULL x int *px,*py; px=null; px x px=&x; x=3; y=*px; px x py=px; *py=10; px x 3 px y 3 py x 3 py x 10 A8B14ADP Jazyk C - Strukturované proměnné 8 J. Zděnek - 2011 4

Ukazatel (pointer) Ukazatel (pointer): př: adresa hodnota adresa hodnota int x; int *px int **ppx; x=1; px=null; ppx=null; px=&x; ppx=&px; **ppx=6; px pp pxx px NULL NULL x x x x 1 1 1 1 *px=10; ppx x 1 ppx x 6 px x 10 A8B14ADP Jazyk C - Strukturované proměnné 9 Ukazatel (pointer) Ukazatel (pointer) - aritmetické operace: Povolené aritmetické operace s ukazateli: pointer + integer pointer - integer pointer1 - pointer2 (musí být stejného typu) A8B14ADP Jazyk C - Strukturované proměnné 10 J. Zděnek - 2011 5

Ukazatel (pointer) Ukazatel na pole (pointer to array): Aritmetické operace jsou užitečné když ukazatel ukazuje na pole Jméno pole je konstantní ukazatel na počátek pole (na prvek a[0]) Aritmetické operace s ukazatelem na pole zajistí správný výpočet, z typu ukazatele se zjistí velikost prvku pole a ukazatel se posune o (pocet_prvku*velikost_prvku) př: int a[10],y; // a[] pole typu int int *px; // px ukazatel na int px=a; // Adresa a[0] do px px++; // px ukazuje na a[1] y=*(px+5); // do y hodnotu y a[5] px=&a[3]; // px ukazuje na a[3] A8B14ADP Jazyk C - Strukturované proměnné 11 Ukazatel (pointer) Ukazatel na pole (pointer to array) pokrač: V složitějších deklaracích ukazatelů mohou být nezbytné závorky př: double a[10]; //Pole z prvku double double (*pa)[10]; //Ukazatel na pole z 10-ti prvku double double *pa[10]; //Pole 10-ti ukazatelu na double A8B14ADP Jazyk C - Strukturované proměnné 12 J. Zděnek - 2011 6

Ukazatel na char a práce s řetězci: Ukazatel (pointer) př: // Ukazatel na string char *s; //Ukazatel na char s= Ja jsem string ;//s ukazuje na prvni znak retezce A8B14ADP Jazyk C - Strukturované proměnné 13 Ukazatel na funkci: Ukazatel (pointer) př: void funkce1(int x); // Prototyp funkce void (*pfnc)(int x); // Ukazatel na funkci s parametrem int max=200; pfnc=funkce1; // Adresa funkce1 do ukazatele pfnc (*pfnc)(max); // Volani funkce1 pomoci ukazatele A8B14ADP Jazyk C - Strukturované proměnné 14 J. Zděnek - 2011 7

Čtení celého čísla int nextint(int *cislo){ // === Bezpecne pro libovolny zadany pocet znaku === // Navratova hodnota: // TRUE - zadano cele cislo // FALSE - neplatny vstup enum boolean {FALSE,TRUE; const int BUF_SIZE = 80; char vstup[buf_size],smeti[buf_size]; fgets(vstup,sizeof(vstup),stdin); if(sscanf(vstup,"%i%[^\n]",cislo,smeti)!= 1) return(false); // Input error return(true); // nextint() END A8B14ADP Jazyk C - Strukturované proměnné 15 #define MAX_DELKA 20 int pole[max_delka]; Otoč pole /př.06a.c/ printf("\n Zadejte cela cisla (kazde ukoncit ENTER)\n\n"); for (i = 0; i < n; i++) { if (!nextint(&pole[i])) { printf("chyba - Zadany udaj neni cislo\n\n"); exit(exit_failure); printf("\n Vypis cisel v obracenem poradi \n\n"); for (i = n - 1; i >= 0; i--) { printf("pole[%d] = %d \n", i, pole[i]); printf(" \n"); A8B14ADP Jazyk C - Strukturované proměnné 16 J. Zděnek - 2011 8

Tabulka četnosti /06c.c/ int tabulka(int t[], int min, int max) { const int TRUE = 1; const int FALSE = 0; int i, cislo; for (i = 0; i <= (max - min); i++){ t[i] = 0; printf(" Zadejte radu celych cisel zakoncenou nulou \n\n"); printf(" Povoleny rozsah cisel je <%d, %d> \n\n", min, max); do { if (!nextint(&cislo)) { printf("\n Chyba - Zadany udaj neni cele cislo\n"); return (FALSE); // FALSE -> chyba if ((cislo < MIN cislo > MAX) && cislo!= 0) { printf("\n Chyba - Zadane cislo je mimo rozsah\n"); return (FALSE); // FALSE -> chyba if (cislo == 0)break; t[cislo - MIN]++; while (TRUE); return (TRUE); // Zadani bez chyby // tabulka() END A8B14ADP Jazyk C - Strukturované proměnné 17 Tabulka četnosti void vypis (int t[], int min, int max){ int i; printf("\n"); for(i=0; i<=(max-min); i++){ if(t[i]!= 0){ printf(" Cetnost cisla %3d je %3d\n", (i+min),t[i]); printf("\n"); // vypis() END A8B14ADP Jazyk C - Strukturované proměnné 18 J. Zděnek - 2011 9

Tabulka četnosti #include <stdio.h> #include <stdlib.h> int main(int argc, char** argv) { #define MIN 1 #define MAX 100 int tab[max - MIN + 1]; // Pozor, lokalni promenna neni inicializovana printf(" === C06c.c ===\n\n"); printf(" Cetnost cisel - pomoci funkci \n\n"); if (!tabulka(tab, MIN, MAX)) { printf(" Chyba v zadani udaju\n\n"); return(exit_failure); vypis(tab, MIN, MAX); return (EXIT_SUCCESS); // main() END A8B14ADP Jazyk C - Strukturované proměnné 19 Součet prvků matice /C06e.c/ int soucetprvkumatice (int mat[][max_j], int m, int n){ int suma = 0; int i,j; for(i=0; i<m; i++){ for(j=0; j<n; j++){ suma = suma + mat[i][j]; return(suma); //soucetprvkumatice() END A8B14ADP Jazyk C - Strukturované proměnné 20 J. Zděnek - 2011 10

Součet prvků matice void vypismatice (int mat[][max_j], int m, int n){ int i, j; printf("\n"); for(i=0; i<m; i++){ for(j=0; j<n; j++){ printf(" m[%d,%d] =%3d ",i,j,mat[i][j]); printf("\n"); printf("\n"); // vypismatice() END A8B14ADP Jazyk C - Strukturované proměnné 21 #include <stdio.h> #include <stdlib.h> Součet prvků matice #define MAX_J 3 int main(int argc, char** argv) { int matice[][max_j]={{1, 2, 3, {3, 4, 5, {6, 7, 8, {9,10,11; printf(" === C06e.c ===\n\n"); printf(" Soucet prvku matice \n\n"); printf(" Matice \n"); vypismatice(matice,3,3); printf(" Ma soucet prvku = %d \n\n",soucetprvkumatice(matice,3,3)); return (EXIT_SUCCESS); // main() END A8B14ADP Jazyk C - Strukturované proměnné 22 J. Zděnek - 2011 11

Součet matic /C06f.c/ void soucetmatic (int mata[][max_j], int matb[][max_j], int soucetab[][max_j],int m){ int i,j; for(i=0; i<m; i++){ for(j=0; j<m; j++){ soucetab[i][j] = mata[i][j]+matb[i][j]; //soucetmatic() END A8B14ADP Jazyk C - Strukturované proměnné 23 Součet matic void vypismatice (int mat[][max_j], int m, int n){ int i, j; printf("\n"); for(i=0; i<m; i++){ for(j=0; j<n; j++){ printf(" m[%d,%d] =%3d ",i,j,mat[i][j]); printf("\n"); printf("\n"); // vypismatice() END A8B14ADP Jazyk C - Strukturované proměnné 24 J. Zděnek - 2011 12

Součet matic #include <stdio.h> #include <stdlib.h> #define MAX_J 3 int main(int argc, char** argv) { int maticea[][max_j]={{1, 2, 3, {3, 4, 5, {6, 7, 8; int maticeb[][max_j]={{1, 1, 1, {2, 2, 2, {3, 3, 3; int soucetab[max_j][max_j]; printf(" === C06f.c ===\n\n"); printf(" Soucet matic \n\n"); printf(" Matice \n"); vypismatice(maticea,2,3); printf(" a Matice \n"); vypismatice(maticeb,2,3); printf(" ma soucet \n"); soucetmatic(maticea,maticeb,soucetab,3); vypismatice(soucetab,2,3); return (EXIT_SUCCESS); // main() END A8B14ADP Jazyk C - Strukturované proměnné 25 Palindrom string /C06.g/ int jepalindrom(char str[]) { const int TRUE = 1; const int FALSE = 0; int i = 0, j = strlen(str) - 1; while (i < j) { while (str[i] == ' ')i++; while (str[j] == ' ')j--; if (toupper(str[i])!= toupper(str[j])) return (FALSE); i++; j--; return (TRUE); //printf("velikost = %d \n\n",velikost); // jepalindrom() END A8B14ADP Jazyk C - Strukturované proměnné 26 J. Zděnek - 2011 13

Palindrom string #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> int main(int argc, char** argv) { char string[]="kobyla ma maly bok"; printf(" === C06g.c ===\n\n"); printf(" Test palindromu \n\n"); if(jepalindrom(string)){ printf(" String <%s> je palindrom \n\n",string); else{ printf(" String <%s> neni palindrom \n\n",string); return (EXIT_SUCCESS); A8B14ADP Jazyk C - Strukturované proměnné 27 copyarray /C06j/ Pointers and arrays - ekvivalence syntaxe: void copyarray1(char dst[], const char src[]){ // const char src[] -> prvky pole src[] nelze ve funkci menit int i=0; while(src[i]!= '\0'){ dst[i] = src[i++]; dst[i] = '\0'; // copyarray1() END A8B14ADP Jazyk C - Strukturované proměnné 28 J. Zděnek - 2011 14

copyarray Pointers and arrays - ekvivalence syntaxe: void copyarray2(char *dst, const char *src){ // const char src[] -> prvky pole src[] nelze ve funkci menit while(*src!= '\0'){ *dst++ = *src++; *dst = '\0'; // copyarray2() END A8B14ADP Jazyk C - Strukturované proměnné 29 copyarray Pointers and arrays - ekvivalence syntaxe: void copyarray3(char *dst, const const char *src){ // const char src[] -> prvky pole src[] nelze ve funkci menit int i=0; while(src[i]!= '\0'){ *dst++ = src[i++]; // Wow, ok too *dst = '\0'; // copyarray2() END A8B14ADP Jazyk C - Strukturované proměnné 30 J. Zděnek - 2011 15

copyarray Pointers and arrays - ekvivalence syntaxe: void copyarray4(char dst[], const char src[]){ // const char src[] -> prvky pole src[] nelze ve funkci menit int i=0; while(*src!= '\0'){ *dst++ = *src++; *dst = '\0'; // copyarray1() END A8B14ADP Jazyk C - Strukturované proměnné 31 copyarray Pointers and arrays - ekvivalence syntaxe: #include <stdio.h> #include <stdlib.h> // Prototypes void copyarray1(char dst[], const char src[]); void copyarray2(char *dst, const char *src); void copyarray3(char *dst, const char *src); void copyarray4(char dst[], const char src[]); A8B14ADP Jazyk C - Strukturované proměnné 32 J. Zděnek - 2011 16

copyarray Pointers and arrays - ekvivalence syntaxe: int main(int argc, char** argv) { char a1[] = " Test 1"; char a2[] = " Test 2"; char a3[] = " Test 3"; char a4[] = " Test 4"; char b[80]; printf(" === C06j.c ===\n\n"); printf(" Pole a ukazatele \n\n"); printf(" Syntaxe pole a[i] je ekvivaletni syntaxi ukazatelu *(a_ptr+i) \n\n"); printf("%s \n\n", a1); copyarray1(b,a1); printf("%s \n\n",b); printf("%s \n\n", a2); copyarray2(b,a2); printf("%s \n\n",b); printf("%s \n\n", a3); copyarray3(b,a3); printf("%s \n\n",b); printf("%s \n\n", a4); copyarray4(b,a4); printf("%s \n\n",b); return (EXIT_SUCCESS); // main() END A8B14ADP Jazyk C - Strukturované proměnné 33 Dynamická alokace paměti /C06k.c/ #include <stdio.h> #include <stdlib.h> // Pointers and arrays - dynamicka alokace pameti, malloc(), free() // Otoc pole // Function prototypes int* ctipole1 (int *delka, int max_delka); void obratpole (int p[], int delka_pole); void vypispole (int p[], int delka_pole); int* vratpole(int *p_pole); int nextint(int *cislo); A8B14ADP Jazyk C - Strukturované proměnné 34 J. Zděnek - 2011 17

Dynamická alokace paměti int main(int argc, char** argv) { #define MAX_DELKA 20 int *p_pole, n; printf(" === C06k.c ===\n\n"); printf(" Obrat pole - pomoci funkci \n"); printf(" Dynamicke prideleni (alokace) pameti \n\n"); p_pole = ctipole1(&n, MAX_DELKA); obratpole(p_pole, n); vypispole(p_pole, n); p_pole = vratpole(p_pole); return (EXIT_SUCCESS); // main() END A8B14ADP Jazyk C - Strukturované proměnné 35 Dynamická alokace paměti int* ctipole1 (int *delka, int max_delka){ // Pole p[] je prideleno (alokovano dynamick - malloc() // Navratovou hodnotou funkce ctipole() je ukazatel na pridelene pole // Pocet prvku pole se predava z funkce odkazem *delka int i, *p; printf(" Zadejte pocet cisel = "); if (!nextint(delka)) { printf("\n Chyba - Zadany udaj neni cele cislo\n\n"); exit(exit_failure); if(*delka <1 *delka > max_delka){ printf("\n Chyba - pocet cisel = <1,%d> \n\n",max_delka); exit(exit_failure); // Alokace pameti (prideleni pameti z "heapu") if((p=(int*)malloc((*delka)*sizeof(int))) == NULL){ printf("\n Chyba - neni dostatek volne pameti \n\n"); exit(exit_failure); printf("\n Zadejte cela cisla (kazde ukoncit ENTER)\n\n"); for (i = 0; i < *delka; i++) { if (!nextint(p+i)) { printf("\n Chyba - Zadany udaj neni cele cislo\n\n"); exit(exit_failure); return(p); // p - ukazatel na pridelene a naplnene pole // ctipole1() END A8B14ADP Jazyk C - Strukturované proměnné 36 J. Zděnek - 2011 18

Dynamická alokace paměti void obratpole (int p[], int delka_pole){ // Pole p[] se predava odkazem (call by reference) int i, x, n_pul; n_pul= delka_pole/2; for(i=0; i<n_pul; i++ ){ x = p[i]; p[i] = p[delka_pole-i-1]; p[delka_pole-i-1] = x; // obratpole() END A8B14ADP Jazyk C - Strukturované proměnné 37 Dynamická alokace paměti void vypispole (int p[], int delka_pole){ // Pole p[] se predava odkazem (call by reference) int i; printf("\n Vypis cisel v obracenem poradi \n\n"); for(i=0; i<delka_pole; i++){ printf("pole[%d] = %d \n", i, p[i]); printf(" \n"); // vypispole() END A8B14ADP Jazyk C - Strukturované proměnné 38 J. Zděnek - 2011 19

Dynamická alokace paměti int* vratpole(int *p_pole){ free(p_pole); // Dealokace pameti (vraceni pridelene pameti) p_pole = NULL; // Bezpecnostni opatreni return(p_pole); // vratpole() END A8B14ADP Jazyk C - Strukturované proměnné 39 Dynamická alokace paměti int nextint(int *cislo){ // Stav: odladeno // === Bezpecne pro libovolny zadany pocet znaku === // Navratova hodnota: // TRUE - zadano cele cislo // FALSE - neplatny vstup enum boolean {FALSE,TRUE; const int BUF_SIZE = 80; char vstup[buf_size],smeti[buf_size]; fgets(vstup,sizeof(vstup),stdin); if(sscanf(vstup,"%i%[^\n]",cislo,smeti)!= 1) return(false); // Input error return(true); // nextint() END A8B14ADP Jazyk C - Strukturované proměnné 40 J. Zděnek - 2011 20

Dynamická alokace paměti (2) /C06l.c/ #include <stdio.h> #include <stdlib.h> // Pointers and arrays - dynamicka alokace pameti, malloc(), free() // Otoc pole // Function prototypes void ctipole2 (int **p_pole, int *delka, int max_delka); void obratpole (int p[], int delka_pole); void vypispole (int p[], int delka_pole); void vratpole1(int **p_pole); int nextint(int *cislo); A8B14ADP Jazyk C - Strukturované proměnné 41 Dynamická alokace paměti (2) int main(int argc, char** argv) { #define MAX_DELKA 20 int *p_pole, n; printf(" === C06l.c ===\n\n"); printf(" Obrat pole - pomoci funkci \n"); printf(" Dynamicke prideleni (alokace) pameti \n"); printf(" Predani ukazatele odkazem (ukazatel na ukazatel) \n\n"); ctipole2(&p_pole, &n, MAX_DELKA); obratpole(p_pole, n); vypispole(p_pole, n); vratpole1(&p_pole); return (EXIT_SUCCESS); // main() END A8B14ADP Jazyk C - Strukturované proměnné 42 J. Zděnek - 2011 21

Dynamická alokace paměti (2) void ctipole2 (int **pp_pole, int *delka, int max_delka){ // Pole je prideleno (alokovano dynamicky - malloc() // Ukazatel se bezne predava hodnotou, proto kdyz je treba // predat ukazatel odkazem (call by reference) pouzijeme // ukazatel na ukazatel (tj. **p_pole). Adresa pole // pridelena funkci malloc() je pak dostupna i po // ukonceni funkce ctipole2() // Pocet prvku pole se predava z funkce odkazem *delka...viz dále A8B14ADP Jazyk C - Strukturované proměnné 43 Dynamická alokace paměti (2) void ctipole2 (int **pp_pole, int *delka, int max_delka){ int i; printf(" Zadejte pocet cisel = "); if (!nextint(delka)) { printf("\n Chyba - Zadany udaj neni cele cislo\n\n"); exit(exit_failure); if(*delka <1 *delka > max_delka){ printf("\n Chyba - pocet cisel = <1,%d> \n\n",max_delka); exit(exit_failure); // Alokace pameti (prideleni pameti z "heapu") if((*pp_pole=(int*)malloc((*delka)*sizeof(int))) == NULL){ printf("\n Chyba - neni dostatek volne pameti \n\n"); exit(exit_failure); printf("\n Zadejte cela cisla (kazde ukoncit ENTER)\n\n"); for (i = 0; i < *delka; i++) { if (!nextint((*pp_pole)+i)) { printf("\n Chyba - Zadany udaj neni cele cislo\n\n"); exit(exit_failure); // ctipole() END A8B14ADP Jazyk C - Strukturované proměnné 44 J. Zděnek - 2011 22

Dynamická alokace paměti (2) void obratpole (int p[], int delka_pole){ // Pole p[] se predava odkazem (call by reference) int i, x, n_pul; n_pul= delka_pole/2; for(i=0; i<n_pul; i++ ){ x = p[i]; p[i] = p[delka_pole-i-1]; p[delka_pole-i-1] = x; // obratpole() END A8B14ADP Jazyk C - Strukturované proměnné 45 Dynamická alokace paměti (2) void vypispole (int p[], int delka_pole){ // Pole p[] se predava odkazem (call by reference) int i; printf("\n Vypis cisel v obracenem poradi \n\n"); for(i=0; i<delka_pole; i++){ printf("pole[%d] = %d \n", i, p[i]); printf(" \n"); // vypispole() END A8B14ADP Jazyk C - Strukturované proměnné 46 J. Zděnek - 2011 23

Dynamická alokace paměti (2) void vratpole1(int **p_pole){ // **p_pole je ukazatel na ukazatel, do metody predana // adresa ukazatele je pouzita k nastaveni vlastniho // ukazatele na NULL. To pozdeji v programu umozni // testovat zda je ukazatel platny nebo neplatny. free(*p_pole); // Dealokace pameti (vraceni pridelene pameti) *p_pole = NULL; // Bezpecnostni opatreni // vratpole() END A8B14ADP Jazyk C - Strukturované proměnné 47 Dynamická alokace paměti (2) int nextint(int *cislo){ // Stav: odladeno // === Bezpecne pro libovolny zadany pocet znaku === // Navratova hodnota: // TRUE - zadano cele cislo // FALSE - neplatny vstup enum boolean {FALSE,TRUE; const int BUF_SIZE = 80; char vstup[buf_size],smeti[buf_size]; fgets(vstup,sizeof(vstup),stdin); if(sscanf(vstup,"%i%[^\n]",cislo,smeti)!= 1) return(false); // Input error return(true); // nextint() END A8B14ADP Jazyk C - Strukturované proměnné 48 J. Zděnek - 2011 24

Algoritmizace a programování Strukturované proměnné Pole (array), ukazatele (pointer) KONEC České vysoké učení technické Fakulta elektrotechnická J. Zděnek - 2011 25