C++ Programmierung

Neue Frage »

Auf diesen Beitrag antworten »
Jassy C++ Programmierung

Meine Frage:
Hallo ich habe gerade probleme bei einer Aufgabe:

Header file:

#include<iostream>
#include <string>

using namespace std;


class CMeasValue{

private:
double m_value;
int m_exp;
string m_baseUnit;

public:
CMeasValue(double value = 0.0 ,int exp = 0,string baseUnit= " " );
int getExp();

void setBaseUnit(string baseUnit);
bool setMeasValue(double value,int exp);
double getMeasValue( int exp);
friend ostream& operator << (ostream& out, CMeasValue& rop);







};



Cpp File:

#include<iostream>
#include <string>
#include "_SS.h"

using namespace std;

CMeasValue::CMeasValue( double value, int exp , string baseUnit){

m_baseUnit = baseUnit;

if( exp%3 == 0){
m_exp = exp;
m_value = value;

}



else{

m_exp = 0;
m_value = 0.0;



}




}

int CMeasValue:: getExp(){

return m_exp;


}

void CMeasValue::setBaseUnit(string baseUnit){

m_baseUnit = baseUnit;

}
bool CMeasValue::setMeasValue(double value,int exp){
if( exp%3 == 0){
m_exp = exp;
m_value = value;
return true;

}



else{


return false;



}


};


double CMeasValue::getMeasValue(int exp){







}

Aufgabenstelleung:

Die Zusicherung lautet :
{m_exp%3==0}

Implementieren Sie die getMeasValue()-Methode. Diese Methode wandelt den im Objekt
gespeicherten Messwert m_value *10^m_exp in die durch den Parameter exp übergebene
Größenordnung um und liefert das Ergebnis zurück. Dabei werden die Werte von m_value
und m_exp nicht verändert. Der Parameter exp muss demzufolge auch die Zusicherung von
m_exp nicht einhalten.

Habt ihr tipps für mich wie ich die Methode implementieren kann ?

Im moment fehlt bei mir leider die Idee.


Meine Ideen:
gepostet
 
Auf diesen Beitrag antworten »
eulerscheZahl

Bevor du dich ans Programmieren machst, muss dir klar sein, was du tust.
Hast du die Mathematik verstanden, die in dieser Aufgabe von dir gefordert wird?
Wenn ja, nach welcher Formel lässt sich der Rückgabewert errechnen?
Auf diesen Beitrag antworten »
Jassy

Allgemeine Formel

m_value*10^{m_exp}

Mathematisch muss ich doch jetzt so rechnen:

m_value*10^{m_exp*(-1)} oder?

Mein prolem ist jetzt ein wenig das als code zu schreiben .

Bei der get Methode muss man ja hauptsächlich return benutzen oder?
Aber ich habe trotzdem ein wenig probleme beim implementieren.

Hast du tipps?
Auf diesen Beitrag antworten »
eulerscheZahl

So, wie ich die Aufgabe verstanden habe:
[latex]\text{m{\_}value} \cdot 10^{\text{m{\_}exp}} = \text{value} \cdot 10^{\text{exp}}[/latex], wobei value ausgegeben werden soll.
[latex]\text{value} = \text{m{\_}value} \cdot 10^{\text{m{\_}exp - exp}}[/latex]
in C++ dann also:
code:
1:
2:
3:
4:
5:
#include <cmath>

double CMeasValue::getMeasValue(int exp){
    return m_value * pow(10, m_exp - exp);
}


ach ja: schreibe mal bei deinem Header in die erste Zeile #pragma once, damit stellst du sicher, dass der Header nur einmal eingebunden wird.
 
Auf diesen Beitrag antworten »
Jassy

Was bewirkt denn dieses pow ?

m_exp - exp Und warum subtrahierst du hier?
Auf diesen Beitrag antworten »
eulerscheZahl

pow(basis, exponent) entspricht [latex]\text{basis}^\text{exponent}[/latex].

