Programmieren in C - Einführung
Bild Referenz: https://commons.wikimedia.org/wiki/File:The_C_Programming_Language_logo.svg
Intro
Hallo, ich bins @drifter2! Das ist mein erster "richtiger" Deutscher Artikel. Mein Haupt Account ist @drifter1 und der heutige Artikel ist ein wenig an den englischen Artikel: "C Beginner Codes" basiert. Ich habe aber nie eine eigentliche Einführung gemacht aber nur zwei komplette Programme erklärt. In dieser übersetzten Version werden wir auch ein bisschen über Programmieren generell und auch die Sprache C reden.
Programmiersprachen
Bevor wir in die Sprache C eingehen müssen wir erstmal klären was programmieren wirklich bedeutet. Um Probleme mit einem Computer zu lösen entwickeln wir so gesagte Algorithmen. Algorithmen bestehen aus wohldefinierten Schritten die wir folgen müssen um ein solches Problem zu lösen. Die eigentliche Formulierung von einem Algorithmus kann in menschlicher Sprache sein. Um einen Algorithmus aber mit einen Computer benutzen zu können muss man in "Computersprache", die sogenannte Assembly, schreiben. Assembly ist die Maschinensprache eines Computers. Ein Prozessor kann nur solche "Aufgaben" ausführen. Direkt in Assembly zu schreiben würde aber sehr sehr viel Zeit in Anspruch nehmen und deswegen haben wir sehr viele höhere Programmiersprachen entwickelt die formale Sprachen sind mit denen man mit einen gewissen viel leichteren Syntax schreibt. Der Quellcode in einer höheren Sprache wird dann in Maschinenbefehle übersetzt von dem so genannten Übersetzer oder Compiler.
Programmiersprachen sind eine viel leichtere und verständlichere Ausdrucksweise von Programmen und Algorithmen. Deswegen haben wir auch sehr viele verschiedene Kategorien entwickelt die jedes mal besser für eine gewisse Applikationen sind. Ein paar bekannte Sprachen sind: C, Java, C#, Python, Prolog, SQL usw.
Die Sprache C
C ist eine imperative und prozedurale Programmiersprache, eine der weitesten verbreiteten Programmiersprachen und wird zur System- und Anwendungsprogrammierung eingesetzt. Viele Sprachen orientieren sich an der Syntax und den Eigenschaften von dieser Sprache. Das ist auch genau wieso die meisten mit dieser Sprache anfangen.
In C haben wir Schlüsselwörter (Keywords) die dem Compiler helfen zu verstehen was wir mit unseren Code meinen. Diese sind:
- auto -> das bei dem deklarieren von Variablen benutzt wird
- break -> um aus einen loop (for oder while) auszubrechen
- case -> um einen Fall zu deklarieren (bei switch-case Anweisungen)
- char -> um eine char Variabel zu deklarieren
- const -> um konstante Variablen zu deklarieren
- continue -> um zu der nächsten Iteration eines Loop zu gehen (jetzige überspringen)
- default -> um einen Standardwert für eine Variabel zu deklarieren
- do -> bei do-while loops
- double -> um eine double Variabel zu deklarieren
- else -> bei if-else Anweisungen um die "else" Seite zu definieren
- enum -> zum deklarieren von Variablen mit mehreren konstanten Werten
- extern -> zum deklarieren von Variablen von anderen C-Dateien
- float -> zum deklarieren von float Variablen
- for -> zum deklarieren von Wiederholungen mit einem gewissen Start, einer Bedingung und einer Inkrementierung
- goto -> um direkt zu einer spezifischen Stelle (Label) zu "springen" [sollte man meiden]
- if -> zum deklarieren von if-else Anweisungen
- int -> zum deklarieren von int Variablen
- long -> um die Datentyp größe zu "verlängern"
- register -> um zu definieren das die Variabel in eine Register der CPU gespeichert werden soll (schnellster Zugriff)
- return -> um aus einer Funktion zurückzugeben
- short -> um die Datentyp größe zu "verkleinern"
- signed -> um eine Variabel mit Vorzeichen (minus) zu deklarieren (ist Standard)
- sizeof -> um die Länge-Größe eine Datentyps zu kriegen
- static -> um eine Variable zu deklarieren die Statisch gespeichert wird (bei Funktionen z. B. wird der Wert gleich sein bei jeder Ausführung)
- struct -> zum deklarieren von Strukturen die aus mehreren Datentyp Feldern aufgebaut sind
- switch -> um eine Variabel in vielen Fällen (cases) zu testen (zusammen mit case)
- typedef -> um einen deklarierten Datentyp einen Namen zu geben
- union -> ähnlich wie struct, aber nur ein Datentyp ist jedes mal benutzbar
- unsigned -> um eine Variabel ohne Vorzeichen (minus) zu deklarieren
- void -> um eine Variable/Funktion usw. ohne Typ zu deklarieren
- volatile -> um eine Variabel zu deklarieren die sehr oft Wert wechselt (hilft dem Compiler beim Assembly generieren)
- while -> um einen Loop zu deklarieren der nur wenn eine Bedingung wahr ist wiederholt (manchmal machen wir endlose Loops die wird im Loop selber mit einer if-Anweisung stoppen
Von der Version C89.
Die Haupt Datentypen von C sind:
- char -> zum speichern von Zeichen (Character in Englisch) wie z. B 'A'.
- int -> zum speichern von Ganzzahlen (Integer in Englisch) wie z. B: 24.
- float und double -> zum speichern von Zahlen mit Nachkommastellen (floating point numbers in Englisch) wie z. B: 3.14 (Komma ist ein punkt in C)
- void -> das den "unvollständigen Typ" bezeichnet und bei Funktionen ohne zurückgegebenen Wert, leere Parameterlisten und Zeigern auf "Objekte beliebigen Typs" benutzt wird.
In diesen Typen haben wir ein paar "unbekannte" Dinge gesehen. Erstmals was ist eine Funktion? Alle C-Programme bestehen aus einer "main" Funktion und optionalen weitern Funktionen. Bei der main-Funktion beginnt die Programmausführung. Wir werden einen ganzen Artikel über Funktionen machen wo ich erklären werde wie man die selbst definiert usw. Jetzt wo das aus dem weg ist, was sind dann diese "Zeiger"? Zeiger sind Variablen die nicht direkt einen verwendbaren Wert anzeigen, sondern eine Speicheradresse. Die Adressen eines Computers sind durchnummeriert und solche Zeiger können gewünschte Daten "zeigen" so das man an den gespeicherten Wert zugreifen kann. Ich werde einen ganzen Artikel darüber machen...
Etwas letztes was ich erwähnen will bevor wir in Starter-Programme eingehen ist das C Standard-Bibliotheken hat mit vorprogrammierten Funktionen, Makros, Typdeklarationen usw. in einer sogenannten Header-Datei. Durch die Benutzung solcher Bibliotheken kann man den Programmierungs-Vorlauf beschleunigen weil Bibliotheken sehr viele fertige Funktionen verfügen, die wird direkt benützen können.
Ein paar dieser Bibliotheken die wir häufig benützen werden sind:
- stdio.h -> Ein- und Ausgabe
- stdlib.h -> Eine Reichweite an Standardfunktionen, u. a. Speicherverwaltung
- string.h -> Zeichenkettenoperationen
- math.h -> Mathematische Funktionen
- time.h -> Datum und Uhrzeit
Anfänger Programme
Das berühmteste Starter-Programm ist die Ausgabe von "Ηello World!".
Der Code dafür ist:
#include <stdio.h>
int main() {
printf("Hello world!\n");
return 0;
}
Die erste Linie wird zum Einbund der Standard-Bibliothek stdio.h benutzt. Diese Bibliothek enthält die Ausgabe-Funktion printf(). Wie ihr sehen könnt deklarieren wir die "main" Funktion die eine Ganzzahl (integer) an das Operationssystem zurückgibt. Die eigentliche Funktion zur Ausgabe nimmt "Hello world!\n" als Parameter das dafür sorgt das "Hello world!" in der Konsole geschrieben wird und wir danach in eine neue Linie gehen (new line '\n'). Das Programm gibt '0' zurück an das OS. Alle anderen Werte deuten auf Fehler/Errors.
Also, gehen wird jetzt mal in ein paar schwerere Programme die auch if und while Befehle haben werden so das ihr versteht wie wir diese Verzweigungen und Loops benutzen werden.
Code1:
Sagen wir mal wir sind eine Mautstelle und wir wollen die Anzahl an Autos, Motorrädern und LKW's berechnen. Jeder Fahrzeugtyp muss einen spezifischen Maut bezahlen und der ist:
- 5 für Autos (cars)
- 3 für Motorräder (bikes)
- 10 für LKW's (trucks)
Wir müssen das gesamte (total) Einkommen von allen Fahrzeugen und jeden Typ alleine berechnen. Letztens werde wir auch den Durchschnitt (avg) berechnen. Um das ganze zu programmieren werden wir den Typ als Eingabe vom Benutzer kriegen und das Programm beenden wenn ein Special-Typ eingegeben wird, mit dem man dann die ganzen Ergebnisse ausdruckt.
Der Code ist wie folgend:
#include <stdio.h> // Ein- und Ausgabe Funktionen
int main(){
// Zähler Variablen für jeden Typ und alle zusammen
int vehicles=0, cars=0, bikes=0, trucks=0;
// die Eingabe vom Typ ist 'c' für Auto (car),
// 'b' für Motorrad (bike) und 't' für LKW (truck)
char type;
// Gebühr-Maut von jetzigen Fahrzeug
int fee;
// Gesamtes Einkommen für alle Fahrzeuge und jeden Typ alleine
int total, total_cars, total_bikes, total_trucks;
// Float für den Durchschnitt
float avg;
// Nachricht Ausdrucken
printf("Tollbooth Counter for Cars(c), Bikes(b) and Trucks(t)\n");
//do-while loop so das wird mindestens ein mal durchgehen
// bevor wir die Bedingung (am ende) prüfen
do{
// Eingabe vom Benutzer des Systems
printf("Vehicle Type: ");
scanf("%c", &type);
// nach dem wir einen char lesen müssen wir IMMER
// den Eingabe-Puffer der Tastatur bereinigen mit:
fflush(stdin);
// Die Eingabe überprüfen
if( type == 'c'){ // Auto
fee = 5;
cars++; // Zähler von Autos steigt 1
}
else if( type == 'b'){ //Motorrad
fee = 3;
bikes++; // Zähler von Motorrädern steigt 1
}
else if(type == 't'){ // LKW
fee = 10;
trucks++; // Zähler von LKW's steigt 1
}
else{ // für jeden anderen Typ wie 'x'
fee = 0;
// nach den if-Befehl habe steigt der Fahrzeug-Zähler
// um das hier zu verhindern benutzen wir folgendes:
continue;
// damit gehen wir zur nächsten Iteration-Wiederholung vom loop
// und überspringen so alles was folgt...
}
vehicles ++; // Zähler von Fahrzeugen steigt 1
// Maut ausdrucken
printf("You have to pay %d!\n", fee);
}while(type != 'x');
// der Loop stoppt wenn der typ 'x' ist
// Zähler Rechnungen ausdrucken
printf("A total of %d Vehicles passed by\n", vehicles);
printf("Cars: %d, Bikes %d, Trucks %d\n", cars, bikes, trucks);
// Für das gesamte Einkommen könnten wir bei den vorherigen
// if-Befehl das Einkommen berechnen, aber wir haben auch die
// Anzahl an jedem Fahrzeugtyp und weil die Maut am Typ abhengt
// können wir das Einkommen auch mit Multiplizieren berechnen wie folgend:
total_bikes = bikes * 3;
total_cars = cars * 5;
total_trucks = trucks * 10;
total = total_bikes + total_cars + total_trucks;
// Datentyp-Umwandlung um den Durchschnitt zu berechnen
avg = (float) total / vehicles;
printf("We earned %d in total\n", total);
printf("From Cars: %d, Bikes: %d, Trucks: %d\n", total_cars, total_bikes, total_trucks);
printf("Average is %.2f\n", avg);
// mit %.2f notieren wir das wir nur 2 Ziefern nach dem . wollen.
// generell "%a.bf" bedeutet a-Ziefern links und b-Ziefern rechts vom 'Komma'
return 0;
}
Code2:
Das vorherige Programm kann sehr leicht in mehrere "Seiten" erweitert werden. Sagen wir mal das die Fahrer in Bargeld (cash), mit Kreditkarte (card) und beiden (both) bezahlen können. Wir wollen das gesamte Einkommen von Bargeld und Kreditkarte berechnen. Um es noch interessanter zu machen wird der Typ nicht mehr direkt als Eingabe kommen, sondern ein ID-wert vom Fahrer. Der ID-wert ist eine 5-stellige Ganzzahl (int) die wir als "String" lesen. Der Typ wird wie folgend von der letzten Ziefer bestimmt:
- 1, 4, 7 -> Motorrad (bike)
- 2, 5, 8 -> Auto (car)
- 3, 6, 9 -> LKW (truck
Der wert 0 wird dazu dienen das das Programm beendet nachdem wir die Resultate ausdrucken.
Der Code ist wie folgend:
#include <stdio.h> // Ein- und Ausgabe Funktionen
#include <stdlib.h> // für die atoi() Funktion
int main(){
// Zähler Variablen für jeden Typ und alle zusammen
int vehicles=0, cars=0, bikes=0, trucks=0;
// Zähler Variablen für die Zahlungsweisen
int card=0, cash=0, both=0;
char driver_id[6]; // ID vom Fahrer
// Umgewandelter Wert von char
int id;
// wir haben einen Wert für jede Fahrer-ID
char type;
// Gebühr-Maut von jetzigen Fahrzeug
int fee;
// Kreditkarten Guthaben und Bargeld das man bezahlt
// wenn Kreditkarte nicht ausreicht oder leer ist
int balance, money;
// Gesamtes Einkommen für alle Fahrzeuge und jeden Typ alleine
int total, total_cars, total_bikes, total_trucks;
// Gesamtes Einkommen für jede Zahlungsweise
int total_card=0, total_cash=0;
// Float für den Durchschnitt
float avg;
// Nachricht Ausdrucken
printf("Tollbooth Counter for Cars(c), Bikes(b) and Trucks(t)\n");
//do-while loop so das wird mindestens ein mal durchgehen
// bevor wir die Bedingung (am ende) prüfen
do{
// Eingabe vom Benutzer des Systems
printf("Driver ID: ");
scanf("%5s", driver_id); // als 5-Charakter String lesen
id = atoi(driver_id); // String zu Integer umwandeln mit atoi()
// Letzte Ziffer mit modulo (%) 10 prüfen
if(id % 10 == 1 || id % 10 == 4 || id % 10 == 7) {
type = 'b';
}
else if(id % 10 == 2 || id % 10 == 5 || id % 10 == 8) {
type = 'c';
}
else if(id % 10 == 3 || id % 10 == 6 || id % 10 == 9) {
type = 't';
}
else{
type = 'x';
}
// Den eigentlichen Typ überprüfen
if( type == 'c'){ // Auto
fee = 5;
cars++; // Zähler von Autos steigt 1
}
else if( type == 'b'){ //Motorrad
fee = 3;
bikes++; // Zähler von Motorrädern steigt 1
}
else if(type == 't'){ // LKW
fee = 10;
trucks++; // Zähler von LKW's steigt 1
}
else{ // für jeden anderen Typ wie 'x'
break;
// mit break stoppen wir den Loop wenn 'x' kommt
// so das Anweisungen nach diesen if nicht ausgeführt werden
}
vehicles ++; // Zähler von Fahrzeugen steigt 1
// Maut ausdrucken
printf("You have to pay %d!\n", fee);
//Kartenguthaben mit do-while bekommen
do{
printf("Card Balance: ");
scanf("%d", &balance);
}while(balance < 0); // darf nicht negativ sein
// Kartenguthaben überprüfen
if (balance >= fee){ // nur Karte
balance = balance - fee;
printf("New balance is %d!\n", balance);
card++; // Zähler für "Karten" steigt 1
// Gesamtes Einkommen von Karten steigt mit Maut
total_card += fee;
}
else if(balance == 0){ // Nur Bargeld
printf("Pay %d with Cash!\n", fee);
cash++; // Zähler für "Bargeld" steigt 1
// Gesamtes Einkommen von Bargeld steigt mit Maut
total_cash += fee;
}
else{ // Beides (Karte reicht nicht aus)
money = fee - balance; // Bargeld
total_cash += money; // Gesamtes Einkommen von Bargeld steigt mit "money"
total_card += balance; // Gesamtes Einkommen von Karten steigt mit "balance"
both++; // Zähler für "Beides" steigt 1
// Nachrichten dafür ausdrucken
balance = 0;
printf("New balance is %d!\n", balance);
printf("Pay %d with Cash!\n", money);
}
}while(type != 'x');
// der Loop stoppt wenn der typ 'x' ist
// Zähler Rechnungen ausdrucken
printf("A total of %d Vehicles passed by\n", vehicles);
printf("Cars: %d, Bikes %d, Trucks %d\n", cars, bikes, trucks);
// Einkommen Berechnen für jeden Fahrzeugtyp
total_bikes = bikes * 3;
total_cars = cars * 5;
total_trucks = trucks * 10;
total = total_bikes + total_cars + total_trucks;
// Datentyp-Umwandlung um den Durchschnitt zu berechnen
avg = (float) total / vehicles;
printf("We earned %d in total\n", total);
printf("From Cars: %d, Bikes: %d, Trucks: %d\n", total_cars, total_bikes, total_trucks);
printf("Average is %.2f\n", avg);
// Berechnungen und Einkommen von Kreditkarten und Bargeld
printf("%d paid with Cash, %d with Card and %d with Both\n", cash, card, both);
printf("We earned %d from Cash and %d from Card\n", total_cash, total_card);
return 0;
}
Referenzen
- https://de.wikipedia.org/wiki/Algorithmus
- https://de.wikipedia.org/wiki/Programmiersprache
- https://de.wikipedia.org/wiki/C_(Programmiersprache)
- https://de.wikipedia.org/wiki/C-Standard-Bibliothek
Wir sehen uns nächstes mal wieder wo ich in Arrays/Matrices eingehen werde!
Tschüss!
✅ @drifter2, I gave you an upvote on your post! Please give me a follow and I will give you a follow in return and possible future votes!
Thank you in advance!
upvote for me please? https://steemit.com/news/@bible.com/6h36cq
Hi @drifter2!
Your post was upvoted by utopian.io in cooperation with steemstem - supporting knowledge, innovation and technological advancement on the Steem Blockchain.
Contribute to Open Source with utopian.io
Learn how to contribute on our website and join the new open source economy.
Want to chat? Join the Utopian Community on Discord https://discord.gg/h52nFrV
good ,program