69
Procedurálne programovanie: 8. prednáška Gabriela Kosková

Procedur álne programovanie: 8 . prednáška

  • Upload
    cherie

  • View
    68

  • Download
    1

Embed Size (px)

DESCRIPTION

Procedur álne programovanie: 8 . prednáška. Gabriela Kosková. Obsah. Rie šenie časti testu Štruktúry a sp ájané zoznamy. Výpis po čtu slov na základe dĺžky. #include #define SUBOR "beatles.txt" int main() { FILE *f; int akt_dlzka = 0, dlzka, pocet = 0; char c; - PowerPoint PPT Presentation

Citation preview

Page 1: Procedur álne programovanie: 8 . prednáška

Procedurálne programovanie:8. prednáška

Gabriela Kosková

Page 2: Procedur álne programovanie: 8 . prednáška

Obsah

• Riešenie časti testu• Štruktúry a spájané zoznamy

Page 3: Procedur álne programovanie: 8 . prednáška

Výpis počtu slov na základe dĺžky#include <stdio.h>#define SUBOR "beatles.txt"int main() { FILE *f; int akt_dlzka = 0, dlzka, pocet = 0; char c; scanf("%d", &dlzka); if((f = fopen(SUBOR, "r")) == NULL) { printf("Subor %s sa nepodarilo otvorit.\n", SUBOR); return 1; }

while((c = getc(f)) != EOF) { if((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) akt_dlzka++; else { if(akt_dlzka >= 1 && akt_dlzka <= dlzka) pocet++; akt_dlzka = 0; } }

Page 4: Procedur álne programovanie: 8 . prednáška

Výpis slov zo zvolehého riadku if(akt_dlzka >= 1 && akt_dlzka <= dlzka) pocet++;

printf("Pocet slov: %d", pocet);

if(fclose(f) == EOF) printf("Subor %s sa nepodarilo zatvorit.\n", SUBOR); return 0;}

Page 5: Procedur álne programovanie: 8 . prednáška

Hodnoty premenných

int *Euro, *Dolar, *CZK, *pom;

Euro = (int *) malloc(sizeof(int));Dolar = (int *) malloc(sizeof(int));CZK = (int *) malloc(sizeof(int));*Euro = 100;*Dolar = 200;*CZK = 0;

*CZK = *Dolar;*Euro = *CZK;*Dolar = *Dolar + 100;pom = Euro;Euro = Dolar;Dolar = pom;*CZK = *Euro; *pom = *CZK + *Euro;pom = NULL; Riešenie na tabuli

Page 6: Procedur álne programovanie: 8 . prednáška

Definícia makra (obsah kruhu)

#define PI 3.14#define obsah(r) (PI * (r) * (r)) 

Page 7: Procedur álne programovanie: 8 . prednáška

Vyhodnocovanie logických operátorov#include <stdio.h>int main(void){ int i = 10, j = 5; if ((i %= j) && ++j == 6)

printf ("Logicky sucin\n"); printf("i: %d j: %d\n", i, j); return 0;}

i: 0 j: 5

Page 8: Procedur álne programovanie: 8 . prednáška

Vyhodnocovanie logických operátorov#include <stdio.h>int main(void) { int i = 12, j = 5; if ((i %= j) || ++j == 6)

printf ("Logicky sucet\n"); printf("i: %d j: %d\n", i, j); return 0;}

Logicky suceti: 2 j: 5

Page 9: Procedur álne programovanie: 8 . prednáška

Procedurálne programovanie: Štrutkúry, uniony a výmenované typy

Page 10: Procedur álne programovanie: 8 . prednáška

Čo je to štruktúra?

• štruktúra (struct) je heterogénny dátový typ – heterogénny: je zložený z prvkov rozličných dátových typov

(pole je homogénny dátový typ)

struct { položka_1; ... položka_n;}

dá sa definovať piatimi rôznymi spôsobmi

Page 11: Procedur álne programovanie: 8 . prednáška

Definícia štruktúry (1)

• základný spôsob– štruktúra nie je pomenovaná, – nedá sa inde v progame použiť – dajú sa použiť len definované premenné

struct { int vyska; float vaha;} pavol, jan, karol;

