Theis | Einstieg in C | E-Book | www.sack.de
E-Book

E-Book, Deutsch, 436 Seiten

Reihe: Rheinwerk Computing

Theis Einstieg in C

Für Programmiereinsteiger geeignet
3. Auflage 2020
ISBN: 978-3-8362-7571-2
Verlag: Rheinwerk
Format: EPUB
Kopierschutz: 0 - No protection

Für Programmiereinsteiger geeignet

E-Book, Deutsch, 436 Seiten

Reihe: Rheinwerk Computing

ISBN: 978-3-8362-7571-2
Verlag: Rheinwerk
Format: EPUB
Kopierschutz: 0 - No protection



Der leichte Einstieg in die C-Programmierung

Mit diesem kleinschrittigen Lernkurs steigen Sie mühelos in die C-Programmierung ein. An vielen praxiserprobten Programmbeispielen werden Ihnen die Grundlagen verständlich erklärt. Übungsaufgaben helfen dabei, das erworbene Wissen zu vertiefen und anzuwenden. Schon in kürzester Zeit entwickeln Sie eigenständig Programme – und das Abenteuer C-Programmierung beginnt! Mit vielen Praxistipps aus dem Programmieralltag und leicht verständlichen Beispielen. Das Buch eignet sich auch bestens für Einsteiger ohne Programmierkenntnisse .

  • C-Programmierung verständlich erklärt – ohne Vorwissen!
  • Alle Sprachgrundlagen und wichtigen Programmiertechniken
  • Mit vielen Beispielen und Übungsaufgaben

Aus dem Inhalt:

  • Editor und Compiler einrichten
  • Einführung in die Syntax
  • Schleifen, Funktionen und Zeiger anwenden
  • Daten dynamisch verwalten
  • Auf Dateien und Verzeichnisse zugreifen
  • Betriebssystem ansteuern
  • Viele Praxistipps zur Fehlersuche
  • Eine Datenbank mit SQLite aufbauen
  • GUIs mit GTK+ entwickeln
  • Raspberry Pi kennenlernen
Theis Einstieg in C jetzt bestellen!

Autoren/Hrsg.


Weitere Infos & Material


  Materialien zum Buch ... 14

  1.  Eine erste Einführung ... 15


       1.1 ... Welche Vorteile bietet C? ... 15

       1.2 ... Was benötige ich zum Programmieren? ... 16

       1.3 ... Wie ist dieses Buch aufgebaut? ... 16

       1.4 ... Wie sollten Sie mit diesem Buch arbeiten? ... 17

       1.5 ... C-Standards ... 18

       1.6 ... Ubuntu Linux unter Windows ... 18

  2.  Unser erstes Programm ... 21


       2.1 ... Wie gebe ich das Programm ein? ... 21

       2.2 ... Was bedeuten die einzelnen Zeilen? ... 22

       2.3 ... Das Programm wird gespeichert ... 23

       2.4 ... Wie starte ich das fertige Programm? ... 24

       2.5 ... Eine weitere Möglichkeit zum Starten ... 26

       2.6 ... Kommentare sind wichtig ... 28

       2.7 ... Eine Übungsaufgabe ... 29

  3.  Verschiedene Arten von Daten ... 31


       3.1 ... Daten bekannt machen und speichern ... 31

       3.2 ... Wie gebe ich Daten auf dem Bildschirm aus? ... 33

       3.3 ... Wie kann der Benutzer seine Daten per Tastatur eingeben? ... 34

       3.4 ... Berechnungen mit Operatoren ... 36

       3.5 ... Entwicklung eines Programms ... 38

       3.6 ... Fehler suchen ... 39

       3.7 ... Eine Übungsaufgabe ... 41

  4.  Verschiedene Fälle in einem Programm ... 43


       4.1 ... Eine einfache Bedingung mit »if« ... 43

       4.2 ... Welche Bedingungen gibt es? ... 45

       4.3 ... Zwei Möglichkeiten, mit »if« und »else« ... 46

       4.4 ... Wie kann ich Bedingungen kombinieren? ... 47

       4.5 ... Eine Übungsaufgabe ... 49

  5.  Programmteile wiederholen ... 51


       5.1 ... Regelmäßige Wiederholungen mit »for« ... 52

       5.2 ... Bedingte Wiederholungen mit »do-while« ... 54

       5.3 ... Besser vorher prüfen mit »while«? ... 56

       5.4 ... Tabellen formatieren ... 59

       5.5 ... Eine Übungsaufgabe zu Tabellen ... 60

       5.6 ... Eine Übungsaufgabe zur Eingabekontrolle ... 61

  6.  Programme übersichtlich aufteilen ... 63


       6.1 ... Wie definiere ich eine Funktion? ... 63

       6.2 ... Wie rufe ich eine Funktion auf? ... 65

       6.3 ... Werte an eine Funktion übergeben ... 66

       6.4 ... Ein Ergebnis von einer Funktion zurückerhalten ... 68

       6.5 ... Eine Übungsaufgabe ... 69

  7.  Große Datenmengen speichern ... 71


       7.1 ... Felder erzeugen und mit Daten füllen ... 71

       7.2 ... Wie gebe ich die Daten aus? ... 73

       7.3 ... Wie kann der Benutzer ein Feld füllen? ... 74

       7.4 ... Eine Übungsaufgabe ... 76

  8.  Zeichen und Texte speichern ... 77


       8.1 ... Zeichenketten erzeugen und füllen ... 77

       8.2 ... Wie gebe ich eine Zeichenkette aus? ... 79

       8.3 ... Wie kann der Benutzer eine Zeichenkette füllen? ... 80

       8.4 ... Mehrere Zeichenketten ... 81

       8.5 ... Wie kann ich Zeichenketten formatieren? ... 82

       8.6 ... Eine Übungsaufgabe ... 83

  9.  Indirekter Zugriff mit Zeigern ... 85


       9.1 ... Wie arbeite ich mit Zeigern und Adressen? ... 85

       9.2 ... Wie nutze ich Zeiger bei Funktionen? ... 87

       9.3 ... Wir zeigen auf Felder ... 88

       9.4 ... Eine Übungsaufgabe ... 90

