Skip to Content

Lenguaje de la Materia

Se utiliza un lenguaje inventado específicamente para la materia, que nos permite definir procedimientos y funciones.

Procedimientos

Un procedimiento encapsula un bloque de código con su respectiva declaración de variables (que define el estado).

proc  nombre(<inoutin/out>p1:T1,  ,  <inoutin/out>pn:Tn)<declaraciones de variables><sentencias>end  proc\begin{aligned} &\proc \; nombre(< \bfin | \out | \inout > p_1 : T_1, \; \ldots, \; < \bfin | \out | \inout > p_n : T_n) \\ &\quad < \textnormal{declaraciones de variables} > \\ &\quad < \textnormal{sentencias} > \\ &\bfend \; \proc \\ \end{aligned}

Donde p1,  ,  pnp_1, \; \ldots, \; p_n son nombres de variables (parámetros) y T1,  ,  TnT_1, \; \ldots, \; T_n sus respectivos tipos.

Entrada/salida de parámetros:

  • in\bfin es el parámetro de entrada (no modificable)
  • out\out el parámetro de salida.
  • in/out\inout el parámetro de entrada/salida.

Un ejemplo de declaración de procedimiento es el siguiente:

proc  abs(in  x:int,  out  y:int)if  x>=0  theny:=xelsey:=xfiend  proc\begin{aligned} &\proc \; abs(\bfin \; x : \intt, \; \out \; y : \intt) \\ &\quad \if \; x >= 0 \; \then \\ &\quad \quad y := x \\ &\quad \else \\ &\quad \quad y := -x \\ &\quad \fi \\ &\bfend \; \proc \\ \end{aligned}

Un ejemplo de llamada de este procedmiento puede ser:

proc  llamadordeabs()var  a,b:inta:=10elseabs(a,b){    b=10    }end  proc\begin{aligned} &\proc \; llamadordeabs() \\ &\quad \var \; a, b : \intt \\ &\quad a := -10 \\ &\quad \else \\ &\quad abs(a,b) \\ &\quad \{- \;\; b = 10 \;\; -\} \\ &\bfend \; \proc \\ \end{aligned}

Observaciones:

  • Los procedimientos no devuelven cosas (pero pueden escribir varios parámetros out\out).
  • Las llamadas a estos son sentencias del lenguaje.

Funciones

Las funciones son como procedimientos salvo que todos los parámetros son in\bfin y devuelven algo.

fun  nombre(p1:T1,  ,  pn:Tn)  ret  r:T<declaraciones de variables><sentencias>end  fun\begin{aligned} &\fun \; nombre(p_1 : T_1, \; \ldots, \; p_n : T_n) \; \ret \; r : T \\ &\quad < \textnormal{declaraciones de variables} > \\ &\quad < \textnormal{sentencias} > \\ &\bfend \; \fun \\ \end{aligned}

Donde p1,  ,  pnp_1, \; \ldots, \; p_n y rr son nombres de variables (parámetros) y T1,  ,  TnT_1, \; \ldots, \; T_n sus respectivos tipos.

Un ejemplo de declaración de función es el siguiente:

fun  abs(in  x:int)  ret  y:intif  x>=0  theny:=xelsey:=xfiend  fun\begin{aligned} &\fun \; abs(\bfin \; x : \intt) \; \ret \; y : \intt \\ &\quad \if \; x >= 0 \; \then \\ &\quad \quad y := x \\ &\quad \else \\ &\quad \quad y := -x \\ &\quad \fi \\ &\bfend \; \fun \\ \end{aligned}

Y un ejemplo de llamada es:

proc  llamadordeabs()var  a,b:inta:=10b:=35b:=abs(a)a:=abs(a)+10{    b=10,  a=20    }end  proc\begin{aligned} &\proc \; llamadordeabs() \\ &\quad \var \; a, b : \intt \\ &\quad a := -10 \\ &\quad b := 35 \\ &\quad b := abs(a) \\ &\quad a := abs(a) + 10 \\ &\quad \{- \;\; b = 10, \; a = 20 \;\; -\} \\ &\bfend \; \proc \\ \end{aligned}

Observaciones sobre funciones:

  • No hay sentencia return. Se devuelve lo que sea asignado a la variable declarada como ret\ret. La variable se puede usar libremente en el cuerpo de la función (se puede leer, asignar varias veces, etc.).
  • Las llamadas a funciones no son sentencias, son expresiones (e.g. se puede usar en la parte derecha de una asignación, en una guarda, etc).
  • Las funciones no tienen efectos colaterales en el estado. Una función no puede escribir las variables correspondientes a los parámetros.

