O CESGA SUPÉRASE CUN NOVO MACRO ORDENADOR 1200 NÚCLEOS AMD

     PDF

E-mail
La actualización del superordenador SVG compuesta por 1200 núcleos de  proceso AMD a 2.2GHz y 2400GB de memoria principal, esta disponible para  todos los usuarios del centro.

Se accede al sistema a través de svgd.cesga.es siguiendo las instrucciones que se detallan a continuación:

  1. Conectarse a svgd.cesga.es
  2. Lanzar una sesión interactiva: compute --arch amd
  3. Cargar los módulos necesarios de compiladores, aplicaciones, etc.  
NOTAS:
- module av muestra los módulos disponibles,
- module help muestra una ayuda básica sobre como utilizar l módulo

O CESGA SUPÉRASE CUN NOVO MACRO ORDENADOR 1200 NÚCLEOS AMD

     PDF

E-mail
La actualización del superordenador SVG compuesta por 1200 núcleos de  proceso AMD a 2.2GHz y 2400GB de memoria principal, esta disponible para  todos los usuarios del centro.

Se accede al sistema a través de svgd.cesga.es siguiendo las instrucciones que se detallan a continuación:

  1. Conectarse a svgd.cesga.es
  2. Lanzar una sesión interactiva: compute --arch amd
  3. Cargar los módulos necesarios de compiladores, aplicaciones, etc.  
NOTAS:
- module av muestra los módulos disponibles,
- module help muestra una ayuda básica sobre como utilizar l módulo

DATOS: TIPOS, COSTANTES O VARIABLES


 

 

DATO

DEFINICIÓN:

Un dato es una representación simbólica (numérica, alfabética, etc.), atributo o característica de una entidad. El dato no tiene valor semántico (sentido) en sí mismo, pero convenientemente tratado (procesado) se puede utilizar en la realización de cálculos o toma de decisiones. Es de empleo muy común en el ámbito informático.

En programación, los dato son las pieza más simple de información sobre las cuales opera los algoritmos.

 

TIPO DE DATOS: El tipo de un dato es el conjunto de valores que puede tomar durante el programa. Si se le intenta dar un valor fuera del conjunto se producirá un error. 

La asignación de tipos a los datos tiene dos objetivos principales:

  • Por un lado, detectar errores en las operaciones
  • Por el otro, determinar cómo ejecutar estas operaciones

CLASIFICACIÓN DE LOS TIPOS DE DATOS:

TIPOS ESTÁTICOS: Casi todos los tipos de datos son estáticos, la excepción son los punteros y no se tratarán debido a su complejidad.

Que un tipo de datos sea estático quiere decir que el tamaño que ocupa en memoria no puede variar durante la ejecución del programa. Es decir, una vez declarada una variable de un tipo determinado, a ésta se le asigna un trozo de memoria fijo, y este trozo no se podrá aumentar ni disminuir.

 TIPOS DINÁMICOS: Dentro de esta categoría entra sólamente el tipo puntero. Este tipo te permite tener un mayor control sobre la gestión de memoria en tus programas. Con ellos puedes manejar el tamaño de tus variables en tiempo de ejecución, o sea, cuando el programa se está ejecutando.

Los punteros quizás sean el concepto más complejo a la hora de aprender un lenguaje de programación, sobre todo si es el primero que aprendes. Debido a esto, no lo trataremos. Además, lenguajes que están muy de moda (por ejemplo Java) no permiten al programador trabajar con punteros.

 TIPOS SIMPLES: Como su nombre indica son los tipos básicos en Pascal. Son los más sencillos y los más fáciles de aprender. Por todo esto, serán en los que nos centremos.

Los tipos simples más básicos son: entero, lógico, carácter y real. Y la mayoría de los lenguajes de programación los soportan, no como ocurre con los estructurados que pueden variar de un lenguaje a otro.

 TIPOS ESTRUCTURADOS: Mientras que una variable de un tipo simple sólo referencia a un elemento, los estructurados se refieren a colecciones de elementos.

