AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Austauschen einer Case Anweisung mit einer Sinnvolleren
Thema durchsuchen
Ansicht
Themen-Optionen

Austauschen einer Case Anweisung mit einer Sinnvolleren

Ein Thema von Mo53 · begonnen am 26. Mai 2021 · letzter Beitrag vom 1. Jun 2021
Antwort Antwort
Mo53

Registriert seit: 16. Mai 2021
59 Beiträge
 
Delphi 10.3 Rio
 
#1

AW: Austauschen einer Case Anweisung mit einer Sinnvolleren

  Alt 28. Mai 2021, 13:03
Falls du CharInSet nicht verwenden darfst, musst du dir das wieder in ein case umbauen.
Hättest du vielleicht ein Vorschlag dafür, ich habe CharInSet ehrlich gesagt noch nie gesehen.
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

Registriert seit: 22. Mär 2017
Ort: bei Flensburg
525 Beiträge
 
FreePascal / Lazarus
 
#2

AW: Austauschen einer Case Anweisung mit einer Sinnvolleren

  Alt 28. Mai 2021, 13:25
Du kannst auch eine oder verknüpfte If-Anweisung nehmen.
Case hast du doch bereits gemacht, musst es nur noch anwenden.
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.367 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Austauschen einer Case Anweisung mit einer Sinnvolleren

  Alt 28. Mai 2021, 14:39
Falls du CharInSet nicht verwenden darfst, musst du dir das wieder in ein case umbauen.
Hättest du vielleicht ein Vorschlag dafür, ich habe CharInSet ehrlich gesagt noch nie gesehen.
Ganz ehrlich: Nein.
Du hast in den anderen Programmteilen bereits entsprechende Case-Strukturen drin. Der Umbau ist trivial. Du kannst dann sogar das "or OPFound" weglassen.
CharInSet prüft nur, ob dein aktuelles Zeichen aus dem Satz in der Menge der Operatorzeichen enthalten ist. Wenn du für jedes Operatorzeichen einen Case-Fall erstellst, bist du im Prinzip schon fertig.
Peter
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.739 Beiträge
 
Delphi 6 Enterprise
 
#4

AW: Austauschen einer Case Anweisung mit einer Sinnvolleren

  Alt 28. Mai 2021, 16:21
Hier ist mMn aber der Lerneffekt mit einem "if" größer, ala

if (zeichen='+') or (zeichen='-') ... then
OPFound:=true;
Ralph
  Mit Zitat antworten Zitat
Mo53

Registriert seit: 16. Mai 2021
59 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Austauschen einer Case Anweisung mit einer Sinnvolleren

  Alt 31. Mai 2021, 10:51
So ich habs jetzt, das Programm läuft Prima, jedoch gibt es ein kleines Problem und zwar wenn man ins Menü ab oder ac oder generell einen Buchstaben nach a eingibt, wird trotzdem A ausgeführt, obwohl eigentlich gedacht war das er Eingabe ist ungültig ausgeben soll.
Habt ihr eine Idee?

Delphi-Quellcode:
{$APPTYPE CONSOLE}
{$R+,Q+,X-}

uses
  System.SysUtils;

var
  keinOperator, endeErreicht, operatorGefunden, leerzeichenGefunden: Boolean;
  menueEingabe: Char;
  leerZeichen: String;
  satz: String;
  laufVariable, anzahlPlus, anzahlMinus, anzahlMal, anzahlGeteilt,
  wortEnde: Word;