Ich habe die Potenzgesetze verwendet, genau genommen das fünfte in der Auflistung der Wikipedia.
[latex]\text{m{\_}value} \cdot 10^{\text{m{\_}exp}} = \text{value} \cdot 10^{\text{exp}} | : 10^{\text{exp}} [/latex]
[latex]\text{m{\_}value}\cdot \frac{10^{\text{m{\_}exp}}}{10^{\text{exp}}} = \text{value}[/latex]
[latex]\text{m{\_}value}\cdot 10^{\text{m{\_}exp-exp}} = \text{value}[/latex]
[latex]\text{value} = \text{m{\_}value}\cdot 10^{\text{m{\_}exp-exp}}[/latex]
Auf diesen Beitrag antworten »
Jassy

Kannst du mir erklären warum die exponenten subtrahiert werden sollen für die Aufgabe ?
Auf diesen Beitrag antworten »
eulerscheZahl

Ich dachte, das hätte ich verwirrt
Ich versuche es mit einem Beispiel:
code:
1:
2:
3:
CMeasValue myvalue;
myvalue.setMeasValue(1.53, 6);
double d = myvalue.getMeasValue(5)

[latex]1,53 \cdot 10^6 = 15,3 \cdot 10^5[/latex]
diese 15,3 werden nach Ausführung dieser Zeilen in der Variablen d stehen.
Auf diesen Beitrag antworten »
Jassy

Ich verstehe leider nur noch nicht , warum sich das Komma verschoben hat?
Auf diesen Beitrag antworten »
eulerscheZahl

Weil sich gleichzeitig die Zehnerpotenz geändert hat.
[latex]1,53 \cdot 10^6 = 1,53 \cdot 10^{1+5} = 1,53 \cdot 10^1 \cdot 10^5  = 1,53 \cdot 10 \cdot 10^5  = (1,53 \cdot 10) \cdot 10^5 = 15,3 \cdot 10^5[/latex]
Auf diesen Beitrag antworten »
Jassy

Aha jetzt verstehe ich es . Aber bei diesem Beispiel wenn die exponenten ja addiert .

Aber in dem Code wird ja subtrahiert .

Das verstehe ich jetzt nicht so ganz .
Tut mir leid , dass ich das so schwer verstehe .
Auf diesen Beitrag antworten »
Jassy

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
#include<iostream>
#include <string>
#include "SS.h"
#include <cmath>

using namespace std;

CMeasValue::CMeasValue( double value, int exp , string baseUnit){

	m_baseUnit = baseUnit;

	if( exp%3 == 0){
		m_exp = exp;
		m_value = value;

	}



		else{

			m_exp = 0;
			m_value = 0.0;



	}




}

int CMeasValue:: getExp(){

	return m_exp;


}

void CMeasValue::setBaseUnit(string baseUnit){

	m_baseUnit = baseUnit;

}
bool CMeasValue::setMeasValue(double value,int exp){
	if( exp%3 == 0){
			m_exp = exp;
			m_value = value;
			return true;

		}



			else{


				return false;



		}


};


double CMeasValue::getMeasValue(int exp){


	 return m_value * pow(10, m_exp - exp);




}


Mir werden folgender fehler angezeigt:
Description Resource Path Location Type
'pow' is ambiguous '
Wie kann ich den fehler beheben ?

Und jetzt habe ich auch noch bei folgender Aufgabe probleme:
Erweitern Sie das main Programm, indem Sie das Beispiel aus f) mit Hilfe der Methode
getMeasValue() programmieren. Erzeugen Sie dazu ein neues Messwert-Objekt test mit
den entsprechenden Parameterwerten und zeigen Sie sowohl das Messwert-Objekt als auch
das Ergebnis der Umrechnung (mit Einheit) auf dem Bildschirm an (siehe Beispiel unten).
MeasValue@0012FF28: 0*10^0

Ich habs versucht so zu testen :

#include <iostream>
using namespace std;
#include "GIT_SS11.h"

int main(){


test.getMeasValue(0);

Aber ich kann hier nur einen Parameter geben ?

Tipps?





}
Auf diesen Beitrag antworten »
eulerscheZahl