10.  Unterschiedliche Daten zusammenfassen ... 93


       10.1 ... Strukturen definieren ... 93

       10.2 ... Wie erzeuge ich Strukturdaten? ... 94

       10.3 ... Wie gebe ich die Daten aus? ... 95

       10.4 ... Wie kann der Benutzer Strukturen füllen? ... 96

       10.5 ... Mehrere Strukturdaten ... 98

       10.6 ... Wie übergebe ich Strukturdaten? ... 99

       10.7 ... Eine Übungsaufgabe ... 102

11.  Daten auf der Festplatte ... 105


       11.1 ... Wie speichere ich Daten auf der Festplatte? ... 105

       11.2 ... Wie lese ich Daten von der Festplatte? ... 108

       11.3 ... Eine Übungsaufgabe ... 110

12.  Eine Vertiefung der bisherigen Themen ... 111


       12.1 ... Verschiedene Arten von Daten ... 111

       12.2 ... Verschiedene Fälle in einem Programm ... 129

       12.3 ... Programmteile wiederholen ... 137

       12.4 ... Programme übersichtlich aufteilen ... 145

       12.5 ... Große Datenmengen speichern ... 156

       12.6 ... Zeichen und Texte speichern ... 174

       12.7 ... Indirekter Zugriff mit Zeigern ... 200

       12.8 ... Unterschiedliche Daten zusammenfassen ... 202

       12.9 ... Daten auf der Festplatte ... 207

13.  Daten dynamisch im Speicher verwalten ... 227


       13.1 ... Warum benötige ich dynamische Felder? ... 227

       13.2 ... Eine Datenreihe dynamisch speichern ... 228

       13.3 ... Die Größe eines dynamischen Felds ändern ... 230

       13.4 ... Eine Tabelle dynamisch speichern ... 232

       13.5 ... Wie übergebe ich ein dynamisches Feld an eine Funktion? ... 235

