G. Amodeo, C. Gaibisso Programmazione di Calcolatori Lezione XXV: gli stack e i vettori Programmazione di Calcolatori: gli stack e i vettori 1 G. Amodeo, C. Gaibisso Stack di interi e array • Graficamente: dimensione massima dello stack posizione all’interno dell’array dell’elemento affiorante dello stack stck[max_dim-1] struct stoi max_dim int testa int stck max_dim int * array per la memorizzazione dei valori nello stack stck[0] Programmazione di Calcolatori: gli stack e i vettori 2 G. Amodeo, C. Gaibisso 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 3 G. Amodeo, C. Gaibisso InitStack() • La logica: stck[dim-1] struct stoi stack max_dim testa dim dim -1 stck stck[0] Programmazione di Calcolatori: gli stack e i vettori 4 G. Amodeo, C. Gaibisso InitStack() • La funzione: Programmazione di Calcolatori: gli stack e i vettori Continua … // 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); }; 5 G. Amodeo, C. Gaibisso 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 6 G. Amodeo, C. Gaibisso 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 7 G. Amodeo, C. Gaibisso 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 8 G. Amodeo, C. Gaibisso Pop() • La logica: stck[dim-1] struct stoi stack max_dim dim dim testa stck X valore valore int val stck[0] Programmazione di Calcolatori: gli stack e i vettori 9 G. Amodeo, C. Gaibisso 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 10 G. Amodeo, C. Gaibisso 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 11 G. Amodeo, C. Gaibisso 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 12 G. Amodeo, C. Gaibisso Gestione di una lista di interi • Specifiche: implementare una soluzione per il tipo di dato astratto stack di interi che preveda le seguenti operazioni: 1. 2. 3. 4. 5. 6. 7. inizializzazione Push() Top() Pop() visualizzazione del contenuto test di stack vuoto reset Programmazione di Calcolatori: gli stack e i vettori 13 G. Amodeo, C. Gaibisso 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 “stack of integer” (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 14 G. Amodeo, C. Gaibisso Organizzazione del codice: file e loro contenuto • Dichiarazioni extern – stoi_ges.h: – stoi_uti.h: dichiarazioni extern delle funzioni che implementano le operazioni definite sul tipo di dato astratto stoi 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 15 G. Amodeo, C. Gaibisso 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 16 G. Amodeo, C. Gaibisso Gestione di una lista di interi: file stoi_ges.c Programmazione di Calcolatori: gli stack e i vettori Continua … // 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> 17 G. Amodeo, C. Gaibisso Gestione di una lista di interi: file stoi_ges.c Programmazione di Calcolatori: gli stack e i vettori Continua … // 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“ 18 G. Amodeo, C. Gaibisso Gestione di una lista di interi: file stoi_ges.c Programmazione di Calcolatori: gli stack e i vettori Continua … // 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); }; 19 G. Amodeo, C. Gaibisso Gestione di una lista di interi: file stoi_ges.c Continua … // 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); }; Programmazione di Calcolatori: gli stack e i vettori 20 G. Amodeo, C. Gaibisso Gestione di una lista di interi: file stoi_ges.c Continua … // 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 }; }; Programmazione di Calcolatori: gli stack e i vettori 21 G. Amodeo, C. Gaibisso Gestione di una lista di interi: file stoi_ges.c Continua … // 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); }; Programmazione di Calcolatori: gli stack e i vettori 22 G. Amodeo, C. Gaibisso Gestione di una lista di interi: file stoi_ges.c Continua … // 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); }; Programmazione di Calcolatori: gli stack e i vettori 23 G. Amodeo, C. Gaibisso Gestione di una lista di interi: file stoi_ges.c Continua … // 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); }; Programmazione di Calcolatori: gli stack e i vettori 24 G. Amodeo, C. Gaibisso 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 25 G. Amodeo, C. Gaibisso 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 26 G. Amodeo, C. Gaibisso Gestione di una lista di interi: file stoi_uti.c Programmazione di Calcolatori: gli stack e i vettori Continua … // 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> 27 G. Amodeo, C. Gaibisso 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 28 G. Amodeo, C. Gaibisso Gestione di una lista di interi: file stoi_uti.c Programmazione di Calcolatori: gli stack e i vettori Continua … // 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); }; 29 G. Amodeo, C. Gaibisso Gestione di una lista di interi: file stoi_uti.c Programmazione di Calcolatori: gli stack e i vettori Continua … // 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))); 30 G. Amodeo, C. Gaibisso 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 31 G. Amodeo, C. Gaibisso 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 32 G. Amodeo, C. Gaibisso 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 33 G. Amodeo, C. Gaibisso Gestione di una lista di interi: file stoi_main.c Programmazione di Calcolatori: gli stack e i vettori Continua … // 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> 34 G. Amodeo, C. Gaibisso 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 35 G. Amodeo, C. Gaibisso Gestione di una lista di interi: file stoi_main.c Continua … // 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; Programmazione di Calcolatori: gli stack e i vettori 36 G. Amodeo, C. Gaibisso Gestione di una lista di interi: file stoi_main.c Programmazione di Calcolatori: gli stack e i vettori Continua … // 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) { 37 G. Amodeo, C. Gaibisso Gestione di una lista di interi: file stoi_main.c Programmazione di Calcolatori: gli stack e i vettori Continua … 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; 38 G. Amodeo, C. Gaibisso Gestione di una lista di interi: file stoi_main.c Programmazione di Calcolatori: gli stack e i vettori Continua … 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; 39 G. Amodeo, C. Gaibisso Gestione di una lista di interi: file stoi_main.c Programmazione di Calcolatori: gli stack e i vettori Continua … }; }; 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); }; 40 G. Amodeo, C. Gaibisso Gestione di una lista di interi: file stoi_main.c Continua … // 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); }; Programmazione di Calcolatori: gli stack e i vettori 41 G. Amodeo, C. Gaibisso 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 42 G. Amodeo, C. Gaibisso 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 43 G. Amodeo, C. Gaibisso Gestione di una lista di interi: file stoi_msg.h Continua … // 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: “ Programmazione di Calcolatori: gli stack e i vettori 44 G. Amodeo, C. Gaibisso 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 45 G. Amodeo, C. Gaibisso Grafo delle chiamate stoiNew() ./stoi_ges.c stoiFree() ./stoi_uti.c stoiInit() ./stoi_uti.c stoiAllMem() ./stoi_uti.c main() ./stoi_main.c stoiReset() ./stoi_ges.c top() ./stoi_ges.c stoiMenu() ./stoi_main.c stoiEmpty() ./stoi_ges.c reset() ./stoi_ges.c pop() ./stoi_ges.c stoiVis() ./stoi_ges.c push() ./stoi_ges.c stoiFull() ./stoi_uti.c Programmazione di Calcolatori: gli stack e i vettori 46