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
Seite 1 von 3  1 23      
Mo53

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

Austauschen einer Case Anweisung mit einer Sinnvolleren

  Alt 26. Mai 2021, 17:43
Hallo Leute,
Ich bin dabei ein Programm zu schreiben, was ein Menü ausgibt in dem man auswählen kann in einem vorher eingegebenem String die Operatoren in Strings umzuwandeln also + = plus etc.
Nun habe ich es mit einer Case Anweisung probiert für jeden einzelnen Operator, jedoch besteht jetzt das Problem, das die Überprüfung endet sobald ein Operator gefunden und umgetauscht wurde. Ich komme leider nicht drauf wie ich das anders erstellen kann sodass das Programm die Überprüfung für die Operatoren nicht beendet sobald eins gefunden wurde.
Würde mich sehr freuen wenn mir jemand auf die Sprünge helfen kann .

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

uses
  System.SysUtils;

var
 abbruch : Boolean;
 menueEingabe : Char;
 satz : String;
 laufVariable,anzahlPlus,anzahlMinus,anzahlMal,anzahlGeteilt : Word;
 plus,minus,mal,geteilt : String;

begin
  abbruch := (menueEingabe = upcase('x')) or (menueEingabe = 'x');
  plus := ' plus ';
  minus := ' minus ';
  mal := ' mal ';
  geteilt := ' geteilt ';

  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);

  case menueEingabe of
   'A','a' : readln(satz);
   'B','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;
   'C','c' : begin
                if length(satz) > 0 then
                   for laufVariable := 1 to length(satz) 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;
                       end;
                       writeln(satz);


             end;
   'D','d' : begin
                if length(satz) > 0 then
                 writeln('Richtig D')
                else writeln('Eingabe ungültig!');
             end;
   'X','x' : abbruch := TRUE

    else writeln('Eingabe ist ungültig!');
  end;

  until (abbruch);

  readln;
end.
  Mit Zitat antworten Zitat
Fritzew

Registriert seit: 18. Nov 2015
Ort: Kehl
678 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Austauschen einer Case Anweisung mit einer Sinnvolleren

  Alt 26. Mai 2021, 18:07
Nicht geprüft, aber da Du den Satz ja veränderst würde ich das so lösen:
Also vom Ende her untersuchen deshalb anstatt einer for eine while loop
Delphi-Quellcode:
'C','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; // End case
                        dec(laufvariable);
                    end;
                   writeln(satz);

           end;
Fritz Westermann
  Mit Zitat antworten Zitat
berens

Registriert seit: 3. Sep 2004
434 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Austauschen einer Case Anweisung mit einer Sinnvolleren

  Alt 26. Mai 2021, 18:50
Du hast deine Variablen nicht initialisiert.

Delphi-Quellcode:
var
 abbruch : Boolean;
 menueEingabe : Char;
begin
  abbruch := (menueEingabe = upcase('x')) or (menueEingabe = 'x');
Du weist der Variable "abbruch" beim Programmstart einen Wert zu, der von "menueEingabe" abhängt, was wiederum ebenfalls nicht initialisiert ist.

Schreibe diese Zeile (abbruch := ...) nach " readln(menueEingabe);". Dann wird in in jedem Durchlauf ermittelt, ob das Programm verlassen werden soll, oder nicht...

Alternativ zumindest die Variable richtig initialisieren, damit Abbruch:=False hat (auch nach ReadLn), denn du verwendest ja (auch) die Case-Anweisung zum Auswerten von X.
Delphi 10.4 32-Bit auf Windows 10 Pro 64-Bit, ehem. Delphi 2010 32-Bit auf Windows 10 Pro 64-Bit
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
719 Beiträge
 
Delphi XE5 Professional
 
#4

AW: Austauschen einer Case Anweisung mit einer Sinnvolleren

  Alt 26. Mai 2021, 19:06
Zur Vereinfachung könntest Du ReadLn(menueEingabe) gegen ReadLn(UpperCase(menueEingabe)); tauschen, dann wären die Stellen wie
Delphi-Quellcode:
'B','b' : begin
           ...
einfacher, nämlich nur
Delphi-Quellcode:
'B' : begin
           ...
Gruß, Andreas
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#5

AW: Austauschen einer Case Anweisung mit einer Sinnvolleren

  Alt 26. Mai 2021, 20:10
Ähhh nein?
Das ist ein VAR-Parameter, da geht keine Funktion drumrum, schon garkeine mit String, wo es aber ein Char sein soll.
Delphi-Quellcode:
menueEingabe := UpperCase(menueEingabe)[1];

// oder direkt
case UpperCase(menueEingabe)[1] of
Aber hier sehe ich eh keinen Grund das Zwanghaft kürzen zu wollen.





Zitat:
Delphi-Quellcode:
'C','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; // End case
                        dec(laufvariable);
                    end;
                   writeln(satz);

           end;
