C++ Einführung - Seite 2

Neue Frage »

Auf diesen Beitrag antworten »
eulerscheZahl

Wie kamst du denn auf die Punktzahl?
Mit this und rop. Auf die Tore kannst du genauso zugreifen.
 
Auf diesen Beitrag antworten »
progger

this->addResult() Das wäre tordifferenz linker Operand?
Auf diesen Beitrag antworten »
eulerscheZahl

Schau nochmal, was addResult tut? Berechnet das wirklich die Tordifferenz?
Auf diesen Beitrag antworten »
progger

Gesamtzahl der Tore und Gegentore ist ja das hier :

m_goalsScoredTotal += goalsScored;
m_goalsReceivedTotal+= goalsReceived;

Aber die differenz von den beiden hatte ich ja in meiner ersten if bedingung gebildet? großes Grinsen
 
Auf diesen Beitrag antworten »
eulerscheZahl

addResult verändert aber die Tordifferenz. Das willst du nicht.
Frage einfach die Variablen ab.
code:
1:
2:
int team1Diff = this->m_goalsScoredTotal - this->m_goalsReceivedTotal;
int team2Diff = rop.m_goalsScoredTotal - rop.m_goalsReceivedTotal;

Und die beiden Werte dann vergleichen.
Auf diesen Beitrag antworten »
progger

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

int team1Diff = this->m_goalsScoredTotal - this->m_goalsReceivedTotal;
int team2Diff = rop.m_goalsScoredTotal - rop.m_goalsReceivedTotal;

bool CTeam::operator < (CTeam const& rop){

	if((this->getTotalPoints()== rop.getTotalPoints())&&(team1Diff>team2Diff  ) ){
		return true;


	}
	else {
		return false;
	}



}


Jetzt müsste es aber stimmen ?

Ich hoffe das ich bei einer anderen Aufgabe selbst darauf kommen kann
Auf diesen Beitrag antworten »
eulerscheZahl

Die Berechnung der Tordifferenz gehört in die Funktion, nicht außerhalb.
Und was machst du, wenn du Mannschaften eine unterschiedliche Punktzahl haben? Dann kommt es auf die Tordifferenz gar nicht an.
Auf diesen Beitrag antworten »
progger

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:

int team1Diff = this->m_goalsScoredTotal - this->m_goalsReceivedTotal;
int team2Diff = rop.m_goalsScoredTotal - rop.m_goalsReceivedTotal;

bool CTeam::operator < (CTeam const& rop){

	if((this->getTotalPoints()== rop.getTotalPoints())&&(team1Diff>team2Diff  ) ){
                 int team1Diff = this->m_goalsScoredTotal - this->m_goalsReceivedTotal;
                  int team2Diff = rop.m_goalsScoredTotal - rop.m_goalsReceivedTotal;

		return true;


	}
	else {
		return false;
	}
if(this->getTotalPoints()!= rop.getTotalPoints()){

          return false;
}





}




Ok?
Auf diesen Beitrag antworten »
eulerscheZahl

Nein mal knapp.
1. Vergleiche Punkte, bei Ungleichheit gib direkt true oder false zurück, je nachdem was größer ist.
2. Wenn die Punkte gleich sind, berechne Tordifferenzen (IN der Funktion, nicht davor).
Auf diesen Beitrag antworten »
progger

Habe ich das mit meiner Bedingung nicht gemacht ? großes Grinsen

Ich dachte das zumindest
Auf diesen Beitrag antworten »
eulerscheZahl

