Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it L'avatar di Kaen
    Registrato dal
    Feb 2013
    Messaggi
    4

    [C]Programmazione ricorsiva per algoritmo divide et impera di massimo

    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

    vi lascio l'algoritmo divide et impera del massimo
    codice:
    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;
    }

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    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 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it L'avatar di Kaen
    Registrato dal
    Feb 2013
    Messaggi
    4
    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
    codice:
    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?

  4. #4
    Utente di HTML.it L'avatar di Kaen
    Registrato dal
    Feb 2013
    Messaggi
    4

    Problema con Switch

    Ciao Ragazzi, ho risolto il problema che avevo, penso vada bene, ora volevo chiedervi un'altra cosa riguardo lo switch, vi mostro il codice
    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


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

  5. #5
    Utente di HTML.it L'avatar di Kaen
    Registrato dal
    Feb 2013
    Messaggi
    4
    Scusatemi non si vede l'immagine,
    comunque viene stampato infinte volte
    codice:
    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.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.