Funktionsweise von C-Arrays: Sortieren von Zufallszahlen mit Code

5

Sie müssen tausend ganze Zahlen speichern. Wollen Sie wirklich „int a, b, c…“ bis hin zu „z“ deklarieren und dann weitermachen? Nein. Das ist mühsam und fehleranfällig. Stattdessen verwenden Sie ein Array.

Ein Array ist eine Sammlung von Werten desselben Typs. Es packt sie in einen einzigen Speicherblock. In C deklarieren Sie es folgendermaßen:

int a[5];

Das ist es. Fünf ganze Zahlen. Bereit zu gehen.

Warum C-Arrays bei Null beginnen

Hier ist der Trick, der Anfänger aus der Fassung bringt. C-Arrays sind nullindiziert.

Wenn Sie „int a[5]“ deklarieren, haben Sie fünf Slots. Aber sie sind mit 0, 1, 2, 3 und 4 nummeriert. Es gibt kein „a[5]“. Wenn Sie versuchen, auf „a[5]“ zuzugreifen, lesen Sie Speicher, der nicht zu Ihrem Array gehört. C wird dich nicht aufhalten. Es wird Ihnen nur Müll oder Abstürze bescheren. Dies ist eine Funktion, kein Fehler. Es ist schnell. Es ist auch gefährlich.

Der Zugriff auf Elemente erfolgt über eckige Klammern. „a[0]“ ist das erste Element. „a[4]“ ist das letzte.

Zufallszahlen in C generieren

Lasst uns etwas Nützliches bauen. Wir erstellen ein Programm, das 10 Zufallszahlen generiert und sortiert.

Zuerst benötigen Sie die Zahlen. Die Standardbibliothek von C verfügt über „rand()“, aber schauen wir uns eine klassische Implementierung an, um die Mechanik zu verstehen. Dieser Code verwendet einen linearen Kongruenzgenerator, eine Methode aus dem K&R C-Buch.

„c

int a[MAX];
int rand_seed=10;

/ Gibt eine Zufallszahl zwischen 0 und 32767 zurück /
int rand() {
rand_seed = rand_seed * 1103515245 +12345;
return (unsigned int)(rand_seed / 65536) % 32768;
}

int main() {
int i;
/ Array füllen /
für (i=0; i < MAX; i++) { a[i]=rand(); printf("%d\n",a[i]); } 0 zurückgeben; } „

Beachten Sie die Zeile „#define MAX 10“. Dadurch entsteht eine Konstante. Konventionsgemäß werden Konstanten in Großbuchstaben geschrieben. Es hebt sie hervor. Sie deklarieren das Array „int a[MAX]“ außerhalb der Funktion „main“. Dies macht es zu einer globalen Variable. Es existiert überall im Programm.

Die Variable „rand_seed“ ist ebenfalls global. Es beginnt bei 10. Da der Startwert festgelegt ist, sind die „Zufallszahlen“ tatsächlich bei jedem Start des Programms gleich. Wenn Sie echte Zufälligkeit wünschen, setzen Sie die Systemzeit ein. Im Moment ist die Konsistenz gut für das Debuggen.

Blasensortierung verstehen

Jetzt kommt der schwierige Teil. Sortierung.

Wir werden Blasensortierung verwenden. Es ist der einfachste Sortieralgorithmus. Es ist auch das langsamste. Aber es zeigt Ihnen, wie Schleifen und Arrays interagieren.

Fügen Sie diesen Code zu Ihrer „Haupt“-Funktion hinzu und ersetzen Sie den Kommentar zu „more stuff“:

„c
/ Blase sortiert das Array /
für (x=0; x < MAX-1; x++) für (y=0; y < MAX-x-1; y++) if (a[y] > a[y+1]) {
t=a[y];
a[y]=a[y+1];
a[y+1]=t;
}

/ sortiertes Array drucken /
printf(“——————–\n”);
für (i=0; i < MAX; i++) printf("%d\n",a[i]); „

Was passiert hier?

Die äußere Schleife läuft „MAX-1“-mal. Die innere Schleife wird bei jedem Durchgang weniger oft ausgeführt. Warum? Denn die größten Zahlen „sprudeln“ bei jedem Durchgang bis zum Ende des Arrays. Sie müssen sie nicht erneut überprüfen.

Innerhalb der inneren Schleife vergleichen wir „a[y]“ mit „a[y+1]“. Wenn das linke größer ist, tauschen wir sie aus. Wir verwenden eine temporäre Variable „t“, um den Wert zu halten, während wir die Teile bewegen.

„Der einzige einfache Weg, wirklich zu verstehen, was dieser Code tut, besteht darin, ihn manuell auszuführen.“

Nimm ein Blatt Papier. Zeichne fünf Kästchen. Geben Sie Zahlen ein. Führen Sie den Code Zeile für Zeile aus. Verschieben Sie die Zahlen. Sie werden sehen, wie die großen Zahlen nach unten sinken. Die Kleinen schweben auf. Es ist visuell. Es ist mechanisch.

Häufige C-Array-Fehler

C hält deine Hand nicht. Du wirst von der Kante fallen.

  • Keine Bereichsprüfung. Wenn Sie in einem Array der Größe 10 auf „a[10]“ zugreifen, schreit C nicht. Es wird den nächsten Speicher lesen. Dies führt zu subtilen Fehlern, die schwer zu finden sind.
  • Funktionsaufrufe benötigen Klammern. Sie müssen „x = rand();“ schreiben. Wenn Sie „x = rand;“ schreiben, weisen Sie „x“ die Speicheradresse der Funktion zu. Nicht das Ergebnis. Es kompiliert. Es bricht.

Probieren Sie es aus

Lesen Sie nicht nur. Code.

  • Ändern Sie die Schleife, die das Array füllt, in eine einzelne Zeile. Kannst du es schaffen?
  • Verschieben Sie die Blasensortierlogik in eine eigene Funktion. Nennen Sie es „void bubble_sort()“. Verschieben Sie die Variablen „x“, „y“ und „t“ in diese Funktion. Sie werden lokal. Das Array „a“ ​​ist global, Sie müssen es also nicht übergeben.
  • Ändern Sie „rand_seed“ in andere Werte. Beobachten Sie, wie sich die Ausgabe ändert.

Arrays sind von grundlegender Bedeutung. Sie sind die Bausteine ​​von Datenstrukturen. Beherrschen Sie sie, und der Rest von C wird klarer. Wenn Sie den Nullindex ignorieren, werden Sie Stunden damit verbringen, einen Absturz zu debuggen, der vor drei Schritten aufgetreten ist.