104659
Goto Top

Batch - einfacher taschenrechner ohne -for-

ich habe versucht, einen taschenrechner mit batchbefehlen zu bauen. in einfachen batchdateien haben diese befehle geklappt. allerdings funktionieren sie nicht in meinem script.
kann mir jemand helfen? ich komme mit for-schleifen in batchdateien nicht klar bzw. habe sie immer noch nicht verstanden.
ich entschuldige mich vorab für meine groß- und kleinschreibung. meine shift-taste funktioniert leider nicht so wie sie soll. deshalb werden shiftzeichen selten kommen da ich diese dann über ascii schreibe.

hier mein script

was habe ich falsch gemacht?
@echo off
echo Falls eine Fehlermeldung erscheint oder das Fenster sich schliesst, liegt ein
echo Fehler in der Programmierung vor oder eine eingegebene bzw. errechnete Zahl ist zu hoch/zu niedrig. Ich hafte nicht fuer eventuelle Schaeden.
echo In diesem Programm werden keinerlei systemgefaehrlichen Befehle angewendet.
pause
color 0a
:start
cls
set /p operator=Geben Sie den Operator ein und bestaetigen Sie die Eingabe. (+,-,*,/): 
if %operator%==+ goto zahleingabe
if %operator%==- goto zahleingabe
if %operator%==* goto zahleingabe
if %operator%==/ (goto zahleingabe) else (echo Sie haben ein falsches Zeichen eingegeben.
pause
goto start)
:zahleingabe
cls
set /p /a zahle=Geben Sie die erste Zahl ein: 
set /p /a zahlz=Geben Sie die zweite Zahl ein: 
if %operator%==+ goto addition
if %operator%==- goto subtraktion
if %operator%==* goto multiplikation
if %operator%==/ goto division
:addition
cls
set /a sum=0
set /a sum +=zahle
set /a sum +=zahlz
echo Die Summe der beiden Zahlen betraegt %sum%.
pause
goto start
:multiplikation
cls
set /a pro=0
set /a count=0
goto while
:whileone
set /a pro +=zahle
set /a count +=1
if not %count%==%zahlz% goto whileone
echo Das Produkt der beiden Zahlen betraegt %pro%.
pause
goto start
:subtraktion
cls
set /a dif=0
set /a dif +=zahle
set /a dif -=zahlz
echo Die Differenz der beiden Zahlen betraegt %dif%.
pause
goto start
:division
cls
set /a counter=1
:whiletwo
if %zahle%==%zahlz% goto quotient
set /a zahlz +=zahlz
set /a counter +=1
goto whiletwo
:quotient
echo Der Quotient der beiden Zahlen betraegt %counter%.
pause
goto start
vielen danke für jede hilfe!
Kommentar vom Moderator Dani am 21.01.2012 um 09:51:03 Uhr
Formatierungshilfen eingefügt.
Kommentar vom Moderator Biber am 06.02.2012 um 21:19:29 Uhr
Nach ergebnisloser Nachfrage am 6.2. zwangsgeschlossen und auf "Mehr als genug geholfen" gesetzt.

vielen danke für jede hilfe!
Manche können Duden, andere nur Sieden.

Content-ID: 179292

Url: https://administrator.de/contentid/179292

Ausgedruckt am: 22.11.2024 um 17:11 Uhr

icsat
icsat 21.01.2012 um 09:56:58 Uhr
Goto Top
Hallo Greaka,

Zitat von @104659:
was habe ich falsch gemacht?
  • Du ignorierst die , was es anderen erschwert Dir zu helfen ist.
  • Du Verwendest
    @echo off
    was es Dir erschwert Fehlerursachen zu erkennen und ggf. hier mitzuteilen. Z.B. hättest Du uns sonst mitteilen können, dass Deine Variablen "zahle" und "zahlz" keinen Inhalt haben.
  • Du Verwendest
    set /p /a
    , was in imho dazu führt, dass die beiden Variablen keinen Inhalt haben. Warum das so ist müsste Dir einer der Experten hier sicher erklären können. Verwende "/p" und prüfen im Anschluss, ob es sich um eine Zahl handelt.
  • Du Verwendest
    goto while
    , obwohl while nirgendwo als Sprungmarke definiert ist.
  • Deine Division funktioniert nur, wenn Das Ergebnis 1 oder 2 ohne Rest ist. Warum lasse ich jetz erst mal offen. Da kommst Du schon drauf.

