13.07.2015 Views

17. ARREGLOS. Array 17.1. Concepto. El arreglo es un tipo ... - Inicio

17. ARREGLOS. Array 17.1. Concepto. El arreglo es un tipo ... - Inicio

17. ARREGLOS. Array 17.1. Concepto. El arreglo es un tipo ... - Inicio

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

UNIVERSIDAD TECNICA FEDERICO SANTA MARIADEPARTAMENTO DE ELECTRONICAProgramación en PascalCapítulo <strong>17.</strong> Arreglos. <strong>Array</strong>.Se tendrá que <strong>un</strong>a componente puede anotarse:m[i][j]Para simplificar la notación se acepta:Type matriz = array [R, C] of T;Y puede acc<strong>es</strong>arse a <strong>un</strong>a componente según:m[i,j]Ejemplo: Dos matric<strong>es</strong>, m y n, de 100 por 100 de valor<strong>es</strong> enteros puede declararse:const dimension = 100;type matriz = array [1..dimension,1..dimension] of integer;var m, n: matriz;<strong>17.</strong>5. Arreglos Multidimensional<strong>es</strong>.Pueden definirse según:Type M = array [T1,T2,...TN] of T;Donde: T1 a TN son los <strong>tipo</strong>s de los índic<strong>es</strong>.T <strong>es</strong> el <strong>tipo</strong> base.En general:::='array [' {* ',' } '] of' Ejemplo: Sean las declaracion<strong>es</strong>:a: array [1..3] of T;b: array [1..2] of a;Se puede interpretar gráficamente las <strong>es</strong>tructuras, según:Prof. Leopoldo Silva Bijit. 07-07-2003 188


UNIVERSIDAD TECNICA FEDERICO SANTA MARIADEPARTAMENTO DE ELECTRONICAProgramación en PascalCapítulo <strong>17.</strong> Arreglos. <strong>Array</strong>.b[1] [2]bb[1]b[2]a[1] a[2] a[3]a[1] a[2] a[3]De <strong>es</strong>ta forma puedenb[2] [3]verse los <strong>arreglo</strong>s multidimensional<strong>es</strong> como árbol<strong>es</strong>.Para el caso de matric<strong>es</strong>, puede repr<strong>es</strong>entarse como <strong>es</strong> tradicional, según:bij 1 2 312b[1,3]<strong>17.</strong>6. Arreglos <strong>es</strong>táticos.Es importante d<strong>es</strong>tacar que los <strong>arreglo</strong>s en Pascal son <strong>es</strong>tructuras <strong>es</strong>táticas; <strong>es</strong> decir, elnúmero de sus component<strong>es</strong> queda determinado en el momento en que el programa <strong>es</strong>traducido a lenguaje de máquina. Esto <strong>es</strong>tá de acuerdo con la <strong>es</strong>trategia de diseño de Pascal,de que todos los <strong>tipo</strong>s deben <strong>es</strong>tar completamente <strong>es</strong>pecificados en el momento de lacompilación.Esto produce dificultad<strong>es</strong> cuando se d<strong>es</strong>ea trabajar con <strong>arreglo</strong>s de largo variable. En <strong>es</strong>toscasos suele definirse <strong>un</strong> <strong>es</strong>pacio igual al mayor largo que se d<strong>es</strong>ee manipular; con laconsiguiente mala utilización de memoria para los casos en que el largo sea menor que eldefinido. Si el largo variable máximo no <strong>es</strong> conocido, no podrá usarse <strong>es</strong>ta <strong>es</strong>tructura; y quizáconvendría emplear <strong>un</strong> lenguaje que admitiera <strong>arreglo</strong>s dinámicos.Por <strong>es</strong>ta razón los valor<strong>es</strong> máximos de los índic<strong>es</strong> suelen definirse como constant<strong>es</strong>. Si setiene <strong>un</strong> programa f<strong>un</strong>cionando con <strong>un</strong>a determinada dimensión para <strong>un</strong> <strong>arreglo</strong>, y si se d<strong>es</strong>eamodificar la dimensión, deberá modificarse la constante que <strong>es</strong>tablece la máxima dimensión, yvolver a compilar.<strong>17.</strong>7. Acc<strong>es</strong>o Aleatorio.Prof. Leopoldo Silva Bijit. 07-07-2003 189


UNIVERSIDAD TECNICA FEDERICO SANTA MARIADEPARTAMENTO DE ELECTRONICAProgramación en PascalCapítulo <strong>17.</strong> Arreglos. <strong>Array</strong>.En la repr<strong>es</strong>entación interna, las diversas component<strong>es</strong> del <strong>arreglo</strong> permanecen en memoriaprincipal; por <strong>es</strong>ta razón se dice que <strong>es</strong> <strong>un</strong>a <strong>es</strong>tructura de acc<strong>es</strong>o aleatorio. Es decir, el tiemponec<strong>es</strong>ario para acc<strong>es</strong>ar <strong>un</strong>a componente cualquiera <strong>es</strong> el mismo; también el tiempo paraasignar <strong>un</strong> valor a cual<strong>es</strong>quiera de las component<strong>es</strong>.<strong>17.</strong>8. Manipulación.<strong>17.</strong>8.1.- Sintaxis de variable de <strong>arreglo</strong>.En general la sintaxis de <strong>un</strong>a componente de <strong>un</strong>a variable de <strong>tipo</strong> <strong>arreglo</strong> <strong>es</strong> la siguiente: ::= { '[' {* ',' } ']' * }La notación abreviada usa como índic<strong>es</strong> <strong>un</strong>a lista de expr<strong>es</strong>ion<strong>es</strong>, separadas por comas. <strong>El</strong>lazo exterior repr<strong>es</strong>enta la notación extendida.La variable componente de <strong>arreglo</strong> debe ser <strong>un</strong> identificador declarado como <strong>un</strong>a variablede <strong>tipo</strong> <strong>arreglo</strong>.Nót<strong>es</strong>e que, en general, el índice puede ser <strong>un</strong>a expr<strong>es</strong>ión. En el caso más simple deexpr<strong>es</strong>ión puede usarse <strong>un</strong>a variable; ésta se denomina variable índice, o más simplementeíndice.<strong>17.</strong>8.2.- Operacion<strong>es</strong> básicas.a) Lectura.Se dice que se efectúa <strong>un</strong>a lectura, o acc<strong>es</strong>o a la <strong>es</strong>tructura, cuando <strong>un</strong>a variable de <strong>tipo</strong><strong>arreglo</strong> figura como factor en <strong>un</strong>a expr<strong>es</strong>ión. La evaluación del factor se logra, previamentecalculando el valor del índice, para luego acc<strong>es</strong>ar en la <strong>es</strong>tructura el valor de la componentecorr<strong>es</strong>pondiente.b) Escritura.Se dice que se efectúa <strong>un</strong>a <strong>es</strong>critura, o asignación selectiva, si <strong>un</strong>a variable de <strong>tipo</strong> <strong>arreglo</strong>aparece a la izquierda en <strong>un</strong>a instrucción de asignación. En <strong>es</strong>te caso la expr<strong>es</strong>ión de laderecha, debe tener igual <strong>tipo</strong> que la base del <strong>arreglo</strong>. También deben calcularse lasProf. Leopoldo Silva Bijit. 07-07-2003 190


