Programacion 1 Sistemas – practica 1 (12/10/2002)

(*****************************************************
*NOMBRE: #Jorge#
*PRIMER APELLIDO: #Senin#
*SEGUNDO APELLIDO: #xxxxxxx#
*DNI : #xxxxxxxxx#
******************************************************)
MODULE PractUno;
FROM InOut IMPORT WriteString, WriteLn , ReadCard ;
CONST
MAXLADO = 20 ;
MINLADO = 1 ;

TYPE
RangoRombo = [MINLADO..MAXLADO];

PROCEDURE PreguntarLado () : CARDINAL ;
(* Pregunta el lado y lo devuelve de tipo cardinal *)
(* Si no es valido devuelve 0 *)
VAR Lado: CARDINAL;

BEGIN

WriteString («Escriba el valor del lado : «);
ReadCard (Lado);

IF (Lado < MINLADO) OR (Lado > MAXLADO) THEN
Lado := 0;
END;

RETURN Lado;
END PreguntarLado;

PROCEDURE QuePuntoDibujo ( x, z , lado : CARDINAL ) : CHAR ;
CONST
PUNTOSROMBO = 4;
VAR
PuntosRombo: ARRAY [0..PUNTOSROMBO-1] OF CHAR;
caracter : CHAR ;
BEGIN

PuntosRombo[1] := «@»;
PuntosRombo[2] := «.»;
PuntosRombo[3] := «o»;
PuntosRombo[0] := «.»;
caracter := ‘ ‘; (* NO SE PUEDE DEJAR VACIO » *)

(* Hay que hacer que la figura sea simetrica asi que distinguimos entre
el lado izquierdo y el derecho segun sea igual o mayor del valor
de x con respecto del tama�o de lado *)
IF x <= lado THEN
(* La formula es para contar las posiciones a escribir en la que
el primer punto escrito es 1 , el segundo 2…. asi sucesivamente
Se hace el modulo por que nos da valores de rango 0..Puntosrombo-1
y asi sacamos el caracter a imprimir *)
caracter := PuntosRombo[(x-(lado – z)) MOD PUNTOSROMBO];
ELSIF x > lado THEN
(* Esta formula es lo mismo pero se hace para el lado contrario
con lo cual se realiza al reves dando valores 3 2 1 … *)
caracter := PuntosRombo[ ((z )-(x-lado)) MOD PUNTOSROMBO ];
END;

RETURN caracter;
END QuePuntoDibujo;

PROCEDURE DibujarRombo ( Lado : CARDINAL ) ;
VAR x,y,z,ancho, alto: CARDINAL ;

BEGIN

ancho := Lado; (* el alto y el ancho valen lo mismo *)
alto := Lado;

z:= 1; (* al principio 1 punto *)
(* z lleva el numero de caracteres a rellenar a izquierda y derecha *)

(* Las lineas de alto*)
FOR y:= 1 TO (alto * 2) -1 DO

(* Linea horizontal entera 2*ancho -1 *)
FOR x:= 1 TO (ancho * 2) -1 DO
(*Blancos de la izquierda*)
(* ancho – z es el espacio que queda en blanco *)
IF x <= (ancho – z ) THEN
WriteString (» «);
(*Blancos de la derecha*)
(* (ancho – 1) + z es si supera la parte rellena *)
ELSIF x > ((ancho – 1) + z) THEN
(* WriteString (» «);*)
(* zona a rellenar, el crrector no admite espacios en blanco*)
ELSE
WriteString (QuePuntoDibujo(x,z,Lado));

END;
END;
(* fin lineas horizontales *)

WriteLn;

(* LA PRIMERA VALE 1 Y PARTIR DE LA PRIMERA EMPIEZA A CONTAR*)
IF y < alto THEN
z := z + 1; (* el crecimiento siempre es de 1 por linea y lado*)
(* el lado de la izquierda crece en 1 = que la derecha *)
ELSE
z := z – 1; (* decrece igual a mitad para hacer la forma de rombo*)
END;

END;
(* fin vertical *)

END DibujarRombo;

(* Programa principal *)
VAR Lado : CARDINAL;
BEGIN

Lado := PreguntarLado() ; (* Preguntamos y validamos el valor *)
WriteLn ;
WriteLn ;
IF Lado <> 0 THEN
(* Dibujamos el rombo *)
DibujarRombo ( Lado );(* tiene el mismo tama�o de alto que ancho *)
END
END PractUno.


Publicado

en

por

Etiquetas:

Comentarios

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.