Nochmal zur Berechnung:
Mit setMeasValue(1.53, 6) wird die Zahl 1,53*10^6 erzeugt.
Mit getMeasValue(5) wird der Teil vor der Zehnerpotenz (also das x von x*10^5) ausgegeben.
[latex]1,53 \cdot 10^6 = x \cdot 10^5[/latex]
[latex]1,53 \cdot 10^6 : 10^5 = x[/latex]
[latex]1,53 \cdot 10^{6-5} = x[/latex]
[latex]1,53 \cdot 10^1 = x[/latex]
[latex]15,3 = x[/latex]
[latex]x = 15,3[/latex]

Zitat:
Mir werden folgender fehler angezeigt:
Description Resource Path Location Type
'pow' is ambiguous '
Wie kann ich den fehler beheben ?

Da weiß ich nicht weiter. Du kannst versuchen, #include <cmath> durch #include <math.h> zu ersetzen, aber das würde das Problem nur umgehen, nicht lösen.

Zur Testfunktion:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
int main()
{
	CMeasValue myvalue;
	myvalue.setMeasValue(1.53, 6);
	double d = myvalue.getMeasValue(5);
	cout << myvalue << "   =" << d << "*10^5\n";
	return 0;
}

//Ausgabe:
//MeasValue@0x28fee0: 1.53*10^6
//   =15.3*10^5


Damit das funktioniert, musst du natürlich erst die Operatorüberladung implementieren.
Auf diesen Beitrag antworten »
Jassy

Warum hast du als ersten Schritt CMeasValule my value;

Geschrieben ?

Kannst du mir erklären wie man das mit der Operator Überladung macht ?
Auf diesen Beitrag antworten »
eulerscheZahl

Um eine Instanz der Klasse CMeasValue zu erstellen.

code:
1:
2:
3:
4:
ostream& operator << (ostream& out, CMeasValue& rop)
{
	out << "MeasValue@" << &rop << ": " << rop.m_value << "*10^" << rop.m_exp << rop.m_baseUnit << endl;
}
Auf diesen Beitrag antworten »
Jassy

Hallo euler ich benutze eclipse .

Warum werden mir diese Fehler angezeigt:

Description Resource Path Location Type
No return, in function returning non-void ss.cpp /SS11T1 line 76 Code Analysis Problem
Description Resource Path Location Type
'pow' is ambiguous '

Und hast du keine Idee wie ich die pow meldung beseitigen kann?

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
#include<iostream>
#include <string>
#include "SS.h"
#include <math.h>

using namespace std;

CMeasValue::CMeasValue( double value, int exp , string baseUnit){

	m_baseUnit = baseUnit;

	if( exp%3 == 0){
		m_exp = exp;
		m_value = value;

	}



		else{

			m_exp = 0;
			m_value = 0.0;



	}




}

int CMeasValue:: getExp(){

	return m_exp;


}

void CMeasValue::setBaseUnit(string baseUnit){

	m_baseUnit = baseUnit;

}
bool CMeasValue::setMeasValue(double value,int exp){
	if( exp%3 == 0){
			m_exp = exp;
			m_value = value;
			return true;

		}



			else{


				return false;



		}


};
ostream& operator << (ostream& out, CMeasValue& rop)
{
	out << "MeasValue@" << &rop << ": " << rop.m_value << "*10^" << rop.m_exp << rop.m_baseUnit << endl;
}

double CMeasValue::getMeasValue(int exp){


	 return m_value * pow(10, m_exp - exp);




}



Da ich ja leider noch ANfänger bin muss ich nochmal nachfragen :

double d = test.getMeasValue(5)

Warum muss ich das machen ?

Warum schreibt man z.B links double hin?

In meiner Implementierung steht ja ( int exp)

Das verstehe ich nicht .

Wird der methode nun in der main.cpp durch double geändert oder wie?
Auf diesen Beitrag antworten »
eulerscheZahl

zu pow():
ich glaube, ich kenne die Ursache: es gibt mehrere Überladungen für pow, aber kein pow(int, int).
Du kannst wieder <cmath> verwenden und versuche in der Funktion:
pow(10.0, (double)(m_exp - exp)), das sollte es tun.

