Städ­te-Info

Lese­zeit: 5 Minu­ten

Lösung
Seite als PDF

Im Seri­el­len Moni­tor sol­len ver­schie­de­ne Infor­ma­ti­on zu Städ­ten ange­zeigt werden.

Bei die­ser Anlei­tung lernst du einen neu­en Daten­typ ken­nen. In ➨Arrays las­sen sich nur Daten vom glei­chen Typ definieren. 

Struk­tu­ren (struct) sind eine Samm­lung und Beschrei­bung ver­schie­de­ner Daten. Sie kön­nen belie­bi­ge Daten­ty­pen ver­wen­den. Die Struk­tur ist die Vor­la­ge für die Defi­ni­ti­on der kon­kre­ten Daten.

In den Bei­spie­len wer­den ver­schie­de­ne Infor­ma­tio­nen zu den ein­zel­nen Städ­ten mit­hil­fe unter­schied­li­cher Daten­ty­pen zusammengefasst.

Zunächst wird eine Scha­blo­ne definiert:

struct Stadt
{
int Platz;
String Name;
String KFZ_Kennzeichen;
float Ein­woh­ner;
String Vor­wahl;
int Hoe­he;
};

Defi­ni­ti­on der Daten:

const int MAX = 3;
struct Stadt Namen[MAX] =
{
{1, "Ber­lin", "B", 3.64, "030", 30},
{2, "Ham­burg", "HH", 1.84, "040", 6},
{3, "Mün­chen", "M", 1.47, "089", 519}
};

Eine for-Schlei­fe zeigt die Daten an:

for (int i = 0; i < MAX; i++ )
{
Serial.print(String(Namen[i].Platz) + "\t");
Serial.print(Namen[i].Name + "\t\t");
Serial.print(Namen[i].KFZ_Kennzeichen + "\t\t");
Serial.print(String(Namen[i].Einwohner) + "\t\t");
Serial.print(String(Namen[i].Hoehe) + "\t\t");
Serial.println(Namen[i].Vorwahl);
}

Das voll­stän­di­ge Programm:

struct Stadt
{
  int Platz;
  String Name;
  String KFZ_Kennzeichen;
  float Einwohner;
  String Vorwahl;
  int Hoehe;
};

const int MAX = 3;
struct Stadt Namen[MAX] = 
{
  { 1, "Berlin", "B", 3.64, "030", 30 },
  { 2, "Hamburg", "HH", 1.84, "040", 6 },
  { 3, "M\u00fcnchen", "M", 1.47, "089", 519 }
};

void setup() 
{
  Serial.begin(9600);

  // auf serielle Verbindung warten
  while (!Serial);
  delay(1000);

  for (int i = 0; i < MAX; i++) 
  {
    Serial.print(String(Namen[i].Platz) + "\t");
    Serial.print(Namen[i].Name + "\t\t");
    Serial.print(Namen[i].KFZ_Kennzeichen + "\t\t");
    Serial.print(String(Namen[i].Einwohner) + "\t\t");
    Serial.print(String(Namen[i].Hoehe) + "\t\t");
    Serial.println(Namen[i].Vorwahl);
  }
}

void loop()
{
  // bleibt leer, Programm läuft nur einmal
}

So sieht es aus:

Nach Ein­ga­be einer Zahl zwi­schen 1 und 4 im Seri­el­len Moni­tor soll die Infor­ma­ti­on zur ent­spre­chen­den Stadt des Arrays ange­zeigt wer­den.
Mit Ein­ga­be der Zahl 5 wird eine zufäl­li­ge Aus­wahl getroffen.

Ergän­ze die Daten mit den jewei­li­gen Bun­des­län­der und erstel­le die Daten für Köln.

{4, "Köln", "K", 1.04, "0221", 53, "NRW"}

So soll es aussehen:

Die ergänz­te Defi­ni­ti­on der Variablen.

struct Stadt
{
  int Platz;
  String Name;
  String KFZ_Kennzeichen;
  float Einwohner;
  String Vorwahl;
  int Hoehe;
  String Land;
};
const int MAX = 4;

/*
  \u00e4d = ä
  \u00df = ß
  \u00fc = ü
  \u00f6 = ö
*/

// Array definieren
Stadt Namen[MAX] =
{
  {1, "Berlin", "B", 3.64, "030", 30, "Berlin"},
  {2, "Hamburg", "HH", 1.84, "040", 6, "Hamburg"},
  {3, "München", "M", 1.47, "089", 519, "Bayern"},
  {4, "Köln", "K", 1.04, "0221", 53, "NRW"}
};

Im set­up-Teil wird der Seri­el­le Moni­tor gestar­tet und über den Ablauf des Pro­gramms infor­miert. Mit Hil­fe des Tabu­la­tors (\t} wird die Aus­ga­be formatiert.

void setup()
{
  Serial.begin(9600);

  // auf serielle Verbindung warten
  while (!Serial) {;}

  // Info
  Serial.println("Liste der Gro\u00dfst\u00e4dte mit mehr als 1 Mio Einwohner");
  Serial.println("----------------------------------------------------------");
  Serial.println("1 = Berlin");
  Serial.println("2 = Hamburg");
  Serial.println("3 = München");
  Serial.println("4 = Köln");
     
  Serial.println("----------------------------------------------------------");
  Serial.println("Platz\tStadt\t\tKFZ\tEinw. in Mio.\tHöhe\tVorwahl\t\tBundesland");
}

Der loop-Teil. Beach­te die Kommentare.

void loop()
{
  // auf serielle Eingabe warten
  while (Serial.available() > 0)
  {
    // Eingabe im Seriellen Monitor lesen
    String Eingabe = Serial.readStringUntil(char(13));

    // String Eingabe nach int umwandeln
    // die Funktion ZeigeDaten kann dann direkt aufgerufen werden
    int Auswahl = Eingabe.toInt();

    // wenn Auswahl > 0 und < 5
    // weil das Array mit 0 beginnt, 1 abziehen
    if (Auswahl > 0 && Auswahl < 5) ZeigeDaten(Auswahl - 1);

    // zufällige Auswahl
    if (Auswahl == 5)
    {
      int Minimum = 0;
      int Maximum = 4;
      int Zahl =  random(Minimum, Maximum);
      ZeigeDaten(Zahl);
    }
  }
}

Die Funk­ti­on ZeigeDaten:

void ZeigeDaten(int i)
{
  // bei der Einwohnerzahl . durch , ersetzen
  String Einwohner =  String(Namen[i].Einwohner);
  Einwohner.replace(".", ",");
  
  // Daten anzeigen, mit Tabulator (\t) formatieren
  Serial.print(String(Namen[i].Platz) + "\t");
  Serial.print(Namen[i].Name + "\t\t");
  Serial.print(Namen[i].KFZ_Kennzeichen + "\t\t");
  Serial.print(Einwohner + "\t");
  Serial.print(String(Namen[i].Hoehe) + "\t");
  Serial.print(Namen[i].Vorwahl + "\t\t");
  Serial.println(Namen[i].Land);
}


Ver­wand­te Aufgaben:


Letzte Aktualisierung: 27. Nov 2023 @ 9:47