// Schleife zur Ausgabe des Menüs:
begin
  repeat
    writeln('A) Satz eingeben');
    writeln('B) Anzahl Operatoren im Satz bestimmen');
    writeln('C) Operatoren in Satz ausschreiben');
    writeln('D) Alle Wörter entfernen, die keinen Operator erhalten');
    writeln('X) Ende');
    readln(menueEingabe);
    writeln;

    menueEingabe := upcase(menueEingabe);

    case menueEingabe of
    // Option einen Satz einzugeben:
      'A':
        begin
          write('Satz eingeben: ');
          readln(satz);
        end;
    // Option alle Operatoren im String aufzuzählen:
      'B':
        begin
          if length(satz) > 0 then
          begin
            anzahlPlus := 0;
            anzahlMinus := 0;
            anzahlMal := 0;
            anzahlGeteilt := 0;
            for laufVariable := 1 to length(satz) do
            begin
              case satz[laufVariable] of
                '+':
                  inc(anzahlPlus);
                '-':
                  inc(anzahlMinus);
                '*':
                  inc(anzahlMal);
                '/':
                  inc(anzahlGeteilt);
              end;
            end;
            writeln(anzahlPlus, ' + und ', anzahlMinus, ' - und ', anzahlMal,
              ' * und ', anzahlGeteilt, ' / im Satz gefunden');
          end
          else
            writeln('Eingabe ungültig!');
        end;
    // Option alle Operatoren im String auszuschreiben:
      'C':
        begin
          laufVariable := length(satz);
          while laufVariable > 0 do
          begin
            case satz[laufVariable] of
              '+':
                begin
                  delete(satz, laufVariable, 1);
                  insert(' plus ', satz, laufVariable);
                end;
              '-':
                begin
                  delete(satz, laufVariable, 1);
                  insert(' minus ', satz, laufVariable);
                end;
              '*':
                begin
                  delete(satz, laufVariable, 1);
                  insert( ' mal ', satz, laufVariable);
                end;
              '/':
                begin
                  delete(satz, laufVariable, 1);
                  insert(' geteilt ', satz, laufVariable);
                end;
            end;
            dec(laufVariable);
          end;
          writeln(satz);

        end;
    // Option alle Wörter im String die keinen Operator enthalten zu löschen:
      'D':
        begin
          if length(satz) > 0 then
          begin
            laufVariable := length(satz);
            wortEnde := length(satz);
            endeErreicht := TRUE;

            while endeErreicht do
            begin
              operatorGefunden := FALSE;
              wortEnde := laufVariable;
              leerzeichenGefunden := FALSE;
              repeat
                if ((satz[laufVariable] = '+') or (satz[laufVariable] = '-') or
                  (satz[laufVariable] = '*') or (satz[laufVariable] = '/')) then
                  operatorGefunden := TRUE;

                if (satz[laufVariable] = ' ') then
                begin
                  leerzeichenGefunden := TRUE;
                  if not operatorGefunden then
                    delete(satz, laufVariable, (wortEnde - laufVariable + 1));
                end;

                if (not leerzeichenGefunden and (laufVariable = 1) and
                  not operatorGefunden) then
                begin
                  delete(satz, laufVariable, (wortEnde - laufVariable + 2));
                end;

                dec(laufVariable);
                if laufVariable = 0 then
                  endeErreicht := FALSE;
              until ((laufVariable = 0) or leerzeichenGefunden);
            end;
            writeln(satz);
          end
          else
            writeln('Eingabe ungültig!');
        end;
    end;
  until (menueEingabe = 'X');
end.
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.367 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Austauschen einer Case Anweisung mit einer Sinnvolleren

  Alt 31. Mai 2021, 12:25
Deine Variable menueeingabe ist vom Typ char. Da passt nur ein Zeichen rein. Das Readln wird deshalb nur das erste Zeichen darin speichern können. Alles was danach kommt, wird verworfen. Wenn du deinen Fehler provozieren willst, musst du zum Beispiel "f" eingeben.
Peter
  Mit Zitat antworten Zitat
Mo53

Registriert seit: 16. Mai 2021
59 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Austauschen einer Case Anweisung mit einer Sinnvolleren

  Alt 31. Mai 2021, 13:33
Wie meinst du das mit dem provozieren ?
  Mit Zitat antworten Zitat
Benutzerbild von Jasocul
Jasocul

Registriert seit: 22. Sep 2004
Ort: Delmenhorst
1.367 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Austauschen einer Case Anweisung mit einer Sinnvolleren

  Alt 1. Jun 2021, 07:27
Wie meinst du das mit dem provozieren ?
Du wolltest doch testen, ob bei einer falschen Eingabe deine Fehlermeldung erzeugt/provoziert wird. Dann nimm einfach einen(!) Buchstaben, der unzulässig ist. Warum das in deinem Programm mit mehreren Buchstaben nicht funktioniert, habe ich bereits erklärt.
Peter
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:37 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz