Grundlagen der Programmierung
Prof. Dr. Alexandra Mikityuk
HTW Berlin
<string.h> kennen: strlen, strcpy, strcat, strcmpStellt euch vor, ihr sollt die Noten von 30 Studierenden speichern â ohne Arrays:
int note1, note2, note3,
note4, note5, note6,
// ... 24 mehr ...
note30;
30 Variablen. Durchschnitt berechnen? 30 Additionen einzeln tippen. Niemand macht das.
int noten[30]; // eine Zeile!
for (int i=0; i<30; i++) {
summe += noten[i];
}
Eine Zeile fĂŒr die Deklaration. Schleife lĂ€uft drĂŒber. Skaliert auf 30 oder 30 000 â egal.
Ein Array ist eine Reihe von Zellen â alle vom gleichen Typ. Jede Zelle hat einen Index (Position), beginnend bei 0.
â Indizes (Positionen) â
noten[5] wĂ€re Index 5 auĂerhalb â gefĂ€hrlich!
Drei Teile: Typ, Name, GröĂe in eckigen Klammern.
int noten[5]; // 5 Ganzzahlen â leer (MĂŒll-Werte!)
double preise[10]; // 10 FlieĂkommazahlen
char wort[20]; // 20 Zeichen â also ein String
int noten[5]; reserviert fĂŒr immer Platz fĂŒr genau 5 Werte. GröĂere Mengen brauchen ein gröĂeres Array â oder dynamischen Speicher (kommt spĂ€ter).
Werte direkt bei der Deklaration setzen â spart die spĂ€tere Schleife.
int noten[5] = {2, 1, 3, 2, 4};
double preise[3] = {1.99, 2.50, 0.79};
Schreibst du weniger Werte als PlĂ€tze, werden die restlichen mit 0 gefĂŒllt.
int zaehler[10] = {0}; // alle 10 = 0
HĂ€ufig fĂŒr ZĂ€hler / Akkumulatoren. Klassischer Trick: ein {0} reicht, der Rest wird auch 0.
int noten[] = {2, 1, 3, 2, 4}; // GröĂe wird zu 5
Mit name[index] â sowohl zum Lesen als auch zum Schreiben.
// Lesen
int erste_note = noten[0]; // â 2
int dritte_note = noten[2]; // â 3
// Schreiben (Wert verÀndern)
noten[1] = 5; // 2. Element wird 5
noten[3] = noten[3] + 1; // 4. Element um 1 erhöhen
Bei einem Array der GröĂe n gibt es nur die Indizes 0 bis n-1. Index n liegt auĂerhalb!
noten[5]? C prĂŒft nicht die Grenzen â das Programm liest oder ĂŒberschreibt einfach Speicher, der zu was anderem gehört. Möglicherweise Absturz, möglicherweise verfĂ€lschte Daten, möglicherweise eine SicherheitslĂŒcke. Immer selbst aufpassen.
for (int i = 0; i < n; i++) { // '< n', NICHT '<= n'!
... noten[i] ...
}
Mit einer for-Schleife lĂ€uft man alle Elemente einmal durch â das ist das Standardmuster.
int noten[5] = {2, 1, 3, 2, 4};
for (int i = 0; i < 5; i++) {
printf("%d ", noten[i]);
}
// Ausgabe: 2 1 3 2 4
int noten[5];
for (int i = 0; i < 5; i++) {
printf("Note %d: ", i+1);
scanf("%d", ¬en[i]);
}
i ist gleichzeitig der Index ins Array. Bei scanf brauchst du ¬en[i] â die Adresse des einzelnen Elements.
#include <stdio.h>
int main(void) {
int noten[5] = {2, 1, 3, 2, 4};
int summe = 0;
for (int i = 0; i < 5; i++) {
summe = summe + noten[i];
}
double schnitt = (double)summe / 5; // Cast nötig fĂŒr Float-Division
printf("Durchschnitt: %.2f\n", schnitt); // â 2.40
return 0;
}
(double) ist wichtig: ohne ihn wĂ€re 12 / 5 eine Ganzzahl-Division â Ergebnis 2 (nicht 2.4). Der Cast zwingt eine Operand auf double, dann wird mit FlieĂkomma gerechnet.
Ein String in C ist nichts Besonderes â es ist einfach ein char-Array, das mit einem Null-Zeichen '\0' endet.
â 5 Buchstaben + 1 Null-Terminator = 6 PlĂ€tze â
char name[10] = "Anna";
Der Compiler hÀngt automatisch das '\0' an. Hier: A, n, n, a, \0, dann 5 PlÀtze ungenutzt.
char name[5] = {
'A', 'n', 'n', 'a', '\0'
};
Funktioniert auch â aber selten genutzt. Achtung: das '\0' muss man hier selbst setzen.
char name[50]; auch wenn der Name kurz ist. Sonst lĂ€uft die Eingabe ĂŒber und das Programm stĂŒrzt ab (Buffer-Overflow).
char name[50];
// Eingabe â mit %s, OHNE & vor name (Arrays sind schon âAdresse")
printf("Wie heiĂt du? ");
scanf("%s", name);
// Ausgabe â auch %s
printf("Hallo, %s!\n", name);
fgets(name, 50, stdin); // liest bis zu 49 Zeichen + '\0'
Liest eine ganze Zeile inklusive Leerzeichen â und garantiert, dass die Array-GröĂe nicht ĂŒberschritten wird.
<string.h>Vier Funktionen, die ihr fast immer braucht:
| Funktion | Macht was? | Beispiel |
|---|---|---|
strlen(s) | LĂ€nge des Strings (ohne '\0') | strlen("Anna") == 4 |
strcpy(ziel, src) | String kopieren | strcpy(name, "Anna") |
strcat(ziel, src) | String anhĂ€ngen | strcat(gruss, " MĂŒller") |
strcmp(s1, s2) | vergleichen â 0 wenn gleich | strcmp("abc","abc") == 0 |
==! name == "Anna" vergleicht Adressen, nicht Inhalt. Immer strcmp(name, "Anna") == 0 benutzen.
#include <stdio.h>
#include <string.h>
int main(void) {
char name[50];
char gruss[100] = "Hallo, ";
printf("Dein Name: ");
scanf("%s", name);
strcat(gruss, name); // gruss = "Hallo, " + name
strcat(gruss, "!");
printf("%s\n", gruss); // â "Hallo, Anna!"
printf("(LĂ€nge: %lu)\n", strlen(gruss));
return 0;
}
gruss muss groĂ genug sein, um âHallo, " + Name + â!" aufzunehmen â daher 100strcat hĂ€ngt am Ende an â das '\0' wird automatisch versetztEin Array von Arrays â z.B. eine Tabelle, ein Schachbrett, eine Matrix.
int brett[3][3] = {
{1, 2, 3}, // Zeile 0
{4, 5, 6}, // Zeile 1
{7, 8, 9} // Zeile 2
};
// Zugriff: [Zeile][Spalte]
int mitte = brett[1][1]; // â 5
for (int z = 0; z < 3; z++)
for (int s = 0; s < 3; s++)
printf("%d ", brett[z][s]);
int a[5];
for (int i=0; i<=5; i++)
a[i] = 0; // â i=5 illegal!
Lösung: i < 5 statt i <= 5.
char s[4] = {'A','n','n','a'};
printf("%s", s); // liest weiter
// â MĂŒll am Ende
Lösung: Array um 1 gröĂer, '\0' anhĂ€ngen.
char name[5];
scanf("%s", name);
// User tippt "Christian"
// â ĂŒberschreibt fremden Speicher
Lösung: Array groà genug + fgets().
== vergleichen funktioniert nicht. Es vergleicht Adressen, nicht Inhalte. Immer strcmp nutzen!
int werte[10];
werte[0] = 1; (A)
werte[9] = 9; (B)
werte[10] = 10; (C)
for (int i=0; i<10; i++) werte[i] = 0; (D)
name[index] â Index 0 bis n-1, NIE name[n].char-Arrays mit '\0' am Ende â daher braucht ein 5-Buchstaben-Wort 6 PlĂ€tze.<string.h> liefert strlen, strcpy, strcat, strcmp â vier Funktionen, die ihr immer wieder brauchen werdet.== vergleichen.Arrays + Funktionen kombinieren: ein Array einlesen, Maximum/Minimum finden, Durchschnitt rechnen, sortieren-light.
fgets ein und prĂŒfe, ob er vorwĂ€rts und rĂŒckwĂ€rts gleich gelesen wird (z.B. âanna").strlen selbst â also eine Funktion, die zĂ€hlt, wie viele Zeichen vor dem '\0' stehen.In Vorlesung 8 kommt der nĂ€chste groĂe Baustein: Funktionen.
main)Fragen?
Prof. Dr. Alexandra Mikityuk
HTW Berlin · BĂŒro Raum 308
Tel +49 30 5019-2664
NĂ€chste Woche: Funktionen â Code modular gestalten