Ostream Ausgabe |
chatter unregistriert
|
|
Hallo Guten Tag kann mir jemand erklären wie ich bei der a) die ostream Ausgabe machen soll?
Wie macht man das ?
Die Rumpf implementierungen sehen so aus.
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:
|
#ifndef MYCODE_CJULIANDATE_H_
#define MYCODE_CJULIANDATE_H_
#include <string>
/**
* Diese Klasse repräsentiert ein Julianisches Datum ohne Uhrzeit.
*/
class CJulianDate {
private:
long m_days;
/**
* Formatiert die übergebene Tagesnummer (1-31) wie folgt: Ist die Zahl
* einstellig, wird ein Leerzeichen vorangestellt (3 --> " 3"). Stimmt
* die Zahl mit dem Tag des von diesem Objekt repräsentierten
* gregorianischen Datums überein, wird das Ergebnis mit eckigen
* Klammern umgeben ("10" --> "[10]"), sonst werden am Anfang und
* am Ende je ein Leerzeichen ergänzt ("10" --> " 10 ").
*/
std::string formatDayNumber (short day) const;
public:
/**
* Erzeugt ein neues Objekt mit dem angegebenen Julianischen Datum.
*/
CJulianDate(long date = 0);
/**
* Erzeugt ein neues Objekt, dessen Wert aus dem angegebene Gregorianische Datum
* berechnet wird.
*
* - year: das Jahr
* - month: der Monat (Januar = 1)
* - day: der Tag (erster Tag eines Monats: 1)
*/
CJulianDate(int year, short month, short day);
/**
* Liefert das Julianische Datum (Tage seit dem 1. Januar -4712 (4713 v. Chr)).
*/
long getJulianDate() const;
/**
* Übernimmt das angegebene Julianische Datum.
*/
void setJulianDate(long date);
/**
* Liefert den aktuallen Wert als Gregorianisches Datum.
*
* - year: das Jahr
* - month: der Monat (Januar = 1)
* - day: der Tag (erster Tag eines Monats: 1)
*/
void toGregorianDate(int& year, short& month, short& day) const;
/**
* Konvertiert und übernimmt das angegebene Gregorianische Datum.
*
* - year: das Jahr
* - month: der Monat (Januar = 1)
* - day: der Tag (erster Tag eines Monats: 1)
*/
void fromGregorianDate(int year, short month, short day);
/**
* Liefert den Wochentag zu dem aktuellen Datum (Montag = 1).
*/
int dayOfWeek() const;
/**
* Liefert den Namen des Wochentags zu dem aktuellen Datum (Montag = 1).
*/
std::string dayOfWeekAsName() const;
/**
* Addiert die angegebene Anzahl Tage zu diesem Julianischen Datum hinzu.
*/
CJulianDate& operator+= (long days) {
m_days += days;
return *this;
}
/**
* Vergleicht zwei Julianische Daten und liefert true, wenn das als
* linker Operand angegebene Datum vor dem als rechter Operand
* angegebenen liegt.
*/
bool operator< (const CJulianDate& rhs) const;
};
#endif /* MYCODE_CJULIANDATE_H_ */
|
|
cpp
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:
|
#include "CJulianDate.h"
#include <cstdio>
//===============================================
// Ergänzen Sie Ihren Code am Ende dieser Datei!
//===============================================
CJulianDate::CJulianDate(long date) {
m_days = date;
}
CJulianDate::CJulianDate(int year, short month, short day) {
fromGregorianDate(year, month, day);
}
long CJulianDate::getJulianDate() const {
return m_days;
}
void CJulianDate::setJulianDate(long date) {
m_days = date;
}
void CJulianDate::toGregorianDate(int& year, short & month, short & day) const {
long i, j, k, l, n;
l = m_days + 68569;
n = 4 * l / 146097;
l = l - (146097 * n + 3) / 4;
i = 4000 * (l + 1) / 1461001;
l = l - 1461 * i / 4 + 31;
j = 80 * l / 2447;
k = l - 2447 * j / 80;
l = j / 11;
j = j + 2 - 12 * l;
i = 100 * (n - 49) + i + l;
year = i;
month = j;
day = k;
}
void CJulianDate::fromGregorianDate(int year, short month, short day) {
m_days = day - 32075 + 1461 * (year + 4800 + (month - 14) / 12) / 4
+ 367 * (month - 2 - (month - 14) / 12 * 12) / 12
- 3 * ((year + 4900 + (month - 14) / 12) / 100) / 4;
}
int CJulianDate::dayOfWeek() const {
return (m_days % 7) + 1;
}
std::string CJulianDate::dayOfWeekAsName() const {
switch (dayOfWeek()) {
case 1:
return "Montag";
case 2:
return "Dienstag";
case 3:
return "Mittwoch";
case 4:
return "Donnerstag";
case 5:
return "Freitag";
case 6:
return "Samstag";
case 7:
return "Sonntag";
default:
return "(Fehler)";
}
}
std::string CJulianDate::formatDayNumber(short day) const {
char buffer[5];
int year;
short month;
short refDay;
toGregorianDate(year, month, refDay);
sprintf(buffer, day == refDay ? "[%2d]" : " %2d ", day);
return std::string(buffer);
}
bool CJulianDate::operator <(const CJulianDate& rhs) const {
return m_days < rhs.m_days;
}
//=====================================================
// Ergänzen Sie Ihren Code unterhalb dieses Kommentars
//=====================================================
|
|
Die oberen Codes wurden uns gegeben .
Wie gestalte ich jetzt die Ostream Ausgabe?
chatter hat dieses Bild (verkleinerte Version) angehängt:
|
|
26.02.2017 15:24 |
|
|
chatter unregistriert
|
|
Habe einen kleinen Ansatz:
Habe das Im Header implementiert für die a)
ostream& operator << (ostream& lop, const CJulianDate& rhs);
};
cpp
code: |
1:
2:
3:
4:
5:
6:
7:
8:
9:
|
ostream& operator << (ostream& lop, const CJulianDate& rhs){
lop<< rhs.dayOfWeek() << " , " << rhs.formatDayNumber(short day) << " ." endl;
}
|
|
Welche Funktion rufe ich für Tag ,monat und Jahr auf ?
Es gibt ja viele ?
|
|
27.02.2017 16:30 |
|
|
chatter unregistriert
|
|
GIbt es hier noch Helfer?
|
|
03.03.2017 11:31 |
|
|
|
Du hast dir einen schlechten Zeitpunkt ausgesucht, es läuft gerade ein Wettbewerb.
Es ist möglich, auf private Felder zuzugreifen, wenn du ostream als friend deklarierst.
Siehe z.B. stackoverflow.
Alternativ kannst du der Klasse getter Funktionen hinzufügen, um so auf die Variablen zuzugreifen.
__________________ Syntax Highlighting fürs Board (Link)
|
|
03.03.2017 11:44 |
|
|
chatter unregistriert
|
|
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:
|
#ifndef MYCODE_CJULIANDATE_H_
#define MYCODE_CJULIANDATE_H_
#include <string>
/**
* Diese Klasse repräsentiert ein Julianisches Datum ohne Uhrzeit.
*/
class CJulianDate {
private:
long m_days;
/**
* Formatiert die übergebene Tagesnummer (1-31) wie folgt: Ist die Zahl
* einstellig, wird ein Leerzeichen vorangestellt (3 --> " 3"). Stimmt
* die Zahl mit dem Tag des von diesem Objekt repräsentierten
* gregorianischen Datums überein, wird das Ergebnis mit eckigen
* Klammern umgeben ("10" --> "[10]"), sonst werden am Anfang und
* am Ende je ein Leerzeichen ergänzt ("10" --> " 10 ").
*/
std::string formatDayNumber (short day) const;
public:
/**
* Erzeugt ein neues Objekt mit dem angegebenen Julianischen Datum.
*/
CJulianDate(long date = 0);
/**
* Erzeugt ein neues Objekt, dessen Wert aus dem angegebene Gregorianische Datum
* berechnet wird.
*
* - year: das Jahr
* - month: der Monat (Januar = 1)
* - day: der Tag (erster Tag eines Monats: 1)
*/
CJulianDate(int year, short month, short day);
/**
* Liefert das Julianische Datum (Tage seit dem 1. Januar -4712 (4713 v. Chr)).
*/
long getJulianDate() const;
/**
* Übernimmt das angegebene Julianische Datum.
*/
void setJulianDate(long date);
/**
* Liefert den aktuallen Wert als Gregorianisches Datum.
*
* - year: das Jahr
* - month: der Monat (Januar = 1)
* - day: der Tag (erster Tag eines Monats: 1)
*/
void toGregorianDate(int& year, short& month, short& day) const;
/**
* Konvertiert und übernimmt das angegebene Gregorianische Datum.
*
* - year: das Jahr
* - month: der Monat (Januar = 1)
* - day: der Tag (erster Tag eines Monats: 1)
*/
void fromGregorianDate(int year, short month, short day);
/**
* Liefert den Wochentag zu dem aktuellen Datum (Montag = 1).
*/
int dayOfWeek() const;
/**
* Liefert den Namen des Wochentags zu dem aktuellen Datum (Montag = 1).
*/
std::string dayOfWeekAsName() const;
/**
* Addiert die angegebene Anzahl Tage zu diesem Julianischen Datum hinzu.
*/
CJulianDate& operator+= (long days) {
m_days += days;
return *this;
}
/**
* Vergleicht zwei Julianische Daten und liefert true, wenn das als
* linker Operand angegebene Datum vor dem als rechter Operand
* angegebenen liegt.
*/
bool operator< (const CJulianDate& rhs) const;
};
ostream& operator << (ostream& lop, const CJulianDate& rhs); Hier richtig ?
#endif /* MYCODE_CJULIANDATE_H_ */
|
|
Jetzt habe ich den ostream ausserhalb der Klasse gebaut .
Was soll ich den im ostream für ne Funktion ausgeben ?
Abgekürzt ein wenig:
rhs.formatDayNumber(day,month,year);
Ich habe nur die zu veränderte Zeile gepostet
|
|
04.03.2017 09:31 |
|
|
Chatter unregistriert
|
|
|
06.03.2017 17:11 |
|
|
chatter unregistriert
|
|
Eulersche Zahl ? Noch da?
|
|
08.03.2017 23:50 |
|
|
chatter unregistriert
|
|
Es werden mir zu viele Fehler angezeigt
Description Resource Path Location Type
Member declaration not found CJulianDate.cpp /CJulian line 19 Semantic Error
Member declaration not found CJulianDate.cpp /CJulian line 23 Semantic Error
Member declaration not found CJulianDate.cpp /CJulian line 27 Semantic Error
Member declaration not found CJulianDate.cpp /CJulian line 31 Semantic Error
Type 'std::string' could not be resolved CJulianDate.h /CJulian line 21 Semantic Error
Member declaration not found CJulianDate.cpp /CJulian line 15 Semantic Error
die Regel für Ziel „CJulian“ scheiterte makefile /CJulian/Debug line 44 C/C++ Problem
Nicht definierter Verweis auf `main' CJulian C/C++ Problem
make: *** [CJulian] Fehler 1 CJulian C/C++ Problem
Method 'toGregorianDate' could not be resolved CJulianDate.cpp /CJulian line 103 Semantic Error
Symbol 'cout' could not be resolved main.cpp /CJulian line 9 Semantic Error
Method 'dayOfWeekAsName' could not be resolved CJulianDate.cpp /CJulian line 104 Semantic Error
Symbol 'endl' could not be resolved CJulianDate.cpp /CJulian line 104 Semantic Error
Field 'm_days' could not be resolved CJulianDate.cpp /CJulian line 93 Semantic Error
Type 'std::ostream' could not be resolved CJulianDate.cpp /CJulian line 100 Semantic Error
Symbol 'std' could not be resolved main.cpp /CJulian line 5 Semantic Error
Type 'std::ostream' could not be resolved CJulianDate.cpp /CJulian line 100 Semantic Error
Type 'CJulianDate' could not be resolved CJulianDate.cpp /CJulian line 100 Semantic Error
Type 'CJulianDate' could not be resolved main.cpp /CJulian line 8 Semantic Error
Type 'std::ostream' could not be resolved CJulianDate.h /CJulian line 94 Semantic Error
Type 'std::string' could not be resolved CJulianDate.cpp /CJulian line 81 Semantic Error
Member declaration not found CJulianDate.cpp /CJulian line 81 Semantic Error
Type 'std::string' could not be resolved CJulianDate.h /CJulian line 75 Semantic Error
Function 'string' could not be resolved CJulianDate.cpp /CJulian line 89 Semantic Error
Member declaration not found CJulianDate.cpp /CJulian line 92 Semantic Error
Type 'std::ostream' could not be resolved CJulianDate.h /CJulian line 94 Semantic Error
Member declaration not found CJulianDate.cpp /CJulian line 50 Semantic Error
Member declaration not found CJulianDate.cpp /CJulian line 56 Semantic Error
Type 'std::string' could not be resolved CJulianDate.cpp /CJulian line 60 Semantic Error
Member declaration not found CJulianDate.cpp /CJulian line 60 Semantic Error
Wieso kommen diese Fehler ?
|
|
10.03.2017 14:02 |
|
|
|
Die Fehler kann ich nicht nachvollziehen.
Was passiert, wenn du im Terminal in den entsprechenden Ordner gehst und dort g++ main.cpp CJulianDate.cpp schreibst?
Bei Aufgabe b) sollst du die Differenz zwischen zwei Daten bilden. Da kannst du dich am operator += orientieren, den du kopiert hast (nebenbei bemerkt gehört die nicht in den Header).
Aber da du operator - überladen sollst und nicht operator -=, wird this nicht verändert, sondern das Ergebnis als long zurückgegeben.
__________________ Syntax Highlighting fürs Board (Link)
|
|
10.03.2017 16:11 |
|
|
chatter unregistriert
|
|
icm muss eclipse benutzen .
Vielleicht liegt darin der Fehler ?
b)
CJulianDate& operator-= (long days) {
m_days -= days;
return *this;
}
Würde es einfach so passen ?
|
|
10.03.2017 16:36 |
|
|
|