C++ Sprache

Neue Frage »

Auf diesen Beitrag antworten »
Victor C++ Sprache

Hallo alle zusammen .

Habe im Moment bei der g) mit der Print methode so meine Probleme.

Habe irgendwie das Gefühl das ich an die Grenzen meines Wissens gekommen bin .

Wie soll ich das ausgeben ?
Zeit: Dienstag, 14.2.2017

Ich habe es ein wenig probiert ,bin nicht sicher wie ich es machen soll?
Header


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:
    #ifndef MYCODE_CJULIANDATE_H_
#define MYCODE_CJULIANDATE_H_

#include <string>
#include<iostream>
using namespace std;


/**
 * Diese Klasse repr&#65533;sentiert ein Julianisches Datum ohne Uhrzeit.
 */
class CJulianDate {
private:
	long m_days;

	/**
	 * Formatiert die &#65533;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&#65533;sentierten
	 * gregorianischen Datums &#65533;berein, wird das Ergebnis mit eckigen
	 * Klammern umgeben ("10" --> "[10]"), sonst werden am Anfang und
	 * am Ende je ein Leerzeichen erg&#65533;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);

	CJulianDate(const CJulianDate& oldvariable);

	/**
	 * Liefert das Julianische Datum (Tage seit dem 1. Januar -4712 (4713 v. Chr)).
	 */
	long getJulianDate() const;

	/**
	 * &#65533;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;
	void prettyPrintMonth();
	/**
	 * Konvertiert und &#65533;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;
	friend ostream& operator << (ostream& lop, const CJulianDate& rhs);
	long operator-(const CJulianDate& other);
	void print();


};

#endif /* MYCODE_CJULIANDATE_H_ */
   



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:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:

#include "CJulianDate.h"
#include <cstdio>
#include<iostream>
using namespace std;
#include "CCalendarEntry.h"

//===============================================
// Erg&#65533;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&#65533;nzen Sie Ihren Code unterhalb dieses Kommentars
//=====================================================



ostream& operator << (ostream& lop, const CJulianDate& rhs){
	short day, month;
		int year;
		rhs.toGregorianDate(year, month, day);
		lop<< rhs.dayOfWeekAsName() << ", " << day << "." << month << "." << year << std::endl;
	return lop;

}

long CJulianDate::operator-(const CJulianDate& other){
	return this->m_days -other.m_days;
}
void CJulianDate::prettyPrintMonth(){
	CJulianDate current = CJulianDate(*this);
	int year;
	short month;
	short day;
	short printMonth = month;


	current.toGregorianDate( year,  month,  day);
	 current.fromGregorianDate(year,  month, 1);
	 current.dayOfWeekAsName();
	 current += -(current.dayOfWeek() - 1);
	 current.toGregorianDate(year, month, day);

	 while( month <= printMonth ){
		 if(month <printMonth){

		 cout << " " << " " << " " << " " << endl;


	 }
	 else {

		 current.formatDayNumber(day);
	 }

	 if(current.dayOfWeekAsName() == "Sonntag" ){
		 cout << endl;

	 }
	 current.operator +=(1);}
}

CJulianDate::CJulianDate(const CJulianDate& oldvariable){

	m_days = oldvariable.m_days;
}

void CJulianDate::print(){

	cout<< CJulianDate semesterBegin(2016,10,1) << " ," << CJulianDate semesterBegin(2017,14,2) <<CJulianDate semesterEnd(2017,3,31) << endl;

	    cout << "Dauer::" << "182 Tage" <<  endl;
 cout << "Zeit:" << m_days << " , " <<....... ?

 cout << "Ort:" << m_location <<endl;

 cout<< "Beschreibung:" << " " << "Git-Klausur" << endl;


	prettyPrintMonth();



}











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:


#ifndef MYCODE_CCALENDARENTRY_H_
#define MYCODE_CCALENDARENTRY_H_

#include <string>
#include "CJulianDate.h"

class CCalendarEntry {
private:
	CJulianDate m_date;
	std::string m_location;
	std::string m_description;

public:
	/**
	 * Setzt die Werte der Attribute f&#65533;r den Termin.
	 *
	 * Da der gregorianische Kalender erst am 15.10.1582 in Kraft trat, erfolgt
	 * eine Plausibilit&#65533;tspr&#65533;fung (Zusicherung). Liegt das &#65533;bergebene Datum vor
	 * dem 15.10.1582 werden die Daten nicht &#65533;bernommen (die Attribute bleiben
	 * unver&#65533;ndert) und es wird "false" zur&#65533;ckgegeben.
	 *
	 * - date: das Datum
	 * - location: der Ort
	 * - description: die Beschreibung
	 *
	 * R&#65533;ckgabewert: true, wenn die Daten &#65533;bernommen wurden.
	 */
	bool set(const CJulianDate& date, const std::string& location,
			const std::string& description);

	/**
	 * Liefert das Datum, zu dem der Termin stattfindet.
	 */
	const CJulianDate& getDate() const;

	/**
	 * Liefert den Ort, an dem der Termin stattfindet.
	 */
	const std::string& getLocation() const;

	/**
	 * Liefert die Beschreibung des Termins.
	 */
	const std::string& getDescription() const;