Das sind die Antworten, die mir spontan auf Deine Frage einfallen.

Allerdings gehe ich Davon aus, dass Du diesen Rechner nur zu Übungszwecken in dieser Form erstellt hast, weil eine Berechnung ja auch Einfach über ein
set /a ergebnis = %zahle% %operator% %zahlz%
möglich wäre. Alternativ könnte der Anwender auch einfach die gesamte gewünschte Berechung eingeben
D:\temp>set /p rechenoperation="Eingabe: "  
Eingabe: 2+(4*(1+2))

D:\temp>set /a ergebnis = %rechenoperation%
14
D:\temp>echo %ergebnis%
14

Zum Abschluss würde ich mir in Deinem Skript beim Prüfen des Operators folgendes wünschen:
  • Verwende in der IF-Abfrage z.B. " um ein Beenden des Skriptes mit Sayntaxfehler bei einer fehlenden Eingabe zu verhindern. z.B.:
    if "%operator%"=="+" goto zahleingabe  
  • Da Du damit dem Anwender allerdings die Chance nimmst aus dem Skript ohne Strg+C nicht wieder aussteigen zu können, wäre es schön bei der Operqatoreingabe eine Möglichkeit zum beenden des Skriptes einzubauen.


Gruß icsAT
Friemler
Friemler 21.01.2012 um 10:11:55 Uhr
Goto Top
Hallo Greaka,

zum Thema FOR-Schleife: Schau mal hier vorbei.

Gruß
Friemler
Skyemugen
Skyemugen 21.01.2012 um 10:30:17 Uhr
Goto Top
Zitat von @Friemler:
zum Thema FOR-Schleife: Schau mal hier vorbei.

Kaffee, Friemler? Er will doch extra ohne face-wink


Zitat von @icsat:
  • Du Verwendest
    set /p /a
was in imho dazu führt, dass die beiden Variablen keinen Inhalt haben.
Warum das so ist müsste Dir einer der Experten hier sicher erklären können. Verwende "/p" und prüfen

Die Antwort liefert dir cmd oder echo on => Syntaxfehler ... eine Eingabe kann nicht als Ausdruck verarbeitet werden, den wahren Grund kennen nur die Redmonder Praktikantinnen rothaarig, natürlich, wenn ich mich an Bibers Worte erinnere
set /a wird i.d.R. nur bei der Berechnung selbst benötigt, Eingaben und Zahlendeklinationen sind also unabhängig davon.
als Beispiel:
set Zahl=1000
aber
set /a Zahl+=1

oder auch
set "Zahl=2+(4*(1+2))"
aber
set /a "Ergebnis=%Zahl%" (um das mal analog zum set /p-Beispiel oben zu zeigen

greetz André
104659
104659 21.01.2012 um 11:59:16 Uhr
Goto Top
erstmal danke für die schnellen antworten...

ich habe mich mit diesem script sehr lange befasst und ja, es ist nur eine reine übungsaufgabe. wenn ich echo on mache und die clsbefehle wegnehme hilft mir das nicht weiter da ich nicht weiß warum der mir -fehlender operand- schreibt.
ich habe diesen thread nicht eröffnet, weil ich hilfe zur selbsthilfe brauche sondern ich gesehen habe dass hier sehr schlaue leute wie bieber sind und mir meine fehler hoffentlich erklären können;)
zum beispiel das in anführungsstriche setzen: ich weiß icht was das bedeutet aber deinem kommentar zu urteilen, ist es wohl eine absicherung gegen das automatische schließen wegen eines fehlers...
zu meiner person: ich bin 15 und möchte später entwickler werden weil mir das lösen von aufgaben durch kombinieren spaß macht, deshalb fange ich erstml gaanz klein bei batch an.
gruß, greaka
bastla
bastla 21.01.2012 um 12:48:05 Uhr
Goto Top
Hallo Greaka und willkommen im Forum!