So, wem fällt auf, dass es praktisch alle 4 Fälle identisch sind, mit Ausname des Insert-Text,

Und warum überhaupt unnötig ein WHILE, anstatt einem FOR?

Delphi-Quellcode:
       for laufVariable := Length(satz) downto 1 do
                    if satz[laufVariable] in ['+', '-', '*', '/'] then
                      begin
                        delete(satz, laufVariable, 1);
                        case satz[laufVariable] of
                          '+' : insert(plus, satz, laufVariable);
                          '-' : insert(minus, satz, laufVariable);
                          '*' : insert(mal, satz, laufVariable);
                          '/' : insert(geteilt, satz, laufVariable);
                        end;
                      end;
Delphi-Quellcode:
       const ZeichenZuText: array['*'..'/'] of string = (mal, plus, '', minus, '', geteilt);

       for laufVariable := Length(satz) downto 1 do
                    if satz[laufVariable] in ['+', '-', '*', '/'] then
                      begin
                        delete(satz, laufVariable, 1);
                        insert(ZeichenZuText[satz[laufVariable]], satz, laufVariable);
                      end;
Und nun mal ganz im Ernst ...
Delphi-Quellcode:
satz := ReplaceStr('+', plus);
satz := ReplaceStr('-', minus);
satz := ReplaceStr('*', mal);
satz := ReplaceStr('/', geteilt);

// oder
for C := Low(ZeichenZuText) to High(ZeichenZuText) do
  if ZeichenZuText[C] <> 'then
    satz := ReplaceStr(C, ZeichenZuText[C]);
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (26. Mai 2021 um 20:19 Uhr)
  Mit Zitat antworten Zitat
Mo53

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

AW: Austauschen einer Case Anweisung mit einer Sinnvolleren

  Alt 26. Mai 2021, 23:05
Vielen Dank Leute, das hat mir sehr weitergeholfen
  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 27. Mai 2021, 14:05
Ich versuche jetzt gerade für Menüpunkt D eine Anweisung zu erstellen die alle Wörter in denen kein Operator enthalten ist löscht.
Bsp.: (Gu+en Tag) wird zu (Gu+en).
Jedoch ist dies komplizierter als gedacht.
Habt iht vielleicht eine Idee?
Ich darf jedoch keine Arrays oder selbstgemachte Funktionen anwenden.

Delphi-Quellcode:
 begin
          if length(satz) > 0 then
          begin
            leerZeichen := ' ';
            laufVariable := 1;
            repeat
              for laufVariable := 1 to pos(leerZeichen, satz, laufVariable) do
              begin

                case satz[laufVariable] of
                  '+':
                    inc(anzahlPlus);
                  '-':
                    inc(anzahlMinus);
                  '*':
                    inc(anzahlMal);
                  '/':
                    inc(anzahlGeteilt);
                end;
                keinOperator := (anzahlPlus = 0) and (anzahlMinus = 0) and
                  (anzahlMal = 0) and (anzahlGeteilt = 0);
                if keinOperator then
                  delete(satz, laufVariable,
                    (pos(leerZeichen, satz, laufVariable) - 1));

              end;
            until (length(satz) = laufVariable);

          end

Geändert von Mo53 (27. Mai 2021 um 14:08 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.071 Beiträge
 
Delphi 12 Athens
 
#8

AW: Austauschen einer Case Anweisung mit einer Sinnvolleren

  Alt 27. Mai 2021, 14:19
Erst das "ganze" Wort durchgehn
und nach der Schleife wird Entschieden, ob löschen oder nicht.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Mo53

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

AW: Austauschen einer Case Anweisung mit einer Sinnvolleren

  Alt 27. Mai 2021, 14:41
@Himitsu
Ich mache das ja schon, aber ich verstehe nicht wie ich dem Programm erklären soll das es ein wort von anfang bis ende löscht.
  Mit Zitat antworten Zitat
Benutzerbild von Moombas
Moombas

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

AW: Austauschen einer Case Anweisung mit einer Sinnvolleren

  Alt 27. Mai 2021, 15:03
Gibt es mehrere Möglichkeiten.
Eine wäre z.B. Deinen Text bei jedem Leerzeichen zu splitten (http://www.delphibasics.co.uk/Method...s&Method=Split) und damit ein array zu befüllen.
Dann hast du ein Array in dem jedes Wort einzeln steht.
Dann das Array durchgehen und 1. mit pos() (https://www.delphipraxis.net/28411-post9.html) prüfen ob ein Operator enthalten ist und 2. wenn ja dies dem Ergebnisstring hinzufügen (Leerzeichen nicht vergessen).
Der Weg ist das Ziel aber man sollte auf dem Weg niemals das Ziel aus den Augen verlieren.

Geändert von Moombas (27. Mai 2021 um 15:06 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 11:39 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz