Tei­ler bestimmen

Lese­zeit: 6 Minu­ten

Lösung
Seite als PDF

Das Pro­gramm erfasst die im Seri­el­len Moni­tor ein­ge­ge­be­nen Werte …

  • Grö­ße des Zahlenraum 
  • kleins­ter Teiler 
  • größ­ter Teiler 

.. und berech­net aus die­sen Anga­ben die teil­ba­ren Zah­len im fest­ge­leg­ten Zah­len­raum. Außer­dem wird die Anzahl der teil­ba­ren Zah­len ermit­telt und angezeigt.

So sieht es aus: 

Für die­se Auf­ga­be brauchst du nur den Arduino.

Bei der Ver­wen­dung von Funk­tio­nen kön­nen nicht nur ein­zel­ne Varia­ble, son­dern auch Arrays über­ge­ben werden. 

Das Bei­spiel­pro­gramm stellt die Viel­fa­chen einer ein­ge­ge­be­nen Zahl im Zah­len­raum bis 100 im Seri­el­len Moni­tor dar.

Das dazu­ge­hö­ri­ge Programm:

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

void loop()
{
  // Array erstellen
  int Zahlen[100];
  
  // auf serielle Eingabe warten
  while (Serial.available() > 0)
  {
    int Divisor = Serial.parseInt();

    // Enter/Senden gedrückt
    if (Serial.read() == '\n')
    {
      int Laenge = sizeof(Zahlen) / sizeof(Zahlen[0]);

      // Array mit Zahlen füllen
      for (int i = 1; i <= Laenge; i++)
      {
        Zahlen[i] = i;
      }
      Serial.print("Die durch " + String(Divisor) + " teilbaren Zahlen im Zahlenraum bis ");
      Serial.println(String(Laenge) + " sind:");
      Serial.println("---------------------------------------------------");

      /*
        Ergebnisse mit der Funktion ErgebnisAnzeigen anzeigen
        übergebene Parameter:
        Array Zahlen
        Divisor
        Länge des Arrays
      */
      ErgebnisAnzeigen(Zahlen, Divisor, Laenge);
    }
  }
}

void ErgebnisAnzeigen(int Zahlen[], int Divisor, long Laenge)
{
  // mit Hilfe der Funktion modulo wird ermittelt,
  // ob die Zahl durch den Divisor teilbar ist
  for (int i = Divisor; i < Laenge; i++)
  {
    if (Zahlen[i] % Divisor == 0) Serial.print(String(Zahlen[i]) + ", ");
  }
  Serial.println();
}

Das Pro­gramm soll jetzt erwei­tert werden.

Der set­up-Teil weist auf die Bedie­nung des Pro­gramms hin:

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

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

  Serial.println("Eingabe der Zahlen:");
  Serial.println("Zahlenraum,minimaler-maximaler Teiler:");
  Serial.println("Beispiel: 100,15-19");
  Serial.println("Zahlenraum muss < 500 sein!");
  Serial.println("---------------------------------------------------");
}

Die Ein­ga­be der Para­me­ter soll in einer Zei­le erfol­gen:
Zah­len­raum und Tei­ler wer­den durch ein Kom­ma getrennt, kleins­ter und größ­ter Tei­ler wer­den durch ein Minus-Zei­chen getrennt.
Bei­spiel: 100,12−15 → Zah­len­raum bis 100, Tei­ler 12-15

Für die Aus­wer­tung wird die Funk­ti­on ➨indexOf ver­wen­det. Sie stellt zunächst die Posi­ti­on des Kom­mas und anschlie­ßend die Posi­ti­on des Minus-Zei­chens fest und defi­niert die ent­spre­chen­den Varia­blen.
Außer­dem wird mit einem Hin­weis dar­auf hin­ge­wie­sen, dass ent­we­der das Kom­ma oder das Minus-Zei­chen fehlt. Beach­te die Kommentare.

