Array Minimum Filtern und Ausgeben
-
Hallo Leutz,
ich bin noch Anfänger in der Programmiersprache C, aber kein Anfänger in Sachen Programmierung. Der folgende Code funktioniert in der 1. Fassung in Java tadellos, aber meine Übersetzung in C scheint nicht voll funktionsfähig zu sein. Sinn des Codes ist es das Array "entfernungen" an der Startzeile auszulesen, das Minimum zu finden und die aktive Zeile auf die Position des Minimums zu setzen. Alle gefundenen Minis werden in dem Array ergebnisse gespeichert, dieses Array wird weiterhin verwendet um zu überprüfen ob der Eintrag schon vorhanden ist und das Minimum angenommen werden kann. Wie bereits erwähnt funktioniert die Semantik in Java deshalb glaube ich, dass es ein Syntax-Problem ist. Wäre nett wenn mir Jemand helfen könnte.int main(int argc, char *argv[]) { //Durch den User veränderbar////////////////////////////////////// int startNummer=0; int n=7; // A B C D E F G int entfernungen[7][7]={{1000,143,156,370,262,130,180},//A {143,1000,165,302,319,271,247}, //B {156,165,1000,224,157,255,334}, //C {370,302,224,1000,280,478,534}, //D {226,319,312,234,1000,296,436}, //E {180,247,675,342,123,1000,180}, //F {140,213,645,321,231,190,1000}};//G //Ab hier keine Veränderungen mehr vornehmen///////////////////// printf ("EntfernungsRechner\n\n"); int ergebnisse[n]; int aktuell=startNummer; int run=0; for(run=0;run<n;run++){ ergebnisse[run]=aktuell; double minimum=0; int position=0; int i=0; for(i=0;i<n;i++){ int vorhanden=0; if(entfernungen[aktuell][i]<minimum || minimum==0){ int proof =0; for(proof =0; proof<n;proof++){ if(i==ergebnisse[proof]){ vorhanden=1; } } if(vorhanden == 0){ minimum=entfernungen[aktuell][i]; position=i; } } } aktuell=position; } int output =0; for(output =0; output<n;output++){ printf("%d. Ziel: %d\n",output+1,ergebnisse[output]); } printf("\nZiel A entspricht 0, B =1 usw.\n\n"); system("PAUSE"); return 0; }
Hier zum Vergleich der Java Codemit einigen Extras:
public class Control { //Nummer der Zeile des Startpunktes -1 z.B für A muss 0 angegeben werden int startNummer=0; //Arrays //Ziele double [][] entfernungen ={ {1000,143,156,370,262,130,180}, //A {143,1000,165,302,319,271,247}, //B {156,165,1000,224,157,255,334}, //C {370,302,224,1000,280,478,534}, //D {226,319,312,234,1000,296,436}, //E {180,247,675,342,123,1000,180}, //F {140,213,645,321,231,190,1000}, //G }; //Test 0, 5, 4, 3, 2, 1, 6 (sollOutput) public Control(){ System.out.println("EntfernungsRechner v1.3"); int n=entfernungen.length; int[] ergebnisse = new int[n]; boolean error=false; for(int j=0; j<n; j++){ int maximum=0; for(int i=0;i<entfernungen[j].length;i++){ maximum=i; } maximum++; if(maximum!=n){error=true;} } if(startNummer>n || startNummer<0){error=true;} int aktuell=startNummer; //Main Loop if(error==false){ for(int run=0;run<n;run++){ ergebnisse[run]=aktuell; double minimum=0; int position=0; for(int i=0;i<entfernungen[aktuell].length;i++){ boolean vorhanden=false; if(entfernungen[aktuell][i]<minimum || minimum==0){ for(int proof =0; proof<n;proof++){ if(i==ergebnisse[proof]){ vorhanden=true; } } if(vorhanden == false){ minimum=entfernungen[aktuell][i]; position=i; } } } aktuell=position; } for(int proof =0; proof<n;proof++){ System.out.println((proof+1)+". Ziel: "+ergebnisse[proof]); } System.out.println(); System.out.println("Ziel A entspricht 0, B =1 usw."); }else{ System.out.println("Ein Fehler ist Aufgetreten, bitte überprüfen Sie Ihre Eingaben!"); } } public static void main(String[] args) { Control ctrl = new Control(); } }
-
Hallo nochmal,
da sich noch keiner entschlossen hat zu antworten, werde ich versuchen noch konkreter auf den Fehler einzugehen. Scheinbar funktioniert das einlesen, bzw. das auslesen der Werte aus/ in die Arrays nicht richtig. Folgendes wird beim Comilieren auf der Console ausgegeben:EntfernungsRechner
1. Ziel: 2293260
2. Ziel: 4199440
3. Ziel: 2293728
4. Ziel: 2009095316
5. Ziel: 2008958704
6. Ziel: -1
7. Ziel: 2009143487Ziel A entspricht 0, B =1 usw.
Drücken Sie eine beliebige Taste . . .
Da in dem Array ergebnisse nur Werte wie 0, 1, 2 etc. eingegeben werden sollten ist die Ausgabe also falsch. Da es in C Pointer und keine Automatische Speicherverwaltung gibt nehme ich an, dass es sich bei den Ausgaben um Speicherplätze handelt. Falls noch irgendetwas unklar sein sollte dann bitte fragen.
-
Hallo nochmal,
da sich noch keiner entschlossen hat zu antworten, werde ich versuchen noch konkreter auf den Fehler einzugehen.Hehe. Das schadet nie.
Folgendes wird beim Comilieren auf der Console ausgegeben:
[...]Komisch. Bei mir ist die Ausgabe:
EntfernungsRechner 1. Ziel: 0 2. Ziel: 5 3. Ziel: 4 4. Ziel: 3 5. Ziel: 2 6. Ziel: 1 7. Ziel: 6 Ziel A entspricht 0, B =1 usw. Drücken Sie eine beliebige Taste . . .
-
Ehrlich? Wie kann das sein, dass ich da diese Zahlen herausbekomme? Hast du was verändert?
-
Nö, nichts verändert. Nur drübergeschrieben:
#include <stdio.h>
.
Wie das sein kann? Keine Ahnung.
Ich werd mal schauen, ob ich draufkomme, wenn du mir zusicherst, daß es sich sicher um den gleichen Code handelt, mit dem du arbeitest.
-
Ich habe den Code so wie er da steht rauskopiert und ausgeführt, Problem ist präsent.
-
Hmm. Ich komm nicht dahinter...
Ich schreib mal so dahin, während ich nachdenke:
startNummer ist 0. (Z 5)
Die 0 von startNummer geht in Z 21 an aktuell. aktuell ist dann also 0.
In Z 22 wird run auf 0 gesetzt, und in Z 25 nochmals.
Beim ersten Durchlauf der for-Schleife, die in Z 25 beginnt, ist run also 0.
Daraus folgt, dass im ersten Durchlauf in Z 27 folgendes gemacht wird:ergebnisse[0] = 0;
Z 27 ist die einzige Stelle, an der nach ergebnisse geschrieben wird.
Deshalb müsste auch bei dir zumindest die erste Ausgabe-Zeile stimmen (solange auch die Ausgabe richtig ist, aber auch da sehe ich gerade keinen Fehler).
Es wäre aber auch noch möglich, dass ergebnisse[0] später überschrieben wird.
Aber auch das schließe ich aus, weil run immer um 1 größer wird.Ich hab gerade ne dumme Idee: versuch mal in Z 19:
int ergebnisse[7]; // 7 statt n
Das ganze klingt nämlich nach nasal demon.
Mein Compiler ist im C99-Modus, und vorher gab's keine variablen Array-Größen.
Vielleicht hat's damit zu tun?
Welchen Compiler verwendest du eigentlich?Wenn das nicht hilft, kann ich dir nur raten, das ganze im Debugger laufen zu lassen, und den Wert von ergebnisse[0] zu beobachten.
Oder zu warten, bis jemand besserer als ich über die Sache stolpert...
-
Hi,
was du mal versuchen könntest, wäre den int n = 7. in ein const in zu deklarieren.
Danach läufts bei mir dann auch .
Visual Studio 2008
-
Das mit dem array[7] hat geholfen. Jetzt gibt er mir die Richtigen Ausgaben, dankeschön!
-
Wenn dir langweilig ist, schau mal auf
http://de.wikipedia.org/wiki/C99#C99So wie es momentan aussieht, musst du die 7 nämlich hinein-#definen, um dich nicht zu wiederholen.
Daran ist gar nichts verkehrt, aber C erlaubt heutzutage ein paar Dinge, die näher an Java/C++ sind.Für den GCC hätte es zur Lösung beispielweise auch gereicht, einfach mit -std=c99 zu übersetzen.