Las colecciones de elementos que aparecen al hablar de tipos estructurados son muy variadas: tenemos colecciones ordenadas que se representan mediante el tipo array, colecciones sin orden mediante el tipo conjunto, e incluso colecciones que contienen otros tipos, son los llamados registros.

 TIPOS ORDINALES: Dentro de los tipos simples, los ordinales son los más abundantes. De un tipo se dice que es ordinal porque el conjunto de valores que representa se puede contar, es decir, podemos establecer una relación uno a uno entre sus elementos y el conjunto de los números naturales.

 TIPOS NO-ORDINALES: Simplificando, podríamos reducir los tipos simples no-ordinales al tipo real. Este tipo nos sirve para declarar variables que pueden tomar valores dentro del conjunto de los números reales.

A diferencia de los tipos ordinales, los no-ordinales no se pueden contar. No se puede establecer una relación uno a uno entre ellos y los número naturales. Dicho de otra forma, para que un conjunto se considere ordinal se tiene que poder calcular la posición, el anterior elemento y el siguiente de un elemento cualquiera del conjunto. ¿Cuál es el sucesor de 5.12? Será 5.13, o 5.120, o 5.121,...

 DATO CONSTANTE: Una constante es un dato cuyo valor no puede cambiar durante la ejecución del programa. Recibe un valor en el momento de la compilación y este permanece inalterado durante todo el programa.

Como ya se ha comentado en el tema sobre las partes de un programa, las constantes se declaran en una sección que comienza con la palabra reservada const. Después de declarar una constante ya puedes usarla en el cuerpo principal del programa. Tienen varios usos: ser miembro en una expresión, en una comparación, asignar su valor a una variable, etc.

En el siguiente ejemplo se contemplan varios casos:

const

Min = 0;

Max = 100;

Sep = 10;

var

i : integer;

 

begin

i := Min;

while i < Max do begin

writeln(i);

i := i + Sep

end

end.

 

En este ejemplo se declaran tres constantes (Min, Max y Sep). En la primera línea del cuerpo del programa se asigna una constante a una variable. En la siguiente, se usa una constante en una comparación. Y en la cuarta, la constante Sep interviene en una expresión que se asigna a una variable. El resultado de ejecutar este programa sería una impresión en pantalla de los números: 0, 10, 20, 30, 40, 50, 60, 70, 80 y 90.     

 

DATO VARIABLE: Una variable es un nombre asociado a un elemento de datos que está situado en posiciones contiguas de la memoria principal, y su valor puede cambiar durante la ejecución de un programa.

Toda variable pertenece a un tipo de dato concreto. En la declaración de una variable se debe indicar el tipo al que pertenece. Así tendremos variables enteras, reales, booleanas, etc. Por otro lado, distinguimos tres partes fundamentales en la vida de una variable:

DECLARACIÓN DE VARIABLES: Esta es la primera fase en la vida de cualquier variable. La declaración se realiza en la sección que comienza con la palabra var. Si quieres más información, puedes ir al apartado que trata sobre la declaración de variables en el tema Estructura de un programa.

Nota: Toda variable que vaya a ser utilizada en Pascal tiene que ser previamente declarada.

INICIACIÓN DE VARIABLES: Esto no es más que darle un valor inicial a una variable. Así como lo primero que se hace con una variable es declararla, lo siguiente tiene que ser iniciarla. Esto se hace para evitar posibles errores en tiempo de ejecución, pues una variable tiene un valor indeterminado después de declararla. Principalmente, existen dos maneras de otorgar valores iniciales a variables:

  • Mediante una sentencia de asignación
  • Mediante uno de los procedimientos de entrada de datos (read o readln)

Veamos un ejemplo que reúne los dos casos:

begin
      ...
     i:=1;
     readln(n);
     while i < n do begin
        (* cuerpo del bucle *)
        i := i + 1
     end;
      ...
   end.

DIFERENCIAS DE VARIABLES: Después de haber visto cada una por separado, pasemos a explicar las diferencias que existen entre constantes y variables. A primera vista pudieran parecer conceptos similares, pero realmente son cosas muy distintas. Y esta distinción viene dada por la posibilidad que tienen las variables para cambiar de valor.

PRINCIPALES DIFERENCIAS: Las constantes ya reciben un valor inicial en su declaración

  • Las variables primero se declaran, luego se inician, y luego se usan
  • Las constantes, una vez declaradas mantienen su valor durante toda la ejecución del programa
  • En cambio, las variables pueden cambiar su valor tantas veces como deseen
  • Además de cambiar su valor, las variables también pueden cambiar de tamaño en tiempo de ejecución (punteros)

