Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Problemi con le stringhe
Forum - C/C++ - Problemi con le stringhe

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Luk3 (Ex-Member)
Guru


Messaggi: 615
Iscritto: 16/08/2008

Segnala al moderatore
Postato alle 18:32
Mercoledì, 17/11/2010
Salve, ho fatto un programma che dovrebbe controllare se una parola è palindromo o meno,
ma basta che la lunghezza di questa sia divisibile per 2 che me la da palindroma.
Penso sia un problema con l'uso delle funzioni della libreria string.h, visto che è la prima volta che provo!

Codice sorgente - presumibilmente C++

  1. // Il programma controlla se una stringa è palindroma
  2.  
  3. #include <stdio.h>
  4. #include <string.h>
  5.  
  6. int main() {
  7.     char word[30], half1[30], half2[30], revhalf2[30];
  8.     int i, j, wordlenght;
  9.     j = 0;
  10.     system("clear");
  11.     printf("Il programma controlla se una parola è palindroma.");
  12.     printf("\n\nInserisci una parola: ");
  13.     scanf("%s", word);
  14.     wordlenght = strlen(word);
  15.     if((wordlenght%2)!=0)
  16.     {
  17.         printf("\nLa parola non è palindroma!\n\n");
  18.     }
  19.     else
  20.     {
  21.         i = wordlenght/2;
  22.         while(j<=wordlenght/2)
  23.         {
  24.             half1[j] = word[j];
  25.             j++;
  26.         }
  27.         while(i<=wordlenght)
  28.         {
  29.             half2[i] = word[i];
  30.             i++;
  31.         }
  32.         j = strlen(half2);
  33.         i = 0;
  34.         while(i<=strlen(half2) && j>=strlen(half2))
  35.         {
  36.             revhalf2[i] = half2[j];
  37.             i++;
  38.             j--;
  39.         }
  40.         if(strcmp(half1, revhalf2))
  41.         {
  42.             printf("\nLa parola è palindroma!\n\n");
  43.         }
  44.     }
  45.     return 0;
  46. }


PM Quote
Avatar
GuglielmoS (Ex-Member)
Pro


Messaggi: 114
Iscritto: 27/11/2009

Segnala al moderatore
Postato alle 18:44
Mercoledì, 17/11/2010
Penso che ti sia andato a complicare un pò troppo la vita. Per verificare se è palindroma, basta che confronti la stringa con un ciclo a due indici e ti fermi se ci sono caratteri non uguali.
Esempio:
Codice sorgente - presumibilmente C/C++

  1. ...
  2. i = 0;
  3. pal = 1;
  4. j = len-1;
  5. str = stringa_da_verificare;
  6. while(i < (len/2) && pal) {
  7.   if (str[i++] != str[j--])
  8.     pal = 0;
  9. }
  10. printf("Palindroma: %s\n", (pal) ? "Si" : "No");
  11. ...


In alternativa puoi usare la ricorsività.
Questo lo scrissi tempo fa:
Codice sorgente - presumibilmente C++

  1. /*Funzione ricorsiva per controllare se una stringa è palindroma*/
  2. int is_pal(const char str[], int len, int c){
  3.         /*Controllo i caratteri da confrontare sono finiti*/
  4.         if(len > len / 2) return 0;
  5.         else if(str[c] == str[len]) return is_pal(str, len - 1, c + 1);
  6.         else return 1;
  7. }


Ciao GuglielmoS.

Ultima modifica effettuata da GuglielmoS il 17/11/2010 alle 18:45
PM Quote
Avatar
Alex (Ex-Member)
Expert


Messaggi: 441
Iscritto: 15/08/2005

Segnala al moderatore
Postato alle 18:47
Mercoledì, 17/11/2010
Testo quotato

Postato originariamente da Luk3:

Salve, ho fatto un programma che dovrebbe controllare se una parola è palindromo o meno,
ma basta che la lunghezza di questa sia divisibile per 2 che me la da palindroma.
Penso sia un problema con l'uso delle funzioni della libreria string.h, visto che è la prima volta che provo!


