Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    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, problema credo di averlo capito.. in pratica nn mi và al blocco successivo, dovrei mettere un istruzione a fine for del main del tipo n=n*k; solo che al primo ciclo k=0 e quindi mi crasha.. idee? ecco il codice.

    codice:
    #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,i=k,j;
        for(j=0;j<n;j++)
        {
              s=s+A[i];
              i++;
              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;
    }

  2. #2
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    Ciao, guarda ho dato un'occhiata al tuo esercizio...mi è parso corretto apparte qualche piccolo dettaglio tipo:
    codice:
    printf("Quanto deve essere lungo l'array?\n");
        scanf("%d",&l);
        int A[l];
    in genere non si fa una cosa simile ma si usa la allocazione dinamica, ma magari non l'hai ancora studiata, quindi...fa niente...cmq per tua conoscenza si farebbe:
    codice:
    int *A;
    printf("Quanto deve essere lungo l'array?\n");
        scanf("%d",&l);
    A = (int*)malloc(l*sizeof(int));
    if ( A == null ) printf ("Allocazione non riuscita\n");
    Inoltre un altro errore è nel cilcio for dove calcoli la media e il minimo la condizione di terminazione non la capisco: l>k+l??
    comunque ho provato ad apportare qualche semplice modifica...prova a vedere se funziona e fammi sapere! ciao

    codice:
    #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;k<l;k=k+n)
        {
            m=media(A,n,k);
            minim=minimo(A,n,k);
            if (m==minim){
                printf ("Nella %d n-upla si ha TRUE\n", (k/n)+1);
                } else {
                 printf ("Nella %d n-upla si ha FALSE\n", (k/n)+1);
            }
        }
        system ("pause");   
        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,i=k,j;
        
        for(j=0;j<n;j++)
        {
              s=s+A[i];
              i++;
             // 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;
    }
    "Non può piovere per sempre" Il Corvo
    Forza Vigor!

  3. #3
    Ti ringrazio tantissimo per le precisazioni, qualche accorgimento già l'avevo portato.. però a quanto pare il programma continua a non fare quello che dovrebbe...
    Anche con i dati dell'esercizio mi da sempre false.. Il problema credo sia di materia strutturale in quanto il controllo della media e del minimo non viene fatto sui blocchi successivi.
    Il programma dovrebbe fare questo:

    Media primo blocco=3
    Confrontare la media col minimo del 2° blocco. Se è vera assegnare a b=1 altrimenti assegnare 0 e terminare il programma.

    provo a cambiare la struttura dei controlli e vedo se ci riesco.. grazie ancora comunque : )

  4. #4
    Utente di HTML.it L'avatar di MrX87
    Registrato dal
    Jun 2007
    Messaggi
    500
    Il programma dovrebbe fare questo:

    Media primo blocco=3
    Confrontare la media col minimo del 2° blocco. Se è vera assegnare a b=1 altrimenti assegnare 0 e terminare il programma.
    ahhhhhhh...allora mi devi perdonare perchè leggendo di fretta non avevo capito il senso del programma!! bhè comunque per fare quello che ri serve basta modificare il ciclo for che è nel main! ma comunque considerando l'esempio proposto, si confronta la media del 1 blocco con il minimo del secondo blocco, e poi la media del 2 blocco con il minimo del 3 blocco e così via...! giusto?
    "Non può piovere per sempre" Il Corvo
    Forza Vigor!

  5. #5
    Giustissimo
    Cmq grazie ad altri aiuti sono riuscito a fare il programma ecco il codice se vi interessa

    codice:
    #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 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;
    }
    
    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,b;
        
      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");
      system("pause");  
      return 0;
    }

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 © 2025 vBulletin Solutions, Inc. All rights reserved.