Page 12: Procedur álne programovanie: 8 . prednáška

Definícia štruktúry (2)

• modifikácia základného spôsobu– štruktúra je pomenovaná, – dá sa využiť aj inde v programe

struct miery { int vyska; float vaha;} pavol, jan, karol;

Page 13: Procedur álne programovanie: 8 . prednáška

Definícia štruktúry (3)

• podobne ako predchádzajúci spôsob– definícia štruktúry a premenných je oddelená od definície

premenných (ktoré sa môžu robiť viackrát)

struct miery { int vyska; float vaha;};struct miery pavol;struct miery jan, karol;

Page 14: Procedur álne programovanie: 8 . prednáška

Definícia štruktúry (4)

• definícia nového typu (typedef)– štruktúra nie je pomenovaná, pomenovaný je typ– typ sa dá použiť na definíciu premenných, pretypovanie...

typedef struct { int vyska; float vaha;} MIERY;MIERY pavol, jan, karol;

nebolo použité "struct"

Page 15: Procedur álne programovanie: 8 . prednáška

Definícia štruktúry (5)

• modifikácia predchádzajúceho spôsobu– štruktúry aj typ je pomenovaná (v tomto prípade to nie je

potrebné, ale neskôr to budeme potrebovať)

typedef struct miery { int vyska; float vaha;} MIERY;MIERY pavol, jan, karol;

odporúča sa pomenovať typ aj štruktúru rovnako, odlíšiť ich len veľkosťou písma

Page 16: Procedur álne programovanie: 8 . prednáška

Používanie štruktúr

• odporúča sa používať definície typu (4) a (5)– je to prehľadnejšie ("struct" sa použije len raz)

typedef struct { int vyska; float vaha;} MIERY;MIERY pavol, jan, karol;

typedef struct miery { int vyska; float vaha;} MIERY;MIERY pavol, jan, karol;

Page 17: Procedur álne programovanie: 8 . prednáška

Prístup k položkám štruktúry

• bodková notácia

typedef struct { int vyska; float vaha;} MIERY;MIERY pavol, jan, karol;

pavol.vyska = 182;karol.vaha = 62.5;jan.vyska = pavol.vyska;

často sa používa pole štruktúr:

MIERY ludia[100];

ludia[50].vyska = 156;

ludia[0] = ludia[50];

v ANSI C sa dá urobiť

Page 18: Procedur álne programovanie: 8 . prednáška

Pole v štruktúre

typedef struct { int pole[10];} STR_POLE;

void main() { STR_POLE a, b; a.pole[0] = 5; b = a;}

takto sa dá použiť štruktúra na to, aby sa dalo naraz

skopírovať celé pole

Page 19: Procedur álne programovanie: 8 . prednáška

Štruktúry a ukazovatele

• použitie:– štruktúra v dynamickej pamäti– štruktúra vo funkcii

typedef struct { char meno[30]; int rocnik;} STUDENT;

STUDENT s, *p_s;

p_s = (STUDENT *) malloc(sizeof(STUDENT));

p_s = &s;

*p_s - ukazovateľ na štruktúru, nemá pridelené miesto v pamäti, preto je potrebné alokovať mu pamäť.

alebo nastaviť ukazovateľ na inú pamäť

Page 20: Procedur álne programovanie: 8 . prednáška

Štruktúry a ukazovatele

typedef struct { char meno[30]; int rocnik;} STUDENT, *P_STUDENT;

STUDENT s;P_STUDENT p_s;p_s = (P_STUDENT *) malloc(sizeof(STUDENT));

s.rocnik = 2;(*p_s).rocnik = 3;p_s->rocnik = 4;

definícia typu ukzovateľa na štruktúru

prístup k štruktúre pomocou ukazovateľa

Page 21: Procedur álne programovanie: 8 . prednáška

Prístup do štruktúry pomocou ukazovateľa

STUDENT s, *p_s;

s.rocnik = 2;(*p_s).rocnik = 3;

*p_s.rocnik = 4; p_s->rocnik = 5;

chybné, lebo . má väčšiu prioritu ako *, teda tam, kam ukazuje p_s.rocnik (adesa 3) priraď hodnotu 4

Page 22: Procedur álne programovanie: 8 . prednáška

