Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219

    [C]Funzione per vedere se una stringa è palindroma

    Salve a tutti,ho scritto un programma che usa una funzione per vedere se una stringa è palindroma o no.L' idea da cui sono partito è di creare una stringa inversa e stampare "è palindroma" se la stringa inversa è uguale a quella di partenza usando strcmp.
    Pero' mi stampa sempre che non è palindroma.
    Ecco il codice:
    codice:
    #include<stdio.h>
    #include<string.h>
    void palindroma(char a[]);
    main()
    {
        char stemp[100];
        gets(stemp);
        char s1[strlen(stemp)];
        strcpy(s1,stemp);
        palindroma(s1);
    }
    void palindroma(char a[])
    {
        int i;
        char *ptra,*ptrb,b[strlen(a)];
        ptra=a;
        ptrb=&b[strlen(a)];
        for(i=0;i<strlen(a);i++)
        {
            *ptrb--=*ptra++;
        }
        if(!strcmp(a,b))
          printf("E' palindroma");
        else
          printf("Non e' palindroma");
    }
    Qualche indizio per capire dove ho sbagliato?

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Il problema deve sicuramente risiedere nell'algoritmo che inverte le due parole, dato che strcmp direi che è stata sufficientemente testata finora.

    Hai controllato che la stringa venga invertita nel modo corretto?
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  3. #3
    Bastava mettere un printf prima del confronto per vedere che b non contiene caratteri; in effetti dal tuo codice b viene solo dichiarato ma non inizializzato.
    Insomma, io rivedrei l'algoritmo, ci sono sicuramente soluzioni più appropriate e semplici.

    Modifica la funzione così:
    codice:
    void palindroma(char a[])
    {
        int i; int c = 0;
        char b[strlen(a)];
        
        for(i=strlen(a)-1;i >= 0; i--){
        b[c] = a[i];
        c++;
        }
        b[c] = '\0';
        
        if(!strcmp(a,b))
          printf("E' palindroma");
        else
          printf("Non e' palindroma");
    }

    Ciao

  4. #4
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Capito,avevo dimenticato il terminatore e alcuni dettagli.
    Per la cronaca l' ho rifatta "a modo mio",ecco qua il codice nel caso servisse in futuro:
    codice:
    void palindroma(char a[]);
    void main()
    {
        char stemp[100];
        gets(stemp);
        char s1[strlen(stemp)+1];
        strcpy(s1,stemp);
        palindroma(s1);
    }
    void palindroma(char a[])
    {
        int i;
        char b[strlen(a)+1],*ptra,*ptrb;
        ptra=a;
        ptrb=&b[strlen(a)-1];
        b[strlen(a)]='\0';
        for(i=0;i<strlen(a);i++)
          *ptrb--=*ptra++;
        if(!strcmp(a,b))
          printf("E' palindroma");
        else
          printf("Non e' palindroma");
    }

  5. #5
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    475
    Consiglio: separa la logica dalla presentazione.
    E' meglio riscrivere la funzione in modo che ritorni un bool (ok, siamo in C, un intero allora) che indichi se la parola è palindroma o no, e se lo è, allora la funzione chiamante gestirà la cosa.
    In questo modo se ti dovesse servire in futuro sarà già pronta all'uso
    "Let him who has understanding reckon the number of the beast, for it is a human number.
    Its number is rw-rw-rw-."

  6. #6
    perchè non usare il ciclo che copia la stringa per controllare direttamente se la stringa è palindroma o meno?
    risparmi memoria e tempo.

    codice:
            ...	
    
            length = (int) strlen(stringa);
    
    	i = 0;
    	while (i < length / 2 && stringa[i] == stringa[length - i - 1])
    		i ++;
    
    	if (i < length / 2)
    		return 0;
    	else
    		return 1;

  7. #7
    Premesso che la soluzione postata da ramy89 è corretta e interessante, voglio dire che la ritengo un pò laboriosa e ridondante, ossia sarebbe passibile di ottimizzazione (per esempio ci sono troppe funzioni strlen..).

    Per completezza di argomento e per far sì che in futuro utenti alle prime armi possano risolvere il quesito senza l'utilizzo di puntatori, posto un'ulteriore soluzione, tra l'altro molto semplice:
    codice:
      
    int i = strlen(a);
    char b[i]; b[i] = '\0';
    for (c=0; i >=0; i--, c++)
        b[c] = a[i]

    Ciao

  8. #8
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Si in effetti MdE2005 hai ragione,io questo programma l' avevo fatto come esercizio sui puntatori.
    E' una soluzione sconveniente perche' si usano mille variabili.
    Senza puntatori e' senzaltro piu' veloce,ho provato a rifare tutto facendo anche il confronto volta per volta (come aveva detto google1),ecco un' altra variante:
    codice:
    int palindroma(char a[])
    {
        int i,j=strlen(a)-1;
        for(i=0;i<j&&a[i]==a[j];i++)
          j--;
        return(i==j);
    }
    Ovviamente ci sarebbero infiniti modi per scriverla.

  9. #9
    Originariamente inviato da ramy89
    Si in effetti MdE2005 hai ragione,io questo programma l' avevo fatto come esercizio sui puntatori.
    E' una soluzione sconveniente perche' si usano mille variabili.
    Senza puntatori e' senzaltro piu' veloce,ho provato a rifare tutto facendo anche il confronto volta per volta (come aveva detto google1),ecco un' altra variante:
    codice:
    int palindroma(char a[])
    {
        int i,j=strlen(a)-1;
        for(i=0;i<j&&a[i]==a[j];i++)
          j--;
        return(i==j);
    }
    Ovviamente ci sarebbero infiniti modi per scriverla.
    Perfetto..in futuro se un utente avrà bisogno gli posteremo direttamente questo link e troverà molteplici soluzioni.


    Ciao

  10. #10
    Utente di HTML.it
    Registrato dal
    Mar 2006
    Messaggi
    116
    Secondo me il metodo può ancora essere ottimizzato:

    codice:
    for ( i=0 ; i< ( strlen(a)/2 ) ; i++) {
        if ( a.charAt(i) != a.charAt( strlen(a)-i ) ) {
            return false;
        }
    }
    
    return true
    perdonate se alcuni comandi non esistono in C, (arrivo da java =P)

    il concetto è:
    faccio un for fino a metà stringa, confronto la prima con l'ultima e così via appena ne trovo una falsa esco con false, se termino il for esco con true.

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.