Nota: En el último punto se alude a las variables que cambian su tamaño. Como curiosidad saber que se denominan variables dinámicas o punteros, pero debido a su complejidad no son objeto de este tutorial. Todas las demás variables son estáticas y se tratarán las más significativas.

 

 

 

 

 

 

 

DATOS: TIPOS, COSTANTES O VARIABLES


 

 

DATO

DEFINICIÓN:

Un dato es una representación simbólica (numérica, alfabética, etc.), atributo o característica de una entidad. El dato no tiene valor semántico (sentido) en sí mismo, pero convenientemente tratado (procesado) se puede utilizar en la realización de cálculos o toma de decisiones. Es de empleo muy común en el ámbito informático.

En programación, los dato son las pieza más simple de información sobre las cuales opera los algoritmos.

 

TIPO DE DATOS: El tipo de un dato es el conjunto de valores que puede tomar durante el programa. Si se le intenta dar un valor fuera del conjunto se producirá un error. 

La asignación de tipos a los datos tiene dos objetivos principales:

  • Por un lado, detectar errores en las operaciones
  • Por el otro, determinar cómo ejecutar estas operaciones

CLASIFICACIÓN DE LOS TIPOS DE DATOS:

TIPOS ESTÁTICOS: Casi todos los tipos de datos son estáticos, la excepción son los punteros y no se tratarán debido a su complejidad.

Que un tipo de datos sea estático quiere decir que el tamaño que ocupa en memoria no puede variar durante la ejecución del programa. Es decir, una vez declarada una variable de un tipo determinado, a ésta se le asigna un trozo de memoria fijo, y este trozo no se podrá aumentar ni disminuir.

 TIPOS DINÁMICOS: Dentro de esta categoría entra sólamente el tipo puntero. Este tipo te permite tener un mayor control sobre la gestión de memoria en tus programas. Con ellos puedes manejar el tamaño de tus variables en tiempo de ejecución, o sea, cuando el programa se está ejecutando.

Los punteros quizás sean el concepto más complejo a la hora de aprender un lenguaje de programación, sobre todo si es el primero que aprendes. Debido a esto, no lo trataremos. Además, lenguajes que están muy de moda (por ejemplo Java) no permiten al programador trabajar con punteros.

 TIPOS SIMPLES: Como su nombre indica son los tipos básicos en Pascal. Son los más sencillos y los más fáciles de aprender. Por todo esto, serán en los que nos centremos.

Los tipos simples más básicos son: entero, lógico, carácter y real. Y la mayoría de los lenguajes de programación los soportan, no como ocurre con los estructurados que pueden variar de un lenguaje a otro.

 TIPOS ESTRUCTURADOS: Mientras que una variable de un tipo simple sólo referencia a un elemento, los estructurados se refieren a colecciones de elementos.

Las colecciones de elementos que aparecen al hablar de tipos estructurados son muy variadas: tenemos colecciones ordenadas que se representan mediante el tipo array, colecciones sin orden mediante el tipo conjunto, e incluso colecciones que contienen otros tipos, son los llamados registros.

 TIPOS ORDINALES: Dentro de los tipos simples, los ordinales son los más abundantes. De un tipo se dice que es ordinal porque el conjunto de valores que representa se puede contar, es decir, podemos establecer una relación uno a uno entre sus elementos y el conjunto de los números naturales.

 TIPOS NO-ORDINALES: Simplificando, podríamos reducir los tipos simples no-ordinales al tipo real. Este tipo nos sirve para declarar variables que pueden tomar valores dentro del conjunto de los números reales.

A diferencia de los tipos ordinales, los no-ordinales no se pueden contar. No se puede establecer una relación uno a uno entre ellos y los número naturales. Dicho de otra forma, para que un conjunto se considere ordinal se tiene que poder calcular la posición, el anterior elemento y el siguiente de un elemento cualquiera del conjunto. ¿Cuál es el sucesor de 5.12? Será 5.13, o 5.120, o 5.121,...

 DATO CONSTANTE: Una constante es un dato cuyo valor no puede cambiar durante la ejecución del programa. Recibe un valor en el momento de la compilación y este permanece inalterado durante todo el programa.