Štruktúry ukazujúce samy na seba: príklad 1• hypertext

– web stránka má odkaz na web stránku (ukazovateľ na rovnaký typ)

<html><head><title>Vyskum</title>...

<html><head><title>Publika</title>...

<html><head><title>Vyucba</title>...

vyskum.html

pub.html

vyucba.html

<html><head>...</head><body>.... tato stranka sa odkazuje na stranku <a href="vyskum.html">vyskum</a>...<a href="pub.html">publikacie</a>...<a href="vyucba.html">vyucba</a>...</body>

home.html

<a href="vyskum.html">vyskum</a>

<a href="pub.html">publikacie</a>

<a href="vyucba.html">vyucba</a>

Page 23: Procedur álne programovanie: 8 . prednáška

Štruktúry ukazujúce samy na seba: príklad 2

• pacienti v čakárni u lekára– "Kto je posledný?"– každý človek si pamätá človeka, ktorý je pred ním (ukazovateľ na ten istý typ)

AMBULANCIA

Page 24: Procedur álne programovanie: 8 . prednáška

Štruktúry ukazujúce samy na seba

typedef struct polozka { int hodnota; struct polozka *p_dalsi;} POLOZKA;

typedef struct { int hodnota; struct POLOZKA *p_dalsi;} POLOZKA;

odkaz na samého seba (na takú istú štruktúru)aj štruktúra, aj typ musia byť pomenované

chyba: v čase, keď sa definujem p_dalsi, POLOZKA ešte nie je známa

Page 25: Procedur álne programovanie: 8 . prednáška

Spájaný zoznam

• dynanamický zoznam prvkov :– v pamäti je práve toľko prvkov, koľko je potreba– dá sa pridávať na ktorékoľvek miesto v zozname

typedef struct clovek { char meno[30]; int rocnik; struct clovek *dalsi;} CLOVEK;ukazovateľ

1. položka...n. položka

ukazuje na ten istý typ

Page 26: Procedur álne programovanie: 8 . prednáška

Spájaný zoznam

Janko1

p

typedef struct clovek { char meno[30]; int rocnik; struct clovek *dalsi;} CLOVEK;

CLOVEK *p, *q;p = (CLOVEK *) malloc(sizeof(CLOVEK));p->meno = Janko;p->rocnik = 1;p->dalsi = NULL;

q = (CLOVEK *) malloc(sizeof(CLOVEK));q->meno = Misko;q->rocnik = 2;q->dalsi = NULL;

p->dalsi = q;

q = (CLOVEK *) malloc(sizeof(CLOVEK));q->meno = Jurko;q->rocnik = 3;q->dalsi = NULL;

p->dalsi->dalsi = q;

Miško2

q

Jurko3

q

Page 27: Procedur álne programovanie: 8 . prednáška

Spájaný zoznam: príklad

typedef struct prvok { int hodnota; struct prvok *dalsi;} PRVOK;

• Vtvorí sa spájaný zoznam s hodnotami 1...n, potom sa vymažú všetky prvky, ktoré sú deliteľné 3.

1 2 3 4 5 6 7

Page 28: Procedur álne programovanie: 8 . prednáška

#include <stdio.h>#include <stdlib.h>

typedef struct prvok { int hodnota; struct prvok *dalsi;} PRVOK;

void main(){ int i, n; PRVOK *p_prv, *p_akt, *p_pred;

printf("Zadaj pocet prvkov zoznamu: "); scanf("%d", &n); if((p_prv = (PRVOK *) malloc(sizeof(PRVOK))) == NULL){ printf("Malo pamate.\n") return; } p_prv->hodnota = 1;

p_akt

p_prv

p_pred

1

Page 29: Procedur álne programovanie: 8 . prednáška

for(i = 2; i < n; i++) { if(p_akt->dalsi = (PRVOK *) malloc(sizeof(PRVOK))) == NULL) { printf("Malo pamate.\n") break; } p_akt = p_akt->dalsi; p_akt->hodnota = i;}p_akt->dalsi = NULL;

p_akt = p_prv;

p_akt

p_prv

p_pred

1