double d = test.getMeasValue(5);
getMeasValue gibt ein double zurück, also braucht man auch eine Variable vom Typ double, um das Ergebnis zu speichern.
Alternativ:
code:
1:
2:
double d;
d = test.getMeasValue(5);
Auf diesen Beitrag antworten »
Jassy

Gibt es eigentlich einen anderen Weg außer POW die Methode zu implementieren ?
Auf diesen Beitrag antworten »
Jassy

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
#include<iostream>
#include <string>
#include "SS.h"
#include <cmath>

using namespace std;

CMeasValue::CMeasValue( double value, int exp , string baseUnit){

	m_baseUnit = baseUnit;

	if( exp%3 == 0){
		m_exp = exp;
		m_value = value;

	}



		else{

			m_exp = 0;
			m_value = 0.0;



	}




}

int CMeasValue:: getExp(){

	return m_exp;


}

void CMeasValue::setBaseUnit(string baseUnit){

	m_baseUnit = baseUnit;

}
bool CMeasValue::setMeasValue(double value,int exp){
	if( exp%3 == 0){
			m_exp = exp;
			m_value = value;
			return true;

		}



			else{


				return false;



		}


};

ostream& operator << (ostream& out, CMeasValue& rop)
{
	out << "MeasValue@" << &rop << ": " << rop.m_value << "*10^" << rop.m_exp << rop.m_baseUnit << endl;
}

double CMeasValue::getMeasValue(int exp){


	pow(10.0, (double)(m_exp - exp));




}




Mir werden jetzt nur noch 4 warnungen angezeigt:

Description Resource Path Location Type
no return statement in function returning non-void [-Wreturn-type] /SS11T1 line 80 C/C++ Problem

