[ Foro de Pascal ]

Duda con Enter

27-Nov-2014 01:19
Invitado (Alberto)
8 Respuestas

Una duda concreta, como puedo hacer que el usuario pueda meter los elementos que le de la gana en un array sin haber una constante n o sin preguntale cuantos quiere meter, y como hacer que el programa se cierre con el enter.
Muchas gracias



EJEMPLO DE EJECUCIÓN
Introduzca los elementos del array separados por espacios, <enter> para terminar:
1 2 3 6 75 34 34 34 2 23 23 23


27-Nov-2014 10:08
Nacho Cabanes (+84)

Son dos preguntas distintas...

- Para meter un número indeterminado de datos en un array, tendrás que sobredimensionar. Mira el apartado 4.1.5 del curso:

http://www.aprendeaprogramar.com/mod/resource/view.php?id=553

- Para leer varios datos en la misma línea y terminar cuando se pulse Intro, tendrás que usar "Read" en vez de "ReadLn". Cuando no haya más datos que leer, te devolverá 0 si estás leyendo numeros (peligroso) o una cadena vacía si estás leyendo cadenas de texto (preferible).


27-Nov-2014 18:54
Luis Torres (+18)

Se debe evitar el uso de read para leer números o cadenas, solo usarlo para leer en archivos o ficheros, esa es una norma que yo tengo siempre grabada en mi cerebro; sin embargo, este problema requiere de su uso. Te recomiendo que para evitar  el cierre abrupto del programa coloques un readln después de culminar todas las lecturas que hiciste con el read, y al final del código un segundo readln, el cual es el que acostumbramos a colocar siempre, en total serán dos readln.

En cuanto a la lectura de una cantidad no contabilizada de números, creo que sería una buena idea inicializar todo el arreglo con un valor centinela, es decir, un valor que jamás estará entre los números que quieras introducir; la lectura la harás dentro de un ciclo while y la condición de salida será ese valor centinela.

Espero haberte ayudado.

Saludos.


28-Nov-2014 00:18
Luis Torres (+18)

Cometí un error en el último párrafo, mejor es no tomarlo en cuenta. Le pregunto al prof. Nacho, de hacer las lecturas con un while, ¿cuál sería la condición de parada del ciclo?

Saludos.


28-Nov-2014 11:57
Nacho Cabanes (+84)

Coincido contigo en que "read" es una orden a evitar, pero muchos profesores insisten en ejercicios de "lee varios datos separados por espacios". Eso, en lenguajes más modernos, como C#, se puede solucionar leyendo una única cadena de texto y partiéndola con "Split" (C#), "explode" (PHP) u órdenes similares. Pero en Pascal, la única forma simple es leer dato a dato con "read".

La forma, cuando la cantidad de datos es indeterminada, es leer cadenas de texto con un "read" dentro de un "repeat..until", hasta encontrar una cadena de texto vacía. Si hay que trabajar con ellas como número, basta con convertir los valores con "val".


29-Nov-2014 03:53
Luis Torres (+18)

Se me ocurrió otra forma de hacerlo, estaba frente a mis ojos y no lo veía, finalmente me di cuenta. Es algo sumamente sencillo y básico, se hace usando la función booleana EOLN para detener la lectura dentro del ciclo while. Sé que no debo hacer esto, pero voy a colocar el código para que el prof. Nacho Cabanes lo revise. Aquí se los dejo:


program lecturaLineaDeNumeros;
uses CRT;
const MAX= 20;
var
  A: array[1..MAX] of integer;
  i: integer;
  lmtSup: integer;
BEGIN
  writeln('Introduzca a linea de numeros enteros: ');
  i:=0;
  { Hacemos la lectura de cada numero entero dentro de la linea }
  while (not EOLN) do
  Begin
    i:= i + 1;
    read(A[i]);
  End;
  readln; { Muy importante este readln, asi nos saldremos del programa abruptamente }
  lmtSup:= i;
 { Mostramos los resultados en pantalla }
  for i:=1 to lmtSup do
      write(A[i],' ');
  writeln; 
  readln;
END.


Espero haya podido ayudar.

Saludos.


29-Nov-2014 20:01
Alberto Rilo Mosteiro

Perfecto, era una idea que me rondaba la cabeza lo del eoln pero no sabia como ponerlo exactamente. Lo del limitesup, no habria que inicializarlo a un valor, maxint por ejemplo?


29-Nov-2014 21:08
Luis Torres (+18)

No es necesario, porque éste debe guardar el valor de índice del último de los valores introducidos por el usuario. En tal caso, si no se introduce ningún valor, sería bueno inicializarlo (en las primeras líneas del código) a cero, para que no se ejecute la parte del código que muestra los datos en pantalla; pero si siempre el usuario va a escribir valores, no será necesario, es por una cuestión de validación y nada más.

Saludos.


30-Nov-2014 18:27
Nacho Cabanes (+84)

Efectivamente, la solución de Luis es la buena. Si se intenta leer como cadena de texto, se toman todos los números como una única cadena que también contiene los espacios, y el programa no se comportará correctamente, así que no hay más remedio que leer directamente como números y comprobar el final con "eoln".






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)