for(p_pred = p_akt = p_prv; p_akt != NULL; p_pred = p_akt, p_akt = p_akt->dalsi) { if(p_akt->hodnota % 3 == 0) { p_pred->dalsi = p_akt->dalsi; free((void *) p_akt); p_akt = p_pred; } }}

2 n...

Page 30: Procedur álne programovanie: 8 . prednáška

Štruktúra v inej štruktúre

• štruktúra, ktorá je v inej štruktúre musí byť definovaná skôr ako je do inej štruktúry uložená (vhniezdená štruktúra)– predtým sme mali len odkaz na štruktúru

typedef struct { char ulica[30]; int cislo;} ADRESA;

typedef struct { char meno[30]; ADRESA adresa; float plat;} OSOBA;

príklad: vypísať adresu zamestnanca s najvyšším platom

(OSOBA ludia[100])

Page 31: Procedur álne programovanie: 8 . prednáška

Príklad: štruktúra v inej štruktúre

typedef struct { char ulica[30]; int cislo;} ADRESA;

typedef struct { char meno[30]; ADRESA adresa; float plat;} OSOBA;

int i, kto = 0;float max = 0.0, pom;OSOBA ludia[100];

... /* inicializacia */

for (i = 0; i < 100; i++) { if((pom = ludia[i].plat) > max) { max = pom; kto = i; }}

printf("Zamestnanec s najvyssim platom byva: %s %d",

ludia[kto].adresa.ulica, ludia[kto].adresa.cislo);

Page 32: Procedur álne programovanie: 8 . prednáška

Príklad: štruktúra v inej štruktúre - cez ukazovateľe

typedef struct { char ulica[30]; int cislo;} ADRESA;

typedef struct { char meno[30]; ADRESA adresa; float plat;} OSOBA;

float max = ludia[0].plat, pom;OSOBA ludia[100], *p_kto, *p_pom;

... /* inicializacia */

for (p_pom = p_kto = ludia; p_pom < ludia + 100; p_pom++) { if ((p_pom->plat) > max) { p_kto = p_pom; max = p_pom->plat; }}

printf("Zamestnanec s najvyssim platom byva: %s %d", p_kto->adresa.ulica, p_kto->adresa.cislo);

Page 33: Procedur álne programovanie: 8 . prednáška

Alokácia pamäte pre jedotlivé položky štruktúry

• položky obsadzujú pamäť zhora dole a zľava doprava– pre p v poradí: c i j k d

• položky sú väčšinou zarovnávané na párne adresy– za položkou c je väčšinou 1 prázdny

Byte

• štruktúra väčšinou končí na párnej adrese– za položkou d - 1 volný Byte

typedef struct { char c; int i, j, k; char d;} POKUS;

POKUS p;

na zistenie veľkosti: sizeof(p);

Page 34: Procedur álne programovanie: 8 . prednáška

Šturktúry a funkcie

• K&R verzia jazyka C:– parameter: ukazovateľ na štruktúru– návratový typ: ukazovateľ na štruktúru

• ANSI C:– parameter: ukazovateľ na štruktúru aj samotná štruktúra– návratový typ: ukazovateľ na štruktúru aj samotná štruktúra

Page 35: Procedur álne programovanie: 8 . prednáška

Príklad: šturktúry a funkcie

• sčítanie komplexných čísel

typedef struct { double re, im;} KOMP;

KOMP sucet(KOMP a, KOMP b) { KOMP c;

c.re = a.re + b.re; c.im = a.im + b.im; return c;}

void main(){ KOMP x, y, z; x.re = 1.4; x.im = 3.2; y = x; z = sucet(x, y);}

ak sú štrutúry veľké, nevýhodné, lebo sa vytvárajú lokálne kópie (časovo aj pamäťovo náročné) vhodné používať ukazovatele

Page 36: Procedur álne programovanie: 8 . prednáška

Príklad: šturktúry a funkcie -pomocou ukazovateľov• sčítanie komplexných čísel

typedef struct { double re, im;} KOMP;

void sucet(KOMP *a, KOMP *b, KOMP *c) { c->re = a->re + b->re; c->im = a->im + b->im;}

void main(){ KOMP x, y, z; x.re = 1.4; x.im = 3.2; y = x; sucet(&x, &y, &z);}

