Feld sortieren

studine

Mitglied
Hallo zusammen,

ich möchte gerne ein Feld mit mehreren Zahlen von klein bis groß sortieren. Da gibt es zwar schon sozusagen fertige Programme zu, aber ich möchte gerne mein Programm selbst erstellen wegen dem Lerneffekt. Ich finde, fertige Programme auswendig lernen bringt nichts, man muss selber drauf kommen. Jetzt habe ich mein Programm geschrieben, und die Ausgabe gibt mir aber immer 0.0000000 zurück und nicht wie gewünscht das sortierte Feld. Kann mir jemand sagen, wo der Fehler liegt?

Hier mein Programm:

C:
#include <stdio.h>

void sortieren ( int, float *); /*Funktionsdeklaration*/

int main()
{
    int n=4;                    /*Feld hat 4 Zahlen*/
    float f[n];
    f[0]=8.1;                   /*Feld mit Zahlen gefüllt*/
    f[1]=2.3;
    f[2]=6;
    f[3]=5;

    sortieren (n,f);            /*Funktionsaufruf*/

    printf("%f\n",f[n]);        /*Ausgabe des sortierten Feldes*/


    return 0;
}


void sortieren (int n, float *f) /* Funktionsdefinition*/

{
    int m=4;                    /*Index des sortierten Feldes*/
    float min;                  /*kleinste Zahl im Feld soll min sein*/


    for (m=0;m<4;m++)           /*Hier soll im feld f[n] erst der kleinste wert herausgefunden werden,
                                und dann an die erste Stelle des Feldes f[m] gelegt werden.*/

    {   for (n=0;n<4;n++)
        {
            if (f[n]<min)
            {
                min=f[m];
        }   }

    }


return 0;
}
 
Hi,

ohne deine "sortieren()" genauer angeschaut zu haben; Du verweist im printf() (Zeile 16) auf f[n], wobei das letzte Element f[n-1] ist.

// Edit: Etwas komischer Algorithmus, aber soweit ich das richtig verstehe suchst du eigentlich nur die kleinste Zahl und speicherst diese dann hinten an das Array ran. Somit reicht es, wenn du in Zeile 8 dein Array mit der Größe "n+1" erstellst.

Das "return" in Zeile 43 muss auch weg, du deklarierst die Funktion als "void", somit keine Rückgabe.

Grüße,
BK
 
Zuletzt bearbeitet:
warum ist das letzte Element f[n-1]?

habe jetzt in Zeile 8 aus f[n] f[n+1] gemacht und es kommt trotzdem in der Ausgaben 0.000000 raus
 
Definiere float min. So gibt es nur ein undefined behaviour.
Nimm den grössten zu erwartenden Wert + 1 für min.

Gruss
cwriter
 
Du schreibst
C:
float min;
Ich frage: Welchen Wert hat min nun?

Irgendeinen.

Man weiss schlicht nicht, was min für einen Wert beherbergt.
Wenn du nun das hier das erste Mal machst:

C:
  if (f[n]<min)
prüfst du, ob f[n] < 1000 ist. Vielleicht ist es aber auch f[n] < 0. Vielleicht ist min auch 123: Man weiss es nicht, min ist nicht definiert.

Gruss
cwriter
 
Zuletzt bearbeitet:
ich habe was geändert und zwar

C:
for(n=0;n<4;n++)                  /*neu eingefügt*/
    {printf("%f\n",f[n]);}        /*Ausgabe des sortierten Feldes*/


Jetzt gibt er mir endlich alle Zahlen des feldes raus aber in der ursprünglichen Reihenfolge.

Ich kann den Fehler absolut nicht finden, weil mir hier für einfach die C-Kenntnisse fehlen. Könnt ihr mir helfen?
 
Hallo

siehe Edit.

Eine Frage hätte ich da noch: Machst du das privat oder in der (Schul-) Klasse?

Gruss
cwriter
 
Zuletzt bearbeitet:
Ich mache das im Studium, allerdings habe ich den Kurs vor zwei Semestern belegt und schreibe jetzt erst die Klausur....

dein edit habe ich übersehen, sry.

wegen min. ich habe min direkt die zeile danach quasi definiert. So hat das bei einer anderen Aufgabe auch funktioniert.

aber ich habe mein Programm jetzt etwas umgestellt. Es sieht folgendermaßen aus:

C:
#include <stdio.h>

float sortieren ( int, float *); /*Funktionsdeklaration*/

int main()
{
    int n=4;                    /*Feld hat 4 Zahlen*/
    float f[n];
    f[0]=8.1;                   /*Feld mit Zahlen gefüllt*/
    f[1]=2.3;
    f[2]=6;
    f[3]=5;

    sortieren (n,f);            /*Funktionsaufruf*/
    for(n=0;n<4;n++)
    {printf("%f\n",f[n]);}        /*Ausgabe des sortierten Feldes*/


    return 0;
}


float sortieren (int n, float *f) /* Funktionsdefinition*/

{
    int m;                          /*Variable für große Schleife*/
    float w;                        /*Tauschvariable*/
    for (m=0;m<n;m++)               /*große Schleife*/

    {   for (n=0;n<m;n++)           /*kleine Schleife*/
        {
            if (f[n+1]<f[n])
            {
                w=f[n];             /*immer zwei Variablen vertauschen
                                        wenn die rechte Variable größer ist als die linke*/
                f[n]=f[n+1];
                f[n+1]=w;

            }
        }
    }
}

/*die zwei Schleifen machen folgendes:
1. mal kleine Schleife:
[8.1 2.3 6   5  ]--> start
[2.3 8.1 6   5  ]--> 1. tausch
[2.3 6   8.1 5  ]--> 2. tausch
[2.3 6   5   8.1]--> 3. tausch

2.mal kleine Schleife:
[2.3 6   5   8.1]--> start
[2.3 5   6   8.1]--> 1. tausch
2. und 3. Tausch findet nicht statt, weil if nicht mehr erfüllt, da schon sortiert*/


Ausgabe:
8.1
2.3
6
5

nicht sortiert******
 
Zuletzt bearbeitet:
Nun, die Schleife wird wohl gar nicht ausgeführt.
C:
for(m = 0;m < n;n++)
//Sagen wir, n ist 4.
// Ist 0 < 4 -> Ja, also weiter
//dann kommt
for(n = 0;n<m;n++)
//Huch, n ist plötzlich 0. Jetzt ist n == m -> ein Grund, diese Schleife abzubrechen
//Dann wird m++ gerechnet, also ist m nun 1.
//Nun wird überprüft: Ist m < n, d.h.: Ist 1 < 0 -> Nein-> Abbruch
Nimm in der Schleife für das zählende n eine andere Variable. Man sollte grundsätzlich nicht Parametervariabeln umschreiben: Wie du siehst, führt das zu Problemen.

Gruss
cwriter
 
Zurück