Informatiker Board (http://www.informatikerboard.de/board/index.php)
- Themengebiete (http://www.informatikerboard.de/board/board.php?boardid=1)
-- Praktische Informatik (http://www.informatikerboard.de/board/board.php?boardid=6)
--- C++ Programmierung (http://www.informatikerboard.de/board/thread.php?threadid=1729)


Geschrieben von Jassy am 07.12.2013 um 13:03:

  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



Geschrieben von eulerscheZahl am 07.12.2013 um 14:02:

 

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?



Geschrieben von Jassy am 07.12.2013 um 15:34:

 

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?



Geschrieben von eulerscheZahl am 07.12.2013 um 16:37:

 

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.



Geschrieben von Jassy am 07.12.2013 um 17:40:

 

Was bewirkt denn dieses pow ?

m_exp - exp Und warum subtrahierst du hier?



Geschrieben von eulerscheZahl am 07.12.2013 um 18:26:

 

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]



Geschrieben von Jassy am 07.12.2013 um 19:15:

 

Kannst du mir erklären warum die exponenten subtrahiert werden sollen für die Aufgabe ?



Geschrieben von eulerscheZahl am 07.12.2013 um 19:25:

 

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.



Geschrieben von Jassy am 07.12.2013 um 20:13:

 

Ich verstehe leider nur noch nicht , warum sich das Komma verschoben hat?



Geschrieben von eulerscheZahl am 07.12.2013 um 20:22:

 

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]



Geschrieben von Jassy am 07.12.2013 um 20:56:

 

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 .



Geschrieben von Jassy am 07.12.2013 um 22:44:

 

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?





}



Geschrieben von eulerscheZahl am 08.12.2013 um 07:03:

 

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.



Geschrieben von Jassy am 08.12.2013 um 12:05:

 

Warum hast du als ersten Schritt CMeasValule my value;

Geschrieben ?

Kannst du mir erklären wie man das mit der Operator Überladung macht ?



Geschrieben von eulerscheZahl am 08.12.2013 um 12:16:

 

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;
}


Forensoftware: Burning Board, entwickelt von WoltLab GmbH