problema programacion .bat ms-dos

Hola a todos, que tal?
Bueno tengo un problema y es que no consigo resolver un ejercicio de programacion de un fichero bat en msdos que:
aceptará 3 parámetros, que deberán ser 3 números entre el 1 y el 99 y mostrará por pantalla un mensaje indicando cuál de los tres números es el mayor. Para este fichero ten en cuenta que los operadores de comparación que se pueden utilizar con el comando if son: EQU (Igual), NEQ (no igual), LSS (menor), LEQ (menor que o igual), GTR (mayor que) y GEQ (mayor que o igual).

pero no consigo sacarlo ya que al no existir operadores logicos como && y || es dificl, alguien podria ayudarme?
gracias a todos
P.D. os adjunto el .bat para que comproveis el codigo, da error y no se en donde.
anidando.

ejemplo (pseudocodigo rápido, luego le añades los % y demás)... if ((A > 0) && (B > 0)) puede hacerse con:
if A GTR 0
  if B GTR 0
    ...ACCIONES...
eso ya solo se, pero el problema lo tengo el mas a bajo del programa en la parte de comprobar que parametros es mayor que no me entra en los else.
Un saludo y gracias.
P.D. lo de aninado ya lo sabia pero gracias
Podrías poner el código que te da el problema exáctamente. De todos modos viendo el código, yo lo reescribiría un poco, no te hacen falta tantos goto, puedes tener una variable que almacene el mayor número y anidar las comprobaciones. Por ejemplo, si los parámetros son a, b y c

si a > b
   si a > c
      mayor = a
   si_no
      mayor = c
   finSi
si_no
   si b>c
      mayor = b
   si_no
      mayor = c
finSi


Si no he metido la pata, mayor almacenará el mayor número entre a, b y c, lo muestras y ya está.

Para anidar ifs:

if <cond> (
    if <cond> (
        ...
    ) else (
        ...
    )
) else (
    ...
)


Por cierto, creo (no tengo ningún windows a mano para comprobarlo) que el exist no se usa para comprobar si existe una variable sino para ficheros, y para comparar enteros no se usan comillas.

Usar funciones también lo simplificaría mucho.
Si quieres algo breve...

@ECHO OFF
IF %3 GTR %2 SHIFT /2
IF %2 GTR %1 SHIFT
ECHO El mayor es %1


Respecto de tu código...

el problema lo tengo el mas a bajo del programa en la parte de comprobar que parametros es mayor que no me entra en los else


No puedes cerrar un paréntesis en una línea con un echo. A partir de esa instrucción, todo lo que le sigue se interpreta como parte del texto que quieres sacar por pantalla y no te delimita el bloque. Prueba a cerrar esos paréntesis en la línea siguiente.

Por cierto, no has tenido en cuenta el caso param1 < param2 < param3

Un saludo.
La idea del shift me gusta, pero no me termina de convencer demasiado, si existen 2 variables que son iguales?
por ejemplo si 3 es mayor que 2 pero 1 es igual a 3?
Bueno, lo intentare de todas formas con el shift, que ya es la 3ª vez que hago el programa desde 0, jaja
estoy ofuscado con ese ejercicio y no hay dios que me saque..jeje
Mil gracias
Me pillaste editando xD

Respecto de mi propuesta, si te limitas a indicar el valor más alto, y no especificas en que parámetros está ese valor, no es necesario tener en cuenta los casos en los que aparece ese valor dos o más veces.

Un saludo.
bueno... solo tengo una cosa que decir.......
echo CRACK!!jeje
eres un amo deschamps, que sepas que me as salvado..jeje
funciona a la perfeccion jeje
la verdad es que no se me habia ocurrido..jeje
pero lo tuyo es mil veces mejor..jeje
Copio el codigo del programa todo funcionando con todas las posibilidadesde error etc.jeje
@echo off
rem autor:ivan Garcia Miranda
rem fecha: 26 de mayo de 2011
echo ############################################
echo # Programa que pide 3 numeros por parametro#
echo #      y calcula el mayor numero         #
echo ############################################
echo la variable 1 es %1
echo la variable 2 es %2
echo la variable 3 es %3
echo.
if "%1"=="" goto falta1
if "%2"=="" goto falta2
if "%3"=="" goto falta3
goto calcula1

:calcula1
if %1 GTR 99    goto error
if %1 LSS 1    goto error
if %2 GTR 99   goto error
if %2 LSS 1      goto error
if %3 GTR 99    goto error
if %3 LSS 1    goto error
goto calcula

:calcula
if %3 GTR %2 shift /2
if %2 GTR %1 shift
echo el numero mayor es: %1
goto salir

:error
echo los parametros introducidos no estan entre 1 y 99
echo.
goto salir

:falta1
echo no existe el parametro 1
echo.
goto salir

:falta2
echo no existe el parametro 2
echo.
goto salir

:falta3
echo no existe el parametro 3
echo.
goto salir

:salir
echo.
echo programa creado por Ivan Garcia
echo.
echo ###################
echo # fin del programa#
echo ###################


Que lo use quien lo necesite..jeje
Un slaudo y mil gracias
Bueno, ya que lo has hecho, pongo el que he hecho yo (sólo quería probar, hace un lustro que no toco batch :P), por si puedes sacar alguna idea, aunque Deschamps me ha dejado a la altura del betún usando así los parámetros, no se me había ocurrido [ayay] Básicamente he usado funciones para no repetir código.

@echo off
cls

set "result=ok"
call:check_param result %1
call:check_param result %2
call:check_param result %3
if "%result%"=="ko" goto error_param

call:max result %1 %2
call:max result %result% %3

echo.El mayor numero entre %1, %2 y %3 es %result%

goto exit

:check_param
if "%~2"=="" (set "%~1=ko" & goto:eof)
if %~2 GTR 99 (set "%~1=ko" & goto:eof)
if %~2 LSS 1 (set "%~1=ko" & goto:eof)
goto:eof

:error_param
echo Error: Debes introducir 3 enteros entre el 1 y el 99, ambos incluidos
goto exit

:max
if %~2 GTR %~3 (
    set "%~1=%~2" & goto:eof
) else (
    set "%~1=%~3" & goto:eof
)

:exit
amuchamu escribió:... ya que lo has hecho, pongo el que he hecho yo (sólo quería probar, hace un lustro que no toco batch ...


Andamos igual :) Yo también estuve trasteando para refrescar la memoria (para descubrir que la tengo muy oxidada, más bien xD). Con lo poco que recordaba no fui capaz de definir una función al uso, pero lo planteé como un desarrollo en saltos de ida y vuelta... Así quedó el invento:

@ECHO OFF

IF [%3] EQU [] (
    ECHO Faltan datos
    GOTO:EOF )

SET PARAM=1
GOTO VALIDAR
:VALIDADO1

SET PARAM=2
GOTO VALIDAR
:VALIDADO2

SET PARAM=3
GOTO VALIDAR
:VALIDADO3


IF %3 GTR %2 SHIFT /2
IF %2 GTR %1 SHIFT
ECHO El valor mayor es %1
GOTO:EOF


:VALIDAR
CALL SET DATO=%%%PARAM%%%
IF %DATO% LEQ 99 ( IF %DATO% GEQ 1 GOTO VALIDADO%PARAM% )
ECHO El parámetro %PARAM% no es correcto
la verdad es que sois unos crack`s muchas de las cosas que planteais en los codigos no se me habrian ocurrido en años..jejeje
como se no ta que aunque lo tengais oxidados es como montar en bici, que no se olvida eh..jajaja
Muchisimas gracias a todos y nada.. a refrescar la memoria..jaja
10 respuestas