C++ Programmierung |
07.12.2013, 13:03 | 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 |
||||||||||
|
|||||||||||
07.12.2013, 14:02 | 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? |
||||||||||
07.12.2013, 15:34 | 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? |
||||||||||
07.12.2013, 16:37 | Auf diesen Beitrag antworten » | ||||||||||
eulerscheZahl | So, wie ich die Aufgabe verstanden habe: , wobei value ausgegeben werden soll. in C++ dann also:
ach ja: schreibe mal bei deinem Header in die erste Zeile #pragma once, damit stellst du sicher, dass der Header nur einmal eingebunden wird. |
||||||||||
Anzeige | |||||||||||
|
|||||||||||
07.12.2013, 17:40 | Auf diesen Beitrag antworten » | ||||||||||
Jassy | Was bewirkt denn dieses pow ? m_exp - exp Und warum subtrahierst du hier? |
||||||||||
07.12.2013, 18:26 | Auf diesen Beitrag antworten » | ||||||||||
eulerscheZahl | pow(basis, exponent) entspricht . Ich habe die Potenzgesetze verwendet, genau genommen das fünfte in der Auflistung der Wikipedia. |
||||||||||
07.12.2013, 19:15 | Auf diesen Beitrag antworten » | ||||||||||
Jassy | Kannst du mir erklären warum die exponenten subtrahiert werden sollen für die Aufgabe ? |
||||||||||
07.12.2013, 19:25 | Auf diesen Beitrag antworten » | ||||||||||
eulerscheZahl | Ich dachte, das hätte ich Ich versuche es mit einem Beispiel:
diese 15,3 werden nach Ausführung dieser Zeilen in der Variablen d stehen. |
||||||||||
07.12.2013, 20:13 | Auf diesen Beitrag antworten » | ||||||||||
Jassy | Ich verstehe leider nur noch nicht , warum sich das Komma verschoben hat? |
||||||||||
07.12.2013, 20:22 | Auf diesen Beitrag antworten » | ||||||||||
eulerscheZahl | Weil sich gleichzeitig die Zehnerpotenz geändert hat. |
||||||||||
07.12.2013, 20:56 | 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 . |
||||||||||
07.12.2013, 22:44 | Auf diesen Beitrag antworten » | ||||||||||
Jassy |
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? } |
||||||||||
08.12.2013, 07:03 | 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.
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:
Damit das funktioniert, musst du natürlich erst die Operatorüberladung implementieren. |
||||||||||
08.12.2013, 12:05 | 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 ? |
||||||||||
08.12.2013, 12:16 | Auf diesen Beitrag antworten » | ||||||||||
eulerscheZahl | Um eine Instanz der Klasse CMeasValue zu erstellen.
|
||||||||||
08.12.2013, 14:18 | 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?
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? |
||||||||||
08.12.2013, 16:04 | 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:
|
||||||||||
08.12.2013, 16:08 | Auf diesen Beitrag antworten » | ||||||||||
Jassy | Gibt es eigentlich einen anderen Weg außer POW die Methode zu implementieren ? |
||||||||||
08.12.2013, 16:20 | Auf diesen Beitrag antworten » | ||||||||||
Jassy |
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 |
||||||||||
08.12.2013, 16:23 | Auf diesen Beitrag antworten » | ||||||||||
eulerscheZahl | Ein wenig könntest du dann doch selbst nachdenken, wenn du das return weglässt, geht es freilich nicht.
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)) |
||||||||||
08.12.2013, 16:28 | 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 |
||||||||||
08.12.2013, 16:31 | 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 |
||||||||||
08.12.2013, 16:33 | Auf diesen Beitrag antworten » | ||||||||||
eulerscheZahl | Also, mein Compiler hat es geschluckt. Dann eben so:
|
||||||||||
08.12.2013, 16:37 | 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. |
||||||||||
08.12.2013, 16:39 | Auf diesen Beitrag antworten » | ||||||||||
eulerscheZahl | Um der Aufgabenstellung gerecht zu werden
|
||||||||||
08.12.2013, 16:55 | Auf diesen Beitrag antworten » | ||||||||||
Jassy |
Meinen neue header sieht so aus: Muss jetzt eine neue Klasse implementieren : Wie include ich das in die cpp? So werden mir fehler angezeigt:
#include"CMeasSeries.h" Kann man das nicht so machen? |
||||||||||
08.12.2013, 17:20 | Auf diesen Beitrag antworten » | ||||||||||
eulerscheZahl | Hast du einen Header inkludiert, den du vorher nicht angelegt hast? Hier mein bisheriges Projekt: |
||||||||||
08.12.2013, 17:26 | Auf diesen Beitrag antworten » | ||||||||||
Jassy |
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^‐3 V 1: MeasValue@003467FC: 500*10^‐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 . . .
Erkennst du den Fehler? |
||||||||||
08.12.2013, 17:34 | Auf diesen Beitrag antworten » | ||||||||||
eulerscheZahl | Mehrere.
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. |
||||||||||
08.12.2013, 17:39 | 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? |
||||||||||
08.12.2013, 17:44 | Auf diesen Beitrag antworten » | ||||||||||
eulerscheZahl | Na, meinetwegen. Aber wenn du keine zwei Header hast, kannst du keine 2 inkludieren. siehe Anhang. |
||||||||||
08.12.2013, 17:47 | Auf diesen Beitrag antworten » | ||||||||||
Jassy | aber wie erkennt er denn sonst die andere Klasse dann euler ? Muss ich dann gar nichts machen? |
||||||||||
08.12.2013, 17:50 | Auf diesen Beitrag antworten » | ||||||||||
eulerscheZahl | Im Header steht:
in der .cpp:
das ist doch eindeutig zuzuordnen. |
||||||||||
08.12.2013, 17:58 | 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? |
||||||||||
08.12.2013, 18:04 | 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. |
||||||||||
08.12.2013, 18:11 | 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? |
||||||||||
08.12.2013, 18:21 | Auf diesen Beitrag antworten » | ||||||||||
eulerscheZahl | Dann stammt
von dir? Dann kann ich ja daran mäkeln Es gibt keinen zweiten Konstruktor (ist auch überflüssig wegen der default-Werte). Stattdessen gibt es laut deinem Klassendiagramm einen Destruktor.
|
||||||||||
08.12.2013, 18:31 | Auf diesen Beitrag antworten » | ||||||||||
Jassy |
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. |
||||||||||
08.12.2013, 18:35 | Auf diesen Beitrag antworten » | ||||||||||
eulerscheZahl | Ich habe die Bedingung nicht wirklich geändert, nur rechts und links getauscht (finde ich so lesbarer).
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. |
||||||||||
08.12.2013, 18:44 | 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? |
|
Verwandte Themen
Die Beliebtesten » |
|
Die Größten » |
|
Die Neuesten » |
|