Als weitere Prüfung noch sinnvoll:
echo %zahle%|findstr "[^0-9]">nul && echo Sie haben ...
Den Text nach dem "echo" kannst Du zu Übungszwecken selbst fortsetzen ... face-wink

Ergänzend dazu (um sich auch gegen "08", "009" etc abzusichern):
set "test="  
set /a test=%zahle% + 0 2>nul
if not defined test echo ...
Kürzer ginge es auch noch:
set /a %zahle% + 0 2>nul || echo ...
Grüße
bastla

[Edit] %1 auf %zahle% geändert [/Edit]
Lochkartenstanzer
Lochkartenstanzer 21.01.2012 um 16:13:07 Uhr
Goto Top
Zitat von @104659:

ich habe diesen thread nicht eröffnet, weil ich hilfe zur selbsthilfe brauche

zu meiner person: ich bin 15 und möchte später entwickler werden weil mir das lösen von aufgaben durch kombinieren
spaß macht, deshalb fange ich erstml gaanz klein bei batch an.

Wenn Du keine hilfe Selbsthilfe brauchen kannst, bist Du falsch mit dem Berufswunsch Enrtwickler. Selbst in der Fotobranche werden kaum noch Entwickler benötigt, seit jeder auf Digitalfotos umgestiegen ist und Ihren Tintenstrahldrucker benutzt. face-smile


lks
104659
104659 21.01.2012 um 17:01:47 Uhr
Goto Top
Ich meine damit, dass ich mir die cmdhilfe und sehr viele Foren bereits angeschaut habe und mich deshalb an das itvolk hier wende...
icsat
icsat 21.01.2012 um 17:14:40 Uhr
Goto Top
Hallo Greaka,

[OT]
Zitat von @104659:
wenn ich echo on mache und
die clsbefehle wegnehme hilft mir das nicht weiter da ich nicht weiß warum der mir -fehlender operand- schreibt.
Wenn Du Echo nicht anschaltest wirst Du es auch nie lernen!
Nur mit Echo on kannst Du sehen was Dein Skript wann macht um zu verstehen, wo die Probleme sind.
Im ungünstigsten Fall kannst Du sonst noch nicht einmal feststellen, in welcher Stelle/Zeile es in Deinem Skript zu einem Problem kommt.
Und ich bin mir verdammt sicher, dass auch "sehr schlaue leute wie bieber" hin und wieder echo on oder andere Debug Ausgaben verwenden müssen um Fehlern auf die Spur zu kommen, wenn der Interpreter "brain.exe" mal wieder nen Fehler wirft.

Zitat von @104659:
ich habe diesen thread nicht eröffnet, weil ich hilfe zur selbsthilfe brauche sondern ich gesehen habe dass hier sehr schlaue
leute wie bieber sind und mir meine fehler hoffentlich erklären können;)
Du brauchst keine Hilfe zur Selbsthilfe? Sondern willst lieber Zeit Deines Lebens auf "schlauere" Leute angewiesen sein? OK?
[/OT]

Zitat von @104659:
zum beispiel das in anführungsstriche setzen: ich weiß icht was das bedeutet aber deinem kommentar zu urteilen, ist es
wohl eine absicherung gegen das automatische schließen wegen eines fehlers...
Ist ja nicht schlimm. Ich versuche es mal zu erklären:
Mit dem IF wird in Deinem Fall Zeichenfolge 1 mit Zeichenfolge 2 auf Gleichheit verglichen.
IF Zeichenfolge1==Zeichenfolge2 Befehl
Zeichenfolge1 und Zeichenfolge2 sind Parameter des IF Befehls die zwingend vorhanden sein müssen. Da Zeichenfolge1 in Deinem Fall aus der vorherigen Eingabe kommt könnte diese ggf. nicht existent sein. In der Folge wäre der IF nicht vollständig und Das Skript beendet sich mit einem Fehler:
rem Wenn der Operator korrekt versorgt ist sind die " egal  
set operator=+
if %operator%==+ echo %operator% ist gleich +
rem Aufgelöst: if + == + echo + ist gleich +
rem Ist der Operator nicht definiert und verwendet man im IF " geht's, da Zeichenfolge1 damit "" und vorhanden ist  
set operator=
if "%operator%"=="+" echo %operator% ist gleich +  
rem Aufgelöst: if "" == "+" echo  ist gleich +  
rem Alernativ könnte man z.B. auch  verwenden
if [%operator%]==[+] echo %operator% ist gleich +
rem Aufgelöst: if  == [+] echo  ist gleich +
rem Ist der Operator nicht definiert kommt es ohne " zu einem Fehler da dem IF die Zeichenfolge1 fehlt  
if %operator%==+ echo %operator% ist gleich +
rem Aufgelöst: if ==+ echo  ist gleich +