Page 37: Procedur álne programovanie: 8 . prednáška

Príklad: dynamické vytváranie štruktúry vo funkciách

STUDENT *vytvor1(void) { STUDENT p; p = (STUDENT *) malloc(sizeof(STUDENT)); if (p = NULL) printf("Malo pamate.\n"); return p;}

void vytvor2(STUDENT **p) { p = (STUDENT *) malloc(sizeof(STUDENT)); if (p = NULL) printf("Malo pamate.\n");}

vracia štruktúru cez parameter

typedef struct { char meno[30]; int rocnik;} STUDENT;

vracia štruktúru ako ukazovateľ

Page 38: Procedur álne programovanie: 8 . prednáška

Príklad: dynamické vytváranie štruktúry vo funkciách

void nastav(STUDENT *p, char *meno, int rok) { p->rocnik = rok; strcpy(p->meno, meno);}

void main() { STUDENT s, *p_s1, *p_s2; p_s1 = vytvor1(); vytvor2(&p_s2); s.rocnik = p_s1->rocnik = 1; nastav(&s, "Martin", 1); nastav(p_s1, "Peter", 2); nastav(p_s2, "Michal", 3);}

Page 39: Procedur álne programovanie: 8 . prednáška

Inicializácia štruktúr

typedef struct { char meno[30]; int rocnik;} STUDENT;STUDENT s = { "Janko", 3 };

STUDENT studenti[] = { { "Misko", 3 }, { "Jurko", 2 } };

pocet = sizeof(studenti) / sizeof(STUDENT);

Page 40: Procedur álne programovanie: 8 . prednáška

Vymenované typy

• enumerate type - zoznam symbolických konštánt, ktoré sú zvyčajne vzájomne závislé

• zvyšuje čitateľnosť programu

typedef enum { MODRA, CERVENA, ZELENA, ZLTA} FARBY;

FARBY c, d;c = MODRA;d = CERVENA; ak nepriradíme konštatnám

hodnoty, implicitne sú 0, 1, 2, ...

tu nie je bodkočiarka

Page 41: Procedur álne programovanie: 8 . prednáška

Príklad: boolovské hodnoty

typedef enum { FALSE, TRUE} BOOLEAN;

if(isdigit(c) == FALSE) ...

BOOLEAN dobre;

nie je nutné ani definovať

premennú

premenná môže byť definovaná

Page 42: Procedur álne programovanie: 8 . prednáška

Explicitná a implicitná inicializácia

typedef enum { MODRA = 0, CERVENA = 4, ZELENA = 2, ZLTA} FARBY;

• explicitná inicializácia: – zoradiť podľa veľkosti– inicializujeme všetky prvky poľa

najhoršie možné: čiastočne explicitné, čiastočne implicitné (ZLTA bude mať hodnotu 3)

Page 43: Procedur álne programovanie: 8 . prednáška

Výpis mena položky

typedef enum { MODRA, CERVENA, ZELENA, ZLTA} FARBY;...c = MODRA;printf("Farba: %s \n", c);printf("Farba: %d \n", (int) c);switch (c) { case MODRA: printf("Modra farba.\n"); break; ...}

chyba!

s pretypovaním: výpis hodnôt

výpis mien položiek:pomocou switch

Page 44: Procedur álne programovanie: 8 . prednáška

Výpis mena položky: pomocou poľa

typedef enum { MODRA, CERVENA, ZELENA, ZLTA} FARBY;

FARBY farba = MODRA;char *nazvy[] = { "Modra", "Cervena", "Zelena", "Zlta" };printf("Farba: %s \n", nazvy[farba]);

len pre neinicializované vymenované typy

Page 45: Procedur álne programovanie: 8 . prednáška

Uniony

• dátový typ– vyhradí sa pamäť pre najväčšiu položku – všetky položky sa prekrývajú

typedef union { char c; int i; float f;} ZIF;ZIF a, *p_a = &a;

a.c = '#';p_a->i = 1;a.f = 2.3;

vyhradí sa pamäť o veľkosti najväčšieho prvku

Union neposkytuje informáciu o typu prvku, ktorý bol naposledy do neho uložený!

premazávajú sa hodnoty

