PDA

Visualizza la versione completa : [C]Programmazione ricorsiva per algoritmo divide et impera di massimo


Kaen
11-02-2013, 21:20
Ciao a tutti,
devo fare un progetto per l'università, l'ho quasi finito ma mi manca solo una cosa ed è ormai giorni che ci provo senza risultati quindi ho ben pensato di chiedere a voi, sperando che ci sia qualcuno a perdere 10 minuti dietro il mio programma!!!

la traccia è questa, una copia sta anche nel codice:
Corso Universitario
Consideriamo un corso composto da 10 studenti. Ogni studente e identificato da
un cognome, nome, matricola, data di nascita, luogo di nascita e indirizzo di
residenza (strada/piazza, C.A.P. e numero civico ).
Il corso dura in totale 20 giorni e le presenze vengono prese giornalmente.
Scrivere un algoritmo che permette di gestire le presenze degli studenti.
Inoltre l'utente puo scegliere di effettuare le seguenti operazioni
. Dato un nome e un cognome stampare i dati e le assenze totali dello studente.
. Stampare il nome e il cognome dello studente che ha fatto piu assenze (per il
calcolo del massimo usare la programmazione ricorsiva con algoritmo divide
et impera)

Quello sottolineato è ciò che non riesco a fare, sono riuscito soltanto a stampare l'assenza massima trovata tra tutti gli studenti, ma non riesco a capire come stampare a chi appartengono!

Qui vi lascio il link per scaricare o copiare il file che contiene il programma
Il codice contiene un sacco di commenti per facilitarvi la comprensione
Programma Corso Universitario (https://docs.google.com/file/d/0B_UEWwN7b8qmNGZhVmtldHdWaVU/edit?usp=sharing)

vi lascio l'algoritmo divide et impera del massimo

int massimo_a_ricDI(int a[],int n)
{
int mediano;
/* soluzione del caso base */
if(n == 1)
return a[0];
else
{
/* autoattivazioni*/
mediano = (n-1)/2;
return max_I(massimo_a_ricDI(a,mediano+1), massimo_a_ricDI(a+mediano+1,n-mediano-1));
}
}

int max_I(int x, int y)
{
if(x > y)
return x;
else
return y;
}

oregon
11-02-2013, 21:32
Dicci cosa hai provato a fare e cosa pensi ... non lasciare l'esercizio al forum perché non è detto che qualcuno ti scriva la soluzione senza un tuo impegno ...

Kaen
11-02-2013, 22:00
ma infatti non ho lasciato l'esercizio al forum, io l'ho fatto tutto XD non ho detto di darmi la soluzione e baci e abbracci ma speravo di arrivarci con voi.
Comunque ti ringrazio della risposta e pongo meglio il mio problema

la traccia dice che l'utente può trovare lo studente con più assenze e stamparne il nome ed il cognome

Tutto questo lo devo fare usando l'algoritmo divide et impera che ho postato nel primo post.
Nel mio programma ho usato quell'algoritmo e funziona benissimo.
Eccolo qui


int trova_assenze_max(Studente studenti, int n)
{
//Programmazione ricorsiva per l'algoritmo divide et impera di massimo degli elementi di un array
int mediano;

//Soluzione del caso base
if(n == 1)
return studenti[0].tot_assenze;
else
{
//Autoattivazioni
mediano = (n-1)/2;
/*la funziona richiama se stessa fino ad arrivare alla soluzione base e
risolve tutte le chiamate precedentemente messe in pausa*/
return max_tot_assenze(trova_assenze_max(studenti,mediano +1), trova_assenze_max(studenti+mediano+1,n-mediano-1));
}
}

int max_tot_assenze(int x, int y)
{
/*Ritorna il massimo tra due elementi che appartengono al caso base
presente nella funzione trova_assenze_max*/
if(x>y)
return x;
else
return y;
}

Questo codice però trova e ritorna soltanto il numero massimo delle assenze tra tutti e 10 gli studenti, non mi da alcuna informazione su chi è lo studente e quindi non riesco a stampare il nome ed il cognome dello studente

Ho modificato più volte il codice di questa funzione, cercando di salvare l'indice dello studente. Ho provato a farla diventare una procedura, ma neanche così ci sono riuscito(sarà che sono inesperto? sicuramente), la verità è che io ho ben compreso il funzionamento dell'algoritmo divide et impera nella programmazione ricorsiva ma alla fine non fa altro che confondermi.

L'unica soluzione che ho trovato (c'ho pensato solo adesso) è di fare un ulteriore ricerca, stampando tutti gli studenti che hanno il valore delle assenze uguale a quello ritornato dalla function trova_assenze_max. Così facendo risolverei anche il problema che possono esserci più studenti con le stesse assenze e renderli noti tutti e non soltanto uno di loro.

Ma questa soluzione non è un pò un raggiro nei confronti nella traccia?

Kaen
12-02-2013, 18:36
Ciao Ragazzi, ho risolto il problema che avevo, penso vada bene, ora volevo chiedervi un'altra cosa riguardo lo switch, vi mostro il codice


int scelta, max_assenze;
const int n_s = 10; //numero di studenti

do
{
scanf("%d", &scelta);
switch(scelta)
{
case 1 : trova_studente(studenti);break;
case 2 : max_assenze = trova_assenze_max(studenti, n_s);break;
default : printf("Errore! Ripetere la scelta\n-> ");break;
}
}while(scelta != 1 && scelta != 2);


Problema:
Quando l'utente inserisce 1 oppure 2 esegue una delle funzioni e quando inserisce un NUMERO diverso stampa il messaggio di scelta errata!
Il problema si presenta quando inserisco un CARATTERE, è viene stampato infinite volte
https://www.dropbox.com/s/qv4dbnuyksnmqww/IMG_0834%20-%20Copia.JPG

Come faccio a fermare questo ciclo infinito?
Grazie infinite a chi mi risponderà :)

Kaen
12-02-2013, 18:38
Scusatemi non si vede l'immagine,
comunque viene stampato infinte volte


Errore! Ripetere la scelta
->
Errore! Ripetere la scelta
->
Errore! Ripetere la scelta
->
Errore! Ripetere la scelta
->
Errore! Ripetere la scelta
->
Errore! Ripetere la scelta
->
Errore! Ripetere la scelta
->
Errore! Ripetere la scelta
->
ecc.

Loading