[C] Esercizio su conversione di caratteri maiuscoli in minuscoli e parole palindrome

luca.cupito
Salve. Ho un problema con un esercizio.

b]Traccia: Scrivere un programma in linguaggio C che riceve in ingresso una parola inserita da tastiera. Si consideri che la parola può contenere sia caratteri maiuscoli che caratteri minu scoli, e complessivamente al massimo 30 caratteri. Il programma deve svolgere le seguenti operazioni:
•visualizzare la parola inserita
•aggiornare la parola in modo che tutti i caratteri siano minuscoli. Il programma deve
visualizzare la parola ottenuta
•verificare se la parola è palindroma. Una parola è palindroma se può essere letta
indifferentemente da sinistra verso destra e da destra verso sinistra. Ad esempio, le
seguenti parole sono palindrome: otto, madam.

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

#define N 30

main () {
	
	char str1[N], str2[N];
	int i, j, l, n;
	printf("Inserire la parola da analizzare\n");
	gets(str1);
	printf ("La parola da analizzare e %s\n", str1);
//conversione da maiuscoli a minuscoli	
	for( i=0; i<N ; i++ ) {
		str1[i] = tolower(str1[i]);
		
	}
	printf("Converto la parola in minuscolo...\n");
	sleep (3);
	printf("La parola convertita e' %s\n", str1);
	
	l=strlen(str1);
	n=0;
	strcpy(str2,str1);
	
	for (i=0; i<l; i++){
 			for (j=l-1; j>=0; j--){
				if (str1[i]==str2[j]){
					n++;
				}
    			else 
    				n--;
				
  	   		     
		 }
	}	
	if (n==l){
	
		printf("La parola e' palindroma");
	}
	else
		printf("La parola non e' palindroma");
}



Perchè non funziona? Ho provato ad inserire un printf per stampare a video $n$ e $l$ e ad esempio con la parola oTTo, $n$ mi risulta $0$ e non $4$, con la parola MaDaM $n$ mi risulta $-7$ e non $5$.
Vi ringrazio in anticipo

Risposte
Giux1
Ciao, prova con questo codice, ti conviene agire direttamente sulla str1 per verificare se è palindroma
se ti copi la str1 in una nuova str2, farai riferimento a 2 stringhe diverse e non potrai mai verificarne la palindromicità (se mi si può passare il termine)..

   ///////////// palindroma
    _Bool palindroma = false;

   for(i=0; i<l; i++)
   {
       if(str1[i] == str1[l-i-1]){
        palindroma = true;
        continue;
       }
       else
        palindroma = false;
   }

   ////////

   if (palindroma){
      printf("La parola e' palindroma");
   } else
      printf("La parola non e' palindroma");


ps: puoi eliminare sia ctype, unistd, che string in quanto non ne fai uso nel programma ;)

luca.cupito
Grazie mille, gentilissimo. Per quanto riguarda la libreria ctype islower funzionerebbe? anche sleep senza time.h

Giux1
Si devi includerli, anche se molto spesso vengono richiamati quando includi altri file d'intestazione o dagli ide stessi

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.