Bild Referenz: https://blogs.mentor.com/colinwalls/blog/2014/06/02/struct-vs-class-in-c/
Intro
Hallo, ich bins @drifter2! Der heutige Artikel ist am englischen Artikel: "C Structs and Switch Case" basiert. Der englische Artikel hatte ein gutes Beispielprogramm das wir bei dem heutigen Artikel übersetzen werden, aber der Rest wird bei den meisten Fällen vom Prinzip neu erklärt mit der Hilfe von Informationen aus dem Internet (Referenzen am Ende des Artikels). Also dann fangen wir mit dem heutigen Thema mal an!
Switch Case Anweisung
Fangen wir den Artikel dann mal mit der Switch Anweisung an!
Sagen wir mal wir haben viele unterschiedliche Fälle mit unterschiedlichen Aktionen. Solch eine Logik kann man mit vielen if Anweisungen (if - else if - else if - else Leiter) implementieren oder manchmal durch die Benutzung einer einzigen switch-case Anweisung. z.B. etwas passiert wenn x == 0 und etwas anderes wenn x == 1. Das sieht mit if Anweisungen wie folgend aus:
if(x == 0){
// mache etwas
}
else if( x == 1){
// mache etwas anderes
}
Der selbe Code kann auch mit der folgenden Switch Anweisung erreicht werden:
switch(x){
case 1:
// mache etwas
break;
case 2:
// mache etwas anderes
break;
}
Eine allgemeine Switch Anweisung enthält das Schlüsswort "switch" und danach in Klammern den Ausdruck dem wir auswerten möchten (In C ist das meistens eine Ganzzahl Variabel). Der Hauptkörper in "{ }" enthält die verschiedenen Fälle die mit dem Schlüsselwort "case" anfangen, einen spezifischen Ausdruckswert testen und nach einem Doppelpunkt dann die auszuführenden Befehle enthalten. Der Ausdruckswert muss eine Konstante Variable sein. Wir dürfen also z.B. nicht "x < 100" oder ähnliches benutzen. Wir können auch nicht die selbe Konstante mehrmals benutzen, da die selbe Konstante sonst mehrmals abgefragt wird und so ein Fehler passiert. Alle diese so genannten case-Blöcke werden meistens mit einem "break" abgeschlossen, der dazu sorgt das nach der erfolgreichen Ausführung eines Falles/Blocks, Befehle eines anderen, folgenden Falles/Blocks nicht ausgeführt werden (etwas das manchmal aber nützlich ist!). Wenn kein Fall erreich wird dann wird der so genannte Standard (default auf Englisch) Block ausgeführt.
Für eine Ganzzahl (integer) Variabel 'a' sieht eine Switch Anweisung wie folgend aus:
switch(a){
case 1:
// mache etwas
break;
case 2:
// mache etwas anderes
break;
... // mehr case-Blocks
default:
// Standard Block
}
Mit diesem viel bequemeren programmieren, dass man auch "multiple/multiway branching" nennt kann man sehr leicht Tastatureingaben oder eine Menü-Auswahl bearbeiten (das zweite ist genau wieso wir es heute erwähnen), die mehrere Eingabe-Möglichkeiten oder Auswahlmöglichkeiten bieten.
Strukturen (Structures/Structs auf Englisch)
Structs
Nachdem wir die Switch Anweisung ein bisschen erklärt haben können wir jetzt mit Strukturen weitermachen. Strukturen sind so genannte Komplexe Datentypen. Beim programmieren benutzen wir ständig Variablen. Manchmal ist die Gruppierung solcher Variablen in einem "neuen" Datentyp der alle mit einem spezifischen Prefix enthält sehr hilfreich. Eine Solche Bündelung kann mit der Hilfe von Strukturen erreicht werden. Nach dem Schlüsselwort "struct" und einen Namen für die Struktur werden in einem { } Block die verschiedenen Variablen der Struktur definiert. Die Variablen heissen meistens Mitglieder (member auf Englisch) der Struktur.
Definierung
In C sieht das wie folgend aus:
struct struktur_name{
typ1 mitgield1;
typ2 mitglied2;
...
}
Um eine solche Struktur zu erstellen benutzen wir die folgende Linie Code:
struct struktur_name variabel_name;
Zugriff
Die verschiedenen Elemente-Mitglieder können mit Hilfe eines Punkts ('.') erreicht werden. Sagen wir mal wir haben eine Adressen-Struktur die eine Hausnummer Ganzzahl Variabel enthält. Der Wert dieser Variabel kann wie folgend zugegriffen und geändert werden:
struct Adresse testadresse; // Definierung ausgelassen
testadresse.hausnummer = 23;
Wenn die Struktur als Zeiger definiert wird dann benutzen wir keinen Punkt, sondern einen "Zeiger" ("->") der wie folgend benutzt wird:
struct Adresse *testaddresse;
testadresse->hausnummer = 23;
Typdefinition
Beim erstellen von Struktur-Objekten mussten wir bis jetzt immer das Schlüsselwort "struct" verwenden. Um die Verwendung dieses Schlüsselworts zu minimalisieren (nur bei der Definierung nötig) können wir einen neuen Datentyp-Namen entwerfen mit Hilfe des Schlüsselworts "typedef". Eine Ganzahl Variabel kann z.B. mit dem folgenden Code zu "Integer" unbenannt werden:
typedef int Integer;
Integer a; // das selbe wie int bei diesem Fall
Eine Struktur kann so mit der Benutzung von "typedef struct" zu einem spezifischen Datentyp "gebunden" werden sodass die Erstellung solcher Objekte viel leichter ist! Der Code dafür sieht wie folgend aus:
typedef struct struktur_name{
typ1 mitgield1;
typ2 mitglied2;
...
} datentyp_name;
Der Struktur-Name ist in diesem Fall freiwillig und nur der Datentyp-Name muss unbedingt deklariert werden. Die Definierung eines Adressen-Objekts mit Hilfe einer solchen "neuen" Struktur sieht nun wie folgend aus:
Adresse testadresse; // Definierung ausgelassen
Kleines Beispiel
Ein kleines aber feines Beispielprogramm ist das folgende:
#include<stdio.h>
#include<string.h>
typedef struct{
int id;
char name[20];
}Student; // Studenten Struktur
int main(){
Student s; // Definierung einer Struktur-Variabel
// direkt Wert zuweisen
s.id = 10;
// als Eingabe bekommen
scanf("%19s", s.name);
// Variablen ausdrucken
printf("%d %s\n", s.id, s.name);
}
Gehen wir jetzt auch mal in andere solche ähnliche Strukturen ein...
Unions
Unions sind Strukturen sehr ähnlich. Der Hauptunterschied zwischen Strukturen und Unions liegt darin dass die Elemente denselben Speicherplatz bezeichnen und deshalb soviel Speicherplatz das größte Element benötigt wird. Unions werden immer da verwendet, wo man komplexe Daten interpretieren will. Mit Unions kann man alle Denkbaren Fälle deklarieren und je nach Kontext auf die Daten zugreifen.
Sagen wir mal wir haben die folgende Union:
union zahl{
char c_zahl; // 1 Byte
short s_zahl; // 2 Bytes
}z;
Mit z.c_zahl =5; wird nur der erste Byte verändert und der zweite bleibt natürlich dadurch unverändert. Unions sollte man allerdings generell vermeiden! Die sehr fehlerträchtige Angelegenheit erschwert das Kompilieren und die Interoperabilität zwischen verschieden Systemen.
Enums
Ein Aufzählungsdatentyp oder Enum sieht wie folgend aus:
enum Typname{
Bezeichner = Wert , Bezeichner = Wert, ...
};
Sagen wir mal wir wollen eine Farben Variabel definieren die ein paar spezifische Werte annimmt. Das sie in C-Code wie folgend aus:
enum Farbe{
Blau, Gelb, Orange, Braun, Schwarz
};
Aufzählungstypen sind eigentlich nichts anderes als eine Definition von vielen Konstanten. Durch die Zusammenfassung zu einem Aufzählungstyp wird ausgedrückt, dass die Konstanten miteinander verwandt sind.
Beispielprogramm
Sagen wir mal wir wollen ein Interface/Menü erstellen in der Befehlszeile das Informationen rund um Musikalische Gruppen und dessen Alben verarbeitet. Für jede Gruppe wollen wir eine ID, einen Namen, das Gründungsjahr und 2 Alben abspeichern. Jedes Album hat einen Namen, ein Veröffentlichungsdatum und eine Verkaufsanzahl. Die Gruppe und das Album müssen Strukturen sein und wir wollen unentliche Informationen abspeichern (Dynamische Struktur Felder / Dynamic Struct Arrays).
Das Menü muss folgendes enthalten:
- Von einer Datei lesen und schreiben
- Gruppen hinzufügen
- Nach einer spezifischen Gruppe mit ID oder Namen suchen
- Alle Gruppen anzeigen
- Alben einer Gruppe nach einem spezifischen Jahr finden
- Meistverkauftes Album einer Gruppe finden
- Gruppen alphabetisch sortieren
All diese Funktionen werden durch eine Switch Case Anweisung in einem unendlichen while Loop ausgeführt. Um es interessanter zu machen werden all diese Optionen in Funktionen ausgeführt!
Die groups.txt Datei die vom Programm erstellt und benutzt wird sieht wie folgend aus:
2 // Groupen Anzahl
100 Scorpions 1965 //Informationen von Gruppe 1
Blackout 1982 1100000 // Album 1 von Gruppe 1
Sting_in_the_tale 2010 18500 // Album 2 von Gruppe 1
101 Dive_Straits 1977 // Informationen von Gruppe 2
Making_Movies 1980 1000000 // Album 1 von Gruppe 2
Brother_in_arms 1985 9000000 // Album 2 von Gruppe 2
Da Code generell vernichtet wird in Steemit könnt ihr die "Lösung" im folgenden Link finden:
Referenzen
- http://www.c-howto.de/tutorial/verzweigungen/switch-case/
- http://www.peacesoftware.de/ckurs7.html
- http://www.c-howto.de/tutorial/strukturierte-datentypen/strukturen/
- http://www.c-howto.de/tutorial/strukturierte-datentypen/strukturen/typdefinition/
- https://de.wikibooks.org/wiki/C-Programmierung:_Komplexe_Datentypen
Vorherige Artikel
Einführung -> Programmiersprachen, die Sprache C, Anfänger Programme
Felder -> Felder, Felder in C, Erweiterung des Anfänger Programms
Zeiger, Zeichenketten und Dateien -> Zeiger, Zeichenketten, Dateiverarbeitung, Beispielprogramm
Dynamische Speicherzuordnung -> Dynamischer Speicher, Speicherzuweisung in C, Beispielprogramm
Und das war's dann auch mit diesem Artikel und ich hoffe ich hab alles verständlich erklärt. Νächstes mal werden wir über alles rund um Funktionen sprechen. (ein Thema das ich nicht beim englischen habe!)
Ciao!
This post has been voted on by the steemstem curation team and voting trail.
There is more to SteemSTEM than just writing posts, check here for some more tips on being a community member. You can also join our discord here to get to know the rest of the community!
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit
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
Downvoting a post can decrease pending rewards and make it less visible. Common reasons:
Submit