Array max-secondo max!

di il
2 risposte

Array max-secondo max!

Buona sera , sono alle prese con questo programma:

/*Scrivere un programma tramite funzioni e puntatori che passato un vettore di lunghezza n
deve cercare il valore più grande e il secondo valore più grande*/

Il mio problema e' che nel momento in cui dovrebbbe darmi i due valori quello più grande e il secondo più grande non mi compila in modo corretto e mi restituisce soltanto il valore più grande. Non riesco a trovare l'errore. Potreste aiutarmi?
int main(){
int v[20], dim, i, larg, se_la;

do{
 printf("Quanti elementi vuoi inserire nel vettore?\n");
 scanf("%d", &dim);

  if(dim>20){
    printf("Errore. Hai inserito un numero maggiore di elementi, massimo 20!\nRIPROVA...\n\n");
  }
}while(dim>20);

printf("\n");

 for(i=0; i<dim; i++){
  printf("Immetti elementi in posizione %d:\n", i);
  scanf("%d", &v[i]);
 }

valori(v, dim, &larg, &se_la);
printf("\nIl primo valore piu' grande e': %d\n", larg);
printf("Il secondo valore piu' grande e': %d\n\n", se_la);

system("pause");
return 0;
}


void valori(int v[20], int dim, int *largest, int *second_largest){
int i;

 /*Assumiamo che i valori massimi sono i primi due*/
 if(v[0]>v[1]){
  *largest=v[0];
  *second_largest=v[1];
 }
 else{
  *largest=v[1];
  *second_largest=v[0];
 }

 /*Scansioniamo il vettore*/
 for(i=0; i<dim; i++){
  if(*largest<v[i]){
    *second_largest=*largest;
    *largest=v[i];
  }

  /*Se il valore del vettore non e' il massimo ma e' maggiore del secondo massimo,
   allore e' il secondo massimo*/
   if(v[i]<=*largest && v[i]>*second_largest){
    *second_largest=v[i];
   }
 }
}

2 Risposte

  • Re: Array max-secondo max!

    Il tuo esercizio è corretto. Non capisco:
    
     /*Se il valore del vettore non e' il massimo ma e' maggiore del secondo massimo,
      allore e' il secondo massimo*/
      if(v[i]<=*largest && v[i]>*second_largest){
       *second_largest=v[i];
      }
    
    Non ti serve, poichè quando inizializzi largest e second_largest già sai chi tra i primi due è più grande quindi una volta che fai
    
      if(*largest<v[i]){
        *second_largest=*largest;
        *largest=v[i];
    
    Già mantieni come second_largest il vecchio largest e in largest memorizzi il nuovo valore.

    Per una questione di complessità computazionale potresti far partire il tuo for con i=2 poichè 0 e 1 già li hai controllati.
  • Re: Array max-secondo max!

    Ti ringrazio per i chiarimenti
Devi accedere o registrarti per scrivere nel forum
2 risposte