C++ 2 - Seite 2

Neue Frage »

Auf diesen Beitrag antworten »
progger

Aber ich muss sagen ,dass ich es in diesem Forum gut verstehe . großes Grinsen

Vielleicht kann ich ja dann das erlernte bei einer neuen Aufgabe später selbst anwenden
Was sind n und newn für Datentypen? Int denke ich ,aber es ist im Algorithmus nicht definiert
Was ist numbers und wo implementiert es die Funktion swap() ? geschockt
Warum steht das in der Funktion print? Stimmt muss ja hier stehen ,weil es ja sortiert ausgegeben wird großes Grinsen Blöd von mir.




void CTeamTable::sort() {
for (int i = 0; i < m_curEntry; i++) {
for (int j = 0; j < m_curEntry - 1; j++) {
if (m_pTable[j+1] < m_pTable[j]) {
CTeam tmp = m_pTable[j];
m_pTable[j] = m_pTable[j+1];
m_pTable[j+1] = tmp;
}
}

Das mit dem swap muss ich noch einbauen im Algoritmus oder?
 
Auf diesen Beitrag antworten »
eulerscheZahl

Ich hätte den Rest vielleicht auch reinkopieren sollen.

Das swap entspricht dem hier:
code:
1:
2:
3:
CTeam tmp = m_pTable[j];
m_pTable[j] = m_pTable[j+1];
m_pTable[j+1] 

Mit der Frage nach den Datentypen wollte ich darauf hinaus, dass du Variablen verwendest, die du nie definiert hast. Das kann gar nichts werden.

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

using namespace std;

CTeam::CTeam(string name) {
    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 << rop.m_teamName << " : " << rop.m_winsTotal << " " << rop.m_equalTotal << " " << rop.m_lostTotal << " ( " << rop.getTotalPoints() << " Punkte ) Tore " << rop.m_goalsScoredTotal << ":" << rop.m_goalsReceivedTotal << 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;
}


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;
	unsigned int m_equalTotal;
	unsigned int m_lostTotal;
	unsigned int m_goalsScoredTotal;
	unsigned int m_goalsReceivedTotal;

public:

	CTeam(string name = "noName");
	string getName();
	void addResult( unsigned int goalsScored, unsigned int goalsReceived);
    unsigned int getTotalPoints() const;

    friend ostream& operator << (ostream& out , CTeam const& rop);
    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:
#include "CTeamTable.h"
#include "CTeam.h"
#include <iostream>
using namespace std;

CTeamTable::CTeamTable(int unsigned maxEntry = 10){
	if (maxEntry < 5){
		maxEntry = 5;
	}
    m_maxEntry = maxEntry;
    m_curEntry = 0;
    m_pTable = new CTeam[m_maxEntry];

}

CTeamTable::~CTeamTable(){
	delete[] m_pTable;
}

bool CTeamTable::addTeam(CTeam const& team) {
	if (m_curEntry >= m_maxEntry) {
		return false;
	}
	m_pTable[m_curEntry++] = team;
	return true;
}

void CTeamTable::print(string headline) {
	cout << headline << endl;
	for (int i = 0; i < m_curEntry; i++) {
   		cout << i+1 << " - " << m_pTable[i];
	}
	cout << endl;
}

void CTeamTable::sort() {
	for (int i = 0; i < m_curEntry; i++) {
		for (int j = 0; j < m_curEntry - 1; j++) {
			if (m_pTable[j+1] < m_pTable[j]) {
				CTeam tmp = m_pTable[j];
				m_pTable[j] = m_pTable[j+1];
				m_pTable[j+1] = tmp;
			}		
		}
	}
}


code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
#ifndef CTEAMTABLE_H_
#define CTEAMTABLE_H_
#include<iostream>
#include "CTeam.h"
using namespace std;

class CTeamTable {
private:
	CTeam* m_pTable;
	unsigned int m_maxEntry;
	unsigned int m_curEntry;

public:
	CTeamTable(int unsigned maxEntry);
	~CTeamTable();
	bool addTeam(CTeam const& team);
	void print(string headline);
	bool addResult(string team1,string team2,unsigned int goalsTeam1, unsigned int goalsTeam2);
	void sort();
};

#endif /* CTEAMTABLE_H_ */


code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
#include <iostream>
#include "CTeam.h"
#include "CTeamTable.h"

using namespace std;

int main() {
	CTeam bayern("Bayern München");
	CTeam bvb("Borussia Dortmund");
	CTeam werder("Werder Bremen");
	bayern.addResult(3,3);
	bayern.addResult(1,4);
	werder.addResult(3,3);
	bvb.addResult(4,1);
	CTeamTable table(3);
	table.addTeam(bayern);
	table.addTeam(werder);
	table.addTeam(bvb);
	table.print("Unsortierte Tabelle");
	table.sort();
	table.print("Sortierte Tabelle");
};
Auf diesen Beitrag antworten »
progger

e)

CTeamTable tabelle[10];

Mit 10 Speicherplätzen muss man doch mit array darstellen ?
Auf diesen Beitrag antworten »
eulerscheZahl

Nein. EINE Tabelle, aber 10 teams in der Tabelle.
code:
1:
CTeamTable table(10);
 
Auf diesen Beitrag antworten »
progger

Und dieses table hatten wir irendwie voher definiert ?

Wie wird denn einfach so speicher angelegt ?
Auf diesen Beitrag antworten »
eulerscheZahl

Das ist ein Aufruf des Konstruktors von CTeamTable. Und der ist bereits umgesetzt.
Auf diesen Beitrag antworten »
progger

Die Objekte hinzufügen .

So?

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
#include "CTeamTable.h"
#include "CTeam.h"
#include <iostream>
using namespace std;

int main(){


	CTeamTable table(10);
	CTeamTable table(bayern);

	CTeamTable table(bvb);

};

Auf diesen Beitrag antworten »
eulerscheZahl

Hast du dir meine main Funktion angeschaut (Beitrag Gestern, 17:57)?
Auf diesen Beitrag antworten »
progger

Aber durch die main bekomme ich doch nicht ganz genau die gleiche aUSGABE WIE IM
beispiel oder ?

Man das ist alles richtig schwer
Auf diesen Beitrag antworten »
eulerscheZahl

Weil ich die f) nicht umgesetzt habe.
Dein Versuch ist syntaktisch nicht richtig.
Und schwer ist relativ smile
Auf diesen Beitrag antworten »
progger

