curs 9 - agendadlucanu/cursuri/ap/resurse/curs9.pdf · variabile ale tipului enum zi enum zi azi,...

38
Dorel Lucanu Algoritmica si programare Curs 9 - Agenda crearea de sinonime cu typedef tipuri enumerative structuri void variabile dinamice liste liniare - implementare

Upload: others

Post on 26-Dec-2019

12 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Curs 9 - Agendadlucanu/cursuri/ap/resurse/curs9.pdf · variabile ale tipului enum zi enum zi azi, ieri; tipul enumerativ este compatibil cu charsau cu un tip intreg cu semn sau cu

Dorel Lucanu Algoritmica si programare

Curs 9 - Agenda

crearea de sinonime cu typedef

tipuri enumerativestructurivoidvariabile dinamiceliste liniare - implementare

Page 2: Curs 9 - Agendadlucanu/cursuri/ap/resurse/curs9.pdf · variabile ale tipului enum zi enum zi azi, ieri; tipul enumerativ este compatibil cu charsau cu un tip intreg cu semn sau cu

Dorel Lucanu Algoritmica si programare

crearea de sinonime cu typedef

o declaratie de formadouble a[20];declara variabila a ca apartinand tipului

double[20]putem asocia tipului double[20] un sinonim:typedef double TablouDouble20[20];

variabila poate fi declarata acum asa:TablouDouble20 a;

sintaxa⟨decl-typedef⟩ ::= typedef ⟨definitie-tip⟩ ⟨sinonim⟩

Page 3: Curs 9 - Agendadlucanu/cursuri/ap/resurse/curs9.pdf · variabile ale tipului enum zi enum zi azi, ieri; tipul enumerativ este compatibil cu charsau cu un tip intreg cu semn sau cu

Dorel Lucanu Algoritmica si programare

exemple de tipuri si sinonime

tipuri predefinite: char int long double etc.typedef int Integer;tipuri pointer: T*typedef int *PInt;

PInt este sinonim pentru int *

tablouritypedef double Matrice[MMAX][NMAX];

Matrice este sinonim pentrudouble[MMAX][NMAX]

typedef int *TablouPInt[NMAX];TablouPInt este sinonim pentru int *[NMAX]

Page 4: Curs 9 - Agendadlucanu/cursuri/ap/resurse/curs9.pdf · variabile ale tipului enum zi enum zi azi, ieri; tipul enumerativ este compatibil cu charsau cu un tip intreg cu semn sau cu

Dorel Lucanu Algoritmica si programare

exemple de tipuri si sinonime

functiitypedef int Fct1(double);

Fct1 este sinonim pentru int (double) = tipul functiilor care au un parametru doublesi intorc o valoare int

typedef int* Fct2();Fct2 este sinonim pentru int *() = tipulfunctiilor fara parametru si care intorcpointer la un int

pointer la functiitypedef int (*Fct3)();

Fct3 este sinonim pentru int (*)() = tipulpointerilor la functii fara parametru si care intorc un int

Page 5: Curs 9 - Agendadlucanu/cursuri/ap/resurse/curs9.pdf · variabile ale tipului enum zi enum zi azi, ieri; tipul enumerativ este compatibil cu charsau cu un tip intreg cu semn sau cu

Dorel Lucanu Algoritmica si programare

Tipuri enumerative

o declaratie de formaenum zi {lu, ma, mi, jo, vi, si, du};declara un tip cu numele enum zi si cu

constantele lu, ma, mi, jo, vi, si, duvariabile ale tipului enum zienum zi azi, ieri;

tipul enumerativ este compatibil cu char sau cu un tip intreg cu semn sau cu un tip intreg farasemn (depinde de implementare)astfel ca fiecare constanta a tipului are asociatao valoare intreaga

(int)lu = 0, (int)ma = 1, …, (int)du = 6si expresii ca ieri++ sau azi + 3 au sens

Page 6: Curs 9 - Agendadlucanu/cursuri/ap/resurse/curs9.pdf · variabile ale tipului enum zi enum zi azi, ieri; tipul enumerativ este compatibil cu charsau cu un tip intreg cu semn sau cu

Dorel Lucanu Algoritmica si programare

Tipuri enumerative

valorile asociate pot fi precizate explicitenum zi {lu = 1, ma, mi, jo, vi, si, du};enum roman {i=1, ii, iii, iv, x=10, xi, xii};

se poate utiliza in combinatie cu typedeftypedef enum zi zi;zi azi;enum zi ieri;

care este echivalenta cutypedef enum zi {lu, ma, ...} zi;

sautypedef enum {lu, ma, ...} zi;zi azi;

