Esercizio C sui vettori

di
Anonimizzato6974
il
7 risposte

Esercizio C sui vettori

Salve, approfitto di questo topic per presentarmi, sono Andrea ho 19 anni e attualmente studio informatica.
Tra qualche giorno ho programmazione e ammetto di averlo sottovalutato un pò troppo visto che avevo conoscenze (arrugginite tra l'altro, sul c++)
Sfogliando il libro ho notato un esercizio vi posto la traccia.

Sia dato un vettore A di interi di lunghezza L ed un intero n<L con L multiplo di n. Scrivere una funzione che restituisca TRUE se la media dei valori di ogni n-upla coincide con in minimo dell'n-upla successiva.

Esempio: L=16; n=4

A=|4|28|10|18||42|36|15|31||50|31|60|63||70|51|77|82||
L'output sarà true.

Questo è quello che son riuscito a stendere al momento, però qualunque valore metta mi dà sempre TRUE
#include <stdio.h>
void leggi(int A[],int l);
int media(int A[],int n,int k);
int minimo(int A[],int n,int k);
int main()
{
    int l,n,k,b,m,minim;
    printf("Quanto deve essere lungo l'array?\n");
    scanf("%d",&l);
    int A[l];
    do
    {
          printf("Inserire n\n");
          scanf("%d",&n);
          if(l<=n)
          {continue;}
    }while(l%n!=0);
    leggi(A,l);
    for (k=0;k<l;k++)
    {
        m=media(A,n,k);
        minim=minimo(A,n,k);
        if (m==minim)
        {
             b=1;
        }else
        {
             b=0;
        }
    }
    if (b=1)
        printf("TRUE");
    else
        print("FALSE");
    scanf("%d",&l);
    return 0;
}
void leggi(int A[],int l)
{
     int i;
     for (i=0;i<l;i++)
     {
         printf("Inserisci il valore della cella [%d]:\n",i);
         scanf("%d",&A[i]);
     }
}
int media(int A[],int n,int k)
{ 
    int s=0,m;
    for(k=k;k<n;k++)
    {
          s=s+A[k];
    }
m=s/n;
return m;
}
int minimo(int A[],int n,int k)
{
    int minim,j;
    minim=A[k+1];
    for(j=k+1;j<n;j++)
    {
          if (minim>A[j])
             minim=A[j];
    }
return minim;
}
        
    

7 Risposte

  • Re: Esercizio C sui vettori

    
    1) ?? Assegni o Testi ??
    //if (b=1)
    if (b==1)
    
    2) 
    int minimo(int A[],int n,int k)
    {
        int minim,j;
        minim=A[k+1];  <--------------???? +1 ???
        for(j=k+1;j<n;j++)
        {
              if (minim>A[j])
                 minim=A[j];
        }
    return minim;
    }
    
    3) Gruppi di 4 o singoli ???
        for (k=0;k<l;k++)  <---------- k+=4
        {
    
    4) Non capisco... se la verifica deve esser fatta globalmente occorre forzare l'uscita...
            if (m==minim)
            {
                 b=1;
                 break;
            }
    
            //}else
            //{
            //     b=0;
            //}
      
           ...Altrimenti spostare il test quì dentro e non fuori.
    
  • Re: Esercizio C sui vettori

    Ok... allora grazie alle tue accortenze sono riuscito a finire l'esercizio...
    1) Avevo dimenticato che il confronto si faceva con == piuttosto che con =
    2) Quello già l'avevo visto e nn so come mi sia saltanto in mente.. in pratica dovevo fare il controllo sul blocco successivo e non mi ero accorto che col controllo precedente della media il contatore K arrivava al numero giusto.
    3)Singoli la media la devo fare su un blocco N, quindi analizzo tutti i valori del blocco e ne faccio la media.
    4) Qui non ho capito che intendi, ah e cmq se faccio in questo modo:
               
    if (m==minim)
    {
                 b=0;
                 break;
    }
                 else
                 b=1;
    
    Quel break mi permette di terminare il programma senza far eseguire tutti i cicli successivi? Altrimenti in che modo dovrei strutturarlo?

    Comunque grazie davvero, alla fine in modo distratto ho postato quì un abozzo più che pietoso, l'ultima cosa che mi era rimasta era sull'if b=0 invece di == . Un errore banalissimo che però senza di te nn avrei visto


    EDIT: Mi correggo, in ogni caso il controllo si ferma al primo blocco, riposto il codice e nel fratemmpo cerco soluzione...
    #include <stdio.h>
    void leggi(int A[],int l);
    int media(int A[],int n,int k);
    int minimo(int A[],int n,int k);
    int main()
    {
        int l,n,k,b,m,minim;
        printf("Quanto deve essere lungo l'array?\n");
        scanf("%d",&l);
        int A[l];
        do
        {
              printf("Inserire n\n");
              scanf("%d",&n);
        }while(l%n!=0||l<=n);
        leggi(A,l);
        for (k=0;l>k+1;k++)
        {
            m=media(A,n,k);
            minim=minimo(A,n,k);
            if (m==minim)
                 b=1;
                 else
                 b=0;
        }
        if (b==0)
           printf("FALSE");
        else
           printf("TRUE");
        scanf("%d",&l);
        return 0;
    }
    void leggi(int A[],int l)
    {
         int i;
         for (i=0;i<l;i++)
         {
             printf("Inserisci il valore della cella [%d]:\n",i);
             scanf("%d",&A[i]);
         }
    }
    int media(int A[],int n,int k)
    { 
        int s=0,m=0;
        for(k=k;k<n;k++)
        {
              s=s+A[k];
        }
    m=s/n;
    return m;
    }
    int minimo(int A[],int n,int k)
    {
        int minim,j,i=k;
        minim=A[k];
        for(j=0;j<n;j++)
        {
              if (minim>A[i])
                 minim=A[i];
              i++;
        }
    return minim;
    }
            
  • Re: Esercizio C sui vettori

    Sul punto 3 e 4 non ci siamo capiti...
    Mi sembra di vedere che tu cicli sui singoli elementi e non sui blocchi di n ...
    Se mi permetti io ti mostro il programma, come lo vedo io.
    
    #include <stdio.h>
    
    int media(int A[],int n,int k)
    { 
      int i,somma=0;
      for (i=k;i<k+n;i++)
        somma+=A[i];
    
      return (somma/n);
    }
    
    int minimo(int A[],int n,int k)
    { 
      int i,min=A[k];
      for (i=k;i<k+n;i++)
        if (A[i]<min)
          min=A[i];
    
      return (min);
    }
    
    int verifica (int A[],int l,int n)
    {
      int i,k;
      int med,med_old,min;
      
      med_old=0;
      for (i=0;i<n;i++)
      {
        k=i*n;
        med =media(A,n,k);
        min =minimo(A,n,k);
        //
        // Just debugging...
        printf ("k=%d med_old=%d med=%d min=%d\n",k,med_old,med,min);
        //
        if (med_old==min)
          return 1;
        med_old=med;
      }
      return 0;
    }
    
    void leggi(int A[],int l)
    {
      int i;
      for (i=0;i<l;i++)
      {
        printf("Inserisci il valore della cella [%d]:\n",i);
        scanf("%d",&A[i]);
      }
    }
    
    int main()
    {
      int l,n;
        
      printf("Quanto deve essere lungo l'array?\n");
      scanf("%d",&l);
      int A[l];
      do
      {
        printf("Inserire n\n");
        scanf("%d",&n);
      }while(l%n!=0||l<=n);
      leggi(A,l);
    
      printf ("%s\n",verifica (A,l,n) ? "true" : "false");
        
      return 0;
    }
    
  • Re: Esercizio C sui vettori

    Permetto eccome!
    Il tuo programma funziona ma non perfettamente... Mi spiego meglio...
    Se faccio un'array di 6 elementi con 3 blocchi da 2 del tipo:

    |4|2||3|5||10|32||

    Mi dà cmq TRUE perchè si ferma al primo blocco e non esegue gli altri, però forse credo di aver capito cosa modificare..
    Ancora due domande scusami.. se potresti spiegarmi in dettaglio
      printf ("%s\n",verifica (A,l,n) ? "true" : "false");
    e la funzione verifica.

    Grazie in anticipo
  • Re: Esercizio C sui vettori

    AndrewAbigail ha scritto:


    Mi dà cmq TRUE perchè si ferma al primo blocco e non esegue gli altri...
    E' intenzionale o almeno così ho compreso dalla traccia. Devi verificare che tutte le condizioni siano vere?

    AndrewAbigail ha scritto:


    
     printf ("%s\n",verifica (A,l,n) ? "true" : "false");
    
    L' operatore ternario "? :" è una forma sintetica dell'istruzione if-else. Tradotto sarebbe:
    
    if (verifica (A,l,n))
       printf ("true\n");
    else
       printf ("false\n");
    
    Saluti,
    Max

    EDIT:
    Ok... un errore nella funzione di verifica e ora verifica tutti i gruppi (almeno spero)
    
    int verifica (int A[],int l,int n)
    {
      int k;
      int med,med_old,min;
      int ret=0;
      
      med_old=0;
      for (k=0;k<l;k+=n)
      {
        med =media(A,n,k);
        min =minimo(A,n,k);
        //
        // Just debugging...
        printf ("k=%d med_old=%d med=%d min=%d\n",k,med_old,med,min);
        //
        if (med_old && med_old!=min)
          return 0;
        med_old=med;
      }
      return 1;
    }
    
  • Re: Esercizio C sui vettori

    Grande Max
    Grazie ancora.. non è che domani vieni con me a dare programmazione I? XD
  • Re: Esercizio C sui vettori

    Già dato più di 25 anni fa... è il tuo turno vai e sfonda!

    ~Max~
Devi accedere o registrarti per scrivere nel forum
7 risposte