UNIVERSIDAD TECNICA FEDERICO SANTA MARIADEPARTAMENTO DE ELECTRONICAProgramación en PascalCapítulo <strong>17.</strong> Arreglos. <strong>Array</strong>.expr<strong>es</strong>ion<strong>es</strong> que figuran como índic<strong>es</strong> de la variable, para asignarle posteriormente el valor yacalculado de la expr<strong>es</strong>ión a la derecha del símbolo de asignación.Si m y n son variabl<strong>es</strong> <strong>arreglo</strong>s de igual <strong>tipo</strong> puede efectuarse <strong>un</strong>a asignación global:m := n;{n debe tener valor<strong>es</strong> asignados en sus component<strong>es</strong>}<strong>17.</strong>8.3. Operacion<strong>es</strong> usual<strong>es</strong>.<strong>17.</strong>8.3.1. InicializaciónConsiste en dar valor<strong>es</strong> a <strong>un</strong>a <strong>es</strong>tructura, ant<strong>es</strong> de realizar otros cálculos.Ejemplos: Seana: array [1..20] of char;b: array ['a'..'z'] of integer;Nót<strong>es</strong>e que se han empleado <strong>tipo</strong>s anónimos.a) Iniciar a con <strong>es</strong>pacios. Corr<strong>es</strong>ponde a <strong>un</strong>a línea en blanco.....i:=1;repeat a[i] := ' '; i:=i+1 <strong>un</strong>til i = 20;....Pero <strong>es</strong> preferible emplear la instrucción for:b) Iniciar b con ceros.<strong>17.</strong>8.3.2. Copia.for i:=1 to 20 do a[i]:=' ';for ch:='a' to 'z' do b[ch]:=0;Dados dos <strong>arreglo</strong>s de igual <strong>tipo</strong>, se d<strong>es</strong>ea copiar los valor<strong>es</strong> del <strong>arreglo</strong> a en el <strong>arreglo</strong> b:Esto puede <strong>es</strong>cribirse:Prof. Leopoldo Silva Bijit. 07-07-2003 191


UNIVERSIDAD TECNICA FEDERICO SANTA MARIADEPARTAMENTO DE ELECTRONICAProgramación en PascalCapítulo <strong>17.</strong> Arreglos. <strong>Array</strong>.for i:=1 to N do b[i]:=a[i];Pero como se dijo ant<strong>es</strong>, <strong>es</strong> más simple:b := a;Prof. Leopoldo Silva Bijit. 07-07-2003 192


<strong>17.</strong>9. Operacion<strong>es</strong> Especial<strong>es</strong>.UNIVERSIDAD TECNICA FEDERICO SANTA MARIADEPARTAMENTO DE ELECTRONICAProgramación en PascalCapítulo <strong>17.</strong> Arreglos. <strong>Array</strong>.En los siguient<strong>es</strong> ejemplos se asume:var a:array [1..N] of integer;<strong>17.</strong>9.1. Sumar las component<strong>es</strong>....suma:=0;for i:=1 to N do suma:=suma+a[i];...<strong>17.</strong>9.2. Búsqueda de valor extremo.Encontrar el mínimo valor, y también el índice corr<strong>es</strong>pondiente:Sea h el índice al mínimo.....min := a[1]; h := 1; {se ap<strong>un</strong>ta, con el índice, al primero}for i := 2 to N do {se revisa del seg<strong>un</strong>do hasta el final}beginif a[i] a[j] then j:=k;{j queda ap<strong>un</strong>tando al mayor}....Prof. Leopoldo Silva Bijit. 07-07-2003 193


UNIVERSIDAD TECNICA FEDERICO SANTA MARIADEPARTAMENTO DE ELECTRONICAProgramación en PascalCapítulo <strong>17.</strong> Arreglos. <strong>Array</strong>.<strong>17.</strong>9.3. Ordenamiento de las component<strong>es</strong>.Existen numerosos algoritmos para ordenar. A continuación, y a modo de introducción altema, se verán dos <strong>es</strong>quemas simpl<strong>es</strong> de ordenamiento de las component<strong>es</strong> de <strong>un</strong> <strong>arreglo</strong>.Esta tarea ocurre frecuentemente y quizá por <strong>es</strong>ta razón, en alg<strong>un</strong>os país<strong>es</strong> se denominaordenador<strong>es</strong> a los computador<strong>es</strong> digital<strong>es</strong>.<strong>17.</strong>9.3.1. Ordenamiento d<strong>es</strong>cendente buscando el mayor.En <strong>un</strong> <strong>arreglo</strong> de largo n se busca el mayor y se lo coloca en la primera posición. Luego en<strong>un</strong> <strong>arreglo</strong> de largo n-1 se vuelve a buscar el mayor y se lo coloca en la seg<strong>un</strong>da posición. Yasí suc<strong>es</strong>ivamente hasta ordenar todos los elementos. Cuando se obtiene el elemento ubicadoen n-1; el último queda determinado automáticamente.....for i:=1 to n-1 do {ubica los primeros n-1.}begin{la ubicación del i-avo}j:=i;{asume que j ap<strong>un</strong>ta al mayor}for k:=i+1 to n do {recorre el sub<strong>arreglo</strong>}if a[k]>a[j] then j:=k; {dejando en j el mayor}b:=a[i]; a[i]:=a[j]; a[j]:=b {posiciona el i-avo}end;....Se emplea b para el intercambio de valor<strong>es</strong> entre a[i] y a[j]. Nót<strong>es</strong>e que <strong>es</strong>te intercambiopodría condicionarse a realizarse cuando ij.<strong>El</strong> ordenamiento consiste en cambiar los contenidos del <strong>arreglo</strong>, tal que al final los valor<strong>es</strong> delas component<strong>es</strong> <strong>es</strong>tén ordenadas (en <strong>es</strong>te caso en forma d<strong>es</strong>cendente).Pueden efectuarse, lev<strong>es</strong> modificacion<strong>es</strong>, para el ordenamiento ascendente.Prof. Leopoldo Silva Bijit. 07-07-2003 194