[OT]
Zitat von @104659:
zu meiner person: ich bin 15 und möchte später entwickler werden weil mir das lösen von aufgaben durch kombinieren
spaß macht, deshalb fange ich erstml gaanz klein bei batch an.
Finde ich echt gut. Sowohl dass Du ein Berufsziel hast, als auch dass Dir das Lösen von Aufgaben Spaß macht.
Wie das ganze ohne Hilfe zur Selbsthilfe dann funktionieren soll verstehe ich dann leider nicht mehr.
[/OT]

@Skyemugen:
Zitat von @Skyemugen:
Die Antwort liefert dir cmd oder echo on => Syntaxfehler ... eine Eingabe kann nicht als Ausdruck verarbeitet
werden,
Bei mir irgenwie nicht ;-(
D:\temp>set /p /a var=Gib was ein jetzt:
Gib was ein jetzt: 3

D:\temp>echo %var%
%var%

D:\temp>


Gruß icsAT
Biber
Biber 21.01.2012 um 17:56:32 Uhr
Goto Top
Moin icsAT,

zu deinem "set /p /a var=Gib was ein jetzt:"-Phänomen:

Das "Rätsel" erklärt sich schnell, wenn du mal mit "Set" am CMD-Prompt nachschaust.
>set
/a var=44
Du hast eine Variable namens "/a var" definiert mit dem Wert 44. face-wink
Das hast du schliesslich auch verlangt - works as designed.

Die umgekehrte Reihenfolge (/a /p statt /p /a) bringt eine - je nach Win-Version - mehr oder weniger sprechende Fehlermeldung.
>set /a /p var=Gib was ein jetzt:
Fehlender Operand

Grüße
Biber
icsat
icsat 21.01.2012 um 18:14:24 Uhr
Goto Top
Hallo Biber,

danke für die Info. Ich glaube ich wäre nicht darauf gekommen, dass Variablen mit SPACE im Namen möglich sind. Aber mir war klar, dass Du eine Erklärung dafür hast face-wink

[OT]
"works as designed" war bei mir das Unwort des Jahres 2005 glaube ich. Ich habe damals bei einer größeren Softwareumstellung bei jeder Fehlermeldung vom zuständigen Hersteller die diese Rückmeldung bekommen.
[/OT]


Gruß icsAT
Skyemugen
Skyemugen 23.01.2012 um 15:05:24 Uhr
Goto Top
[OT]
Zitat von @icsat:
@Skyemugen:
Bei mir irgenwie nicht ;-(

Aloha,

OS? Habe gerade mal am Arbeitsrechner getestet (Windows XP Prof x86), da ist die Ausgabe in der Tat wie von dir beschrieben, meine Syntaxfehlerausgabe erhielt ich zu Hause am Windows 7 HP x64 face-wink

greetz André

@Biber, /a var definiert? Mann, was du wieder für Umgebungsvariablen aktiv hast, hab' ich glücklicherweise nicht, sonst wär mein set manchmal voll mit Krams ^__^
[/OT]
104659
104659 23.01.2012 um 22:00:13 Uhr
Goto Top
Zitat von @icsat:
Ist ja nicht schlimm. Ich versuche es mal zu erklären:

so etwas wollte ich und meinte ich die ganze zeit mit ich brauch keine anleitung selbsthilfe;) ich kenn mich im programmieren einfach nicht gut genug aus...

Zitat von @icsat:
Finde ich echt gut. Sowohl dass Du ein Berufsziel hast, als auch dass Dir das Lösen von Aufgaben Spaß macht.
Wie das ganze ohne Hilfe zur Selbsthilfe dann funktionieren soll verstehe ich dann leider nicht mehr.

weiß ich:p ihr wist ja jetzt was ich meinte;)

