Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 24
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    168

    [C] Palindromo

    salve ho questo programma....

    voglio precisare per chi non lo sapesse che palindromo vuol dire una parola che si legge sia in un verso che nell'altro...(esempio. anna, madam, anilina... )
    ho trovato un bug... se inserisco una parola che inizia e finisce con la stessa lettera, mi dice che è un palindromo....
    se qualcuno mi potesse aiutare a trovare l'errore gliene sarei grato...


    codice:
    #include <stdlib.h>   /* librerie standard */
    #include <stdio.h>    /* funzioni printf, scanf */
    #include <string.h>   /* librerie delle string */
    
    #define lunghezza 20  /* lunghezza massima vettore */ 
    
    /* Dichiarazioni Funzioni */
    void inseriscistringa(int i, int n, char *vettore);            /*legge in input una stringa*/ 
    void toglispazi(int i, int n, char *nuovo, char vecchio[]);    /*toglie spazi in una stringa*/ 
    int palindromapari(int i, int n, char parola[]);               /*verifica se la stringa è palindroma se la lunghezza della stringa è pari*/ 
    int palindromadispari(int i, int n, char parola[]);            /*verifica se la stringa è palindroma se la lunghezza della stringa è dispari*/ 
    void mostrainformazioni( int dimensione, char vettore[]);      /*stampa a video i risultati*/ 
    
    /* Inizio del Main */
    int 
    main (void) 
    { 
    char vettore_input[lunghezza];/*input, vettore inserito dall utente che può comprendere spazi*/ 
    char parola[lunghezza];       /*variabile di programma, il contenuto è copiato da vettore_input senza gli spazi*/ 
    int i=0;                      /*programma, indice della posizione del vettore*/ 
    int dim;                      /*programma, dimensione effettiva del vettore*/ 
    char k;                       /*programma, viene usato in vari modi, per leggere un carattere alla volta*/ 
    int soluzione;                /*se vera la parola o frase è palindroma, altrimenti non lo è*/ 
    char risposta; 
    
    printf("<***********************************************>\n");
    printf("<*                                             *>\n");
    printf("<*----------------  PALINDROMO  ---------------*>\n");
    printf("<*                                             *>\n");
    printf("<***********************************************>\n\n");
    
    inseriscistringa(i=0, lunghezza, vettore_input); /*chiamata funzione - inserisci una frase o parola nel vettore*/ 
    i=0;                                             /*azzera contatore*/ 
    dim= strlen(vettore_input); 
    printf("\nLa stringa inserita e'->\n"); 
    mostrainformazioni(dim, vettore_input);          /* chiamata funzione - mostra i dettagli su dimensione e contenuto della stringa, per verificare se è corretto*/ 
    
    
    toglispazi(i, dim, parola, vettore_input);       /* chiamata funzione - toglie eventuali spazi nella stringa*/ 
    dim=strlen(parola);                              /*calcola lunghezza della parola digitata senza spazi*/ 
    printf("\nLa stringa senza spazi e'->\n"); 
    mostrainformazioni(dim, parola);                 /* chiamata funzione - mostra contenuto e dimensione del nuovo vettore, verifica che tutto sia andato come previsto*/ 
    
    
    i=0;                            /*azzeriamo contatore*/ 
    
    if ((dim%2)==0)                 /*se la dimensione della stringa è pari allora...*/ 
    {dim=dim-1;                     /*perché gli indici del vettore vanno da 0 a dim-1*/ 
    soluzione=palindromapari(i, dim, parola);} 
    else 
    {dim=dim-1; 
    soluzione=palindromadispari(i, dim, parola);} 
    
    if (soluzione) /* istruzione if per il confronto delle funzioni */
    
    printf("\nLa parola digitata e' palindroma\n"); /* stampa a video risultato */
    else 
    printf("\nLa parola digitata non e' palindroma\n"); /* stampa a video risultato */
    system("pause"); 
    return(0); /* fine del main */
    } 
    /* funzione input - leggi stringa */ 
    void inseriscistringa(int i, int n, char *vettore) 
    { 
    int k; /* varibile di confronto nel ciclo for */
    printf("Inserisci una parola o una frase senza usare segni di punteggiatura:\n\n---> "); /* inserimento */
    k=getchar(); /* confronto stringa-varibile */
    for(i=0; (i<n)&&(k!='\n')&&(k!=EOF);i++) /* ciclo for per la memorizzazione dei caratteri in vettore */
    {vettore[i] = k; 
    k=getchar(); 
    } 
    vettore[i]='\0'; 
    } 
    /* funzione calcola - togli spazi */ 
    void toglispazi(int i, int n, char *nuovo, char vecchio[]) 
    { 
    int j=0; /* ciclo di conteggio */
    for (i=0; i<n; ++i) 
    { 
    if (vecchio[i]!=' ') /* confronto con l'inserimento - blank */
    {nuovo[j]=vecchio[i]; 
    j=j+1;} /* incremento */
    } 
    nuovo[j]='\0'; 
    } 
    /* funzione confronto - verifica dispari */ 
    int palindromadispari(int i, int n, char parola[]) 
    { 
    
    int risultato; /* variabile risultato */
    if(i==n) /* confronto */
    {/*carattere sicuramente uguale, risultato vero*/ 
    risultato=1; 
    return(risultato); /* restituisce il valore 1 */
    } 
    else 
    { 
    if(parola[i]==parola[n]) 
    risultato=palindromadispari(i+1, n-1, parola); 
    else /*lettere non uguali, risultato falso*/
    { risultato=0; 
    return(risultato); /* restituisce il valore 0 */
      } 
     } 
    } 
    /* funzione confronto - verifica pari */ 
    int palindromapari(int i, int n, char parola[]) 
    { 
    int risultato; /* variabile risultato */
    if(i>n) /* confronto */
    { 
    if (parola[i]==parola[n]) /* confronto */
    {risultato=1; 
    return(risultato); /* restituisce il valore 1 */
    } 
    else 
    {risultato=0; 
    return(risultato); /* restituisce il valore 0 */
     } 
    } 
    else /* condizione risultante */
    { 
    if (parola[i]==parola[n]) 
    risultato=palindromapari(i+1, n-1, parola); /* richiamo alla funzione */
    else 
    {risultato=0; 
    return (risultato); /* restituisce il valore 0 */
      } 
     } 
    } 
    /* funzione output - stampa a video */ 
    void mostrainformazioni(int dimensione, char vettore[]) 
    { 
    printf("%s\n", vettore); /* stampa a video */ 
    }

  2. #2
    Hai scritto un sacco di codice per una funzione semplice per cui bastano una decina di righe di codice.
    Lo puoi fare ricorsivamente(più elegante) o iterativamente.
    Se lo fai iterativo, ti basta stare all'interno di un ciclo while dal quale esci se trovi una coppia di lettere che non soddisfano(in questo caso ti metti a true un booleano ed esci). Se invece arrivi fino in fondo(e quindi non hai modificato il booleano) la parola è palindroma......
    Open your mind. Use Open Source.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    168
    lo dovrei fare con una funzione ricorsiva...

  4. #4
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    25
    Prova con questo:

    codice:
    int palindroma(char *s)
    {
    int i, j;
    j = strlen(s)-1;
    for (i=0; i<=j; i++, j--)
    	{
    	if (s[i] != s[j]) return(0);
    	}
    return(1);
    }

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    168
    dove la dovrei inserire?

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    25
    Funzione ricorsiva... ma non capisco perché non funziona quando la stringa contiene spazzi...
    Siccome l’argomento mi piace spero che qualcuno più esperto di me ci dica cosa ce che non va


    codice:
    int palindroma(char *s, int n)
    {
    if (n <= 1) return 1;
    if (*s != *(s+n-1)) return 0;
    return(palindroma(s+1, n-2));
    }
    main()
    {
    char stringa[100];
    printf("\n Inserisci la stringa:\t ");
    scanf("%s", stringa);
    if (palindroma(stringa, strlen(stringa))==0)	
    printf("\nLa stringa non e' palindroma");
    else	printf("\nLa stringa e' palindroma");
    }

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    168
    io nel mio ho fatto la funzione togli spazi....se riusciamo a quagliare qualcosa usando entrambi i codici....

  8. #8
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Fate attenzione perche' la scanf considera lo spazio come delimitatore della stringa ...

    Se si scrive

    ma d am

    viene accettata solamente la prima parte

    ma

    Usate la fgets ...

  9. #9
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    168
    ho provato a modificare questo pezzo di codice e credo che l'errore stia qui...

    codice:
    /* funzione confronto - verifica dispari */ 
    int palindromadispari(int i, int n, char parola[]) 
    { 
    
    int risultato; /* variabile risultato */
    if(i==n) /* confronto */
    {/*carattere sicuramente uguale, risultato vero*/ 
    risultato=1; 
    return(risultato); /* restituisce il valore 1 */
    } 
    else 
    { 
    if(parola[i]==parola[n-1]) 
    risultato=palindromadispari(i+1, n-1, parola); 
    else /*lettere non uguali, risultato falso*/
    { risultato=0; 
    return(risultato); /* restituisce il valore 0 */
      } 
     } 
    }

  10. #10
    Utente di HTML.it
    Registrato dal
    Jan 2007
    Messaggi
    168
    cmq se ad esempio inserisco MADAM I'M ADAM non legge gli spazi quindi funziona

    codice:
    #include <stdlib.h>   /* librerie standard */
    #include <stdio.h>    /* funzioni printf, scanf */
    #include <string.h>   /* librerie delle string */
    
    int palindroma(char *s, int n);
    int main(void)
    {
    char stringa[100];
    printf("\n Inserisci la stringa:\t ");
    scanf("%s", stringa);
    if (palindroma(stringa, strlen(stringa))==0)	
    printf("\nLa stringa non e' palindroma");
    else	printf("\nLa stringa e' palindroma");
    system("pause");
    return (0);
    }
    
    int palindroma(char *s, int n)
    {
    if (n <= 1) return 1;
    if (*s != *(s+n-1)) return 0;
    return(palindroma(s+1, n-2));
    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.