Page 46: Procedur álne programovanie: 8 . prednáška

Union vložený do štruktúry

typedef enum { ZNAK, CELE, REALNE} TYP;

typedef union { char c; int i; float f;} ZIF;

typedef struct { TYP typ; ZIF polozka;} ZN_INT_FL;

vymenovaný typ: slúži na rozlíšenie typov

union: umožňuje uchovávať znak, celé a reálne číslo

štruktúra: obsahuje informáciu o type položky a samotnú položku

Page 47: Procedur álne programovanie: 8 . prednáška

#include<stdio.h>#include<stdlib.h>#define MAXR 5#define MAXS ('E' - 'A')#define NPRIKAZ 10

typedef enum { VYR, CIS} TYP;

typedef struct {char oper;double l_operand;double r_operand;

} VYRAZ;

typedef struct {TYP typ;union {

VYRAZ vyraz;double cislo;

} hodnota;} BUNKA;

Page 48: Procedur álne programovanie: 8 . prednáška

void inicializuj(BUNKA excel[][MAXS], int r);void priradit_vyraz(BUNKA excel[][MAXS], int r, int i, int j, char prikaz[]);double vypocitaj(VYRAZ v);void vypis_hodnoty(BUNKA excel[][MAXS], int r);void vypis_vyrazy(BUNKA excel[][MAXS], int r);

Page 49: Procedur álne programovanie: 8 . prednáška

void main() { BUNKA excel[MAXR][MAXS]; int i=0, j=0; char c; char prikaz[NPRIKAZ];

inicializuj(excel, MAXR);

do { printf("\n*** TABULKOVY PROCESOR ***\n"); printf("= priradene: format =o(c1,c2)\n"); printf("p presun kurzora: format prs\n"); printf("h vypis hodnot \nv vypis vyrazov\n"); printf("k koniec\n"); printf("\nKurzor: %c%d\n\n", i+'A', j); gets(prikaz);

Page 50: Procedur álne programovanie: 8 . prednáška

switch (tolower(prikaz[0])) { case '=': priradit_vyraz(excel, MAXR, i, j, prikaz); break; case 'p': if (sscanf(prikaz+1, "%c %d", &c, &j) != 2) { printf("Nespravny format vstupu.\n");

break; }

if ((i = toupper(c)-'A') > MAXR) i = MAXR - 1; if (i < 0) i = 0; if (j > MAXS) j = MAXS - 1; if (j < 0) j = 0; break; case 'h': vypis_hodnoty(excel, MAXR); break; case 'v': vypis_vyrazy(excel, MAXR); break; case 'k': break; default: break;

} } while (prikaz[0] != 'k');}

Page 51: Procedur álne programovanie: 8 . prednáška

void inicializuj(BUNKA excel[][MAXS], int r) { int i, j;

for (i=0; i<r; i++) for (j=0; j<MAXS; j++) { excel[i][j].typ = CIS; excel[i][j].hodnota.cislo = 0.0; }}

typedef enum { VYR, CIS} TYP;

typedef struct {char oper;double l_operand;double r_operand;

} VYRAZ;

typedef struct {TYP typ;union {

VYRAZ vyraz;double cislo;

} hodnota;} BUNKA;

Page 52: Procedur álne programovanie: 8 . prednáška

void vypis_hodnoty(BUNKA excel[][MAXS], int r) { int i, j;

printf("\nVYPIS HODNOT:\n"); for (i=0; i<MAXS; i++) printf(" %d ", i); putchar('\n');

for (i=0; i<r; i++) { printf("%c ", 'A' + i); for (j=0; j<MAXS; j++) { if(excel[i][j].typ == CIS) printf("%.2f ", excel[i][j].hodnota.cislo); else printf("%.2f ", vypocitaj(excel[i][j].hodnota.vyraz)); } putchar('\n'); }}

typedef enum { VYR, CIS} TYP;

typedef struct {char oper;double l_operand;double r_operand;

} VYRAZ;

typedef struct {TYP typ;union {

VYRAZ vyraz;double cislo;

} hodnota;} BUNKA;

Page 53: Procedur álne programovanie: 8 . prednáška

