Programmieren - alles kontrollieren 4.940 Themen, 20.676 Beiträge

Kann mir jemand bitte diesen Programmteil erklären

unique_79 / 11 Antworten / Baumansicht Nickles

Hallo,

ich muß nächste Woche in der Schule ein Programm beschreiben, es geht dabei um das Spiel Fußballtoto, bei diesem Programmausschnitt geht es um die zufällige Auswahl der Spielbegegnungen, sie werden vorher aus einer Textdatei eingelesen und dann,zusammen gestellt. (Wie?)
Währe nett wenn mir jemand diese paar Zeilen hier erklären könnte, ich hab an die Zeilen die ich nicht verstehe einfach ein Fragezeichen hingemacht:

#include

bei Antwort benachrichtigen
Aragorn75 unique_79 „Kann mir jemand bitte diesen Programmteil erklären“
Optionen

Ist müsste C++ sein???
So richtig schlau werde ich daraus nicht... mir fehlen einige Werte...
Würde aber sagen, das zuerst eine Datei geöffnet werden soll, wenn diese nicht da ist, kommt der if-Teil mit der Ausgabe einer Fehlermeldung und zurück zum Anfang des Programms...
Wenn sie da ist und geöffnet werden konnte, weiß ich nicht weiter (1.while Schleife). Mit der 2.whie-Schleife wird wohl irgendwie einen grösse definiert, aber nicht einzusehen, welche das sein sollte...
Die for-Anweisung gibt auch wieder was aus, wenn i=0 ist...

Sorry, mehr kann ich mir mir meinen Kenntnissen nicht zusammen reimen...


bei Antwort benachrichtigen
ChrE unique_79 „Kann mir jemand bitte diesen Programmteil erklären“
Optionen

Hallo!

Ich bin keine grosse Leuchte in C++, aber versuchen wir mal zu helfen:
Man bräuchte noch die Klassendefinition der Objekte Vereine und Spiele.
Dann könnte man auch sagen, was die machen.

std::string y,dateiname = ("Vereine.txt"), tmp;

So könnte man es auch schreiben. Es werden halt drei String definiert.
Wobei dateiname gleich gefüllt wird.