14.  Arbeiten mit Zahlen ... 241


       14.1 ... Winkelfunktionen ... 241

       14.2 ... Runden, Nachkommastellen, Modulo ... 243

       14.3 ... Weitere mathematische Funktionen ... 245

       14.4 ... Komplexe Zahlen darstellen ... 246

       14.5 ... Rechnen mit komplexen Zahlen ... 248

       14.6 ... Weitere Funktionen für komplexe Zahlen ... 250

       14.7 ... Bit-Operatoren ... 252

       14.8 ... Umwandlung von Dualzahlen ... 255

       14.9 ... Bitfelder ... 258

15.  Präprozessor-Anweisungen ... 261


       15.1 ... Einbinden von Dateien ... 261

       15.2 ... Definitionen und Makros ... 262

       15.3 ... Definitionen und Verzweigungen ... 264

       15.4 ... Eine Systemweiche ... 266

16.  Zugriff auf Dateien und Verzeichnisse ... 269


       16.1 ... Attribute von Dateien und Verzeichnissen ... 269

       16.2 ... Zugriffsrechte ändern ... 273

       16.3 ... Inhalt eines Verzeichnisses ... 275

       16.4 ... Inhalt eines Verzeichnisbaums ... 278

       16.5 ... Dateien ändern ... 280

       16.6 ... Verzeichnisse ändern ... 281

17.  Umgang mit Datum und Uhrzeit ... 283


       17.1 ... Weltzeit ausgeben ... 283

       17.2 ... Lokale Zeit ausgeben und formatieren ... 285

       17.3 ... Zeitangaben erzeugen ... 287

       17.4 ... Zeitspanne messen ... 289

       17.5 ... Zeit abwarten ... 291

       17.6 ... Alter berechnen ... 292

18.  Kommunikation mit dem Betriebssystem ... 295


       18.1 ... Wie übergebe ich Daten an ein Programm? ... 295

       18.2 ... Wie nutze ich die Rückgabe eines Programms? ... 297

       18.3 ... Systemkommandos ausführen ... 299

19.  Datenbanken ... 301


       19.1 ... Aufbau einer Datenbank ... 301

       19.2 ... Datenbanken mit SQLite ... 302

       19.3 ... Datenbank und Tabelle erzeugen ... 303

       19.4 ... Datensätze einfügen ... 305

       19.5 ... Anzeigen der Datensätze ... 307

       19.6 ... Auswahl von Datensätzen und Feldern ... 309

       19.7 ... Auswahl mit Platzhaltern ... 312

       19.8 ... Auswahl nach Eingabe ... 314

       19.9 ... Sortieren der Ausgabe ... 316

       19.10 ... Ändern von Datensätzen ... 318

       19.11 ... Löschen von Datensätzen ... 319

20.  Beispielprojekte ... 323


       20.1 ... Lernspiel: Hauptstädte der EU ... 323

       20.2 ... Lernspiel: Kopfrechnen ... 329

       20.3 ... Ausgabe von Morsezeichen ... 337

       20.4 ... Spiel Mastermind ... 344

21.  Grafische Benutzeroberflächen mit GTK+ ... 351


       21.1 ... Datentypen der »Glib« ... 352

       21.2 ... Zeichenketten mit »GString« ... 353

       21.3 ... Felder mit GArray ... 355

       21.4 ... Die erste Benutzeroberfläche ... 361

       21.5 ... Eigenschaften setzen und abrufen ... 364

       21.6 ... Ereignisfunktionen ... 365

       21.7 ... Positionierung von Widgets ... 367

       21.8 ... Auswahl- und Eingabe-Widgets ... 369

  A.  Installationen ... 375

  B.  Hilfestellungen und Übersichten ... 399

  C.  Lösungen der Übungsaufgaben ... 411

  Index ... 425


12    Eine Vertiefung der bisherigen Themen


Sie können die wichtigen Begriffe nun einordnen. In diesem Kapitel schauen wir uns genauer an, was wir bereits erarbeitet haben. Wie verbinden Sie die verschiedenen Elemente miteinander?

In den vorangegangenen Kapiteln haben wir die wichtigen Begriffe der Programmierung mit C anhand eines anschaulichen Beispiels aus dem Alltag besprochen. In diesem Kapitel werde ich sie noch einmal allgemeiner und ausführlicher erläutern.

12.1    Verschiedene Arten von Daten


