Programmieren in C - Einführung

in #programmieren6 years ago (edited)

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

Wir sehen uns nächstes mal wieder wo ich in Arrays/Matrices eingehen werde!

Tschüss!

Sort:  

@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!

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

Coin Marketplace

STEEM 0.20
TRX 0.13
JST 0.029
BTC 60924.19
ETH 3382.45
USDT 1.00
SBD 2.54