Como ya se ha comentado en el tema sobre las partes de un programa, las constantes se declaran en una sección que comienza con la palabra reservada const. Después de declarar una constante ya puedes usarla en el cuerpo principal del programa. Tienen varios usos: ser miembro en una expresión, en una comparación, asignar su valor a una variable, etc.

En el siguiente ejemplo se contemplan varios casos:

const

Min = 0;

Max = 100;

Sep = 10;

var

i : integer;

 

begin

i := Min;

while i < Max do begin

writeln(i);

i := i + Sep

end

end.

 

En este ejemplo se declaran tres constantes (Min, Max y Sep). En la primera línea del cuerpo del programa se asigna una constante a una variable. En la siguiente, se usa una constante en una comparación. Y en la cuarta, la constante Sep interviene en una expresión que se asigna a una variable. El resultado de ejecutar este programa sería una impresión en pantalla de los números: 0, 10, 20, 30, 40, 50, 60, 70, 80 y 90.     

 

DATO VARIABLE: Una variable es un nombre asociado a un elemento de datos que está situado en posiciones contiguas de la memoria principal, y su valor puede cambiar durante la ejecución de un programa.

Toda variable pertenece a un tipo de dato concreto. En la declaración de una variable se debe indicar el tipo al que pertenece. Así tendremos variables enteras, reales, booleanas, etc. Por otro lado, distinguimos tres partes fundamentales en la vida de una variable:

DECLARACIÓN DE VARIABLES: Esta es la primera fase en la vida de cualquier variable. La declaración se realiza en la sección que comienza con la palabra var. Si quieres más información, puedes ir al apartado que trata sobre la declaración de variables en el tema Estructura de un programa.

Nota: Toda variable que vaya a ser utilizada en Pascal tiene que ser previamente declarada.

INICIACIÓN DE VARIABLES: Esto no es más que darle un valor inicial a una variable. Así como lo primero que se hace con una variable es declararla, lo siguiente tiene que ser iniciarla. Esto se hace para evitar posibles errores en tiempo de ejecución, pues una variable tiene un valor indeterminado después de declararla. Principalmente, existen dos maneras de otorgar valores iniciales a variables:

  • Mediante una sentencia de asignación
  • Mediante uno de los procedimientos de entrada de datos (read o readln)

Veamos un ejemplo que reúne los dos casos:

begin
      ...
     i:=1;
     readln(n);
     while i < n do begin
        (* cuerpo del bucle *)
        i := i + 1
     end;
      ...
   end.

DIFERENCIAS DE VARIABLES: Después de haber visto cada una por separado, pasemos a explicar las diferencias que existen entre constantes y variables. A primera vista pudieran parecer conceptos similares, pero realmente son cosas muy distintas. Y esta distinción viene dada por la posibilidad que tienen las variables para cambiar de valor.

PRINCIPALES DIFERENCIAS: Las constantes ya reciben un valor inicial en su declaración

  • Las variables primero se declaran, luego se inician, y luego se usan
  • Las constantes, una vez declaradas mantienen su valor durante toda la ejecución del programa
  • En cambio, las variables pueden cambiar su valor tantas veces como deseen
  • Además de cambiar su valor, las variables también pueden cambiar de tamaño en tiempo de ejecución (punteros)

Nota: En el último punto se alude a las variables que cambian su tamaño. Como curiosidad saber que se denominan variables dinámicas o punteros, pero debido a su complejidad no son objeto de este tutorial. Todas las demás variables son estáticas y se tratarán las más significativas.

 

 

 

 

 

 

 

Algoritmos

Algoritmos

Definicion

Un Algoritmo se puede definir como una secuencia de instrucciones que representan un modelo de solución para determinado tipo de problemas. O bien como un conjunto de instrucciones que realizadas en orden conducen a obtener la solución de un problema.

Para realizar un programa es conveniente el diseño o definición previa del algoritmo. El diseño de algoritmos requiere creatividad y conocimientos profundos de la técnica de programación.

Los algoritmos son independientes de los lenguajes de programación. En cada problema el algoritmo puede escribirse y luego ejecutarse en el lenguaje diferente de programación. El algoritmo es la infraestructura de cualquier solución, escrita luego en cualquier lenguaje de programación.

 

Caracteristicas de los algoritmos

-Preciso: Definirse de manera rigurosa, sin dar lugar a ambigüedades.

-Definido: Si se sigue un algoritmo dos veces, se obtendrá el mismo resultado.

