Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C++] Vettore stringa e stringhe palindrome

    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
    codice:
     #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
    codice:
    #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
    codice:
    #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:


    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 :|

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

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    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? ), direi che basta aggiungere:

    codice:
            ...
            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';
            ...
    every day above ground is a good one

  3. #3
    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? ), direi che basta aggiungere:

    codice:
            ...
            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
    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

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    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ì.
    every day above ground is a good one

  5. #5
    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!

  6. #6

    Re: [C++] Vettore stringa e stringhe palindrome

    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

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 © 2024 vBulletin Solutions, Inc. All rights reserved.