1. Módulo 7ALGORITMOS Y ESTRUCTURA DE DATOS PROFESOR:SIRACUSA EMILIANO MARTÍN Página Web: www.esiracusa.jimdo.com
2. Anidamiento de procedimientos: Es cuando un procedimiento función está declarado dentro de otro procedimiento o función. Program p; var y: integer; Procedure Q Procedure R var y: integer,; begin y:= 8; end; begin.{Q} Y:=y+1; R; end; {Q) Begin Y:=3; Q; end. Program p; var y: integer; Procedure Q Procedure R var y: integer,; begin y:= 8; end; begin.{Q} R; Y:=y+1; end; {Q) Begin Y:=3; Q; end. R está anidado en Q
3. Traza de P Program p; var y: integer; Procedure Q Procedure R var y: integer,; begin y:= 8; end; begin.{Q} Y:=y+1; R; end; {Q) Begin Y:=3; Q; end. P Q R P Q P Q P R Q P P y 3 y 3 4 y 4 y 8 y 4 y 4
4. Anidamiento de procedimientos: Es cuando un procedimiento está declarado dentro de otroprocedimiento. Program P; var y, t: integer: Procedure Q (x: integer; var z: integer); Procedure R (v: integer): var y: integer; Begin y:= 8;x:= 10;z:= 9; t:= 6; end; begin {Q} y:= y +1; x:= 5; z:=7; R(z) end; {Q} begin Y:=1; t:=2; Q(y,t); end. R está anidado en Q
5. Traza de P: P P P Program P; var y, t: integer: Procedure Q (x: integer; var z: integer); Procedure R (v: integer): var y: integer; Begin y:= 8;x:= 10; z:= 9; t:= 6; end; begin {Q} y:= y +1; x:= 5; z:=7; R(z) end; {Q} begin Y:=1; t:=2; Q(y,t); end. P P P Q R y 1 2 y 2 y 2 y 1 y 2 t 2 7 t 2 t 796 t 6 t 6 Q Q Q x 15 x 5 x 5 z z z R x 7 10 y 8
6. Identificadores locales a un subprograma, programa: Son los que están declarados en el subprograma o programa. Están activos sólo durante la ejecución del mismo. Una vez finalizada la ejecución de la unidad donde están declarados no se puede hacer referencia a dichos identificadores. Identificadores globales a un procedimiento, función: Son aquellos identificadores que están declarados en el programa principal y que no han sido re declarados en el procedimiento o función correspondiente.
7. Identificadores no locales a un subprograma: Un identificador i es no loca! a un subprograma Ssi cumple con todos los siguientes requisitos: i está declarado en algún subprograma que anida al subprograma S. i no esta declarado en el programa principal. i no se encuentra redeclarado en el subprograma S. ino está redeclarado en ninguno de los subprograma que anidan a S y que a su vez están anidados en el subprograma donde se encuentra la declaración de i.
8. Ámbito, entorno o ambiente de un procedimiento o función Es el conjunto de todos los identificadores que son visibles y pueden referenciarse dentro del procedimiento. Está formado por los identificadores totales, no locales y globales de un procedimiento o función.
9. Program P; var y: integer; Procedure Q; Procedure R; var y: integer; begin y:= 8; end; begin {Q} y := y + 1 ; R; end; { Q} begin y:-=3; Q; end. Ambiente de P: var: y Procedimiento: Q Locales a P Globales a Q Ambiente de Q: var: y Procedimiento: Q , R Local a Q Ambiente de R: var: y Procedimento: Q R LocalesR Global a R No local a R
10. Program P; var y, t: integer; Procedure Q (x: integer; var z : integer); Procedure R (x: integer); var y: integer; begin ; y:= 8; x:=10; z:= 9; t= 6 end; begin {Q} y:=y+1; X:= 5; z:= - 7; R(z); end; {Q} begin y:= 1; t:= 2; Q(y, t); end. Ambiente de P: Var: y, t Locales a P Procedimientos: Q Ambiente de Q: Par: x, z ; Proc: R Locales a Q Var: y, t ; Proc: Q Globales a Q Ambiente de R: Par x; Var: y Localesa R Par: z ; Proc: R; No locales a R Var :t ; Proc Q; Globalesa R
11. Alcance de un identificador: es el conjunto de bloques de programas en los que un identificador puede ser referenciado, es decir, es la sección de un programa en la que un identificador es visible. Reglas de alcance estático: -El alcance de un identificador es el bloque del procedimiento P en el que está declarado y todos los procedimientos anidados por el procedimiento P, sujeto a la siguiente regla. -Si un identificador i declarado en P se redeclaraen algún procedimiento interno Q anidado en P, entonces el procedimiento Q y todos los procedimientos anidados en Q se excluyen del alcance de i declarado en P.
12. Alcance de y es todo el programa P a partir de la declaración de y, excepto e! procedimiento R a partir de la declaración de y. Local a R. Alcance de Q, es todo el programa a partir de la declaración de Q. Alcance de R es todo el procedí miento Q a partir de te declaración de R. Alcance de y. loca) a R, es iodo e¡ procedimiento R desde la declaración de y en R. Program p; Var v:integer; Procedure Q; Procedure R; var y: integer; begin y:= 8; end; begin {Q} y:=y+1; R; end; { Q} begin y:=3; Q; end.
13. Program P; var y, t: integer; Procedure R(x: integer); var y: integer; begin {R} y:= 8; x:= 10; t:= 6; end; {R} Procedure Q (x: integer; var z: integer); begin {Q} y:=y+1; x:= 5; z:= 7 R(z); end;{Q} begin Y:= 1; t:= 2; Q( y,t); end. Ejercicio: Establecer el alcance para cada identificador de este programa.
14. Program P; var y, t: integer; Function Q(x: integer): integer; var z: integer; Procedure R (x: integer; var z: integer); begin {R} y:= 8; x:= 10; z:=9; t:= 6; end;{R} begin {Q} y:=y+1; x:= 5; z:= 7 R(z); Q:=z; end;{Q} Begin {P} Y:= 1; t:= 2; Writeln(Q( y, t)); end. Indicar alcance de los identificadores. Indicar los entornos de referencia del programa P de cada uno de los subprogramas. Realizar un diagrama de la estructura estática del programa. Realizar una traza de ejecución del programa.
15. Estudio de ejercicios con caracteres Repasemos los procedimientos read y write, el concepto de buffer y su comportamiento. ingreso de datos por teclado: Los datos ingresados se almacenan en una zona de memoria auxiliar llamadabufferdonde quedan retenidos. El buffer es potencialmente infinito y almacena cada carácter ingresado por teclado. El buffer tiene un puntero (↑), asociado al carácter del buffer al que hace referencia en un determinado momento. Si durante la ejecución de un programa, se ejecuta un read, se suspende la ejecución del programa. A continuación, todo lo ingresado por teclado se guardará en el buffer.
16. Al presionar la tecla ENTER la ejecución continúa y el procedimiento read lee del buffer los valores que necesita para asociarlos a las variables que tiene como argumentos. El read intentará resolver las asociaciones entre sus argumentos ( parámetros) de los que conoce el tipo, y los caracteres que hay en el buffer. Ejemplo: Program P; Var N,M: integer; C, D: char; Y:real; Read( N, Y, C, M, D) Al detenerse la ejecución del programa frente a un procedimiento read, ingresamos por teclado:
17. Read( N, Y, C, M, D) Los valores son asignados a las variables en el orden en el cual las variables fueron indicadas en el Read. Los diagramas siguientes muestras los valores asignados a las variables y el estado del buffer después que cada valor ha sido leído. Variable Buffer N(integer) 15 Y (real) 37.25 C(char) □ M(integer) 275 D (char)⸗
18. Read( N, Y, C, M, D) = read (N, C); read (M); read (D, Y); Readln Variable Buffer N(integer) 15 Y (real) 37.25 C(char) □ M(integer) 275 D (char)⸗
19. Repeat Read (C) Until C = ‘. ’ C A CN C A C □ C S C A C L C i
20. Repeat Read (C) Until C = ‘. ’ C A Ejercicio: Escribir un programa en Pascal que permita contar la cantidad de letras a o A que se encuentran en una frase. Program Cantidad_ deaes; var c: Char; cantidad: integer; begin writeln ('ingrese una frase terminada en punto'); cantidad := 0; repeat read (c); If (c = 'a') or (c= 'A') then cantidad := cantidad + 1; untilC=‘.‘ end.
21. Program palabra1; uses crt; var car: char; cantidad: integer; begin clrscr; writeln ('contar la cantidad de caracteres de una palabra') ; writeln ('ingrese una palabra seguida de un espacio'); read (car); cantidad: = 0; while car O' ' do begin cantidad: =cantidad + 1; read (car); end; write (cantidad) ; readkey end.
22. Program palabra1; uses crt; var car: char; cantidad: integer; begin clrscr; writeln ('contar la cantidad de caracteres de una palabra') ; writeln ('ingrese una palabra seguida de un espacio'); read (car); cantidad: = 0; Inicio while car O' ' do begin cantidad: =cantidad + 1; read (car); end; Proceso write (cantidad) ; Readkey Impresión end.
23. Program palabra1; Var car: char ; cantidad: integer; Procedure Inicio (var car: Char); begin writeln ("contar la cantidad de caracteres de una palabra'); writeln ("ingrese una palabra seguida de un espacio'); read (car); end;{inicio} Procedure Cuentacaracter (car: Char, var cantidad: integer); begin {Cuentacaracteres} cantidad := 0; while car <>' ' do begin cantidad:=cantidad + 1 ; read (car); end; {Cuentacaracteres} Procedure Impresión (cantidad; integer); begin writeln ('la cantidad de caracteres de la palabra Ingresada es', cantidad) end; {impresión} begin {palabra1} clrscr; Inicio (car); Cuentacaracter (car, cantidad); Impresión (cantidad); readkey end.
24. Program palabra2; uses crt; var carchar ,cantidad: integer; Procedure inicio (var car: Char); begin writeln ('contar la cantidad de letras de una palabra'); writeln ('ingrese una palabra seguida de un espacio'); Read (car) ; end; {inicio} Procedure CuentaLetras (car: Char, var cantidad: Integer); begin cantidad:=0; while car <>'' do If car in ['a'… 'z'] CuentaLetras (car, cantidad}; cantidad:=cantidad + 1; read (car) end; {CuentaLetras} Procedure impresión (cantidad: integer); begin; writeln ( 'la cantidad de letras de la palabra ingresada es', cantidad); end; {impresión} begin {palabra2} Clrscr; inicio (car) CuentaLetras (car, cantidad); impresión (cantidad); readkey end.
25. Program palabra3; uses crt; var carchar ,cantidad: integer; Procedure inicio (var car: Char); begin writeln ('contar la cantidad de letras de una palabra'); writeln ('ingrese una palabra seguida de un espacio'); Read (car) ; end; {inicio} Procedure CuentaDigitos(car: Char, var cantidad: Integer); begin cantidad:=0; while car <>'' do If car in [‘0'… ‘9'] cantidad:=cantidad + 1; read (car) end; {CuentaDigitos} Procedure impresión (cantidad: integer); begin; writeln ( 'la cantidad de Digitosde la palabra ingresada es', cantidad); end; {impresión} begin {palabra3} Clrscr; inicio (car) CuentaDigitos(car, cantidad); impresión (cantidad); readkey end.
26. Program palabra4; uses crt; var carchar ,CantidadDigitos, CantidadPalabras: integer; Procedure inicio (var car: Char); begin writeln ('contar la cantidad dígitos y de letras de una palabra'); writeln ('ingrese una palabra seguida de un espacio'); Read (car) ; end; {inicio} Procedure CuentaDigitosyLetras(car: Char, var CantidadDigitos, CantidadPalabras: integer); begin cantidad:=0; while car <>'' do If car in [‘0'… ‘9'] CantidadDigitos := CantidadDigitos+ 1; else If car in ['a'… ‘z‘,'A'…'Z'] then CantidadPalabras:=CantidadPalabras+1; read (car) end; {CuentaDigitos} Procedure impresión (CantidadDigitos, CantidadPalabras: integer); begin; writeln ( 'la cantidad de Digitosde la palabra ingresada es', CantidadDigito, ( 'y la cantidad de Letras de la palabra ingresada es', CantidadPalabras); end; {impresión} begin {palabra4} Clrscr; inicio (car); CuentaDigitosyLetras(CantidadDigitos, CantidadPalabras); impresión (cantidad); readkey end.
27. Program palabra5; uses crt; var carchar ,CantidadVocales: integer; Procedure inicio (var car: Char); begin writeln ('contar la cantidad de vocales de una palabra'); writeln ('ingrese una palabra seguida de un espacio'); Read (car) ; end; {inicio} Procedure CuentaVocales (car: Char, var CantidadVocales: Integer); begin cantidad:=0; while car <>'' do If car in [‘a' , ‘e' ,‘i' ,‘o' ,‘u'] CuentaVocales := CuentaVocales + 1; read (car) end; {CuentaVocales} Procedure impresión (CantidadVocales: integer); begin; writeln ( 'la cantidad de Vocales de la palabra ingresada es', CantidadVocales); end; {impresión} begin {palabra5} Clrscr; inicio (car) CuentaVocales(car, CantidadVocales); impresión (CantidadVocales); readkey end.
28. Program palabra6; uses crt; var carchar ;exito: boolean; Procedure inicio ( var car: Char); begin writeln ('estudiar si una palabra comienza en la'); writeln ('ingrese una palabra seguida de un espacio); read (car); end; Procedure EmpiezaConLa (car: Char, var exito: boolean) begin exito: =false; if car = ‘l' then begin read(car); If car = 'a' then éxito: = true end; end;{EmpiezaConla} Procedure impresión (exito); begin Writeln ("la palabra ingresada empieza con la es:', exito); end; Begin {paiabra6} clrscr; Inicio (car); EmpiezaConla(car,exito); Impresión (exito); readkey end.
29. Program palabra7; Var car: char; exito: boolean; Procedure inicio (var car :char); begin writeln ("estudiar si una palabra termina en azo'); writeln ("ingrese una palabra seguida de un espacio'); read (car); end; {inicio} Procedure TerminaEnAzo ( car: Char var exito: boolean); begin exito:=false; while car <>' ' do begin if car ='a' then begin read(car); if car = "z" then begin read(car); if car = 'o' then begin read(car); exito:= car = ' ‘; end; end; end; else read (car); end{whlie} end;{TerminaEnAzo} Procedure impresión (éxito); begin writeln ('la palabra ingresada termina en azo es:', éxito); end; begin {palabra7} clrscr; Inicio (car); TerminaEnAzo(car, exito); impresión (éxito); readkey end.
30. Program frase1; uses crt; var car: char ; cantidad: integer; begin clrscr; writeln ('contar la cantidad de vocales de una frase '); writeln ('ingrese una frase: una frase es un conjunto de palabras separadas por un espacio y termina en punto'); read (car); cantidad :=0; while car<>'. ' do begin If car in ['a', 'e', 'i', 'o'u'] then cantidad := cantidad +1; read (car) end; write (cantidad) ; readkey end.
31. Program frase1_2; uses crt; var carchar ; CantidadVocales: integer; Procedure CuentaVocales ( car Char, var CantdVocales:integer); begin CantdVocales:= 0; while car o'.' do begin ifcar in [‘a' , ‘e' , ‘i' , ‘o' ,‘u'] then CantdVoclaes:=CantVocales+ 1 ; read (car); end; Procedure inicio (var car: Char); begin writeln (‘Contar la cantidad de vocales de una frase'); writeln ('ingrese una frase seguida de un punto'); read (car) end;{inicio} Procedure impresión (CantVocales: integer); begin writeln (' La cantidad de vocales de la frase ingresada es:' CantVocales) end; {impresión} begin {frase1_2} clrscr; inicio (car); CuentaVocales (car,CantidadVocales); impresión (CantidadVocales); readkey end.
32. Program frase2; uses crt; var carchar; cantidad: integer; begin clrscr; read(car); cantidad :=0; while car <> do begin ifcar = '' then cantidad := cantidad +1; read(car) ifcar = then cantidad:= cantidad + 1 end; writeln ('la frase tiene palabras', cantidad); readkey end.
33. Program frase2_1; uses crt; var canchar; cantidad: integer; Procedure palabra (var car: Char); begin while (car <>'.') and (car<>' ') do read(car) end; begin {frase2_1} clrscr; writeln (‘Contar la cantidad de palabras de una frase '); writeln ('ingrese una frase: una frase es un conjunto de palabras separadas por un espacio y termina en punto'); cantidad := 0; read(car); while (car<>'.') do begin palabra(car); cantidad := cantidad + 1; If (car<>'.') then read(car) end; write( cantidad); readkey end.
34. Program frase2_2; uses crt; var car:char; cantidad: integer; Procedure palabra (var car: Char); begin while (car<> '.') and (car<>' ') do read(car) end; Procedure EnFrase ( var car: Char; var cant: integer); begin cantidad: = 0; while car ‘ . ’<> do begin palabra( car); cant= cant + 1; ifcar <> ‘ . ’then read (car) end ; end; Procedure inicio (var car: car); Begin writeln (‘Contar la cantidad de palabras de una frase"); writeln ('ingrese una frase que finalice en un punto'); read (car); end; Procedure impresión (cantidad:integer); begin writeln (palabras en frase:', cantidad); end; Begin {frase2_2} clrscr; inicio (car); EnFrase (car ,cantidad); Impresión (cantidad); readkey end.
35. Program frase3; var car: Char ; cantidad: integer; Function empiezaconla (var car: Char): boolean); begin empiezaconla:= false; If car =‘.’ then begin read(car); If car = ‘a’ then empiezaconla:= true end; end; {empiezaconla} Procedure avanza (var car: Char); begin while (car <> '.') and( car <> ' ') do read(car); end; Procedure inicio ( var car: Char); begin writeln ("contar la cantidad de palabras de una frase que comienzan con la '); writeln ("ingrese una frase como un conjunto de palabras separadas por un espacio y terminada en punto'); read (car) ; end; {inicio} Procedure EnFrase (car char; var cantidad ; integer); begin cantidad :=0; while caro '. 'do begin ifempiezaconla (car); then cantidad cantidad + 1; avanza (car); ifcar <> '.' read (car) end; end;{En Frase} Procedure impresión(cantidad: integer); begin writeln ('La cantidad de palabras ....es:', cantidad) end; begin {frase3} Inicio (car); EnFrase (car, cantidad); impresión (cantidad); end.
36. Program frase4; Var car: Char ; cantidad: integer; TerminacionLa: boolean; Function TerminacionLa (var car: Char): boolean; begin TerminacionLa:= false; while (car <>'.') and (car <> " ) do Begin If car =‘l’ then begin read(car); If car = 'a' then begin read (car); TerminacionLa := (car ='.') or (car = " ) end; end; else If car <> then read(car); end; {while} end; {función} Procedure inicio (var car: Char); begin writeln ('contar la cantidad.....una frase que terminan con la '); writeln ('ingrese una frase como un conjunto de palabras .. por un espacio y termina en punto'); read (car); end;{inicio} Procedure EnFrase (car :boolean; var cantidad: integer); begin cantidad :=0; while car<>'.' do begin If TerminacionLa(car) then cantidad := cantidad + 1; If car-=' ' then read (car) ; end; End; {EnFrase} Procedure impresión (cantidad: integer); begin write( 'hay ', cantidad, ' de palabras...... que terminan con la '); Begin {frase4} Inicio (car); EnFrase (car, cantidad); Impresión (cantidad); Readkey end.
37. Program frase5; var car: Char ; cantidadla, cantidadpal: integer; Procedure inicio (var car: Char); begin writeln ('contar ... palabras que terminan con la de una frase'); writeln ('ingrese una frase que finalice en un punto'); read (car); end; Function TerminacionLa (var car: Char): boolean; begin TerminacionLa:= false; while ( car<> '.') and (car<> ' ')do begin If car = ‘l’ then begin read(car); If car = 'a‘ then begin read(car); TerminacionLa := ( car = ‘l’) or (car = ' ') end; end; else if car <> '.' then read(car); end ;{while} end;{TerminacionLa} Procedure EnFrase (car: Char; var cantla, cantpal: integer); begin cantla := 0; cantpal := 0; while car <> '.' do begin If TerminacionLa ( car) then cantla := cantla +1 ; cantpal := cantpal + 1; If car <> then read (car) end; end;{En Frase} Procedure impresion (cantla, cantpal: integer); begin writeln ('la cantidad de palabras de la frase que terminan con la es:', cantla); writeln ('la cantidad total de palabras de la frase es:', cantpal) end; begin clrscr inicio (car); EnFrase (car , cantidadla, cantidadpal); impresion(cantidadla, cantidadpal); end.
38. Ejercicio 1: Dados dos números enteros cuyos dígitos están ordenados en forma decreciente desde la cifra más significativa hacia la menos significativa, se desea obtener un tercer número ordenado de la misma manera. Puede haber dígitos repetidos. Ejemplifique Explique sucintamente como pensó resolver el ejercicio. Escriba uno o varios algoritmos que lo resuelvan. A partir de los algoritmos escriba un programa en Lenguaje Pascal. Haga una traza para algún dato de entrada y verifique el resultado.
39. Ejercicio 2 Escribir un algoritmo y un programa en Pascal que permita resolver el siguiente problema. Calcular por aproximaciones sucesivas el valor de la abscisa x para la cual el valor de la ordenada y es cero dentro del intervalo [0,3] para la función y = -1/2 x2 - 2x + 3. Un método a usar es el de bisección de Bolzano, que divide al intervalo en dos subintervalos y elige el subintervalo donde la función cambia de signo en sus extremos. Y así siguiendo hasta la admisión de un cierto error.
40. Ejercicio 3 Consideremos la siguiente sucesión : 1, 1/3 , 1/5, 1/8, 1/11, 1/15, 1/19, 1/24, 1/29.....de números reales donde los denominadores se obtienen a partir de la sucesión de números naturales 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........ Eliminando un número después del 1 y del 3, dos números después del 5 y del 8 tres números después del 11 y del 15, cuatro números después del 19 y 24 y así siguiendo. (Se eliminan los subrayados) Escribir una función en Pascal que permita calcular el n-ésimo elemento de la sucesión. Defina correctamente los parámetros. Escribir un programa en Pascal que permita calcular la suma de los n primeros elementos de la sucesión dada. Escribir un programa en Pascal para calcular la suma de los elementos de la sucesión hasta una aproximación dada.
41.
42. Snyder, Ilana –compiladora (2004): Alfabetismos digitales. Comunicación,innovación y educación en la era electrónica. Málaga: Aljibe Stallman, Richard M. (2004) Software libre para una sociedad libre. Introducción de Lawrence Lessig.
43. Curso Nivelación 2011 - Universidad Nacional de Chilecito Lic. en Sistemas - Ing. En Sistemas – Tecnicatura Univ. Desarrollo Aplic. WEB.