[C] Frasi palindrome con funzioni ricorsive

di il
11 risposte

[C] Frasi palindrome con funzioni ricorsive

Salve ho creato un programma il quale controlla che una frase (come "itopinonavevanonipoti", "amoroma" etc) sia palindroma o meno. Il tutto va fatto con una funzione ricorsiva.

Non capisco come mai non funzioni! Ho provato a debuggarlo a mano ma non ne vengo a capo! Ecco il codice:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int check(char parola[], int i, int j);

main()
{
    char parola[100]={0};
    int dimensione=0;
    int x;
    int i=0;
    
    printf("Digita una parola da controllare:\n");
    scanf("%s", &parola);
    
    dimensione=strlen(parola);
    
    x=check(parola,i,dimensione);
	
    if(x==1)
    printf("\n\nLa stringa e' un palindromo");
    else
    printf("\n\nLa stringa non e' un palindromo");  
}


int check(char parola[], int i, int j)
{
    int x;
	
    if(i<j)
    {
		parola[i]==parola[j];
		x=check(parola,i+1,j-1);
    }
    
    return parola[i] && x;
}

11 Risposte

  • Re: [C] Frasi palindrome con funzioni ricorsive

    parola[i]==parola[j];
    non ha significato
  • Re: [C] Frasi palindrome con funzioni ricorsive

    ale99 ha scritto:


    parola[i]==parola[j];
    non ha significato
    Si avevo dimenticato di toglierlo, era la condizione di un IF che ho cancellato....
    Più che altro forse dovrei anche ritornare solo "x", ma non va neanche così.

    EDIT:
    ho aggiornato il codice e mi sembra di averlo migliorato, ma non va ancora!!
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int check(char str[], int i, int j);
    
    main()
    {
        char parola[100]={0};
        int dimensione;
        int i=0;
        int x;
       
        printf("Digita una frase da controllare (usa uno '_' per separare le parole):\n\n");
        scanf("%s", &parola);
       
        dimensione=strlen(parola);
    
    	x=check(parola,i,dimensione-1); // dimensione-1 poiché nel vettore i numero vanno da 0 a n-1
    	
        if(x==1)
            printf("\n\nLa frase e' palindroma\n");
        else
            printf("\n\nLa frase non e' palindroma\n");
    }
     
     
    int check(char parola[], int i, int j)
    {
    	int x;
    	
    	if(i<j)
    	{
        	if(parola[i]==parola[j])
        		return 1;
        }
        
        else 
    	{
        	x=check(parola,i+1,j-1);
        	return x;
        }
    }
  • Re: [C] Frasi palindrome con funzioni ricorsive

    Io ho provato così e va
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    
    int check(char parola[], int i, int j);
    
    main()
    {
        char parola[100]= {0};
        int dimensione=0;
        int x;
        int i=0;
    
        printf("Digita una parola da controllare:\n");
        scanf("%s", &parola);
    
        dimensione=strlen(parola);
    
        printf("\n#");
        for(i=0;i<dimensione;i++)
            printf("%c", parola[i]);
        printf("#\n");
    
        x=check(parola,0,dimensione-1);
    
        if(x==1)
            printf("\n\nLa stringa e' un palindromo");
        else
            printf("\n\nLa stringa non e' un palindromo");
    }
    
    
    int check(char parola[], int i, int j)
    {
        int x;
    
        if(i<j)
        {
            printf("\n controllo %c - %c", parola[i],parola[j]);
            if(parola[i]!=parola[j])
                return 0;
    
            return check(parola,i+1,j-1);
        }
    
        return 1;
    }
    prima senza if() ritornava sempre vero...

    adesso provo a controllare il nuovo codice. 5 min
  • Re: [C] Frasi palindrome con funzioni ricorsive

    Se proprio vuoi usare x, devi settarlo a 0 se le lettere non coincidono.
    controlli se sono uguali con l'if() che credo tu abbia cancellato prima.

    e non capisco perchè return parola && x;
    parola contiene il valore ASCII di quella lettera, quindi sarà sempre !=0
  • Re: [C] Frasi palindrome con funzioni ricorsive

    ale99 ha scritto:


    io ho provato così e va
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    
    int check(char parola[], int i, int j);
    
    main()
    {
        char parola[100]= {0};
        int dimensione=0;
        int x;
        int i=0;
    
        printf("Digita una parola da controllare:\n");
        scanf("%s", &parola);
    
        dimensione=strlen(parola);
    
        printf("\n#");
        for(i=0;i<dimensione;i++)
            printf("%c", parola[i]);
        printf("#\n");
    
        x=check(parola,0,dimensione-1);
    
        if(x==1)
            printf("\n\nLa stringa e' un palindromo");
        else
            printf("\n\nLa stringa non e' un palindromo");
    }
    
    
    int check(char parola[], int i, int j)
    {
        int x;
    
        if(i<j)
        {
            printf("\n controllo %c - %c", parola[i],parola[j]);
            if(parola[i]!=parola[j])
                return 0;
    
            return check(parola,i+1,j-1);
        }
    
        return 1;
    }
    prima senza if() ritornava sempre vero...

    adesso provo a controllare il nuovo codice. 5 min
    Grazie per il lavoro, comunque penso di avere trovato l'errore!
    In pratica io avevo letto con uno stringcmp la lunghezza della parola, ma quando andavo a lavorare sulla stringa come vettore non facevo dimensione-1! Dato che i vettori partono da 0 e arrivano a N-1 non funzionava!

    Ditemi se è questo il vero motivo altrimenti non so più che fare xD
  • Re: [C] Frasi palindrome con funzioni ricorsive

    1- "parola" e' il valore(nel codice ASCII) corrispondente alla i-esima lettera della frase, e quindi sarà sempre !=0.
    quindi non ha alcun senso inserirla nel "return"

    2- se non controlli il l'uguaglianza della i-esima e della j-esima lettera, come fai a dire se sono uguali?

    3- 'x' avrà sempre un valore random, quindi se non la setti non ha senso utilizzarla
  • Re: [C] Frasi palindrome con funzioni ricorsive

    ale99 ha scritto:


    1- "parola" e' il numero corrispondente alla i-esima lettera della frase, e quindi sarà sempre !=0.
    quindi non ha alcun senso inserirla nel "return"

    2- se non controlli il l'uguaglianza della i-esima e della j-esima lettera, come fai a dire se sono uguali?

    3- 'x' avrà sempre un valore random, quindi se non la setti non ha senso utilizzarla


    Si, se guardi il programma che ho messo poco fa dovrebbe aver corretto quasi tutto, devo solo mettere x=0... Fammi sapere comunque :p
  • Re: [C] Frasi palindrome con funzioni ricorsive

    if(i<j)
       {
           if(parola[i]==parola[j])
              return 1;
        }
    ritornerà sempre 1 se la prima e l'ultima lettera sono uguali


    
           x=check(parola,i+1,j-1);
    
    verrà eseguito solo se la parola ha 0 lettere



    2 piccole modifiche e funziona perfettamente.
    ps: senza usare x, puoi direttamente usare "return check(...)" modificando in modo opportuno il codice
  • Re: [C] Frasi palindrome con funzioni ricorsive

    ale99 ha scritto:


    if(i<j)
       {
           if(parola[i]==parola[j])
              return 1;
        }
    ritornerà sempre 1 se la prima e l'ultima lettera sono uguali


    
           x=check(parola,i+1,j-1);
    
    verrà eseguito solo se la parola ha 0 lettere



    2 piccole modifiche e funziona perfettamente.
    ps: senza usare x, puoi direttamente usare "return check(...)" modificando in modo opportuno il codice
    Grazie, ora è perfetto!!
  • Re: [C] Frasi palindrome con funzioni ricorsive

    L'importante: Hai capito dove avevi sbagliato? Ti e' + chiaro adesso?
  • Re: [C] Frasi palindrome con funzioni ricorsive

    ale99 ha scritto:


    l'importante: Hai capito dove avevi sbagliato? Ti e' + chiaro adesso?
    Si grazie mille! Non avevo comunque notato che mettendo le due lettere finali uguali diceva che fosse palindroma.
Devi accedere o registrarti per scrivere nel forum
11 risposte