Ejercicio 8 práctico 5

Ejercicio 8 práctico 5

de Tadeo Vicente Lã“Pez Ospitaleche -
Número de respuestas: 7

Buenas, tengo dos dudas sobre el ejercicio 8. El contexto es que estoy intentando leer el primer numero de la operación y el operador con las siguientes líneas (num1 es integer y operador char):
read(num1);
read(operador);

Pero al momento de ejecución obtengo el error 106 (con input por ejemplo '3='). Lo que entiendo que pasa es que pascal está leyendo el operador como parte del número. Observar que además cambiando el orden de las instrucciones pascal si separa correctamente ambas variables. Eso me hace pensar que el error viene porque un integer puede tener dos o más cifras, entonces pascal sigue leyendo la línea, y cuando se encuentra con un caracter que no es una cifra válida (un número) en vez de parar muestra error 106.

Mis dudas son 1) es correcto lo que pienso que causa el error? y 2) cómo se podría evitar/solucionar? (supongo que tratando cada cosa del input como char podría servir, pero quiero saber si hay una solución mas simple que no implique tener que trabajar con ord y chr)

Gracias de antemano!

En respuesta a Tadeo Vicente Lã“Pez Ospitaleche

Re: Ejercicio 8 práctico 5

de Luis Sierra -
hola tadeo,

no es correcto lo que piensas que causa el error. si pascal tiene para leer un entero, y la entrada es de la forma "3=", leerá el 3 en la variable usada por el read correspondientes, y la entrada quedará de la forma "=".

en el hilo https://eva.fing.edu.uy/mod/forum/discuss.php?d=318903#p693379 aparece un problema que me parece es precisamente el que tienes. revísalo, y vuelve si tienes dudas.

saludos

luis
En respuesta a Luis Sierra

Re: Ejercicio 8 práctico 5

de Manuel Fernandez Mauri -
Buenas tardes, a mí me está dando el mismo error y no he podido solucionarlo con el hilo que haces referencia. Agradezco si me puedes ayudar.
Adjunto Screenshot 2025-04-06 at 16.22.45.png
En respuesta a Manuel Fernandez Mauri

Re: Ejercicio 8 práctico 5

de Luis Sierra -
hola manuel,

en la sección Laboratorio tienes un enlace a la Descripción de errores en tiempo de ejecución provista por free pascal. allí puedes leer:

106 Invalid numeric format
Reported when a non-numeric value is read from a text file, and a numeric value was expected.

en tu código hay solamente dos lugares en los que puede haber sucedido algo así: la línea 7 que dice read (a) o la 14 que dice read (b). el lugar en que ocurrió ese problema te debería aparecer en el mensaje de error.

acostúmbrate a extraer toda la info posible de los mensajes de error. en este caso, ya sabrías dónde y por qué fue el error.

dicho esto, imagino que el problema te aparece ya en el arranque. supongamos que iniciás con un saldo de 100 y querés depositar 50. supongo que tu sesión es más o menos así.

ponés 100 ENTER d
y ahí se rompe.

y supongo que lo que sucede es:
1. lin 7. se almacena 100 en a
2. lin 8. se almacena ENTER (o algo parecido) en op
3. lin 14. se intenta leer el número d, que no es un número, y
4. se rompe.

y me parece que la solución sería asegurarse que al leer a se consuma todo el renglón: usar readln en lugar de read en la línea 7.

si observás con atención, verás que este mensaje es una copia casi literal de https://eva.fing.edu.uy/mod/forum/discuss.php?d=318903#p693379. intenta solucionar tu problema con esta relectura. si no puedes, vuelve a consultar.

saludos
luis
En respuesta a Luis Sierra

Re: Ejercicio 8 práctico 5

de Manuel Fernandez Mauri -
Hola Luis,

No entiendo qué tiene que ver el ejercicio al que haces referencia en tu respuesta, ese no es el que yo estoy intentando resolver, sino el que se encuentra en la imagen adjunta.
 
Según entiendo por la letra del ejercicio, usar readln en lugar de read no seria una solución sino que generaría un nuevo problema, ya que se explicita que la entrada se introducirá en una única secuencia de enteros y caracteres.
 
Con respecto al error, esto es lo que me devuelve la terminal al ingresar "4+3/2*8-4=" como entrada: 

Runtime error 106 at $00000001001FB580

  $00000001001FB580

No sé si ahí me dice dónde se produce el error al ejecutar el programa. En caso afirmativo, ¿podrías explicarme cómo interpretar el mensaje de error?

Gracias.

Adjunto Screenshot 2025-04-10 at 21.30.40.png
En respuesta a Manuel Fernandez Mauri

Re: Ejercicio 8 práctico 5

de Luis Sierra -
hola manuel,

tenés razón. observé el error 106 y supuse erróneamente una hipótesis de error.

ahora, viendo el mensaje de error que te aparece, tengo una hipótesis más simple: supongo que no compilaste como se te indicó. revisa si al compilar con todas las opciones de compilación que se te indican en los instructivos correspondientes se mantiene o no el error.

saludos

luis
En respuesta a Luis Sierra

Re: Ejercicio 8 práctico 5

de Tadeo Vicente Lã“Pez Ospitaleche -

Gracias por la respuesta! 

Capaz me expliqué mal; el programa con el que estoy abstrayendo el problema es el siguiente: 

imagen%20%281%29.png

El mismo da error 106 en tiempo de ejecución, en la línea 5 escribiendo 3= y luego apretando enter (en general el error sucede escribiendo 3a con a cualquier caracter).
Entiendo de la respuesta dada que pascal debería ser capaz de asignar 3 a num1 y '=' a letra (de hecho, como dije en el post original, al cambiar el orden de instrucciones si se lee bien las variables).

No le veo relación con el problema citado (que lo leí antes de plantear mi duda) pues en este caso hay únicamente dos reads, y el problema ocurre en la línea 5, ni siquiera llega a la línea 6 como para que sea algún error de leer una variable mal guardando un enter o algo del estilo..
Por si acaso: estoy usando free pascal, compilando en windows usando la invocación a fpc que está en el eva.

En respuesta a Tadeo Vicente Lã“Pez Ospitaleche

Re: Ejercicio 8 práctico 5

de Luis Sierra -
hola tadeo,

copié tu programa, y esta es mi compilación y ejecución.

luis:$ fpc -Co -Cr -MISO -gl p5e8TL
Free Pascal Compiler version 3.2.0+dfsg-12 [2021/01/25] for x86_64
Copyright (c) 1993-2020 by Florian Klaempfl and others
Target OS: Linux for x86-64
Compiling p5e8TL.pas
p5e8TL.pas(2,5) Note: Local variable "num1" is assigned but never used
Linking p5e8TL
7 lines compiled, 0.1 sec
1 note(s) issued
luis:$ ./p5e8TL
3=
luis:$

pero también hice la siguiente prueba.

luis:$ fpc p5e8TL
Free Pascal Compiler version 3.2.0+dfsg-12 [2021/01/25] for x86_64
Copyright (c) 1993-2020 by Florian Klaempfl and others
Target OS: Linux for x86-64
Compiling p5e8TL.pas
p5e8TL.pas(2,5) Note: Local variable "num1" is assigned but never used
Linking p5e8TL
7 lines compiled, 0.1 sec
1 note(s) issued
luis:$ ./p5e8TL
3=
Runtime error 106 at $00000000004010BB
$00000000004010BB
$0000000000422D5C

luis:$

así que mi primer hipótesis es que no estás compilando correctamente. así que te sugiero que revises nuevamente los instructivos de compilación que aparecen en la sección Laboratorio.

saludos
luis