[ Foro de Pascal ]

validar entrada...

20-Jan-2014 16:43
oscar gomez
8 Respuestas

buenas tardes profesor nacho, queria preguntarte acerca de un programa que estoy iniciando y tengo una inquietud , ojala puedas ayudarme.


PROGRAM  juego;

const LIBRE = 'O';   marca = 'X';   pieza = 't';

type  tpEstado = char;
         tpmarcaElemento = array[1..8, 'a'..'h'] of tpEstado;


procedure iniciarTablero(var elementos: tpmarcaElemento);
var f: integer; c: char;
begin
  for f:=1 to 8 do
    for c:='a' to 'h' do casillas[f,c] := LIBRE
end;


procedure marcarE(f: integer;  c: char;  estado: tpEstado;
                         var elementos: tpmarcarElemento);
begin
  if (f>=1) and (c>='a') and (f<=8) and (c<='h') then 
    if elementos[f,c] = LIBRE then 
     elementos[f,c] := estado;
end;

{ f1 , f2 son filas y c1 y c2 son columnas tipo caracter, pues la matriz asi lo exige, es decir filas porejemplo del 1 al 8 y columnas de la 'a' hasta la 'h'}

var elementos: tpmarcaElemento; f1, f2: integer; aux, c1, c2: char;
begin
  write('posiciones : ');
  read(f1); 
  read(c1) ;
  read(f2); 
 read(c2) ; 
 readln;
  iniciarTablero(elementos);
  marcarE(f1, c1, pieza, elementos);  
  
end.


bien profesor o compañero que quiera hecharme una mano, la pregunta es como debo modificar mi codigo mostrado si en la validacion que hago en el procedimiento  procedimiento marcarE :


...  if (f>=1) and (c>='a') and (f<=8) and (c<='h')


con lo que intento que la pieza este solo en esa matriz, lo cual esta bien pero lo que quiero es que si se digitan posiciones para dicha pieza fuera de ese rango de matriz , se lo indique al usuario y que ademas de ello le permita repetir el ingreso de nuevas posiciones correctas( dado que se han digitado porejemplo posiciones fuera de ese rango), como debo modificar mi programita hasta ahora, se que con un repeat pero no se como y donde establecerlo, si dentro del mismo procedimiento a fuera en el programa principal ? por su valiosa ayuda muy agradecido de antemano, quiza sea algo sencillo pero no lo veo...


20-Jan-2014 16:48
oscar gomez

no tomar en cuenta las ecturas:
read(f2);
read(c2) ;

son irrelevantes en este caso, gracias.


20-Jan-2014 20:12
Nacho Cabanes (+84)

Tú mismo tienes la condición para que los datos sean válidos, que debería estar en un "repeat..until" para que se repita mientras que haya algún dato no válido:


(*  if (f>=1) and (c>='a') and (f<=8) and (c<='h') *)
repeat
    writeLn('Introduce fila');
    readLn(f);
until (f>=1) and (f<=8)


Y esa misma idea se aplicaría a las columnas.


20-Jan-2014 20:58
oscar gomez

gracias profesor por responderme, me podrias decir en que parte irian estos repeat , seria mejor tenerlos dentro del procedimiento directamente o mejor fuera en el programa principal? gracias una vez mas, sabia que estaba bloqueado en algo no muy complicado pero a veces pasa , que lo simple resulta darnos mas complicaciones que lncluso lo mas complejo


20-Jan-2014 21:00
Nacho Cabanes (+84)

Yo crearía un procedimiento "PedirDatos", que sea el que descargase al programa principal de esos detalles innecesarios. Lo ideal es que el programa principal tenga no muchas líneas, y que estas líneas muestren claramente la lógica del problema, y que los "detalles poco importantes" los gestionen funciones auxiliares.


20-Jan-2014 22:40
oscar gomez

Perfecto profesor era lo que necesitaba para entender y continuar con mi juego, mil gracias por tu ayuda y por tu tiempo.


21-Jan-2014 19:46
oscar gomez

buenas profesor y compañeros.
profesor queria volver al tema es que bueno ya hice lo que me sugeriste y me funciona bien , sin embargo queria preguntarte por que me gustaria lo siguiente:


procedure pedirDatos(var f1: integer; var c1: char; var elementos: tpmarcarElemento);

 begin
  write('posiciones : ');
  repeat
    writeln('introduzca la fila para la pieza1 :');
    readln(f1);
    writeln('introduzca la columna para la pieza1 :');
    readln(c1);
	
  until  (f1>=1) and (c1>='a') and (f1<=8) and (c1<='h');

 end;


bien hasta aqui perfecto,pero imaginate que yo quiero intentar dos cosas:
a) que cuando en ejecucion introduzca una fila fuera de lo permitido inmediatamente el programa me pida nuevamente ese dato para fila , pues tal como lo tengo me lo pide cuando se ha digitado la columna, y por curiosidad me gustaria saber que modificacion deberia hacer en el procedimiento.

b) que me muestre un nuevo mensaje distinto al que sale cuando digito porejemplo una fila no correcta, me expllico:
en ejecucion:
introduzca la fila para la pieza1 : 9 valor que no esta permitido pr que es hasta la 8
introduzca la fila para la pieza1 :

bien yo quisiera esto:
introduzca la fila para la pieza1 : 9 valor que no esta permitido pr que es hasta la 8
El valor digitado no esta permitido intente de nuevo ingresando un nuevo valor para la fila:

ojala puedas ayudarme es que es algo que desde siempre se me ha dificultado, disculpa si te resulta muy trivial, para mi es sacarme de una duda en muchos de los programas que quiero hacer, a pesar de haber pasado ya la materia hace dos semestres pero ahi estoy intentando aun mejorarme, gracias por la ayuda profesor y de cualquier compañero que quiera hecharme una mano.


21-Jan-2014 22:41
Nacho Cabanes (+84)

Basta con añadir un "if" a mi respuesta: El esqueleto para la fila era


repeat
    writeLn('Introduce fila');
    readLn(f);
until (f>=1) and (f<=8)


que ahora sería


repeat
    writeLn('Introduce fila');
    readLn(f);
    if (f<1) or (f>8) then
        writeLn('La fila debe estar entre 1 y 8');
until (f>=1) and (f<=8)


o bien, si quieres dos mensajes independientes (aunque no tengo claro que eso sea más amigable):


repeat
    writeLn('Introduce fila');
    readLn(f);
    if f<1 then
        writeLn('La fila no debe ser menor de 1');
    if f>8 then
        writeLn('La fila no debe ser mayor de 8');
until (f>=1) and (f<=8)


22-Jan-2014 16:16
oscar gomez

Gracias profesor efectivamente era lo que queria, ahora ya el juego me funciona perfectamente, era solo esa parte que aunque sencilla se me estaba complicando, creo que lo mas dificil ya lo habia hecho y me bloque en esta parte , que sabia era mas o menos asi pero probaba y no me funciona, ahora gracias a ti ya esta todo ok en mi juego, el cual quiero pasarlo a modo grafico a traves de tu curso de graficos y unidades en pascal, en dias estare con ello.






(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.)