Está en la página 1de 11

Universidad Nacional de Asuncin Facultad Politcnica Carrera: Licenciatura en Ciencias Informticas Turno Noche Seccin B Prof. Victor E.

. Hermosilla Mechetti

Jueves, 14 de marzo de 2013

ALGORTMICA II

SUBPROGRAMAS O SUBRUTINAS EN SL. PROPSITO, SINTAXIS Y FUNCIONAMIENTO.


(subrutina | sub ) <nombre> ( <lista_parmetros> ) [ retorna <tipo> ] [var] inicio <cuerpo> fin

Recordar:

Que el nombre debe respetar la formacin de identificadores La subrutina puede colocarse en cualquier orden pero luego del programa principal Puede haber cualquier nmero de subrutinas Las variables all declaradas son locales a la subrutina Pueden ser funciones o procedimientos. Si es funcin debe terminar con la sentencia retorna Los pasos de parmetro pueden ser por valor o por referencia.

Ejemplo sencillo
Imprimir de cuantas formas diferentes se puede combinar N elementos en grupos de M elementos. La formula que permite obtener este resultado es:
n! C(n,m) = -------------------------m! * ( n - m )!

programa calc_combinacion var n, m : numerico comb : numerico inicio leer(n,m) comb = fact (n) / fact(m) * fact(n-m) imprimir(Comb = , comb) fin

sub fact ( n : numerico ) retorna numerico var f, k : numerico inicio f = 1 desde k=1 hasta n { f = f * k } retorna f fin

Universidad Nacional de Asuncin Facultad Politcnica Carrera: Licenciatura en Ciencias Informticas Turno Noche Seccin B Prof. Victor E. Hermosilla Mechetti

Jueves, 14 de marzo de 2013

ALGORTMICA II

SUBPROGRAMAS EN PASCAL. PROPSITO, SINTAXIS Y FUNCIONAMIENTO. TIPOS DE SUBPROGRAMAS: PROCEDIMIENTOS Y FUNCIONES.


1. PROCEDIMIENTOS

1.1. Visin general de procedimientos definidos por el usuario


PROGRAM Ejercicio; +----> PROCEDURE A | ... | ... +--+--+----> PROCEDURE B | | | ... | | | ... +--+--+----> PROCEDURE C | | | ... | | | ... | | | BEGIN | | +----- A; | +-------- B; +----------- C; END.

1.2. Declaracin de la cabecera de un procedimiento


PROCEDURE --> Ident --> [( --> [VAR] --> Ident --> : --> Tipo --> )] -->;--> ^ ^ | | | | | | | +--- , ---+ | | | +------------- ; ------------------+

1.3. Llamada a un procedimiento


--> Nombre del proced. --> [( --> Ident --> )] --> ; --> ^ | | | +----,----+

Ejemplo:
PROGRAM prueba_de_procedimiento; VAR a, b, c : Integer; PROCEDURE uno; VAR a, d, e, f : Integer; LABEL x; BEGIN a := 8; Writeln (a); END; PROCEDURE dos; VAR a, d, e, f : Integer; BEGIN a := 8; Writeln (a); END; BEGIN a:= 3; uno; Writeln ('Hola Mundo...'); END.

Universidad Nacional de Asuncin Facultad Politcnica Carrera: Licenciatura en Ciencias Informticas Turno Noche Seccin B Prof. Victor E. Hermosilla Mechetti

Jueves, 14 de marzo de 2013

ALGORTMICA II

2.

FUNCIONES

2.1. Declaracin de la cabecera de una funcin


FUNCTION --> Ident --> [( --> [VAR] --> Ident --> : Tipo --> )] --> : Tipo ; --> ^ ^ | | | | | | | +--- , ---+ | +------------- ; -------------+

2.2. Retorno de valores: Se le asigna el valor al nombre de la funcin Ejemplo:


PROGRAM prueba_de_funcion; VAR a, b, c : Integer; FUNCTION Suma (n1, n2 : Integer) : Integer; BEGIN Suma := n1 + n2; END; BEGIN a := 10; b := 90; Writeln ('La suma de a + b = ', Suma(a, b):1); END.

3. DEFINICIN DE PARMETROS - Reales y formales. - Por valor y por referencia.

4. DECLARACIONES LOCALES Y GLOBALES: VARIABLES, CONSTANTES, PROCEDIMIENTOS