	/**
	 * Gibt den Termin wie folgt auf der Konsole aus:
	 *
	 * Zeit: <Attribut m_date im gregorianischen Format>
	 * Ort: <Attribut m_location>
	 * Beschreibung: <Attribut m_description>
	 */
	void print() const;
};

#endif /* MYCODE_CCALENDARENTRY_H_ */




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:

#include <iostream>		// Header f&#65533;r die Standard-IO-Objekte (z.B. cout, cin)
#include <stdlib.h>
#include "CJulianDate.h"
// F&#65533;gen Sie hier weitere ben&#65533;tigte Header-Dateien der
// Standard-Bibliothek ein z.B.
// #include <string>

using namespace std;	// Erspart den scope vor Objekte der
						// C++-Standard-Bibliothek zu schreiben
						// z.B. statt "std::cout" kann man "cout" schreiben

// Inkludieren Sie hier die Header-Files Ihrer Klassen, z.B.
// #include "CFraction.h"


// Hauptprogramm
// Dient als Testrahmen, von hier aus werden die Klassen aufgerufen
int main (void)
{
    CJulianDate semesterBegin(2016,10,1);
    CJulianDate semesterEnd(2017,3,31);
}







Fehlermeldungen:

Description Resource Path Location Type
die Regel für Ziel „CJulianDate/CCalenderEntry.o“ scheiterte subdir.mk /CJulianDate/Debug/CJulianDate line 24 C/C++ Problem
fatal error: CCalendarEntry.h: Datei oder Verzeichnis nicht gefunden CCalenderEntry.cpp /CJulianDate/CJulianDate line 16 C/C++ Problem
Function 'semesterBegin' could not be resolved CJulianDate.cpp /CJulianDate/CJulianDate line 158 Semantic Error
Function 'semesterBegin' could not be resolved CJulianDate.cpp /CJulianDate/CJulianDate line 158 Semantic Error
Function 'semesterEnd' could not be resolved CJulianDate.cpp /CJulianDate/CJulianDate line 158 Semantic Error
Invalid overload of 'endl' CJulianDate.cpp /CJulianDate/CJulianDate line 158 Semantic Error
make: *** [CJulianDate/CCalenderEntry.o] Fehler 1 CJulianDate C/C++ Problem
Member declaration not found CCalenderEntry.cpp /CJulianDate/CJulianDate line 21 Semantic Error
 
Auf diesen Beitrag antworten »
as_string

Da steht, er kann die CCalendarEntry.cpp nicht finden. Ich auch nicht...

Gruß
Marco
Auf diesen Beitrag antworten »
Victor

Hier sorry vergessen zu posten

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:

/*
 * CCalendarEntry.cpp
 *
 *  Created on: 04.02.2017
 *      Author: mnl
 */

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

const std::string& CCalenderEntry::getLocation(){

	return m_location;
}





Hast du tipps für mich?
Auf diesen Beitrag antworten »
Victor

Hast du irgendwelche Tipps ?
 
Auf diesen Beitrag antworten »
Victor

Hat jemand tipps wie die Print Ausgabe ausschauen soll?
Auf diesen Beitrag antworten »
Victor

???
Auf diesen Beitrag antworten »
as_string

Das ist ziemlich viel, was man sich da anschauen muss.
Also, was mir beim kurzen Anschauen auffällt:
Warum implementierst Du die print-Methode in CCJulianDate? Da steht, dass man das (unter Punktabzug) alternativ zur Implementierung der Operatorüberladung von << machen kann (bei der a)), das hat aber nichts mit der g) zu tun. Die Teile e) bis h) gehen alle um die Klasse CCalendarEntry. Dort sollst Du auch die print-Methode implementieren, nachdem die set Methode und so weiter implementiert sind.
Die Überladung des << Operators: Bei der a) steht explizit: "ohne abschließenden Zeilenumbruch". Warum machst Du dann ein << endl dran?
Was ist mit der c)? Ich sehe die Testausgabe nicht.
Ich bekomme übrigens als Dauer einen Tag zu wenig raus, als in der Beispielausgabe. Das kann allerdings trotzdem richtig sein, wenn man nämlich den Semesterbeginn-Tag und Semesterende-Tag einschließlich zählt, müsste man wahrscheinlich einfach noch 1 dazu addieren. Überprüfe das erst einmal.

Erst wenn die CJulianDate-Klasse korrekt ist, kannst Du weiter zur CCalendarEntry gehen!
Auf diesen Beitrag antworten »
as_string

In der prettyPrintMonth() Methode:
Die Zuweisung der Variablen month zu printMonth sollst Du natürlich erst machen, nachdem der Wert für die Variable month schon bestimmt ist! So wie Du es jetzt geschrieben hast, macht das ja überhaupt gar keinen Sinn, weil zu dem Zeitpunkt der Zuweisung die Variable month noch einen undefinierten Wert hat.
Du rufst dayOfWeekAsName() zwischendrin einfach mal auf, ohne den Rückgabewert überhaupt zu verwenden. Da die Funktion sonst ja auch keine Nebeneffekte haben sollte (sie ist ja const definiert), bringt das gar nichts.
Dann die while-Schleife:
Wenn Du 4 Leerzeichen ausgeben willst, dann mach das doch einfach mit
code:
1:
cout << "    ";
und nicht mit 4 einzelnen Strings mit jeweils einem Leerzeichen! Außerdem sollst Du da kein endl hin schreiben: Es soll ja in derselben Zeile noch was ausgegeben werden hinten dran. Der Zeilenumbruch soll nur bei "Sonntag" kommen.
Das formatDayNumber darfst Du natürlich nicht als Member von "current" aufrufen! current hat ja auch aktuell day als Tag, dann wäre es ja immer ein Treffer. formatDayNumber musst Du einfach für this aufrufen (also gar kein Objekt vorne dran schreiben, einfach die Funktion formatDayNumber aufrufen und das day von current übergeben).
current um eins erhöhen kannst Du mit current += 1;
Am Ende der while-Schleife solltest Du nochmal year, month und day aktualisieren, damit die Auswertung der Bedingung der While-Schleife den richtigen Monat überprüft.

Also alles in allem ist die ganze Funktion noch eine riesige Baustelle bei Dir. Da sind ja mehr falsche als richtige Zeilen drin!

Gruß
Marco

PS: Da hat dann noch das cout << vor dem formatDayNumber() gefehlt, wenn ich mich recht erinnere...
Auf diesen Beitrag antworten »
Victor

Aber das mit dem current steht doch in der Aufgabenstellung so ?

Siehe Bild2?
Auf diesen Beitrag antworten »
as_string

Was steht in der Aufgabe gegen das ich was geschrieben hätte?
Auf diesen Beitrag antworten »
Victor

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:

void CJulianDate::prettyPrintMonth(){
	CJulianDate current = CJulianDate(*this);
	int year;
	short month;
	short day;
	short printMonth = month;


	current.toGregorianDate( year,  month,  day);
	 current.fromGregorianDate(year,  month, 1);
	 current.dayOfWeekAsName();
	 current += -(current.dayOfWeek() - 1);
	 current.toGregorianDate(year, month, day);

	 while( month <= printMonth ){
		 if(month <printMonth){

		 cout << " " << " " << " " << " " << endl;


	 }
	 else {

		 current.formatDayNumber(day);
	 }

	 if(current.dayOfWeekAsName() == "Sonntag" ){
		 cout << endl;

	 }
	 current.operator +=(1);}
}



code:
1:
current.dayOfWeekAsName();


Was soll ich denn in die kleine Klammer schreiben ?
Ich weiss ja nicht welchen Tag ich habe ?

Woher weiss ich was der Rückgabewert ist ?
Auf diesen Beitrag antworten »
as_string

Hast Du denn gar nichts von dem, was ich geschrieben hatte, verstanden? Das ist ja wieder derselbe Quelltext wie vorher.
Zeile 7 macht so keinen Sinn. Du weißt der Variable printMonth den Wert von month zu, der aber zu diesem Zeitpunkt noch gar nicht initialisiert ist. Die Zuweisung musst Du natürlich nach der Zeile 10 machen!
Zeile 12 kannst Du ersatzlos streichen. Was willst Du damit erreichen?
Zeile 19: warum hast Du vier Strings mit jeweils einem Leerzeichen? Du kannst Doch auch einfach einen String mit 4 Leerzeichen ausgeben! Außerdem ist das << endl hier falsch. Es soll doch in derselben Zeile noch dahinter was ausgegeben werden, dann kannst Du doch kein endl machen.
Zeile 25 hat auch wieder 2 Fehler. Die Methode formatDayNumber() gibt selbst nichts aus, sondern gibt einen String zurück, den Du ausgeben möchtest. Nur machst Du mit dem Rückgabewert ja gar nichts. Wie soll da jemals der Tag ausgegeben werden?
Dann ist es falsch diese Methode auf dem Objekt current aufzurufen. Die Variable day ist doch auf Basis diese Objekts initialisiert. Dann würde ja day immer dem Tag des current Objekts entsprechen und es würden immer eckige Klammern um die Nummer drumrum ausgegeben werden.das ist falsch! Nur wenn der current Tag (der in der Variablen Day gespeichert ist) dem Tag des eigenen Objekts entspricht (also this), soll eine solche Klammer ausgegeben werden. Ich habe das Gefühl, Du verstehst da überhaupt nicht, was da überhaupt passiert, oder?

Deine Zeile 32 ist eventuell nicht falsch, aber doch ziemlich unsinnig. Man definiert einen Operator doch nicht, um dann das als Methode operator+=() aufzurufen, sondern den Operator zu verwenden! Du solltest da schreiben current += 1;
Nach dem Hochzählen von current fehlt aber noch was, was mE auch in der Aufgabe erwähnt war. Du musst am Ende der while-Schleife (also noch innerhalb des while-Blocks) die Variablen year, month und day aktualisieren auf Basis von current. Das ist dieselbe Anweisung, wie Du sie schon. In 14 benutzt hast.

Super, jetzt hätte ich Dir auch gleich die ganze Methode schreiben könnnen.ich mache mir da irgendwie Sorgen. Du hast so viele Sachen falsch, dass ich den Eindruck gewinne, dass Du gar nichts verstanden hast. Was bringt es Dir jetzt, wenn ich Dir jedes Detail vorkaue, dann hast Du es vielleicht irgendwann in Deinem Programm richtig, aber immer noch nicht verstanden.
Vor allem finde ich es auch merkwürdig, dass Du die ganzen Fehler, die Du schon in den Aufgabenteilen davor drin hast, gar nicht korrigieren willst. Offenbar hast Du auch noch kein einziges Mal versucht, den Code zu kompilieren, sonst wäre Dir schon so einiges aufgefallen.
Du solltest die Aufgaben nacheinander lösen, nach jeder Teilaufgabe kompilieren und ausführen und schauen, was passiert. Dann würdest Du sehen, dass es nicht viel ist bzw nichts richtiges...

Gruß
Marco
Auf diesen Beitrag antworten »
Victor

Gut ich setze mich jetzt an der Aufgabe und werde vielleicht bisschen später dann wieder Ansätze posten.

Ich habe sehr viele Probleme beim proggen , hatte auch ein wenig hilfe bei der Aufgabe erhalten , anscheinend war das aber falsch großes Grinsen
Auf diesen Beitrag antworten »
as_string

OK, hatte ich mir schon fast gedacht, dass das nicht nur Deine eigenen Gedanken waren, aber das ist schon ok.
Ich denke nur, dass Dein Ansatz vielleicht nicht so sinnvoll ist. Wichtig ist, dass Du irgendwie die Zusammenhänge lernst/verstehst. Wenn Dir ein anderer einfach seinen Code gibt, dann hast Du da ja noch nichts gelernt.
Versuche mal so ungefähr zu verstehen, was ich geschrieben habe, und das dann auch mal umzusetzen, wie Du denkst es könnte passen. Ich bin allerdings erst wieder heute Abend am Rechner...
Und mache mal noch die ersten Teilaufgaben. Du kannst die Klasse CJulianDate ja auch ohne den Rest kompilieren und dann auch eine kleine main.cpp machen, die die ersten paar Methoden aufruft, ähnlich wie es in der Aufgabe ja auch angedacht ist (so kommt man zu den Beispielausgaben zumindest).

Gruß
Marco
Auf diesen Beitrag antworten »
Victor

Aber nach dem ich current auf this gestellt habe , habe ich Fehlermeldungen bekommen ?

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:

void CJulianDate::prettyPrintMonth(){
	CJulianDate current = CJulianDate(*this);
	int year;
	short month;
	short day;
	


	current.toGregorianDate( year,  month,  day);
	 current.fromGregorianDate(year,  month, 1);
	 short printMonth = month;
	 current += -(current.dayOfWeek() - 1);
	 current.toGregorianDate(year, month, day);

	 while( month <= printMonth ){
		 if(month <printMonth){

		 cout << "  ,  ,  ,  ," << endl;


	 }
	 else {

		 this.formatDayNumber(day);
	 }

	 if(this.dayOfWeekAsName() == "Sonntag" ){
		 cout << endl;

	 }
	 current +=1;
	 current.toGregorianDate(year, month, day);

	 
	 }
}


Description Resource Path Location Type
Method 'dayOfWeekAsName' could not be resolved CJulianDate.cpp /CJulianDate/CJulianDate line 144 Semantic Error

Description Resource Path Location Type
Method 'formatDayNumber' could not be resolved CJulianDate.cpp /CJulianDate/CJulianDate line 141 Semantic Error


Ich habe das hier jetzt so gemacht ?

cout << " , , , ," << endl;

Wieso soll da kein endl hin ? Verstehe ich nicht ?
Auf diesen Beitrag antworten »
Victor

Warum kommen diese Fehlermeldungen string?

Bist du wieder on ?

Was studierst du eigentlich ?
Auf diesen Beitrag antworten »
as_string

Zitat:
Original von Victor
Description Resource Path Location Type
Method 'dayOfWeekAsName' could not be resolved CJulianDate.cpp /CJulianDate/CJulianDate line 144 Semantic Error

Description Resource Path Location Type
Method 'formatDayNumber' could not be resolved CJulianDate.cpp /CJulianDate/CJulianDate line 141 Semantic Error

Wie hast Du das versucht zu kompilieren?
"this." kannst Du dann auch ganz weg lassen. da muss nur formatDayNumber(day) stehen. Allerdings hast Du immer noch nicht verstanden, dass Du den Rückgabewert auch noch ausgeben musst. Also muss die Zeile lauten:
code:
1:
2:
3:
			cout << formatDayNumber(day);


Zitat:
Original von Victor
Ich habe das hier jetzt so gemacht ?

cout << " , , , ," << endl;

Wieso soll da kein endl hin ? Verstehe ich nicht ?

Verstehe nicht, für was die Kommata gut sein sollen. Du sollst einfach nur vier Leerzeichen in Anführungszeichen hin schreiben, mehr nicht.
Wieso soll da ein endl hin? Was macht das endl? Warum könnte ich der Meinung sein, dass Du das aber hier nicht haben willst?

Gruß
Marco
Auf diesen Beitrag antworten »
Victor

ok jetzt müsste wenigstens die printh Metode stimmen? großes Grinsen

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:

void CJulianDate::prettyPrintMonth(){
	CJulianDate current = CJulianDate(*this);
	int year;
	short month;
	short day;



	current.toGregorianDate( year,  month,  day);
	 current.fromGregorianDate(year,  month, 1);
	 short printMonth = month;
	 current += -(current.dayOfWeek() - 1);
	 current.toGregorianDate(year, month, day);

	 while( month <= printMonth ){
		 if(month <printMonth){

			 cout << " " << " " << " " << " " << formatDayNumber(day);


	 }
	 else {

		 formatDayNumber(day);
	 }

	 if(dayOfWeekAsName() == "Sonntag" ){
		 cout << endl;

	 }
	 current +=1;
	 current.toGregorianDate(year, month, day);


	 }
}





Ist die print Ausgabe wenigstens teilweise richtig bei mir ?

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:

void CJulianDate::print(){ 

cout<< semesterBegin << " ," << "Semesterende: " << "Freitag, " << semesterEnd << endl; 

cout << "Dauer::" << "182 Tage" << endl; 
cout << "Zeit:" << m_days << " , " << " 14.2.2017" << endl; 

cout << "Ort:" << m_location <<endl; 

cout<< "Beschreibung:" << " " << "Git-Klausur" << endl; 


prettyPrintMonth(); 



} 

Passte es so ?14.2.2017 einfach so rein schreiben ?
Auf diesen Beitrag antworten »
as_string

Sieht zwar schon deutlich besser aus... aber:

Zeile 19 ist falsch. Du musst da natürlich kein formatDayNumber(day) ausgeben und warum Du nicht verstehst, dass man vier Leerzeichen auch in einen String schreiben kann, ist mir ein Rätsel.
Ich meine, Du verstehst offensichtlich gar nicht, warum diese vier Leerzeichen ausgegeben werden sollen anstelle des formatDayNumber() Strings. Schau Dir doch mal die Beispielausgabe an, da wird in der ersten Zeile die 1 ja nicht ganz links ausgegeben, wenn der erste des Monats nicht zufällig ein Wochenanfang ist. Die Leerzeichen sind dafür da, für diese Tage des Vormonats statt der Zahl eben Leerzeichen auszugeben.
Warum lässt Du das ganze nicht einfach mal von einem Editor formatieren, so dass die Einrückungen stimmen? Dann würdest Du vielleicht auch ein paar Dinge besser verstehen.
Warum lässt Du Dir das nicht kompilieren und testest es selbst aus? Du gehst an die gesamte Aufgabe falsch heran. Du musst immer eine Methode implementieren und diese dann in der main aufrufen, bis sie mit den Beispielausgaben in der Aufgabenstellung übereinstimmt! Nur so kannst Du erstens Deine Fehler selbst finden und durchs Korrigieren verstehen, was Du da überhaupt tust. Warum machst Du das nicht???
Nebenbei, was mir auch nicht so gefällt ist Zeile 28. Dort vergleichst Du einen String mit einem String. Der String wird aber nur auf Basis einer Zahl gebildet. Wenn Du Dir die Methode dayOfWeekAsName() anschaust wird der 7 von der Rückgabe von dayOfWeek() fest der String Sonntag zugeordnet. Du kannst also auch selbst die Methode dayOfWeek() verwenden und das dann auf 7 überprüfen. Ein Zahlenvergleich ist immer viel schneller als den ganzen String zu vergleichen.