UNIVERSIDAD TECNICA FEDERICO SANTA MARIADEPARTAMENTO DE ELECTRONICAProgramación en PascalCapítulo <strong>17.</strong> Arreglos. <strong>Array</strong>.<strong>17.</strong>9.3.2. Ordenamiento ascendente buscando el mínimo.Una variación del algoritmo para buscar el valor mínimo y su índice, nos permite plantear <strong>un</strong>algoritmo de ordenamiento ascendente.... {ordenamiento ascendente}for i:=1 to n-1 dobeginmin:=a[i]; k:=i;for j:=i to n dobeginif a[j]v[j+1] thenbegin {intercambio}k:=v[j]; v[j]:=v[j+1]; v[j+1]:=kend;{<strong>es</strong>cribe <strong>arreglo</strong> ordenado}for i:=1 to n do write (v[i])end.Prof. Leopoldo Silva Bijit. 07-07-2003 195


UNIVERSIDAD TECNICA FEDERICO SANTA MARIADEPARTAMENTO DE ELECTRONICAProgramación en PascalCapítulo <strong>17.</strong> Arreglos. <strong>Array</strong>.Se comparan dos elementos adyacent<strong>es</strong>, al menor se lo ubica con índice menor. Es decir,los valor<strong>es</strong> menor<strong>es</strong> van ascendiendo; de aquí viene el nombre de burbuja. Asumiendo que lasburbujas de aire ascienden dentro de <strong>un</strong> líquido.||j ---> v[j]v[j+1]|<strong>El</strong> for interno revisa las component<strong>es</strong>, de a par<strong>es</strong>, d<strong>es</strong>de el inicio hasta <strong>un</strong>a posición finalvariable. Debe notarse que <strong>un</strong>a primera revisión del vector entrega el mayor (más p<strong>es</strong>ado) enla última posición. Por <strong>es</strong>ta razón puede ir acortándose el largo de las futuras revision<strong>es</strong>. Estose logra con el for externo, que <strong>es</strong>tá implementado en forma regr<strong>es</strong>iva.<strong>17.</strong>9.4. Búsqueda (Search).Otra tarea frecuente <strong>es</strong> buscar el índice de <strong>un</strong> elemento igual a <strong>un</strong> valor dado b.Como no conocemos, por adelantado, cuántos elementos deben inspeccionarse, larepetición conviene plantearla en términos de while (o repeat) y no emplear for.<strong>17.</strong>9.4.1. Búsqueda lineal o secuencial (Linear Search).Con: var a: array [1..n] of T {n>0}Consiste en revisar, en forma ordenada y partiendo d<strong>es</strong>de <strong>un</strong> extremo, si el valor buscadocoincide con alg<strong>un</strong>o de los elementos del vector. Se usará la variable booleana <strong>es</strong>taba paraindicar si el valor b <strong>es</strong>tá o no en el <strong>arreglo</strong> a.....i:=1;while (i


UNIVERSIDAD TECNICA FEDERICO SANTA MARIADEPARTAMENTO DE ELECTRONICAProgramación en PascalCapítulo <strong>17.</strong> Arreglos. <strong>Array</strong>.Se sale del lazo cuando (a[i]=b) o (i=n); <strong>es</strong> decir si se llegó al final o se encontró el valor.Nót<strong>es</strong>e que la condición de término corr<strong>es</strong>ponde a la negación de la condición del while; éstapuede obtenerse aplicando la Ley de De Morgan.Debe notarse que en el lazo no se revisa el último lugar, pero se incrementa i. Entonc<strong>es</strong> alsalir, sin haber encontrado el valor b en las primeras (n-1) component<strong>es</strong> de a se revisa elúltimo en la asignación de la variable <strong>es</strong>taba.Una variante de la búsqueda lineal se logra con la instrucción repeat:....i:=0;repeati:=i+1<strong>un</strong>til (i=n) or (a[i]=b);<strong>es</strong>taba:=a[i]=b;....Nota sobre Expr<strong>es</strong>ion<strong>es</strong> booleanas.Una observación importante tiene relación con la evaluación de expr<strong>es</strong>ion<strong>es</strong> booleanas; yaque en alg<strong>un</strong>os casos puede conocerse el valor ant<strong>es</strong> de evaluar la expr<strong>es</strong>ión completa. Loscasos más característicos son:a) p and qb) p or qSi se conoce que p tiene valor false, no será nec<strong>es</strong>ario evaluar q, en el caso AND. Tambiénsi se evalúa p y da valor verdadero, no será nec<strong>es</strong>ario seguir calculando el valor de q, ya quepuede asegurarse que la expr<strong>es</strong>ión en b) será verdadera. Lamentablemente en Pascal <strong>es</strong>tándarno se considera <strong>es</strong>ta propiedad, que lenguaj<strong>es</strong> de diseño más reciente incorporan (Porejemplo: Ada, C y Módula). Específicamente, el programador debe asegurarse que elseg<strong>un</strong>do factor quede bien definido.Un ejemplo de <strong>es</strong>to <strong>es</strong> el siguiente:.... {búsqueda lineal}i:=0;repeat i:=i+1 <strong>un</strong>til (i>n) or (a[i]=b);<strong>es</strong>taba:=i


UNIVERSIDAD TECNICA FEDERICO SANTA MARIADEPARTAMENTO DE ELECTRONICAProgramación en PascalCapítulo <strong>17.</strong> Arreglos. <strong>Array</strong>......La repetición termina si se encuentra el elemento b en el <strong>arreglo</strong> a, o si se llega al final. Sinembargo, en caso que b no <strong>es</strong>té en el <strong>arreglo</strong>, el seg<strong>un</strong>do factor de la condición de términoqueda indefinido, ya que a[n+1] no pertenece al <strong>arreglo</strong>. (Report página 21). Problema queno se pr<strong>es</strong>enta en lenguaj<strong>es</strong> que "cortocircuitan" las expr<strong>es</strong>ion<strong>es</strong> booleanas.Una forma de simular el cortocircuito del OR, en Pascal, <strong>es</strong> la siguiente:....i:=0;repeati:=i+1;if i>n then c:=true else c:=a[i]=b<strong>un</strong>til c;<strong>es</strong>taba:=i


UNIVERSIDAD TECNICA FEDERICO SANTA MARIADEPARTAMENTO DE ELECTRONICAProgramación en PascalCapítulo <strong>17.</strong> Arreglos. <strong>Array</strong>.Ahora:var a : array [1..n+1] of integer;<strong>es</strong>taba : boolean;....a[n+1]:=b; {se pone el centinela}i:=1;while a[i]b do i:=i+1;<strong>es</strong>taba:=i


