PDA

View Full Version : [c] ricercare il secondo massimo


ninuzz
24-02-2011, 16:59
ricercare il secondo massimo di un array.
delle volte riesce a trovarlo e delle volte no.

#include <stdio.h>
#include <stdlib.h>
/*ricercare il secondo massimo degli elementi dell'array*/
int ric_max(int [],int);
int main()
{int a[100];
int i,n,max;
printf("inserisci il size dell array:");
scanf("%d",&n);
printf("inserisci gli elementi:");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
max=ric_max(a,n);
printf("l'elemento massimo e':%d\n",max);
system("PAUSE");
return 0;
}
int ric_max(int a[],int n)
{
int massimo=a[0];
int i,max2=a[1];
for(i=0;i<n;i++){
if(a[i]>massimo){
max2=massimo;
massimo=a[i];
}
}

return max2;
}

ninuzz
24-02-2011, 18:27
devo usare per forza un algoritmo di ordinamento??

#include <stdio.h>
#include <stdlib.h>
/*ricercare il secondo massimo degli elementi dell'array*/
void ric_max(int [],int);
int main()
{int a[100];
int i,n;
printf("inserisci il size dell array:");
scanf("%d",&n);
printf("inserisci gli elementi:");
for(i=0;i<n;i++)
scanf("%d",&a[i]);
ric_max(a,n);
printf("il secondo elemento massimo e':%d\n",a[n-2]);
system("PAUSE");
return 0;
}
void ric_max(int a[],int n)
{
int max;
int i,j,max2;
for(i=n-1;i>0;i--){
max=i;
for(j=0;j<i+1;j++)
if(a[j]>a[max])
max=j;
max2=a[max];
a[max]=a[i];
a[i]=max2;
}
}

Kenger
24-02-2011, 23:42
Puoi modificare i messaggi indentando bene il tuo codice?

clockover
25-02-2011, 01:29
Non devi usare algoritmi di ordinamento, non ne hai bisogno dato che comunque devi scandire tutto l'array!

Il tuo algoritmo iniziale va abbastanza bene ma devi modificarlo!
Prima di tutto fai un confronto iniziale! Tu già a priori scegli massimo = array[0] e max2 = array[1], ma non è detto che array[0] sia più grande di array[1].
Inoltre fai un controllo nel ciclo e se array[i] > massimo allora il nuovo max2 diventa massimo e il nuovo massimo diventa array[i]... ma che succede se array[i] è minore di massimo ma è maggiore di max2??

E indenta bene il codice

bobbytre
25-02-2011, 02:44
Piccolo esempio di codice indentato a dovere

#include <stdio.h>
#include <stdlib.h>

/*ricercare il secondo massimo degli elementi dell'array*/
void ric_max(int[], int);

int main()
{
int a[100];
int i, n;

printf("inserisci il size dell array:");
scanf("%d", &n);
printf("inserisci gli elementi:");
for (i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}

ric_max(a, n);
printf("il secondo elemento massimo e':%d\n", a[n - 2]);
system("PAUSE");

return 0;

}

void ric_max(int a[], int n)
{
int max;
int i, j, max2;

for (i = n - 1; i > 0; i--)
{
max = i;
for (j = 0; j < i + 1; j++)
{
if (a[j] > a[max])
{
max = j;
}
}

max2 = a[max];
a[max] = a[i];
a[i] = max2;
}

}

ninuzz
25-02-2011, 11:13
Non devi usare algoritmi di ordinamento, non ne hai bisogno dato che comunque devi scandire tutto l'array!

Il tuo algoritmo iniziale va abbastanza bene ma devi modificarlo!
Prima di tutto fai un confronto iniziale! Tu già a priori scegli massimo = array[0] e max2 = array[1], ma non è detto che array[0] sia più grande di array[1].
Inoltre fai un controllo nel ciclo e se array[i] > massimo allora il nuovo max2 diventa massimo e il nuovo massimo diventa array[i]... ma che succede se array[i] è minore di massimo ma è maggiore di max2??

E indenta bene il codice


if(a[0]>a[1]){
max=a[0];
max2=a[1];
}
else{
max=a[1];
max2=a[0];
}
for(i=2;i<n;i++){
if(a[i]>max){
max2=max;
max=a[i];
}
if(a[i]<=max && a[i]>max2)
max2=a[i];
}
return max2;

roba del genere?

clockover
25-02-2011, 13:17
E se invece di
if(a[i]<=max && a[i]>max2)
max2=a[i];
}
metti un semplice

else if(a[i] > max[2])
max2 = a[i];

ninuzz
25-02-2011, 15:36
anche facendo

else if(a[i]>max2)
max2=a[i];

clockover
25-02-2011, 15:55
Controlla bene e riposta il codice della funzione modificata (indentato per piacere)

ninuzz
25-02-2011, 16:22
Controlla bene e riposta il codice della funzione modificata (indentato per piacere)

#include <stdio.h>
#include <stdlib.h>
int ric_max(int [],int);
int main()
{int i,a[100],n,pepp;
printf("inserisci il size dell array:");
scanf("%d",&n);


printf("inserisci elementi dell array:");
for(i=0;i<n;i++)
scanf("\n%d\n",&a[i]);


pepp=ric_max(a,n);

printf(" il secondo massimo:%d\n",pepp);

system("PAUSE");
return 0;
}
int ric_max(int a[],int n)
{
int i,max,max2;


if (a[0]>a[1])
{
max=a[0];
max2=a[1];
}

else
{
max=a[1];
max2=a[0];
}


for(i=2;i<n;i++)
{

if(a[i]>max)
{
max2=max;
max=a[i];
}


else if(a[i]>max2)
max2=a[i];
}

return max2;
}