// Il programma controlla se una stringa è palindroma

#include <stdio.h>
#include <string.h>

int main() {
    char word[30], half1[30], half2[30], revhalf2[30];
    int i, j, wordlenght;
    j = 0;
    system("clear");
    printf("Il programma controlla se una parola è palindroma.");
    printf("\n\nInserisci una parola: ");
    scanf("%s", word);
    wordlenght = strlen(word);
    if((wordlenght%2)!=0)
    {
    printf("\nLa parola non è palindroma!\n\n");
    }



prima di tutto una stringa con numeri dispari non necessariamente non è palindroma...
ad esempio la parola "aveva" può essere letta sia da sinistra che da destra quindi è palindroma
Testo quotato



    else
    {
    i = wordlenght/2;
    while(j<=wordlenght/2)
    {
        half1[j] = word[j];
        j++;
    }
    while(i<=wordlenght)
    {
        half2 = word;
        i++;
    }
    j = strlen(half2);
    i = 0;
    while(i<=strlen(half2) && j>=strlen(half2))
    {
        revhalf2 = half2[j];
        i++;
        j--;
    }
    if(strcmp(half1, revhalf2))
    {
        printf("\nLa parola è palindroma!\n\n");
    }
    }
    return 0;
}


personalmente io avrei fatto in una maniera diversa.....
avrei fatto un ciclo for che va da 0 fino alla lunghezza della stringa / 2.
successivamente, tramite l'utilizzo di un altro contatore avrei confrontato la prima lettera con l'ultima, la seconda con la penultima, e così via:
Codice sorgente - presumibilmente C/C++

  1. int i,j;
  2. for(i=0,j=lung_stringa;i<=lung_stringa/2;i++,j--)
  3.      if(s[i]!=s[j])   //controllo se il due caratteri sono diversi
  4.          break;


a questo punto, appena uscito dal ciclo, se i è = alla lung_stringa/2 vuol dire che non sono entrato nell'if e che quindi il ciclo non è terminato prematuramente e che quindi la parola è palindroma, mentre se il cilclo termina prematuramente i assumera un valore diverso dalla lung_stringa/2 e quindi la parola non è palindroma...
Codice sorgente - presumibilmente C/C++

  1. if(i==lung_stringa/2)
  2.     printf("Palindroma");
  3. else
  4.     printf("Non palindroma");



Ultima modifica effettuata da Alex il 17/11/2010 alle 18:48
PM Quote
Avatar
delta (Member)
Rookie


Messaggi: 37
Iscritto: 25/08/2010

Segnala al moderatore
Postato alle 18:54
Mercoledì, 17/11/2010
non capisco il ragionamento, non ti basta fare una cosa del genere?
Codice sorgente - presumibilmente C++

  1. //codice precedente
  2. int wordlength=strlen(word)/2;
  3. bool palindromo=true;
  4.  
  5. for(int i=0; i<wordlength and palindromo; i++)
  6. {
  7.     if (word[i]!=word[wordlenght-1-i])
  8.     { palindromo=false; }
  9. }
  10.  
  11. if (palindromo)
  12. {printf("palindromo!!!\n");}
  13. else
  14. {printf("non palindromo!\n");}



adesso non ho un compilatore sotto mano per provare il tuo codice...

Ultima modifica effettuata da delta il 17/11/2010 alle 18:57
PM Quote
Avatar
Alex (Ex-Member)
Expert


Messaggi: 441
Iscritto: 15/08/2005

Segnala al moderatore
Postato alle 19:26
Mercoledì, 17/11/2010
Testo quotato

Postato originariamente da delta:

non capisco il ragionamento, non ti basta fare una cosa del genere?



in effetti basterebbe, alla fine il mio codice e il tuo sono uguali, solo che io uso una variabile int in più e una bool in meno....però la sostanza è quella...
inoltre il mio se la parola non è palindroma esce subito dal ciclo appena trova una lettera diversa...il tuo controlla tutto...

PM Quote
Avatar
a_butta (Member)
Expert


Messaggi: 578
Iscritto: 16/03/2010

