Esercizio Sulla Programmazione Ad Oggetti

dodyx92

Nuovo Utente
9
0
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

Moderatore
Staff Forum
Utente Èlite
2,223
1,853
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
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
9
0
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

Moderatore
Staff Forum
Utente Èlite
2,223
1,853
CPU
Intel I9-10900KF 3.75GHz 10x 125W
Dissipatore
Gigabyte Aorus Waterforce X360 ARGB
Scheda Madre
Asus 1200 TUF Z590-Plus Gaming ATX DDR4
HDD
1TB NVMe PCI 3.0 x4, 1TB 7200rpm 64MB SATA3
RAM
DDR4 32GB 3600MHz CL18 ARGB
GPU
Nvidia RTX 3080 10GB DDR6
Audio
Integrata 7.1 HD audio
Monitor
LG 34GN850
PSU
Gigabyte P850PM
Case
Phanteks Enthoo Evolv X ARGB
Periferiche
MSI Vigor GK30, mouse Logitech
Net
FTTH Aruba, 1Gb (effettivi: ~950Mb / ~480Mb)
OS
Windows 10 64bit / OpenSUSE Tumbleweed
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.
 

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili