Feld sortieren

habe jetzt anstatt n in der Schleife ein i genommen. Und das gleiche Ergebnis :(

habe in meinem letzten beitrag was geändert. Die reihenfolge bleibt in der Ausgabe unverändert
 
ich werd langsam verrückt. ich lerne seit vier wochen für dieses eine Programm und kann mich gar nicht auf meine anderen 4 klausuren vorbereiten ...:( gibt es einen trick um c besser zu verstehen? bei jeder Aufgabe steh ich erneut auf dem Schlauch und bin auch Hilfe angewiesen....:(
So schwer kann das doch nicht sein
 
Code?
Ich würde wieder auf ein undefiniertes int i tippen, das vom Compiler auf 0 gesetzt wird.
Die Schlaufen grundsätzlich: Eigentlich brauchst du ja nur die n-Schlaufe (oder jetzt i-Schlaufe) zum Sortieren. Die m-Schlaufe verbessert lediglich die Präzision (vager Begriff, ich weiss).
Du solltest die n/i-Schlaufe nicht von m abhängig machen, sondern:
C:
for(int i = 0;i<n-1;i++)
{
    //Code
}

Gruss
cwriter
/EDIT: Zu deinem neuen Post:
Tricks gibt es keine, zumindest keine direkten. Möglicherweise helfen dir Flussdiagramme (ich finde sie eigentlich nur lästig, aber jeder hat seine eigenen Präferenzen), möglicherweise hilft dir ein Plan in Pseudocode, den du dann nur nach c-Code übersetzen musst.
Ich könnte dir lediglich sagen, wie ich Programmieren lernte: Ich startete als 9-jähriger mit Scratch (scratch.mit.edu), dann wurde es mir zu langweilig und ich wechselte mithilfe von http://www.c-programmieren.com/C-Lernen.html zu C (Dieses Tutorial ist veraltet und beinhaltet einige Fehler...).
Aber eine allgemeingültige Lösung gibt es nicht (natürlich "Fleiss", aber wenn die Motivation fehlt, nützt auch dieser nix...)
Stelle einfach Fragen, und wie du siehst, geben wir in diesem Forum selten komplette Codes ab, sodass der Fragesteller sich auch noch etwas dazu überlegen kann.
Falls du es wünschst, könnte ich dir auch einen fertigen Sortieralgorithmus schreiben, aber dann musst du wissen, ob der Lerneffekt dabei besonders gross ist...
 
Zuletzt bearbeitet:
ich hab jetzt tausend mal die schleifen variablen geändert und jetzt klappt es endlich******! Die Variabel in der Schleife muss die gleiche sein wie im feld, sonst funktioniert es nicht. Ich stell jetzt ma die fertige Version rein.

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;
    int i;                      /*Tauschvariable*/
    for (m=0;m<3;m++)               /*große Schleife*/

    {   for (n=0;n<4-1;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*/
 
Nein! :eek:
Bitte nicht! Nimm niemals Konstanten bei einem variablen Code!
C:
float sortieren (int n, float *f) /* Funktionsdefinition*/
 
{
    int m;                          /*Variable für große Schleife*/
    float w;
    int i;                      /*Tauschvariable*/
    for (m=0;m<n-2;m++)               /*große Schleife -- hier könnte man besser n-2 schreiben*/
 
    {   for (i=0;i<n-1;i++)           /*kleine Schleife -- Hier habe ich die n's durch i's ersetzt*/
        {
            if (f[i+1]<f[i])
            {
                w=f[i];             /*immer zwei Variablen vertauschen
                                        wenn die rechte Variable größer ist als die linke*/
                f[i]=f[i+1];
                f[i+1]=w;
 
            }
        }
    }
}
Gruss
cwriter
 
Zuletzt bearbeitet:
Auf die Idee bin ich sogar von selbst noch gekommen. So kann ich einfach die Anzahl der Zahlen in dem Feld ändern. :) Aber danke trotzdem für die Bestätigung dass meine endversion richtig ist :)
 
Hi studine,

Du hast ja mal gemeint, dass du dir das selber aneignen willst, von daher hab ich noch gewartet bis du von selber eine Lösung für dein Problem gefunden hast.

C:
#include <stdlib.h>
#include <stdio.h>

// funktionsköpfe
void ausgabe(float*, int);
void tauschen(float*, float*);
void sortieren(float*, int);

int main(int argc, const char** argv) {
  // daten festlegen
  int size = 4;
  float f[] = {
    8.1, 2.3, 6, 5
  };

  // ausgabe unsortiert
  puts("Unsortierte Zahlen:");
  ausgabe(f, size);

  // liste sortieren
  sortieren(f, size);

  // ausgabe ergebnis
  puts("Sortierte Zahlen:");
  ausgabe(f, size);

  // fertig
  return 0;
}

void ausgabe(float* f, int size) {
  int i;
  for(i = 0; i < size; i++) {
    printf("%f ", f[i]);
  }
  puts("");
}

// tauscht zwei array elemente
void tauschen(float* a, float* b) {
  float temp = *a;
  *a = *b;
  *b = temp;
}

// einfacher bubble sort algorithmus
void sortieren(float* elems, int size) {
  int i;
  for(i = 1; i < size; i++) {
    // wenn die zahl vorher größer als die aktuelle zahl ist:
    if(elems[i - 1] > elems[i]) {
      // die beiden elemente tauschen
      tauschen(&elems[i - 1], &elems[i]);

      // nochmal von vorne anfangen
      i = 1;
    }
  }
}

Für dich besonders interessant sollte die sortieren-Funktion sein. Diese läuft nach einem simplen Bubblesort Algorithmus ab, den sollte jeder angehende Programmierer kennen :)

Grüße,
BK
 
so einfach geht das? mit einer Funktion? Ich habe das immer überall total umständlich gefunden, deswegen habe ich es selber versucht....Danke
 
Zurück