Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    33

    Esercizio stack

    Ciao a tutti!
    Ho un problema con un esercizio sugli stack. L'esercizio chiede di creare due stack , A e B; uno da cui prelevare elementi (A), uno in cui inserire elementi (B). Nel caso in cui lo stack A sia vuoto devono venire spostati, mediante pop-push gli elementi dallo stack B allo stack A.
    Il problema sta nell'inserimento di elementi nello stack B, quindi credo nella funzione stack_push, riporto l'intero codice per completezza, spero qualcuno possa aiutarmi, grazie.

    codice:
    #include<stdio.h>
    #include<stdlib.h>
    #include<assert.h>
    #include<stdbool.h>
    
    #define GROW_DELTA 10
    #define SHRINK_DELTA 20
    
    typedef int TInfo;
    
    struct SArray{
       TInfo *item;
       int length;
       int size;
       };
    typedef struct SArray TArray;
    
    struct SStack{
       TArray array;
       };
    typedef struct SStack TStack;
    
    TArray array_create(int initial_length){
       TArray a;
       a.item=(TInfo*)malloc(sizeof(TInfo)*initial_length);
       assert(a.item!=NULL);
       a.length=initial_length;
       a.size=initial_length;
       }
    
    void array_destroy(TArray *a){
       free(a->item);
       a->item=NULL;
       a->length=0;
       a->size=0;
       }
    
    void array_resize(TArray *a,int new_length){
       if(new_length > a->size || new_length < a->size -SHRINK_DELTA){
          int new_size=new_length+GROW_DELTA;
          a->item=realloc(a->item, sizeof(TInfo)*new_size);
          assert(a->item!=NULL || new_size!=0);
          a->size=new_size;
          }
       a->length=new_length;
       }
    
    TStack stack_create(void){
       TStack s;
       s.array=array_create(0);
       return s;
       }
    
    void stack_destroy(TStack *s){
       array_destroy(&s->array);
       }
    
    void stack_push(TStack *s, TInfo x){
       int n=s->array.length;
       array_resize(&s->array, n+2);
    
       s->array.item[n]=x;
       }
    
    TInfo stack_pop(TStack *s){
        int n=s->array.length;
        TInfo x=s->array.item[n-1];
        array_resize(&s->array, n-1);
        return x;
       }
    
    TInfo stack_top(TStack *s){
       int n=s->array.length;
       return s->array.item[n-1];
       }
    
    bool stack_is_empty(TStack *s){
       return s->array.length==0;
       }
    
    int menu(){
       printf("\n1) Inserire un elemento.\n");
       printf("2) Prelievo di un elemento.\n");
       printf("3) Verifica coda vuota.\n");
       printf("4) EXIT.\n\n");
       printf("Fai la tua scelta :  ");
       }
    
    int main(){
    
       TStack stackA,stackB;
       int scelta=0;
       TInfo elemento;
    
       stackA=stack_create();
       stackB=stack_create();
    
    printf("----> %d", stackB.array.length);
    
       while(scelta!=4){
          menu();
          scanf("%d", &scelta);
    
          switch(scelta){
    
             case 1 :   printf("Inserire il nuovo elemento :\n");
                        scanf("%d", &elemento);
                        stack_push(&stackB, elemento);
                break;
    
             case 2 : if(stack_is_empty(&stackA)){
                           while(stackB.array.length!=0)
                               stack_push(&stackA , stack_pop(&stackB));
                           elemento=stack_pop(&stackA);
                           printf("ELEMENTO  %d   \n", elemento);
                           }
    
                        else {
                           elemento=stack_pop(&stackA);
                           printf("%d   \n", elemento);
                           }
                break;
    
             case 3 :
                break;
    
             }
          }
       return EXIT_SUCCESS;
       }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,476
    Ho due errori in *compilazione*.

    Le funzioni array_create e menu devono restituire un valore ma non lo fanno.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,307

    Re: Esercizio stack

    Originariamente inviato da Gauss92
    Il problema sta nell'inserimento di elementi nello stack B, quindi credo nella funzione stack_push
    Il problema... quale problema?
    Hai degli errori in compilazione? Riportali precisamente.
    Hai degli errori in esecuzione? Riportali precisamente.

    Non puoi limitarti a dire "il problema forse stà lì", senza dire di quale problema stai parlando...

    Manca anche l'indicazione del linguaggio usato, oltre ad un titolo significativo (ma, del resto, non hai detto quale problema hai nemmeno nella discussione, quindi il titolo passa anche in cavalleria)... Il linguaggio lo aggiungo io.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    33
    Il problema sta nell'inserimento di un elemento nello stack B, cosa dovrei specificare più di questo ? Non ho errori in compilazione, semplicemente mi esce "il programma ha smesso di funzionare" appena inserisco l'elemento, come succede per qualsiasi errore mi sia mai capitato.

    Ho detto il problema forse sta lì perché se sapessi dov'era non avrei chiesto. Infatti grazie all'aiuto di oregon ora mi sono accorto che invece era nella funzione Array create che non restituiva nessun valore e dato che il mio compilatore non mi da errore non trovavo.

    Per quanto riguarda il titolo non potevo scrivere un tema, mi dici come avresti scritto tu ?
    Di nuovo, ora che è chiaro l'errore, mi dici anche come avrei dovuto scrivere in merito al mio problema ?

    non voglio fare il polemico ma proprio non capisco le tue domande, se mi fai capire come devo scrivere la prossima volta cerco di essere il più specifico possibile, grazie.

    @oregon grazie mille, mi dici che compilatore usi ?

  5. #5
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Nel tuo titolo mancava il tag del linguaggio: [C] nel tuo caso.
    Più significativo potrebbe essere: Errore inserimento stack
    Esporre il problema significa anche riportare esattamente gli errori di compilazione e/o l'output errato del programma e/o quando ha smesso di funzionare e cosa avevi fatto.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,307
    Vediamo di fare un esempio:

    1) Se l'applicazione si chiude improvvisamente mentre fai l'inserimento, allora avresti potuto scrivere "l'applicazione si chiude immediatamente mentre faccio l'inserimento e mi viene visualizzato il messaggio di errore ...". Ma tu hai semplicemente scritto "Il problema sta nell'inserimento". Ora, mi spiegi come fanno le persone a capire di quale problema stai parlando se non lo nomini nemmeno? Qui si tratta di buon senso, non di capire qualche regola strana o di capire le mie domande... (Hai degli errori in esecuzione? Riportali precisamente)

    2) Il titolo della discussione? Vediamo: che mi dici di questo:
    [C] Errore "il programma ha smesso di funzionare" durante inserimento elementi

    Forse che è decisamente più chiaro di "Esercizio stack" che non vuol dire assolutamente nulla di nulla e, soprattutto, non dice nulla del tuo preciso problema? Ci sono centinaia di utenti che svolgono esercizi su stack e probabilmente centinaia di discussioni che riguardano esercizi su stack... era difficile essere più precisi?

    3) Non sai dov'è l'errore: mai provato a fare un briciolo di debug manuale, magari inserendo delle pause nel programma in modo da capire dov'è che si blocca e dare così maggiori informazioni e dettagli agli utenti che provano ad aiutarti?

    4) oregon, che dà sempre consigli mirati e precisi, ha ottenuto degli errori in compilazione: possibile che lui li abbia ottenuti e tu no? Un errore in compilazione non permette nemmeno l'avvio del programma (non riuscendo a compilare).

    Sono più chiare ora le mie domande? Erano difficili da comprendere?

    Chiudo qui la "reprimenda", si prosegua con la discussione.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Utente di HTML.it
    Registrato dal
    Mar 2012
    Messaggi
    33
    Scusa, in realtà si potrebbe replicare tutto, la questione è soggettiva. Per esempio, nel dire "errore chiusura inserimento" a me sembra il titolo più generale possibile e mi sembra più adeguato specificare l'argomento (stack), infatti moltissime discussioni hanno titoli simili al mio per questo ho scritto cosi. In ogni caso farò come dici grazie.

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,476
    Lele ha ragione ... ci sono mille modi per indicare più precisamente l'errore che hai.

    Dire che "il programma ha smesso di funzionare" è già molto più indicativo (indica con molta probabilità problemi di accesso ad aree di memoria) e fare un po' di debugging per circoscrivere la zona del codice in cui avviene l'errore, permette di risponderti con maggiore precisione.
    Ma molto probabilmente tu non sai fare debugging e si spiegherebbe tutto ...

    In ogni caso, per il futuro, cerca di essere più preciso, non per una "fissazione" dei moderatori, ma per permettere a chi ti vuole aiutare di farlo. Altrimenti rischi di rimanere senza risposte ...

    Per il compilatore, lascia perdere DEVC++ e il suo compilatore e usa Visual Studio C++, magari la versione Express.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.