Die print Methode gehört nicht zur Klasse CJulianDate, sondern zur CCalendarEntry. Das hatte ich Dir auch schon einmal geschrieben. Alles auf dieser Seite des Aufgabentexts gehört zu dieser Klasse.
Und nein, es ist natürlich nicht ok, die Strings da fest rein zu schreiben. Du sollst bei der print die Methoden verwenden, die Du vorher (bei f) implementiert hast. Die Werte sollen vorher über die set() Methode gesetzt werden.

In der main sollst Du dann ein CCalendarEntry Objekt machen, damit die set()-Methode aufrufen. Die soll noch den in der Aufgabe erwähnten Check ausführen.

Gruß
Marco
Auf diesen Beitrag antworten »
as_string

Zitat:
Original von Victor
Was studierst du eigentlich ?


Ich studiere schon seit einer Weile nicht mehr. Ich hab mal irgendwann Physik studiert mit Nebenfach Informatik. Ich arbeite als Softwareentwickler.

Gruß
Marco
Auf diesen Beitrag antworten »
Victor

Soll ich als dayofWeekAsName == dayofWeek vergleichen ?
Auf diesen Beitrag antworten »
as_string

Das eine gibt einen String zurück das andere eine Zahl. Wie sollen die jemals gleich sein können?

Nein, ich meine nur, dass (getDayOfWeekAsName() == "Sonntag") und (getDayOfWeek() == 7) dasselbe Ergebnis liefern sollte, nur letzteres deutlich effizienter.

Gruß
Marco
Auf diesen Beitrag antworten »
Victor

Es werden zwar wieder Fehler angezeigt , aber ich poste mal Ansatz.

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:

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

const std::string& CCalenderEntry::getLocation(){

	return m_location;
}

bool set(const CJulianDate& date, const std::string& location,
			const std::string& description){
	
	m_date = date;
	m_location = location;
	m_description = description;
}

void CCalenderEntry::print(){

	cout<< CJulianDate semesterBegin(2016,10,1) << " ," << CJulianDate semesterBegin(2017,14,2) <<CJulianDate semesterEnd(2017,3,31) << endl;

	    cout << "Dauer::" << "182 Tage" <<  endl;
 cout << "Zeit:" << m_days << " , " <<....... ?

 cout << "Ort:" << m_location <<endl;

 cout<< "Beschreibung:" << " " << "Git-Klausur" << endl;


	prettyPrintMonth();



}


Warum ist die set Methode falsch?

Ich setze doch?
Auf diesen Beitrag antworten »
as_string

Die Methode hat einen Rückgabewert vom Typ bool. Du gibst aber gar nichts zurück.
Ließ in der Aufgabe bzw. Im Kommentar über der Deklaration dieser Methode (also in der Headerdatei), was dieser Rückgabewert sein soll!

Gruß
Marco
Auf diesen Beitrag antworten »
Victor

Ich habe es jetzt so programmiert wie ich es für richtig halte .

Kann auch sein das es totaler Schwachsinn ist , aber man lernt ja durch proggen.

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:

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

const std::string& CCalenderEntry::getLocation(){

	return m_location;
}

void bool set(const CJulianDate& date, const std::string& location,
			const std::string& description){
	if( toGregorianDate(int& year, short& month, short& day) < toGregorianDate(1582, 10, 15)){
		return false;
	}
	else if(toGregorianDate(int& year, short& month, short& day) >=toGregorianDate(1582, 10, 15))){
	m_date = date;
	m_location = location;
	m_description = description;
	return true;
}

void CCalenderEntry::print(){

	cout<< CJulianDate semesterBegin(2016,10,1) << " ," << CJulianDate semesterBegin(2017,14,2) <<CJulianDate semesterEnd(2017,3,31) << endl;

	    cout << "Dauer::" << "182 Tage" <<  endl;
 cout << "Zeit:" << m_days << " , " <<....... ?

 cout << "Ort:" << m_location <<endl;

 cout<< "Beschreibung:" << " " << "Git-Klausur" << endl;


	prettyPrintMonth();



}


Description Resource Path Location Type
die Regel für Ziel „CJulianDate/CCalenderEntry.o“ scheiterte subdir.mk /CJulianDate/Debug/CJulianDate line 24 C/C++ Problem
fatal error: CCalendarEntry.h: Datei oder Verzeichnis nicht gefunden CCalenderEntry.cpp /CJulianDate/CJulianDate line 16 C/C++ Problem
make: *** [CJulianDate/CCalenderEntry.o] Fehler 1 CJulianDate C/C++ Problem
Member declaration not found CCalenderEntry.cpp /CJulianDate/CJulianDate line 21 Semantic Error
Method 'dayOfWeekAsName' could not be resolved CJulianDate.cpp /CJulianDate/CJulianDate line 144 Semantic Error
Method 'formatDayNumber' could not be resolved CJulianDate.cpp /CJulianDate/CJulianDate line 141 Semantic Error
Type 'CJulianDate' could not be resolved CCalenderEntry.cpp /CJulianDate/CJulianDate line 26 Semantic Error
No return, in function returning non-void CCalenderEntry.cpp /CJulianDate/CJulianDate line 26 Code Analysis Problem


Kann ich das so in der if Bedingung vergleichen ?
Im Moment habe ich ja nur die set Methode implementiert
Auf diesen Beitrag antworten »
as_string

Wo hast Du die anderen getter? Du hast einen für die location, aber es fehlen noch zwei für die anderen Membervariablen.
Das was Du in der print-Methode hast muss zum großen Teil in die main mit rein.

Ich kann Dir gerne meine Dateien geben. Aber nur, wenn Du mir versprichst, dass Du das wirklich anschaust und versuchst zu verstehen. Ich weiß nicht, ob Du dabei so arg viel lernen kannst... Aber vielleicht hilft es Dir doch irgendwie. Was meinst Du?

Gruß
Marco
Auf diesen Beitrag antworten »
as_string

Hier ist mal meine CCalendarEntry.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:
/*
 * CCalendarEntry.cpp
 *
 *  Created on: 04.02.2017
 *      Author: mnl
 */

