Esercizio array in C

di il
13 risposte

Esercizio array in C

Ciao ragazzi, e' da qualche settimana che mi sto cimentando nel c e vorrei qualche consiglio per questo esercizio.
Il programma non funziona, il problema sta nella funzione confronto. Non so se e' un errore banale o "critico" ma vorrei capire dove sbaglio perche' ero davvero convinto che il codice fosse scritto bene.
Se qualcuno puo' darmi una mano ve ne sarei grat.

Scrivere una funzione che ha come parametri 3 array di interi a[], b[] e c[] con le rispettive lunghezze na, nb, nc.
L'array a[] è la sorgente, b[] è il filtro, c[] è la destinazione.
La funzione esamina l'array a[] e copia in c[] soltanto gli elementi per cui l'array filtro b[] contiene una coppia adiacente di elementi b[k] e b[k+1] che hanno la somma pari all'elemento da copiare.
In altri termini, copia a se esiste almeno un indice k per cui b[k] + b[k+1] == a.
La funzione restituisce il numero di elementi copiati.
Si può assumere che nc >= na, cioè che l'array destinazione sia abbastanza ampio da poterci copiare tutti gli elementi dell'array sorgente.

#include <stdio.h>
#define size 100

int array ( int a[]) {
                       int i;
                       int n = 0;

                       printf ("Inserisci i valori del tuo array, -1 per fermarti\n");

                       for ( i = 0; i<= size-1; i++)
                          {
                            scanf ("%d",& a[i]);
                            n++;
                             if (a[i]==-1)
                               {
                                 n--;
                                 break;
                               }
                          }
                        return n;  
}

int confronto ( int a[], int b[], int n, int m, int c[])  {

                                                   int i = 0;//indice vettore a
                                                   int j = 0;//indice vettore b
                                                   int k = 0;//indice vettore c
                                                   int trovato = 0;
                                                   int w = 0;//rimpimento c

                                                   while ( i < n)//scorre il vettore a in modo da confrontarlo com b
                                                        {
                                                            while ( j < m || trovato == 0)
                                                                 {
                                                                    if (a[i] == (b[j]+b[j+1]))
                                                                      {
                                                                        c[k] = a[i];
                                                                        
                                                                        k++;
                                                                        w++;
                                                                        trovato = 1;
                                                                      }
                                                                    else j++;
                                                                 }
                                                        trovato = 0;
                                                        i++;
                                                        j = 0;
                                                        }
                                                    return w;    
}

void stampa ( int a[], int n) { 
                                int i;

                                for ( i = 0; i<= n-1; i++)
                                   {
                                    printf ("Posizione: %d, Valore: %d\n", i, a[i]);
                                   }
}

int main ()  {
               int A[size];
               int B[size];
               int C[size];

               int N = 0;
               int M = 0;
               int W = 0;

               printf("Valore vettore A\n");
               N = array(A);
               stampa(A, N);

               printf("Valore vettore B\n");
               M = array(B);
               stampa(B, M);

               W = confronto(A,B,N,M,C);
               stampa(C, W);

               return 0;
}

