Code

di il
15 risposte

Code

Ragazzi scusate sto cercando di risolvere questo esercizio
Ho una coda implementata tramite array,con una funzione di tipo void che accetta come parametro solo la coda devo eliminare gli elementi pari di posto pari maggiori dell'elemento precedente e gli elementi dispari di posto dispari.La mia difficoltà sta nel portarmi un indice dietro che mi dice in che posizione mi trovo,avevo pensato di usare coda[max+1] siccome dovrebbe avere traccia di dove sia l'ultimo elemento vi posto il codice

#include <stdio.h>
#include <stdlib.h>
#define MAX 100

void inizializza_coda(int coda[]){
   coda[0]=0;
   coda[MAX+1]=1;
}

int coda_vuota(int coda[]){
   return coda[0]==0;
}

int coda_piena(int coda[]){
   return coda[MAX]==coda[MAX+1];
}


void enqueque(int coda[],int val){
   if(coda_piena(coda)){
      printf("\nATTENZIONE!!!\n la coda e' piena\n");
      return;
   }
   else{
      coda[coda[MAX+1]]=val;
      if(coda[0]==0)
         coda[0]=1;
      coda[MAX+1]=(coda[MAX+1]%MAX)+1;
   }
}

int dequeque(int coda[]){
   int valore;
   if(coda_vuota(coda))
      printf("\nATTENZIONE!!!\nla coda e' vuota\n");
   else{
      valore=coda[coda[0]];
      coda[0]=(coda[0]%MAX)+1;
      if(coda[0]==coda[MAX+1]){
         coda[0]=0;
         coda[MAX+1]=1;
      }
   }
   return valore;
}


void stampa_queque(int coda[]){
   int val;
   if(coda_vuota(coda))
      return;
   else{
      val=dequeque(coda);
      printf("%d\n",val);
      stampa_queque(coda);
      enqueque(coda,val);
   }
}


void reverse (int coda[]){
   int val;
   if(coda_vuota(coda))
      return;
   else{
      val=dequeque(coda);
      reverse(coda);
      enqueque(coda,val);
   }
}

void stampa_coda(int coda[]){
   stampa_queque(coda);
   reverse(coda);
}


void elimina(int coda[]){
   if(coda_vuota(coda))
      return;
   else{
      int val;
      val=dequeque(coda);
      elimina(coda);
      if(val%2==0 && coda[MAX+1]%2!=0)
          enqueque(coda,val);
      if(val%2!=0 && coda[MAX+1]%2==0)
          enqueque(coda,val);
   }
}

int main()
{
int i=0,n=0;
 int q[MAX+2];
 inizializza_coda(q);
 printf("quanti elementi vuoi inserire?\n");
 scanf("%d",&n);
 for(i=0;i<n;i++)
    enqueque(q,i);
stampa_coda(q);
elimina(q);
reverse(q);
stampa_coda(q);
    return 0;
}

