2016-09-24 3 views
1

Ich bin sehr neu in der Programmierung. Für eine Zuweisung muss ich eine Funktion erstellen, die das Array in aufsteigender Reihenfolge sortieren kann. Ich habe eine Funktion geschrieben, funktioniert aber nicht ganz. Ich habe in diesem Forum schon viele Fragen zu Fällen wie diesem gelesen (zB nach Blasensorte gesucht), aber ich kann mein Problem immer noch nicht lösen.Sortierung Werte in einem Array in C

mein Code:

void sortOnValue(float *values, int size) 
{ 
int i, d; 
float swap; 

    for (i = 0; i < (size - 1); i++) 
    { 
     for (d = 0; d < (size - 1 - i); d++); 
     { 
      if (values[d] > values[d+1]) 
      { 
       swap = values[d]; 
       values[d] = values[d+1]; 
       values[d+1] = swap; 
      } 
     } 
    } 
} 

void main() 
{ 
int i; 
float x, y; 
float val[10]; //1.5, 2.2, 7.3, 9.2, 7.4, 7.5, -8.0, 1.5, 12 
val[0] = 1.5; 
val[1] = 2.2; 
val[2] = 7.3; 
val[3] = 9.2; 
val[4] = 7.4; 
val[5] = 7.5; 
val[6] = -8.0; 
val[7] = 1.5; 
val[8] = 12; 

printValues(val, 10); 
sortOnValue(val, 10); 
printValues(val, 10); 
} 

meine Ausgabe:

Values: 1.500 -8.000 2.200 7.300 9.200 7.400 7.500 0.000 1.500 12.000 

Jede Idee, warum es nicht funktioniert? Ich denke, es könnte sein, weil die Schleife endet, bevor es sollte, aber ich bin mir nicht sicher. Gibt es auch eine effizientere Möglichkeit, einem Array Werte zuzuweisen als das, was ich getan habe?

Vielen Dank im Voraus für jede Hilfe!

+1

Für eine Sache, die Sie nicht initialisieren alle Elemente im Array. –

+0

'float val [10] = {1,5, 2,2, 7,3, 9,2, 7,4, 7,5, -8,0, 1,5, 12}; 'zum Zuweisen. Auf diese Weise werden unspezifizierte Werte ebenfalls auf 0 gesetzt. – MayeulC

+0

Vielen Dank! Ich habe das mit versucht; Trennen Sie die Werte, also danke für den Tipp –

Antwort

1

Schauen Sie genau auf dieser Linie:

//    what's this? -------v 
    for (d = 0; d < (size - 1 - i); d++); 
    { 

Sie am Ende dieses for ein Streu Semikolon haben. Als Ergebnis haben Sie hier eine leere Schleife. Dann läuft der Block darunter jedes Mal.

Es loswerden und das Programm läuft, wie erwartet.

Als eine Frage des Stils, ist es empfehlenswert, die öffnende Klammer eines Blocks auf der gleichen Linie wie die Aussage zu haben, die es beginnt wie folgt:

for (d = 0; d < (size - 1 - i); d++) { 

, dass die Chancen, etwas zu reduzieren hilft wie das passiert.

Auch, wenn Sie ein Array initialisieren möchten, können Sie es wie folgt tun:

float val[10] = { 1.5, 2.2, 7.3, 9.2, 7.4, 7.5, -8.0, 1.5, 12, 9.9 }; 

Hinweis, die zuvor nicht alle 10 Elemente in dem Array zu initialisieren. Ich habe hier noch ein Element hinzugefügt, um das Ganze auszufüllen.

+0

Vielen Dank! –

1

Ändern

für (d = 0; d < (Größe - 1 - i); d ++); und d + 1

Um

für (d = i + 1; d < Größe; d ++) und d + i

Vergleichswerte [i] mit den Werten [d + i] und dann tauschen entsprechend.

+0

Nur beachten Sie, dass, da der letzte Wert nicht initialisiert ist, Entfernen von -1 könnte etwas in * diesem * Beispiel zu brechen. – MayeulC

+0

Dem stimme ich zu. –