#include "CCalendarEntry.h"
#include <string>
#include<iostream>
using namespace std;
bool CCalendarEntry::set(const CJulianDate& date, const std::string& location,
			const std::string& description) {
	if(date < CJulianDate(1582, 10, 15))
		return false;
	m_date = date;
	m_location = location;
	m_description = description;
	return true;
}

const CJulianDate& CCalendarEntry::getDate() const{
	return m_date;
}

const std::string& CCalendarEntry::getLocation() const{
	return m_location;
}

const std::string& CCalendarEntry::getDescription() const{
	return m_description;
}

void CCalendarEntry::print() const{
	cout << "Zeit: " << getDate() << endl;
	cout << "Ort: " << getLocation() << endl;
	cout << "Beschreibung: " << getDescription() << endl;
}


Gruß
Marco
Auf diesen Beitrag antworten »
as_string

Hier mal meine main.cpp, die ich zum Testen verwendet habe:

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:
#include <iostream>		// Header für die Standard-IO-Objekte (z.B. cout, cin)
#include <stdlib.h>
#include "CJulianDate.h"
#include "CCalendarEntry.h"
// Fügen Sie hier weitere benötigte Header-Dateien der
// Standard-Bibliothek ein z.B.
// #include <string>

using namespace std;	// Erspart den scope vor Objekte der
						// C++-Standard-Bibliothek zu schreiben
						// z.B. statt "std::cout" kann man "cout" schreiben

// Inkludieren Sie hier die Header-Files Ihrer Klassen, z.B.
// #include "CFraction.h"


// Hauptprogramm
// Dient als Testrahmen, von hier aus werden die Klassen aufgerufen
int main (void)
{
	CJulianDate semesterBegin(2016,10,1);
	CJulianDate semesterEnd(2017,3,31);
	cout << "Semesterbeginn: " << semesterBegin << ", Semesterende: " << semesterEnd << ", Dauer: " << semesterEnd - semesterBegin + 1 << endl;
	cout << endl;
	
	CJulianDate today = CJulianDate(2017,8,12);
	today.prettyPrintMonth();
	cout << endl;
	cout << endl;
	
	CCalendarEntry entry;
	bool valid;
	valid = entry.set(CJulianDate(1582, 10, 14), "D17/XX", "GIT-Klausur");
	cout << (valid ? "gültig" : "ungültig") << endl;
	valid = entry.set(CJulianDate(1582, 10, 15), "D17/XX", "GIT-Klausur");
	cout << (valid ? "gültig" : "ungültig") << endl;
	cout << endl;
	
	entry.set(today, "D17/XX", "GIT-Klausur");
	entry.print();
}
Auf diesen Beitrag antworten »
as_string

Hier noch meine CJulianDate.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:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
#include "CJulianDate.h"
#include <cstdio>
#include<iostream>
using namespace std;

//===============================================
// 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
//=====================================================



ostream& operator << (ostream& lop, const CJulianDate& rhs){
	short day, month;
		int year;
		rhs.toGregorianDate(year, month, day);
		lop<< rhs.dayOfWeekAsName() << ", " << day << "." << month << "." << year;
	return lop;

}

long CJulianDate::operator-(const CJulianDate& other){
	return this->m_days - other.m_days;
}

void CJulianDate::prettyPrintMonth(){
	CJulianDate current = *this;
	int year;
	short month, printMonth, day;


	current.toGregorianDate( year,  month,  day);
	printMonth = month;
	current.fromGregorianDate(year,  month, 1);
	current += -(current.dayOfWeek() - 1);
	current.toGregorianDate(year, month, day);

	while( month <= printMonth ){
		if(month <printMonth){
			cout << "    ";
		}
		else {
			cout << formatDayNumber(day);
		}

		if(current.dayOfWeek() == 7){
			cout << endl;
		}
		current += 1;
		current.toGregorianDate(year, month, day);
	}
}

CJulianDate::CJulianDate(const CJulianDate& oldvariable){

	m_days = oldvariable.m_days;
}
Auf diesen Beitrag antworten »
Victor

Du kannst mir auch gerne tipps geben ,wäre auch ok.

Ich habe jetzt mal die get implementiert ,aber es werden 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:


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

const string& CCalenderEntry::getLocation(){

	return m_location;
}

const CJulianDate& CCalenderEntry::getDate(){
	return m_date;
	
	
}
const string& CCalenderEntry::getDescription(){
	
	return m_description;
}



void bool set(const CJulianDate& date, const std::string& location,
			const std::string& description){
	if( toGregorianDate(int& year, short& month, short& day) < toGregorianDate(1582, 10, 15)){
		return false;
	}
	else if(toGregorianDate(int& year, short& month, short& day) >=toGregorianDate(1582, 10, 15))){
	m_date = date;
	m_location = location;
	m_description = description;
	return true;
}



Er zeigt auch einen Fehler bei dem include von CCalenderentry
Auf diesen Beitrag antworten »
as_string

Du hast die Datei "CCalenderEntry.h" genannt aber includierst die Datei "CCalendarEntry.h". Mal ist ein "e" im Calender und mal ein "a": Calendar. Ich denke, letzteres ist im Englischen richtig und außerdem ist es so in der Aufgabe auch. Also -> benenne die Header-Datei um!

Außerdem: Wenn Du deinen Fehler hast, dann sag doch bitte auch die Fehlermeldung und nicht nur: Er meldet Fehler!

Gruß
Marco
Auf diesen Beitrag antworten »
Victor

Irgendwas scheint mit meiner Ide net zu stimmen auch nach dem umbenennen geht der Fehler nicht weg .

Aber egal.
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
  

void bool set(const CJulianDate& date, const std::string& location,
			const std::string& description){
	if( toGregorianDate(int& year, short& month, short& day) < toGregorianDate(1582, 10, 15)){
		return false;
	}
	else if(toGregorianDate(int& year, short& month, short& day) >=toGregorianDate(1582, 10, 15))){
	m_date = date;
	m_location = location;
	m_description = description;
	return true;
}