Description Resource Path Location Type
No return, in function returning non-void line 77 Code Analysis Problem
Description Resource Path Location Type
no return statement in function returning non-void [-Wreturn-type line 90 C/C++ Problem
Auf diesen Beitrag antworten »
eulerscheZahl

Ein wenig könntest du dann doch selbst nachdenken, wenn du das return weglässt, geht es freilich nicht.
code:
1:
2:
3:
4:
double CMeasValue::getMeasValue(int exp)
{
	 return m_value * pow(10.0, (double)(m_exp - exp));
}


Es gibt auch Alternativen zu pow:
wenn der Exponent wie hier ganzzahlig ist, kann man einfach eine Schleife nehmen (bei negativem Exponenten mit Betrag und das Ergebnis invertieren).

oder:
a^x = exp(x*ln(a))
Auf diesen Beitrag antworten »
Jassy

Ah alles klar danke.

Ich glaube der zweite Weg ist ein wenig komplizierter .

Ich probier noch bisschen die Aufgabe weiter und meld mich ein wenig später .

P:S Hoffe das du noch ein wenig on bist smile
Auf diesen Beitrag antworten »
Jassy

ostream& operator << (ostream& out, CMeasValue& rop)
{
out << "MeasValue@" << &rop << ": " << rop.m_value << "*10^" << rop.m_exp << rop.m_baseUnit << endl;
}


Hier wird mir allerdings immer noch eine Verwarnung angezeigt:

Description Resource Path Location Type
no return statement in function returning non-void [-Wreturn-type] line 80 C/C++ Problem
Auf diesen Beitrag antworten »
eulerscheZahl

Also, mein Compiler hat es geschluckt.
Dann eben so:
code:
1:
2:
3:
4:
5:
ostream& operator << (ostream& out, CMeasValue& rop)
{
	out << "MeasValue@" << &rop << ": " << rop.m_value << "*10^" << rop.m_exp << rop.m_baseUnit << endl;
	return out;
}
Auf diesen Beitrag antworten »
Jassy

Ja endlich keine fehler mehr.

Danke .

Warum hast du denn diesen Befehl in dem code:

rop.m_baseUnit;

Das verstehe ich leider nicht so ganz.
verwirrt
Auf diesen Beitrag antworten »
eulerscheZahl

Um der Aufgabenstellung gerecht zu werden
Zitat:
und zeigen Sie sowohl das Messwert-Objekt als auch
das Ergebnis der Umrechnung (mit Einheit) auf dem Bildschirm an
Auf diesen Beitrag antworten »
Jassy

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
#include<iostream>
#include <string>

using namespace std;


class CMeasValue{

private:
	double m_value;
	int m_exp;
	string m_baseUnit;

public:
	CMeasValue(double value =  0.0 ,int  exp = 0,string baseUnit= " " );
	int getExp();

	 void setBaseUnit(string baseUnit);
	 bool setMeasValue(double value,int exp);
	 double getMeasValue( int exp);
	 friend ostream& operator << (ostream& out, CMeasValue& rop);







};

class CMeasSeries : public CMeasValue{
private:
	CMeasValue* m_values;
	int m_maxValues;
	int m_curValues;
	string m_baseUnit;
	CMeasSeries(string baseUnit ="" , int maxValues = 10);
	CMeasSeries();
	bool put( double value, int exp, string baseUnit);
	bool getMaxValue(CMeasValue& maxMeasValue);
	void print();








};



Meinen neue header sieht so aus:

Muss jetzt eine neue Klasse implementieren :

Wie include ich das in die cpp?

So werden mir fehler angezeigt:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
#include<iostream>
#include <string>
#include "_SS.h"
#include <cmath>
#include"CMeasSeries.h"



using namespace std;

CMeasValue::CMeasValue( double value, int exp , string baseUnit){

	m_baseUnit = baseUnit;

	if( exp%3 == 0){
		m_exp = exp;
		m_value = value;

	}



		else{

			m_exp = 0;
			m_value = 0.0;



	}




}

int CMeasValue:: getExp(){

	return m_exp;


}

void CMeasValue::setBaseUnit(string baseUnit){

	m_baseUnit = baseUnit;

}
bool CMeasValue::setMeasValue(double value,int exp){
	if( exp%3 == 0){
			m_exp = exp;
			m_value = value;
			return true;

		}



			else{


				return false;



		}


};

ostream& operator << (ostream& out, CMeasValue& rop)
{
	out << "MeasValue@" << &rop << ": " << rop.m_value << "*10^" << rop.m_exp << rop.m_baseUnit << endl;
	return out;
}

double CMeasValue::getMeasValue(int exp){


	return m_value*pow(10.0, (double)(m_exp - exp));




}


#include"CMeasSeries.h"


Kann man das nicht so machen?
Auf diesen Beitrag antworten »
eulerscheZahl

Hast du einen Header inkludiert, den du vorher nicht angelegt hast?
Hier mein bisheriges Projekt:
Auf diesen Beitrag antworten »
Jassy

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
#ifndef _SS_H_
#define _SS_H_

#include<iostream>
#include <string>

using namespace std;


class CMeasValue{

private:
	double m_value;
	int m_exp;
	string m_baseUnit;

public:
	CMeasValue(double value =  0.0 ,int  exp = 0,string baseUnit= " " );
	int getExp();

	 void setBaseUnit(string baseUnit);
	 bool setMeasValue(double value,int exp);
	 double getMeasValue( int exp);
	 friend ostream& operator << (ostream& out, CMeasValue& rop);







};

class CMeasSeries : public CMeasValue{
private:
	CMeasValue* m_values;
	int m_maxValues;
	int m_curValues;
	string m_baseUnit;
	CMeasSeries(string baseUnit ="" , int maxValues = 10);
	CMeasSeries();
	bool put( double value, int exp, string baseUnit);
	bool getMaxValue(CMeasValue& maxMeasValue);
	void print();








};




Meine Header sieht so aus.

Habe ich einen Fehler gemacht ?

Oder warum erkennt er nicht die Header ?

In der cpp habe ich schon paar methoden implementiert :

Aufgabe:

Implementieren Sie den Konstruktor (bei Verletzung der Zusicherung den Default-Wert
setzen), den Destruktor und die print()-Methode. Die print()-Methode soll die Adresse
des Messreihen-Objektes, die maximale Anzahl zu speichernder Messwerte, die
Grundeinheit der Messreihe und die aktuell gespeicherten Messwerte zusammen mit ihrem
Index anzeigen. Falls keine Messwerte gespeichert sind, soll sie eine entsprechende
Meldung anzeigen (siehe Beispiel unten).

CMeasSeries@0012FE9C[50]:
leere Messreihe
CMeasSeries@0012FE9C[50]:
0: MeasValue@003467CC: 3.5*10^&#8208;3 V
1: MeasValue@003467FC: 500*10^&#8208;6 V
2: MeasValue@0034682C: 2.5*10^0 V
Maximalwert der Messreihe: MeasValue@0012FE6C: 2.5*10^0 V
Drücken Sie eine beliebige Taste . . .

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:

#include<iostream>
#include <string>
#include "SS.h"
#include <cmath>
#include"CMeasSeries.h"



using namespace std;

CMeasValue::CMeasValue( double value, int exp , string baseUnit){

	m_baseUnit = baseUnit;

	if( exp%3 == 0){
		m_exp = exp;
		m_value = value;

	}



		else{

			m_exp = 0;
			m_value = 0.0;



	}




}

int CMeasValue:: getExp(){

	return m_exp;


}

void CMeasValue::setBaseUnit(string baseUnit){

	m_baseUnit = baseUnit;

}
bool CMeasValue::setMeasValue(double value,int exp){
	if( exp%3 == 0){
			m_exp = exp;
			m_value = value;
			return true;

		}



			else{


				return false;



		}


};

ostream& operator << (ostream& out, CMeasValue& rop)
{
	out << "MeasValue@" << &rop << ": " << rop.m_value << "*10^" << rop.m_exp << rop.m_baseUnit << endl;
	return out;
}

double CMeasValue::getMeasValue(int exp){


	return m_value*pow(10.0, (double)(m_exp - exp));




}

CMeasSeries::CMeasSeries(string baseUnit  , int maxValues){
	if( 0 < maxValues ){

		m_maxValues = maxValues;
		m_baseUnit = baseUnit;

	}

	else {

		m_baseUnit ="";
		maxValues = 10;

	}
	CMeasSeries::CMeasSeries();





}



Erkennst du den Fehler?
Auf diesen Beitrag antworten »
eulerscheZahl

Mehrere.
code:
1:
2:
#ifndef _SS_H_
#define _SS_H_

wo ist dein #endif?
deshalb verwende ich #pragma once, das macht diese 3 Zeilen in einer.

Du hast CMeasValue und CMeasSeries im selben Header, vermutlich hast du nicht einmal einen CMeasSeries.h angelegt, dann kannst du ihn auch nicht einbinden.
Auf diesen Beitrag antworten »
Jassy

Das problem ist ich soll:

die Klasse CMeasSeries unter der Klasse
CMeasValue deklarieren .

Wie soll ich das dann richtig machen ?

wo ist dein #endif?

Das endif ist in meiner Header hatte ich aber vergessen in den Beitrag zu kopieren.

Verstehst du jetzt mein problem?
Auf diesen Beitrag antworten »
eulerscheZahl

Na, meinetwegen.
Aber wenn du keine zwei Header hast, kannst du keine 2 inkludieren.

siehe Anhang.
Auf diesen Beitrag antworten »
Jassy

aber wie erkennt er denn sonst die andere Klasse dann euler ?

Muss ich dann gar nichts machen?
Auf diesen Beitrag antworten »
eulerscheZahl

Im Header steht:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
class CMeasValue
{
//...
};

class CMeasSeries : public CMeasValue
{
//...
};


in der .cpp:
code:
1:
2:
3:
4:
5:
int CMeasValue:: getExp()
double CMeasValue::getMeasValue(int exp)

bool CMeasSeries::put( double value, int exp, string baseUnit)
bool CMeasSeries::getMaxValue(CMeasValue& maxMeasValue)

das ist doch eindeutig zuzuordnen.
Auf diesen Beitrag antworten »
Jassy

tut mir leid euler ,das ich vielleicht das so schwer verstehe.

Jetzt funktioniert es auch wieder.

Und danke für deine Geduld.

Hast du auch paar tipss für mich wie ich hier genau denken soll?

Die print()-Methode soll die Adresse
des Messreihen-Objektes, die maximale Anzahl zu speichernder Messwerte, die
Grundeinheit der Messreihe und die aktuell gespeicherten Messwerte zusammen mit ihrem
Index anzeigen.

WIe soll ich hier vorgehen?
Auf diesen Beitrag antworten »
eulerscheZahl

Bevor du etwas ausgeben kannst, solltest du dir Gedanken über das Befüllen mit Messwerten machen. Hast du da eine Funktion vorgegeben, oder sollst du die selbst schreiben?
Falls du etwas gegeben hast, kopiere es bitte hierher, das erspart mir die Arbeit.

Beim print musst du einfach für jeden der Messwerte mit cout << messwert etwas auf die Konsole pinseln.
Auf diesen Beitrag antworten »
Jassy

Es ist nur das Diagramm gegeben (UML)

m_values: CMeasValue*
-m_maxValues: int
{0<m_maxValues}
-m_curValues: int = 0
{0<=m_curValues<m_maxValues}
-m_baseUnit: string
+CMeasSeries(baseUnit:string="",maxValues:int=10)
+~CMeasSeries()
+put(value:double,exp:int,baseUnit:string): bool
+getMaxValue(maxMeasValue:CMeasValue&): bool
+print(): void

Mehr nicht.


Das Befüllen von Messwerten macht man doch mit this oder?
Auf diesen Beitrag antworten »
eulerscheZahl

Dann stammt
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
CMeasSeries::CMeasSeries(string baseUnit, int maxValues)
{
	if( 0 < maxValues )
	{
		m_maxValues = maxValues;
		m_baseUnit = baseUnit;
	}
	else
	{
		m_baseUnit = "";
		maxValues = 10;
	}
	CMeasSeries::CMeasSeries();
}

von dir?

Dann kann ich ja daran mäkeln smile
Es gibt keinen zweiten Konstruktor (ist auch überflüssig wegen der default-Werte).
Stattdessen gibt es laut deinem Klassendiagramm einen Destruktor.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
CMeasSeries::CMeasSeries(string baseUnit, int maxValues)
{
	if(maxValues > 0)
	{
		m_maxValues = maxValues;
		m_baseUnit = baseUnit;
	}
	else
	{
		m_baseUnit = "";
		maxValues = 10;
	}
// #include <cstdlib>
	m_values = (CMeasValue*)malloc(m_maxValues * sizeof(CMeasValue));
}

CMeasSeries::~CMeasSeries()
{
	free(m_values);
}
Auf diesen Beitrag antworten »
Jassy

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
CMeasSeries::CMeasSeries(string baseUnit, int maxValues)
{
	if(maxValues > 0)  Wieso hast du hier die Bedingung geändert?
	{
		m_maxValues = maxValues;
		m_baseUnit = baseUnit;
	}
	else
	{
		m_baseUnit = "";
		maxValues = 10;
	}

}

CMeasSeries::~CMeasSeries()
{
	free(m_values); // Muss man das hier schreiben ?
}
[/quote]

Fragen siehe code ?

Ich hoffe du bist noch nicht kaputt durch meine fragen.

Und tut mir leid warum machst du das hier?


// #include <cstdlib>
m_values = (CMeasValue*)malloc(m_maxValues * sizeof(CMeasValue));

Bitte um erklärung. smile
Auf diesen Beitrag antworten »
eulerscheZahl

Ich habe die Bedingung nicht wirklich geändert, nur rechts und links getauscht (finde ich so lesbarer).

Zitat:
Und tut mir leid warum machst du das hier?

Weil ich gerade nichts besseres zu tun habe - oder meinst du das malloc?

Das malloc mache ich, um für die Messwerte Speicherplatz zu schaffen, irgendwo müssen die ja hin.
Auf diesen Beitrag antworten »
Jassy

Könnte ich für m_value nicht auch so speicher anlegen mit new?

Weiss nicht ob ich es so richtig mach.

double *m_valueZeiger = new double;


Für was muss ich denn alles speicher anlegen?

Nur für messwerte?
 
Neue Frage »
Antworten »


Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »