[BATCH] blokowe instrukcje warunkowe z obliczeniami

Witam,

napisałem taki o to kalkulator w batchu:

@echo off
color 0a
title Kalkulator
:start
echo +++++++++++++++++++++++++++++++++++
echo 			Kalkulator
echo +++++++++++++++++++++++++++++++++++
cls
set /p l1="Wpisz 1 liczbe:"
set /p l2="Wpisz 2 liczbe:"
echo 1 - dodawanie, 2 - odejmowanie, 3 - mnozenie, 4 - dzielenie, 5 - powrot: 
choice /c 12345 /M "Wybierz 1, 2, 3, 4 lub 5"

if errorlevel == 5 (
	cls
	goto start
	)

if errorlevel == 4 (
	cls
	set d2=/
	set /a wynik=%l1%%d2%%l2%
	echo Dzialanie: %l1%%d2%%l2%=%wynik%
	pause>nul
	cls
	goto start
	)

if errorlevel == 3 (
	cls
	set d2=*
	set /a wynik=%l1%%d2%%l2%
	echo Dzialanie: %l1%%d2%%l2%=%wynik%
	pause>nul
	cls
	goto start
	)

if errorlevel == 2 (
	cls
	set d2=-
	set /a wynik=%l1%%d2%%l2%
	echo Dzialanie: %l1%%d2%%l2%=%wynik%
	pause>nul
	cls
	goto start
	)

if errorlevel == 1 (
	cls
	set d2=+
	set /a wynik=%l1%%d2%%l2%
	echo Dzialanie: %l1%%d2%%l2%=%wynik%
	pause>nul
	cls
	goto start
	)

Problem w tym, że niestety nie liczy prawidłowo, np. 2*5=105. Proszę o pomoc, z góry dziękuję i pozdrawiam. :slight_smile:

Coś jest z tym choice i/lub errorlevel, bo działa jak zrobię to na set i goto:

Raczej z “blokowymi” if-ami: https://stackoverflow.com/a/14190037, obejść problem można po przez przebudowanie if-ów czy jak ktoś zauważył - używając “opcje spowalniającą”.


kod przepisany na użycie "goto" (kliknij aby zobaczyć)
@ECHO off
COLOR 0a
TITLE Kalkulator
:start
ECHO +++++++++++++++++++++++++++++++++++
ECHO 			Kalkulator
ECHO +++++++++++++++++++++++++++++++++++
CLS
SET /p l1="Wpisz 1 liczbe:"
SET /p l2="Wpisz 2 liczbe:"
ECHO 1 - dodawanie (+), 2 - odejmowanie (-), 3 - mnozenie(*), 4 - dzielenie(/), inne - powrot: 
SET /p math="Wybierz 1, 2, 3, 4 lub 5 "

IF '%math%' == '1' GOTO 1
IF '%math%' == '+' GOTO 1
IF '%math%' == '2' GOTO 2
IF '%math%' == '-' GOTO 2
IF '%math%' == '3' GOTO 3
IF '%math%' == '*' GOTO 3
IF '%math%' == '4' GOTO 4
IF '%math%' == '/' GOTO 4
GOTO start

:4
	CLS
	SET d2=/
	SET /a wynik=%l1%%d2%%l2%
	ECHO Dzialanie: %l1%%d2%%l2%=%wynik%
	pause>nul
	CLS
	GOTO start

:3
	CLS
	SET d2=*
	SET /a wynik=%l1%%d2%%l2%
	ECHO Dzialanie: %l1%%d2%%l2%=%wynik%
	pause>nul
	CLS
	GOTO start

:2
	CLS
	SET d2=-
	SET /a wynik=%l1%%d2%%l2%
	ECHO Dzialanie: %l1%%d2%%l2%=%wynik%
	pause>nul
	CLS
	GOTO start

:1
	CLS
	SET d2=+
	SET /a wynik=%l1%%d2%%l2%
	ECHO Dzialanie: %l1%%d2%%l2%=%wynik%
	pause>nul
	CLS
	GOTO start
	
:exit
1 polubienie

Dzięki, za pomoc. :slight_smile:

https://www.computerhope.com/issues/ch001674.htm - jakbyś chciał sprawdzić co powoduje błąd z choice / errorlevel

Możliwe, że mimo prób nadpisania zmiennych te odświeżają się za 2-3 wpisaniem tego samego (np. za 3 razem pokazuje poprawnie mnożenie i wynik a za drugim jak zmienię cyfry na inne bez zmiany wykonywanego działania).


echo                    %errorlevel% %d2%  %wynik%

jak sprawdzałem to pokazują stare i za 2-3 razem liczą poprawnie.


Wyciąłem liczenie z if poza i w sumie też rusza:

@echo off
color 0a
title Kalkulator
:start
echo +++++++++++++++++++++++++++++++++++
echo 			Kalkulator
echo +++++++++++++++++++++++++++++++++++
cls
set /p l1="Wpisz 1 liczbe:"
set /p l2="Wpisz 2 liczbe:"
echo 1 - dodawanie, 2 - odejmowanie, 3 - mnozenie, 4 - dzielenie, 5 - powrot: 
choice /c:12345 /M "Wybierz 1, 2, 3, 4 lub 5"

if errorlevel == 5 (
	goto start
	)

if errorlevel == 4 (
	set d2=/
	goto oblicz
	)

if errorlevel == 3 (
	set d2=*
	goto oblicz
	)

if errorlevel == 2 (
	set d2=-
	goto oblicz
	)

if errorlevel == 1 (
	set d2=+
	goto oblicz
	)
	
:oblicz
    cls
	set /a wynik=%l1%%d2%%l2%
	echo Dzialanie: %l1%%d2%%l2%=%wynik%
	pause>nul
	cls
	goto start

if wtedy można uprościć do:

if errorlevel == 5 goto start
if errorlevel == 4 set d2=/
if errorlevel == 3 set d2=*
if errorlevel == 2 set d2=-
if errorlevel == 1 set d2=+


cls
	set /a wynik=%l1%%d2%%l2%
	echo Dzialanie: %l1%%d2%%l2%=%wynik%
	pause>nul
	cls
	goto start