double vypocitaj(VYRAZ v) { switch (v.oper) { case '+': return v.l_operand + v.r_operand; break; case '-': return v.l_operand - v.r_operand; break; case '*': return v.l_operand * v.r_operand; break; case '/': return v.l_operand / v.r_operand; break; default: return 0.0; }} typedef enum {

VYR, CIS} TYP;

typedef struct {char oper;double l_operand;double r_operand;

} VYRAZ;

typedef struct {TYP typ;union {

VYRAZ vyraz;double cislo;

} hodnota;} BUNKA;

Page 54: Procedur álne programovanie: 8 . prednáška

void vypis_vyrazy(BUNKA excel[][MAXS], int r) { int i, j;

printf("\nVYPIS VYRAZOV:\n"); for (i=0; i<MAXS; i++) printf(" %d ", i); putchar('\n');

for (i=0; i<r; i++) { printf("%c ", 'A' + i); for (j=0; j<MAXS; j++) { if(excel[i][j].typ == CIS) printf("%.2f ", excel[i][j].hodnota.cislo); else printf("%c(%.2f, %2.f) ", excel[i][j].hodnota.vyraz.oper, excel[i][j].hodnota.vyraz.l_operand, excel[i][j].hodnota.vyraz.r_operand); } putchar('\n'); }}

typedef enum { VYR, CIS} TYP;

typedef struct {char oper;double l_operand;double r_operand;

} VYRAZ;

typedef struct {TYP typ;union {

VYRAZ vyraz;double cislo;

} hodnota;} BUNKA;

Page 55: Procedur álne programovanie: 8 . prednáška

void priradit_vyraz(BUNKA excel[][MAXS], int r, int i, int j, char prikaz[]){ char c;

if (sscanf(&prikaz[1], "%c", &c) != 1) { printf("Nespravny format.\n"); return; }

if (c == '+' || c == '-' || c == '*' || c == '/') { double x, y; if (sscanf(&prikaz[1], "%c(%lf,%lf)", &c, &x, &y) != 3) { printf("Nespravny format.\n"); return; } excel[i][j].typ = VYR; excel[i][j].hodnota.vyraz.oper = c; excel[i][j].hodnota.vyraz.l_operand = x; excel[i][j].hodnota.vyraz.r_operand = y; }

typedef enum { VYR, CIS} TYP;

typedef struct {char oper;double l_operand;double r_operand;

} VYRAZ;

typedef struct {TYP typ;union {

VYRAZ vyraz;double cislo;

} hodnota;} BUNKA;

Page 56: Procedur álne programovanie: 8 . prednáška

else { double x;

if (sscanf(&prikaz[1], "%lf", &x) != 1) {printf("Nespravny format.\n");return;

}excel[i][j].typ = CIS;excel[i][j].hodnota.cislo = x;

}

}

Page 57: Procedur álne programovanie: 8 . prednáška

Príklad 1: Kruhový zoznam

"Simulácia hry": záznamy o deťoch, ktoré hrajú "Kolo, kolo mlynské" a ešte nevypadli...

akt

ukazovateľ na aktuálny

prvok

štruktúra prvku

meno

dalsi

Page 58: Procedur álne programovanie: 8 . prednáška

Kruhový zoznam: prázdny zoznam

akt

na začiatku je zoznam prázdny (akt = NULL),

musíme ho naplniť záznamami

pridáme prvý záznam, aktuálny prvok bude

ukazovať naňho

akt10

Page 59: Procedur álne programovanie: 8 . prednáška

Kruhový zoznam: jeden prvok

akt

100

akt10

Janko 100

100

Jpridáme druhý záznam, Janko bude ukazovať na nový prvok a nový prvok bude ukazovať na Janka (za aktuálny prvok, ten

sa nemení)

Page 60: Procedur álne programovanie: 8 . prednáška

Kruhový zoznam: jeden prvok

akt

100

akt10

Janko 200

100

Katka 100

200

J

K

pridáme tretí záznam (za aktuálny (medzi Janka a

Katku), zmení sa ukazovateľ Janka, nový záznam bude ukazovať

na Katku)

Page 61: Procedur álne programovanie: 8 . prednáška

Kruhový zoznam: dva prvky

akt

100

akt10

Janko 200

100