UNIVERSIDAD TECNICA FEDERICO SANTA MARIADEPARTAMENTO DE ELECTRONICAProgramación en PascalCapítulo <strong>17.</strong> Arreglos. <strong>Array</strong>.j:=n; {ap<strong>un</strong>ta a la cola }repeatk:=(i+j) div 2; {busca la mitad}if a[k]=b then j:=k-1; {sigue en mitad superior}<strong>un</strong>til i>j;<strong>es</strong>taba:=a[k]=b;Si <strong>es</strong>taba <strong>es</strong> true, el elemento buscado ocupa la posición k. Tiene valor a[k].Es conveniente revisar el algoritmo, en su condición de término. También ponerse en el casoque el elemento buscado no <strong>es</strong>té en el vector, y analizar el comportamiento del algoritmo.Esto agota las operacion<strong>es</strong> básicas con <strong>arreglo</strong>s. A continuación se verán alg<strong>un</strong>asaplicacion<strong>es</strong> típicas.<strong>17.</strong>10. Uso de Arreglos.<strong>17.</strong>10.1. Aplicacion<strong>es</strong> numéricas.Alg<strong>un</strong>as situacion<strong>es</strong> quedan <strong>es</strong>pontáneamente d<strong>es</strong>critas en términos de <strong>arreglo</strong>s. Porejemplo: vector<strong>es</strong> y matric<strong>es</strong>. También <strong>es</strong> la forma natural de d<strong>es</strong>cribir f<strong>un</strong>cion<strong>es</strong> discretas.Si <strong>un</strong>a situación puede d<strong>es</strong>cribirse con <strong>un</strong>a variable con subíndice de <strong>tipo</strong> entero, tambiénpodrá modelarse, sin dificultad, en términos de <strong>arreglo</strong>s.Programas con número de entradas variable, pero acotado; y en el cual se nec<strong>es</strong>itememorizar todos los valor<strong>es</strong> ant<strong>es</strong> de producir r<strong>es</strong>ultados, también pueden repr<strong>es</strong>entarse enbase a <strong>arreglo</strong>s.<strong>17.</strong>10.1.1. Estadísticas.Calcular el promedio de n enteros, donde n <strong>es</strong> variable pero menor que N; no nec<strong>es</strong>ita <strong>un</strong><strong>arreglo</strong>.i=nPromedio = ( ∑ Xi)/ni=1Prof. Leopoldo Silva Bijit. 07-07-2003 200


UNIVERSIDAD TECNICA FEDERICO SANTA MARIADEPARTAMENTO DE ELECTRONICAProgramación en PascalCapítulo <strong>17.</strong> Arreglos. <strong>Array</strong>.Pero sí, para calcular la d<strong>es</strong>viación, empleando la siguiente fórmula:D<strong>es</strong>viacion =i=n∑i = 1( Xi − Promedio)n2Para calcular la d<strong>es</strong>viación primero debe calcularse el promedio y luego se nec<strong>es</strong>itan losvalor<strong>es</strong> de cada Xi.Pero si se emplea la fórmula:i=ni=n2 2 2∑ ∑(D<strong>es</strong>viacion) ∗ n = Xi − 2*Promedio* Xi + n*Promedioi=1 i=1que puede d<strong>es</strong>arrollarse expandiendo el cuadrado del binomio. Puede comprobarse que no <strong>es</strong>nec<strong>es</strong>ario almacenar los diferent<strong>es</strong> Xi; y por lo tanto no <strong>es</strong> nec<strong>es</strong>ario el <strong>arreglo</strong>.<strong>17.</strong>10.1.2. Cálculo de polinomios.Existen numerosas técnicas de aproximación, que permiten repr<strong>es</strong>entar <strong>un</strong>a f<strong>un</strong>ción mediante<strong>un</strong> polinomio. La utilización de sub-índic<strong>es</strong> para d<strong>es</strong>cribir los coeficient<strong>es</strong>, permite <strong>es</strong>cribir engeneral:Agrupando:f = c(n)*x n +c(n-1)*x n-1 +....+c(1)*x+c(0)*1f = ((..((c(n)*x+c(n-1))*x+c(n-2)))*x+...+c(1))*x+c(0)Se logra la regla de evaluación de Horner:<strong>El</strong> polinomio puede calcularse según:....f:=0;for i:=n downto 0 do f := f*x + c[i]....Prof. Leopoldo Silva Bijit. 07-07-2003 201


UNIVERSIDAD TECNICA FEDERICO SANTA MARIADEPARTAMENTO DE ELECTRONICAProgramación en PascalCapítulo <strong>17.</strong> Arreglos. <strong>Array</strong>.Con <strong>un</strong>a expr<strong>es</strong>ión simple para el algoritmo, al elegir <strong>un</strong> vector de coeficient<strong>es</strong> delpolinomio. Cambiando los coeficient<strong>es</strong> pueden obtenerse aproximacion<strong>es</strong> para diferent<strong>es</strong>f<strong>un</strong>cion<strong>es</strong>. <strong>El</strong> ejemplo mu<strong>es</strong>tra que, en ciertos casos, al elegir <strong>un</strong> <strong>arreglo</strong> se logrand<strong>es</strong>cripcion<strong>es</strong> algorítmicas simpl<strong>es</strong> y compactas.<strong>17.</strong>10.1.3. Aritmética de precisión múltiple.Se d<strong>es</strong>ea manipular números en notación posicional, y en cualquier base (menor o igual a10).Esto permitirá manipular enteros mayor<strong>es</strong> que el máximo repr<strong>es</strong>entable.Un número se repr<strong>es</strong>enta por <strong>un</strong> vector, en el cual cada componente repr<strong>es</strong>enta <strong>un</strong> dígito enla base dada.<strong>El</strong> siguiente programa ilustra la suma y r<strong>es</strong>ta de enteros de largo n, dando la r<strong>es</strong>pu<strong>es</strong>ta en <strong>un</strong>entero de largo n y <strong>un</strong>a r<strong>es</strong>erva (o préstamo) en base b.var u,v : array [1..n] of integer; {operandos}r : array [0..n] of integer; {r<strong>es</strong>ultado}j,k,t:integer;....begink:=0; {r<strong>es</strong>erva}for j:=n downto 1 dobegint:=u[j]+v[j]+k; {-v[j] para la r<strong>es</strong>ta}r[j]:=t mod b;k:=t div bend;r[0]:=kend;....Nót<strong>es</strong>e que en cada posición sólo se almacena <strong>un</strong> dígito, y que la r<strong>es</strong>erva final sólo pued<strong>es</strong>er 0 ó 1. <strong>El</strong> algoritmo ilustra cómo se <strong>es</strong>tructuran operacion<strong>es</strong> aritméticas en base aoperacion<strong>es</strong> más primitivas.Prof. Leopoldo Silva Bijit. 07-07-2003 202


UNIVERSIDAD TECNICA FEDERICO SANTA MARIADEPARTAMENTO DE ELECTRONICAProgramación en PascalCapítulo <strong>17.</strong> Arreglos. <strong>Array</strong>.A la innumerable cantidad de situacion<strong>es</strong> en que pueden aplicarse <strong>arreglo</strong>s de contenidosnuméricos, se agregan los <strong>arreglo</strong>s de caracter<strong>es</strong> (strings); y también los <strong>arreglo</strong>s de booleanos(que pueden repr<strong>es</strong>entar conj<strong>un</strong>tos, además de aplicacion<strong>es</strong> digital<strong>es</strong> convencional<strong>es</strong>).<strong>17.</strong>10.2. Proc<strong>es</strong>amiento de textos usando <strong>arreglo</strong>s.La <strong>un</strong>idad básica de <strong>un</strong> texto, <strong>es</strong> <strong>un</strong>a línea. La cual puede repr<strong>es</strong>entarse por <strong>un</strong> <strong>arreglo</strong> decaracter<strong>es</strong>.Lo anterior puede d<strong>es</strong>cribirse:Type linea=array [1..largo] of char;Donde largo <strong>es</strong> <strong>un</strong>a constante usada para <strong>es</strong>pecificar el máximo largo de <strong>un</strong>a línea; en casode textos suele ser 80.Una vez definida <strong>un</strong>a <strong>es</strong>tructura de datos <strong>es</strong> conveniente diseñar procedimientos que lamanipulen.Veremos a continuación alg<strong>un</strong>as posibilidad<strong>es</strong> de leer y <strong>es</strong>cribir, <strong>un</strong>a variable de <strong>tipo</strong> línea,d<strong>es</strong>de y hacia <strong>un</strong> archivo.Asumiendo las siguient<strong>es</strong> variabl<strong>es</strong> global<strong>es</strong>:var l:linea;x,y:text; {x abierto para lectura; y para <strong>es</strong>critura}cl:integer; {caracter<strong>es</strong> gráficos en la línea}<strong>El</strong> procedimiento traigalinea llena la variable l, y deja en cl el número de caracter<strong>es</strong> en lalínea. Se tendrá que cl retorna con cero si la línea no tiene caracter<strong>es</strong>; y -1 si <strong>es</strong> fin del archivox.La com<strong>un</strong>icación entre el procedimiento y el programa se efectúa a través de las variabl<strong>es</strong>global<strong>es</strong>. Más adelante, se verán diseños más eficient<strong>es</strong> de intercambio a través de losparámetros del procedimiento.procedure traigalinea;var i:integer; {local}begini:=0;Prof. Leopoldo Silva Bijit. 07-07-2003 203


if not eof(x)thenbeginwhile not eoln(x) dobegini:=i+1;read(x,l[i])end;readln(x);cl:=iendelsecl:=-1end;UNIVERSIDAD TECNICA FEDERICO SANTA MARIADEPARTAMENTO DE ELECTRONICAProgramación en PascalCapítulo <strong>17.</strong> Arreglos. <strong>Array</strong>.Puede también d<strong>es</strong>arrollarse procedimientos para leer y <strong>es</strong>cribir variabl<strong>es</strong> de <strong>tipo</strong> línead<strong>es</strong>de y hacia los archivos <strong>es</strong>tándar<strong>es</strong> de entrada y salida; se dejan como ejercicio, ya que sonlev<strong>es</strong> variant<strong>es</strong> de los anterior<strong>es</strong>.Nót<strong>es</strong>e que no pueden leerse ni <strong>es</strong>cribirse, a través de read y write variabl<strong>es</strong> de <strong>tipo</strong> línea;pero si <strong>es</strong> posible leer y <strong>es</strong>cribir char, que <strong>es</strong> lo que se efectúa en los procedimientos.Otro aspecto que debe notarse, <strong>es</strong> el empleo de contador<strong>es</strong> local<strong>es</strong> (la variable i). Su usoda mayor velocidad; ya que siempre <strong>es</strong> más fácil el acc<strong>es</strong>o a variabl<strong>es</strong> local<strong>es</strong> que a lasglobal<strong>es</strong> en <strong>un</strong> programa Pascal.<strong>17.</strong>10.3. Strings. Arreglos empaquetados.En Pascal <strong>es</strong>tándar se definen strings como secuencias de más de <strong>un</strong> caracter, encerradosentre apóstrof<strong>es</strong>; y son constant<strong>es</strong> de <strong>tipo</strong>:packed array [1..n] of charPor extensión puede definirse:Type string = packed array [1..n] of char;La palabra packed (empaquetado) <strong>es</strong> <strong>un</strong>a indicación para el compilador, para que r<strong>es</strong>erve<strong>es</strong>pacio guardando varios caracter<strong>es</strong> en <strong>un</strong>a palabra de memoria. De <strong>es</strong>ta forma larepr<strong>es</strong>entación empaquetada, de <strong>arreglo</strong>s de caracter<strong>es</strong>, ocupa menor lugar que la noempaquetada.Prof. Leopoldo Silva Bijit. 07-07-2003 204


UNIVERSIDAD TECNICA FEDERICO SANTA MARIADEPARTAMENTO DE ELECTRONICAProgramación en PascalCapítulo <strong>17.</strong> Arreglos. <strong>Array</strong>.Para el programador, además de disponer de todas las características de <strong>un</strong> <strong>arreglo</strong> decaracter<strong>es</strong>, se tienen las siguient<strong>es</strong> ventajas:a) <strong>El</strong> procedimiento write puede <strong>es</strong>cribir expr<strong>es</strong>ion<strong>es</strong> de <strong>tipo</strong> packed array.b) Puede efectuarse la asignación total de la <strong>es</strong>tructura:Ejemplo:var s:packed array [1..5] of char;a: array [1..5] of char;Pueden <strong>es</strong>cribirse:s:='12345';write(s); write('abcde')c) Pero no son válidas:a:='12345'; a:=s; {<strong>tipo</strong>s incompatibl<strong>es</strong>}write(a); read(s); read(a); {argumento ilegal}s:='123';{<strong>tipo</strong> incompatible}Un string debe leerse, carácter a carácter, ya que el procedimiento read no convierte stringsde repr<strong>es</strong>entación externa a la corr<strong>es</strong>pondiente interna.<strong>El</strong> tratamiento de strings que efectúa el Pascal <strong>es</strong>tándar ha sido criticado fuertemente; ya quedificulta el proc<strong>es</strong>amiento de la información alfanumérica, muy común en el ambiente deproc<strong>es</strong>amiento de datos. Por <strong>es</strong>ta razón casi todos los compilador<strong>es</strong> Pascal existent<strong>es</strong> traenextension<strong>es</strong> para la manipulación de strings. En ellas suele disponerse como <strong>tipo</strong> <strong>es</strong>tándar alstring; además pueden <strong>es</strong>cribirse y leerse expr<strong>es</strong>ion<strong>es</strong> y variabl<strong>es</strong> de <strong>es</strong>e <strong>tipo</strong>; y se dispone def<strong>un</strong>cion<strong>es</strong> para su manipulación. Otro rasgo d<strong>es</strong>tacable <strong>es</strong> cierta liberalidad en el largo;permitiendo asignacion<strong>es</strong> de cualquier largo, siempre que no se exceda <strong>un</strong> máximo.<strong>El</strong> empleo de las extension<strong>es</strong> debe planearse cuidadosamente, si se <strong>es</strong>pera compilar <strong>un</strong>mismo programa en diversas instalacion<strong>es</strong>, o bajo compilador<strong>es</strong> diferent<strong>es</strong> en <strong>un</strong> mismosistema.Operacion<strong>es</strong>. Pack, Unpack.Prof. Leopoldo Silva Bijit. 07-07-2003 205


