Documentos de Académico
Documentos de Profesional
Documentos de Cultura
. Hermosilla Mechetti
ALGORTMICA II
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
ALGORTMICA II
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
ALGORTMICA II
2.
FUNCIONES
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
ALGORTMICA II
ex = 1+
x x2 x3 + + + ... 1! 2! 3!
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
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 ...
Universidad Nacional de Asuncin Facultad Politcnica Carrera: Licenciatura en Ciencias Informticas Turno Noche Seccin B Prof. Victor E. Hermosilla Mechetti
Universidad Nacional de Asuncin Facultad Politcnica Carrera: Licenciatura en Ciencias Informticas Turno Noche Seccin B Prof. Victor E. Hermosilla Mechetti
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
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
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
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
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