[C] - Stringhe Palindrome Ricorsivo

di il
3 risposte

[C] - Stringhe Palindrome Ricorsivo

Salve, vorrei un parere sul seguente esercizio:

ES: (Palindromi) Un palindromo è una stringa che si legge allo stesso modo da sinistra a destra e da destra a sinistra. Scrivete una funzione ricorsiva trova_palindromo che restituisca 1, qualora la stringa immagazzinata nel vettore sia un palindromo, e O in caso contrario. La funzione dovrà ignorare gli spazi e la punteggiatura eventualmente presenti nella stringa.

io l'ho svolto così:
#include <stdio.h>
#include <string.h>

#define DIM 30

int trova_palindromo(const char string[], int i, int l);

int main()
{
    char stringa[DIM];
    int lunghezza;
    
    printf("\ninerisci una frase o una parola : ");
    scanf("%[^\n]s", stringa);

    lunghezza = strlen(stringa);
    
    printf("\n%d\n\n", trova_palindromo(stringa, 0, lunghezza - 1));
    return 0;
}

int trova_palindromo(const char string[], int i, int l)
{
   if(string[i] != string[l])
     return 0;
   if(i >= l)
     return 1;
   return trova_palindromo(string, i + 1, l - 1);
}  
Il codice trova le stringhe palindrome come singole parole (es: sos), frasi composte con spazi (es: sos radar sos) ma non "ignora" la punteggiatura (es: s.o.s me la da buona visto che è palindroma ma s.o,s no). Sapreste suggerirmi come procedere? Mi spiego, come posso ignorare o scartare la punteggiatura nella stringa prima di passarla alla funzione ricorsiva?

Grazie

3 Risposte

  • Re: [C] - Stringhe Palindrome Ricorsivo

    Nella libreria ctype.h c'è isalpha(), isdigit(), tolower()
    puoi ciclare tutti i caratteri: se isalpha() ti dice che è un carattere alfabetico lo lasci altrimenti lo sostituisci con uno spazio.
    se i palindromi devono funzionare anche con i numeri, nel confronto devi aggiungere anche isdigit()
    devi anche considerare le maiuscole, potresti sostituirle nello stesso ciclo con tolower()

    con questo sistema oltre alla punteggiatura anche i caratteri speciali (tipo: ><+*? ecc) saranno convertiti in spazi.

    un metodo più fine sarebbe quello di definire un vettore di char dove includere tutti i caratteri validi ed usare quello per mascherare i codici indesiderati.
  • Re: [C] - Stringhe Palindrome Ricorsivo

    Rubik ha scritto:


    Nella libreria ctype.h c'è isalpha(), isdigit(), tolower()
    puoi ciclare tutti i caratteri: se isalpha() ti dice che è un carattere alfabetico lo lasci altrimenti lo sostituisci con uno spazio.
    se i palindromi devono funzionare anche con i numeri, nel confronto devi aggiungere anche isdigit()
    devi anche considerare le maiuscole, potresti sostituirle nello stesso ciclo con tolower()

    con questo sistema oltre alla punteggiatura anche i caratteri speciali (tipo: ><+*? ecc) saranno convertiti in spazi.

    un metodo più fine sarebbe quello di definire un vettore di char dove includere tutti i caratteri validi ed usare quello per mascherare i codici indesiderati.
    Provo a scrivere qualcosa sulla base dei tuoi consigli, grazie
  • Re: [C] - Stringhe Palindrome Ricorsivo

    Ti do un aiutino, volutamente non rispettante la traccia.
    il codice è il tuo c'è solo una void in più:
    
    #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
    
    #define DIM 30
    
    int trova_palindromo(const char string[], int i, int l);
    void compatibilizza(char string[], int l);
    
    int main()
    {
        char stringa[DIM]={0};
        char stringa2[DIM]={0};
        int lunghezza=0;
    
        printf("\ninserisci una frase o una parola : ");
        scanf("%[^\n]s", stringa);
    
        lunghezza = strlen(stringa);
    
        // copio in stringa2 perché la modificherò
        // stringa, continuerà a contenere l'input originale
        strncpy(stringa2, stringa, DIM);
    
        compatibilizza(stringa2,lunghezza); // modifica stringa2
    
        printf("%s l=%d",stringa2,lunghezza); // per test
    
        printf("\n%d\n\n", trova_palindromo(stringa2, 0, lunghezza - 1));
        return 0;
    }
    
    int trova_palindromo(const char string[], int i, int l)
    {
       if(string[i] != string[l])
            return 0;
       if(i >= l)
            return 1;
       return trova_palindromo(string, i + 1, l - 1);
    }
    
    void compatibilizza(char string[],int l)
    {
       for (int i=0; i<l; i++)
       {
            if (isalpha(string[i]) || isdigit(string[i]))
                string[i]=tolower(string[i]); // i caratteri alfanumerici tutti minuscoli
            else
                string[i]=' '; // tutti i caratteri non alfanumerici come spazi
       }
    }
    
    Per fare in modo che il programma rispetti la traccia data, dovrai invece di sostituire la punteggiatura con gli spazi, eliminare la punteggiatura e gli spazi, formando una nuova stringa ricompattata, ricorda di aggiungere il terminatore....
    Una volta scritta la routine, potresti pensare di inglobarla direttamente nella funzione ricorsiva trova_palindromo
Devi accedere o registrarti per scrivere nel forum
3 risposte