UNIVERSIDAD TECNICA FEDERICO SANTA MARIADEPARTAMENTO DE ELECTRONICAProgramación en PascalCapítulo <strong>17.</strong> Arreglos. <strong>Array</strong>.La siguiente discusión puede omitirse, ser perder continuidad.<strong>El</strong> acc<strong>es</strong>o a <strong>un</strong>a componente de <strong>un</strong> <strong>arreglo</strong> empaquetado toma más tiempo que elcorr<strong>es</strong>pondiente a <strong>un</strong>a componente no empaquetada. Para reducir el tiempo de acc<strong>es</strong>o, ellenguaje <strong>es</strong>tándar provee dos procedimientos para empaquetar o d<strong>es</strong>empaquetar todas lascomponent<strong>es</strong> en <strong>un</strong>a sola operación.Ejemplo: La copia de valor<strong>es</strong> de s en a se logra:<strong>un</strong>pack(s,a,1)La operación inversa, la copia de valor<strong>es</strong> de la <strong>es</strong>tructura no empaquetada a laempaquetada se logra con:pack(a,1,s)Donde a y s han sido definidos ant<strong>es</strong>; y deben tener igual largo.La secuencia:s:='12345'; <strong>un</strong>pack(s,a,1)Es equivalente a:a[1]:='1';a[2]:='2';a[3]:='3';a[4]:='4';a[5]:='5'Cuando se d<strong>es</strong>ea optimizar el almacenamiento de strings, ya sea en memoria principal osec<strong>un</strong>daria, las variabl<strong>es</strong> se manejan empaquetadas. Todos los acc<strong>es</strong>os ya sea de lectura o<strong>es</strong>critura se realizan de <strong>es</strong>ta forma; y si se d<strong>es</strong>ea acc<strong>es</strong>ar a los caracter<strong>es</strong> en forma individual,deberá d<strong>es</strong>empaquetarse, efectuar las operacion<strong>es</strong> pertinent<strong>es</strong>; y volver a empaquetar si <strong>es</strong>nec<strong>es</strong>ario.Una limitación del lenguaje <strong>es</strong>tándar <strong>es</strong> que no permite pasar como parámetro <strong>un</strong>a variableempaquetada. En alg<strong>un</strong>as extension<strong>es</strong> ésto <strong>es</strong> posible. Si se d<strong>es</strong>ea com<strong>un</strong>icar variabl<strong>es</strong> de <strong>es</strong>te<strong>tipo</strong> <strong>es</strong> obligatorio d<strong>es</strong>empaquetar la <strong>es</strong>tructura, previo a la invocación del procedimiento.En general si:var u : array [a..d] of T;p : packed array [b..c] of T;Prof. Leopoldo Silva Bijit. 07-07-2003 206


UNIVERSIDAD TECNICA FEDERICO SANTA MARIADEPARTAMENTO DE ELECTRONICAProgramación en PascalCapítulo <strong>17.</strong> Arreglos. <strong>Array</strong>.Con a


UNIVERSIDAD TECNICA FEDERICO SANTA MARIADEPARTAMENTO DE ELECTRONICAProgramación en PascalCapítulo <strong>17.</strong> Arreglos. <strong>Array</strong>.Comparacion<strong>es</strong>.Otra ventaja de manipulación, <strong>es</strong> que los operador<strong>es</strong> de relación pueden aplicarse aoperandos de <strong>tipo</strong> string de igual largo. <strong>El</strong> ordenamiento depende del código empleado para elconj<strong>un</strong>to de valor<strong>es</strong> de <strong>tipo</strong> char.Ejemplos:'writeln'>'write '; {valor true}'aB'>'AB' ; {valor true}' 1'>'1 ' ; {valor false}En <strong>un</strong> <strong>arreglo</strong> de caracter<strong>es</strong> las comparacion<strong>es</strong> deben efectuarse para cada <strong>un</strong>a de loscaracter<strong>es</strong> corr<strong>es</strong>pondient<strong>es</strong>. Si a y b son <strong>arreglo</strong>s de caracter<strong>es</strong>, la relación de orden a


UNIVERSIDAD TECNICA FEDERICO SANTA MARIADEPARTAMENTO DE ELECTRONICAProgramación en PascalCapítulo <strong>17.</strong> Arreglos. <strong>Array</strong>.La <strong>es</strong>tructura <strong>arreglo</strong> de booleanos permite repr<strong>es</strong>entar la arquitectura de máquinas digital<strong>es</strong>.Por ejemplo:Una visualización de la memoria de <strong>un</strong> computador puede efectuarse con la siguiente<strong>es</strong>tructura de datos.const largopalabra = 16;capacidad = 65536; { 2^(largopalabra) }type palabra: array [1..largopalabra] of boolean;memoria: array [1..capacidad] of palabra;<strong>17.</strong>10.5. Ejercicios.<strong>17.</strong>10.5.1. Dado <strong>un</strong> <strong>arreglo</strong> "a" de "n" enteros, determinar si existen elementos igual<strong>es</strong>.Se dan cuatro posibl<strong>es</strong> solucion<strong>es</strong>, determinar si son correctas, y cuál <strong>es</strong> más eficiente.En caso de existir error, corregirlo.Solución a)hayigual<strong>es</strong>:=false;for i:=1 to n-1 dofor j:=i+1 to n dohayigual<strong>es</strong>:=a[i] = a[j];Solución b)hayigual<strong>es</strong>:=false;i:=1;repeatj:=1;repeatj:=j+1;hayigual<strong>es</strong>:=a[i]=a[j]<strong>un</strong>til (j=n) or hayigual<strong>es</strong>;i:=i+1<strong>un</strong>til (i=n) or hayigual<strong>es</strong>;Prof. Leopoldo Silva Bijit. 07-07-2003 209


