Esercizio in C++

di il
16 risposte

Esercizio in C++

Buonasera a tutti, sto lavorando ad un programma in c++, che mischia i circuiti elettrici della fisica con l'informatica. la consegna prevede la creazione di un programma in c++, nel quale si deve inserire la resistenza e il condensatore in due classi separate con attributi, metodi e costruttori propri. inoltre nel main viene indicato di inserire 3 resistenze e 2 condensatori. vi lascio sia la consegna originale, che il mio lavoro svolto. "Creare un programma che consente l'inserimento di due bipoli (Resistenza e Condensatore) attraverso due classi non derivate implementando i costruttori gli attributi e i metodi get e set per ogni attributo. Creare un main che consente di inserire 3 resistenze e 2 condensatori"

Quello che volevo esporvi era la mia perplessità per quando riguarda l'inserimento delle 3 resistenze e 2 condensatori.. mi era venuta in mente l'idea di inserirli attraverso gli array, ma mi sono "perso di casa", qualche soluzione?
grazie in anticipo!
Link del tutto innoquo sul mio lavoro svolto ***

giurò che smetto di scrivere.. sto usando un programma online, perchè il mio dev c++ ha smesso di far funzionare i programmi, una volta terminata la compilazione, mi si apre il prompt che mi dice "
--------------------------------
Failed to execute "C:\Users\Matteo\Documents\SenzaTitolo1.exe":
Error 193: %1 non Þ un'applicazione di Win32 valida.

Premere un tasto per continuare . . ."
Soluzioni anche per questo qui?