dar se poate si asa:enum {lu, ma, ...} azi, ieri;

Page 7: Curs 9 - Agendadlucanu/cursuri/ap/resurse/curs9.pdf · variabile ale tipului enum zi enum zi azi, ieri; tipul enumerativ este compatibil cu charsau cu un tip intreg cu semn sau cu

Dorel Lucanu Algoritmica si programare

Structuri simple

enum Culoare {trefla, cupa, caro, pica};typedef enum Culoare Culoare; struct Carte {

int val;Culoare cul;

};

Page 8: Curs 9 - Agendadlucanu/cursuri/ap/resurse/curs9.pdf · variabile ale tipului enum zi enum zi azi, ieri; tipul enumerativ este compatibil cu charsau cu un tip intreg cu semn sau cu

Dorel Lucanu Algoritmica si programare

Tipuri enumerative si Structuri simple

struct Carte atu;atu.val = 10;atu.cul = caro;

atu struct Carte

atu.val int

atu.cul enum Culoare

10 caro

Page 9: Curs 9 - Agendadlucanu/cursuri/ap/resurse/curs9.pdf · variabile ale tipului enum zi enum zi azi, ieri; tipul enumerativ este compatibil cu charsau cu un tip intreg cu semn sau cu

Dorel Lucanu Algoritmica si programare

Structuri simple