code:
1:
if((this->getTotalPoints()== rop.getTotalPoints())&&(team1Diff>team2Diff  ) ){

Hier fragst du gleich die Tordifferenz ab, ohne sie vorher berechnet zu haben. (Zeile 2 und 3 zählt nicht. Das muss in der Funktion stehen).
Dann berechnest du die Differenzen, um unabhängig vom Ergebnis true zurückzugeben.
Ansonsnten gibst du false zurück.
Im folgenden Code, der die erreicht wird (Funktion bereits verlassen) gibst du nochmal false zurück.

Du vergisst den Fall, dass aufgrund der erreichten Punkte true zurückgegeben wird.
Auf diesen Beitrag antworten »
progger

In welcher Funktion muss ich denn die Torrdifferenz Berechnung einbauen ?

In addResult ?
Auf diesen Beitrag antworten »
eulerscheZahl

Ich habe dir den Wortlaut der Angabe nochmal abgetippt.
Das ist fast schon malen nach Zahlen.
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
bool CTeam::operator < (CTeam &rop) {
	//es wird true zurückgegeben, wenn der linke Operand mehr Punkte hat als der rechte Operand
	if (this->getTotalPoints() > rop.getTotalPoints()) return true;
	
	//bei gleich vielen Punkten entscheidet die Tordifferenz
	if (this->getTotalPoints() == rop.getTotalPoints()) {
		int team1Diff = this->m_goalsScoredTotal - this->m_goalsReceivedTotal;
		int team2Diff = rop.m_goalsScoredTotal - rop.m_goalsReceivedTotal;
		//Wenn der linke Operand die bessere (höhere) Tordifferenz hat als der rechte, wird ebenfalls true zurückgegeben
		if (team1Diff > team2Diff) return true;
	}
	
	//in allen anderen Fällen wird false zurückgegeben
	return false;
}
Auf diesen Beitrag antworten »
progger

Danke für deine Hilfe . Jetzt werde ich mich mal zum nächsten Aufgabengeil ans üben machen .

Bei Problemen melde ich mich wieder . Wie lange hast du denn gebraucht um programmieren so gut zu lernen ?
Auf diesen Beitrag antworten »
eulerscheZahl

Auch nach mehreren Jahren würde ich nicht behaupten, dass ich das perfekt kann.
Und da hilft nur üben. Bestimmte Muster treten immer wieder auf, die kannst du irgendwann blind eintippen.
Auf diesen Beitrag antworten »
progger

Alles klar danke .

Bis später
Auf diesen Beitrag antworten »
progger

Es werden mir aber immer noch fehler angezeigt wie ich gerade sehe:

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:
#define CTEAM_H_
#include <string>
#include <iostream>
using namespace std;


class CTeam{

private:
	string m_teamName;
	unsigned int m_winsTotal; //Initialisierung kommt in die .cpp, nicht in den header
	unsigned int m_equalTotal;
	unsigned int m_lostTotal; //die Zeile hat gefehlt
	unsigned int m_goalsScoredTotal;
	unsigned int m_goalsReceivedTotal;

public:

	CTeam(string name); //keine default Werte im Header
	string getName();
	void addResult( unsigned int goalsScored, unsigned int goalsReceived);
    unsigned const int getTotalPoints();

    friend ostream& operator << (ostream& out , CTeam const& rop); //du hattest >>
    bool operator < (CTeam const& rop);
};



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:

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

using namespace std;

CTeam::CTeam(string name = "NoName") {
    m_teamName = name;
	m_goalsScoredTotal = 0;
	m_goalsReceivedTotal = 0;
	m_winsTotal = 0;
	m_equalTotal = 0;
	m_lostTotal = 0;
}

string CTeam::getName() {
    return m_teamName;
}


void CTeam::addResult(unsigned int goalsScored, unsigned int goalsReceived){
    if (goalsScored > goalsReceived) {
        m_winsTotal++;
    }
    if (goalsReceived > goalsScored) {
        m_lostTotal++;
    }
    if (goalsReceived == goalsScored) {
           m_equalTotal++;
    }
	m_goalsScoredTotal += goalsScored;
	m_goalsReceivedTotal+= goalsReceived;
 };

unsigned const CTeam:: getTotalPoints(){
	  return  m_winsTotal*3 + m_equalTotal*1;
};

ostream& operator << (ostream &out, const CTeam &rop) {
	 out<<"CTeam@" << rop.m_winsTotal<< "Spiele gewonnen  " << " , " <<  rop.m_equalTotal << " Spiele unentschieden"<< endl;

	 out << "CTeam@"<<  rop.m_goalsScoredTotal << " Tore erzielt " <<" , " << rop.m_goalsReceivedTotal << " " << " Tore kassiert "<< endl;
};
bool CTeam::operator < (CTeam &rop) {
	//es wird true zurückgegeben, wenn der linke Operand mehr Punkte hat als der rechte Operand
	if (this->getTotalPoints() > rop.getTotalPoints()) return true;

	//bei gleich vielen Punkten entscheidet die Tordifferenz
	if (this->getTotalPoints() == rop.getTotalPoints()) {
		int team1Diff = this->m_goalsScoredTotal - this->m_goalsReceivedTotal;
		int team2Diff = rop.m_goalsScoredTotal - rop.m_goalsReceivedTotal;
		//Wenn der linke Operand die bessere (höhere) Tordifferenz hat als der rechte, wird ebenfalls true zurückgegeben
		if (team1Diff > team2Diff) return true;
	}

	//in allen anderen Fällen wird false zurückgegeben
	return false;
}




Description Resource Path Location Type
candidate is: bool CTeam::operator<(const CTeam&) CTeam.h /CTeam line 32 C/C++ Problem
Member declaration not found CTeam.cpp /CTeam line 44 Semantic Error
prototype for 'bool CTeam::operator<(CTeam&)' does not match any in class 'CTeam' CTeam.cpp /CTeam line 44 C/C++ Problem
no return statement in function returning non-void [-Wreturn-type] CTeam.cpp /CTeam line 43 C/C++ Problem
No return, in function returning non-void CTeam.cpp /CTeam line 39 Code Analysis Problem

Ich verstehe es nicht warum?
Auf diesen Beitrag antworten »
eulerscheZahl

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:
#pragma once
#include <string>
#include <iostream>
using namespace std;


class CTeam{

private:
	string m_teamName;
	unsigned int m_winsTotal; //Initialisierung kommt in die .cpp, nicht in den header
	unsigned int m_equalTotal;
	unsigned int m_lostTotal; //die Zeile hat gefehlt
	unsigned int m_goalsScoredTotal;
	unsigned int m_goalsReceivedTotal;

public:

	CTeam(string name); //keine default Werte im Header
	string getName();
	void addResult( unsigned int goalsScored, unsigned int goalsReceived);
    unsigned int getTotalPoints() const;

    friend ostream& operator << (ostream& out , CTeam const& rop); //du hattest >>
    bool operator < (const CTeam& rop) const;
};


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:
#include <iostream>
#include <string>
#include "CTeam.h"

using namespace std;

CTeam::CTeam(string name = "NoName") {
    m_teamName = name;
	m_goalsScoredTotal = 0;
	m_goalsReceivedTotal = 0;
	m_winsTotal = 0;
	m_equalTotal = 0;
	m_lostTotal = 0;
}

string CTeam::getName() {
    return m_teamName;
}


void CTeam::addResult(unsigned int goalsScored, unsigned int goalsReceived){
    if (goalsScored > goalsReceived) {
        m_winsTotal++;
    }
    if (goalsReceived > goalsScored) {
        m_lostTotal++;
    }
    if (goalsReceived == goalsScored) {
           m_equalTotal++;
    }
	m_goalsScoredTotal += goalsScored;
	m_goalsReceivedTotal+= goalsReceived;
 };

unsigned int CTeam::getTotalPoints() const {
	  return  m_winsTotal*3 + m_equalTotal*1;
};

ostream& operator << (ostream &out, const CTeam &rop) {
	 out<<"CTeam@" << rop.m_winsTotal<< "Spiele gewonnen  " << " , " <<  rop.m_equalTotal << " Spiele unentschieden"<< endl;

	 out << "CTeam@"<<  rop.m_goalsScoredTotal << " Tore erzielt " <<" , " << rop.m_goalsReceivedTotal << " " << " Tore kassiert "<< endl;
};
bool CTeam::operator < (const CTeam& rop) const {
	//es wird true zurückgegeben, wenn der linke Operand mehr Punkte hat als der rechte Operand
	if (this->getTotalPoints() > rop.getTotalPoints()) return true;

	//bei gleich vielen Punkten entscheidet die Tordifferenz
	if (this->getTotalPoints() == rop.getTotalPoints()) {
		int team1Diff = this->m_goalsScoredTotal - this->m_goalsReceivedTotal;
		int team2Diff = rop.m_goalsScoredTotal - rop.m_goalsReceivedTotal;
		//Wenn der linke Operand die bessere (höhere) Tordifferenz hat als der rechte, wird ebenfalls true zurückgegeben
		if (team1Diff > team2Diff) return true;
	}

	//in allen anderen Fällen wird false zurückgegeben
	return false;
}
Auf diesen Beitrag antworten »
progger

Was hast du geändert ?

Nur damit ich es weiss und daraus lernen kann.
Auf diesen Beitrag antworten »
Progger

Hat sich erledigt.
 
Neue Frage »
Antworten »


Verwandte Themen

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