Verifica parole palindrome

di il
8 risposte

Verifica parole palindrome

Salve, ho realizzato questo programma che verifica se una parola è palindroma (esse,ada,effe,elle ecc.), però quando faccio il debug mi dice che la variabile dim non è dichiarata, come posso risolvere? grazie.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void CopiaStringa1InStringa2(char Stringa1[],char Stringa2[dim]);
void InvertiStringa2(char Stringa2[dim]);
void StampaEsito(char Stringa1[],char Stringa2[dim]);

int main()
{
    char Stringa1[] = "kayak";
    
    int dim;
    int numC;
    numC = strlen(Stringa1);
    dim = numC + 1; //numC + \0
   // printf("dim: %d\n",dim);
    char Stringa2[dim];
    
    CopiaStringa1InStringa2(Stringa1,Stringa2);
    InvertiStringa2(Stringa2);
    StampaEsito(Stringa1,Stringa2);
    return 0;
}
void CopiaStringa1InStringa2(char Stringa1[],char Stringa2[dim]){
    strcpy(Stringa2, Stringa1);
}
void InvertiStringa2(char Stringa2[dim]){
    char app;
    int i;
    int j = (dim-1)-1;  

    for (i=0;i<dim/2;i++)
    {
        app = *(Stringa2+i);
        *(Stringa2+i) = *(Stringa2+j);
        *(Stringa2+j) = app;
        j--;
    }
}

void StampaEsito(char Stringa1[],char Stringa2[dim]){
    if (strcmp(Stringa1,Stringa2)==0)
        printf("La stringa e' palindroma");
    else printf("La stringa non e' palindroma");
}

8 Risposte

  • Re: Verifica parole palindrome

    Cosi come l'haibusata deve essere una costante. Usa un #define
  • Re: Verifica parole palindrome

    Se uso la define, e definisco la variabile dim uguale a 50 , se la stringa "esse" é palindroma, il programma conterrebbe le caselle vuote del vettore di caratteri come caratteri.
    Potrei adeguare l'algoritmo dell inversione in modo tale da non contare le caselle vuote del vettore, ma non c'é un modo per definire la dimensione della stringa2 uguale a quella della stringa1 considerando che la dimensione della stringa1 può cambiare in base alla parola inserita?
  • Re: Verifica parole palindrome

    Le due stringhe possono essere ambedue di max 50 caratteri. Il tu programma dovrà utilizzare solo quelli necessari.

    Sw vuoi usare l'allocazione dinamica c'è la funzione malloc e i puntatori.

    Se usi c++ ci sono le string
  • Re: Verifica parole palindrome

    Ma con la funzione Malloc sono costretto a leggere la dimensione del vettore da tastiera in modo tale da allocare uno spazio in memoria dim*sizeof(char).
    Oppure posso allocare attraverso la Malloc un numero di byte uguale a lunghezzastringa1*sizeof(char) , giusto?
  • Re: Verifica parole palindrome

    Hai studiato l'allocazione dinamica e la malloc o no?
  • Re: Verifica parole palindrome

    Si, ma infatti l'unico dubbio é se posso fare una cosa del genere : stringa2=(char*)malloc(lunghezzastringa1*sizeof(char))
  • Re: Verifica parole palindrome

    Perché passi per usare una stringa copia speculare della prima?
    Non serve e genera confusione, oltre che consumare inutilmente memoria
    Testa direttamente i primi caratteri con gliultimi
  • Re: Verifica parole palindrome

    È vero, vedo di cambiare il codice in modo da ridurne la complessita.
    Mentre per il codice realizzato in precedenza ,che comunque dovrebbe portare ugualmente alla soluzione, ho modificato il codice in modo tale che il vettore Stringa2 possa avere una dimensione variabile attraverso la funzione malloc.
    Il programma funziona però ho questi warning che non riesco a risolvere.
    
    \esercitazione 4 marzo\main.c||In function 'main':|
    \esercitazione 4 marzo\main.c|19|warning: passing argument 1 of 'AllocazioneDinamicaStringa2' from incompatible pointer type [-Wincompatible-pointer-types]|
    \esercitazione 4 marzo\main.c|6|note: expected 'char *' but argument is of type 'char **'|
    \esercitazione 4 marzo\main.c|21|warning: passing argument 2 of 'CopiaStringa1InStringa2' from incompatible pointer type [-Wincompatible-pointer-types]|
    \esercitazione 4 marzo\main.c|7|note: expected 'char *' but argument is of type 'char **'|
    \esercitazione 4 marzo\main.c|22|warning: passing argument 1 of 'InvertiStringa2' from incompatible pointer type [-Wincompatible-pointer-types]|
    \esercitazione 4 marzo\main.c|8|note: expected 'char *' but argument is of type 'char **'|
    \esercitazione 4 marzo\main.c|23|warning: passing argument 2 of 'StampaEsito' from incompatible pointer type [-Wincompatible-pointer-types]|
    \esercitazione 4 marzo\main.c|9|note: expected 'char *' but argument is of type 'char **'|
    
    
    questo è il codice del programma:
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int CalcolaDimensioneStringa1(char Stringa1[]);
    void AllocazioneDinamicaStringa2(char *Stringa2,int dim);
    void CopiaStringa1InStringa2(char Stringa1[],char *Stringa2);
    void InvertiStringa2(char *Stringa2,int dim);
    void StampaEsito(char Stringa1[],char *Stringa2);
    
    int main()
    {
        char Stringa1[] = "kayak";
    
        int dim;
        dim = CalcolaDimensioneStringa1(Stringa1);
    
        char *Stringa2;
        AllocazioneDinamicaStringa2(&Stringa2,dim);
    
        CopiaStringa1InStringa2(Stringa1,&Stringa2);
        InvertiStringa2(&Stringa2,dim);
        StampaEsito(Stringa1,&Stringa2);
        return 0;
    }
    int CalcolaDimensioneStringa1(char Stringa1[]){
        int numC;
        numC = strlen(Stringa1); //la dimensione non tiene conto del carattere di fine stringa
        return numC;
    }
    
    void AllocazioneDinamicaStringa2(char *Stringa2,int dim){
        Stringa2 = (char*)malloc(dim*sizeof(char)); //la Stringa2 non ha bisogno di un carattere di fine stringa
    }
    
    void CopiaStringa1InStringa2(char Stringa1[],char *Stringa2){
        strcpy(Stringa2, Stringa1);
    }
    
    void InvertiStringa2(char *Stringa2,int dim){
        char app;
        int i = 0;
        int j = dim-1;
    
        while (i<dim/2)
        {
            app = *(Stringa2+i);
            *(Stringa2+i) = *(Stringa2+j);
            *(Stringa2+j) = app;
            j = j - 1;
            i = i + 1;
        }
    }
    
    void StampaEsito(char Stringa1[],char *Stringa2){
        if (strcmp(Stringa1,Stringa2)==0)
            printf("La stringa e' palindroma");
        else printf("La stringa non e' palindroma");
    }
Devi accedere o registrarti per scrivere nel forum
8 risposte