Ok dann versuchen wir zuerst einmal die f) zu implementieren .

Die e) muss ich mir glaub ich heute abend nochmal in ruhe anschauen.

Bei der f) welche zwei Teams sind denn gemeint ?

WIr haben doch bayern ,bvb und Werder?
Auf diesen Beitrag antworten »
eulerscheZahl

Wirf man einen Blick auf die Ausgabe.
Wie unterscheidet sich die erste von der zweiten Tabelle?
Auf diesen Beitrag antworten »
progger

Die Punkte ,Tore usw sind anders ?
Auf diesen Beitrag antworten »
eulerscheZahl

Und welche beiden Teams könnten da gegeneinander gespielt haben?
Und wie ist es ausgegangen?
Auf diesen Beitrag antworten »
progger

Alle teams haben jeweils gegeneinader gespielt ?

Aber wie es jeweils ausgegangen ist ,verstehe ich nicht .

Kann die Ergebnisse nicht ganz interpretieren?
Auf diesen Beitrag antworten »
eulerscheZahl

Dortmund hat in der 1. Tabelle eine Tordifferenz von 4:1, in der 2. von 5:1. Dann hat der BVB wohl mit 1:0 gewonnen.
Und zwar gegen Bremen, die ihre Differenz um 1 verschlechtert haben.
Auf diesen Beitrag antworten »
progger

Ah jetzt verstehe ich es großes Grinsen

Also wie muss ich jetzt die Speicherpositionen von beiden festhalten ?
Auf diesen Beitrag antworten »
eulerscheZahl

Die Teamnamen werden als strings übergeben.
Da hilft nur suchen.
Auf diesen Beitrag antworten »
progger

Hier wird doch der Name des Teams ausgegeben?

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;
};
Auf diesen Beitrag antworten »
eulerscheZahl

Es hatte einen Grund, dass ich alles kopiert habe.
Die Ausgabe hatte ich ausgetauscht.
Auf diesen Beitrag antworten »
progger

großes Grinsen
code:
1:
2:
3:
4:
5:
6:
7:

ostream& operator << (ostream &out, const CTeam &rop) {
	out << rop.m_teamName << " : " << rop.m_winsTotal << " " << rop.m_equalTotal << " " << rop.m_lostTotal << " ( " << rop.getTotalPoints() << " Punkte ) Tore " << rop.m_goalsScoredTotal << ":" << rop.m_goalsReceivedTotal << endl;
};