Fehler :


Description Resource Path Location Type
No return, in function returning non-void CCalenderEntry.cpp /CJulianDate/CJulianDate line 38 Code Analysis Problem

Stimmt der code also die Idee so?
Auf diesen Beitrag antworten »
as_string

Ich glaube, so wird das wirklich nichts... Wie kommt das eigentlich zustande? Bist Du Schüler oder studierst Du? Wenn Du studierst, was genau und woher kommt die Aufgabe?

  1. Du schreibst "void bool set(...". Schon alleine hier sind mindestens zwei Fehler drin. Erstens was ist denn nun der Rückgabewert? Ist es void (also keiner)? Oder ist es bool? Beides gleichzeitig funktioniert ja wohl kaum, oder?
  2. set() soll ja eine Methode der Klasse CCalendarEntry sein. Da sie ja (wie üblich) außerhalb der Klassendefinition definiert wird, musst Du CCalendarEntry::set(...) schreiben!
  3. Dein Vergleich in der if-Anweisung ist doch wohl offensichtlicher Unsinn, auch wieder in mehrfacher Hinsicht: zuerst einmal gibt es die Funktion toGregorianDate() nicht in der Klasse CCalendarEntry, sondern in der Klasse CJulianDate. Aber woher soll der Kompiler wissen, dass Du die meinst? Außerdem wäre das eine Member-Methode von der Klasse, die nicht statisch ist, weshalb Du ja auch noch ein Objekt brauchst, wenn Du sie aufrufen willst. Du könntest sie so nur aufrufen, wenn Du innerhalb der Klasse CJulianDate wärst, hier bist Du jetzt aber in der Klasse CCalendarEntry.
  4. Den Rückgabewert von CJulianDate::toGregorianDate() gibt es nicht, sie ist als void definiert. Wie willst Du denn dann zwei (nicht vorhandene) Rückgabewerte in der if()-Anweisung mit einen Kleiner-Zeichen vergleichen?
  5. Was soll der Aufruf vom ersten toGregorianDate mit den ganzen Argumenten? Du hast doch hier überhaupt kein "year", "month" oder "day" definiert!
  6. warum willst Du überhaupt etwas zu einem Gregorianischen-Kalender-Datum wandeln? Du willst doch einen Datumsvergleich machen, welches früher und welches später ist. Die ganze Aufgabe geht doch jetzt gerade darum, dass Du einen solchen Vergleich am besten mit dem Julianischen Kalender und eben gerade nicht mit dem Gregorianischen!
  7. Die Klasse CJulianDate hat den Operator < doch schon überladen! Das bedeutet, dass Du zwei Objekte vom Typ CJulianDate direkt mit < vergleich kannst. Allerdings nicht mit > oder mit >= etc, weil diese gar nicht definiert sind in CJulianDate.
  8. Du brauchst kein "else if(...)" wenn Du nach dem if (was ein return macht und deshalb die Funktion verlässt) mit allem anderen weiter gehen willst. Wenn das if unwahr ist, wäre doch die else if(...) Bedingung so wie so schon true, was willst Du da also noch vergleichen (zumal der Vergleich ja so wie so Blödsinn ist mit dem "toGregorianDate()"...
  9. Du hast nach dem else if()... eine öffnende geschweifte Klammer, die aber nicht mehr geschlossen wird.

Ich weiß nicht, ob ich noch ein paar Probleme vergessen habe. Das alles kann doch nicht Dein Ernst sein? Es kann doch nicht sein, dass Du eine solche Aufgabe lösen musst, wenn Du offensichtlich von der Materie nicht den Hauch einer Ahnung hast. Wie kann denn so etwas zustande kommen???

Ich habe die Funktion so geschrieben:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
bool CCalendarEntry::set(const CJulianDate& date, const std::string& location,
			const std::string& description) {
	if(date < CJulianDate(1582, 10, 15))
		return false;
	m_date = date;
	m_location = location;
	m_description = description;
	return true;
}


Gruß
Marco
Auf diesen Beitrag antworten »
Victor

Gut habe den Code jetzt soweit nachvollziehen können .

Die Aufgabe geht ein wenig weiter .

Soll ich den Konstruktor so implementieren ?

Header:

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:

#ifndef CCALENDAR_H_
#define CCALENDAR_H_
#include <string>
#include<iostream>
using namespace std;

class CCalendar {
	
private:
	CCalendar::CCalendarEntry* m_entries = 0;
	unsigned int m_numberofEntries = 0;
public:
	CCalendar();
	 ~CCalendar();
	 CCalendar& operator+=(const CCalendarEntry& entry);
	 void print( const CJulianDate& from);
	 void print();
};

#endif /* CCALENDAR_H_ */




cpp

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:

#include "CCalendar.h"

CCalendar::CCalendar(int m_numberofEntries, CCalendarEntry* m_entries) {
	
	numberofEntries = m_numberofEntries;
	entries = m_entries;
	

}

CCalendar::~CCalendar() {
	// TODO Auto-generated destructor stub
}





Folgende Fehler werden angezeigt:

Description Resource Path Location Type
Symbol 'numberofEntries' could not be resolved CCalendar.cpp /CCalendar line 12 Semantic Error
make: *** [CCalendar] Fehler 1 CCalendar C/C++ Problem
Type 'CCalendarEntry' could not be resolved CCalendar.cpp /CCalendar line 10 Semantic Error
die Regel für Ziel „CCalendar“ scheiterte makefile /CCalendar/Debug line 44 C/C++ Problem
Nicht definierter Verweis auf `main' CCalendar C/C++ Problem
Member declaration not found CCalendar.cpp /CCalendar line 10 Semantic Error
Type 'CCalendar::CCalendarEntry' could not be resolved CCalendar.h /CCalendar line 17 Semantic Error
Type 'CCalendarEntry' could not be resolved CCalendar.h /CCalendar line 22 Semantic Error
Symbol 'std' could not be resolved CCalendar.h /CCalendar line 12 Semantic Error
Symbol 'entries' could not be resolved CCalendar.cpp /CCalendar line 13 Semantic Error
Type 'CJulianDate' could not be resolved CCalendar.h /CCalendar line 23 Semantic Error

Ich habe in dem Ordner die Dateien von CjulianDate nicht im selben Ordner ,daher werden paar Fehler angezeigt ,aber warum die anderen ?
Auf diesen Beitrag antworten »
as_string

Hallo!

Auf den ersten Blick (ich komme erst später dazu, das auch auszuprobieren):
Du hast die Membervariablen "m_..." mit denen übergebenen vertauscht. Die Klasse hat ja die Variablen mit m_ am Anfang. Der Konstruktor bekommt die ohne m_ übergeben und Du weißt diese den Membervariablen zu und nicht umgekehrt, wie Du es gemacht hast.

Gruß
Marco
Auf diesen Beitrag antworten »
Victor

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:

#include "CCalendar.h"




CCalendar::CCalendar(int m_numberofEntries, CCalendarEntry* m_entries) {

       m_numberofEntries = numberofEntries;
	   m_entries = entries;


}

CCalendar::~CCalendar() {
	// TODO Auto-generated destructor stub
}





Es werden immer noch Fehler angezeigt?
Warum?
Auf diesen Beitrag antworten »
Victor

Wäre der destruktor so in Ordnung ?

Da muss ich ja den Speicher freigeben obwohl gar keiner erstellt wurde

Also habe ich im Konstruktor Speicher angelegt :


code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
#include "CCalendar.h"




CCalendar::CCalendar(int m_numberofEntries, CCalendarEntry* m_entries) {

       m_numberofEntries = numberofEntries;
       m_entries = entries;

m_entries = (CCalendarEntry*)malloc(m_numberofEntries *sizeof(CCalenderEntry));
}

CCalendar::~CCalendar() {
    // TODO Auto-generated destructor stub
    delete m_entries;
}



Passt es so?
Auf diesen Beitrag antworten »
as_string

Der Konstruktor soll laut Klassendiagramm gar keine Argumente übergeben bekommen. Der soll auch noch kein Array anlegen und schon gar nicht mit malloc (das ist C und ruft keine Konstruktoren auf), sondern mit new CCalendarEntry[] und delete [].
Du sollst aber im Konstruktor erstmal noch gar nichts machen laut Aufgabenstellung. Bei der c) steht doch explizit, dass so lange noch kein Element hinzugefügt wurde auch noch gar kein Speicher reserviert wurde.
Was Du also machen sollst:
Im Konstruktor gar nichts und der soll auch ohne Argumente sein.
Im Destruktor musst Du schauen, ob schon Speicher reserviert wurde, indem Du die Membervariable m_entries überprüfst, ob dieser Zeiger immer noch null ist.wenn ja, dann brauchst Du nix machen, wenn nicht mehr, dann hast Du schon Speicher belegt und gibst den mit delete [] frei.
Beim Operator += machst Du ein neues Array (mit new) allerdings mit der Größe um eins größer als m_numberOfEntries. Wenn es vorher schon ein Array gab, musst Du die Elemente umkopieren ins neue Array.
Allerdings kommt hier eine Besonderheit. Die Termine sollen ja ihrer chronologischen Reihenfolge nach gespeichert werden. Du musst also vor dem Einfügen eines Elementes aus dem alten Array immer überprüfen, ob das noch vor dem neuen Eintrag liegt. Sobald Du den ersten Eintrag des alten Arrays findest, das einem späteren Zeitpunkt entspricht als der neue Eintrag, musst Du zuerst den neuen Eintrag einfügen und dann erst den alten. Wenn Du am Ende mit dem alten Array durch bist, aber den neuen Eintrag noch nicht eingefügt hast, dann musst Du ihn am Ende einfügen.
Anschließend musst Du das alte Array löschen (wieder mit delete []). Dann zählst Du m_numberOfEntries eins hoch und weißt das neue Array der m_entries Variable zu.

Gruß
Marco
Auf diesen Beitrag antworten »
Victor

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
#include "CCalendar.h"




CCalendar::CCalendar() {

       
}

CCalendar::~CCalendar() {
	if( m_entries >=0 ){
	delete m_entries;
	}
}




Nur zum lernen ?
Wie würde ich denn Speicher genau ohne malloc anlegen ?
Wie sieht das genau aus?
Auf diesen Beitrag antworten »
Victor

Ich weiss nicht ob es quatsch ist ,aber ich habe es einfach mit einem bubblesort Algorithmus probiert ,aber glaube ich nicht ganz richtig leider:

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:

/*
 * CCalendar.cpp
 *
 *  Created on: 21.08.2017
 *      Author: vaio
 */

#include "CCalendar.h"




CCalendar::CCalendar() {

       
}

CCalendar::~CCalendar() {
	if( m_entries >=0 ){
	delete m_entries;
	}
}

Calendar& operator+=(const CCalendarEntry& entry){
	
	
	CCalendarEntry** m_entries = new CCalendar* [m_numberofEntries+1];
	int temp;
	// Alle Elemente durchgehen (letztes ausgenommen)
	for(m_entries  = 0; m_entries  < m_numberofEntries-1; m_entries++)
	{
	    // Position des zurzeit kleinstes Elementes
	    unsigned int min_pos = m_entries;
	 
	    // unsortierten Teil des Feldes durchlaufen
	    // und nach kleinstem Element suchen
	    for( m_entries = m_numberofEntries+1; j < m_numberofEntries; j++)
	        if(feld[j] < feld[min_pos] )
	            min_pos = j;
	 
	    // Elemente vertauschen
	    // Das kleinste Element kommt an das Ende
	    // bereits sortierten Teils des Feldes
	    int temp = feld[numberofEntries];
	    feld[numberofEntries] = feld[min_pos];
	    feld[min_pos] = temp;
	}
}


Passt es ein wenig wenigstens ?
 
Neue Frage »
Antworten »


Verwandte Themen

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