printf("atuul este: %d", atu.val);switch (atu.cul){case trefla:

printf(" %s\n", "trefla");break;

case caro:printf(" %s\n", "caro");break;

// ...}

Page 10: Curs 9 - Agendadlucanu/cursuri/ap/resurse/curs9.pdf · variabile ale tipului enum zi enum zi azi, ieri; tipul enumerativ este compatibil cu charsau cu un tip intreg cu semn sau cu

Dorel Lucanu Algoritmica si programare

Asocierea de sinonime pentru structuri

numele struct Carte este prea lungii putem asocia un sinonimtypedef struct Carte {int val;Culoare cul;

} Carte;

acum putem declara o variabila mult maisimplu

Carte atu;

acum Carte si struct Carte sunt sinonime

Page 11: Curs 9 - Agendadlucanu/cursuri/ap/resurse/curs9.pdf · variabile ale tipului enum zi enum zi azi, ieri; tipul enumerativ este compatibil cu charsau cu un tip intreg cu semn sau cu

Dorel Lucanu Algoritmica si programare

Asocierea de sinonime pentru structuri

cu typedef structura poate fi si anonimatypedef struct{

int val;Culoare cul;

} Carte;acum poate fi utilizat numai Carte

Page 12: Curs 9 - Agendadlucanu/cursuri/ap/resurse/curs9.pdf · variabile ale tipului enum zi enum zi azi, ieri; tipul enumerativ este compatibil cu charsau cu un tip intreg cu semn sau cu

Dorel Lucanu Algoritmica si programare

Structuri complexe

un jucator are nume, o mana de carti si o suma de banitypedef struct Jucator{char* nume;Carte mana[4];long suma;

} Jucator;o masa are un numar si 4 jucatoritypedef struct Masa{int nr;Jucator jucator[4];

} Masa;

Page 13: Curs 9 - Agendadlucanu/cursuri/ap/resurse/curs9.pdf · variabile ale tipului enum zi enum zi azi, ieri; tipul enumerativ este compatibil cu charsau cu un tip intreg cu semn sau cu

Dorel Lucanu Algoritmica si programare

Structuri complexe

jucatorul j primeste 8 de trefla ca a doua carte j.mana[1].val = 8;j.mana[1].cul = trefla;

jucatorul 3 de la masa m primeste 9 de caro ca prima cartem.jucator[2].mana[0].val = 9;m.jucator[2].mana[0].cul = caro;

Page 14: Curs 9 - Agendadlucanu/cursuri/ap/resurse/curs9.pdf · variabile ale tipului enum zi enum zi azi, ieri; tipul enumerativ este compatibil cu charsau cu un tip intreg cu semn sau cu

Dorel Lucanu Algoritmica si programare

Tipul void

tipul void nu are constante (valori)

este utilizat cand functiile nu intorc valori(proceduri)

void f(int *px){

if (px) *px /= 2;}

sau cand functiile nu au parametrivoid f(void) /* echivalent cu void f() */int f(void) /* echivalent cu int f() */

… sau alte in cazuri …

Page 15: Curs 9 - Agendadlucanu/cursuri/ap/resurse/curs9.pdf · variabile ale tipului enum zi enum zi azi, ieri; tipul enumerativ este compatibil cu charsau cu un tip intreg cu semn sau cu

Dorel Lucanu Algoritmica si programare

Variabile dinamice - creare

double *px;px = (double*)malloc(sizeof(double));

/* sau */px = (double*)calloc(1, sizeof(double));

void *malloc( size_t size );void *calloc( size_t num, size_t size );

px double*

*px double

Page 16: Curs 9 - Agendadlucanu/cursuri/ap/resurse/curs9.pdf · variabile ale tipului enum zi enum zi azi, ieri; tipul enumerativ este compatibil cu charsau cu un tip intreg cu semn sau cu

Dorel Lucanu Algoritmica si programare

Variabile dinamice - distrugere

free(px);

void free( void *memblock );

px double*

*px double

Page 17: Curs 9 - Agendadlucanu/cursuri/ap/resurse/curs9.pdf · variabile ale tipului enum zi enum zi azi, ieri; tipul enumerativ este compatibil cu charsau cu un tip intreg cu semn sau cu

Dorel Lucanu Algoritmica si programare

Lista liniara: implementare cu tablouri

L = (e0,…, en-1)

MAX-1

L Elt[MAX] …

0 nrElt-1

e0 en-1

Page 18: Curs 9 - Agendadlucanu/cursuri/ap/resurse/curs9.pdf · variabile ale tipului enum zi enum zi azi, ieri; tipul enumerativ este compatibil cu charsau cu un tip intreg cu semn sau cu

Dorel Lucanu Algoritmica si programare

Lista liniara: implementare cu tablouri

#include "elt.h"

#define MAX_LLIN 1000#define SUCCES 0#define ERR_LLIN_MEM_INSUF 1#define ERR_LLIN_INDEX_GRESIT 2

typedef struct Llin {Elt tab[];int nrElt;

}Llin;

Page 19: Curs 9 - Agendadlucanu/cursuri/ap/resurse/curs9.pdf · variabile ale tipului enum zi enum zi azi, ieri; tipul enumerativ este compatibil cu charsau cu un tip intreg cu semn sau cu

Dorel Lucanu Algoritmica si programare

Lista liniara: implementare cu tablouri

int listaVida(Llin *l){

/* aloca memorie pentru tablou */l->tab = (Elt *)calloc(MAX_LLIN,sizeof(Elt));if (l->tab == NULL)

return ERR_LLIN_MEM_INSUF;

/* initializeaza numarul de elemente */l->nrElt = 0;

/* operatie terminata cu succes */return SUCCES;

}

Page 20: Curs 9 - Agendadlucanu/cursuri/ap/resurse/curs9.pdf · variabile ale tipului enum zi enum zi azi, ieri; tipul enumerativ este compatibil cu charsau cu un tip intreg cu semn sau cu

Dorel Lucanu Algoritmica si programare

Lista liniara: implementare cu tablouri

int insereaza( Llin *l, Elt elt, int k ) {

int j;

/* testeaza validitatea indicelui */if ((k < 0) || (k > l->nrElt))

return ERR_LLIN_INDEX_GRESIT;

/* testeaza daca mai exista loc in tablou */if (l->nrElt == MAX_LLIN-1)

return ERR_LLIN_MEM_INSUF;

/* deplaseaza elementele la dreapta */for (j = l->nrElt-1; j >= k; j--)

l->tab[j+1] = l->tab[j];

Page 21: Curs 9 - Agendadlucanu/cursuri/ap/resurse/curs9.pdf · variabile ale tipului enum zi enum zi azi, ieri; tipul enumerativ este compatibil cu charsau cu un tip intreg cu semn sau cu

Dorel Lucanu Algoritmica si programare

Lista liniara: implementare cu tablouri

/* pune pe pozitia k noul element */l->tab[k] = elt;

/* actualizeaza numarul de elemente */l->nrElt++;

/* operatie terminata cu succes */return SUCCES;

}

Page 22: Curs 9 - Agendadlucanu/cursuri/ap/resurse/curs9.pdf · variabile ale tipului enum zi enum zi azi, ieri; tipul enumerativ este compatibil cu charsau cu un tip intreg cu semn sau cu

Dorel Lucanu Algoritmica si programare

Lista liniara: implementare cu tablouri

void parcurge(Llin *l, void viziteaza(Elt)){

int i;for (i = 0; i < l->nrElt; i++)viziteaza(l->tab[i]);

}

Page 23: Curs 9 - Agendadlucanu/cursuri/ap/resurse/curs9.pdf · variabile ale tipului enum zi enum zi azi, ieri; tipul enumerativ este compatibil cu charsau cu un tip intreg cu semn sau cu

Dorel Lucanu Algoritmica si programare

Lista liniara: implementare cu tablouri

Llin lista;listaVida(&lista);for (i=1; i<8; i++){

e = i;if (coderr = insereaza(&lista, e, i-1))

printf("\n ERR LLIN: %d\n", coderr);}parcurge(&lista, afiseazaInt);

Page 24: Curs 9 - Agendadlucanu/cursuri/ap/resurse/curs9.pdf · variabile ale tipului enum zi enum zi azi, ieri; tipul enumerativ este compatibil cu charsau cu un tip intreg cu semn sau cu

Dorel Lucanu Algoritmica si programare

demo

exemplele de la curs se gasesc la adresahttp://thor.info.uaic.ro/~dlucanu/ap/ex.html

alte exemple (PC I)http://thor.info.uaic.ro/~dlucanu/pc/pcI/html/ex.

html

Page 25: Curs 9 - Agendadlucanu/cursuri/ap/resurse/curs9.pdf · variabile ale tipului enum zi enum zi azi, ieri; tipul enumerativ este compatibil cu charsau cu un tip intreg cu semn sau cu

Dorel Lucanu Algoritmica si programare

Liste liniare: implementarea cu liste inlantuite

L = (e0,…, en-1)

L.prim

…e0 e1 en-1

Page 26: Curs 9 - Agendadlucanu/cursuri/ap/resurse/curs9.pdf · variabile ale tipului enum zi enum zi azi, ieri; tipul enumerativ este compatibil cu charsau cu un tip intreg cu semn sau cu

Dorel Lucanu Algoritmica si programare

Liste liniare: implementarea cu liste inlantuite

typedef struct NodLlin{

Elt elt;struct NodLLin *succ;

} NodLLin;

typedef struct Llin{

NodLlin *prim;int nrElt;

} Llin;

Page 27: Curs 9 - Agendadlucanu/cursuri/ap/resurse/curs9.pdf · variabile ale tipului enum zi enum zi azi, ieri; tipul enumerativ este compatibil cu charsau cu un tip intreg cu semn sau cu

Dorel Lucanu Algoritmica si programare

Liste liniare: implementarea cu liste inlantuite

int insereaza( Llin *l, Elt elt, int k ){

int j; NodLlin *p, *q;

/* testeaza exceptiile */if ((k < 0) || (k > l->nrElt))

return ERR_LLIN_INDEX_GRESIT;

/* aloca spatiu pentru noul nod */q = (NodLlin *)calloc(1, sizeof(NodLlin));if (q == NULL)

return ERR_LLIN_MEM_INSUF;

/* memoreaza noua informatie */q->elt = elt;

Page 28: Curs 9 - Agendadlucanu/cursuri/ap/resurse/curs9.pdf · variabile ale tipului enum zi enum zi azi, ieri; tipul enumerativ este compatibil cu charsau cu un tip intreg cu semn sau cu

Dorel Lucanu Algoritmica si programare

Liste liniare: implementarea cu liste inlantuite/* stabileste noile legaturi */

if ((k == 0) || (l->prim == NULL)) { // primulsau lista vida

q->succ = l->prim;l->prim = q;

}else { // nu-i primul si lista nevida

for (p = l->prim, j = 0; j < k-1; j++)p = p->succ;

q->succ = p->succ; p->succ = q;}

/* actualizeaza numarul de elemente */l->nrElt++;

/* operatie terminata cu succes */return SUCCES;

}

Page 29: Curs 9 - Agendadlucanu/cursuri/ap/resurse/curs9.pdf · variabile ale tipului enum zi enum zi azi, ieri; tipul enumerativ este compatibil cu charsau cu un tip intreg cu semn sau cu

Dorel Lucanu Algoritmica si programare

Liste liniare: implementarea cu liste inlantuite

int i, e, coderr;Llin lista;listaVida(&lista);for (i=1; i<8; i++){

e = i;if (coderr = insereaza(&lista, e, i-1))

printf("\n ERR LLIN: %d\n", coderr);}parcurge(&lista, afiseazaInt);

Page 30: Curs 9 - Agendadlucanu/cursuri/ap/resurse/curs9.pdf · variabile ale tipului enum zi enum zi azi, ieri; tipul enumerativ este compatibil cu charsau cu un tip intreg cu semn sau cu

Dorel Lucanu Algoritmica si programare

demo

Page 31: Curs 9 - Agendadlucanu/cursuri/ap/resurse/curs9.pdf · variabile ale tipului enum zi enum zi azi, ieri; tipul enumerativ este compatibil cu charsau cu un tip intreg cu semn sau cu

Dorel Lucanu Algoritmica si programare

liste de jucatori si liste de carti in acelasi program

pune definitiile comune intr-un fisierLlin_macro.hcreeaza copiile LlinJuc.h si LlinJuc.c

inlocuiese Elt cu Jucatorinlocuieste Llin cu LlinJucinlocuieste numele functiilor fct() cu LlinJuc_fct() (LlinJuc_insreaza(), …)

creeaza copiile LlinCarte.h si LlinCarte.cinlocuiese Elt cu Carteinlocuieste Llin cu LlinCarteinlocuieste numele functiilor fct() cu LlinCarte_fct() (LlinCarte_insreaza(), …)

Page 32: Curs 9 - Agendadlucanu/cursuri/ap/resurse/curs9.pdf · variabile ale tipului enum zi enum zi azi, ieri; tipul enumerativ este compatibil cu charsau cu un tip intreg cu semn sau cu

Dorel Lucanu Algoritmica si programare

demo

Page 33: Curs 9 - Agendadlucanu/cursuri/ap/resurse/curs9.pdf · variabile ale tipului enum zi enum zi azi, ieri; tipul enumerativ este compatibil cu charsau cu un tip intreg cu semn sau cu

Dorel Lucanu Algoritmica si programare

Clase de memorii: auto

int doi() {int x = 2;return x;

}

void main() {int a;{ int b = 5;a = b*doi();

}printf(“a = %d\n”, a);}

a5b2x

stiva

•durata locala; •este implicita pentruvariabilele declarateintr-un bloc

10

Page 34: Curs 9 - Agendadlucanu/cursuri/ap/resurse/curs9.pdf · variabile ale tipului enum zi enum zi azi, ieri; tipul enumerativ este compatibil cu charsau cu un tip intreg cu semn sau cu

Dorel Lucanu Algoritmica si programare

Clase de memorii: extern (ex. I_29.c)

I_29fct.c

/* ... */extern double memorie,

val_precedenta,val_curenta;

extern char operatie;

/* ... */

I_29main.c

/* ... */double memorie,

val_precedenta,val_curenta;

char operatie;

/* ... */

o variabila sau o functie declarataextern este vizibila din alt fisier decatcel in care este definit

Page 35: Curs 9 - Agendadlucanu/cursuri/ap/resurse/curs9.pdf · variabile ale tipului enum zi enum zi azi, ieri; tipul enumerativ este compatibil cu charsau cu un tip intreg cu semn sau cu

Dorel Lucanu Algoritmica si programare

Clase de memorii: static

o variabila sau o functie declarata static are durata de viata eagala cu cea a programului

Exemplul I_30.cint f(void) {

static int nr_apeluri=0;nr_apeluri++;printf("\nFunctia f() este apelatapentru ""a %d-a oara.", nr_apeluri);

// ...return nr_apeluri;

}

Page 36: Curs 9 - Agendadlucanu/cursuri/ap/resurse/curs9.pdf · variabile ale tipului enum zi enum zi azi, ieri; tipul enumerativ este compatibil cu charsau cu un tip intreg cu semn sau cu

Dorel Lucanu Algoritmica si programare

Clase de memorii: static - local (ex. I_30.c)

int f(void);int main(void) {

int i;for (i=0; i<10; i++)if (cond(i)) f();

return 0;}

Page 37: Curs 9 - Agendadlucanu/cursuri/ap/resurse/curs9.pdf · variabile ale tipului enum zi enum zi azi, ieri; tipul enumerativ este compatibil cu charsau cu un tip intreg cu semn sau cu

Dorel Lucanu Algoritmica si programare

Clase de memorii: static - extern (ex. I_31)

extern unsigned pseudo;unsigned random(void) {

pseudo = (MULTIPLICATOR*pseudo+INCREMENT)%MODUL;return pseudo;

}

unsigned pseudo=PSEUDO_INITIAL;int main(void) {

/*...*/for (i=0; i<10; i++)

printf("#%d: %u\n", i, random());/*...*/

}

I_31fct.c

I_31main.c

Page 38: Curs 9 - Agendadlucanu/cursuri/ap/resurse/curs9.pdf · variabile ale tipului enum zi enum zi azi, ieri; tipul enumerativ este compatibil cu charsau cu un tip intreg cu semn sau cu

Dorel Lucanu Algoritmica si programare

Domeniul de vizibilitate

#include <stdio.h>int a;int f(int x){

int y;y = x + a;{double a;a = (double)y * 2.0;y += (int) a;

}a = y – x;

}

variabila locala

variabila globala

parametru