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

Saturday, March 24th, 2007 @ 4:13 pm | Notas rápidas

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

 

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

 

 

Recently

  • Cómo instalar dropbox en Debian usando los sources , copia y pega
  • Infección en apps de Android
  • virt-manager: ERROR:root:unsupported locale setting
  • sopastrike.com – Vamos a la huelga
  • No me gusta wordpress
  • [Asterisk] Tareas de mantenimiento
  • screengrab queda muerto
  • rails + omniauth + omniauth-twitter
  • Ruby on Rails + Papercliip: cannot load such file — cocaine (LoadError)
  • `autodetect’: Could not find a JavaScript runtime. See https://github.com/sstephenson/execjs for a list of available runtimes. (ExecJS::RuntimeUnavailable)
  •