Verifica parole palindrome

di thomas99 il
8 risposte
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

  • Cosi come l'haibusata deve essere una costante. Usa un #define
  • 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?
  • 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
  • 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?
  • Hai studiato l'allocazione dinamica e la malloc o no?
  • Si, ma infatti l'unico dubbio é se posso fare una cosa del genere : stringa2=(char*)malloc(lunghezzastringa1*sizeof(char))
  • 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
  • È 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