Dubbio sul testo di un esercizio

di il
11 risposte

Dubbio sul testo di un esercizio

Stavo facendo un esercizio sulle liste in C il cui testo dice:

Scrivere una funzione che, data una lista e il valore di un elemento x, restituisca la posizione occupata da tale elemento. restituisce 0 se l'elemento non compare nella lista e la posizione minima se compare più volte.

Ora, io ho scritto questa funzione
typedef struct EL {
	int info;
	struct EL *next;
}elem_lista;
typedef elem_lista *liste;
liste testa;

int cerca_elemento (liste head, int x);

int main ()
{
	int n, posizione;
	...
	posizione=cerca_elemento (testa, n);
	...
	return 0;
}

int cerca_elemento (liste head, int x)
{
	elem_lista *ptr, *punt;
	int cont;
	ptr=head;
	cont=0;
	while (ptr)
	{
		 ptr=ptr->next;
		 if (ptr->info == x)
		 	{
			 	for (punt=head; punt!=ptr; punt=punt->next)
			 		cont++;
			 	return cont;
			 }
		 	
		else
			return 0;
	}
Il mio dubbio è: la funzione, per come l'ho scritta io, dovrebbe restituire SOLO la prima posizione in cui si incontra l'elemento cercato, se non sbaglio, e sinceramente non capisco perchè il testo mi abbia specificato il caso in cui l'elemento compaia più volte. Secondo voi, la mia è una soluzione accettabile (tralasciando eventuali errori nel codice che mi possono essere sfuggiti)?

11 Risposte

  • Re: Dubbio sul testo di un esercizio

    Non si dà ad una struttura un nome plurale.

    Il testo deve specificare tale caso perché non è chiaro come tu possa ricercare un elemento in una struttura dati. Potresti iniziare sia dalla testa che dalla coda, dividere in più segmenti, andare dal centro ecc…

    Attualmente il codice è sbagliato. Salti il controllo sulla testa e esci immediatamente se l’elemento non è in prima posizione
  • Re: Dubbio sul testo di un esercizio

    idiotafsandwich ha scritto:


    Il mio dubbio è: la funzione, per come l'ho scritta io, dovrebbe restituire SOLO la prima posizione in cui si incontra l'elemento cercato, se non sbaglio...
    Come si fa a non sapere cosa fa il codice che si è scritto?!
    Avrei alcune considerazioni da fare sulla funzione, ma prima voglio farti una domanda: l'hai testato quel codice?
  • Re: Dubbio sul testo di un esercizio

    Nippolo ha scritto:


    idiotafsandwich ha scritto:


    Il mio dubbio è: la funzione, per come l'ho scritta io, dovrebbe restituire SOLO la prima posizione in cui si incontra l'elemento cercato, se non sbaglio...
    Come si fa a non sapere cosa fa il codice che si è scritto?!
    Avrei alcune considerazioni da fare sulla funzione, ma prima voglio farti una domanda: l'hai testato quel codice?
    no, quando vi ho scritto non lo avevo ancora provato perchè l'avevo scritto di fretta in stazione e non avevo avuto tempo, adesso è corretto, ma comunque non era quello il mio problema, volevo solo sapere se "l'idea" era accettabile come soluzione e perchè il testo specificasse quel caso particolare
  • Re: Dubbio sul testo di un esercizio

    _Achille ha scritto:


    Non si dà ad una struttura un nome plurale.

    Il testo deve specificare tale caso perché non è chiaro come tu possa ricercare un elemento in una struttura dati. Potresti iniziare sia dalla testa che dalla coda, dividere in più segmenti, andare dal centro ecc…

    Attualmente il codice è sbagliato. Salti il controllo sulla testa e esci immediatamente se l’elemento non è in prima posizione
    Okay, grazie mille per il chiarimento ^-^
  • Re: Dubbio sul testo di un esercizio

    idiotafsandwich ha scritto:


    no, quando vi ho scritto non lo avevo ancora provato perchè l'avevo scritto di fretta in stazione e non avevo avuto tempo, adesso è corretto...
    Scusa ma io non lo vedo il codice aggiornato.
  • Re: Dubbio sul testo di un esercizio

    Nippolo ha scritto:


    idiotafsandwich ha scritto:


    no, quando vi ho scritto non lo avevo ancora provato perchè l'avevo scritto di fretta in stazione e non avevo avuto tempo, adesso è corretto...
    Scusa ma io non lo vedo il codice aggiornato.
    Se vuoi te lo mando, non pensavo vi interessasse, era solo un esercizio XD
  • Re: Dubbio sul testo di un esercizio

    idiotafsandwich ha scritto:


    Nippolo ha scritto:


    idiotafsandwich ha scritto:


    no, quando vi ho scritto non lo avevo ancora provato perchè l'avevo scritto di fretta in stazione e non avevo avuto tempo, adesso è corretto...
    Scusa ma io non lo vedo il codice aggiornato.
    Se vuoi te lo mando, non pensavo vi interessasse, era solo un esercizio XD
    #include <stdio.h>
    #include <stdlib.h>
    typedef struct EL {
    	int info;
    	struct EL *next;
    } elem_lista;
    typedef elem_lista *lista;
    
    lista testa;
    
    int chiedi_valore ();
    lista crea_lista ();
    void stampa_lista (elem_lista *head);
    int cerca_elemento (lista head, int x);
    
    int main ()
    {
    	int v, posizione;
    	testa = crea_lista ();
    	stampa_lista (testa);
    	printf ("\nIMMETTERE VALORE DA CERCARE\n");
    	scanf ("%d", &v);
    	posizione=cerca_elemento (testa, v);
    	printf ("\nIL VALORE CERCATO SI TROVA IN POSIZIONE %d", posizione);
    	return 0;
    }
    
    
    int chiedi_valore ()
    {
    	int n;
    	printf ("INSERIRE NUMERO INTERO E PREMERE INVIO. TERMINARE LA LISTA CON 0 E INVIO.\n");
    	scanf ("%d", &n);
    	return n;
    }
    lista crea_lista ()
    {
    	elem_lista *p, *head;
    	int v;
    	
    	v= chiedi_valore ();
    	if (v==0)
    		head=NULL;
    	else	
    	{
    		p=malloc (sizeof(elem_lista));
    		p->info=v;
    		p->next=NULL;	
    		head = p;
    	}
    	while (v!=0)
    	{
    		v= chiedi_valore ();
    		p->next=malloc (sizeof(elem_lista));
    		p=p->next;
    		p->info=v;
    		p->next=NULL;
    	}
    
    	return head;
    }
    void stampa_lista (lista head)
    {
    	lista p;
    	if (head==NULL)
    	printf ("LISTA VUOTA\n");
    	for (p=head; p; p=p->next)
    		printf ("%d ", p->info);
    }
    
    int cerca_elemento (lista head, int x)
    {
    	elem_lista *ptr, *punt;
    	int cont;
    	ptr=head;
    	cont=1;
    	if (head)
    	{
    		while (ptr)
    		{
    		 	if (ptr->info == x)
    		 		{
    			 		for (punt=head; punt!=ptr; punt=punt->next)
    			 			cont++;
    			 		return cont;	
    				}
    			ptr=ptr->next;
    		}
    	}
    	else
    		return 0;
    }
    Eccolo qua, chiedo venia per il ritardo ma ero fuori casa ^-^
  • Re: Dubbio sul testo di un esercizio

    idiotafsandwich ha scritto:


    Eccolo qua, chiedo venia per il ritardo ma ero fuori casa ^-^
    Figurati, cmq gli ho dato un'occhiata:
    - innanzitutto io eviterei il secondo typedef, secondo me non porta alcuna semplificazione, anzi...
    - evita di usare variabili globali;
    - nella creazione della lista lo 0 deve far parte della lista o no? Chiedo perchè nella funzione crea_lista() se si inserisce 0 come primo valore esso non andrà a far parte della lista, mentre se si inserisce 0 successivamente invece sì;
    - a mio parere in un esercizio sulle liste non possono mancare delle funzioni che aggiungono un elemento in testa o in coda alla lista. Ti suggerisco quindi di implementare queste due funzioni e sostituire crea_lista() (che peraltro presenta del codice abbastanza ridondante) con qualcosa del genere:
    int main()
    {
        int n;
        elem_lista *testa = NULL;
        while(n = chiedi_valore())
        {
            testa = aggiungi_in_coda(testa, n);
            //o ancora meglio:
            //aggiungi_in_coda(&testa, n);
        }
        ...
    
    - se rifletti sul passaggio di argomenti ad una funzione, ti renderai conto che la variabile p nella funzione stampa_lista() è superflua;
    - infine la funzione cerca_elemento() può essere semplificata notevolmente. Per esempio io farei qualcosa del genere:
    int cerca_elemento(nodo *head, int x)
    {
        int i = 1;
        while(head && head->info != x)
        {
            head = head->next;
            ++i;
        }
        return i * (head != NULL);
    }
  • Re: Dubbio sul testo di un esercizio

    Nippolo ha scritto:


    idiotafsandwich ha scritto:


    Eccolo qua, chiedo venia per il ritardo ma ero fuori casa ^-^
    Figurati, cmq gli ho dato un'occhiata:
    - innanzitutto io eviterei il secondo typedef, secondo me non porta alcuna semplificazione, anzi...
    - evita di usare variabili globali;
    - nella creazione della lista lo 0 deve far parte della lista o no? Chiedo perchè nella funzione crea_lista() se si inserisce 0 come primo valore esso non andrà a far parte della lista, mentre se si inserisce 0 successivamente invece sì;
    - a mio parere in un esercizio sulle liste non possono mancare delle funzioni che aggiungono un elemento in testa o in coda alla lista. Ti suggerisco quindi di implementare queste due funzioni e sostituire crea_lista() (che peraltro presenta del codice abbastanza ridondante) con qualcosa del genere:
    int main()
    {
        int n;
        elem_lista *testa = NULL;
        while(n = chiedi_valore())
        {
            testa = aggiungi_in_coda(testa, n);
            //o ancora meglio:
            //aggiungi_in_coda(&testa, n);
        }
        ...
    
    - se rifletti sul passaggio di argomenti ad una funzione, ti renderai conto che la variabile p nella funzione stampa_lista() è superflua;
    - infine la funzione cerca_elemento() può essere semplificata notevolmente. Per esempio io farei qualcosa del genere:
    int cerca_elemento(nodo *head, int x)
    {
        int i = 1;
        while(head && head->info != x)
        {
            head = head->next;
            ++i;
        }
        return i * (head != NULL);
    }
    uh, dunque, in ordine:
    - mi sono resa conto anche io che il secondo typedef non mi cambia la vita, continuo a usarlo solo per seguire quello che ci ha detto il professore

    - riguardo la testa come variabile globale, ultimamente la sto dichiarando come tale solo per abituarmi a questa situazione, che è quella che capita più di frequente nei temi d'esame del mio prof, so che non cambia molto, ma mi abituo a vederla scritta così XD

    - se lo 0 dovesse fare parte o meno della lista non lo avevo considerato sinceramente, grazie per avermelo fatto notare! Credo di volerlo escludere, il testo non lo specificava, dovrò pensare a come modificare quella parte

    - le funzioni AggiungiInCoda e AggiungiInTesta le conosco, le posso inserire facilmente, questo programma l'ho scritto semplicemente per provare quella specifica funzione

    - grazie per il suggerimento su come sostituire Crea_lista, in effetti è molto più snello così! Vorrei chiederti però perchè dici che sarebbe meglio passare la testa per indirizzo. Sono ancora alle prime armi con la programmazione e a volte mi impiccio non poco con queste cose -.-

    -anche questa volta, riguardo la variabile p in stampa_lista, sto seguendo le indicazioni del professore, ma sinceramente non saprei come dovrei fare se volessi eliminarla

    Grazie per le dritte in generale, mi è di grande aiuto parlarne con chi ne capisce più di me ^-^
  • Re: Dubbio sul testo di un esercizio

    idiotafsandwich ha scritto:


    Vorrei chiederti però perchè dici che sarebbe meglio passare la testa per indirizzo.
    Perchè in questo modo puoi scrivere del codice più conciso, anche se inizialmente potrà sembrarti meno semplice. Inoltre utilizzare una funzione di tipo void è molto più comodo.

    idiotafsandwich ha scritto:


    -anche questa volta, riguardo la variabile p in stampa_lista, sto seguendo le indicazioni del professore, ma sinceramente non saprei come dovrei fare se volessi eliminarla
    Basterebbe utilizzare direttamente l'argomento head passato alla funzione. Per quale motivo ritieni necessario ricorrere ad una seconda variabile p?
  • Re: Dubbio sul testo di un esercizio

    Nippolo ha scritto:


    idiotafsandwich ha scritto:


    Vorrei chiederti però perchè dici che sarebbe meglio passare la testa per indirizzo.
    Perchè in questo modo puoi scrivere del codice più conciso, anche se inizialmente potrà sembrarti meno semplice. Inoltre utilizzare una funzione di tipo void è molto più comodo.

    idiotafsandwich ha scritto:


    -anche questa volta, riguardo la variabile p in stampa_lista, sto seguendo le indicazioni del professore, ma sinceramente non saprei come dovrei fare se volessi eliminarla
    Basterebbe utilizzare direttamente l'argomento head passato alla funzione. Per quale motivo ritieni necessario ricorrere ad una seconda variabile p?
    Uhm non lo so, probabilmente pensavo che la variabile che mi indicava la testa dovesse restare lì e basta, tipo che non dovessi proprio toccarla XD
    ma adesso che ci penso hai ragione, potrei usare direttamente quella, grazie mille, questo consiglio mi sarà utile in un sacco di altre funzioni in cui uso variabili di troppo ^-^

    Ps. Scusa se rispondo solo ora ma sono stata parecchio impegnata in questi giorni "-.-
Devi accedere o registrarti per scrivere nel forum
11 risposte