Katka 150

200

J

KM

Miško 100

150

Page 62: Procedur álne programovanie: 8 . prednáška

Kruhový zoznam: funkcie

• funkcie:– DIETA *pridaj(DIETA *akt)

pridanie do zoznamu (za aktuálny prvok)– DIETA *zmaz(DIETA *akt)

zmazanie zo zoznamu (za aktuálnym prvkom)– DIETA *posun(DIETA *akt)

posunie ukazovateľa na aktuálny prvok na akt->dalsi

– void vypis(DIETA *akt)výpis zoznamu

menia ukazovateľna aktuálnyprvok

Page 63: Procedur álne programovanie: 8 . prednáška

#include <stdio.h>#include <stdlib.h>#include <conio.h>#define N 50

typedef struct dieta {char meno[N];struct dieta *dalsi;

} DIETA;

DIETA *pridaj(DIETA *akt);DIETA *zmaz(DIETA *akt);DIETA *posun(DIETA *akt);void vypis(DIETA *akt);

Kruhový zoznam: implementácia

Page 64: Procedur álne programovanie: 8 . prednáška

int main() { DIETA *akt = NULL; char c;

do { printf("Kruhovy zoznam.\n"); printf("p: pridaj\n"); printf("z: zmaz\n"); printf("s: posun\n"); printf("k: koniec\n\n");

c = getch();

switch(c) { case 'p': akt = pridaj(akt); break; case 'z': akt = zmaz(akt); break; case 's': akt = posun(akt); break; }

vypis(akt); } while (c != 'k');

return 0;}

Page 65: Procedur álne programovanie: 8 . prednáška

/* pridava za aktualny prvok */DIETA *pridaj(DIETA *akt) { DIETA *p = (DIETA *) malloc (sizeof(DIETA));

printf("Zadajte meno: "); scanf("%s", p->meno);

if (akt == NULL) { /* ak sa vklada prvy zaznam */ akt = p; akt->dalsi = p; /* ukazuje sam na seba */ return akt; } else { /* akt uz ukazuje na nejaky prvok */ p->dalsi = akt->dalsi; /* vlozenie za aktualny */ akt->dalsi = p; return akt->dalsi; }}

Page 66: Procedur álne programovanie: 8 . prednáška

/* maze za aktualnym prvkom */DIETA *zmaz(DIETA *akt) { DIETA *p;

if (akt == NULL) /* zoznam je prazdny => nic */ return NULL; else if (akt->dalsi == akt) { /* jednoprvkovy zoznam */ free(akt); return NULL; } else { /* aspon 2 prvky v zozname */ p = akt->dalsi->dalsi; free(akt->dalsi); akt->dalsi = p; } return akt;}

Page 67: Procedur álne programovanie: 8 . prednáška

/* vrati ukazovatel na dalsi prvok */DIETA *posun(DIETA *akt) {

return (akt == NULL ? NULL : akt->dalsi);}

/* vypise zoznam */void vypis(DIETA *akt) {

DIETA * p = akt;

if (p == NULL) printf("Zoznam je prazdny.\n\n");

else {do {

printf("%s -> ", p->meno);p = p->dalsi;

} while (p != akt);printf("\n\n");

}}

Page 68: Procedur álne programovanie: 8 . prednáška

Príklad 2: nepovinná domáca úloha

Tabulkový procesor: dolpňte program pre jednoduchý tabuľkový procesor o vnorené

výrazy (napr. +(2.0,*(3.0,1,5)))

Page 69: Procedur álne programovanie: 8 . prednáška

Tabulkový procesor s vnorenými

typedef enum { VYR, CIS} TYP;

typedef struct vyraz {char oper;struct bunka *l_operand;struct bunka *r_operand;

} VYRAZ;

typedef struct bunka {TYP typ;union {

VYRAZ *vyraz;double cislo;

} hodnota;} BUNKA;

typ: VYRhodnota.vyraz

typ: CIShodnota.cislo: 2.0

oper: +l_operandr_operand

typ: VYRhodnota.vyraz

oper: *l_operandr_operand

typ: CIShodnota.cislo: 1.5

typ: CIShodnota.cislo: 3.0

+(2.0,*(3.0,1,5))