In diesem Abschnitt lernen Sie die Datentypen und Operatoren in ihrer Gesamtheit kennen. Es geht auch um verwandte Themen wie Konstanten, zufällige Zahlen und vieles mehr.

12.1.1    Mehrere Daten auf einmal einlesen


Sie können mithilfe der Funktion scanf() mehrere Daten auf einmal einlesen. Zur Vereinfachung für den Benutzer kann die Dateneingabe in einer vorbestimmten Form stattfinden. Außerdem können Sie feststellen, wie viele Daten erfolgreich eingelesen werden. Diese Information können Sie zum Beispiel für die Steuerung einer Schleife verwenden.

Ein Beispiel:

#include
int main()
{
int tag, monat, jahr, anzahl;

/* Eingabe mit Standard-Trennzeichen */
printf("Bitte geben Sie Tag, Monat und Jahr ein\n");
printf("Trennung mit Leerzeichen, Tab oder Return:\n");
anzahl = scanf("%d%d%d", &tag, &monat, &jahr);
printf("Datum: %d.%d.%d\n", tag, monat, jahr);
printf("Gelesen: %d\n\n", anzahl);

/* Eingabe mit Formatangabe */
printf("Bitte geben Sie Tag, Monat und Jahr ein\n");
printf("in der Form T.M.J:\n");
anzahl = scanf("%d.%d.%d", &tag, &monat, &jahr);
printf("Datum: %d.%d.%d\n", tag, monat, jahr);
printf("Gelesen: %d\n\n", anzahl);

return 0;
}

Listing 12.1    Datei »daten_ein_mehrere.c«

Der Benutzer soll drei Zahlen auf einmal eingeben, nämlich Tag, Monat und Jahr eines Datums.

  • Im ersten Fall soll er eines der sogenannten Whitespace-Zeichen, also eines der Standardzeichen zur Trennung von einzelnen Werten, verwenden: die Leertaste für ein Leerzeichen, die Taste (ê) für ein Tabulatorzeichen oder die Taste (¢). Dazu werden bei scanf() drei Platzhalter angegeben, ohne weitere Leerzeichen oder andere Zeichen davor, dazwischen oder dahinter. Es folgen die drei Variablen, in denen die Werte der Reihe nach gespeichert werden.

  • Im zweiten Fall muss das Datum in üblicher Form eingegeben werden, die drei Werte müssen also durch Punkte getrennt werden. Dazu werden bei scanf() jeweils Punkte zwischen die drei Platzhalter gesetzt. Das Programm erkennt anhand des Punkts innerhalb der eingegebenen Daten, dass nun der nächste Wert folgt.

Die Funktion scanf() besitzt auch einen Rückgabewert. Dabei handelt es sich um die Anzahl an erfolgreich eingelesenen Werten. Diese Anzahl wird hier zur Kontrolle ausgegeben, zusammen mit der Datumsangabe.

Die Ausgabe des Programms, mit Eingaben des Benutzers:

Bitte geben Sie Tag, Monat und Jahr ein
Trennung mit Leerzeichen, Tab oder Return:
15 12 2019
Datum: 15.12.2019
Gelesen: 3
Bitte geben Sie Tag, Monat und Jahr ein
in der Form T.M.J:
15.12.2019
Datum: 15.12.2019
Gelesen: 3

12.1.2    Datentypen für ganze Zahlen


Ganze Zahlen haben wir bisher in Variablen des Datentyps int gespeichert. Dies genügt für viele Zwecke. In C gibt es aber noch weitere Datentypen für ganze Zahlen, die sich nach ihrem Wertebereich und ihrem Speicherbedarf unterscheiden.

Was ist noch zu beachten?

  • Die Grenzen der Wertebereiche werden mithilfe einer Reihe von Konstanten angegeben, die in der Headerdatei limits.h stehen.

  • Andere Datentypen erfordern teilweise andere Platzhalter für die Ein- und Ausgabe.

  • Der Operator sizeof dient zur Ermittlung des Speicherbedarfs eines Datentyps, einer Variablen, eines ganzen Felds oder einer Struktur. Falls Sie eine int-Variable a deklariert haben, so können Sie ihren Speicherbedarf sowohl mit sizeof(int) als auch mit sizeof(a) ermitteln. sizeof liefert einen Wert des Typs unsigned long. Diesen sollten Sie mit dem Platzhalter %lu ausgeben.

  • Ganze Zahlen können nicht nur im Dezimalsystem (zur Basis 10), sondern auch im Oktalsystem (zur Basis 8) oder im Hexadezimalsystem (zur Basis 16) ausgegeben werden. In Abschnitt 14.8 werden wir mit Zahlen im Dualsystem (zur Basis 2) arbeiten.

