Visualizzazione dei risultati da 1 a 7 su 7

Discussione: [c]ciclo ottimizzato

  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    383

    [c]ciclo ottimizzato

    ciao,
    devo scrivere un porogramma che, dato un array di numeri, calcoli il massimo,il minimo e la media degli elementi dell'array in modo che vengano diminuiti in media il numero dei confronti effettuati nel ciclo durante l'esecuzione rispetto a questa situazione qui:


    min=num[0]; max=num[0]; media=num[0];
    for(i=1; i<n; i++)
    {
    if (num[i]>max) max=num[i];
    if (num[i]<min) min=num[i];
    media=media+num[i];
    }
    media=media/n;

    avete un'idea di come modificare l'algoritmo per renderlo piu efficiente nel modo descritto dal testo usando i cicli e gli array?

  2. #2

  3. #3
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    383
    Se num[i]>max allora sai già che non può essere minore di min.
    e quindi come potrei modificarlo?

  4. #4
    codice:
    for(i=1; i<n; i++){
    	if (num[i]>max) max=num[i];
    	else
    	if (num[i]<min) min=num[i];
    	media +=num[i];
    }

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2006
    Messaggi
    383
    Ho scritto il codice del programma ,ma ottengo un errore in compilazione:
    codice:
    #include <stdio.h>
    
    #define MAX_ELE 100
    
    main()
    {
     double media;
     float max,min,vet[MAX_ELE];
     int i,n,res;
     printf("\n// il programma determina il maggiore,il minore e la media degli elementi di un vettore\n\n");
     do {
         printf("numero di elementi(massimo 100): ");
         scanf("%d",&n);
     } while(n<1 || n>MAX_ELE);
     printf("\n- Immissione dei dati nel vettore\n");
     for(i=0;i<n;i++) do {
                          printf("vett[%d]= ",i);
     		      res = scanf("%f",&vet[i]);
     		      while(getc(stdin)!='\n');
     		  } while(res==0);
     max=vet[0];
     min=vet[0];
     media=vet[0];
     for(i=1; i<n; i++) {
    	if (vet[i]>max) max=vet[i];
    	else
    	if (vet[i]<min) min=vet[i];
    	media += vet[i];
     media=media/n;
     printf("\nMaggiore: %f\n",max);
     printf("Minore: %f\n",min);
     printf("Media: %g\n\n",media);
    }
    codice:
    maxminmed-1.c: In function ‘main’:
    maxminmed-1.c:33: error: expected declaration or statement at end of input

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Guarda, prova questo.

    Studiai questo algoritmo diversi mesi fa e ora l'ho implementato di nuovo prendendolo da certi appunti... ho fatto diverse prove e dovrebbe funzionare.

    In sostanza, anziché considerare singolarmente gli elementi dell'array, li considera a coppie, e nel complesso esegue 3n/2 confronti, questo perché il ciclo for ha uno step pari a 2, non 1, quindi se n è il numero delle componenti le iterazioni sono n/2 e, per ognuna di queste, vengono eseguiti 3 confronti, né più né meno. Quindi n/2 iterazioni con 3 confronti... T(n) = 3n/2, mentre invece con quello che proponevi tu facevi due confronti per ogni componente dell'array tranne la prima, quindi 2n - 2.

    (Edit: comunque per quanto riguarda il codice del post precedente non so se va bene ma comunque l'errore è che l'ultima parentesi graffa chiude il for, non il main, quindi ne devi aggiungere un'altra)

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    short i;
    
    void calcolo_min_max_media(int *x, short n, int *min, int *max, int *media) {
        
        *min = *max = *media = x[0];
    
        for (i=1; i<n-1; i+=2) {
    
           if ( x[i] > x[i+1] ) {
              if ( x[i] > *max )
                 *max = x[i];
              if ( x[i+1] < *min )
                 *min = x[i+1];
           }
           else {
              if ( x[i] < *min )
                 *min = x[i];
              if ( x[i+1] > *max )
                 *max = x[i+1];
           }
           
           *media += x[i] + x[i+1];
        }
        
        *media /= n;
    }
    
    int main(void) {
        
        int *array, min, max, media;
        short n;
    
        printf("Immettere il numero delle componenti dell'array: ");
        scanf("%hd%*c", &n);
    
        array = (int *)malloc( n*sizeof(int) );
    
        srand( (unsigned int)time(NULL) );
    
        printf("\nGenerazione e visualizzazione degli elementi dell'array:\n\n");
        for (i=0; i<n; i++) {
           array[i] = rand();
           printf("%-6d", array[i]);
        }
    
        puts("\n");
    
        calcolo_min_max_media (array, n, &min, &max, &media);
    
        printf("Il minimo elemento dell'array e': %d\n"
               "Il massimo elemento dell'array e': %d\n"
               "La media degli elementi dell'array e': %d\n", min, max, media);
    
        getchar();
        return 0;
    }

  7. #7
    Originariamente inviato da cristianc
    Ho scritto il codice del programma ,ma ottengo un errore in compilazione:

    codice:
    maxminmed-1.c: In function ‘main’:
    maxminmed-1.c:33: error: expected declaration or statement at end of input
    Il numero di parentesi aperte deve essere uguale al numero di parentesi chiuse, graffe, tonde, quadre o acute che siano... non lo sapevi?
    Controlla le graffe..
    ;-)

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.