-Finito: Debe terminar en algún momento.

-Puede tener cero o mas elementos de entrada.

-Debe producir un resultado: Los datos de salida serán los resultados de efectuar las instrucciones

Se concluye que un algoritmo debe ser suficiente para resolver el problema.

Entre 2 algoritmos que lleven a un mismo objetivo, siempre será preferible el mas corto ( se deberá analizar la optimización de tiempos y * o recursos)

 

 

Ejemplos

1.-Los diagramas de flujo sirven para representar algoritmos de manera gráfica.

2.-Diagrama de flujo que expresa un algoritmo para calcular la raíz cuadrada de un número x

 

 

3.- Diseña el algoritmo que suma todos los números naturales anteriores a un número N

dado.

 

 

 Inicio

     Contador = 2
     Suma = 1

       Mientras Contador <= 100 hacer

        Suma = Suma + Contador

        Contador = Contador + 1

       Fin_mientras

    Visualizar Suma

Fin



Algoritmos

Algoritmos

Definicion

Un Algoritmo se puede definir como una secuencia de instrucciones que representan un modelo de solución para determinado tipo de problemas. O bien como un conjunto de instrucciones que realizadas en orden conducen a obtener la solución de un problema.

Para realizar un programa es conveniente el diseño o definición previa del algoritmo. El diseño de algoritmos requiere creatividad y conocimientos profundos de la técnica de programación.

Los algoritmos son independientes de los lenguajes de programación. En cada problema el algoritmo puede escribirse y luego ejecutarse en el lenguaje diferente de programación. El algoritmo es la infraestructura de cualquier solución, escrita luego en cualquier lenguaje de programación.

 

Caracteristicas de los algoritmos

-Preciso: Definirse de manera rigurosa, sin dar lugar a ambigüedades.

-Definido: Si se sigue un algoritmo dos veces, se obtendrá el mismo resultado.

-Finito: Debe terminar en algún momento.

-Puede tener cero o mas elementos de entrada.

-Debe producir un resultado: Los datos de salida serán los resultados de efectuar las instrucciones

Se concluye que un algoritmo debe ser suficiente para resolver el problema.

Entre 2 algoritmos que lleven a un mismo objetivo, siempre será preferible el mas corto ( se deberá analizar la optimización de tiempos y * o recursos)

 

 

Ejemplos

1.-Los diagramas de flujo sirven para representar algoritmos de manera gráfica.

2.-Diagrama de flujo que expresa un algoritmo para calcular la raíz cuadrada de un número x

 

 

3.- Diseña el algoritmo que suma todos los números naturales anteriores a un número N

dado.

 

 

 Inicio

     Contador = 2
     Suma = 1

       Mientras Contador <= 100 hacer

        Suma = Suma + Contador

        Contador = Contador + 1

       Fin_mientras

    Visualizar Suma

Fin



ESTRUCTURA REPETITIVA PARA (FOR)

Cualquier problema que requiera una estructura repetitiva se puede resolver empleando la estructura while (mientras). Pero hay otra estructura repetitiva cuyo planteo es más sencillo en ciertas situaciones.

En general, la estructura FOR se usa en aquellas situaciones en las cuales CONOCEMOS la cantidad de veces que queremos que se ejecute el bloque de instrucciones. Ejemplo: cargar 10 números, ingresar 5 notas de alumnos, etc. Conocemos de antemano la cantidad de veces que queremos que el bloque se repita. Veremos, sin embargo, que en el lenguaje Java la estructura FOR puede usarse en cualquier situación repetitiva, porque en última instancia no es otra cosa que una estructura while generalizada.

 

DIAGRAMA DE FLUJO

PSEUDOCODIGO

 

 

 

En su forma más típica y básica, esta estructura requiere una variable entera que cumple la función de un CONTADOR de vueltas. En la sección indicada como "inicialización contador", se suele colocar el nombre de la variable que hará de contador, asignándole a dicha variable un valor inicial. En la sección de "condición" se coloca la condición que deberá ser verdadera para que el ciclo continúe (en caso de un falso, el ciclo se detendrá). Y finalmente, en la sección de "incremento contador" se coloca una instrucción que permite modificar el valor de la variable que hace de contador (para permitir que alguna vez la condición sea falsa)