Damit Sie eine Übersicht über die Datentypen für ganze Zahlen erhalten, sehen Sie zunächst in Abbildung 12.1 die Ausgabe des folgenden Programms unter einem 64-Bit-Ubuntu Linux.

Abbildung 12.1    Datentypen für ganze Zahlen

Es folgt das Programm:

#include
#include

int main()
{
/* Wertebereiche, Speichergrößen */
printf("char: %lu Byte %d ... %d\n",
sizeof(char), CHAR_MIN, CHAR_MAX);
printf("unsigned char: %lu Byte %d ... %u\n\n",
sizeof(unsigned char), 0, UCHAR_MAX);

printf("short: %lu Byte %d ... %d\n",
sizeof(short), SHRT_MIN, SHRT_MAX);
printf("unsigned short: %lu Byte %d ... %u\n\n",
sizeof(unsigned short), 0, USHRT_MAX);

printf("int: %lu Byte %d ... %d\n",
sizeof(int), INT_MIN, INT_MAX);
printf("unsigned int: %lu Byte %d ... %u\n\n",
sizeof(unsigned int), 0, UINT_MAX);

printf("long: %lu Byte %ld ... %ld\n",
sizeof(long), LONG_MIN, LONG_MAX);
printf("unsigned long: %lu Byte %d ... %lu\n\n",
sizeof(unsigned long), 0, ULONG_MAX);

printf("long long: %lu Byte %lld ... %lld\n",
sizeof(long long), LLONG_MIN, LLONG_MAX);
printf("unsigned long long: %lu Byte %d ... %llu\n\n",
sizeof(unsigned long long), 0, ULLONG_MAX);

/* Andere Zahlensysteme */
printf("Oktal: %o + 1 = %o, %o + 1 = %o\n", 31, 32, 255, 256);
printf("Hexadezimal: %X + 1 = %X, %X + 1 = %X\n",
31, 32, 255, 256);

return 0;
}

Listing 12.2    Datei »daten_typ_ganz.c«

Bisher haben wir den Datentyp char für Zeichen verwendet. Intern werden diese Zeichen als Zahlen gespeichert. Es gibt eine Codetabelle, in der zu jedem Zeichen die entsprechende Zahl steht. Wir können diese Zahl auch für jedes Zeichen ausgeben (dazu mehr in Abschnitt 12.6.2).

Die Datentypen short, long und long long stehen für kurze, lange und sehr lange Ganzzahlen. Die Platzhalter sind %ld für long und...


Theis, Thomas
Thomas Theis ist Dipl.-Ing. für Technische Informatik. Als Softwareentwickler verfügt er über langjährige Erfahrung, ebenso als IT-Dozent unter anderem an der Fachhochschule Aachen. Er ist Autor vieler erfolgreicher Fachbücher, zum Beispiel zu den Themen Python, C#, PHP, JavaScript, C++ und Unity.



Ihre Fragen, Wünsche oder Anmerkungen
Vorname*
Nachname*
Ihre E-Mail-Adresse*
Kundennr.
Ihre Nachricht*
Lediglich mit * gekennzeichnete Felder sind Pflichtfelder.
Wenn Sie die im Kontaktformular eingegebenen Daten durch Klick auf den nachfolgenden Button übersenden, erklären Sie sich damit einverstanden, dass wir Ihr Angaben für die Beantwortung Ihrer Anfrage verwenden. Selbstverständlich werden Ihre Daten vertraulich behandelt und nicht an Dritte weitergegeben. Sie können der Verwendung Ihrer Daten jederzeit widersprechen. Das Datenhandling bei Sack Fachmedien erklären wir Ihnen in unserer Datenschutzerklärung.