003
28.09.2017, 17:14 Uhr
Hans
Library Walker (Operator)
|
Hi,
nun ja, um eine solche, geänderte Liste zu erhalten, musst Du zwar die Inhalte der einen Liste verschieben, darfst sie aber nicht sofort löschen. Aber genau das tut Dein Programm in der Form, wie es oben steht. Werte in einem Array oder grundsätzlicher: in einer Liste zu verschieben bedeutet aber immer mindestens eine Tauschoperation.
Wenn ich das Problem richtig verstanden habe, dann willst Du die KO-Liste so lassen, wie sie ist, und die Werte aus der Kraftliste an diejenigen anpassen, die an der entsprechenden Stelle der KO-Liste stehen. Dazu brauchst Du zwei Indizes: einen, mit dem Du durch die KO-Liste gehst und den zweiten, um immer wieder die Kraftliste durchzugehen. Wenn Du in der Kraftliste den Wert gefunden hast, der dem in der KO-Liste am nächsten ist, kannst Du diesen an die passende Stelle in Liste 3 schreiben, wobei Du dazu den Index der Kraftliste nimmst. Dann, und erst dann kannst Du den Wert in der Kraftliste (Liste 2) löschen, damit das Programm auch mal zu einem Ende kommt. Denn Du must die Suche jedesmal von vorne anfangen, und sooft wiederholen, bis Du die KO-Liste durchgearbeitet hast. Das geht bei diesem Ansatz tatsächlich nur mit einem Zusatzarray, und dem löschen der bereits verarbeiteten Daten aus der Kraftliste. Schliesslich ist es am Ende nötig, die Werte aus Liste 3 wieder in das Kraftarray zurück zu kopieren, denn sonst funktioniert die Spielelogik nicht mehr, weil ja alle Werte auf Null stehen.
Das durchsuchen der Kraftliste hat eine gewisse Ähnlichkeit mit dem Insertionsort, deshalb hab ich dessen Wikipediaartikel mal verlinkt.
Dann ist es Sinnvoll, den Listen aussagekräftigere Namen zu geben, wie ich das in den Erklärungen oben schon praktiziert habe: Wenn die Liste 1 also eine KO-Liste sein soll, dann nennt man sie am besten auch so. Das erleichtert es ungemein, das Programm und seine Logik zu verstehen.
Was Dein Programm angeht, so kommt vor Deiner Bearbeitungsschleife bei mir folgendes bei heraus:
Code: |
Liste 1: 3, 12, 1, 5, 7, Liste 2: 6, 1, 0, 4, 12, Liste 3: 32, 65488, 8388608, 4211214, 1299968,
|
Nach Deiner Bearbeitungsschleife:
Code: |
Liste 1: 0, 0, 0, 0, 0, Liste 2: 0, 0, 0, 0, 0, Liste 3: 6, 12, 8388608, 4211214, 1299968,
|
D.h. Du löschst Daten, die Du gar nicht löschen willst. Die komischen grossen Zahlen in Liste 3 kommen dadurch zustande, dass der Speicherbereich, der die Werte für Liste 3 beherbergt, nicht initialisiert wurde; d.h. es wurden keine Ausgangswerte definiert, die gelten sollen, wenn der Speicher unbenutzt ist. Sieh Dir dazu mal an, was dieses (Konsolen)Programm ausgibt:
C++: |
#include <iostream>
using namespace std;
int main() { int Array[7];
cout << "Array: "; for (int i=0; i < 7; i++) { cout << Array[i] << ", "; } cout << endl; return 0; }
|
Wenn ich das Programm mehrmals hintereinander aufrufe, ist zumindest der erste Wert immer anders. Es kann unter einer anderen Windowsversion oder unter Linux oder MacOS aber so sein, dass bei jedem Aufruf völlig andere Werte herauskommen. Das lässt sich nicht vorher sagen.
Und das hier:
Zitat: |
... (Array startet bei 0)
|
gilt in allen C-Dialekten grundsätzlich immer! Wenn Du ein Array mit 1 starten willst, musst Du es entsprechend programmieren: Immer ein Element mehr definieren, als in dem Array vorkommen soll. Etwa so:
C++: |
int Array[11]; // Array für 10 Elemente
Array[0] = 0; // Sicherheitsmassnahme: nulltes Element auf Null setzen, damit es einen // definierten Wert hat, falls man doch mal drauf zugreift. Alternativ geht auch -1 (minus eins).
for (int i=1; i<=10; i++) // tue irgendwas
|
P.S.: Da ich kein Qt installiert habe, hab ich die Ausgabe von Deinem Programm auf Konsolenausgabe, also Kommandozeilenfenster abgeändert. Das sieht so aus:
C++: |
////////////////////////////////////////////////////////////////////////////////////////// /* #include "mainwindow.h" #include <QApplication> #include <QDebug> */
#include <iostream>
using namespace std;
int main(int argc, char *argv[]) { int liste[5]={3,12,1,5,7}; int liste2[5]={6,1,0,4,12}; int liste3[5]; int max= liste[0]; int max2= liste2[0]; int pos=0; int pos2=0; int i;
// QApplication a(argc, argv);
// Listen ausgeben... cout << "Liste 1: "; for (i=0; i < 5; ++i) { cout.width(3); cout << liste[i] << ", "; } cout << endl << "Liste 2: "; for (i=0; i < 5; ++i) { cout.width(3); cout << liste2[i] << ", "; } cout << endl << "Liste 3: "; for (i=0; i < 5; ++i) { cout.width(3); cout << liste3[i] << ", "; } cout << endl;
for (i=0; i < 5; ++i) { if (liste[i] > max) //Maximum der ersten Liste ermitteln { max=liste[i]; //Wert pos=i; // Position }
if (liste2[i] > max2) //Maximum der zweiten Liste ermitteln { max2=liste2[i]; //Wert pos2=i; // Position } liste3[pos]=max2; //Liste drei erhält an korrespondierender Position den jeweiligen Maximalwert liste2[i]=0; //Ermitteltes Maximum wird 0 damit ein neues Maximum gefunden werden kann liste[i]=0; //Ermitteltes Maximum wird 0 damit ein neues Maximum gefunden werden kann }
for (i=0; i < 5; ++i) {
// qDebug() << liste3[i]; // 3. Liste mit den korrespondierenden Werten
}
cout << "Liste 1: "; for (i=0; i < 5; ++i) { cout.width(3); cout << liste[i] << ", "; } cout << endl << "Liste 2: "; for (i=0; i < 5; ++i) { cout.width(3); cout << liste2[i] << ", "; } cout << endl << "Liste 3: "; for (i=0; i < 5; ++i) { cout.width(3); cout << liste3[i] << ", "; } cout << endl;
// return a.exec(); return 0; }
|
-- Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung. Dieser Post wurde am 28.09.2017 um 19:02 Uhr von Hans editiert. |