Programm läuft Fehlerhaft...

philishake

javascript enthusiast
Hallo.

Ich habe ein Projekt mit dem schönen namen RouRe. Dieses soll die Zahlen 0-36 die in einer textdatei sind nach einem bestimmten Muster berechnen. Die Zahlen stehen untereinander und sind zufällig angeordnet, ca. 300 pro Datei.

Detaillierter Ablauf:
Das Programm nimmt sich eine Zahl. Nun überprfüt es die letzten 5 Zahlen, ob dieser zur gleichen Gruppe wie dieselbige gehören. Ist Dies der Fall wird auf die aktuelle Zahl "gesetzt", d.h. es wird überprüft, ob die drei nachfolgenden Zahlen der sleben Gruppe angehören. Ist dies bei der letzten der Fall, so gibt es 16 Punkte, bei der zweiten 14, bei der dritten 12 und ist kein Treffer dabei, so werrden 6 Punkte abgezogen. Bei einem Treffer wird anschlißend auf die nächsten Zahlen wietergesetzt, bis kein Treffer mehr kommt. Dann wird zu nächsten bzw. letzten Zahl zurückgesprungen und das prodzedere wiederholt sich, bis jede Zahl überprügft wurde. Wenn am Ende der Datei (so 1-2 Zahlen vor schluss) nochmal gestzt werden muss, so geht das nur wenn noich zahlen da sind. Bsp: die letzten Zahlen sind 4 und 23 und die Grippe auf die gestzt wird, beinhaltet keien dieser Zahlen, dann wird so oft -2 gemacht bis ende ist indem Fall -4.

Problem :
Das Programm läuft soweit einwandfrei. Bis auf die tatsache, das er bei erstem (+16) und zweitem (+14) Treffer immer verisst weiterzusetzten.
Das zweie Problem ist, das er am ende immernoch eine 0-Zeile hinzufügt und 6 Punkte abzieht, obwohl schluss ist.
Ich habe den Code oft durchgesehen und dreh langsam durch. Man selbst findet den Fehler immer schwer, da man seinen eigene Code ja immer gut kennt.
Ich weiß auch, das mein Code für erfahrenen vllt der reinste Horror ist, aber erst wenigstens sortiert ud ordentlich.

Anbei liegen die RouRe.exe, die rorue.ccp, die roureF.ccp (included) , die test.txt (da sind die zahlen drin) die punkte.txt (benötigt die roure.exe) und die ergebnis.txt (zum einsehen der Fehler).

Es wäre nett wenn jemand die Zeit hat und sich das Problem mal anschaut.
Alle dateien kann man im *.rar, und *.zip Format von folgenden URL'S herunterladen. Di Dateien sind mit der aktuellsten Version von AntiVir getestet und 100% sauber.

Files:
http://www.berlin-racing.de/phil/roure.rar ( 99 kb)
http://www.berlin-racing.de/phil/roure.zip ( 125 kb)
 
Hi.

Ich hab mir nur mal die eine Funktion angeschaut:

Code:
void schreibedateiinarray(char dateiname[50])
{
  
  int str, maximal = 1, zeilen = 0;
du hast hier eine Variable die "str" heißt, aber vom Typ int ist. (keine ganz so günstige Namensgebung, macht natürlich nix).

Code:
  ifstream b_file (dateiname);
   
  while(maximal == 1)
    {
      b_file >> str;
      if(str == -858993460)
1. Warum testest du nicht "ganz normal" ob das öffnen der Datei geklappt hat?
2. Du solltest lieber das übliche Idiom für Lesen einer Datei in C++ verwenden.
3. -858993460 ? Wo hast du denn diesen Wert her? :confused:

Vorschlag:
Code:
  ifstream b_file (dateiname);
  
  if (!b_file) /* zustand des input streams nicht in ordnung, es gab irgendein problem */
    return;

  while (b_file >> str) { /* solange wie ein Wert gelesen werden kann... */
  }
Code:
      for(int i=0; i << zeilen; i++)
Du weißt schon das du hier in der Abbruchbedingung den Links-Shift Operator
verwendest und keinen Vergleich?

Code:
          while(b_file)
            {
              if(b_file.get() == '\n')
                break;
            }
Leerzeichen (inkl. Zeilenende) werden automatisch überlesen wenn du den ">>" operator des ifstreams verwendest. D.h. wennn da nicht noch mehr Werte auf einer Zeile sind, die du ignorieren möchtest kannste das weglassen. Außerdem könnteste wahlweise ein "b_file.getline( );" machen.

Code:
      b_file >> str;
      if(str >= 37)
Wo ist hier die Abfage ob überhaupt erfolgreich etwas eingelesen werden konnte?

Ich vermute mal das sind aber nicht die einzigen Fehler...
 
Ich hab mir grad nochmal angekuckt wie du die Gruppe einer Zahl bestimmst, nämlich mit Arrays. Man kanns allerdings auch berechnen:
Code:
int gruppe (int x) {
  if (x == 0) return 10;
  else return 1 + (x-1)/12 * 3 + (x-1) % 3;
}
(und hat ca. 50 Zeilen gespart ;-))
 
Ja, entferne einfach erstmal diese kleinen Fehler überall im Programm, dann wird's auch übersichtlicher und man hat einen besseren Überblick. Evtl. erledigt sich dann das Problem von ganz alleine.

Was du machen kannst ist mal hier und da ein paar "cerr <<" Befehle einzufügen um zu sehen was falsch läuft und was der Wert deiner versch. Variablen im Programm ist.

Außerdem hast du ja einen ganzen Ar*** voll globaler Variablen - noch nie was von Rückgabe werten bei Funktionen gehört? -- ist halt übel weil man nicht weiß welche Funktion welchen Seiteneffekt hat und ehrlich gesagt steig ich da so noch nicht ganz durch...

Ich muß denn mal. Bis morgen.
 
Hy!

Ich wollte mir das ganze auch mal schnell anschaun, aber...bin ich schon ganz blöd, hast du nicht die roure.h vergessen?

Achja, warum verwendest du eigentlich nicht die stringklasse von c++?

mfg
uhu01
 
Zuletzt bearbeitet:
ja, die roure.h fehlt, sorry. werd sie bei gelegheit hochladen, aber hab grad nen problem mit meinem Hauptrechner, muss erst ma alles via laptop lösen, d.h. ich komm an die daten ertsmal nicht ran.
 
Ich habe mal so über die Funkrion 'chekcstzen' nachgedacht, kann es sein das er den fehler nur bi 12 nicht macht, weil es am ende steht... was ich brächte wäre die funkrion 'elseif' die kenn ich aus php, aber ich habe 3 bücher und in keienm stand was von elseif ic c/c++
 
Man brauch ja nicht unbedingt ein Schlüsselwort "elseif", sondern man kann doch mehrere "if ... else" hintereinander hängen:
Code:
if (x == 6) {
...
} else if (x == 7) {
...
} else if (x == 9) {
....
} else {
...
}
Ansonsten kann ich nur sagen, das ich völlig verwirrt bin. Was ist das für Kode?

Z.B. wozu soll sowas gut sein:
Code:
zeile[position] = zeile[position] + 0;
?

Und da ist ziemlich viel solch "toter" Kode drin der überhaupt nix macht. Kein Wunder das du dich selber nicht mehr auskennst und den Fehler nicht findest. Am besten wäre es wahrscheinlich alles nochmal zu überarbeiten und richtig in C++ zu programmieren (ich kenne PHP nicht, aber wenn PHP zu einem solchen Programmierstil führt, sollte man es verbieten).

Das soll jetzt nicht irgendwie demotivierend sein oder so, alle Achtung das du soviel Kode geschrieben hast (auch wenn unnötigerweise), aber es wäre wirklich gut wenn du dir nochmal die Grundlagen ankuckst.

Nur nochmal ein Beispiel:
Code:
  while(blub[position] == 0)
    {
      zeile[position] = zeile[position] + 0;
      position++;
      if(blub[position] != 0)
        {
          break;
        }
    }
Wieso machst du's denn immer so kompliziert und doppelt gemoppelt? In der Abbruchbedingung testest du ob blub[position] gleich 0 ist - d.h. die Schleife wird solange durchlaufen bis es ungleich 0 ist, innerhalb der Schleife testest du wiederum auf ungleich 0 und brichst die Schleife dann ab. Das wär doch aber sowieso passiert? Der folgende Kodeschnipsel macht doch exakt dasselbe, oder nicht?
Code:
  while(blub[position] == 0)
    {
      position++;
    }
/edit: Wobei du normalerweise noch aufpassen mußt, dass du nicht über das Ende des Arrays hinaus liest, d.h. die while-Bedingung sollte eher sowas sein wie "position <= zeilemax && blub[position] == 0".
 
Zuletzt bearbeitet:
Zurück