curs 9 - agendadlucanu/cursuri/ap/resurse/curs9.pdf · variabile ale tipului enum zi enum zi azi,...
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