while(Vereine.size()){
x= Vereine.begin()+rand()%Vereine.size();
Spiele.push_back(*x);
Vereine.erase(x);

Hier sollen wohl die Vereine zufällig "rand()" gemischt werden.
Ist mir aber schleihaft, wie das die Schleife bewerkstelligen soll.
x speichert zuerst einen Verein, der dann ins Objekt Spiele befördert wird.
Anschliessend wird der Verein gelöscht. "*x" bedeutet, es wird nur
die Adresse von x übergeben, nicht der Inhalt von x. Ob x oder *x
als Parameter übergeben wird, hängt von der Definition der Klasse ab, die
das Objekt Spiele erzeugte. Bestimmt heisst die Klasse "Spiel".
Vielleicht sollt ihr auch Fehler im Quelltext erkennen und verbessern?

for(i=0;i std::cout
Hier fehlt doch noch was. Die zweite Mannschaft. Wäre interessant, was da im
Index [...] steht. Die Laufweite des Index i wird wohl gleich über
die Ausgabeoperation bestimmt. Man kann es nicht sehen, das das for-Statement
unvollständig ist.

Hast Du noch mehr Quelltext? Es wäre erhellend.

Die Aufgabe sieht aus, als hätte sich ein Lehrer daran versucht,
alles möglicht abstrakt darzustellen. Ist für Leute, die Programmieren
lernen sollen natürlich suuper geeignet. Die armen Mädchen in der Klasse.
Die verstehen von solchen Konstrukten meistens gar nichts.
Ich kenne das noch aus meiner Lehre.

Gruß

ChrE

bei Antwort benachrichtigen
sitob unique_79 „Kann mir jemand bitte diesen Programmteil erklären“
Optionen

Hi,
nachdem ich heut mal meinen guten Tag habe und alles machen wuerde um nicht lernen zu muessen werde ichs mal versuchen.

>#include
>#include
>#include
>#include
>#include

Hier fehlt zunaechst was. Ich nehme mal an, dass da sowas steht wie #include

bei Antwort benachrichtigen
Dreamforger unique_79 „Kann mir jemand bitte diesen Programmteil erklären“
Optionen

Amüsant - eine Art halbausgefülltes Kreuzworträtsel :-) Das der Code ein wenig kryptisch ist, liegt daran das hier irrsinniger Weise HTML Posts verwendet werden und < und > in C und HTML unterschiedliche Syntaxen einleiten. Und jedesmal wenn einer auf diese idiotie aufmerksam macht, heißts "du fliegst gleich raus"

@Aragorn: schau dir in so einem Fall einfach den Quelltext der Seite an. Da steht das Posting noch so wie's hätte aussehen sollen.

Zum Problem:
In der ersten '?' Zeile werden die Vereine als Text ausgelesen und in einem Vector gespeichert. Ein Vector ist die STL implementation einer verketteten Liste


In der zweiten '?' Schleife werden die Vereine zufällig gemischt. Dazu wird ein zufälliger Verein ausgewählt

x= Vereine.begin()+rand()%Vereine.size()

Der gewählte Verein wird dann in die Spieleliste eingefügt

Spiele.push_back(*x) Das Sternchen ist nötig weil die Daten eingefügt werden sollen nicht nur ein Pointer darauf.

Damit Vereine nur einmal eingefügt werden, wird in der letzen Zeile der Verein aus der Liste entfernt.
Die letzte Schleife hätte so aussehen sollen:
for(i=0;i<Spiele.size();i+=2)
std::cout <<"\\n\\nSpiel "<< i/2+1 <<": "<< Spiele[ i ]<<" gegen "<<Spiele[i+1]<<std::endl;

Hier werden die Spielpaarungen tabellarisch ausgegeben. Trivial abgesehen davon das die << Syntax für neulinge etwas ungewohnt ist. Übrigens verrekt das Ding erbarmungslos wenn die Anzahl der Vereine ungerade ist. Ließe sich umgehen indem man die Schleife ändert auf

for(i=0;i<Spiele.size()-1;i+=2)


bei Antwort benachrichtigen
ChrE Dreamforger „Ja“
Optionen

Hallo!

Toll. Jetzt wird es wenigstens mir klar.
Das mit den verketteten Listen ist der Knackpunkt.
Aber ob diese Struktur den Schülern geläufig ist?

Mal sehen, was unique_79 dazu meint.


Danke

ChrE

bei Antwort benachrichtigen
vergisses Dreamforger „Ja“
Optionen

Hallo Dreamforger,

der Vector ist vermutlich keine verkettete Liste,
sondern wahrscheinlicher ein dynamisches Array.
Mit size() stellt man die Anzahl aktueller Einträge und
mit capacity() den bereits allozierten Speicherplatz für
aktuelle und kommende neue Einträge fest.

http://www.sgi.com/tech/stl/Vector.html

Gruss, vergisses

bei Antwort benachrichtigen
Dreamforger vergisses „Ja“
Optionen

um genau zu sein verspricht die stl nur bestimmte Laufzeiten für zugriff und änderung, ohne aussagen über die implementation zu machen. Nach den Laufzeitwerten ist die naheliegenste implementation eine vekettete Liste. Mittels amortiersierter analyse kann man zwar auch mit einem array die Laufzeit soweit runterlügen, ich find aber nicht besonders nett.
Nur von size und capacity auf ein array zu folgern ist ein bischen gewagt, schließlich kann ich die Werte auch bei einer Verketteten liste angeben.
Letzten endes ahb ich so meine Probleme mir die Iteratoren bei einem dynamischen array vorzustellen. Nicht das es nicht machbar wäre, höllenaufwändig ists halt

bei Antwort benachrichtigen
unique_79 Nachtrag zu: „Kann mir jemand bitte diesen Programmteil erklären“
Optionen

Hallo,

ich bin begeistert, ihr habt mir damit echt geholfen, einen Nachtrag hat unserer verwirrter Lehrer dann heute doch noch gegegben und zwar die for Schleife, aber dreamforger hat sie ja schon selber herrausgefunden , wobei die ich immer noch nicht ganz verstehe, was bedeutet das i+=2 ? genauso wie das i/2+1 in cout.
Ach ja, noch mal zum Verständis für die, die das Spiel nicht kennen, es werden 18 Mannschaften aus einer Textdatei eingelesen und dann daraus 9 zufällige Paarungen erstellt.

Gruß, unique

bei Antwort benachrichtigen
sitob unique_79 „Hallo, ich bin begeistert, ihr habt mir damit echt geholfen, einen Nachtrag hat...“
Optionen

Also i+=2 bedeutet nichts anderes, als dass nach jedem Durchlaufen der Schleife 2 auf das i addiert werden. Ist ne kurzschreibweise fuer i=i+2;

Das i/2+1 in dem cout bewirkt, dass immer die "Nummer der Paarung" ausgegeben wird.
In deinem Fall nimmt i folgende Werte an:
0 2 4 6 8 10 12 14 16
Das i/2+1 liefert dir dann immer entsprechend
1 2 3 4 5 6 7 8 9

Alles in allem erinnert mich das ganze sehr stark an meinen "Informatik-Unterricht" in der Schule.
Fuer die simpelsten Probleme packt man die Kanone aus und schiesst auf Spatzen. Wenn ich sowieso weiss, dass es nur 18 Manschaften sind brauche ich keinen Vector und wofuer speichert man sich die Spiele ab. Alles irgendwie (imho) sehr umstaendlich gehandhabt.

Naja viel Spass noch damit
sitob

bei Antwort benachrichtigen
unique_79 Nachtrag zu: „Kann mir jemand bitte diesen Programmteil erklären“
Optionen

jetzt hab ich noch vergessen zu fragen wofür dieser "iterator" gebraucht wird.

bei Antwort benachrichtigen
ChrE unique_79 „jetzt hab ich noch vergessen zu fragen wofür dieser iterator gebraucht wird.“
Optionen

Hallo!

Der Iterator adressiert ein Element innerhalb der
verketteten Liste. Hier besteht die Liste aus den
eingelesenen Vereinen und eine zweite aus den Spielen.
Du kannst auch auf die Links "vekettete Liste" und "STL"
im Posting von Dreamforger klicken, da wird es erläutert.

Wurde der Begriff "verkettete Liste" einmal im Unterricht
erwähnt?

Und warum war der Lehrer verwirrt?


Gruß

ChrE


bei Antwort benachrichtigen