5. EFECTOS COLATERALES

El efecto colateral es cualquier efecto de un mdulo sobre otro mdulo que no es parte de la interfaz definida explcitamente entre ellos. Cuando un procedimiento accede a informacin almacenada en el exterior de su propio bloque de una forma distinta al paso a travs de sus parmetros, existe un peligro potencial para que se produzcan acciones no deseadas. Por ejemplo, un error en el procedimiento puede producir que el procedimiento cambie el valor de una variable global de una forma no esperada.
+-------------------------+ +------>| Programa principal | | +-----| y otros procedimientos | | | +-------------------------+ | | ^ | | | | | | v Efectos | | +-------------------------+ Colaterales | | | Lista de parmetros | | | +-------------------------+ | | ^ | | | | | | v | | +-------------------------+ | +---->| | | | Un procedimiento normal | +-------| | +-------------------------+

Universidad Nacional de Asuncin Facultad Politcnica Carrera: Licenciatura en Ciencias Informticas Turno Noche Seccin B Prof. Victor E. Hermosilla Mechetti

Jueves, 14 de marzo de 2013

ALGORTMICA II

EJERCICIOS SOBRE PROCEDIMIENTOS Y FUNCIONES


EJERCICIO #12 Resuelva el Ejercicio #12 utilizando subrutinas: Escriba un programa que calcule el valor de ex, utilizando la siguiente frmula:

ex = 1+

x x2 x3 + + + ... 1! 2! 3!

Su programa deber leer la constante x y el nmero de trminos.

EJERCICIO #13 Escribir una funcin en Pascal que reciba como parmetro un numero que indique una hora en formato HHMMSS y retorne si la hora es valida o no. Adems, debe retornar las horas, minutos y segundos separados en tres variables distintas.

EJERCICIO #14 Dado un numero que indique una hora en formato HHMMSS y un indicador, imprimir la hora en formato de horas, minutos o segundos segn el indicador. Los valores del indicador son:
1 --> Imprimir la hora en horas 2 --> Imprimir la hora en minutos 3 --> Imprimir la hora en segundos Ejemplos: - Dada la hora 10:30:50 y el indicador 1, imprimir "10,51 horas". - Dada la hora 10:30:50 y el indicador 2, imprimir "630,83 minutos". - Dada la hora 10:30:50 y el indicador 3, imprimir "37.850 segundos".

EJERCICIO #15 Escriba una funcin que tome un valor entero y retorne el nmero con sus dgitos invertidos. Por ejemplo, dado el nmero 7631, la funcin debera retornar 1367.

EJERCICIO #16 Escribir un programa para imprimir un calendario para un ao, dado el ao y el da de la semana en que cae el 1 de enero. Los das de la semana estn enumerados del 0 al 6, de domingo a sbado, respectivamente. No olvide considerar el caso de los aos bisiestos. Ejemplo:
Anho : 1985 ENERO D L M M J V S ----------------------1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 FEBRERO D L M M J V S ----------------------1 2 3 4 5 6 7 8 9 ...

Universidad Nacional de Asuncin Facultad Politcnica Carrera: Licenciatura en Ciencias Informticas Turno Noche Seccin B Prof. Victor E. Hermosilla Mechetti

Jueves, 14 de marzo de 2013

ALGORTMICA II
EJERCICIO #17 Escribir una funcin llamada TermFib que reciba un nmero entero positivo N y devuelva la posicin de dicho nmero en la serie de Fibonacci, o cero si N no pertenece a la sucesin. La serie de Fibonacci tiene la propiedad de que cada nmero subsecuente es la suma de los dos nmeros previos, siendo los primeros trminos de la serie los siguientes. 1 1 2 3 5 8 13 21 34 ...

As por ejemplo, dadas las siguientes llamadas a la funcin:


TermFib(8) TermFib(10) TermFib(1) retornar 6 , porque 8 es el sexto trmino de la serie retornar 0, porque el 10 no es un trmino de la serie retornar 1, porque 1 es el primer trmino encontrado

Universidad Nacional de Asuncin Facultad Politcnica Carrera: Licenciatura en Ciencias Informticas Turno Noche Seccin B Prof. Victor E. Hermosilla Mechetti

Jueves, 14 de marzo de 2013

ALGORTMICA II DESARROLLO DE LOS EJERCICIOS USANDO SUBPROGRAMAS