void loop()
{
  // auf serielle Eingabe warten
  while (Serial.available() > 0)
  {
    // solange lesen, bis return eingegeben wurde
    String Eingabe = Serial.readStringUntil('\n');

    // das letzte Zeichen ist return -> soll entfernt werden
    Eingabe = Eingabe.substring(0, Eingabe.length() - 1);

    // das Komma suchen
    int SucheKomma = Eingabe.indexOf(",");

    // in der Eingabe fehlt das Komma
    if (SucheKomma == -1) Serial.println("Komma fehlt!");
    else
    {
      // String nach dem Komma -> Teiler Min/Max bestimmen
      int SucheMinus = Eingabe.indexOf("-");

      // Eingabe der Teiler ist unvollständig
      if (SucheMinus == -1) Serial.println("Festlegung der Teiler fehlt!");
      else
      {
        // String bis zum Komma -> Festlegung des Zahlenraums
        String ZahlenRaum = Eingabe.substring(0, SucheKomma);

        // Zählung des Arrays beginnt mit 0
        // -> Array muss um 1 größer als die gewünschte Zahl sein
        int ZahlMax = ZahlenRaum.toInt() + 1;

        // verhindern, dass Zahlen >500 eingegeben werden
        if (ZahlMax > 500) Serial.println("Der Zahlenraum muss < 500 sein!");
        else
        {
          String EingabeMin = Eingabe.substring(SucheKomma + 1, SucheMinus);
          String EingabeMax = Eingabe.substring(SucheMinus + 1, Eingabe.length());
          int MinDivisor = EingabeMin.toInt();
          int MaxDivisor = EingabeMax.toInt();

          // Array definieren
          int Zahlen [ZahlMax];

          // Länge des Arrays bestimmen
          int Laenge = sizeof(Zahlen) / sizeof(Zahlen[0]);

          // Array mit Zahlen füllen
          for (int i = 2; i <= Laenge; i++)
          {
            Zahlen[i] = i;
          }

          // Hinweis auf den Zahlenraum und den maximalen Teiler
          Serial.println("Im Zahlenraum bis " + String(ZahlMax - 1) + " durch " + 
          String(MinDivisor)  + " bis " + String(MaxDivisor) + " teilbare Zahlen: ");
          Serial.println("-------------------------------------------------- -");

          /*
            Ergebnisse mit der Funktion ErgebnisAnzeigen anzeigen
            übergebene Parameter:
            Array Zahlen
            Divisor -> i
            Länge des Arrays -> Laenge
          */
          for (int i = MinDivisor; i <= MaxDivisor; i++)
          {
            ErgebnisAnzeigen(Zahlen, i, Laenge);
          }
          Serial.println("----------------------------------------------------");
        }
      }
    }
  }
}

Jetzt fehlt noch die im loop-Teil auf­ge­ru­fe­ne Funk­ti­on ErgebnisAnzeigen.

Sie wird mit drei Para­me­tern auf­ge­ru­fen:
dem Array Zah­len, dem aktu­el­len Divi­sor und der Län­ge des Arrays Zahlen.

void ErgebnisAnzeigen(int Zahlen[], int Divisor, int Laenge)
{
  Serial.print("Durch " + String(Divisor) + " teilbare Zahlen: ");
  int Anzahl = 0;
  /*
    mit Hilfe der Funktion modulo wird ermittelt,
    ob die Zahl durch den Divisor teilbar ist
    Start mit dem aktuellen Wert für Divisor
  */
  for (int i = Divisor; i < Laenge; i++)
  {
    // Zahl ist teilbar -> Zahl anzeigen
    if (Zahlen[i] % Divisor == 0)
    {
      Serial.print(String(Zahlen[i]) + ", ");
      Anzahl++;
    }
  }

  // Anzahl der teilbaren Zahlen anzeigen
  Serial.print(" (" + String(Anzahl) + ")");
  Serial.println();
}

Startseite
Aufgaben A-Z
Suchen
Downloads
Fehlermeldungen
Seite als PDF

Ver­wand­te Aufgaben:


Letzte Aktualisierung: 10. Okt 2023 @ 9:28