Programma in C urgente

di il
44 risposte

44 Risposte - Pagina 3

  • Re: Programma in C urgente

    Intanto comincia a preparare qualche matrice di test, mettici dei valori e calcola il risultato. Poi le usiamo per controllare se il programma funziona.
  • Re: Programma in C urgente

    Ok ti scrivo la matrice

    1 2 3 4 5
    6 7 5 2 1
    3 2 1 6 8

    somme :
    1+7+1=9
    1+7+6=14
    1+7+8=16
    1+5+6=12
    1+5+8=14
    1+2+8=11
    2+5+6=13
    2+5+8=15
    2+2+8=12
    3+2+8=13

    somma massima 14 indifferente la scelta visto che viene due volte
  • Re: Programma in C urgente

    Veramente dovrebbe essere 16
    
    #include <stdio.h>
    #include <limits.h>
    
    #define V 3
    #define F 5
    int A[V][F] = { { 1, 2, 3, 4, 5 }, { 6, 7, 5, 2, 1 }, { 3, 2, 1, 6, 8 } };
    
    void LeggiElementi()
    {
    	int i, j, temp;
    	for(i = 0; i < V; i++) 
    	{
    		for(j = 0; j < F; j++)
    		{
    			scanf("%d", &temp );
    			A[i][j] = temp;
    		}
    	}
    }
    
    void StampaElementi()
    {
    	int i, j;
    	for(i = 0; i < V; i++) 
    	{
    		for(j = 0; j < F; j++)	
    		{
    			printf("%d ",A[i][j]);
    		}
    		printf("\n");
    	}
    }
    
    int CalcolaSommaSemidiagonale(int di)
    {
    	int i, somma;
    	somma = 0;
    	for(i = 0; i < V - 1; ++i)
    	{
    		somma += A[i][di + i];
    	}
    
    	return somma;
    }
    
    int CercaMassimoAllaBase(int di)
    {
    	int i, d, max;
    	max = INT_MIN;
    
    	for(i = di; i < F; ++i)
    	{
    		d = A[V-1][i];
    		if (d > max)
    			max = d;
    	}
    
    	return max;
    }
    
    int CercaSommaMassimaDiagonale(int di)
    {
    	int sommaSemidiagonale, massimoAllaBase;
    	sommaSemidiagonale = CalcolaSommaSemidiagonale(di);
    	massimoAllaBase = CercaMassimoAllaBase(di + V - 1);
    
    	return sommaSemidiagonale + massimoAllaBase;
    }
    
    void CercaSommaMassima()
    {
    	int i, max, somma;
    	max = INT_MIN;
    	for(i = 0; i < V; i++) 
    	{
    		somma = CercaSommaMassimaDiagonale(i);
    		if (somma > max)
    			max = somma;
    	}
    
     	printf("Somma Max: %d", max);
    }
    
    void main() 
    {
    	// LeggiElementi();
    	StampaElementi();
    
    	CercaSommaMassima();
    }
    
    In realtà questo non era un vero e proprio problema di programmazione, assomiglia di più ad un problema enigmistico. Esamina il codice e poi ne parliamo.
  • Re: Programma in C urgente

    Scusa ma son due giorni che facci somme sto per fondere ahahha si in effetti è proprio quello che ha detto il prof non cercate un senso in questo esercizio che per voi sarà difficile da svolgere quindi chiedete tranquillamente aiuto il senso per cui ve lo assegno è farvi impazzire un pò con indici delle matrici e iterazioni solo che non siamo così tanto esperte di C poteva essere magnanimo con qualcosa di più semplice xD
  • Re: Programma in C urgente

    Simpatico. Comunque come vedi si risolve in poche righe, ti è tutto chiaro?
  • Re: Programma in C urgente

    Insomma sto cercando di capire cosa svolge funzione per funzione
    se mi dai una mano a interpretare il senso mi aiuti
    in particolare cosa fa l'header limits.h e cosa significa max=INT_MIN ?
  • Re: Programma in C urgente

    In una matrice 3x5 dovrai esaminare solo le prime 3 diagonali (V è il numero di righe e vale 3) quindi:
    
    	for(i = 0; i < V; i++) 
    	{
    		somma = CercaSommaMassimaDiagonale(i);
    
    Considera ora una diagonale, ne sommi gli elementi escludendo l' ultima riga:
    
    int CalcolaSommaSemidiagonale(int di)
    {
       ...
    
    a questo punto nell' ultima riga cerchi il valore massimo (partendo da quando finisce la diagonale):
    
    int CercaMassimoAllaBase(int di)
    {
       ...
    
    E lo sommi al valore della semidiagonale.
    
    return sommaSemidiagonale + massimoAllaBase;
    
    Hai trovato il valore massimo per una diagonale, prosegui il ciclo e il gioco è fatto.
  • Re: Programma in C urgente

    Quindi vediamo se ho capito bene consideri quante diagonali puoi avere in base alla dimensione della matrice ok ci siamo nel nostro caso sono tre

    consideri ciascuna delle 3 diagonali senza l'ultimo elemento ? quindi nel nostro caso sommiamo solo i primi due elementi diagonali e poi a questi elementi sommi l'elemento massimo alla base cioè all'ultima riga e ci siamo quello che mi rimane da capire è questo l'elemento massimo lo valuti tra tutti quelli dell'ultima riga compreso l'elemento diagonale ovviamente giusto ?
    suppongo di si

    incredibile non so come hai fatto in pochi minuti ma sei veramente bravo sono contenta perchè quanto meno ho capito il senso dell'approccio all'esercizio che sembrava impossibile quando in realtà era molto logico arrivarci

    ciò che vorrei capire soltanto è il significato dell'header limits.h e quel max= INT_MIN non trovo dichiarato da nessuna parte
  • Re: Programma in C urgente

    Beh, brava anche a te, riesci a capire rapidamente del codice astruso.

    Per quanto riguarda limits.h serve perchè contiene la definizione di INT_MIN che è il minimo valore di un intero.

    Quando cerchi il massimo in un insieme di elementi hai due possibili approcci, o inizializzi la variabile max col primo valore del tuo insieme e poi man mano che ne trovi di più grandi la aggiorni, oppure la inizializzi con un valore che sicuramente è il più piccolo di tutti (INT_MIN) e poi man mano che esamini i tuoi valori la aggiorni.

    Usare il primo approccio a volte è poco chiaro (avrei dovuto scrivere in certi punti max= A[V-1]) e ho preferito usare INT_MIN.
  • Re: Programma in C urgente

    Ora mi sorge un altro dubbio però
    nel nostro caso abbiamo considerato le tre diagonali
    171
    256
    328

    e come ultimo elemento alla prima 1 7 abbiamo messo 8 per avere 16

    ma così facendo c'è un problema non consideriamo alcune somme tipo 1+5+8
    cioè A00+A12+A24 perchè A00 E A12 NON SI TROVANO SULLA STESSA SEMIDIAGONALE
    ma quella somma ai fini dell'esercizio è valida e se i valori fossero stati diversi magari sarebbe stata proprio quella la somma massima
  • Re: Programma in C urgente

    Il fatto è che avevi scritto:

    federica ha scritto:


    ti spiego bene cosa vuole l'esercizio
    Sia data la matrice A :

    2 3 5 6 7
    1 -4 1 7 8
    5 3 2 1 8 6

    devo massimizzare le somme tra gli elementi di A procedendo a scala senza tornare indietro cioè tipo fare
    prima somma 2+(-4)+2 = 0
    seconda somma 2+(-4)+1=-1
    terza somma 2+(-4)+8=6
    quarta somma 2 +(-4)+6= 4
    quinta somma 3+1+8=12
    sesta somma 3+1+6=10
    settima somma 5+7+6=18

    la somma massima è 18 ed è relativa agli elementi 5 7 6 in posizione 02 13 24
    e qui non si parlava di 2 + 1 + 8.

    Adesso però io devo andare, quello che abbiamo scritto può comunque esserti utile?
  • Re: Programma in C urgente

    Hai ragione sono troppa fusa se dobbiamo includere di volta in volta anche gli elementi non diagonali come potremmo fare ? stavo pensando a un algoritmo ricorsivo che di volta in volta somma a tutti gli elementi di un vettore quelli del vettore riga sottostante ? inrealtà i casi son troppi e farli manualmente ci si sbaglia facilmente cmq si sei stato gentilissimo se hai qualche idea sull'esercizio completo che somma tutti i possibili casi e vuoi darmi qualche dritta te ne sarei grata ad ogni modo sei stato fin troppo gentile e disponibile

    l'esempio giusto almeno intermini di calcoli da fare è questo

    1 2 3 4 5
    6 7 5 2 1
    3 2 1 6 8

    somme :
    1+7+1=9
    1+7+6=14
    1+7+8=16
    1+5+6=12
    1+5+8=14
    1+2+8=11
    2+5+6=13
    2+5+8=15
    2+2+8=12
    3+2+8=13

    se riesci a spiegarmi anche un possibile ragionamento al di là del codice in se te ne sarei grata altrimenti ripeto grazie comunque per la disponibilità ci risentiamo dopo magari
  • Re: Programma in C urgente

    Non ti prometto nulla, se ho tempo dopo cena ci butto un occhio.
  • Re: Programma in C urgente

    Grazie basta anche l'idea risolutiva
  • Re: Programma in C urgente

    Per risolvere questo tipo di esercizi si può usare una tecnica chiamata Backtracing, è un algoritmo ricorsivo che esplora in maniera sistematica un insieme di possibilità. In pratica parti da un elemento e lo sommi col successivo valido, a cascata fino a che raggiugi l' ultima riga. Arrivato a questo punto guardi se la somma è maggiore delle somme precedenti e aggiorni la variabile max. Poi la funzione ricorsiva torna indieto di un passo seleziona la somma con un altro elemento ecc.

    Prova a guardare questo codice:
    
    #include <stdio.h>
    #include <limits.h>
    
    
    #define V 3
    #define F 5
    int A[V][F] = { { 1, 7, 3, 4, 5 }, { 6, 1, 9, 6, 1 }, { 3, 2, 1, 6, 8 } };
    
    int max;
    
    void StampaElementi()
    {
       int i, j;
       for(i = 0; i < V; i++) 
       {
          for(j = 0; j < F; j++)   
          {
             printf("%d ",A[i][j]);
          }
          printf("\n");
       }
    }
    
    void EsploraQuelliSotto(int di, int dj, int somma)
    {
    	int i, j;
    	i = di + 1;
    	j = dj + 1;
    	
        if (i == V)
    	{
    		if (somma > max)
    			max = somma;
    		
    		return;
    	}
    
    	while( j < F )
    	{
    		EsploraQuelliSotto(i, j, somma + A[i][j]);
    		++j;
    	}
    }
    
    void main() 
    {
    	int j;
    	max = INT_MIN;
    	StampaElementi();
    
    	for(j = 0; j < F; ++j)
    	{
    		EsploraQuelliSotto(0, j, A[0][j]);
    	}
    
    	printf("Somma Max: %d", max);
    }
    
    Restituisce il valore corretto, però usalo solo come traccia per capire il meccanismo delle ricorsione.
    Poi bisognerebbe migliorarlo, ma questa non è l' ora giusta.
Devi accedere o registrarti per scrivere nel forum
44 risposte