PROGRAM Calcular_e_x; (* Escriba un programa en Pascal que calcule el valor de e , utilizando la siguiente frmula: 2 3 x x x e = 1 + --- + --- + --- + ... 1! 2! 3! Su programa deber *) VAR nTer, x, k : Integer; e : Real; FUNCTION Potencia ( b, e : Integer) : Integer; VAR k, p : Integer; BEGIN p := 1; FOR k := 1 TO e DO p := p * b; Potencia := p; END; FUNCTION Factorial ( n : Integer) : Integer; VAR k, f : Integer; BEGIN f := 1; FOR k := 1 TO n DO f := f * k; Factorial := f; END; BEGIN Write ('Ingrese el numero de terminos para el calculo : '); Readln (nTer); Write ('Ingrese la constante X para el calculo : '); Readln (x); e := 1; FOR k := 1 TO nTer DO BEGIN e := e + ( Potencia(x, k) / Factorial(k) ); Writeln (x:1, ' elevado a ', k:1, ' = ', Potencia(x, k):1); Writeln ('el factorial de ', k:1, ' = ', Factorial(k):1); END; Writeln ('El valor de la constante "e" es ', e:1:3); END. leer la constante x y el nmero de trminos.

Universidad Nacional de Asuncin Facultad Politcnica Carrera: Licenciatura en Ciencias Informticas Turno Noche Seccin B Prof. Victor E. Hermosilla Mechetti

Jueves, 14 de marzo de 2013

ALGORTMICA II
PROGRAM calendario; CONST MESES = 12; VAR Anho, Enero1, IniMes, k : Integer; PROCEDURE Imprimir_Mes (anho, mes : Integer; VAR inicio : Integer); (* Procedimiento para imprimir el calendario correspondiente a un determinado mes. Parametros ---------anho, mes : El anho y el mes a imprimir. inicio : Dia de la semana que indica el inicio del mes, donde : 0 1 2 3 4 5 6 -> -> -> -> -> -> -> Domingo Lunes Martes Miercoles Jueves Viernes Sabado

Observacion: Esta variable 'inicio' es recibida por referencia (VAR), ya que tiene que devolver el dia de inicio del siguiente mes. *) CONST RELLENO = ' '; DOMINGO = 0; ULT_DIA_SEMANA = 6; VAR topeMes, k, dia : Integer; BEGIN (* Observacion: Estos 'case' se pueden obviar utilizando arrays, de caracteres para el nombre del mes, y de enteros para el tope de cada mes. *) Writeln; Writeln; CASE mes OF 1 : BEGIN Writeln (' ENERO '); topeMes := 31; END; 2 : BEGIN Writeln (' FEBRERO '); (* Se considera si el anho es bisiesto... *) IF ( (anho MOD 4) = 0 ) THEN topeMes := 29 ELSE topeMes := 28; END; 3 : BEGIN Writeln (' MARZO '); topeMes := 31; END; 4 : BEGIN Writeln (' ABRIL '); topeMes := 30; END; 5 : BEGIN Writeln (' MAYO '); topeMes := 31; END; 6 : BEGIN Writeln (' JUNIO '); topeMes := 30; END; 7 : BEGIN Writeln (' JULIO '); topeMes := 31; END;

Universidad Nacional de Asuncin Facultad Politcnica Carrera: Licenciatura en Ciencias Informticas Turno Noche Seccin B Prof. Victor E. Hermosilla Mechetti

Jueves, 14 de marzo de 2013

ALGORTMICA II
: BEGIN Writeln topeMes END; 9 : BEGIN Writeln topeMes END; 10 : BEGIN Writeln topeMes END; 11 : BEGIN Writeln topeMes END; 12 : BEGIN Writeln topeMes END; END; 8 (' := 31; AGOSTO ');