UNIVERSIDAD TECNICA FEDERICO SANTA MARIADEPARTAMENTO DE ELECTRONICAProgramación en PascalCapítulo <strong>17.</strong> Arreglos. <strong>Array</strong>.Solución c)for i:=1 to n-1 dofor j:=i+1 to n doif a[i]=a[j]then beginhayigual<strong>es</strong>:=true;goto 1end;hayigual<strong>es</strong>:=false;1: ...Solución d)conj<strong>un</strong>to:=[];hayigual<strong>es</strong>:=false;i:=1;while (i


UNIVERSIDAD TECNICA FEDERICO SANTA MARIADEPARTAMENTO DE ELECTRONICAProgramación en PascalCapítulo <strong>17.</strong> Arreglos. <strong>Array</strong>.while el almacén no <strong>es</strong>té lleno dolea número entero;if el numero no <strong>es</strong>tá en el almacénthen ponga el número en el almacén.Debe notarse que la búsqueda en el almacén requiere inspeccionar los valor<strong>es</strong> yaalmacenados, para <strong>es</strong>to usaremos <strong>un</strong>a variable llamada inspector. Además la inspección deberealizarse d<strong>es</strong>de el inicio del almacén hasta la última posición en que se ha cargado <strong>un</strong> número;<strong>es</strong>ta posición también <strong>es</strong> variable (su valor cambia a medida que se ingr<strong>es</strong>an nuevos valor<strong>es</strong>).La última posición también queda definida por el próximo hueco en el <strong>arreglo</strong>; a <strong>es</strong>ta posiciónla llamaremos disponible.Gráficamente:almacén12 3 4 5nmax|inspectordisponibleLos programador<strong>es</strong> suelen llamar p<strong>un</strong>teros a las variabl<strong>es</strong> inspector y disponible, ya quepermiten ap<strong>un</strong>tar a component<strong>es</strong> <strong>es</strong>pecíficas. En Pascal se emplea el concepto de p<strong>un</strong>teropara referirse a variabl<strong>es</strong> que ap<strong>un</strong>tan a variabl<strong>es</strong> dinámicas. Como se sabe el <strong>arreglo</strong> <strong>es</strong> <strong>un</strong>a<strong>es</strong>tructura <strong>es</strong>tática, y <strong>es</strong> preferible denominar cursor<strong>es</strong> a las variabl<strong>es</strong> anterior<strong>es</strong>.Reflexionando sobre la situación, puede que la acción consiste en repetir <strong>un</strong> númerodeterminado de vec<strong>es</strong> la introducción de <strong>un</strong> número no pr<strong>es</strong>ente en las component<strong>es</strong>anterior<strong>es</strong>, lo cual sugiere que el primer verbo sea <strong>un</strong> for. Además puede emplearse laposición disponible para efectuar <strong>un</strong>a búsqueda con centinela.Entonc<strong>es</strong>, <strong>es</strong>cribiendo de nuevo la idea básica :for disponible:=1 to nmax dorepetirponer centinela;busqueda linealhasta que la busqueda falle.Prof. Leopoldo Silva Bijit. 07-07-2003 211


UNIVERSIDAD TECNICA FEDERICO SANTA MARIADEPARTAMENTO DE ELECTRONICAProgramación en PascalCapítulo <strong>17.</strong> Arreglos. <strong>Array</strong>.Poner el centinela, puede traducirse :read(numero); almacen[disponible]:=numero;Y la búsqueda lineal por:inspector:=1;while almacen[inspector] numero doinspector:=inspector+1;La condición de que el número no <strong>es</strong>té incluido en las component<strong>es</strong> anterior<strong>es</strong>, <strong>es</strong> que labúsqueda falle; <strong>es</strong> decir :inspector = disponibleImplementación.program llenaralmacen(input,output);const nmax=10;varnumero : integer;almacen : array[1..nmax] of integer;inspector,disponible : 1..nmax;beginfor disponible:=1 to nmax dorepeatread(numero); almacen[disponible]:=numero;inspector:=1;while almacen[inspector] numero doinspector:=inspector+1<strong>un</strong>til inspector=disponible;for inspector:=1 to nmax do writeln(almacen[inspector])end.Nót<strong>es</strong>e que los cursor<strong>es</strong> se han definido por subrango, para asegurarse que no se intentaránacc<strong>es</strong>os a posicion<strong>es</strong> inexistent<strong>es</strong> del <strong>arreglo</strong>. Esta debería ser <strong>un</strong>a práctica usual.R<strong>es</strong>ta agregar mensaj<strong>es</strong> y comentarios.Prof. Leopoldo Silva Bijit. 07-07-2003 212


UNIVERSIDAD TECNICA FEDERICO SANTA MARIADEPARTAMENTO DE ELECTRONICAProgramación en PascalCapítulo <strong>17.</strong> Arreglos. <strong>Array</strong>.Modificar el algoritmo para que almacene <strong>un</strong> número sólo si éste <strong>es</strong> mayor que todos losnúmeros ya almacenados.<strong>17.</strong>10.5.3. Palíndromos y cuadrados.Se d<strong>es</strong>ea encontrar números cuyos cuadrados sean palíndromos.Un palíndromo <strong>es</strong> <strong>un</strong>a palabra (o frase) que puede leerse de derecha a izquierda o al revés,con igual significado que al leerla de izquierda a derecha. Un ejemplo <strong>es</strong>: radar. En el caso denúmeros: 1, 121, 232 son números palíndromos; además 1 y 121 son cuadrados.En forma más precisa de d<strong>es</strong>ea generar <strong>un</strong>a lista de enteros, entre 1 y N, cuyos cuadradossean palíndromos.Solución.La primera versión <strong>es</strong>:..n:=0;repeatn:=n+1;generar cuadrado de n;if el cuadrado <strong>es</strong> palíndromothen writeln(n)<strong>un</strong>til n=N;..Es nec<strong>es</strong>ario disponer <strong>un</strong> <strong>es</strong>pacio para almacenar las cifras de <strong>un</strong> número. Emplearemos el<strong>arreglo</strong> b.varb : array [1..l] of integer;<strong>El</strong> largo de b, debe permitir repr<strong>es</strong>entar el número de cifras nec<strong>es</strong>arias para <strong>es</strong>cribir sqr(N).En <strong>es</strong>te <strong>es</strong>pacio podemos repr<strong>es</strong>entar las cifras decimal<strong>es</strong> del cuadrado, usando notacióndecimal posicional, mediante:j=l∑j−1n*n = b[ j]*10j=1Prof. Leopoldo Silva Bijit. 07-07-2003 213


UNIVERSIDAD TECNICA FEDERICO SANTA MARIADEPARTAMENTO DE ELECTRONICAProgramación en PascalCapítulo <strong>17.</strong> Arreglos. <strong>Array</strong>.Donde L <strong>es</strong> el número de cifras de n*n; debe ser:L


UNIVERSIDAD TECNICA FEDERICO SANTA MARIADEPARTAMENTO DE ELECTRONICAProgramación en PascalCapítulo <strong>17.</strong> Arreglos. <strong>Array</strong>.Se d<strong>es</strong>ea obtener :p = 2^i<strong>El</strong> mayor valor exacto de p <strong>es</strong>tá limitado por el máximo entero repr<strong>es</strong>entable; éste suele ser,precisamente, <strong>un</strong>a potencia de dos. Si se emplean 16 bits para <strong>un</strong> entero, el máximo prepr<strong>es</strong>entable será 32.768; para <strong>un</strong> exponente 15. Debe recordarse que <strong>un</strong> bit se emplea parael signo, en la repr<strong>es</strong>entación interna.Para repr<strong>es</strong>entar, en sistema decimal, <strong>un</strong> número p, se requiere <strong>un</strong> número de cifras dadopor :cifras = tr<strong>un</strong>c((log p) + 1)<strong>El</strong> logaritmo <strong>es</strong> en base 10.Si p <strong>es</strong> <strong>un</strong>a potencia de dos, el máximo exponente N produce <strong>un</strong> número que requiere :cifras = tr<strong>un</strong>c(log(2^N)+1) = tr<strong>un</strong>c(N*log2+1)Ejemplo. Si el máximo exponente <strong>es</strong> 32, se nec<strong>es</strong>itan:cifras = tr<strong>un</strong>c(32*0,30103+1) = 10Para producir potencias de dos con tantos dígitos como se d<strong>es</strong>ee, puede emplearse <strong>un</strong><strong>arreglo</strong> de dígitos para repr<strong>es</strong>entar la potencia. <strong>El</strong> <strong>tipo</strong> del <strong>arreglo</strong> puede ser entero y sudimensión debe ser tal que permita repr<strong>es</strong>entar las cifras nec<strong>es</strong>arias; <strong>es</strong>to dependerá delmáximo exponente de la potencia que se d<strong>es</strong>ee generar.Entonc<strong>es</strong>:var p: array[0..cifras] of integer;Un número de k cifras se repr<strong>es</strong>enta por la secuencia:p[k-1] p[k-2] ... p[0]<strong>El</strong> siguiente segmento <strong>es</strong>cribe <strong>un</strong> número como <strong>un</strong>a secuencia de caracter<strong>es</strong>, justificado porla derecha en <strong>un</strong> ancho dado por la constante cifras:... {<strong>es</strong>criba}i:=cifras;Prof. Leopoldo Silva Bijit. 07-07-2003 215


UNIVERSIDAD TECNICA FEDERICO SANTA MARIADEPARTAMENTO DE ELECTRONICAProgramación en PascalCapítulo <strong>17.</strong> Arreglos. <strong>Array</strong>.repeat i:=i-1; write(' ') <strong>un</strong>til i=k;repeat i:=i-1; write(chr(p[i]+ord('0'))) <strong>un</strong>til i=0;...Nót<strong>es</strong>e que cada p[i] debe mantenerse entre 0 y 9.La parte <strong>es</strong>encial del algoritmo consiste en obtener la siguiente potencia de dos, a partir dela anterior. Si se asume que la potencia actual ocupa k cifras, puede plantearse :... {multiplica}for i:=0 to k-1 dobegint:=2*p[i]+r<strong>es</strong>erva;if t>=10thenbegin p[i]:=t-10; r<strong>es</strong>erva:=1 endelsebegin p[i]:=t; r<strong>es</strong>erva:=0 endend;if r<strong>es</strong>erva>0then begin p[k]:=1; k:=k+1 end;...Se multiplican todas las cifras por dos, manteniendo éstas entre 0 y 9. Para <strong>es</strong>to se empleala variable r<strong>es</strong>erva. Si existe r<strong>es</strong>erva final, el número crece en <strong>un</strong>a cifra.Las siguient<strong>es</strong> líneas generan <strong>un</strong>a tabla de potencias de dos, hasta lograr la potencia deexponente N....p[0]:=1; k:=1;for j:=1 to N dobeginr<strong>es</strong>erva:=0;multiplica;<strong>es</strong>criba;writeln(j:6)end;...Prof. Leopoldo Silva Bijit. 07-07-2003 216


UNIVERSIDAD TECNICA FEDERICO SANTA MARIADEPARTAMENTO DE ELECTRONICAProgramación en PascalCapítulo <strong>17.</strong> Arreglos. <strong>Array</strong>.b) Potencias negativas.En caso de potencias negativas, éstas tienen parte entera igual a cero, y <strong>un</strong> número de cifrasdecimal<strong>es</strong> igual al módulo del exponente. Además, la última cifra decimal siempre <strong>es</strong> 5.Sea:var p : array[1..cifras] of integer;Para k cifras decimal<strong>es</strong>, puede generarse la siguiente, mediante:... {divide}r<strong>es</strong>to:=0;for i:=1 to k-1 dobeginr<strong>es</strong>to:=10*r<strong>es</strong>to+p[i]; p[i]:=r<strong>es</strong>to div 2;r<strong>es</strong>to:=r<strong>es</strong>to mod 2end;p[k]:=5;...Y la <strong>es</strong>critura, se logra:... {<strong>es</strong>criba}write(k:6); write(' 0,');for i:=1 to k do write(chr(p[i]+ord('0')));writeln;...Para generar <strong>un</strong>a tabla:for k:=1 to N dobegin divide; <strong>es</strong>criba end;<strong>17.</strong>10.5.5. Ejercicio.Prof. Leopoldo Silva Bijit. 07-07-2003 217


UNIVERSIDAD TECNICA FEDERICO SANTA MARIADEPARTAMENTO DE ELECTRONICAProgramación en PascalCapítulo <strong>17.</strong> Arreglos. <strong>Array</strong>.D<strong>es</strong>arrollar <strong>un</strong> programa que inicie <strong>un</strong> <strong>arreglo</strong> de char con los caracter<strong>es</strong> gráficos del códigoascii en orden d<strong>es</strong>cendente. Luego debe <strong>es</strong>cribirse el <strong>arreglo</strong> generado en la pantalla. D<strong>es</strong>puéshay que ordenar los caracter<strong>es</strong> en forma ascendente. Finalmente debe volver a <strong>es</strong>cribirse el<strong>arreglo</strong> ordenado, en la pantalla.Prof. Leopoldo Silva Bijit. 07-07-2003 218

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!