Segnala al moderatore
Postato alle 20:16
Mercoledì, 17/11/2010
e ricavare la stringa al contrario e confrontarla con quella normale?
Se la stringa inversa è uguale a quella di partenza è palindroma, altrimenti no...

PM Quote
Avatar
Luk3 (Ex-Member)
Guru


Messaggi: 615
Iscritto: 16/08/2008

Segnala al moderatore
Postato alle 21:38
Mercoledì, 17/11/2010
Ho semplificato ma ancora non va..dice sempre che non è un palindromo!
Non sono molto sicuro della funzione strcmp().
Ho cercato in internet e dicono che se torna un valore == 0 allora è true..Boh

Codice sorgente - presumibilmente C++

  1. // Il programma controlla se una stringa è palindroma
  2.  
  3. #include <stdio.h>
  4. #include <string.h>
  5.  
  6. int main() {
  7.     char word[30], revword[30];
  8.     int i, j;
  9.     j = 0;
  10.     system("clear");
  11.     printf("Il programma controlla se una parola è un palindromo.");
  12.     printf("\n\nInserisci una parola: ");
  13.     scanf("%s", word);
  14.     i = strlen(word);
  15.     while(i>=0)
  16.     {
  17.         revword[j++] = word[i--];
  18.     }
  19.     if(strcmp(word, revword) == 0)
  20.     {
  21.         printf("\nLa parola è un palindromo!\n\n");
  22.     }
  23.     else
  24.     {
  25.         printf("\nLa parola non è un palindromo!\n\n");
  26.     }
  27.     return 0;
  28. }


Ultima modifica effettuata da Luk3 il 17/11/2010 alle 21:48
PM Quote
Avatar
Luk3 (Ex-Member)
Guru


Messaggi: 615
Iscritto: 16/08/2008

Segnala al moderatore
Postato alle 21:56
Mercoledì, 17/11/2010
Comunque a quanto mi risulta il tipo bool non esiste in C :-|

PM Quote
Avatar
GuglielmoS (Ex-Member)
Pro


Messaggi: 114
Iscritto: 27/11/2009

Segnala al moderatore
Postato alle 22:09
Mercoledì, 17/11/2010
Testo quotato

Postato originariamente da Luk3:

Ho semplificato ma ancora non va..dice sempre che non è un palindromo!
Non sono molto sicuro della funzione strcmp().
Ho cercato in internet e dicono che se torna un valore == 0 allora è true..Boh

Codice sorgente - presumibilmente C++

  1. // Il programma controlla se una stringa è palindroma
  2.  
  3. #include <stdio.h>
  4. #include <string.h>
  5.  
  6. int main() {
  7.     char word[30], revword[30];
  8.     int i, j;
  9.     j = 0;
  10.     system("clear");
  11.     printf("Il programma controlla se una parola è un palindromo.");
  12.     printf("\n\nInserisci una parola: ");
  13.     scanf("%s", word);
  14.     i = strlen(word);
  15.     while(i>=0)
  16.     {
  17.         revword[j++] = word[i--];
  18.     }
  19.     if(strcmp(word, revword) == 0)
  20.     {
  21.         printf("\nLa parola è un palindromo!\n\n");
  22.     }
  23.     else
  24.     {
  25.         printf("\nLa parola non è un palindromo!\n\n");
  26.     }
  27.     return 0;
  28. }



Non funziona per via del fatto che tu fai partire la i dal valore strlen(word). Quindi il primo carattere della stringa revword sarà un '\0', il che significa che la strcmp comparerà una stringa vuota.
Comunque per quanto riguarda il valore di ritorno della strcmp, hai:
1. 0 quando le stringhe sono uguali (dove hai letto true, veniva inteso che l'uguaglianza era vera, non che veniva restituito true)
2. -1 quando la prima stringa è minore della seconda
3. 1 quando la prima stringa è maggiore della seconda
Spero di averti chiarito un pò le idee.
Ciao GuglielmoS

Ultima modifica effettuata da GuglielmoS il 17/11/2010 alle 22:11
PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo