PDA

View Full Version : Problema con esercizio in C sulle parole palindrome.


Ir0nM4id3n84
23-11-2004, 10:04
Ciao,
in classe ho preso gli appunti un po' a cavolo e mi sono ritrovato questo esercizio che però non funziona (anche se lo compila) e in più ho qualche dubbietto....potete darmi una mano per favore?

#include <stdio.h>
#include <stdlib.h>
#define M 100

int main(void){

int a=0, k=0, palindroma;
char V[M+1] = {0}; // Imposto a 0 tutti gli elementi di un vettore char di 100+1 elementi (1 per il char terminatore)

printf("Inserire una stringa di al più 100 caratteri: \n");

while(a < M && V[a] != '\n'){ // Finchè non ha occupato tutto il vettore e finchè non è stato premuto invio
V[a] = getchar(); // Memorizza il carattere in input nella posizione corrente del vettore
a++; // Incrementa la posizione corrente del vettore
}

if(V[a] == '\n'){ // Se l'ultimo elemento del vettore è il carattere newline
a = a-1; // decrementa la variabile a per posizionarti all'ultimo carattere effettivo nel vettore
}

palindroma = 1;
while(k < (a+1)/2 && palindroma == 1){ // Finchè l'indice di scorrimento k non è arrivato a metà parola e palindroma è 1
if(V[k] != (a-k)){ // Se i caratteri puntati dai 2 indici sono diversi imposta palindroma a 0
palindroma = 0;
}
k++;
}

if(palindroma == 1){
printf("La stringa immessa è PALINDROMA");
}
else{
printf("La stringa immessa NON è PALINDROMA");
}

return 0;
}


Le cose che mi lasciano particolarmente perplesso sono queste:

1) while(a < M && V[a] != '\n'){

Perchè and ? non dovrebbe bastare che una delle due condizioni sia falsa per far terminare il ciclo per immettere gli elementi del vettore?

2) Ma la getchat si usa sempre dentro i cicli per fargli prendere più caratteri o può essere usata anche come la scanf?

Grazie

ilsensine
23-11-2004, 10:34
Intanto, comincia a far funzionare il programma; ci sono 3 errori:
- Nella while, V[a]!='\n' viene effettuato su un "a" incrementato (v. a++ dentro il blocco while), quindi non punta all'ultimo carattere letto, ma al primo libero (da leggere)
- a = a-1 va eseguito sempre
- V[k] != (a-k) è ovviamente sbagliato


--- pali.c.org 2004-11-23 11:31:19.000000000 +0100
+++ pali.c 2004-11-23 11:36:12.000000000 +0100
@@ -9,18 +9,17 @@

printf("Inserire una stringa di al più 100 caratteri: \n");

- while(a < M && V[a] != '\n'){ // Finchè non ha occupato tutto il vettore e finchè non è stato premuto invio
+ while(a < M){ // Finchè non ha occupato tutto il vettore e finchè non è stato premuto invio
V[a] = getchar(); // Memorizza il carattere in input nella posizione corrente del vettore
+ if(V[a]=='\n') break;
a++; // Incrementa la posizione corrente del vettore
}

- if(V[a] == '\n'){ // Se l'ultimo elemento del vettore è il carattere newline
a = a-1; // decrementa la variabile a per posizionarti all'ultimo carattere effettivo nel vettore
- }

palindroma = 1;
while(k < (a+1)/2 && palindroma == 1){ // Finchè l'indice di scorrimento k non è arrivato a metà parola e palindroma è 1
- if(V[k] != (a-k)){ // Se i caratteri puntati dai 2 indici sono diversi imposta palindroma a 0
+ if(V[k] != V[a-k]){ // Se i caratteri puntati dai 2 indici sono diversi imposta palindroma a 0
palindroma = 0;
}
k++;