13 Risposte

  • Re: Esercizio array in C

    Correggi il post perché non si capisce nulla. Devi inserire i tag CODE per il codice. Vedi regolamento.

    E poi fai una domanda specifica, che mi pare manchi. "Qualche consiglio" è troppo generico ...
  • Re: Esercizio array in C

    Se ho capito bene
    [CODE] A = {3,4,5,6,7,1,2,3,34} B = {3,7,6,5,4,3,2,1} devo cercare nel filtro la somma dei due adiacenti e vedere se lo trovo in A
    [CODE] 3+7=10 7+6=13 6+5=11 5+4=9 4+3=7 Copio il 7 3+2=5 2+1=3 Copio il 3 alla fine rimane il vettore [CODE] C = { 7, 3 } ci possono essere doppioni? il 3 lo copio una volta o due volte?
  • Re: Esercizio array in C

    Si ci possono essere doppioni, adesso scrivo meglio la domanda scusatemi.
  • Re: Esercizio array in C

    Per me l'errore è qui
    [CODE] while ( j < m || trovato == 0) lui deve ciclare quando il numeri di elementi è inferiore e non è stato trovato.

    occhio che devi vedere l'elemento N e Il successivo.

    problemi tennici, aggiungo la risposta qui sotto al messaggio delle 22.19

    cosa succede se non trovi il numero e "trovato" rimane sempre a 0?
  • Re: Esercizio array in C

    Il primo while mi scorre gli elementi del primo vettore, mentre il secondo while gli elementi di b (il filtro).
    while ( j < m || trovato == 0) qui intendevo che finche j (indice) e' minore di m (la grandezza del vettore b) e trovato e' uguale a zero continuare la ricerca.
    nel momento in cui il valore di a (vettore del primo while) e' uguale a (b[j]+b[j+1]) trovato diventera' uno e usciro' dal while.
    Primo di uscire dal secondo while pero' assegno il valore a c[k] che e' il terzo vettore e incremento sia l'indice di k in modo tale che al prossimo while punti alla seconda posizione del vettore e incremento "w" che e' il riempimento del vettore "c".
    In fine nell' ulrima parte del primo while cioe' questa:
    while ( i < n)
                                                            {
                                                                while ( j < m || trovato == 0)
                                                                     {
                                                                        if (a[i] == (b[j]+b[j+1]))
                                                                          {
                                                                            c[k] = a[i];
                                                                            
                                                                            k++;
                                                                            w++;
                                                                            trovato = 1;
                                                                          }
                                                                        else j++;
                                                                     }
                                                            trovato = 0;
                                                            i++;
                                                            j = 0;
                                                            }
    Resetto trovato = 0, incremento la i del while e infine reimposto di nuovo j = 0, in modo tale che al prossimo valore di a posso confrontarlo con tutto il vettore B.
    Ho detto tutto cio' per far capire meglio il mio ragionamento, siccome non ho capito l'ultima risposta. Comunque vi ringrazio per l'attenzione e mi scuso per il disturbo
  • Re: Esercizio array in C

    Se non trovo il numero e trovato rimane a zero, j sara' uguale ad m e si esce dal ciclo.
    (in risposta a dobby)
  • Re: Esercizio array in C

    [CODE] while ( j < m || trovato == 0) rimane nel ciclo se (j<m) o (trovato=0) quindi se trovato=0 rimane dentro a prescindere di j e m.
  • Re: Esercizio array in C

    Quindi in questo caso è come se stessi dicendo “finché j < m O trovato == 0” quindi se trovato sarà uguale a 0 dal ciclo non si esce perché c’è l’OR.
    La situazione però cambia se inserisco && ( AND) perché così devono essere vere entrambe le condizioni. Giusto?
  • Re: Esercizio array in C

    Sì, ma fai attenzione anche al valore finale di j.
  • Re: Esercizio array in C

    Ho cambiato con l'and ma non riesco a capire dov'e' l'errore ancora....
  • Re: Esercizio array in C

    Scusatemi, con la correzione dell'and va pero' c'e' ancora qualche piccolissomo errore. In linea di massima come ho impostato il ragionamento?
    comunque vi ringrazio a tutti, avevo proprio bisogno di una piccola mano su gli esercizi.
  • Re: Esercizio array in C

    Quando j sta sull'ultimo elemento, b(j+1) sfora.
    w non ti serve, puoi benissimo ritornare k.
  • Re: Esercizio array in C

    Io farei qualcosa del genere:
    #include <stdio.h>
    
    #define SIZE 100
    
    int fun(int a[], int b[], int c[], int n_a, int n_b)
    {
        int i_c = 0;
        for(int i_b = 0; i_b < n_b - 1; ++i_b)
        {
            int target = b[i_b] + b[i_b + 1];
            for(int i_a = 0; i_a < n_a; ++i_a)
            {
                if(a[i_a] == target)
                {
                    c[i_c++] = target;
                }
            }
        }
        return i_c;
    }
    
    void stampa(int v[], int dim)
    {
        for(int i = 0; i < dim; ++i)
        {
            printf("%d ", v[i]);
        }
        printf("\n");
    }
    
    int main()
    {
        int a[SIZE] = {3, 4, 5, 6, 7, 1, 2, 3, 34};
        int b[SIZE] = {3, 7, 6, 5, 4, 3, 2, 1};
        int c[SIZE];
        int n_a = 9;
        int n_b = 8;
        int n_c = fun(a, b, c, n_a, n_b);
        stampa(c, n_c);
        return 0;
    }
Devi accedere o registrarti per scrivere nel forum
13 risposte