PDA

Visualizza la versione completa : [C] Divide and Conquer - ricerca massimo in un array


persephone
11-02-2007, 13:31
Ho questo esercizio da fare:

1. Algoritmo del massimo di un array 1D (di size qualunque, non necessariamente potenza intera di 2) di char, approccio divide et impera, implementato con tecnica ricorsiva e variante casuale. L’idea è quella dell’algoritmo implementato in max_radd, ma l’implementazione deve essere fatto con tecnica ricorsiva. La variante casuale prevede che, a ogni passo, una porzione di array (per esempio quella individuata dal primo indice =8 e dal secondo indice = 20) non venga divisa esattamente a metà, ma venga suddivisa in due parti per esempio (da 8 a k) e (da k+1 a 20) dove k è un numero casuale in (9,10,11,…,19). Quindi, per es., la prima suddivisione di array (1..n) avverrà scegliendoa caso un intero tra 2 e n-1 e non necessariamente scegliendo l’indice (n+1)/2.

Il codice che ho scritto finora è questo:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
char max(char [],int );
char confronto(char, char);
int main()
{
int n,i,j;
printf("Inserisci il numero degli elementi:\n");
scanf("%d",&n);
char a[n], massimo;
srand(time(0));
for (i=0; i<n; i++)
{
a[i]=rand();
printf("a(%d)=%c \n",i,a[i]);

}
massimo= max(a, n);
printf("Il massimo dell'array e' %c\n", massimo);
system ("PAUSE");
return 0;
}
char max(char a [], int n)
{
int numero_casuale,n1,n2;
char max_elem, max_elem1, max_elem2;
numero_casuale=1+rand()%(n);
if (n==1) {
max_elem=a[0];
printf("Il massimo e' %c ", max_elem, "\n");
}
else if (n==2) {
max_elem= confronto(a[0],a[1]);
printf("Il massimo e' %c ", max_elem, "\n");
}
else { n=numero_casuale-n;
max_elem1=max(a,numero_casuale);
max_elem2=max(a[numero_casuale+1], n); ***
max_elem=confronto(max_elem1,max_elem2);

}
return max_elem;
}
char confronto (char a, char b) {
if (a>b) return a;
else return b;
}

*** A questa linea il compilatore mi dà l'errore "[Warning] passing arg 1 of 'max' makes pointer from integer without a cast". Cosa significa?

In ogni caso bastano le chiamate ricorsive max_elem1=max(a,numero_casuale); e max_elem2=max(a[numero_casuale+1], n); per esaminare tutto l'array?

alka
12-02-2007, 03:20
Ne stai già parlando qui (http://forum.html.it/forum/showthread.php?s=&threadid=1087776).

Loading