Problema su dichiarazione vettori!

di il
41 risposte

41 Risposte - Pagina 3

  • Re: Problema su dichiarazione vettori!

    Hai scritto
    "char non indica una stringa a quanto ne so"

    quando ti ho suggerito di scrivere

    char nome_libro[50];

    Non hai neanche provato. Che dirti?
  • Re: Problema su dichiarazione vettori!

    oregon ha scritto:


    Hai scritto
    "char non indica una stringa a quanto ne so"

    quando ti ho suggerito di scrivere

    char nome_libro[50];

    Non hai neanche provato. Che dirti?
    Ho provato, funziona, ma come output mi da valori strani, ecco il codice, forse c'è qualcos'altro che non va :
    #include <iostream>
    #include <cstring>
    using namespace std;
    
    class Libro {
       
       char nome_libro[2];
       float costo[2];
       int scaffale[2];
       int numero_pagine[2];
       char casa_editrice[2];
       
       public:
          void inizializza(char n[], float c[], int s[], int p[], char ce[])
          {
             nome_libro[2] = n[2];
             costo[2] = c[2];
             scaffale[2] = s[2];
             numero_pagine[2] = p[2];
             casa_editrice[2] = ce[2];
          }
          
          void stampa()
          {
             int i;
             for(i=0; i<=1; i++)
             {
                cout<<"Il nome del libro e\' "<<nome_libro[i]<<" e costa euro "<<costo[i]<<", si trova nello scaffale "<<scaffale[i]<<", ha pagine n. "<<numero_pagine[i]<<" ed e\' prodotto dalla "<<casa_editrice[i]<<endl;
             }
          }
          
          void applica_sconto()
          {
             int i;
             for(i=0; i<=1; i++)
             {
                float s;
                float tot;
                s=(costo[i]*10)/100;
                tot=costo[i]-s;
                cout<<"Lo sconto del libro n. "<<i<<" e\' uguale a: "<<tot<<endl;
             }
          }
          
    };
    
    int main()
    {
       Libro operatore;
       
       char n[2];
       float c[2];
       int s[2];
       int p[2];
       char ce[2];
       
       int i;
       for(i=0; i<=1; i++)
       {
          cout<<"Inserisci il nome del libro: ";
          cin>>n[i];
          cout<<"Quanto costa il libro? ";
          cin>>c[i];
          cout<<"In quale scaffale si trova? ";
          cin>>s[i];
          cout<<"Quante pagine ha il libro? ";
          cin>>p[i];
          cout<<"Qual'e\' la casa editrice? ";
          cin>>ce[i];
          cout<<endl;
       }
       
       operatore.inizializza(n, c, s, p, ce);
       operatore.stampa();
       operatore.applica_sconto();
       
       return 0;
    }
  • Re: Problema su dichiarazione vettori!

    Ho notato ora la traccia dell'esercizio, nella quale si chiede: "Definisci una classe libro contenete i seguenti attributi: nome del libro (array di caratteri) [...]". A quanto pare, quindi, non dovresti usare gli oggetti string, bensì dei semplici array di char.

    Potresti cominciare col predisporre una proprietà costante tipo kLMaxStringa che definisca le dimensioni massime delle stringhe per l'editore e per il titolo.
    static const int kLMaxStr = 127; // 127 e' un valore arbitrario, puoi
                                     // sostituirlo con quel che ti pare, purche'
                                     // si tratti di una quantita' di caratteri
                                     // sufficiente a contenere il titolo/editore
                                     // piu' lungo che pensi possa essere usato
    Le due proprietà editore e titolo saranno array di caratteri in grado di contenere stringhe lunghe al massimo kLMaxStr char.
    char editore[kLMaxStr+1]; // +1 per far spazio al terminatore '\0'
    char titolo[kLMaxStr+1];  // +1 per far spazio al terminatore '\0'
    A quel punto, potresti mettere nel metodo inizializza() qualcosa tipo...
    bool inizializza( const char *_editore, const char *_titolo,
                      float _prezzo, float _sconto, int _scaffale, int _pagine ) {
        
        if( !_editore || !_titolo || 0.0f>_prezzo || 0.0f>_sconto || 0>_pagine )
            return false; // hai visto mai che vengano passati parametri pazzi?
        
        /* usare strncpy() anziche' strcpy() da' la garanzia di non sfondare
        ** l'array; in caso di troncamento della stringa, strncpy() non aggiunge
        ** il terminatore, per cui (per quel che costa) apponiamo sempre e comunque
        ** un terminatore nell'ultimo char */
        
        strncpy( editore, _editore, kLMaxStr );
        titolo[kLMaxStr] = '\0';
        
        strncpy( titolo, _titolo, kLMaxStr );
        editore[kLMaxStr] = '\0';
        
        prezzo   = _prezzo; // il prezzo non scontato
        sconto   = _sconto; // per memorizzare la percentuale dello sconto
        scaffale = _scaffale;
        pagine   = _pagine;
        
        return true;
    }
    Lo sconto non lo applicherei modificando la proprieta' prezzo, bensì facendo in modo che applica_sconto() restituisca il prezzo scontato calcolandolo "al volo":
    float applica_sconto() const { return prezzo-prezzo*sconto*0.01f; }
  • Re: Problema su dichiarazione vettori!

    Ma hai riscritto il cidice iniziale con [2] per ogni elemento?? Ti avevo detto che è sbagliato e insisti??

    Va be ... lascio perdere
  • Re: Problema su dichiarazione vettori!

    oregon ha scritto:


    Ma hai riscritto il cidice iniziale con [2] per ogni elemento?? Ti avevo detto che è sbagliato e insisti??

    Va be ... lascio perdere

    Ma perché è sbagliato? Io voglio inserire solo due libri, potrei mettere anche 100
  • Re: Problema su dichiarazione vettori!

    Non avendo chiaro il concetto di classe non puoi capire perché é sbagliato.
  • Re: Problema su dichiarazione vettori!

    Domingo, se chiami "Libro" la tua classe, perché vuoi poi "metterci dentro" tanti libri? Allora volevi fare una classe "Biblioteca"? In una classe che si chiama "Libro" uno si aspetterebbe UN titolo, UN prezzo, UNA percentuale di sconto, UNA casa editrice e quant'altro servisse per delineare UN libro, non una biblioteca, che è invece un contenitore per una serie di libri... La cosa è un bel po' diversa, no?
  • Re: Problema su dichiarazione vettori!

    AldoBaldo ha scritto:


    Domingo, se chiami "Libro" la tua classe, perché vuoi poi "metterci dentro" tanti libri? Allora volevi fare una classe "Biblioteca"? In una classe che si chiama "Libro" uno si aspetterebbe UN titolo, UN prezzo, UNA percentuale di sconto, UNA casa editrice e quant'altro servisse per delineare UN libro, non una biblioteca, che è invece un contenitore per una serie di libri... La cosa è un bel po' diversa, no?

    Ma me lo chiede la traccia, Array di caratteri
  • Re: Problema su dichiarazione vettori!

    Appunto, array di caratteri, non di titoli. Un titolo può essere contenuto in un array di caratteri, ognuno dei quali rappresenterà una delle lettere del titolo. Ad esempio, metti che il libro si intitoli "Aiuto!", avresti bisogno un array di almeno[\b] 7 caratteri. Immagina il tuo array come una "cassettiera" dove in ogni cassetto piazzi una lettera della parola, più un "segnale" per far capire che le lettere sono finite ("terminatore": \0)... ipotizziamo di usare una cassettiera con 16 cassetti... finiresti per avere:
     00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 
    | A| i| u| t| o| !|\0|  |  |  |  |  |  |  |  |  |
    Quel che c'è nelle posizioni da 07 a 15 è irrilevante, perché è successivo al terminatore '\0'.

    Dunque, nella classe Libro hai bisogno di due proprietà che vanno rappresentate per mezzo di array di caratteri (editore e titolo), ma ti basta un solo array per ciascuna di quelle due proprietà. Il che significa che, alla fine, l'insieme delle proprietà della tua classe potrebbe essere qualcosa come:
    
    private:
        char editore[50];
        char titolo[50];
        float prezzo;
        float sconto; // in percentuale
        int scaffale;
        int pagine;
    Vedi ben che il libro ha UN editore, UN titolo, UN prezzo, UNA percentuale di sconto, UNO scaffale per l'esposizione/immagazzinamento e UNA quantità di pagine. Ciascun array di caratteri (editore[50] e titolo[50]) contiene UN dato, "smistato" lettera per lettera nei caratteri dell'array (in questo caso, fino a un massimo di 50 lettere; anzi, 49 perché bisogna tenere conto della necessità di aggiungere sempre il terminatore '\0', che si porta via un "cassetto").

    Buona fortuna!
  • Re: Problema su dichiarazione vettori!

    Come nella mia risposta del 23 alle 18.03.

    Ma se non si sa cosa sia un array di char...
  • Re: Problema su dichiarazione vettori!

    Oregon, apposta ho messo quel "50" e non un'altra dimensione -- stavo riprendendo il tuo suggerimento (con l'aggiunta di qualche spintarella che magari aiuta; o magari no).
  • Re: Problema su dichiarazione vettori!

    Ah ok, ora mi è chiaro!
    Ho mal interpretato la traccia. Grazie per la pazienza dimostratami.
Devi accedere o registrarti per scrivere nel forum
41 risposte