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

Austauschen einer Case Anweisung mit einer Sinnvolleren

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

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

AW: Austauschen einer Case Anweisung mit einer Sinnvolleren

  Alt 26. Mai 2021, 17: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
722 Beiträge
 
Delphi XE5 Professional
 
#2

AW: Austauschen einer Case Anweisung mit einer Sinnvolleren

  Alt 26. Mai 2021, 18: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.374 Beiträge
 
Delphi 12 Athens
 
#3

AW: Austauschen einer Case Anweisung mit einer Sinnvolleren

  Alt 26. Mai 2021, 19: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]);
Ein Therapeut entspricht 1024 Gigapeut.

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

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

AW: Austauschen einer Case Anweisung mit einer Sinnvolleren

  Alt 26. Mai 2021, 22: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
 
#5

AW: Austauschen einer Case Anweisung mit einer Sinnvolleren

  Alt 27. Mai 2021, 13: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 13:08 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Austauschen einer Case Anweisung mit einer Sinnvolleren

  Alt 27. Mai 2021, 13:19
Erst das "ganze" Wort durchgehn
und nach der Schleife wird Entschieden, ob löschen oder nicht.
Ein Therapeut entspricht 1024 Gigapeut.
  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, 13: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
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 07:04 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-2025 by Thomas Breitkreuz