15 Risposte

  • Re: Code

    Non ho capito il tuo approccio. In una coda implementata con un array mi aspettavo di trovare due indici, uno per il primo elemento e uno per l'ultimo elemento.
  • Re: Code

    Purtroppo nemmeno io ho capito molte le code però l'indice max+1 dovrebbe indicarmi la posizione dell'ultimo elemento
  • Re: Code

    Purtroppo nemmeno io ho capito molte le code però l'indice max+1 dovrebbe indicarmi la posizione dell'ultimo elemento
  • Re: Code

    MAX+1 è una costante e nonostante tutti i tuoi sforzi e magie non potrà mai indicarti la posizione dell'ultimo elemento essendo questa dinamica
  • Re: Code

    Ciao,
    ho velocemente provato a buttare giù un esempio di coda. Non è completa (vedi il commento con TODO) però può essere un punto di partenza.
    Prova a guardarla e se hai dei dubbi chiedi pure!
    
    #include <stdio.h>
    #include <stdlib.h>
    
    /* definizione della CODA */
    typedef struct coda_t
    {
        int* items;
        int max;    /* numero di posti nella coda */
        int first_available;   /* posizione del primo posto libero nella coda */
    } CODA;
    
    
    void inizializza_coda(CODA *c, int max)
    {
        /* allocazione dell'array */
        c->items = (int *) malloc(max * sizeof(int));
        int i;
    
        /* metto tutti gli elementi a zero */
        for(i=0; i<max; ++i)
            c->items[i] = 0;
    
        /* inizializzo first_available */
        c->first_available = 0;
    
        /* imposto il numero di posti nella coda */
        c->max = max;
    }
    
    
    int coda_piena(CODA *c)
    {
        return (c->first_available == c->max);
    }
    
    
    int coda_vuota(CODA *c)
    {
        return (c->first_available == 0);
    }
    
    
    void stampa_coda(CODA *c)
    {
        int i;
        int *items = c->items;
        int first_available = c->first_available;
        for(i=0; i<first_available; ++i)
            printf("%d\n", items[i]);
    }
    
    
    void enqueue(CODA *c, int item)
    {
        if(coda_piena(c))
        {
            printf("Coda piena!\n");
        }
    
        c->items[c->first_available] = item;
        ++(c->first_available);
    }
    
    
    int dequeue(CODA *c)
    {
        if(coda_vuota(c))
        {
            printf("Coda vuota!\n");
            return -1;
        }
    
        /* il primo elemento e' sempre in posizione 0 */
        int item = c->items[0];
    
        /* TODO fai slittare gli elementi rimasti (operazione "costosa") */
    
        --(c->first_available);
        return item;
    }
    
    
    int main()
    {
        CODA coda;
        inizializza_coda(&coda, 2);
    
        if(coda_vuota(&coda))
            printf("Coda vuota!\n");
    
        enqueue(&coda, 1);
        enqueue(&coda, 3);
        stampa_coda(&coda);
    
        if(coda_piena(&coda))
            printf("Coda piena!\n");
    
        int item = dequeue(&coda);
        printf("Prelevato %d\n", item);
    
        return 0;
    }
    
  • Re: Code

    Credo che antonx abbia bisogno (o voglia) una coda implementata con un array (vedi post iniziale).
  • Re: Code

    candaluar ha scritto:


    Credo che antonx abbia bisogno (o voglia) una coda implementata con un array (vedi post iniziale).
    Ma items è un array... solo che è dentro una struttura e allocato dinamicamente.
    O forse intendi dire che non si può utilizzare una struct? In questo caso credo che basti "scompattarla" e dichiarare l'array, max e first_available separatamente.

    Oppure non ho capito?
  • Re: Code

    Non so cosa voglia fare antonx (senza offesa, forse non è chiaro neanche a lui).
    Siccome parla di una coda implementata con un array io mi aspetto un array con una dimensione massima (infatti c'è una #define MAX 100) e due indici, uno che indica la posizione iniziale e uno che indica la posizione finale: naturalmente in fase di inserimento ci dovrà essere un controllo che la coda non sia piena.
    Eventualmente ci può stare un intero per il numero di elementi caricati, per gestire in maniera semplice il caso in cui l'indice di inserimento sia minore dell'indice di estrazione, ovvero quando con gli inserimenti/estrazioni si è oltrepassato l'indice [MAX-1] e si è ripartiti da [0].
  • Re: Code

    Ok, io intendevo un' altra cosa: un array con dimensione massima e un solo indice che indica il primo posto disponibile nella coda. Quando un elemento viene prelevato tutti gli altri scalano (in avanti) e fanno posto dietro. Esattamente quello che succede alla cassa di un supermercato.
    Es.
    - | - | 3 | 1
    Viene prelevato 1 e la coda diventa
    - | - | - | 3

    Allora aspettiamo chiarimenti da antonx.
  • Re: Code

    Sì, la tua implementazione non fa una piega

    Quello che mi aspettavo io era invece qualcosa del genere (restando con il tuo esempio)
    - | - | 3 | 1
    Viene prelevato 1 e la coda diventa
    - | - | 3 | -
    in pratica non modifico le posizioni all'interno dell'array, non prelevo l'indice 0 a prescindere, ma uso un indice variabile per capire a chi tocca nel mio caso è il cassiere che si sposta fra i clienti
  • Re: Code

    Esatto, avevo immaginato che intendessi una cosa del genere.

    Povero cassiere! Oltre alle aperture domenicali, ora pure questa!

    EDIT:
    Ho un po' rivisto il codice e inserito anche la funzione per l'avanzamento della coda. Se interessa, lascio il codice:
    
    #include <stdio.h>
    #include <stdlib.h>
    
    /* definizione della CODA */
    typedef struct coda_t
    {
        int* items;
        int max;    /* numero di posti nella coda */
        int first_available;   /* posizione del primo posto libero nella coda */
    } CODA;
    
    
    void inizializza_coda(CODA *c, int max)
    {
        /* allocazione dell'array */
        c->items = (int *) malloc(max * sizeof(int));
        int i;
    
        /* metto tutti gli elementi a zero */
        for(i=0; i<max; ++i)
            c->items[i] = 0;
    
        /* inizializzo first_available */
        c->first_available = 0;
    
        /* imposto il numero di posti nella coda */
        c->max = max;
    }
    
    
    int coda_piena(CODA *c)
    {
        return (c->first_available == c->max);
    }
    
    
    int coda_vuota(CODA *c)
    {
        return (c->first_available == 0);
    }
    
    
    void stampa_coda(CODA *c)
    {
        int i;
        int *items = c->items;
        int first_available = c->first_available;
    
        printf("\n");
        for(i = c->max-1; i >= first_available; --i)
            printf("--\n");
        for(i=first_available-1; i>=0; --i)
            printf("%d\n", items[i]);
        printf("\n");
    }
    
    
    void enqueue(CODA *c, int item)
    {
        if(coda_piena(c))
        {
            printf("Coda piena!\n");
        }
        else
        {
            c->items[c->first_available] = item;
            ++(c->first_available);
        }
    }
    
    
    /* A partire dal secondo posto, sposta tutti gli elementi
     * avanti di una posizione, verso la testa della coda */
    void shift(CODA *c)
    {
        int i;
        for(i=0; i < c->first_available; ++i)
        {
            c->items[i] = c->items[i+1];
        }
    }
    
    
    int dequeue(CODA *c)
    {
        if(coda_vuota(c))
        {
            printf("Coda vuota!\n");
            return -1;
        }
    
        /* il primo elemento e' sempre in posizione 0 */
        int item = c->items[0];
    
        /* faccio avanzare gli elementi rimasti */
        shift(c);
    
        --(c->first_available);
        return item;
    }
    
    
    int main()
    {
        CODA coda;
        inizializza_coda(&coda, 5);
    
        if(coda_vuota(&coda))
            printf("Coda vuota!\n");
    
        enqueue(&coda, 1);
        printf("Aggiunto 1\n");
        enqueue(&coda, 3);
        printf("Aggiunto 3\n");
    
        stampa_coda(&coda);
    
        int item = dequeue(&coda);
        printf("Prelevato %d\n", item);
    
        stampa_coda(&coda);
    
        enqueue(&coda, 4);
        printf("Aggiunto 4\n");
        stampa_coda(&coda);
    
        enqueue(&coda, 6);
        printf("Aggiunto 6\n");
        stampa_coda(&coda);
    
        printf("Prelevato %d\n", dequeue(&coda));
    
        stampa_coda(&coda);
    
        return 0;
    }
    
  • Re: Code

    Salve ragazzi scusate se rispondo solo ora ma l'università mi tiene impegnato.Comunque la mia coda ,dovrebbe conservare la posizione dell'ultimo elemento nella posizione coda[MAX+1].In pratica la mia coda ha n elementi ma lo spazzio allocato è di n+2 dove coda[0] dovrebbe indicare se è vuota e coda[max+1]indice dell'ultimo elemento.Gli algoritmi che mi hanno insegnato sono quelli che ho postato nel codice ma non so perchè non vanno,comunque grazie ad entrambi per le risposte
  • Re: Code

    Coda[MAX+1] ? Cioè scrivi fuori dall'array?
    Indipendentemente da quello che ti insegnano all'università, dovresti esserti fatto un'idea di come vuoi gestire la coda in questione e dovresti essere in grado di spiegare meglio il funzionamento (spiegare come sono immagazzinati i dati e spiegare le operazioni di 'push' e 'pop'): senza questa comprensione è inutile fare qualsiasi tipo di esercizio!
  • Re: Code

    Quando dichiaro la coda la dimensione è MAX+2 se guardi nel mio codice si vede.Lo so hai ragione ma purtroppo non mi è stato spiegato nel migliore dei modi
Devi accedere o registrarti per scrivere nel forum
15 risposte