460 likes | 525 Views
Programmazione di Calcolatori. Lezione XXV: gli stack e i vettori. Stack di interi e array. Graficamente:. stck[max_dim-1]. dimensione massima dello stack. struct stoi. max_dim. int. max_dim. posizione all’interno dell’array dell’elemento affiorante dello stack. testa. int.
E N D
Programmazione di Calcolatori Lezione XXV: gli stack e i vettori Programmazione di Calcolatori: gli stack e i vettori
Stack di interi e array • Graficamente: stck[max_dim-1] dimensione massima dello stack struct stoi max_dim int max_dim posizione all’interno dell’array dell’elemento affiorante dello stack testa int int * stck array per la memorizzazione dei valori nello stack stck[0] Programmazione di Calcolatori: gli stack e i vettori
Stack di interi: definizione dei tipi // definizione del tipo strutturato stack di interi struct stoi { // dimensione massima dello stack int max_dim; // posizione nel vettore dell'elemento // affiorante dello stack int testa; // riferimento al vettore che memorizza gli // elementi dello stack int *stck; }; Programmazione di Calcolatori: gli stack e i vettori
InitStack() • La logica: stck[dim-1] struct stoi stack max_dim dim dim testa -1 stck stck[0] Programmazione di Calcolatori: gli stack e i vettori
InitStack() • La funzione: // alloca memoria e inizializza le variabili per uno stack di interi // di dimensione massima pari al valore del parametro struct stoi *stoiIni (int dim) { // definisce un puntatore alla variabile strutturata per lo stack struct stoi *stack; // alloca memoria per la variabile strutturata stack = (struct stoi *) malloc(sizeof(struct stoi)); // testa l'esito dell'allocazione. Se negativo termina con NULL if (stack == NULL) return(NULL); // altrimenti, alloca memoria per il vettore che memorizzera’ i // valori dello stack stack -> stck = (int *) malloc(dim * sizeof(int)); // testa l'esito dell'allocazione. Se negativo recupera la memoria // gia' allocata e termina con NULL if (stack -> stck == NULL) { free(stack); return(NULL); }; Continua … Programmazione di Calcolatori: gli stack e i vettori
InitStack() // nella variabile strutturata, inizializza la dimensione massima dello // stack stack -> max_dim = dim; // nella variabile strutturata, inizializza la posizione nel vettore // dell’elemento affiorante dello stack stack -> testa = EMPTY_STACK; // restituisce il riferimento variabile strutturata per lo stack return(stack); }; Programmazione di Calcolatori: gli stack e i vettori
Push() • La logica: stck[dim-1] struct stoi stack max_dim dim dim testa stck X stck[0] Programmazione di Calcolatori: gli stack e i vettori
Push() • La funzione: // inserisce sullo stack il valore passato come parametro int push(struct stoi *stack, int valore) { // se lo stack contiene il numero massimo di elementi previsto // termina con esito negativo if (stoiFull(*stack) == TRUE) return(NEG_RESULT); // altrimenti inserisce il nuovo elemento sullo stack stack->stck[stack->testa+1] = valore; // aggiorna la posizione nel vettore dell'elemento affiorante stack->testa = stack->testa + 1; // termina con esito positivo return(POS_RESULT); }; Programmazione di Calcolatori: gli stack e i vettori
Pop() • La logica: stck[dim-1] struct stoi stack max_dim dim dim testa X stck valore valore int val stck[0] Programmazione di Calcolatori: gli stack e i vettori
Pop() • La funzione: // se lo stack non e' vuoto, accede al valore memorizzato dall'elemento // affiorante, lo memorizza nella variabile riferita dal parametro e // termina con esito positivo. Termina con esito negativo, altrimenti. int pop(struct stoi *stack, int *val) { // se lo stack e' vuoto termina con esito negativo if (stoiEmpty(*stack)) return(NEG_RESULT); // altrimenti memorizza nella variabile riferita dal parametro val il // valore dell’elemento affiorante dello stack *val = stack->stck[stack->testa]; // aggiorna la posizione nel vettore dell'elemento affiorante dello stack stack->testa = stack->testa-1; // termina con esito positivo return(POS_RESULT); }; Programmazione di Calcolatori: gli stack e i vettori
Top() • La logica: stck[dim-1] struct stoi stack max_dim dim dim testa stck valore valore int val stck[0] Programmazione di Calcolatori: gli stack e i vettori
Top() • La funzione: // se lo stack non e' vuoto, accede al valore memorizzato dell'elemento // affiorante, lo memorizza nella variabile riferita dal parametro e termina // con esito positivo. Altrimenti, termina con esito negativo int top(struct stoi stack, int *val) { // se lo stack e' vuoto termina con esito negativo if (stoiEmpty(stack)) return(NEG_RESULT); // altrimenti memorizza nella variabile riferita dal parametro val il // valore sulla testa dello stack *val = stack.stck[stack.testa]; // termina con esito positivo return(POS_RESULT); }; Programmazione di Calcolatori: gli stack e i vettori
Gestione di una lista di interi • Specifiche: • implementare una soluzione per il tipo di dato astratto stack di interi che preveda le seguenti operazioni: • inizializzazione • Push() • Top() • Pop() • visualizzazione del contenuto • test di stack vuoto • reset Programmazione di Calcolatori: gli stack e i vettori
Organizzazione del codice: file e loro contenuto • Definizione dei tipi: • stoi_tipi.h: definizioni dei tipi, strutturati e non, utilizzati nella implementazione del tipo di dato astratto “stackofinteger” (stoi) • Codice sorgente: • stoi_main.c: codice per l’attivazione delle operazioni implementate per il tipo di dato astratto stoi • stoi_ges.c: definizione delle funzioni che implementano le operazioni definite sul tipo di dato astratto stoi • stoi_uti.c: definizione delle utilities di supporto alle funzioni che implementano le operazioni definite sul tipo di dato astratto stoi Programmazione di Calcolatori: gli stack e i vettori
Organizzazione del codice: file e loro contenuto • Dichiarazioni extern • stoi_ges.h: dichiarazioni extern delle funzioni che implementano le operazioni definite sul tipo di dato astratto stoi • stoi_uti.h: dichiarazioni extern delle utilities di supporto alle funzioni che implementano le operazioni definite sul tipo di dato astratto stoi • Pseudodichiarazioni: • stoi_const.h: pseudodichiarazioni per le costanti simboliche utilizzate nella implementazione del tipo di dato astratto stoi • stoi_msg.h: pseudodichiarazioni per i messaggi restituiti nella implementazione del tipo di dato astratto stoi Programmazione di Calcolatori: gli stack e i vettori
Gestione di una lista di interi: file stoi_tipi.h // Nome e posizione del file: // Lezione_XXV/stoi_tipi.h // Descrizione del contenuto del file: // definizioni dei tipi, strutturati e non, utilizzati nella // implementazione del tipo di dato astratto “stack of integer” // tramite un vettore di interi // definizione del tipo strutturato // stack di interi struct stoi { // dimensione massima della istanza int max_dim; // posizione nel vettore dell'elemento affiorante della istanza int testa; // riferimento al vettore che memorizza gli elementi // della istanza int *stck; }; Programmazione di Calcolatori: gli stack e i vettori
Gestione di una lista di interi: file stoi_ges.c // Nome e posizione del file: // Lezione_XXV/lista/stoi_ges.c // Descrizione del contenuto del file: // definizione delle funzioni che implementano le operazioni definite // sul tipo di dato astratto "stack of integer" // PSEUDODICHIARAZIONI // pseudodichiarazioni per i messaggi restituiti nella implementazione del // tipo di dato astratto "stack of integer" #include "./stoi_msg.h" // pseudodichiarazioni per le costanti simboliche utilizzate nella // implementazione del tipo di dato astratto "stack of integer" #include "./stoi_const.h" // DEFINIZIONI DI TIPO // definizioni dei tipi, strutturati e non, utilizzati nella implementazione // del tipo di dato astratto “stack of integer” tramite un vettore di interi #include "./stoi_tipi.h" // EXTERN // inclusione del file di intestazione della libreria // standard che contiene definizioni di macro, // costanti e dichiarazioni di funzioni e tipi funzionali // alle varie operazioni di I/O #include <stdio.h> Continua … Programmazione di Calcolatori: gli stack e i vettori
Gestione di una lista di interi: file stoi_ges.c // inclusione del file di intestazione della libreria che contiene // definizioni di macro, costanti e dichiarazioni di funzioni e tipi // di interesse generale #include <stdlib.h> // dichiarazioni extern delle utilities di supporto alle funzioni che // implementano le operazioni definite sul tipo di dato astratto // “stack of integer” #include "./stoi_uti.h“ Continua … Programmazione di Calcolatori: gli stack e i vettori
Gestione di una lista di interi: file stoi_ges.c // Nome della funzione: // stoiEmpty() // Tipo, nome e significato dei parametri della funzione: // struct stoi stack: descrittore della istanza del tipo // di dato astratto "stack of integer" // Descrizione della funzionalita' implementata: // implementa il test di istanza vuota // Tipo e significato del valore restituito: // int: TRUE se l’istanza è vuota; // FALSE altrimenti int stoiEmpty(struct stoi stack) { // restituisce TRUE se l’istanza è vuota, FALSE altrimenti if (stack.testa == EMPTY_STACK) return(TRUE); else return(FALSE); }; Continua … Programmazione di Calcolatori: gli stack e i vettori
Gestione di una lista di interi: file stoi_ges.c // Nome della funzione: // push() // Tipo, nome e significato dei parametri della funzione: // struct stoi *stack: riferimento al descrittore dell’istanza del tipo di // dato astratto “stack of integer” // int valore: valore da inserire nell'istanza // Descrizione della funzionalita' implementata: // inserisce un nuovo valore nell’istanza del tipo di dato astratto “stack of // integer” // Tipo e significato del valore restituito: // int: POS_RESULT se l'operazione ha esito positivo; // NEG_RESULT altrimenti int push(struct stoi *stack, int valore) { // se l’istanza contiene il numero massimo di elementi previsto // termina con esito negativo if (stoiFull(*stack) == TRUE) return(NEG_RESULT); // altrimenti inserisce il nuovo elemento nell’istanza stack->stck[stack->testa+1] = valore; // aggiorna la posizione dell'elemento affiorante nel vettore stack->testa = stack->testa + 1; // termina con esito positivo return(POS_RESULT); }; Continua … Programmazione di Calcolatori: gli stack e i vettori
Gestione di una lista di interi: file stoi_ges.c // Nome della funzione: // stoiVis() // Tipo, nome e significato dei parametri della funzione: // struct stoi stack: descrittore dell’istanza del tipo di dato astratto // “stack of integer” // Descrizione della funzionalita' implementata: // visualizza l’istanza di un tipo di dato astratto “stack of integer”: gli // interi sono visualizzati in ordine inverso rispetto a quello di inserimento // Tipo e significato del valore restituito: // alcuno void stoiVis (struct stoi stack) { // visualizza la dimensione massima e la dimensione attuale dell’istanza printf(MAX_DIM, stack.max_dim); printf(NUMB_OF_ITEMS, stack.testa+1); // se l'istanza e' vuota visualizza un opportuno messaggio e termina if (stoiEmpty(stack)) printf(EMPTY_STOI); else // altrimenti { int curs; // definisce un cursore // scandisce l'array riferito dal descrittore for (curs = stack.testa; curs >= 0; curs--) printf(" <- %d", stack.stck[curs]); // visualizza l'elemento corrente }; }; Continua … Programmazione di Calcolatori: gli stack e i vettori
Gestione di una lista di interi: file stoi_ges.c // Nome della funzione: // top() // Tipo, nome e significato dei parametri della funzione: // struct stoi stack: descrittore dell’istanza del tipo di dato astratto // “stack of integer” // int *val: riferimento alla variabile nella quale memorizzare // il valore dell'elemento affiorante dell’istanza // Descrizione della funzionalita' implementata: // se l’istanza non e' vuota, accede al valore memorizzato dell'elemento // affiorante, lo memorizza nella variabile riferita dal parametro e termina // con esito positivo. Altrimenti, termina con esito negativo // Tipo e significato del valore restituito: // int: POS_RESULT se l’istanza non e' vuota; // NEG_RESULT altrimenti int top(struct stoi stack, int *val) { // se l’istanza non e' vuota termina con esito negativo if (stoiEmpty(stack)) return(NEG_RESULT); // altrimenti memorizza nella variabile riferita dal parametro il valore // affiorante dell’istanza *val = stack.stck[stack.testa]; // termina con esito positivo return(POS_RESULT); }; Continua … Programmazione di Calcolatori: gli stack e i vettori
Gestione di una lista di interi: file stoi_ges.c // Nome della funzione: // pop() // Tipo, nome e significato dei parametri della funzione: // struct stoi *stack: riferimento al descrittore dell’istanza del tipo di // dato astratto “stack of integer” // int *val: riferimento alla variabile nella quale memorizzare // il valore dell'elemento affiorante dell’istanza // Descrizione della funzionalita' implementata: // se l’istanza non e' vuota, accede al valore memorizzato dall'elemento // affiorante, lo memorizza nella variabile riferita dal parametro e // termina con esito positivo. Termina con esito negativo, altrimenti. // Tipo e significato del valore restituito: // int: POS_RESULT se l’istanza non e' vuota; // NEG_RESULT altrimenti int pop(struct stoi *stack, int *val) { // se l’istanza e' vuota termina con esito negativo if (stoiEmpty(*stack)) return(NEG_RESULT); // altrimenti memorizza nella variabile riferita dal parametro il valore // dell’elemento affiorante della istanza *val = stack->stck[stack->testa]; // aggiorna la posizione nel vettore dell'elemento affiorante dell’istanza stack->testa = stack->testa-1; // termina con esito positivo return(POS_RESULT); }; Continua … Programmazione di Calcolatori: gli stack e i vettori
Gestione di una lista di interi: file stoi_ges.c // Nome della funzione: // stoiNew() // Tipo, nome e significato dei parametri della funzione: // int dim: dimensione massima della istanza del tipo di dato astratto // “stack of integer” // Descrizione della funzionalita' implementata: // crea una nuova istanza del tipo di dato astratto "stack of integer" e la // inizializza // Tipo e significato del valore restituito: // struct stoi *: riferimento al descrittore di una istanza del tipo di dato // astratto “stack of integer”, se l'allocazione ha esito // positivo; NULL, altrimenti. struct stoi *stoiNew (int dim) { // definisce un puntatore al descrittore dell'istanza del tipo di dato // astratto "stack of integer" struct stoi *descr; // alloca memoria per l'istanza descr = stoiAllMem(dim); // testa l'esito dell'allocazione. Se negativo termina con NULL if (descr == NULL) return(NULL); // inizializza il descrittore dell'istanza stoiInit (dim, descr); // restituisce il riferimento al descrittore della nuova istanza return(descr); }; Continua … Programmazione di Calcolatori: gli stack e i vettori
Gestione di una lista di interi: file stoi_ges.c // Nome della funzione: // stoiReset() // Tipo, nome e significato dei parametri della funzione: // struct stoi *stack: riferimento al descrittore dell’istanza del tipo di // dato astratto “stack of integer” // Descrizione della funzionalita' implementata: // azzera il contenuto dell’istanza // Tipo e significato del valore restituito: // alcuno void stoiReset (struct stoi *stack) { // aggiorna la posizione nel vettore dell'elemento affiorante dell’istanza stack -> testa = EMPTY_STACK; }; Programmazione di Calcolatori: gli stack e i vettori
Gestione di un Stack di interi: file stoi_ges.h // Nome e posizione del file: // Lezione_XXIV/stoi_ges.h // Descrizione del contenuto del file: // contiene le dichiarazioni extern delle funzioni che implementano le // operazioni definite sul tipo di dato astratto “stack of integer” extern int stoiEmpty(struct stoi); extern int push(struct stoi *, int); extern void stoiVis(struct stoi); extern int top(struct stoi, int *); extern int pop(struct stoi *, int *); extern void stoiReset (struct stoi *); extern struct stoi * stoiNew(int); Programmazione di Calcolatori: gli stack e i vettori
Gestione di una lista di interi: file stoi_uti.c // Nome e posizione del file: // Lezione_XXV/stoi_uti.c // Descrizione del contenuto del file: // definizione delle utilities di supporto alle funzioni che implementano // le operazioni definite sul tipo di dato astratto "stack of integer" // PSEUDODICHIARAZIONI // pseudodichiarazioni per le costanti simboliche utilizzate nella // implementazione del tipo di dato astratto "stack of integer" #include "./stoi_const.h" // DEFINIZIONI DI TIPO // definizioni dei tipi, strutturati e non, utilizzati nella implementazione // del tipo di dato astratto “stack of integer” tramite un vettore #include "./stoi_tipi.h" // EXTERN // inclusione del file di intestazione della libreria che contiene // definizioni di macro, costanti e dichiarazioni di funzioni e tipi // di interesse generale #include <stdlib.h> Continua … Programmazione di Calcolatori: gli stack e i vettori
Gestione di una lista di interi: file stoi_uti.c // Nome della funzione: // stoiFree() // Tipo, nome e significato dei parametri della funzione: // struct stoi *stack: riferimento al descrittore dell’istanza del tipo di // dato astratto “stack of integer” // Descrizione della funzionalita' implementata: // libera la memoria allocata per l’istanza // Tipo e significato del valore restituito: // alcuno void stoiFree (struct stoi *stack) { // libera la memoria allocata per il vettore che memorizza i valori // dell’istanza free(stack -> stck); // libera la memoria allocata per il descrittore dell’istanza free(stack); }; Continua … Programmazione di Calcolatori: gli stack e i vettori
Gestione di una lista di interi: file stoi_uti.c // Nome della funzione: // stoiFull() // Tipo, nome e significato dei parametri della funzione: // struct stoi stack: descrittore dell’istanza del tipo di // dato astratto “stack of integer” // Descrizione della funzionalita' implementata: // testa se l’istanza ha raggiunto la sua capacità massima // Tipo e significato del valore restituito: // int: TRUE se l’istanza è vuota; // FALSE altrimenti int stoiFull(struct stoi stack) { // restituisce TRUE se l’istanza ha raggiunto la sua dimensione massima, // FALSE altrimenti if (stack.max_dim == (stack.testa)+1) return(TRUE); else return(FALSE); }; Continua … Programmazione di Calcolatori: gli stack e i vettori
Gestione di una lista di interi: file stoi_uti.c // Nome della funzione: // stoiAllMem() // Tipo, nome e significato dei parametri della funzione: // int dim: dimensione massima della istanza del tipo di dato // astratto "stack of integer" // Descrizione della funzionalita' implementata: // alloca memoria per una istanza del tipo di dato astratto "stack of // integer" // Tipo e significato del valore restituito: // struct stoi *: indirizzo del descrittore dello stack, // se l'operazione ha esito positivo; // NULL altrimenti. struct stoi * stoiAllMem (int dim) { // definisce un puntatore per il descrittore della istanza struct stoi *descr; // alloca memoria per il descrittore descr = (struct stoi *) malloc(sizeof(struct stoi)); // testa l'esito dell'allocazione. Se negativo termina con NULL if (descr == NULL) return(NULL); // altrimenti alloca memoria per l’array che memorizza gli elementi // dello stack descr -> stck = (int *)(malloc(dim * sizeof(int))); Continua … Programmazione di Calcolatori: gli stack e i vettori
Gestione di una lista di interi: file stoi_uti.c // testa l'esito dell'allocazione. Se negativo recupera la memoria // per il descrittore e termina con NULL if (descr -> stck == NULL) { free(descr); return(NULL); }; // restituisce l'indirizzo del descrittore se l'operazione // ha esito positivo. NULL altrimenti return(descr); }; Continua … Programmazione di Calcolatori: gli stack e i vettori
Gestione di una lista di interi: file stoi_uti.c // Nome della funzione: // stoiInit() // Tipo, nome e significato dei parametri della funzione: // int dim: dimensione massima dello stack // struct stoi *descr: riferimento al descrittore di una istanza del tipo di // dato astratto "stack of integer" // Descrizione della funzionalita' implementata: // inizializza il descrittore di una istanza del tipo di dato estratto // "stack of integer" // Tipo e significato del valore restituito: // alcuno void stoiInit (int dim, struct stoi *descr) { // inizializza l'informazione relativa alla dimensione massima della // istanza descr -> max_dim = dim; // inizializza la posizione dell'elemento affiorante descr -> testa = EMPTY_STACK; }; Programmazione di Calcolatori: gli stack e i vettori
Gestione di una lista di interi: file ldi_uti.h // Nome e posizione del file: // Lezione_XXV/stoi_uti.h // Descrizione del contenuto del file: // contiene le dichiarazioni extern delle utilities di supporto alle // funzioni che implementano le operazioni definite sul tipo di // dato astratto "stack of integer" extern void stoiFree(struct stoi *); extern int stoiFull(struct stoi); extern struct stoi *stoiAllMem (int); extern void stoiInit (int, struct stoi *descr) Programmazione di Calcolatori: gli stack e i vettori
Gestione di una lista di interi: file stoi_main.c // Nome e posizione del file: // Lezione_XXV/stoi_main.c // Descrizione del contenuto del file: // codice per l’attivazione delle funzionalità per la gestione di una // istanza del tipo di dato astratto "stack of integer" // PSEUDODICHIARAZIONI // pseudodichiarazioni per i messaggi restituiti nella implementazione del // tipo di dato astratto "stack of integer" #include "./stoi_msg.h" // pseudodichiarazioni per le costanti simboliche utilizzate nella // implementazione del tipo di dato astratto "stack of integer" #include "./stoi_const.h" // DEFINIZIONI DI TIPO // definizioni dei tipi, strutturati e non, utilizzati nella implementazione // del tipo di dato astratto “stack of integer” tramite un vettore #include "./stoi_tipi.h" // EXTERN // inclusione del file di intestazione della libreria // standard che contiene definizioni di macro, // costanti e dichiarazioni di funzioni e tipi funzionali // alle varie operazioni di I/O #include <stdio.h> Continua … Programmazione di Calcolatori: gli stack e i vettori
Gestione di una lista di interi: file stoi_main.c // dichiarazioni extern delle utilities di supporto alle funzioni che // implementano le operazioni definite sul tipo di dato astratto // “stack of integer” #include "./stoi_uti.h" // dichiarazioni extern delle funzioni che // implementano le operazioni definite sul tipo di dato astratto // “stack of integer” #include "./stoi_ges.h" Continua … Programmazione di Calcolatori: gli stack e i vettori
Gestione di una lista di interi: file stoi_main.c // Nome della funzione: // stoiMenu() // Tipo, nome e significato dei parametri della funzione: // struct stoi *stack: riferimento al descrittore di una istanza del tipo // di dato astratto “stack of integer” // Descrizione della funzionalita' implementata: // implementa il menu di scelta delle operazioni definite sul tipo di dato // astratto "stack of integer" // Tipo e significato del valore restituito: // alcuno void stoiMenu(struct stoi *stack) { // definisce e inizializza la variabile // che permette l'uscita dal programma int quit = 0; // definisce una variabile per i valori oggetto della push() // e risultato della top() e della pop() int valore; Continua … Programmazione di Calcolatori: gli stack e i vettori
Gestione di una lista di interi: file stoi_main.c // rimane nel ciclo finche' la variabile quit rimane uguale a 0 while(!quit) { // definisce la variabile che memorizza la selezione int selezione; // visualizza le possibili scelte printf(SELECT_FUN_STOI); printf(PUSH); printf(TOP); printf(POP); printf(RESET_LOI); printf(DISPLAY_STOI); printf(EMPTY_STOI_TEST); printf(LEAVE_MAN_STOI); printf(SELECT_OP_STOI); // acquisisce la scelta scanf("%d", &selezione); // discrimina tra le diverse scelte switch (selezione) { Continua … Programmazione di Calcolatori: gli stack e i vettori
Gestione di una lista di interi: file stoi_main.c case 1: // Push() // acquisisce il valore oggetto della push() printf(ITEM_VALUE_REQ); scanf("%d", &valore); // chiama la funzione che implementa la funzione Push(), // testa l'esito dell'operazione e lo visualizza if (push(stack, valore) == POS_RESULT) printf(POS_RES_MSG); else { printf(NEG_RES_MSG); printf(STACK_SIZE_EXC); }; break; case 2: // Top() // chiama la funzione che implementa l'operazione Top(), // valuta l'esito dell'operazione e lo visualizza. Se // l'esito e' positivo visualizza il valore affiorante // della istanza del tipo di dato astratto "stack of integer" if (top(*stack, &valore) == POS_RESULT) printf("\nTop(): %d\n", valore); else printf(POP_FAILED); break; Continua … Programmazione di Calcolatori: gli stack e i vettori
Gestione di una lista di interi: file stoi_main.c case 3: // Pop() // chiama la funzione che implementa l'operazione Pop(), // valuta l'esito dell'operazione e lo visualizza. Se // l'esito e' positivo visualizza il valore affiorante // della istanza del tipo di dato astratto "stack of integer" if (pop(stack, &valore) == POS_RESULT) printf("\nPop(): %d\n", valore); else printf(TOP_FAILED); break; case 4: // reset dell’istanza del tipo di dato “stack of integer” // chiama la funziona che azzera l’istanza stoiReset(stack); break; case 5: // visualizzazione dell’istanza del tipo di dato “stack // of integer” // chiama la funzione che visualizza il contenuto dell’istanza stoiVis(*stack); break; Continua … Programmazione di Calcolatori: gli stack e i vettori
Gestione di una lista di interi: file stoi_main.c case 6: // test di istanza vuota // chiama la funzione che testa se una istanza del tipo di dato // astratto "stack of integer" è vuota e visualizza il risultato // il risultato del test if (stoiEmpty(*stack)) printf(EMPTY_STOI); else printf(NOT_EMPTY_STOI); break; case 7: // uscita quit = 1; break; default: // selezione errata printf(WRONG_SELECTION); }; }; }; Continua … Programmazione di Calcolatori: gli stack e i vettori
Gestione di una lista di interi: file stoi_main.c // Nome della funzione: // main() // Tipo, nome e significato dei parametri della funzione: // alcuno // Descrizione della funzionalita' implementata: // chiamante // Tipo e significato del valore restituito: // alcuno int main() { // definisce un puntatore al descrittore della istanza del tipo di dato astratto // “stack of integer” struct stoi *stack; // definisce una variabile per la dimensione massima della istanza int max_dim; // acquisisce il valore della dimensione massima della istanza printf(MAX_DIM_REQ); scanf("%d", &max_dim); // crea una nuova istanza del tipo di dato astratto "stack of integer" stack = stoiInit(max_dim); // se l'operazione ha esito negativo visualizza un opportuno // messaggio e termina if (stack == NULL) { printf(STACK_INIT_FAILED); return(0); }; Continua … Programmazione di Calcolatori: gli stack e i vettori
Gestione di una lista di interi: file stoi_main.c // chiama la funzione che implementa il menu di scelta // delle funzionalita' di gestione di una istanza del tipo di dato astratto // “stack of integer” stoiMenu(stack); // recupera la memoria allocata per l’istanza stoiFree(stack); return(1); }; Continua … Programmazione di Calcolatori: gli stack e i vettori
Gestione di una lista di interi: file stoi_const.h // Nome e posizione del file: // Lezione_XXV/stoi_const.h // Descrizione del contenuto del file: // pseudodichiarazioni per le costanti simboliche utilizzate nella // implementazione del tipo di dato astratto "stack of integer“ // definizione delle costanti simboliche utilizzate nella // inizializzazione di istanze del tipo di dato astratto "stack of integer" #define EMPTY_STACK -1 // definizione delle costanti simboliche per gli esiti di una // operazione #define NEG_RESULT 0 #define POS_RESULT 1 // definizione delle costanti mnemoniche per gli esiti di un test #define TRUE 1 #define FALSE 0 Programmazione di Calcolatori: gli stack e i vettori
Gestione di una lista di interi: file stoi_msg.h // Nome e posizione del file: // Lezione_XXV/stoi_msg.h // Descrizione del contenuto del file: // pseudodichiarazioni per i messaggi restituiti nella implementazione del // tipo di dato astratto "stack of integer" // definizione delle costanti simboliche utilizzate per il menu #define SELECT_FUN_STOI "\nSelezionare Funzionalita'\n" #define PUSH "\n1: Push()" #define TOP "\n2: Top()" #define POP "\n3: Pop()" #define RESET_LOI "\n4: Azzera lo stack" #define DISPLAY_STOI "\n5: Visualizza lo stack" #define EMPTY_STOI_TEST "\n6: Test di stack vuoto" #define LEAVE_MAN_STOI "\n7: Interrompi" #define SELECT_OP_STOI "\n\nSelezione: " #define WRONG_SELECTION "\nSelezionare 1, 2, 3, 4, 5, 6 o 7" // definizione dei messaggi di descrizione per l'esito delle // operazioni #define STACK_INIT_FAILED "\nInizializzazione stack fallita" #define STACK_SIZE_EXC "\nPush() fallita: stack pieno\n" #define POP_FAILED "\nPop() fallita: stack vuoto\n" #define TOP_FAILED "\nTop() fallita: stack vuoto\n" // definizione dei messaggi descrittivi delle istanze #define EMPTY_STOI "\nStack vuoto\n" #define NOT_EMPTY_STOI "\nStack non vuoto\n" #define STOI "\nStack: “ Continua … Programmazione di Calcolatori: gli stack e i vettori
Gestione di una lista di interi: file stoi_msg.h // definizione dei messaggi per l'esito delle operazioni #define NEG_RES_MSG "\nOperazione fallita\n" #define POS_RES_MSG "\nOperazione terminata con successo\n" // definizione delle costanti simboliche utilizzate nell'acquisizione dei dati #define ITEM_VALUE_REQ "\nPush(?): " #define MAX_DIM_REQ "\nDimensione massima dello stack? " #define MAX_DIM "\nDimensione massima dello stack: %d " #define NUMB_OF_ITEMS "\nNumero di elementi nello stack: %d " Programmazione di Calcolatori: gli stack e i vettori
Grafo delle chiamate stoiNew() ./stoi_ges.c stoiInit() ./stoi_uti.c stoiFree() ./stoi_uti.c stoiAllMem() ./stoi_uti.c main() ./stoi_main.c stoiReset() ./stoi_ges.c top() ./stoi_ges.c stoiMenu() ./stoi_main.c stoiVis() ./stoi_ges.c push() ./stoi_ges.c stoiEmpty() ./stoi_ges.c reset() ./stoi_ges.c pop() ./stoi_ges.c stoiFull() ./stoi_uti.c Programmazione di Calcolatori: gli stack e i vettori