104659
21.01.2012, aktualisiert am 06.02.2012
7567
20
0
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?
vielen danke für jede hilfe!
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
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
20 Kommentare
Neuester Kommentar
Hallo Greaka,
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 möglich wäre. Alternativ könnte der Anwender auch einfach die gesamte gewünschte Berechung eingeben
Zum Abschluss würde ich mir in Deinem Skript beim Prüfen des Operators folgendes wünschen:
Gruß icsAT
Zitat von @104659:
was habe ich falsch gemacht?
was habe ich falsch gemacht?
- Du ignorierst die , was es anderen erschwert Dir zu helfen ist.
- Du Verwendest 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.
@echo off
- Du Verwendest , 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.
set /p /a
- Du Verwendest , obwohl while nirgendwo als Sprungmarke definiert ist.
goto while
- 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%
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
Kaffee, Friemler? Er will doch extra ohne
Zitat von @icsat:
Warum das so ist müsste Dir einer der Experten hier sicher erklären können. Verwende "/p" und prüfen
- Du Verwendest
set /p /a
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 erinnereset /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 zeigengreetz André
Hallo Greaka und willkommen im Forum!
Als weitere Prüfung noch sinnvoll:
Den Text nach dem "
Ergänzend dazu (um sich auch gegen "08", "009" etc abzusichern):
Kürzer ginge es auch noch:
Grüße
bastla
[Edit]
Als weitere Prüfung noch sinnvoll:
echo %zahle%|findstr "[^0-9]">nul && echo Sie haben ...
echo
" kannst Du zu Übungszwecken selbst fortsetzen ... 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 ...
set /a %zahle% + 0 2>nul || echo ...
bastla
[Edit]
%1
auf %zahle%
geändert [/Edit]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.
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.
lks
Hallo Greaka,
[OT]
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.
[/OT]
Mit dem IF wird in Deinem Fall Zeichenfolge 1 mit Zeichenfolge 2 auf Gleichheit verglichen.
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:
[OT]
Wie das ganze ohne Hilfe zur Selbsthilfe dann funktionieren soll verstehe ich dann leider nicht mehr.
[/OT]
@Skyemugen:
Gruß icsAT
[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!wenn ich echo on mache und
die clsbefehle wegnehme hilft mir das nicht weiter da ich nicht weiß warum der mir -fehlender operand- schreibt.
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?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;)
[/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: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...
Mit dem IF wird in Deinem Fall Zeichenfolge 1 mit Zeichenfolge 2 auf Gleichheit verglichen.
IF Zeichenfolge1==Zeichenfolge2 Befehl
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.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.
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
werden,
Bei mir irgenwie nicht ;-(Die Antwort liefert dir
cmd
oder echo on
=> Syntaxfehler ... eine Eingabe kann nicht als Ausdruck verarbeitetwerden,
D:\temp>set /p /a var=Gib was ein jetzt:
Gib was ein jetzt: 3
D:\temp>echo %var%
%var%
D:\temp>
Gruß icsAT
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.
Du hast eine Variable namens "/a var" definiert mit dem Wert 44.
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.
Grüße
Biber
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
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
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
[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
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
[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
[OT]
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
greetz André
@Biber,
[/OT]
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
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]
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
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
Hallo Greaka!
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" zu posten ...
Grüße
bastla
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 ... 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" zu posten ...
Grüße
bastla