Observaciones generales:

  • Cada función y procedimiento define un estado propio llamado “contexto”. Las variables declaradas dentro de funciones y procedimientos no existen fuera de éstas.
  • Cualquier función o procedimiento pueden llamar a cualquier otra función o procedimiento. Incluso pueden llamarse a sí mismas (recursión), y también mutuamente (recursión mutua).
  • No importa el orden en que se declaran, un procedimiento puede llamar a otro que esté definido más adelante.
  • No se pueden definir procedimientos ni funciones dentro de procedimientos o funciones (no hay anidamiento, todas las definiciones están al mismo nivel).

Tipos Nativos

Los tipos nativos son los tipos que trae predefinido el lenguaje de programación.

Tipos básicos:

  • bool\bool: booleanos (TrueTrue y FalseFalse)
  • int\intt: enteros
  • nat\nat: naturales (con el 00)
  • real\real: reales
  • char\char: caracteres (a\textnormal{'} a \textnormal{'})
  • string\string: secuencias de caracteres ("string"\textnormal{"string"})

Se utilizan constantes que sirven como infinito/-infinito, etc.

Tipos estructurados:

  • array\array: arreglos
  • pointer\pointer: punteros

Expresiones

Expresiones válidas en programación imperativa:

  • valores constantes
  • variables y constantes declaradas
  • operaciones básicas (+,,,/,div,mod,max,min,,,¬,=,char"338=,,<,>)(+, -, *, /, \textnormal{div}, \textnormal{mod}, \textnormal{max}, \textnormal{min}, \land, \lor, \neg, =, \not=, \leq, <, >)
  • accesos a elementos de arreglos
  • llamadas a funciones

Sentencias

Skip

Utilizamos skip\skip para no hacer nada.

Asignación

La sintaxis es: v:=Ev := E donde vv es variable y EE expresión. No se utiliza la asignación múltiple en este lenguaje

Llamada a procedimiento

Llamamos los procedimientos como nombreproc(e1,,en)nombreproc(e_1, \ldots, e_n)

Condicional

Utilizamos if,  then,  else\if, \; \then, \; \else de las siguientes maneras:

if  B  thenS1elseS2fi\begin{aligned} &\if \; B \; \then \\ &\quad S_1 \\ &\else \\ &\quad S_2 \\ &\fi \end{aligned}

O también, sin el else\else

if  B  thenSfi\begin{aligned} &\if \; B \; \then \\ &\quad S \\ &\fi \end{aligned}

Donde BB es una guarda y expresión booleana, y S,S1,S2S, S_1, S_2 sentencias.

Repetición

Utilizamos while,  do\while, \; \do:

while  B  doSod\begin{aligned} &\while \; B \; \do \\ &\quad S \\ &\od \end{aligned}

Donde BB es una guarda y expresión booleana, y SS una sentencia.

Otras repeticiones, for to, for downto

Sintaxis de for  to\for \; \too:

for  i:=N  to  M  doSod\begin{aligned} &\for \; i:=N \; \too \; M \; \do \\ &\quad S \\ &\od \end{aligned}

Donde NN y MM son expresiones de tipo int\intt y SS es sentencia.

Su semántica es la siguiente:

  1. Se declara la variable ii (sólo exisitirá dentro de la sentencia SS)
  2. Se le asigna a ii el valor NN
  3. Se ejecuta SS
  4. Se incrementa ii en 11
  5. Si i>Mi > M termina, si no vuelve al punto 3.
  6. ii deja de existir al terminar.

Sintaxis de for  downto\for \; \downto:

for  i:=N  downto  M  doSod\begin{aligned} &\for \; i:=N \; \downto \; M \; \do \\ &\quad S \\ &\od \end{aligned}

Donde NN y MM son expresiones de tipo intint y SS es sentencia.

Su semántica es igual a for  to\for \; \too pero restando 11.

Observaciones:

  • No hace falta declarar el ii (el for\for ya lo declara)
  • Si había otra variable ii afuera, esta ii la tapa.
  • No se puede modificar ii con asignaciones en el cuerpo del ciclo (SS)
  • No agrega expresividad al lenguaje (todo se puede hacer con while\while).
  • itera desde NN hasta MM inclusive

Un ejemplo de for  to\for \; \too podría ser:

var  precios:array[1..100]  of  intfor  i:=1  to  100  doprecios[i]:=0od\begin{aligned} &\var \; precios : \array [1..100] \; \of \; \intt \\ &\for \; i:=1 \; \too \; 100 \; \do \\ &\quad precios[i] := 0 \\ &\od \end{aligned}

Y para for  downto\for \; \downto,

var  precios:array[1..100]  of  intprecios[100]:=35for  i:=99  downto  1  doprecios[i]:=precios[i+1]2od\begin{aligned} &\var \; precios : \array [1..100] \; \of \; \intt \\ &precios[100] := 35 \\ &\for \; i:=99 \; \downto \; 1 \; \do \\ &\quad precios[i] := precios[i+1] * 2 \\ &\od \end{aligned}

Secuenciación

No hay secuenciación explícita como en Algoritmos 1, basta con poner una sentencia después de otra.

Última vez actualizado el