Mithilfe von rop wird ja der teamname ausgegeben?
Auf diesen Beitrag antworten »
eulerscheZahl

rop ist erstmal das Team Objekt.
Aber damit kannst du dann auf den Teamnamen zugreifen, ja.
Auf diesen Beitrag antworten »
progger

Die Speicherpositionen wären demnach doch:

rop.Werder;

und rop.Bvb; ?

Danke das du soviel Lust hast zu erklären.

In anderen Foren ist das meist nicht so.
Auf diesen Beitrag antworten »
eulerscheZahl

rop ist die lokale Variable in der operator << Funktion (und es gibt kein rop.Werder, oder ist Werder eine Klassenvariable von CTeam?).
Du musst CTeamTable::addResult implementieren. Da kannst du über m_pTable auf die Teams zugreifen und den m_teamName mit den übergebenen Mannschaften vergleichen.
Auf diesen Beitrag antworten »
progger

Dann muss ich wieder mit thispfeiladdresult arbeiten oder ?
Auf diesen Beitrag antworten »
eulerscheZahl

Nein.
In der Main arbeitest du mit
code:
1:
table.addResult("Borussia Dortmund", "Werder Bremen", 1, 0);


in addResult brauchst du eine Schleife, die die vorhandenen Einträge (m_pTable[i].m_teamName) mit den übergebenen Namen vergleicht.
Auf diesen Beitrag antworten »
progger

if(m_pTable[i].m_teamName== ......)

sowas in etwa ?

Und die namen sind dann rop.TeamName?
Auf diesen Beitrag antworten »
eulerscheZahl

Da gibt es kein rop.
Schreibe mal den Funktionskopf von addResult hin.
Auf diesen Beitrag antworten »
progger

if(m_pTable[i].m_teamName== thispfeil addResult())

So in etwa?
Auf diesen Beitrag antworten »
eulerscheZahl

Ein Funktionskopf ist das, was im Header steht.
Auf diesen Beitrag antworten »
progger

bool addResult(string team1,string team2,unsigned int goalsTeam1, unsigned int goalsTeam2)

Das ist ja der FUnktionskopf .

Wie geht es weiter?
Auf diesen Beitrag antworten »
progger

jetzt muss ich ja m_pTable[i].m_teamName dem Funkionskopf irgendwie hinzufügen ?
Auf diesen Beitrag antworten »
eulerscheZahl

Wie heißen jetzt die Teamnamen, nach denen du suchen musst?
Es ist nicht this->addResult().
Auf diesen Beitrag antworten »
progger

this->m_pTable[i].m_teamName ?
Auf diesen Beitrag antworten »
eulerscheZahl

Und womit vergleichen wir das wohl?
Auf diesen Beitrag antworten »
progger

if(this->m_pTable[i].m_teamName == addResult())

?
Auf diesen Beitrag antworten »
eulerscheZahl

Du sollst nicht raten (zumindest nicht so schlecht).
addResult liefert ein bool, wie soll ein string gleich einem bool sein?

Schau mal, was an die Funktion übergeben wird:
bool addResult(string team1,string team2,unsigned int goalsTeam1, unsigned int goalsTeam2)
Vergleichen wir doch m_pTable[i].m_teamName mit team1, um die Heimmannschaft zu finden.
Und strings vergleichst du nicht mit ==, zumindest nicht in C++.
Auf diesen Beitrag antworten »
progger

Ich habe bisschen gegoogelt und gelesen:

strcmp(m_pTable[i].m_teamName,team1 )

Damit würde ich das doch vergleichen oder ?
Auf diesen Beitrag antworten »
progger

Wieso machen wir es niht gleich so?

strcmp(team1,team 2 )
Auf diesen Beitrag antworten »
eulerscheZahl

In m_pTable steht die Tabelle drin.
In team1 und team2 2 Mannschaften, die gegeneinander gespielt haben. Das sind unterschiedliche Dinge.
Ziel ist es, team1 und team2 in der Tabelle zu finden. Dann kann man auf die Teams zugreifen und ihnen das Ergebnis zuweisen.
Und damit die strings gleich sind, muss natürlich gelten:
strcmp(m_pTable[i].m_teamName, team1) == 0.

Ich bin weg für heute.
 
Neue Frage »
Antworten »


Verwandte Themen