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

Post on 26-Dec-2019

13 Views

Category:

Documents

0 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Dorel Lucanu Algoritmica si programare

Curs 9 - Agenda

crearea de sinonime cu typedef

tipuri enumerativestructurivoidvariabile dinamiceliste liniare - implementare

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⟩

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]

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

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

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;

Dorel Lucanu Algoritmica si programare

Structuri simple

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

int val;Culoare cul;

};

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

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;

// ...}

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

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

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;

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;

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 …

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

Dorel Lucanu Algoritmica si programare

Variabile dinamice - distrugere

free(px);

void free( void *memblock );

px double*

*px double

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

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;

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;

}

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];

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;

}

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

}

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

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

Dorel Lucanu Algoritmica si programare

Liste liniare: implementarea cu liste inlantuite

L = (e0,…, en-1)

L.prim

…e0 e1 en-1

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;

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;

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;

}

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

Dorel Lucanu Algoritmica si programare

demo

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(), …)

Dorel Lucanu Algoritmica si programare

demo

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

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

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;

}

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;}

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

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

top related