(' := 30;

SETIEMBRE

');

(' := 31;

OCTUBRE

');

(' := 30;

NOVIEMBRE

');

(' := 31;

DICIEMBRE

');

Writeln (' D L M M J V S'); Writeln ('-----------------------'); (* Se imprimen espacios al principio para que el dia 1 se imprima en el lugar correcto... *) FOR k := 0 TO (inicio-1) DO Write (RELLENO); dia := inicio; FOR k := 1 TO topeMes DO BEGIN Write (' ', k:2); dia := dia + 1; (* Si ya 'pasamos' el ultimo dia de la semana (Sabado), nos preparamos para que la siguiente fila sea el Domingo (dia = 0)... *) IF ( dia > ULT_DIA_SEMANA ) THEN BEGIN dia := DOMINGO; Writeln; END; END; (* Se devuelve el inicio del siguiente mes... *) inicio := dia; END; (* Inicio del programa principal... *) BEGIN Writeln; Writeln; Write ('Ingrese el anho del calendario : '); Readln (Anho); Write ('Ingrese el dia del 1ro. de Enero de ese anho : '); Readln (Enero1); Writeln ('Calendario para el anho ', anho:1); IniMes := Enero1; FOR k := 1 TO MESES DO Imprimir_Mes (Anho, k, IniMes); END.

Universidad Nacional de Asuncin Facultad Politcnica Carrera: Licenciatura en Ciencias Informticas Turno Noche Seccin B Prof. Victor E. Hermosilla Mechetti

Jueves, 14 de marzo de 2013

ALGORTMICA II
PROGRAM Term_Fibonacci; VAR n, pos : Integer; FUNCTION TermFib (n : Integer) : Integer; VAR cont, pos, x1, x2, f : Integer; BEGIN cont := 1; x1 := 0; x2 := 1; f := 0; pos := 0; WHILE ( f <= n ) DO BEGIN f := x1 + x2; if ( cont > 1 ) then x1 := x2; x2 := f; cont := cont + 1; IF ( f = n ) THEN pos := cont - 1; END; TermFib := pos; END; BEGIN Write ( 'Ingrese el numero a buscar : '); Readln (n); pos := TermFib(n); Write ( 'El nro. ', n:3, ' esta en la posicion ', pos:5 ); END.

Universidad Nacional de Asuncin Facultad Politcnica Carrera: Licenciatura en Ciencias Informticas Turno Noche Seccin B Prof. Victor E. Hermosilla Mechetti

Jueves, 14 de marzo de 2013

ALGORTMICA II
#include <stdio.h> #include <conio.h> /* Escriba un programa en Pascal que calcule el valor de e , utilizando la siguiente frmula: 2 3 x x x e = 1 + --- + --- + --- + ... 1! 2! 3! Su programa deber */ double Potencia ( int b, int e ) { int k; double p; p = 1; for ( k = 1; k <= e; k++ ) p = p * b; return ( p ); } double Factorial ( int n ) { int k; double f; f = 1; for ( k = 1; k <= n; k++ ) f = f * k; return ( f ); } int main () { int nTer, x, k; double e; clrscr(); printf ("\n\nIngrese el numero de terminos para el calculo : "); scanf ("%d", &nTer); printf ("Ingrese la constante X para el calculo : "); scanf ("%d", &x); e = 1; for ( k = 1; k <= nTer; k++ ) { e = e + ( Potencia(x, k) / Factorial(k) ); printf ( "\n%d elevado a %d = %d \n", x, k, Potencia(x, k) ); printf (" el factorial de %d = %d \n", k, Factorial(k) ); } printf ("El valor de la constante 'e' es %.2f", e); return 0; } leer la constante x y el nmero de trminos.

10

Universidad Nacional de Asuncin Facultad Politcnica Carrera: Licenciatura en Ciencias Informticas Turno Noche Seccin B Prof. Victor E. Hermosilla Mechetti

Jueves, 14 de marzo de 2013

ALGORTMICA II

PROGRAM Invertir_Digitos;
VAR nro, nroInv : Integer; FUNCTION Invert_Dig (n : Integer) : Integer; VAR k, auxN, dig, cDig, nInv : Integer; FUNCTION Potencia (a, b : Integer) : Integer; VAR p, k : Integer; BEGIN p := 1; FOR k := 1 TO b DO p := p * a; Potencia := p; END; BEGIN auxN := n; cDig := 0; WHILE ( auxN > 0 ) DO BEGIN auxN := auxN DIV 10; cDig := cDig + 1; END; auxN := n; nInv := 0; FOR k := cDig DOWNTO 1 DO BEGIN dig := auxN MOD 10; nInv := nInv + dig * Potencia (10, k - 1); auxN := auxN DIV 10; END; Invert_Dig := nInv; END; BEGIN Write ('Ingrese un nro. entero : '); Readln (nro); nroInv := Invert_Dig (nro); Writeln ('El nro. con sus digitos invertidos es : ', nroInv:1); END.

11

También podría gustarte