PDA

Visualizza la versione completa : [C++] Vettore stringa e stringhe palindrome


TheEnigmist
30-12-2010, 12:41
Salve a tutti,
ho un problema da risolvere quanto prima possibile.
Il mio professore di informatica ci ha dato degli esercizi da svolgere in C++. Niente di difficile, però ho riscontrato un problema alquanto strano nel

mio programmino.
L'esercizio in questione è:
"Si scriva un programma che, dopo aver letto N stringhe da tastiera, verifichi se ogni stringa è PALINDROMA oppure

no. Una parola è PALINDROMA se è la stessa quando è letta di sinistra a destra e da destra a sinistra (esempio: OTTO; POROP etc.)"

Vi mostro come ho scritto il codice.
MAIN.CPP

#include <cstdlib>
#include <iostream>
#include <string.h>
#include "second.h"

using namespace std;

int main(int argc, char *argv[])
{
system("color F");
vettore vet;
int riemp,x;
leggiStringa (vet, riemp);
cout << endl << endl;
stampaStringa (vet, riemp);
cout << endl << endl;
palindroma (vet, riemp);
cout << endl << endl;
system("PAUSE");
return EXIT_SUCCESS;
}

SECOND.H


#ifndef SECOND_H
#define SECOND_H
#define N 100
typedef char stringa [256];
typedef stringa vettore [N];

void leggiStringa (vettore, int & );
void stampaStringa (vettore, int);
void palindroma (vettore, int);
void inizializza (stringa);
#endif


SECOND.CPP

#include <cstdlib>
#include <iostream>
#include <string.h>
#include "second.h"

using namespace std;

void leggiStringa (vettore v, int &r){
stringa parole;
cout << "Inserire il riempimento del vettore! MAX 100"<<endl;
do
cin >> r;
while (r<=0 || r>100);
cout << endl;
for (int i=0; i<r; i++){
cout << "V["<< i << "]= ";
cin >> parole;
strcpy(v[i],parole);
}
}

void stampaStringa (vettore v, int r){
for (int i=0; i<r; i++){
cout << "V["<< i <<"]= "<< v[i] << endl;
}
}

void inizializza (stringa s){
for (int i=0; i<=0;i++)
s[i]='\0';
}
void palindroma (vettore v, int r){
stringa s,t;

int n, x, j, k;
for (int i=0; i<r; i++){
inizializza (t);
strcpy (s, v[i]);

n= strlen (s);
for (k=0, j=n-1; k<=n-1, j>=0; k++, j--){
t[k]=s[j];
cout << "T["<<k<<"]= S["<<j<<"]: "<<t[k]<<endl;
}
cout << endl<<endl;
cout << "S= " << s <<endl;
cout << "T= " << t <<endl;
x= strcmp (s,t);
cout << x << endl<<endl;
if (x==0)
cout << "La parola e' palindroma"<<endl;
else
cout << "La parola non e' palindroma"<<endl;
inizializza (t);
cout << "T= "<< t << endl <<endl;
cout << "___________________________________"<<endl<<endl;
}
}

Non guardate il codice "palindroma" che è un casino, l'ho fatto così solo per controllare ogni passaggio nella speranza di comprenderne l'errore, ma

invano.

Non vi spiego a parole l'errore, ma vi lascio uno screen di una prova:
http://img839.imageshack.us/img839/9956/95963877.th.jpg (http://img839.imageshack.us/i/95963877.jpg/)

Un primo errore che non riesco a risolvere è che la stringa T non è inizializzata ad una stringa vuota (Come posso farlo?) EDIT: ho modificato il codice, ma resta il problema che la stringa t ha dei caratteri di troppo :| http://img574.imageshack.us/img574/1416/57020023.th.jpg (http://img574.imageshack.us/i/57020023.jpg/)

Il secondo errore è quel maledetto carattere dopo la stringa "miuccido"... Che cavolo di problema è?
Spero di essere stato chiaro!
TheEnigmist

YuYevon
30-12-2010, 15:22
A parte che alcune cose non capisco perché le fai (per dirne una, che senso ha quella funzione inizializza() che fa un ciclo con i che va da 0 a 0? :eek: ), direi che basta aggiungere:



...
for (k=0, j=n-1; k<=n-1, j>=0; k++, j--){
t[k]=s[j];
cout << "T["<<k<<"]= S["<<j<<"]: "<<t[k]<<endl;
}
t[k] = '\0';
...

TheEnigmist
30-12-2010, 16:30
Originariamente inviato da YuYevon
A parte che alcune cose non capisco perché le fai (per dirne una, che senso ha quella funzione inizializza() che fa un ciclo con i che va da 0 a 0? :eek: ), direi che basta aggiungere:



...
for (k=0, j=n-1; k<=n-1, j>=0; k++, j--){
t[k]=s[j];
cout << "T["<<k<<"]= S["<<j<<"]: "<<t[k]<<endl;
}
t[k] = '\0';
...


Codice riciclato dagli esempi del mio prof... poi ci ho scritto e riscritto sopra... Grazie del consiglio, proverò subito.
Funziona :D
Mi spieghi il perché prima non mi funzionava e ora si? XD Sono leggermente fuso ora e veramente non comprendo!
EDIT: forse ho capito... t[k]= '\0'; altro non fa che aggiungere dopo la stringa al contrario il carattere null (\0) non permettendo quegli errori visti prima di caratteri aggiuntisi da sé, e non come pensavo io che sostituiva semplicemente \0 al contenuto di T :) Giusto? o.o

YuYevon
30-12-2010, 16:44
Semplicemente, non aggiungevi il terminatore alla fine della stringa generata; questo si ripercuoteva sul valore della stringa stessa che risultava avere dei caratteri sporchi alla fine, come del resto risultava anche dalla stampa. La strcmp() confronta due stringhe carattere per carattere fino a quando non trova o una coppia di caratteri diversi o un terminatore, ma se il terminatore non c'è ovviamente hai dei problemi.
EDIT: più o meno sì.

TheEnigmist
30-12-2010, 17:02
Originariamente inviato da YuYevon
Semplicemente, non aggiungevi il terminatore alla fine della stringa generata; questo si ripercuoteva sul valore della stringa stessa che risultava avere dei caratteri sporchi alla fine, come del resto risultava anche dalla stampa. La strcmp() confronta due stringhe carattere per carattere fino a quando non trova o una coppia di caratteri diversi o un terminatore, ma se il terminatore non c'è ovviamente hai dei problemi.
EDIT: più o meno sì.

Grazie mille, ora ho compreso il mio errore!

MdE2005
31-12-2010, 07:48
Per una tua completezza, ti invito a leggere questo post http://forum.html.it/forum/showthread/t-1433641.html in cui si fornivano almeno 2-3 codici funzionanti per verificare se una stringa fosse palindroma. Guarda soprattutto la mia 2a soluzione.


Ciao :)

Loading