Cuando el ciclo comienza, antes de dar la primera vuelta, la variable del FOR toma el valor indicado en la sección de de "inicialización contador". Inmediatamente se verifica, en forma automática, si la condición es verdadera. En caso de serlo se ejecuta el bloque de operaciones del ciclo, y al finalizar el mismo se ejecuta la instrucción que se haya colocado en la tercera sección.
Seguidamente, se vuelve a controlar el valor de la condición, y así prosigue hasta que dicha condición entregue un falso.

 

 

 

OBSERVEMOS UN EJEMPLO SENCILLO

 

Realizar un programa que imprima en pantalla los números del 1 al 100

 

DRIAGRAMA DE FLUJO

Podemos observar y comparar con el problema realizado con el while. Con la estructura while el CONTADOR x sirve para contar las vueltas. Con el FOR el CONTADOR f cumple dicha función.
Inicialmente f vale 1 y como no es superior a 100 se ejecuta el bloque, imprimimos el contenido de f, al finalizar el bloque repetitivo se incrementa la variable f en 1, como 2 no es superior a 100 se repite el bloque de instrucciones.

Cuando la variable del FOR llega a 101 sale de la estructura repetitiva y continúa la ejecución del algoritmo que se indica después del círculo.

 

 

PSEUDOCODIGO

 

INICIO

           PARA    f←1      Hasta    f ≤ 100    a incrementos de   f← f +1    Hacer

                       Escribir (f)

           FIN _ PARA

FIN

ESTRUCTURA REPETITIVA PARA (FOR)

Cualquier problema que requiera una estructura repetitiva se puede resolver empleando la estructura while (mientras). Pero hay otra estructura repetitiva cuyo planteo es más sencillo en ciertas situaciones.

En general, la estructura FOR se usa en aquellas situaciones en las cuales CONOCEMOS la cantidad de veces que queremos que se ejecute el bloque de instrucciones. Ejemplo: cargar 10 números, ingresar 5 notas de alumnos, etc. Conocemos de antemano la cantidad de veces que queremos que el bloque se repita. Veremos, sin embargo, que en el lenguaje Java la estructura FOR puede usarse en cualquier situación repetitiva, porque en última instancia no es otra cosa que una estructura while generalizada.

 

DIAGRAMA DE FLUJO

PSEUDOCODIGO

 

 

 

En su forma más típica y básica, esta estructura requiere una variable entera que cumple la función de un CONTADOR de vueltas. En la sección indicada como "inicialización contador", se suele colocar el nombre de la variable que hará de contador, asignándole a dicha variable un valor inicial. En la sección de "condición" se coloca la condición que deberá ser verdadera para que el ciclo continúe (en caso de un falso, el ciclo se detendrá). Y finalmente, en la sección de "incremento contador" se coloca una instrucción que permite modificar el valor de la variable que hace de contador (para permitir que alguna vez la condición sea falsa)

Cuando el ciclo comienza, antes de dar la primera vuelta, la variable del FOR toma el valor indicado en la sección de de "inicialización contador". Inmediatamente se verifica, en forma automática, si la condición es verdadera. En caso de serlo se ejecuta el bloque de operaciones del ciclo, y al finalizar el mismo se ejecuta la instrucción que se haya colocado en la tercera sección.
Seguidamente, se vuelve a controlar el valor de la condición, y así prosigue hasta que dicha condición entregue un falso.

 

 

 

OBSERVEMOS UN EJEMPLO SENCILLO

 

Realizar un programa que imprima en pantalla los números del 1 al 100

 

DRIAGRAMA DE FLUJO

Podemos observar y comparar con el problema realizado con el while. Con la estructura while el CONTADOR x sirve para contar las vueltas. Con el FOR el CONTADOR f cumple dicha función.
Inicialmente f vale 1 y como no es superior a 100 se ejecuta el bloque, imprimimos el contenido de f, al finalizar el bloque repetitivo se incrementa la variable f en 1, como 2 no es superior a 100 se repite el bloque de instrucciones.

Cuando la variable del FOR llega a 101 sale de la estructura repetitiva y continúa la ejecución del algoritmo que se indica después del círculo.

 

 

PSEUDOCODIGO

 

INICIO

           PARA    f←1      Hasta    f ≤ 100    a incrementos de   f← f +1    Hacer

                       Escribir (f)

           FIN _ PARA

FIN