ich werde erstmal eure tips dankbar annehmen und falls es mir gelungen ist etwas sauberes hinzubasteln, werd ich diesen thread als gelöst markieren.
icsat
icsat 24.01.2012 um 07:31:04 Uhr
Goto Top
Hi Skyemugen,

das war es dann wohl. Ich nutze Windows XP Prof x86 und es verhält sich genau wie vom Biber erklärt.


Gruß icsAT
104659
104659 26.01.2012 um 16:15:51 Uhr
Goto Top
eine frage habe ich noch bevor ich das hier als gelöst markiere: wie kann ich es hinbekommen dass die batch sich solange nicht schließt bis ich entweder auf das rote kreuz oben rechts gehe oder im taskmanager die batch beende?
bastla
bastla 26.01.2012 um 16:22:00 Uhr
Goto Top
Hallo Greaka!

Ich kenne zwar den aktuellen Stand des Batches nicht, aber Du hattest doch ursprünglich jeweils am Ende ein "goto start" verwendet, wodurch sich praktisch eine Endlosschleife ergibt ...

Grüße
bastla
104659
104659 26.01.2012 um 22:28:50 Uhr
Goto Top
Es geht darum dass ich die Tipps alle angenommen habe und sich die batch trotzdichh noch unerwartet schließt...
icsat
icsat 27.01.2012 um 00:11:50 Uhr
Goto Top
Hallo Greaka,

was tust du denn genau bevor sich das Skript, vermutlich mit Fehlermeldung, beendet?

Du könntest jetzt mal die Fehlermeldung (@echo on start des Skriptes aus einer cmd heraus) posten und Du könntest evtl. auch Dein aktuelles Skript posten.
Das wäre ganz klasse, weil zumindest ich gerade meine Glaskugel verliehen habe und Dir sonst kaum helfen kann. Und Bastla scheint es ähnlich zu gehen, wenn ich seinen Post richtig deute.


Gruß icsAT
104659
104659 28.01.2012 um 02:13:51 Uhr
Goto Top
Bei dem Script hat sich nichts verändert außer dass ich die hochkommata gesetzt habe und cls und echo fof gelöscht habe... Da sich mir ja die Möglichkeit nicht bietet eine fehlermeldung zu Posten da sich das Fenster ja einfach schließt frage ich einfach nochmal: was ist daran falsch?
bastla
bastla 28.01.2012 um 09:23:41 Uhr
Goto Top
Hallo Greaka!
Da sich mir ja die Möglichkeit nicht bietet eine fehlermeldung zu Posten da sich das Fenster ja einfach schließt frage ich einfach nochmal: was ist daran falsch?
Dass sich das Fenster einfach schließt, ist falsch ... face-wink

Einen Batch solltest Du immer testen, indem Du vorweg ein CMD-Fenster öffnest und ihn dann von dort aus startest (Eingabe des Pfades oder auch durch Ziehen der Batchdatei in das Fenster) ...

Abgesehen davon sollte es aber trotzdem keine Zumutung für Dich darstellen, wie von icsAT vorgeschlagen, den aktuellen Stand des Batches nochmals (unter Verwendung der "Code"face-wink zu posten ...

Grüße
bastla
Biber
Biber 01.02.2012 um 16:52:12 Uhr
Goto Top
Moin Greaka,


hast du denn mitbekommen, dass du auf deine Rückfrage vom 28. Jänner diesen Jahres umgehend eine Antwort vom Experten bastla bekommen hast?

Und bist du damit schon so weit gekommen, dass wir einen grünen Hoffnungstupfer in diesem sibirisch-frostwindigen Tag bringen können?

Grüße
Biber