Visualizzazione dei risultati da 1 a 8 su 8

Discussione: [C] Ricerca del massimo tramite Divide et Impera ricorsivo

  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2018
    Messaggi
    4

    [C] Ricerca del massimo tramite Divide et Impera ricorsivo

    Ciao ragazzi! È da un po' che mi sono bloccato su un problema. Come da titolo devo trovare il massimo in un array di struct tramite Divide et Impera ricorsivo (utlizzando per forza questa tecnica!).

    Ho già il codice pronto per la ricerca, magari non sarà perfetto ma funziona.

    codice:
    int massimo_a_ricDI(int v[],int primo,int ultimo)
    {
        int mediano;
        if(primo == ultimo)
            return v[primo];
        else
        {
            mediano=(primo+ultimo)/2;
            return max_I(massimo_a_ricDI(v,primo,mediano),
                massimo_a_ricDI(v,mediano+1,ultimo));
        }
    }
    
    int max_I(int a, int b)
    {
        if (a > b)
            return a;
        else
            return b;
    }

    Ma proprio non riesco a riscriverlo in modo da applicarlo a questo array di struct per trovare e stampare il libro dal costo maggiore.

    codice:
    typedef struct{    char    titolo[50];
        char    autore[25];
        int     prezzo;
        int     stato;
        int     codice;
    }lib;
    
    int n=99;
    lib v[n]

    Ho fatto ogni tipo di modica per far funzionare il tutto, ma ogni volta trovo un problema diverso, soprattutto per via dei tipi diversi.
    Cosa mi consigliate?
    Ultima modifica di -Chuck-; 06-02-2018 a 03:02

  2. #2
    Una cosa così dovrebbe funzionare:

    codice:
    lib* max(lib* a, lib* b)
    {
        if (a->prezzo > b->prezzo)
            return a;
        else
            return b;
    }
    
    
    lib* massimo_a_ricDI(lib v[],int primo,int ultimo)
    {
        int mediano;
        if(primo == ultimo)
            return &v[primo];
        else
        {
            mediano=(primo+ultimo)/2;
            return max(massimo_a_ricDI(v,primo,mediano), massimo_a_ricDI(v,mediano+1,ultimo));
        }
    }
    Altrimenti, senza puntatori:

    codice:
    lib max(lib a, lib b)
    {
        if (a.prezzo > b.prezzo)
            return a;
        else
            return b;
    }
    
    
    lib massimo_a_ricDI(lib v[],int primo,int ultimo)
    {
        int mediano;
        if(primo == ultimo)
            return v[primo];
        else
        {
            mediano=(primo+ultimo)/2;
            return max(massimo_a_ricDI(v,primo,mediano), massimo_a_ricDI(v,mediano+1,ultimo));
        }
    }

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2018
    Messaggi
    4
    Quote Originariamente inviata da scimmiaparlante Visualizza il messaggio
    Una cosa così dovrebbe funzionare:
    Altrimenti, senza puntatori:
    Grazie! I codici mi sembrano giusti, ma all'applicazione del primo il programma crasha e il secondo non ritorna nessun valore. Non capisco perché.
    Forse il problema lo causo io dichiarando o chiamando male le function, non so che altro pensare.

    Questa è la dichiarazione
    codice:
    lib massimo_a_ricDI(lib v[],int primo,int ultimo);

    E questa è la chiamata
    codice:
    massimo_a_ricDI(v,0,L-1);

    Se può essere utile posto tutto il codice, anche se è lunghetto.
    Ultima modifica di -Chuck-; 06-02-2018 a 12:23

  4. #4
    Così a me funziona

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    
    
    
    typedef struct{
        char    titolo[50];
        char    autore[25];
        int     prezzo;
        int     stato;
        int     codice;
    }lib;
    
    
    lib max(lib a, lib b)
    {
        if (a.prezzo > b.prezzo)
            return a;
        else
            return b;
    }
    
    
    lib massimo_a_ricDI(lib v[],int primo,int ultimo)
    {
        int mediano;
        if(primo == ultimo)
            return v[primo];
        else
        {
            mediano=(primo+ultimo)/2;
            return max(massimo_a_ricDI(v,primo,mediano), massimo_a_ricDI(v,mediano+1,ultimo));
        }
    }
    
    
    
    
    int main()
    {
    	int i;
    	const int n = 99;
    	lib vett[n];
    	srand(time(NULL));
    	
    	for(i = 0; i < n; i++)
    	{
    		vett[i].prezzo = rand();
    		printf("%d\t", vett[i].prezzo);
    	}
    	printf("\n-----------------\n");
    	
    	printf("%d", massimo_a_ricDI(vett, 0, n-1).prezzo);
    
    
    }

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2018
    Messaggi
    4
    Quote Originariamente inviata da scimmiaparlante Visualizza il messaggio
    Così a me funziona
    Si hai ragione, grazie mille! Funziona!!!

    So che sei stato già fin troppo disponibile, ma se volessi stampare, oltre al prezzo maggiore, anche gli altri dati del libro più costoso? Ogni libro aggiunto ha un suo codice sequenziale, da quello si può ottenere l'indice.
    Ultima modifica di -Chuck-; 06-02-2018 a 14:14

  6. #6
    L'output della funzione è una copia della struct del libro di costo massimo nel caso senza puntatori e un puntatore ad essa in quello con i puntatori. Quindi basta stampare normalmente i campi.

    Caso 1:
    codice:
    lib libro_piu_costoso = massimo_a_ricDI(vett, 0, n-1);
    	
    	printf("prezzo: %d\nnome: %s", libro_piu_costoso.prezzo, libro_piu_costoso.titolo);

  7. #7
    Utente di HTML.it
    Registrato dal
    Feb 2018
    Messaggi
    4
    Siii è perfetto! Grazie ancora! Non hai idea da quanto stavo sbattendo la testa su questo esercizio, ma come vedi mi manca ancora molta pratica.
    GRAZIE!

    (Si può chiudere il topic! )
    Ultima modifica di -Chuck-; 06-02-2018 a 14:30

  8. #8
    Prego

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