16 Risposte

  • Re: Esercizio in C++

    Ciao ma perché non lo incolli nel post tra tag code il tuo pezzo di codice?
  • Re: Esercizio in C++

    Penso si faccia così
    #include <iostream>
    using namespace std;
    class condensatore{
    	public:
    		float CaricaAccumulata;
    		float DifferenzaPotenziale;
    		float Formula();
    		void GetCondensatore();
    		void SetCondensatore();
    };
    float condensatore::Formula(){
    	return (condensatore::CaricaAccumulata/condensatore::DifferenzaPotenziale);
    }
    void condensatore::SetCondensatore(){
    	float carica, differenza;
    	cout<<"\nQ:";cin>>carica;
    	cout<<"\n\u0394V: ";cin>>differenza;
    	CaricaAccumulata=carica;
    	DifferenzaPotenziale=differenza;
    }
    void condensatore::GetCondensatore(){
    	cout <<"\nQ= "<< CaricaAccumulata;
    	cout <<"\n\u0394V= "<< DifferenzaPotenziale;
    	cout <<"\n----------------";
    }
    class resistenza{
    	public:
    		float Corrente;
    		float DifferenzaPotenzialeR;
    		float FormulaR();
    		void GetResistenza();
    		void SetResistenza();
    };
    float resistenza::FormulaR(){
    	return (resistenza::DifferenzaPotenzialeR/resistenza::Corrente);
    }
    void resistenza::SetResistenza(){
    	float corrente, differenzaR;
    	cout<<"\n\u0394V: ";cin>>differenzaR;
    	cout<<"\ni:";cin>>corrente;
    	DifferenzaPotenzialeR=differenzaR;
    	Corrente=corrente;
    }
    void resistenza::GetResistenza(){
    	cout <<"\n\u0394V= "<< DifferenzaPotenzialeR;
    	cout <<"\nQ= "<< Corrente;
    	cout <<"\n----------------";
    }
    main(){
    	condensatore C;
    		cout<<"Imetti i valori:";
    		C.SetCondensatore();
    		cout<<"\nSono stati inseriti i seguenti valori:";
    		C.GetCondensatore();
    		cout<<"\nLa Capacità del condensatore \u00E8 pari a: "<<C.Formula()<<"\b F.";
    	resistenza R;
    		cout<<"\nImetti i valori:";
    		R.SetResistenza();
    		cout<<"\nSono stati inseriti i seguenti valori:";
    		R.GetResistenza();
    		cout<<"\nLa Resistenza testata \u00E8 pari a: "<<R.FormulaR()<<"\b \u038F.";
    }
  • Re: Esercizio in C++

    Se intendi due distinti array, ossia uno di condensatori e uno di resistenze si può valutare. Se intendi un unico array allora no perché:
    attraverso due classi non derivate
    e un array può avere solo un tipo alla volta.
    Il resto del codice è da rivedere "pesantemente".
  • Re: Esercizio in C++

    Sisi, due Array distinti, uno per classe..
    Puoi indicarmi che problemi ha il codice?
  • Re: Esercizio in C++

    L'acquisizione/stampa dei dati dovrebbe (deve) avvenire fuori dalle funzioni membro. Infatti un ipotetico user (che non sia tu) potrebbe voler usare una GUI per l'acquisizione/stampa dei dati e una GUI non sa cosa siano cin/cout, oppure voler acquisire tali dati da un file.

    I metodi: Set/Get condensatore non dicono nulla. Hai due valori da impostare/leggere: la carica e la ddp. Più esplicativo è: Set/Get carica, Set/Get ddp. In questo modo puoi variare solo uno dei parametri in modo indipendente dall'altro senza che vengano richiesti ogni volta come succede ora.

    Non controlli se il denominatore della frazione è zero ed è un caso che può succedere.

    Dulcis in fundo, \u0394 è un code point unicode che cout non può gestire.

    Stessa cosa per la classe resistenza.

    P.S.
    Le variabili membro sono pubbliche, cosa di per se non grave se il prof non ha nulla da dire al riguardo, ma nell'ottica della programmazione OOP (pedante) dovrebbero essere almeno protected altrimenti non hanno senso i setter/getter.

    P.P.S
    Ovviamente i valori memorizzati devono essere positivi, il che significa che se viene inserito un valore negativo dev'essere convertito in positivo.
  • Re: Esercizio in C++

    Queste cose avanzate ancora non le abbiamo fatte... Diciamo che quello che facciamo in classe è un lavoro più base...
    Il controllo del denominatore mi è sfuggito, grazie, lo sistemerò.
    Per quanto riguarda i caratteri speciali, mi conviene usare quelli semplici? Tipo al posto di delta metto la D?
    Invece per i valori positivi, ricordo che c'era una "funzione" per prendere il valore assoluto, giusto?
  • Re: Esercizio in C++

    Beh, non c'è niente di avanzato. Acquisisci/stampi nel main e imposti/recuperi i dati con due distinti setter e getter.
    Si, per il momento si anche se non servirebbe dato che la tensione è già un delta tra due valori. Comunque è una scelta tua.
    Per i valori positivi float c'è fabs().
  • Re: Esercizio in C++

    Perfetto grazie.
    Ritornando al discorso Array, non ho capito come dovrei strutturarlo, prendendo per esempio solo la classe condensatore, l'array dove devo andarlo a creare? Dovrei crearlo assieme ad un ciclo for nel main per gli inserimenti dei due dati del condensatore, corretto?
  • Re: Esercizio in C++

    L'array lo crei dove ti serve, in questo caso nel main. L'uso del for o no dipende da quanti elementi prevedi di usare. Se ti servono al massimo solo tre elementi in tutto il codice puoi creare/usare un array senza ricorrere a un for, se sono 4 o più allora conviene il for, ma non c'è una regola precisa. Può anche darsi che per il momento possano bastare solo due elementi, ma in seguito ne servano 14. In questo caso si usa direttamente il for perché il progetto prevede un'estensione degli elementi. Insomma è una questione euristica. Intanto puoi comunque usare un for e vedere come si evolve la cosa, al massimo resta così com'è.
  • Re: Esercizio in C++

    Buongiorno, dovrei aver apportato tutte le correzioni che mi hai indicato; ho tolto momentaneamente la classe resistenza, dato che era una copia della classe condensatore, in modo da lavorare con meno elementi...
    #include <iostream>
    #include <cmath> 
    using namespace std;
    class condensatore{
    	public:
    		double Formula();
    		void GetCondensatore();
    		void SetCondensatore();
    	private:
    		double CaricaAccumulata;
    		double DifferenzaPotenziale;
    };
    double condensatore::Formula(){
    	return (abs(condensatore::CaricaAccumulata)/abs(condensatore::DifferenzaPotenziale));
    }
    void condensatore::SetCondensatore(){
    	double carica, differenza;
    	cout<<"\nQ:";cin>>carica;
    	do { cout<<"\nV: ";cin>>differenza;
    	} while(differenza==0);
    	CaricaAccumulata=carica;
    	DifferenzaPotenziale=differenza;
    }
    void condensatore::GetCondensatore(){
    	cout <<"\nQ= "<< abs(CaricaAccumulata);
    	cout <<"\nV= "<< abs(DifferenzaPotenziale);
    	cout <<"\n----------------";
    }
    
    main(){
        for(int i=0; i<3;i++){
        	condensatore C;
        		cout<<"\nImetti i valori:";
        		C.SetCondensatore();
        		cout<<"\nSono stati inseriti i seguenti valori:";
        		C.GetCondensatore();
        		cout<<"\nLa Capacita' del condensatore e' pari a: "<<C.Formula()<<"\b F.";
       }
    }
    volevo chiederti.. una volta aggiunto il ciclo for per l'inserimento dei condensatori, essi diventano dei dati stampati li e basta, come faccio poi a collegarli tra loro, nel senso fare delle operazioni matematiche? a questo si aggiunge una piccola idea che mi era venuta in mente, ovvero la possibilità da parte dell'utente, di specificare se questi condensatori e resistenze si trovano in serie o in parallelo..
    Secondo me potrei dare questa possibilità attraverso uno switch nelle due casistiche con annesse operazioni, è una cosa fattibile? o ci sono altri metodi più semplici?
  • Re: Esercizio in C++

    Immagino che tu conosca la teoria che sta dietro a tutto questo.
    Se la conosci allora saprai che non è proprio così semplice come può sembrare.
    Se non la conosci allora non hai le basi per affrontare la questione.
    Per le operazioni matematiche semplici puoi scrivere due funzioni serie e parallelo, porre un flag nella classe che specifichi se il componente va considerato parallelo o serie a un altro e agire di conseguenza, tenendo presente che i paralleli hanno precedenza sulle serie.
    Ma questi sono solo gli scavi delle fondamenta.

    P.S.
    Corretto post
  • Re: Esercizio in C++

    Va bene grazie, ora mi metto a lavoro.
  • Re: Esercizio in C++

    Allora, ho letto un po di teoria su internet, e ho deciso di ricominciare da capo la programmazione, volendo anche fare qualcosa di più "semplice". questo è il risultato.
    #include <iostream>
    #include <cmath>
    using namespace std;
    class condensatore{
    	public:
    		double GetCarica(){
    				return carica;
    		};
    		void SetCarica(double carica){
    			this->carica = carica;
    		};
    		double GetVoltaggio(){
    			return voltaggio;
    		};
    		void SetVoltaggio(double voltaggio){
    			this->voltaggio = voltaggio;
    		};
    		double GetCapacita(){
    			return carica/voltaggio;
    		};
    		double carica;
    		double voltaggio;
    };
    
    int main(){
    double voltaggio;
    	condensatore c[3];
        		cout<<"\nVoltaggio del circuito in PARALLELO:";    	
        		cin>>voltaggio;
    		    for(int i=0; i<3;i++){
    				cout<<"\nCarica del Condensatore "<<i<<": ";
    				double carica;
          		  	cin>>carica;
          		  	c[i].SetCarica(carica);
          		  	
    				c[i].SetVoltaggio(voltaggio);
        double CaricaTotale=0;
        	for (int i=0; i<3; i++){
           	 	CaricaTotale += c[i].GetCarica();
       		}
    
        cout<<"\nC="<<abs(CaricaTotale)/abs(voltaggio);
       }
    }
    se è tutto fatto in modo corretto, dovrei poter iniziare a creare la classe resistenza, nella quale dovrei usare la medesima struttura di questa classe, corretto?
  • Re: Esercizio in C++

    L'approccio con i getter/setter è quello corretto (uno per ogni variabile membro), acquisizione/stampa dei valori sono nel main. Direi che per il momento va bene.

    Però se io volessi inserire un valore di 1 microFarad che dovrei fare?
    Cioè davvero ti aspetti che dovrei calcolare a mano il valore di carica e tensione per ottenere 1 microFarad?

    In altre parole invece di C = Q/V dovresti fare Q = C x V.
Devi accedere o registrarti per scrivere nel forum
16 risposte