Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    21

    [C] Esercizio comprensione codice

    Un saluto a tutti.
    Ho bisogno di una mano riguardo ad un esercizio di comprensione del codice. Se qualcuno mi dà una mano gliene sarei grato.
    Ecco il codice:

    codice:
    struct Cella{
    int valore;
    struct Cella *next;
    };
    
    struct Coda{
    struct Cella *primo;
    struct Cella *ultimo;
    };
    
    int main()
    {
    struct Coda C;
    struct Cella *L = NULL;
    ...
    ...
    L = elabora(&C,C.ultimo);
    ...
    ...
    return 0;
    }
    struct Cella *elabora(struct Coda *C, struct Cella *aux)
    {
    struct Cella *temp;
    if (C->primo == aux)
    return NULL;
    temp = C->primo;
    C->primo = C->primo->next;
    if (temp->valore % 2 == 1)
    {
    temp->next = elabora(C,aux);
    return temp;
    }
    temp->next = C->ultimo;
    C->ultimo = temp;
    return elabora(C,aux);
    }
    Ed ecco la situazione iniziale:





  2. #2
    Cosa non comprendi? Il codice che hai postato non è in ogni modo compilabile, quindi per definizione è incomprensibile ;-)

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    21
    Originariamente inviato da MacApp
    Cosa non comprendi? Il codice che hai postato non è in ogni modo compilabile, quindi per definizione è incomprensibile ;-)
    No ma è un esercizio da svolgere su carta dell'esame di programmazione.
    Bisogna scrivere come sarà la lista una volta eseguita la funzione elabora.
    Io mi sono messo a provare ma la soluzione è diversa rispetto a come dovrebbe essere.
    Credo di sbagliare quando c'è la chiamata ricorsiva nell'if, non capisco cosa voglia dire che temp->next = elabora(C,aux);


    Inoltre non mi è ben chiaro l'ultimo return (return elabora(C,aux).
    Questo return va ad iniziare una nuova istanza della funzione elabora oppure ritorna al main?

    Vi prego aiutatemi che son disperato

  4. #4
    Anche ipotizzando che il codice che hai postato sia compilabile, il suo comportamento e' indefinito:

    codice:
    int main()
    {
    struct Coda C;
    struct Cella *L = NULL;
    ...
    ...
    L = elabora(&C,C.ultimo);
    infatti la funzione "elabora" viene chiamata con "C.ultimo" che non è stato inizializzato = comportamento indefinito.

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    21
    Originariamente inviato da MacApp
    Anche ipotizzando che il codice che hai postato sia compilabile, il suo comportamento e' indefinito:

    codice:
    int main()
    {
    struct Coda C;
    struct Cella *L = NULL;
    ...
    ...
    L = elabora(&C,C.ultimo);
    infatti la funzione "elabora" viene chiamata con "C.ultimo" che non è stato inizializzato = comportamento indefinito.
    Ma credo che il codice del main sia solo una traccia. Bisogna comprendere cosa succede alla lista (che ho postato nell'immagine) dopo aver svolto la funzione elabora.
    Questo è uno dei compiti d'esame vecchi. Non credo il prof abbia dato un esercizio sbagliato. Le inizializzazioni saranno dove lui ha messo i puntini supponto

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    21
    Niente è un pomeriggio che ci ragiono su ma non ne vengo a capo

  7. #7

  8. #8
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    21
    Originariamente inviato da MacApp
    Non ti converrebbe fornire la traccia esatta del tema d'esame?
    ;-)
    Purtroppo aggiunge poco più di quello che non ho già scritto sopra.
    Comunque eccola:

    Esercizio 2.


    Considerando il frammento di codice riportato sotto e le strutture dati nella figura sopra riportata, indicare come vengono modificate le strutture dati dopo la chiamata alla funzione elabora()



    
    
    codice:
    struct Cella{
    int valore;
    struct Cella *next;
    };
    
    struct Coda{
    struct Cella *primo;
    struct Cella *ultimo;
    };
    
    int main()
    {
    struct Coda C;
    struct Cella *L = NULL;
    ...
    ...
    L = elabora(&C,C.ultimo);
    ...
    ...
    return 0;
    }
    
    
    struct Cella *elabora(struct Coda *C, struct Cella *aux)
    {
    
    struct Cella *temp;
    
    if (C->primo == aux)
    return NULL;
    
    temp = C->primo;
    C->primo = C->primo->next;
    
    if (temp->valore % 2 == 1)
    {
    temp->next = elabora(C,aux);
    return temp;
    }
    
    temp->next = C->ultimo;
    C->ultimo = temp;
    return elabora(C,aux);
    }

  9. #9
    Ma il tuo prof si diverte con i puntatori ehh??

    Comunque ho scritto il resto del programma che crea la lista ( scusate se la funzione riempi fa un po pena ma sono un po arrugginito con il c), comunque il risultato di tutto è la lista dei numeri DISPARI...

    codice:
    #include <stdlib.h>
    #include <stdio.h>
    
    
    struct Cella{
    int valore;
    struct Cella *next;
    };
    
    struct Coda{
    struct Cella *primo;
    struct Cella *ultimo;
    };
    
    
    
    void riempi(struct Coda * p) {
    	int i;
    	int vet[] = { 7,4,8,1,2};
    
    	struct Cella * temp = NULL, *prec_temp = NULL, *primo = NULL;
    
    	primo= malloc (sizeof(struct Cella)); 
    	primo->next = temp;
    	primo->valore = vet[0]; 
    	temp = primo; 
    
    	for (i = 1; i <= 4; i ++) {
    		temp->next = malloc (sizeof(struct Cella));
    		prec_temp = temp; 
    		temp = temp->next; 
    		temp->valore = vet[i];
    		
    	}
    
    	temp->next  = NULL; 
    	p->primo = primo; 
    	p->ultimo = prec_temp->next; 
    }; 
    
    
    void stampa( const struct Coda * const p) {
    
    	struct Cella * temp = p->primo; 
    	// manca il controllo sull'sistenza dei puntatori
    	printf ("Primo punta a : %d\n", p->primo->valore); 
    	printf ("Ultimo punta a : %d\n", p->ultimo->valore); 
    
    
    	while ( temp != NULL) { 
    		
    		printf("%d ---> ",temp-> valore); 
    		temp = temp->next;
    	}
    	printf("NULL\n"); 
    
    }
    
    
    
    struct Cella *elabora(struct Coda *C, struct Cella *aux)
    {
    
    struct Cella *temp;
    
    if (C->primo == aux)		     //Se puntano allo stesso elemento ritorna NULL, condizione di uscita
    return NULL;			
    			
    temp = C->primo;		        // temp si salva il contenuto di primo
    C->primo = C->primo->next;	// alla lista primo, si toglie il primo elemento 
    
    if (temp->valore % 2 == 1)	    // Se l'elemento salvato in temp è dispari si chiama la funzione elabora per trovare il   
    {				// prossimo elemento da attaccare, si inizia a creare la lista dei numeri dispari 
    temp->next = elabora(C,aux);	
    return temp;
    }
    
    temp->next = C->ultimo;		// a temp accodo l'ultimo elemento 
    C->ultimo = temp;		// aggiorno ultimo con l'elemento contenuto in temp 
    return elabora(C,aux);		// esclude i termini pari, accodandoli all'ultimi posti finchè il primo
    				// puntare non coincide con aux
    }
    
    
    
    int main () {
    
    	struct Coda C;
    	struct Cella *L = NULL;
    
    	riempi(&C); 
    
     	stampa(&C); 
    
    
    	L = elabora(&C,C.ultimo);
    	
    
    	printf("Il risultato della funzione elabora è :\n"); 	
    
    	while ( L != NULL) { 
    		
    		printf("%d ---> ",L-> valore); 
    		L = L->next;
    	}
    	printf("NULL\n");
    
    
    	return 0; 
    
    }

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2008
    Messaggi
    21
    Nono a me interessava soltanto il risultato, non completare il codice.

    Comunque la soluzione è questa:



    Tuttavia, nonostante abbia la soluzione, se mi metto con foglio e penna non riesco ad evidenziare i vari passaggi e le varie istanze che modificano le liste.
    Il mio obiettivo è di dimostrare tramite disegni che si arriva a questa soluzione, e francamente dopo un paio di passaggi e chiamate ricorsive mi perdo :berto:

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