Esercizio Sulla Programmazione Ad Oggetti

dodyx92

Nuovo Utente
Salve ragazzi, domani ho un esame di Informatica. Ho provato a procedere autonomamente, ma non ci riesco, avendo passato settimane a prepararmi sul C ignorando il C++. Potreste aiutarmi con questo esercizio, per favore?

Prima parte.
Progettare una libreria per il software per il calcolo del computo metrico di un cantiere con le seguente classi:
- fornitore (contenente almeno nominativo, num di telefono, num di fax, partita iva e numero di conto corrente);
- materiale (contenente almeno descrizione, fornitore, prezzo unitario e aliquota iva.
Il progetto che si richiede comporta la definizione dei membri dato delle classi suddette e di altre classi che si ritiene opportuno definire (le classi fornitore e materiale possono ereditare o contenere come membri oggetti di altre classi). Si definisca inoltre una classe magazzino (contenente almeno un array di un certo quantitativo di oggetti materiale e altri membri che si ritengono necessari per l'utilizzo).

Seconda parte.
Scrivere il codice C++ che realizzi il progetto di cui al punto precedente e codifichi, su oggetti della classe magazzino, una funzione acquisto per inserire un quantitativo di materiale acquistato (NB: se in magazzino esiste già del materiale di un certo tipo e se ne acquista altro, la funzione deve andare a modificare le quantità disponibile dello stesso materiale, non inserire un altro elemento nel vettore) e una funzione vendita che, dato un certo quantitativo ed un certo materiale, detragga dal magazzino il materiale nel quantitativo indicato (o segnali la non disponibilità di detto materiale), consentendo l'archiviazione e la gestione dei dati su un file.

Allora per quanto concerne la prima parte, ho fatto quanto segue.
Ho creato una libreria chiamandola computometrico.h con al suo interno questo:
C:
// libreria computo metrico

#ifndef COMPUTOMETRICO_H
#define COMPUTOMETRICO_H
#define SIZE 50

using namespace std;

class fornitore {
    char modello[SIZE];
    int numTel;
    int numFax;
    int IVA;
    int conto;
public:
    void impostaModello();
    char prendiModello();
    void impostaTelefono();
    int prendiTelefono();
    void impostaFax();
    int prendiFax();
    void impostaIVA();
    int prendiIVA();
    void impostaConto();
    int prendiConto();
};

void fornitore::impostaModello() {
    cin >> modello[SIZE];
}

char fornitore::prendiModello() {
    return modello[SIZE];
}

void fornitore::impostaTelefono() {
    cin >> numTel;
}

int fornitore::prendiTelefono() {
    return numTel;
}

void fornitore::impostaFax() {
    cin >> numFax;
}

int fornitore::prendiFax() {
    return numFax;
}

void fornitore::impostaIVA() {
    cin >> IVA;
}

int fornitore::prendiIVA() {
    return IVA;
}

void fornitore::impostaConto() {
    cin >> conto;
}

int fornitore::prendiConto() {
    return conto;
}

class materiale : public fornitore {
    char desc[SIZE];
    int prezzoUnitario;
    int aliquotaIVA;
    fornitore forn;
public:
    void impostaDesc(char);
    char prendiDesc();
    void impostaPrezzo(int);
    int prendiPrezzo();
    void impostaAliquota(int);
    int prendiAliquota();
};

void materiale::impostaDesc(char desci) {
    desc[SIZE] = desci;
}

char materiale::prendiDesc() {
    return desc[SIZE];
}

void materiale::impostaPrezzo(int num) {
    prezzoUnitario = num;
}

int materiale::prendiPrezzo() {
    return prezzoUnitario;
}

void materiale::impostaAliquota(int num) {
    aliquotaIVA = num;
}

int materiale::prendiAliquota() {
    return aliquotaIVA;
}

class magazzino : public materiale {
    materiale array[20];
};

#endif // !COMPUTOMETRICO_H
Secondo voi va bene la libreria in questo modo? Tra l'altro io ho supposto che quando mi chiede il fornitore nella classe materiale, si riferisca alla classe fornitore, cioè che mi chieda tutti i dati del fornitore che appunto fornisce il materiale. Fatto così va bene? Invece per quanto riguarda la classe magazzino ho azzardato scrivendo un vettore di tipo materiale, ma non so se è giusto...

Per quanto riguarda la seconda parte, ciò che sono riuscito a fare è questo:
C:
#include <iostream>
#include "computometrico.h"

using namespace std;

int main() {
    fornitore f;
    materiale m;
    magazzino g;

    cout << "Inserisci il nominativo del fornitore, il suo telefono,\n"
        "il suo fax, la sua imposta IVA e il suo numero di conto.\n";
    f.impostaModello();
    f.impostaTelefono();
    f.impostaFax();
    f.impostaIVA();
    f.impostaConto();
    cout << "Il nominativo del fornitore e' " << f.prendiModello();
    cout << "\nIl suo telefono e' " << f.prendiTelefono();
    cout << "\nIl suo fax e' " << f.prendiFax();
    cout << "\nLa sua imposta IVA e' " << f.prendiIVA();
    cout << "\nIl suo numero di conto e' " << f.prendiConto();

/* BISOGNEREBBE CONTINUARE, MA MI SONO FERMATO */

    return 0;
}
Quando lo faccio andare e mi chiede di inserire il nome, un volta inserito si blocca e stampa tutte le informazioni sbagliate, inserendo solo la prima lettera del nome e numeri random.

Per favore, vi chiedo una mano. Almeno per la libreria, vorrei farla nel modo giusto.
Grazie.
 
Ultima modifica da un moderatore:

DispatchCode

Utente Attivo
593
342
Hardware Utente
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
Hard Disk
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
Scheda Video
Nvidia Geforce GTX 960M, 4GB
Scheda Audio
Realtek
Sistema Operativo
Windows 10 64bit
Una risposta ora è inutile sicuramente. Comunque gli errori sono più di uno, già riscontrabili ad occhio.
Non capisco perchè utilizzi un array di char al posto di una string. Inoltre anche il metodo che restituisce il modello non è corretto visto che tu usi un array di char ma restituisci un char.
Poi la lettura del modello è errata... ed il crash è dovuto a questo quasi sicuramente.
Se dovesse andarti male con C++, studia per bene tutto quanto. Hai commesso errori che anche solo da "programmatore C" avresti dovuto notare subito.

Non ti correggo tutto ora dato che hai l'esame domani, e mi sembra quindi inutile visto che potrebbero non interessarti più le mie correzioni. Se ti servono dritte, chiedi. ;)
 

dodyx92

Nuovo Utente
Guarda, mi sarebbero molto utili le tue correzioni al momento.
Per quanto riguarda la questione string... Dovrei fare un #include "string.h" all'inizio e poi quando vado a dichiarare l'array lo dichiaro come tipo string? Per la funzione invece come restituisco la stringa?
Se hai altro da correggermi e hai tempo, prego. Ci lavorerò su sta notte :caffe:
 

DispatchCode

Utente Attivo
593
342
Hardware Utente
CPU
Intel i7 6700HQ, 2.60Ghz, 4 core 8 threads
Scheda Madre
Asustek
Hard Disk
Hitachi 7200 rpm, 1TB
RAM
16GB DDR4 (2 slot su 4)
Scheda Video
Nvidia Geforce GTX 960M, 4GB
Scheda Audio
Realtek
Sistema Operativo
Windows 10 64bit
Questa è l'API: http://www.cplusplus.com/reference/string/string/

Una stringa è un insieme di caratteri. Quindi non ti serve un array di stringhe se devi memorizzare solo 1 modello.
Inoltre di solito il numero di conto non lo si tratta come intero, ma come stringa; idem la partita IVA ed i numeri di telefono.

I tuoi errori sono dovuti all'utilizzo errato che fai dell'array di caratteri. Dichiari un array di SIZE elementi, e poi accedi alla posizione SIZE: già questo è errato in quanto accedi ad una posizione che "non esiste" (sovrascrivi altro; ed il crash potrebbe essere l'accesso ad una locazione di memoria non permessa). Senza contare che il modello sarà composto da più caratteri... quindi ci sono proprio errori di una certa rilevanza (e non a causa di C++, poichè avresti lo stesso problema su C, Java e gli altri).
Il discorso è identico per la restituzione: stai restituendo una posizione non allocata (di nuovo accedendo quindi accedendo l'array di 1 posizione oltre al numero di elementi che hai memorizzato)... restituendo un carattere (e non l'intero modello).

Non mi soffermo sulla progettazione e sulla modellazione del problema solo perchè i problemi più evidenti sono altri e riguardano il codice.
 

Entra

oppure Accedi utilizzando