Beruflich Dokumente
Kultur Dokumente
=
=
1
2 ) ( , donde N=20
Print: Suma
INICIO
FIN
For i = 1 ---> N
Suma = 0
Leer: x
Suma = Suma + (2 * i * x)
N = 20
Crear un programa que resuelva la siguiente
ecuacin
x i x f
N
i
=
=
1
3 ) (
, donde N=9
Print: P
INICIO
FIN
For i = 1 ---> N
P = 1
Leer: x
P = P * (3 * i * x)
N = 9
Configuracin LEER HASTA QUE
En esta configuracin, tpicamente utilizamos un bucle
condicional, por ejemplo, el bucle WHILE parece ser el
ms adecuado
Este tipo de bucle podemos usarlo cuando tratemos de
realizar mens que se muestran y que luego se ocultan
para ejecutar alguna opcin seleccionada por el
usuario.
WHILE
C <> "0"
Print: "Hola"
INICIO
FIN
Leer: C
Leer: C
Otras instrucciones
Universidad Nacional de Andahuaylas - UNAJMA Algoritmos y Estructura de Datos I
Ingeniera de Sistemas Docente: Ing. Edwin Ramos Velsquez
29
Introduccin a la programacin
ESQUEMA DE LA MEMORIA
Todo dato o variable que se define en un diagrama, en un seudocdigo, o un programa,
ocupan una posicin de memoria. Lgicamente se entiende como celdas o casilleros.
Figura. Cada variable almacena su informacin en una celda de memoria
FORMAS DE ALMACENAMIENTO
La generalidad de lenguajes de almacenamiento manejan tipos de datos bsicos: Enteros,
reales, cadenas y caracteres. La diferenciacin entre ellos, se debe a la estructura de
almacenamiento que posee cada uno de ellos. Por ejemplo, en C, los tipos char y unsigned
char se almacenan en la forma de un byte (8 bits), los tipos int o enteros en 2 bytes (12 bites);
los tipos float o nmeros reales se almacenan en 4 bytes (32 bites). Es decir, cada uno de los
tipos de datos se almacenan con una estructura diferente. Los tipos de datos bsicos en C y
Pascal son los siguientes:
Tipo Longitud Rango
Unsigned char
char
enum
unsigned int
short int
int
unsigned long
long
float
double
long double
8 bits
8 bits
16 bits
16 bits
16 bits
16 bits
32 bits
32 bits
32 bits
64 bits
80 bits
0 a 255
-128 a 127
-32,768 a 32,767
0 a 65,535
-32,768 a 32,767
-32,768 a 32,767
0 a 4,294,967,295
-2,147,483,648 a 2,147,483,647
3.4 * (10**-38) a 3.4 * (10**+38)
1.7 * (10**-308) a 1.7 * (10**+308)
3.4 * (10**-4932) a 1.1 * (10**+4932)
Figura. Formas de almacenamiento de tipos de datos bsicos en C++
Tipo Longitud Rango
Shortint
Integer
Longint
Byte
Word
Boolean
WordBool
LongBool
ByteBool
con signo 8-bit
con signo 16-bit
con signo 32-bit
sin signo 8-bit
sin signo 16-bit
8 bits (tamao de Byte)
16 bits (tamao de Word)
32 bits (tamao de Longint)
8 bits (tamao de Byte)
-128 a 127
-32768 a 32767
-2147483648 a 2147483647
0 a 255
0 a 65535
s, no
s, no
s, no
s, no
Figura. Formas de almacenamiento de tipos de datos bsicos en Pascal
N I R A Posiciones de memoria
Universidad Nacional de Andahuaylas - UNAJMA Algoritmos y Estructura de Datos I
Ingeniera de Sistemas Docente: Ing. Edwin Ramos Velsquez
30
Introduccin a la programacin
VECTORES
Cuando se tiene una sucesin de valores que representan un conjunto de datos homogeneos,
como por ejemplo peso, tamao, edad, etc., se permite expresar esta sucesin de valores con
un subndice.
Ejemplo:
Sean las edades de 4 personas, 18, 19, 31 y15, se puede usar una sola variable, pero con un
subndice, de la siguiente forma:
A(1) = 18 Edad de la primera persona
A(1) = 19 Edad de la segunda persona
A(1) = 31 Edad de la tercera persona
A(1) = 15 Edad de la cuarta persona
En forma general, diremos que la variable A(i) indica para este caso, la edad correspondiente a
la 1, 2, 3 y 4 persona segn el valor de i. Sabiendo que i puede tomar cualquiera de los
siguientes valores: 1, 2, 3 4.
DEFINICION DE VECTORES (Matemtica)
Definiremos un vector como un conjunto ordenado de valores que lo expresamos como A(i),
donde el subndice i indica el orden que ocupa el elemento dentro del conjunto.
Ejemplo:
Figura 2.1 Representacin de un arreglo de N elementos
SUMA DE VECTORES
Sean los vectores U y V (dos vectores) con igual nmero de elementos, la suma de los dos
vectores ( U + V ), es otro vector que tiene el mismo nmero de elementos y est expresado
como:
S ( i ) = U ( i ) + V ( i )
Un elemento de la suma es igual a la suma de los elementos correspondientes de U y V.
Ejemplo:
Dados los siguientes vectores U y V:
U = ( U ( 1), U( 2 ), U(3) )
V = ( V ( 1), V( 2 ), V(3) )
El vector suma ser: S = (S(1), S(2), S(3) )
Donde S(1) = U(1) + V(1)
S(2) = U(2) + V(2)
S(3) = U(3) + V(3)
Es decir,
S = ( S(1) = U(1)+ V(1), S(2) = U(2)+ V(2), S(3) = U(3)+ V(3) )
A = ( A (1), A (4), A (3), . . . , A (N) )
1 elemento
2 elemento
3 elemento
ensimo elemento
Universidad Nacional de Andahuaylas - UNAJMA Algoritmos y Estructura de Datos I
Ingeniera de Sistemas Docente: Ing. Edwin Ramos Velsquez
31
Introduccin a la programacin
A ( 3 )
Subndice, 3er elemento (posicin del arreglo)
Nombre de la variable
A ( 3 ) A ( i ) A ( 2 i + 3 )
Valor entero Variable entera
Expresin entera
si " i " es entero
VARIABLES CON UN SUBINDICE
(Arreglos unidimensionales)
Precisiones
1. Una forma de expresar los datos, era tratndolos como una sucesin de valores con un
mismo nombre de variable, pero afectndolo por un subndice. Ejemplo:
A(1) = 2
A(2) = 3
A(3) = 7
A(4) = 5
A(5) = 20
2. De estos valores, se dijo que forman parte de un vector A (Array unidimensional = arreglo
unidimensional).
3. Decimos que la variable A es un arreglo unidimensional y que es un conjunto de valores
que ocupan en la memoria de la memoria, posiciones consecutivas.
Por ejemplo: si tenemos A=( A(1), A(2), A(3), A(4), A(5) ) y B = ( B(1), B(2), B(3) ),
entonces los datos tomarn la siguiente disposicin en la memoria de la computadora:
Figura 2.2 Representacin de arrays bidimentsionales (matrices)
Observaciones
El subndice del arreglo indica la posicin (ordenamiento) de un elemento dentro
del vector.
El subndice puede ser un valor entero, una constante entera, una variable entera
expresiones que den (como resultado) valores enteros.
Los subndices no son parte del nombre de una variable subindizada.
A(1) A(2) A(3) A(4) A(5) B(1) B(2) B(3)
Vector
A
Vector
B
A ( i ) A ( k )
Es la misma variable
Universidad Nacional de Andahuaylas - UNAJMA Algoritmos y Estructura de Datos I
Ingeniera de Sistemas Docente: Ing. Edwin Ramos Velsquez
32
Introduccin a la programacin
A(1) A(2) A(3) A(4) A(5)
8 23 34 67 9
Ejemplos:
a) Si tenemos el vector A ( 2, 3, 7, 5, 20 )
A ( i ) para i = 2 tiene el valor A ( 3 ) = 7
A ( k ) para k = 2 tiene el valor A ( 3 ) = 7
b) Sean los vectores V ( 6, 8, 9, 4, 56, 78, 1 ) y Z ( 5, 7, 2, 88, 67)
V ( i ) para i = 3 tiene el valor V ( 3 ) = 9
Z ( k ) para k = 3 tiene el valor Z ( 3 ) = 2
LECTURA DE DATOS DE UN ARRAY UNIMENSIONAL
a) Dado que un array es una estructura de datos donde cada elemento ocupa una posicin
de memoria consecutiva de la forma A = ( A ( 1 ), A ( 2 ) , A ( 3 ), ... , A ( N ) ), podemos
referenciar individualmente a cada elemento del arreglo nicamente seleccionando el
ndice que hace mencin a la posicin que el elemento ocupa dentro del arreglo.
Ejemplo:
Se desea almacenar los siguientes datos: 8, 23, 34, 67, 9 en un arreglo A que puede
contener cinco elementos como mximo. Represente la forma en la cual estos datos
estaran almacenados en este arreglo.
Rpta:
b) Este arreglo puede ser expresado como una variable unidimensional, como:
A ( i ), para i = 1... 5
c) Para que los datos puedan ser guardados en memoria, deben ser ledos. Por consiguiente,
desarrollamos a continuacin el mdulo de lectura de los datos, utilizando la estructura de
control iterativa FOR.
EJEMPLO
Se leen notas de un alumno, las que se guardan en dos vectores: Notas Aprobadas (NA) y
Notas Desaprobadas (ND). Se pide mostrar en pantalla el vector de las NA y el vector de las
notas desaprobadas (ND). Supngase que se debe procesar un total de cinco notas.
Solucin:
Sean cinco las notas, entonces, N = 5
Sean las notas: 13, 09, 18, 15, 10
Entonces:
El vector de las notas aprobadas es: 13, 18, 15
El vector de las notas Desaprobadas es: 09, 10
INICIO
FIN
FOR i = 1 hasta N Hacer
Leer: N
Datos:
N= Nmero total de elementos
A ( i ) = Cada uno de los
elementos del array
Leer: A ( i )
Figura 2.3 Lectura de los
elementos de un arreglo de
N elementos
Universidad Nacional de Andahuaylas - UNAJMA Algoritmos y Estructura de Datos I
Ingeniera de Sistemas Docente: Ing. Edwin Ramos Velsquez
33
Introduccin a la programacin
Anlisis
a) Las notas deben ser ledas y almacenadas en un vector A ( i )
b) Se debe acceder a cada nota A ( i ) mediante un proceso iterativo, y verificar si es
nota aprobatoria o desaprobatoria.
Si A ( i ) > 10 (IF THEN)
* la nota es aprobatoria y se debe guardar en un vector NA(k)
Caso contrario (ELSE)
* la nota es desaprobatoria y se debe guardar en un vector ND(m)
c) Los subndices k y m son contadores (acumuladores de suma)
Figura 2.4 Algoritmo del ordenamiento de las notas de los alumnos
INICIO
FIN
k = 0
m = 0
IF
A(i)>10
k = k + 1
NA(k) = A (i )
m = m + 1
ND(m) = A (i )
FOR i = 1 hasta N Hacer
FOR i = 1 hasta N Hacer
FOR i = 1 hasta m Hacer
FOR i = 1 hasta k Hacer
Leer: N
Leer: A ( i )
Escribir NA ( i )
Escribir ND ( i )
SI NO
Universidad Nacional de Andahuaylas - UNAJMA Algoritmos y Estructura de Datos I
Ingeniera de Sistemas Docente: Ing. Edwin Ramos Velsquez
34
Introduccin a la programacin
CONCEPTOS BASICOS DE C++
Un programa C++ debe ajustarse a una estructura estndar.
#include<iostream.h>
#include<conio.h>
#define PI 3.1415;
#define true 1;
#define false 0;
int Area;
int sumar();
void operar();
void main()
{ int A,B,C;
int k, i;
// ...
cout<<"\n fin ...";
getch();
}
int sumar()
{ // ...
return 1;
}
void operar()
{
// ...
}
Archivos de cabecera
En esta seccin se coloca la referencia a los archivos en los cuales estn contenidos alguno de
los smbolos utilizados en el programa. Por ejemplo,
#include<iostream.h>
#include<conio.h>
...
...
...
Variables Globales
Constantes Globales
Archivos de cabecera (Libreras y/o archivos)
Declaracin de prototipos
Programa Principal
(Este procedimiento es obligatorio)
Implementacin de los prototipos
Universidad Nacional de Andahuaylas - UNAJMA Algoritmos y Estructura de Datos I
Ingeniera de Sistemas Docente: Ing. Edwin Ramos Velsquez
35
Introduccin a la programacin
ORDENAMIENTO
(Mtodo de la Burbuja)
El ordenamiento de datos es una tarea muy comn en el procesamiento de informacin. Uno
de los mtodos de ordenamiento ms utilizados es el mtodo de intercambio por burbuja, o
simplemente mtodo de la burbuja.
Explicacin del algoritmo
Sean los datos A(1), A(2), A(3), ... , A(N), se requiere ordenarlos de menor a mayor. El
procedimiento es el siguiente:
a) Se toma como elemento base de comparacin A(1), y lo comparo con el que est a su
costado, es decir, A(2) (para j =2).
* Si A(1) < A(2) entonces en A(1) se encuentra el nmero menor.
b) Se contina comparando el elemento base A(1) con el siguiente, es decir, con A(3)
(para k = 3)
Si A(1) < A(3) entonces en A(1) sigue estando el nmero menor.
Caso contrario se debe intercambiar
Luego, el proceso de comparacin contina comparando A(1) con A(4) para k=4, luego,
con A(5) para k=5; luego con A(6) para k=6, y finalmente con A(N) para k = N. Es decir,
las veces que sea necesario se realizarn los intercambios correspondientes.
c) Para la segunda serie de comparaciones, tomamos como elemento base A(2) (para i = 2)
y lo comparamos con A(3) (para k=3); con A(4) (para k=4); con A(5) (para k=5); hasta ....
con A(N) (para k=N)
d) Para la tercera serie de comparaciones, tomamos como elemento base A(3) (para i = 3) y
lo comparamos con A(4) (para k=4); con A(5) (para k=5); hasta .... con A(N) (para k=N)
e) Para la ltima serie de comparaciones se toma como elemento base A(N1) (para k=N
1); que se compara con A(N) para k=N.
A(1) A(2) A(3) A(N)
A(1) A(2) A(3) A(N)
a * b A(N)
b * a A(N)
a
........
Si A(1) < A(2) => en A(1) est el menor
........
Si A(1) < A(3) => en A(1) est el menor
caso contrario se debe intercambiar
........
Hacemos: T = A(1)
luego, A(1) = A(3)
luego, A(3) = T
Paso 3: Intercambio
........
Paso 1 :comparacin
Paso 2: comparacin
al terminar tendremos:
A(1)
A(2)
A(3)
A(1)
A(2) A(3)
T
T
Universidad Nacional de Andahuaylas - UNAJMA Algoritmos y Estructura de Datos I
Ingeniera de Sistemas Docente: Ing. Edwin Ramos Velsquez
36
Introduccin a la programacin
La comparacin genrica es:
Si A( i ) < A(k) entonces el menor est en A(i)
Caso contrario se intercambian los valores de la forma:
T = A(i)
A(i) = A(k)
A(k) = T
Donde i = 1 .... (N1)
K = i + 1 .... N
Figura 2.5 Algoritmo del mtodo de la burbuja
INICIO
Leer:
N
FIN
T = A [ i ]
A [ i ] = A [ k ]
A [ k ] = T
Imprimir:
A [ i ]
Leer:
A [ i ]
For i:=1 a N hacer
if
For i:=1 a N-1 hacer
For k:= i + 1 a N hacer
For i:=1 a N hacer
No S Mtodo de
la Burbuja
A(i)<A(k)
Guarda datos
en memoria
PSEUDOCODIGO
MetodoBurbuja (A:Array; N:Entero)
Para i = 1 hasta N 1 hacer
Para k = i + 1 hasta N hacer
Si A[i] > A[k] Entonces
Tem = A[i]
A[i] = A[k]
A[k] = Tem
{Fin del condicional SI}
{ Fin del bucle Para hasta}
{ Fin del bucle Para hasta }
DATOS:
N = Nmero total de elementos
A ( i ) = Cada uno de los elementos
del vector.
Universidad Nacional de Andahuaylas - UNAJMA Algoritmos y Estructura de Datos I
Ingeniera de Sistemas Docente: Ing. Edwin Ramos Velsquez
37
Introduccin a la programacin
Ejemplo:
Dado el siguiente arreglo, se desea realizar el ordenamiento de los datos de manera
ascendente: 34 25 5 6 7 9 12 30
Solucin:
Figura 2.6 Pasos secuenciales dados durante un proceso de ordenamiento usando el
mtodo de la burbuja
Primera iteracin: Se toma como pivot el primer elemento
A1 A2 A3 A4 A5 A6 A7 A8
Para k=2 tenemos: 34 25 5 6 7 9 12 30
Para k=3 tenemos: 25 34 5 6 7 9 12 30
Para k=4 tenemos: 5 34 25 6 7 9 12 30
Para k=5,6,7,8 ten.: 5 34 25 6 7 9 12 30
Segunda iteracin: Se toma como pivot el segundo elemento
A1 A2 A3 A4 A5 A6 A7 A8
Para k=3 tenemos: 5 34 25 6 7 9 12 30
Para k=4 tenemos: 5 25 34 6 7 9 12 30
Para k=5,6,7,8 ten.: 5 6 34 25 7 9 12 30
Tercera iteracin: Se toma como pivot el tercer elemento
A1 A2 A3 A4 A5 A6 A7 A8
Para k=4 tenemos: 5 6 34 25 7 9 12 30
Para k=5 tenemos: 5 6 25 34 7 9 12 30
Para k=6,7,8 tenem.: 5 6 7 34 25 9 12 30
Cuarta iteracin: Se toma como pivot el cuarto elemento
A1 A2 A3 A4 A5 A6 A7 A8
Para k=5 tenemos: 5 6 7 34 25 9 12 30
Para k=6 tenemos: 5 6 7 25 34 9 12 30
Para k=7,8 tenemos: 5 6 7 9 34 25 12 30
Quinta iteracin: Se toma como pivot el quinto elemento
A1 A2 A3 A4 A5 A6 A7 A8
Para k=6 tenemos: 5 6 7 9 34 25 12 30
Para k=7 tenemos: 5 6 7 9 25 34 12 30
Para k=8 tenemos: 5 6 7 9 12 34 25 30
Sexta iteracin: Se toma como pivot el sexto elemento
A1 A2 A3 A4 A5 A6 A7 A8
Para k=7 tenemos: 5 6 7 9 12 34 25 30
Para k=8 tenemos: 5 6 7 9 12 25 34 30
Setima iteracin: Se toma como pivot el setimo elemento
A1 A2 A3 A4 A5 A6 A7 A8
Para k=8 tenemos: 5 6 7 9 12 25 34 30
finalmente tenemos: 5 6 7 9 12 25 30 34
Universidad Nacional de Andahuaylas - UNAJMA Algoritmos y Estructura de Datos I
Ingeniera de Sistemas Docente: Ing. Edwin Ramos Velsquez
38
Introduccin a la programacin
DETERMINACION DEL MENOR Y MAYOR VALOR DE UN VECTOR
DETERMINACION DEL MENOR VALOR DE UN VECTOR
a) Si suponemos que el menor es el primer valor de un vector A. Entonces lo guardo en un
casillero MENOR (Es decir, MENOR = A(1)).
Figura 2.7 Disposicin de celdas para la determinacin del menor valor de un vector
b) Se compara MENOR con el siguiente valor, es decir, con A(2), para K =2
Si MENOR<A(2) entonces el menor es en A(1)
Caso contrario, se cambia el valor contenido en MENOR; es decir se hace
MENOR = A(2)
Figura 2.8 Intercambio de valores durante el
proceso de obtencin del menor valor de un vector
c) El proceso contina. Es decir, se compara MENOR con A(3) para k=3; luego con A(4) (
para k=4), y as sucesivamente hasta comparar con A(N) (para k=N)
El intercambio genrico se da de la siguiente forma:
Si MENOR < A ( k )
* el menor est en MENOR
Caso contrario
* Se realiza el cambio, haciendo MENOR = A (k)
donde: k = 1... N
DETERMINACION DEL MAYOR VALOR DE UN VECTOR
a) Si suponemos que el menor es el primer valor de un vector A. Entonces lo guardo en un
casillero MAYOR (Es decir, MAYOR = A(1)).
Figura 2.9 Disposicin de celdas para la determinacin del mayor valor de un vector
b) Se compara MAYOR con el siguiente valor, es decir, con A(2), para K =2
Si MAYOR<A(2) entonces el menor es en A(1)
Caso contrario, se cambia el valor contenido en MAYOR; es decir se hace
MAYOR = A(2)
MENOR
A(1) A(2) A(3) ..... A(N)
A (1)
MENOR A(1) A(2) A(3) ..... A(N)
MENOR < A(2) k=2
MENOR< A(3) k=3
MENOR< A(N) k=N
MAYOR
A(1) A(2) A(3) ..... A(N)
A (1)
Universidad Nacional de Andahuaylas - UNAJMA Algoritmos y Estructura de Datos I
Ingeniera de Sistemas Docente: Ing. Edwin Ramos Velsquez
39
Introduccin a la programacin
Figura 2.10 Intercambio de valores durante el
proceso de obtencin del mayor valor de un vector
c) El proceso contina. Es decir, se compara MAYOR con A(3) para k=3; luego con A(4) (
para k=4), y as sucesivamente hasta comparar con A(N) (para k=N)
El intercambio genrico se da de la siguiente forma:
Si MAYOR > A ( k )
* el mayor est en MAYOR
Caso contrario
* Se realiza el cambio, haciendo MAYOR = A (k)
donde k = 1... N
Figura 2.11 Algoritmo de obtencin del menor y el mayor valor de un arreglo(vector)
MAYOR A(1) A(2) A(3) ..... A(N)
MAYOR > A(2) k=2
MAYOR > A(3) k=3
MAYOR > A(N) k=N
INICIO
MENOR = A(1)
MAYOR = A(1)
IF
MENOR<A(k )
MENOR = A (k)
FOR k = 1 hasta N Hacer
IF
MAYOR>A(k )
MAYOR = A (k)
FIN
FOR k = 1 hasta N Hacer
Leer: N
Leer: A ( k )
SI
NO
SI
NO
Escribir:
El menor val or es: MENOR
El mayor val or es: MAYOR
Universidad Nacional de Andahuaylas - UNAJMA Algoritmos y Estructura de Datos I
Ingeniera de Sistemas Docente: Ing. Edwin Ramos Velsquez
40
Introduccin a la programacin
MATRICES
DEFINICION
Una matriz numrica es un cuadro de nmeros dispuestos en filas y en columnas. Lo
denotaremos simblicamente por A.
A = a
11
a
12
a
13
1 fila
a
21
a
22
a
23
2 fila
a
31
a
32
a
33
3 fila
1 columna 2 columna 3 columna
- Para el ejemplo anterior se ha definido una matriz A de 03 filas y 03 columnas.
- Cada nmero del cuadro anterior se llama elemento de la matriz. Su ubicacin est
determinado por dos subndices; en forma genrica se expresa por:
a
i , k
Subndice que indica la fila Subndice que indica la columna
Ejemplo:
A32 es el elemento que est en la 3 fila y 2 columna
A13 es el elemento que est en la 1 fila y 3 columna
A23 es el elemento que est en la 2 fila y 3 columna
A33 es el elemento que est en la 3 fila y 3 columna
A21 es el elemento que est en la 2 fila y 1 columna
ORDEN DE UNA MATRIZ
El nmero de filas y el nmero de columnas de una matriz, determinan el orden de la matriz, se
expresan por:
A M x N
Nmero total de filas Nmero total de columnas
Ejemplo
A 3 x 3 indica una matriz que tiene 3 filas y 3 columnas
A 2 x 3 indica una matriz que tiene 2 filas y 3 columnas
En forma desarrollada tendramos:
A 2 x 3 = a
11
a
12
a
13
a
21
a
22
a
23
TIPOS DE MATRICES
Matriz cuadrada
Es aquella matriz donde se cumple que:
Nmero de filas = Nmero de columnas
Es decir M = N
Ejemplo: A 3 x 3 , A 2 x 2, A 4 x 4 , A 7 x 7
Universidad Nacional de Andahuaylas - UNAJMA Algoritmos y Estructura de Datos I
Ingeniera de Sistemas Docente: Ing. Edwin Ramos Velsquez
41
Introduccin a la programacin
Matriz columna
Es la matriz que tiene una sola columna
Ejemplo: A 3 x 1 , A 2 x 1, A 4 x 1 , A 7 x 1
a
11
A 3 x 1 = a
21
a
31
Matriz Fila
Es la matriz que tiene una sola fila
Ejemplo: A 1 x 3 , A 1 x 2, A 1 x 4 , A 1 x 7
A 1 x 3 = a
11
a
12
a
13
IGUALDAD DE MATRICES
Si tenemos las matrices A y B, decimos que las matrices son iguales ( A = B) si son del mismo
orden y si los elementos correspondientes son iguales. Simblicamente se expresa como:
Si A = a
i j
B = b
i j
son dos matrices
Entonces A = B si a
i j
= b
i j
Ejemplo
Sean las matrices:
1 2 3 1 2 3
A 2x3 = 6 5 8 B 2x3 = 6 5 8
Como tenemos que:
a
11
= b
11
, a
12
= b
12
, a
13
= b
13
, a
21
= b
21
, a
22
= b
22
, a
23
= b
23
entonces podemos decir que A 2 x 3 = B 2 x 3
SUMA DE MATRICES
Sean A y B dos matrices del mismo orden, la sumatoria A + B es otra matriz C del mismo
orden, tal que:
c
i j
= a
i j
+ b
i j
se suman un elemento de A con el correspondiente elemento de B, para as determinar el
respectivo nuevo elemento de C.
Ejemplo:
Sean las siguientes matrices A y B
3 4 1 2
A 3x2 = 1 5 B 3x2 = 6 7
8 6 9 4
3 x2 3 x2
Universidad Nacional de Andahuaylas - UNAJMA Algoritmos y Estructura de Datos I
Ingeniera de Sistemas Docente: Ing. Edwin Ramos Velsquez
42
Introduccin a la programacin
3 4 1 2 (3 + 1) (4+2) 4 6
C = A + B = 1 5 + 6 7 = (1 + 6) (5+7) = 7 12
8 6 9 4 (8 + 9) (6 +4) 17 10
En forma genrica es posible escribir:
a
11
a
12
b
11
b
12
Sean A = a
21
a
22
y B = b
21
b
22
a
31
a
32
b
31
b
32
Entonces
c
11
= a
11
+ b
11
c
12
= a
12
+ b
12
C = A + B = c
21
= a
21
+ b
21
c
22
= a
22
+ b
22
c
31
= a
31
+ b
31
c
32
= a
32
+ b
32
donde
c
11
c
12
C = c
21
c
22
c
31
c
32
Universidad Nacional de Andahuaylas - UNAJMA Algoritmos y Estructura de Datos I
Ingeniera de Sistemas Docente: Ing. Edwin Ramos Velsquez
43
Introduccin a la programacin
VARIABLES CON DOS SUBINDICES
(ARREGLOS BIDIMENSIONALES)
Cuando se deba de almacenar y procesar datos que estn caracterizados por dos atributos, se
utilizarn variables con dos subndices.
Por ejemplo: El almacenamiento de las notas de varios alumnos correspondientes a varios
cursos:
Curso 1 Curso 2 Curso 3
Alumno 1 12 15 20
Alumno 2 11 13 16
Alumno 3 14 17 18
Alumno 4 09 10 07
Los arreglos bidimensionales se esquematizan bajo el modelo matemtico llamado matriz.
Expresaremos las variables bidimensionales con dos subndices:
Ejemplo: A (i,j)
Donde el subndice i es usado para indicar la fila, y el subndice j es usado para sealar la
columna donde se encuentra el elemento.
Una visualizacin del esquema de la memoria seran posiciones de memoria A(i,j)
dispuestas en forma de una tabla o cuadro.
Figura 2.12 Esquema de la memoria en donde
se almacenan los arreglos bidimensionales
Fsicamente las posiciones de memoria se implementan las unas a continuacin de las otras.
Figura 2.12 Esquema de la memoria en donde
se almacena un arreglo unidimensional
A(1,1) A(1,2) A(1,3) .....
A(2,1) A(2,2) A(2,3) .....
A(3,1) A(3,2) A(3,3) ....
A(1,1) A(1,2) A(1,3) A(2,1) ........... A(3,3)
Universidad Nacional de Andahuaylas - UNAJMA Algoritmos y Estructura de Datos I
Ingeniera de Sistemas Docente: Ing. Edwin Ramos Velsquez
44
Introduccin a la programacin
A(1,1) A(1,2) A(1,3)
A(2,1) A(2,2) A(2,3)
A(3,1) A(3,2) A(3,3)
5 8 9
A(1,1) A(1,2) A(1,3)
A(2,1) A(2,2) A(2,3)
A(3,1) A(3,2) A(3,3)
5 8 9
7 4 6
ALMACENAMIENTO EN MEMORIA PARA LAS
VARIABLES CON DOBLE SUBINDICE
ALMACENAMIENTO POR FILAS
De acuerdo a la visualizacin del esquema de la memoria, el almacenamiento puede ser por
filas.
EJEMPLO:
Sea la siguiente matriz, se desea almacenarla en memoria, describir un proceso de
almacenamiento en memoria por filas:
5 8 9
A = 7 4 6 NOTA: se almacenar en A = a
i,j
1 3 2
el procedimiento de almacenamiento por filas sera:
a) Para la 1 fila fijamos i=1
Y hacemos variar j (j = 1,2,3). As, se generan sucesivamente las posiciones de
memoria A(1,1), A(1,2) y A(1,3) y se guardan los valores respectivos en las columnas 1, 2
y 3 (es decir los valores 5, 8 y 9 respectivamente)
b) Para la 2 fila fijamos i=2
Y hacemos variar j (j = 1,2,3). As, se generan sucesivamente las posiciones de
memoria A(2,1), A(2,2) y A(2,3) y se guardan los valores respectivos en las columnas 1, 2
y 3 (es decir los valores 7, 4 y 6 respectivamente)
c) Para la 3 fila fijamos i =3
Y hacemos variar j (j = 1,2,3). As, se generan sucesivamente las posiciones de
memoria A(3,1), A(3,2) y A(3,3) y se guardan los valores respectivos en las columnas 1, 2
y 3 (es decir los valores 1, 2 y 3 respectivamente)
A(1,1) A(1,2) A(1,3)
A(2,1) A(2,2) A(2,3)
A(3,1) A(3,2) A(3,3)
5 8 9
7 4 6
1 3 2
Figura 2.13
Figura 2.14
Figura 2.15
Universidad Nacional de Andahuaylas - UNAJMA Algoritmos y Estructura de Datos I
Ingeniera de Sistemas Docente: Ing. Edwin Ramos Velsquez
45
Introduccin a la programacin
ALGORITMO DEL ALMACENAMIENTO POR FILAS
Para este caso, definiremos las variables a utilizar:
M = Nmero total de filas de la matriz
N = Nmero total de columnas de la matriz
i = variable temporal, tal que i= 1..M
j = variable temporal, tal que j= 1..N
A(i,j) = la matriz
a
11
a
12
... a
1j
.... a
1N
a
21
a
22
... a
2j
.... a
2N
a
31
a
32
... a
3j
.... a
3N
A = A
i,j
= ... ... ... ... .... ...
a
i1
a
i2
... a
ij
.... a
iN
... ... ... ... .... ...
a
M1
a
M2
... a
Mj
.... a
MN
MxN
Figura 2.16 Matriz de grado MxN
Mostraremos un mdulo de lectura de datos utilizando dos estructuras de control FOR, la
exterior para el caso de las filas y el FOR interior para el cambio de columnas
Figura 2.17 Algoritmo de lectura de los elementos de una Matriz de grado MxN
INICIO
FIN
FOR i = 1 hasta M Hacer
FOR j = 1 hasta N Hacer
Leer A(i,j)
Universidad Nacional de Andahuaylas - UNAJMA Algoritmos y Estructura de Datos I
Ingeniera de Sistemas Docente: Ing. Edwin Ramos Velsquez
46
Introduccin a la programacin
OPERACIONES CON MATRICES: SUMA DE MATRICES
EJEMPLO
Calcular la suma de la matriz A mas la matriz B y almacenar el resultado en la matriz C (es
decir, hacer C = A + B)
Anlisis
La suma de matrices es un proceso iterativo donde la matriz suma C = A + B est definido
por:
C(i,j) = A(i,j) + B(i,,j)
Donde:
M = Nmero total de filas
N = Nmero total de columnas
i = 1...M
j = 1...N
Figura 2.18 Algoritmo de suma de dos matrices A y B de grado MxN
INICIO
FIN
1
1
C(i,j) = A(i,j)+ B(i,j)
FOR i = 1 hasta M Hacer
FOR j = 1 hasta N Hacer
Leer A(i,j)
FOR i = 1 hasta M Hacer
FOR j = 1 hasta N Hacer
Leer A(i,j)
FOR j = 1 hasta N Hacer
FOR i = 1 hasta M Hacer
FOR j = 1 hasta N Hacer
Escribir C(i,j)
FOR i = 1 hasta M Hacer
Universidad Nacional de Andahuaylas - UNAJMA Algoritmos y Estructura de Datos I
Ingeniera de Sistemas Docente: Ing. Edwin Ramos Velsquez
47
Introduccin a la programacin
TAREA:
Implemente un programa que realice la suma de dos matrices y el resultado sea almacenado
en una tercera matriz (es decir, hacer C = A + B)
La pantalla debe parecerse a la siguiente:
SUMA DE MATRICES
Ingrese el nmero total de filas : ___ 2
Ingrese el nmero total de columnas: ___ 2
Ingresa la primera matriz
2 4
5 7
Ingresa la segunda matriz
3 5
9 1
Resultados:
La matriz suma es:
5 9
14 8
** Fin del proceso **
#include <iostream.h>
#include <conio.h>
typedef int TMatriz[20][20];
void main()
{ TMatriz A, B, C;
int M,N;
int i,j;
cout<<" SUMA DE MATRICES\n";
cout<<"Ingrese el numero total de filas :"; cin>>M;
cout<<"Ingrese el numero total de columnas : "; cin>>N;
/* INGRESO DE LA PRIMERA MATRIZ */
cout<<"Ingrese la primera Matriz (Matriz A) \n";
for (i=1;i<=M;i++)
for (j=1;j<=N;j++)
{cout<<"A["<<i<<","<<j<<"] :";
cin>>A[i][j];
}
/* INGRESO DE LA SEGUNDA MATRIZ */
cout<<"Ingrese la segunda Matriz (Matriz B) \n";
for (i=1;i<=M;i++)
for (j=1;j<=N;j++)
{cout<<"B["<<i<<","<<j<<"] :";
cin>>B[i][j];
}
/* PROCESO MATEMATICO : C = A + b */
for (i=1;i<=M;i++)
for (j=1;j<=N;j++)
C[i][j]= A[i][j] + B[i][j];
/* PRESENTACION DE RESULTADOS*/
cout<<"\n RESULTADOS:";
cout<<"\n La matriz suma es:";
for (i=1;i<=M;i++)
{ cout<<endl;
for (j=1;j<=N;j++) cout<<C[i][j]<<" ";
}
cout<<"\n ** FIN DEL PROCESO **";
getch();
}
Figura 2.19 Programa de suma de dos matrices A y B de grado MxN
Universidad Nacional de Andahuaylas - UNAJMA Algoritmos y Estructura de Datos I
Ingeniera de Sistemas Docente: Ing. Edwin Ramos Velsquez
48
Introduccin a la programacin
RECURSIVIDAD
La recursin es un instrumento muy til en programacin. El problema de cmo se efecta
realmente en una computadora, ha de distinguirse con demasiado cuidado de lo referente al
uso de la recursin en el diseo y anlisis de algoritmos. En la fase de diseo, en la fase de
diseo, emplearemos todos los mtodos de solucin de problemas que resulten apropiados, y
la recursin es una de las herramientas ms flexibles y potentes. En la fase de implantacin
puede que necesitemos preguntar cul de los mtodos es el ms adecuado en las
circunstancias presentes. Se dispone de dos tcnicas por lo menos para realizar la recursin
en los sistemas de computacin.
Un subprograma que se llama a s mismo se dice que es recursivo.
La recursin puede darse de dos maneras diferentes:
a) Directa: el subprograma se llama directamente a s mismo. Por ejemplo, observe que en
la figura 2.1 P es un subprograma y en alguna parte de l aparece una llamada a s
mismo.
b) Indirecta: el subprograma llama a otro subprograma, y ste a su vez llama al primero. Por
ejemplo, en la figura 2.2 (a) el subprograma P llama al subprograma Q y ste a su vez
invoca al primero; es decir, el control regresa a P. Tambin se da la recursin indirecta
cuando un subprograma llama a otro y ste a un tercero. Una vez ejecutado, el control
regresa al subprograma que lo llamo, lo mismo sucede en todos los niveles. Por ejemplo,
en la figura 2.2 (b) el subprograma P llama al subprograma Q, y este llama al subprograma
V. Cuando V concluye, el control regresa a Q; y al terminar este, el control se transfiere a
P.
En toda definicin recursiva de un problema debe establecerse un estado bsico. Es decir, un
estado en el cual la solucin no se presenta de manera recursiva, sino directamente. Adems
la entrada (datos) del problema debe ir acercndose al estado bsico.
- - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
L l a m a d a a P
- - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - -
S u b p r o g r a m a P
Figura 3.1 Recursin directa
S u b p r o g r a m a P
S u b p r o g r a m a Q
L l a m a d a a Q
L l a m a d a a P
S u b p r o g r a m a P
L l a m a d a a Q
S u b p r o g r a m a Q
L l a m a d a a V
S u b p r o g r a m a V
( a )
( b )
Figura 3.2
Recursin
Directa
Universidad Nacional de Andahuaylas - UNAJMA Algoritmos y Estructura de Datos I
Ingeniera de Sistemas Docente: Ing. Edwin Ramos Velsquez
49
Introduccin a la programacin
EJEMPLOS DE RECURSION
Factorial de un nmero
El factorial de un nmero entero positivo n se define como el producto de los nmeros
comprendidos entre 1 y n. La expresin n! Simboliza el factorial de n.
Por definicin:
0! = 1
1! =1
2! = 1 x 2 = 2
3! = 1 x 2 x 3 = 6
4! = 1 x 2 x 3 x 4 = 24
.
.
n! = 1 x 2 x 3 x 4 x ....... x (n - 1) x n
Esto tambin pudo haberse escrito
Factorial(0) = 1
Factorial(1) = 1 * Factorial(0)
Factorial(2) = 2 * Factorial(1)
Factorial(3) = 3 * Factorial(2)
Factorial(4) = 4 * Factorial(3)
Generalizando obtenemos la ecuacin recursiva:
Factorial(N)=N * Factorial(N 1)
Algoritmo de factorial
Este algoritmo calcula el factorial de un nmero N, donde N es un valor numrico entero
positivo o cero. Se hace uso de la ecuacin recursiva. El algoritmo de factorial aplicando
recursin es:
Factorial(N: Entero)
Si N = 0
Entonces
Hacer Factorial = 1;
Sino
Hacer Factorial = N x Factorial(N-1) //Llamada recursiva
Fin del condicional
Figura 3.3 Algoritmo de obtencin del factorial de un nmero
Serie de Fibonacci
La conocida serie de Fibonacci es: 0, 1, 1, 2, 3, 5, 8, 13, 21 , ....., etc. Recurdese que el
Fibonacci de un nmero se obtiene de la suma de los dos nmero Fibonacci anteriores.
A continuacin se ilustra el concepto de nmeros Fibonacci.
Fibonacci(0) = 0
Fibonacci(1) = 1
Fibonacci(2) = Fibonacci(1) + Fibonacci(0) = 1 + 0 = 1
Fibonacci(3) = Fibonacci(2) + Fibonacci(1) = 1 + 1 = 2
Fibonacci(4) = Fibonacci(3) + Fibonacci(2) = 2 + 1 = 3
Fibonacci(5) = Fibonacci(4) + Fibonacci(3) = 3 + 2 = 5
Lo cual puede generalizarse a
Fibonacci(N) = Fibonacci(N1) + Fibonacci(N 2)
Universidad Nacional de Andahuaylas - UNAJMA Algoritmos y Estructura de Datos I
Ingeniera de Sistemas Docente: Ing. Edwin Ramos Velsquez
50
Introduccin a la programacin
Algoritmo de la serie de Fibonacci
Este algoritmo calcula el nmero Fibonacci correspondiente a N, donde N es un valor numrico
entero positivo o cero
Fibonacci(N:Entero)
Si (N=0) (N=1)
Entonces
Hacer Fibonacci = N //Estado bsico
Si no
Hacer Fibonacci = Fibonacci(N-1) + Fibonacci(N-2)
// Llamada recursiva
Fin del condicional
Figura 3.4 Algoritmo de obtencin de un nmero Fibonacci
En general, una versin no recursiva de un programa ser ejecutada ms eficientemente en
trminos de tiempo y espacio que una versin recursiva. Esto se debe a que la sobrecarga
comprendida al entrar y salir de un bloque es eliminada en la versin no recursiva. Sin
embargo, vemos que algunas veces una solucin recursiva es la ms natural y lgica para
resolver algn problema. Por lo tanto, se nos presenta un conflicto entre la eficiencia de la
mquina y la eficiencia del programador. Teniendo en cuenta que el costo de programacin
aumenta contnuamente y el costo de la computacin disminuye, hemos llegado al punto en el
cual en muchos casos no se justifica gastar tiempo de programacin para construir una
solucin que sea no recursiva a un problema que puede ser resuelto en forma ms natural a
travs de un sistema recursivo.
Universidad Nacional de Andahuaylas - UNAJMA Algoritmos y Estructura de Datos I
Ingeniera de Sistemas Docente: Ing. Edwin Ramos Velsquez
51
Introduccin a la programacin
DIVIDIR PARA REINAR
Una forma comn de resolver un problema consiste en dividirlo en dos o ms subproblemas,
cada uno semejante al problema original pero de menores dimensiones. Se obtiene
posteriormente la solucin para estos subproblemas y finalmente se combinan para producir la
solucin final del problema inicial.
Esta tcnica consiste bsicamente en descomponer un programa grande en submdulos, y
stos a su vez en otros submdulos.
En pginas anteriores le hemos dado una mayor explicacin a esta idea, por lo cual
obviaremos ms comentarios.
PROBLEMA: Las torres de Hanoi
9
Este famoso juego (y/o acertijo que a continuacin se describe) va ha permitir aplicar la tcnica
divide y vencers en la resolucin de un problema. El juego dispone de tres postes A, B, C.
En el poste A se encuentran n discos de tamao decreciente. El objetivo del juego es mover
uno a uno los discos desde el poste A al poste C utilizando el poste B como auxiliar. Adems,
existe una restriccin, nunca podr haber un disco de mayor radio encima de otro de menor
radio.
Vamos a plantear la solucin de tal forma que el problema se vaya dividiendo en problemas
ms pequeos, y a cada uno de ellos aplicarles la misma solucin. En lenguaje natural lo
podemos expresar as:
1. El problema de mover n discos de A a C consiste en:
Mover los n 1 discos superiores de A a B
Mover el disco n de A a C
Mover los n 1 discos de B a C
Un problema de tamao n ha sido transformado en un problema de tamao n 1. A su
vez, cada problema de tamao n 1 se transforma en otro de tamao n 2 (empleando
el poste libre como auxiliar).
2. El problema de mover los n 1 discos de A a B consiste en:
Mover los n 2 discos superiores de A a C
Mover el disco n-1 de A a B
Mover los n 2 discos de C a B
De este modo se va progresando, reduciendo cada vez un nivel la dificultad del problema
hasta que el mismo slo consista en mover un solo disco. La tcnica consiste en ir
intercambiando la finalidad de los postes, ORIGEN, DESTINO y AUXILIAR. La condicin
de terminacin es que e nmero de discos sea 1. Cada accin de mover un disco realiza
los mismos pasos, por lo que puede ser expresada de manera recursiva.
9
Luis Joyanes Aguilar, Estructura de datos, pp. 267-268
A
B
C
Figura 3.5 Problema de las torres de
Hanoi. Hay tres postes, el poste A tiene
N platillos. Se deben pasar todos los
platillos, uno a uno hacia el poste V.
Las restricciones son las siguientes:
Los platillos de la parte superior son ms
pequeos que los de la parte inferior. Se
puede usar el poste C como un poste
temporal.
Universidad Nacional de Andahuaylas - UNAJMA Algoritmos y Estructura de Datos I
Ingeniera de Sistemas Docente: Ing. Edwin Ramos Velsquez
52
Introduccin a la programacin
El procedimiento recursivo puede ser escrito como se describe a continuacin:
Procedure TorresH(N:Integer; A,B,C: Char);
Procedure Movimiento(N:Integer; A,C: Char);
Begin
Writeln(Mover disco , N, de , A, a ,C);
End;
Begin
If N=1
Then Movimiento (N, A, C)
Else Begin
TorresH(N-1, A, C, B);
Movimiento(N, A, C)
TorresH(N-1, B, A, C);
End;
End;
Figura 3.6 Algoritmo recursivo que resuelve el problema de las Torres de Hanoi
EJEMPLO DE ALGORITMO RECURSIVO
10
Para ejemplificar la tcnica de recursin utilizaremos un caso imaginario. Se dispone de una
caja dentro de la cual hay seguramente una bolilla de algn color y posiblemente otra caja con
las mismas caractersticas. La tarea es examinar todas las cajas hasta encontrar una bolilla
blanca. Para ello es necesario comenzar la tarea abriendo la caja exterior y viendo el color de
la bolilla; si es blanca, informar el xito, si no, ver si hay otra caja adentro; si hay otra caja
adentro, examinarla como la actual, si no, informar que no se ha encontrado la bolilla buscada.
Finalmente, terminar la tarea cerrando la caja.
Como se ve, el fin del proceso ocurre cuando se encuentra una bolilla blanca o bien cuando no
hay ms cajas para examinar. Obsrvese que ambas verificaciones forman parte del cuerpo
principal de acciones y se realizan cuando stas estn an inconclusas (en este caso, antes de
cerrar la caja). Si nos representamos mentalmente este algoritmo, vemos que se avanza
abriendo una caja tras otra -y dejndolas abiertas- hasta llegar a una en la que se da la
condicin de fin (se hall la bolilla o no hay otra caja adentro). En ese momento no se abren
ms cajas y se completan los procedimientos pendientes cerrando las cajas en el orden inverso
en que fueron abiertas. Este desarrollo hacia adentro es tpico de los algoritmos recursivos.
El siguiente programa en C simula el problema de las cajas informando que se encontr una
bolilla blanca o, el fracaso de la misin. La funcin auxiliar llenar_cajas() recibe como
parmetro un vector de cajas "vacas" y su tamao, y recorre iterativamente todas las cajas
dndole un "color" aleatorio a cada bolilla y "metiendo" cada caja dentro de la anterior. La
funcin principal buscar_bolilla() recibe como parmetros un apuntador a una caja y un
nmero de orden y revisa recursivamente las cajas interiores hasta dar con la bolilla blanca o
encontrarse con que no hay ms cajas.
En la pgina siguiente se muestra el cdigo fuente de este programa.
10
Este ejemplo est disponible en la Web. Si desea ms informacin, le informamos que este ejemplo fue
descargado desde la siguiente direccin Web :
http://www.algoritmica.com.ar/cgi-bin/framed/2675/alg/ord/ordbus.htm
Universidad Nacional de Andahuaylas - UNAJMA Algoritmos y Estructura de Datos I
Ingeniera de Sistemas Docente: Ing. Edwin Ramos Velsquez
53
Introduccin a la programacin
/* BOLILLA.CPP */
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#define CANT_CAJAS 5
enum Color // Enumeracin de los colores.
{ VERDE, BLANCO, ROJO, AZUL };
struct Caja // Estructura que representa una caja.
{
int bolilla; // bolilla es igual a uno de los "colores".
Caja *caja; // El apuntador caja representa la caja interior.
}; // Cuando no hay ninguna caja interior, caja es nulo.
void llenar_cajas (Caja *c, int cant);
void buscar_bolilla (Caja *c, int orden);
void llenar_cajas (Caja *c, int cant) // Funcin iterativa.
{
c->bolilla = random (4); // La funcin random (num) retorna un
while (--cant) // nmero aleatorio entre 0 y num - 1
(en
{ // este caso, entre 0 y 3).
c->caja = c + 1; // La caja interior apunta a la siguiente.
(++c)->bolilla = random (4);
}
c->caja = 0; // La ltima caja no apunta a ninguna.
}
void buscar_bolilla (Caja *c, int orden) // Funcin recursiva.
{
printf ("Abriendo caja %d\n", orden); // En principio se "abre" esta
caja.
if (c->bolilla == BLANCO) // Si se encuentra una bolilla
printf ("\tHallada bolilla blanca\n"); // blanca, se informa el xito.
else // Si la bolilla no es blanca:
if (c->caja) // si hay una caja interior la
buscar_bolilla (c->caja, orden + 1); // funcin se llama a s misma,
else // si no, se informa que no hay
printf ("\t No hay ms cajas\n"); // ms cajas.
printf ("Cerrando caja %d\n", orden); // Finalmente se "cierra" esta
caja.
}
/* PROGRAMA PRINCIPAL */
int main ()
{
Caja cajas [CANT_CAJAS]; // Vector de cajas vacas.
clrscr ();
randomize (); // La funcin randomize () inicializa la
// secuencia de nmeros aleatorios.
llenar_cajas (cajas, CANT_CAJAS);
buscar_bolilla (cajas, 1);
return 0;
}
Figura 3.7 Programa en donde se utiliza la recursividad para resolver un problema
Universidad Nacional de Andahuaylas - UNAJMA Algoritmos y Estructura de Datos I
Ingeniera de Sistemas Docente: Ing. Edwin Ramos Velsquez
54
Introduccin a la programacin
TOPICOS DE PROGRAMACION
DISEO DESCENDENTE
Cuando se escriben programas de tamao y complejidad moderada, nos enfrentamos a la
dificultad de escribir dichos programas. La solucin para resolver estos problemas y,
naturalmente, aquellos de mayor tamao y complejidad, es recurrir a la modularidad mediante
el diseo descendente. Qu significa diseo descendente?
La filosofa del diseo descendente, reside en que se descompone una tarea en sucesivos
niveles de detalle. Para ello se divide el programa en mdulos independientes
(procedimientos, funciones y otros bloques de cdigo), como se observa en la figura 3.8.
Figura 3.8 Un programa dividido en mdulos independientes
El concepto de solucin modular se aprecia en la aplicacin de la figura 1.2, que busca
encontrar la nota media de un conjunto de notas de una clase de informtica. Existe un mdulo
del ms alto novel que se va refinando en sentido descendente para encontrar mdulos
adicionales ms pequeos. El resultado es una jerarqua de mdulos: cada mdulo se refina
por los de bajo nivel que resuelve problemas ms pequeos y contiene ms detalles sobre los
mismos. El proceso de refinamiento contina hasta que los mdulos de nivel inferior de la
jerarqua sean tan simples como para traducirlos directamente a procedimientos, funciones y
bloques de cdigo en Pascal o C, que resuelven problemas independientes ms pequeos. De
hecho, cada mdulo de nivel ms bajo debe ejecutar una tarea bien definida. Estos mdulos
se denominan altamente cohesivos.
Cada mdulo se puede dividir en subtareas. Por ejemplo, se puede refinar la tarea de leer las
notas de una lista, dividindolo en subtareas. Por ejemplo, se puede refinar la tarea de leer
las notas de la lista en otras dos subtareas: pedir al usuario una nota y situar la nota en la lista.
ABSTRACCION PROCEDIMENTAL
Cada algoritmo que resuelve el diseo de un mdulo equivale a una caja negra que ejecuta
una tarea determinada. Cada caja negra especifica lo que hace, pero no cmo lo hace, y de
igual modo cada caja negra conoce cuantas cajas negras existen y lo que hacen
Normalmente, estas cajas negras se implementan como subprogramas. Una abstraccin
procedimental separa el propsito de un subprograma de su implementacin. Una vez que un
subprograma se haya escrito o codificado, se puede usar sin necesidad de conocer su cuerpo y
basta con su nombre y una descripcin de sus parmetros.
La modularidad y la abstraccin procedimental son complementarios. La modularidad implica
romper una solucin en mdulos; la abstraccin procedimental implica la especificacin de
cada mdulo antes de su implementacin en Pascal. El mdulo implica que se puede cambiar
su algoritmo concreto sin afectar el resto de la solucin.
La abstraccin procedimental es esencial en proyectos complejos, de modo que se pan utilizar
subprogramas escritos por otras personas, sin necesidad de tener que conocer sus algoritmos.
P r o g r a m a p r i n c i p a l
F u n c i n F 1 P r o c e d i m i e n t o P 1 F u n c i n F 2
Universidad Nacional de Andahuaylas - UNAJMA Algoritmos y Estructura de Datos I
Ingeniera de Sistemas Docente: Ing. Edwin Ramos Velsquez
55
Introduccin a la programacin
Figura 3.9 Diagrama de bloques que muestra la jerarqua de mdulos
MODULARIDAD MEDIANTE DISEO DESCENDENTE
La programacin modular tiene muchas ventajas. A medida que el tamao de un programa
crece, muchas tareas de la programacin se hacen ms difciles. La diferencia principal entre
un programa modular pequeo y un programa modular grande es, simplemente, el nmero de
mdulos que cada uno contiene, ya que el trabajo con programas modulares es similar y slo
se ha de tener presente el modo en que unos mdulos interactan con otros.
La modularidad tiene un impacto positivo en los siguientes aspectos de la programacin:
- Construccin del programa. La descomposicin del programa en mdulos permite
que los diversos programadores trabajen en modo independiente en cada uno de sus
mdulos. El trabajo de mdulos independientes convierte la tarea de escribir un
programa grande en la tarea de escribir muchos programas pequeos.
- Depuracin del programa. La depuracin de programas grandes puede ser una tarea
enorme, de modo que se facilitar esa tarea, al centrarse en la depuracin de
pequeos programas ms fciles de verificar.
- Legibilidad. Los programas grandes son muy difciles de leer, mientras que los
programas modulares son ms fciles de leer.
- Eliminacin de cdigo redundante. Otra ventaja del diseo modular es que se
pueden identificar operaciones que suceden en muchas partes diferentes del programa
y se implementan como subprogramas. Esto significa que el cdigo de una operacin
aparecer slo una vez, produciendo como resultado un aumento en la legibilidad y
modificabilidad.
ESTILO DE PROGRAMACION
Una de las caractersticas ms importantes en la construccin de programas, sobre todo los de
gran tamao, es el estilo de programacin. La buena calidad en la produccin de programas
tiene relacin directa con la escritura de los mismos, su legibilidad y comprensibilidad. Un buen
estilo de programacin suele venir con la prctica, pero el requerimiento de unas reglas de
escritura del programa, al igual que sucede con la sintaxis de escritura y las reglas de escritura
de un lenguaje natural humano, debe buscar esencialmente que no solo sean legibles y
modificables por las personas que lo han construido, sino tambin, y esencialmente, puedan
ser ledos y modificados por otras personas distintas. No existe una forma mgica que
garantice programas legibles, pero existen diferentes reglas que facilitarn la tarea y con las
que prcticamente suelen estar de acuerdo casi todos, desde programadores novatos a
ingenieros de software experimentados.
Naturalmente, las reglas de estilo para construir programas claros, legibles y fcilmente
modificables, depender del tipo de programacin y lenguaje elegido. En nuestro caso, hemos
recomendado el uso de Pascal y/o C++
O r d e n a r l a l i s t a
E n c o n t r a r l a m e d i a
O b t e n e r e l e l e m e n t o
c e n t r a l d e l a l i s t a
L e e r l a s n o t a s
d e l a l i s t a
P e d i r a l u s u a r i o u n a l i s t a S i t u a r l a n o t a e n l a l is t a
Universidad Nacional de Andahuaylas - UNAJMA Algoritmos y Estructura de Datos I
Ingeniera de Sistemas Docente: Ing. Edwin Ramos Velsquez
56
Introduccin a la programacin
Reglas de estilo de programacin
1. Modularizar un programa en partes coherentes (uso amplio de subprogramas)
2. Evitar variables globales en subprogramas.
3. Usar nombres significativos para identificadores.
4. Definir constantes con nombres al principio del programa.
5. Evitar el uso del goto y no escribir nunca cdigo espagueti (cdigo con saltos y
retornos difcles de controlar)
6. Escribir subrutinas cortas que hagan una sola cosa y bien.
7. Uso adecuado de parmetros variable.
8. Usar declaraciones de tipos.
9. Presentacin (comentarios adecuados)
10. Manejo de errores
11. Legibilidad
12. Documentacin.
DISEO DE ALGORITMOS
Tras una adecuada fase de anlisis, para poder solucionar problemas sobre una computadora,
debe conocerse cmo disear algoritmos. En la prctica sera deseable disponer de un mtodo
para escribir algoritmos. El diseo de algoritmos es un proceso creativo. Sin embargo existen
una serie de pautas o lneas a seguir que ayudarn al diseo de algoritmos. Algunas se ellas
son las siguientes:
1. Formular una solucin precisa del problema que debe solucionar el algoritmo.
2. Ver si existe ya algn algoritmo para resolver el problema o bien se puede adaptar
uno ya existente (algoritmos conocidos).
3. Buscar, si existen, tcnicas estndar que se puedan utilizar para resolver el problema.
4. Elegir una estructura de datos adecuada.
5. Dividir el problema en subproblemas y aplicar el mtodo a cada uno de los
subproblemas.
6. Si todo lo anterior falla, comience con el paso 1.
De cualquier forma, antes de iniciar el diseo de algn algoritmo, es preciso asegurarse que el
programa est bien definido.
- Especificaciones precisas y completas de las entradas necesarias.
- Especificaciones precisas y completas de la salida.
- Cmo debe reaccionar el programa ante datos incorrectos?
- Se emiten mensajes de error? se detiene el proceso?, etc.
- Conocer cundo y cmo debe terminar un programa.
ERRORES TIPICOS EN LA PROGRAMACION
- Errores de sintaxis (o en tiempo de compilacin). Se producen cuando existen errores en
la sintaxis del programa, tales como signos de puntuacin incorrectos, palabras mal
escritas, ausencia de separadores (signos de puntuacin), o de palabras reservadas
(ausencia de un end). Si una sentencia tiene un error de sintaxis, no puede ser traducida y
su programa no se ejecutar. Cuando se detecta un error, el depurador, por lo general, le
informa al usuario acerca del error detectado
Normalmente, estos tipos de errores son fciles de encontrar. El siguiente ejemplo
presenta dos errores de sintaxis: el punto y coma que falta al final de la primera lnea y la
palabra Writaln mal escrita, debera ser Writeln.
Universidad Nacional de Andahuaylas - UNAJMA Algoritmos y Estructura de Datos I
Ingeniera de Sistemas Docente: Ing. Edwin Ramos Velsquez
57
Introduccin a la programacin
Suma:= 0
For I:=0 to 10 do
Suma := Suma + A[I];
Writaln (Suma/19);
Figura 3.10 Tpico error de sintaxis
- Errores en tiempo de ejecucin (runtime error). Suceden cuando el programa trata de
hacer algo imposible o ilgico. Los errores de ejecucin slo se detectan en la ejecucin.
Errores tpicos son: la divisin por cero, intentar un ndice fuera de los lmites definidos en
un array, intentar acceder a zonas de la memoria que no han sido inicializadas y/o
apartadas para un uso especial.
- Errores lgicos. Son errores del algoritmo o de la lgica del programa. Son difciles de
encontrar porque el compilador no produce ningn mensaje de error. Se producen cuando
el programa es perfectamente vlido y produce una respuesta.
Por ejemplo:
Calcular la media de todos los nmeros ledos del teclado
Suma := 0;
For I:=0 to 10 do
Begin Readln(Num);
Suma := Suma + Num;
End;
Media := Suma/10;
Figura 3.11 Ejemplo tpico de un error lgico.
En este ejemplo, la media est mal calculada, ya que existen once nmeros (0 a 10) y no
diez como se ha escrito
Universidad Nacional de Andahuaylas - UNAJMA Algoritmos y Estructura de Datos I
Ingeniera de Sistemas Docente: Ing. Edwin Ramos Velsquez
58
Introduccin a la programacin
PROCEDIMIENTOS Y FUNCIONES
SubPrograma
O tambin llamada subrutina, bsicamente una Subrutina es un segmento de cdigo que se
escribe slo una vez pero puede invocarse o ejecutarse muchas veces. Existen dos tipos:
Procedimientos y Funciones.
Procedimientos
Son un tipo de subrutina que ejecuta un conjunto de acciones sin devolver valor alguno como
resultado de dichas operaciones. Estos se identifican por su declaracin void().
void sumar()
{ int A, B, C;
cin>>A;
cin>>B;
C = A + B;
cout<<C;
}
void main()
{ sumar();
}
Funciones
A diferencia de los procedimientos, las funciones despus de ejecutar un conjunto de acciones
devuelven slo un valor del tipo usado en la declaracin de sta por medio de return().
int sumar(int A, int B)
{ int C;
C = A + B;
return C;
}
void main()
{ int A, B, C;
cin>> A;
cin>> B;
C = sumar();
cout<<C;
}
La clusula return() slo devuelve un valor. Si se desea que la funcin devuelva ms de un
valor debe usarse otro mecanismo.
Alcance de las variables locales y variables globales.
Las variables que se declaran dentro de una subrutina se llaman locales mientras que las
variables globales se conocen a travs del programa entero y se pueden usar en cualquier
segmento de cdigo manteniendo su valor. Se pueden declarar variables globales
declarndolas fuera de cualquier funcin.
Cualquier funcin puede acceder a ellas sin tener en cuenta en qu funcin est dicha
expresin.
Universidad Nacional de Andahuaylas - UNAJMA Algoritmos y Estructura de Datos I
Ingeniera de Sistemas Docente: Ing. Edwin Ramos Velsquez
59
Introduccin a la programacin
Ejemplo de Funciones
Se desea implementar un programa que lea un nmero N por teclado, y que luego imprima en
pantalla su equivalente en Nmeros romanos.
INICIO
CASE
(N)
FIN
R ="I" R = "II"
R="III" R="IX"
return R
R =" "
getUnidad(N:Integer):String
N=1 N=2 N=3
.....
.
N=9 N=0
CASE
(N)
INICIO
FIN
R=getUnidad(N)
R = "X" + getUnidad(N-10)
R="XX" + getUnidad(N-20)
R="XC" + getUnidad(N-90)
return R
R="IC"
getDecada(N:Integer):String
N=1..9 N=10..19 N=20..29
.....
N=90..98
N=99
Cundo utilizar funciones?
Normalmente, las funciones se utilizan cuando nos encontramos con:
Agrupamiento de operaciones cuyo patrn ha sido descifrado
INICIO
FIN
Z = getDecada(X)
Leer X
Print Z
Programa Principal
Universidad Nacional de Andahuaylas - UNAJMA Algoritmos y Estructura de Datos I
Ingeniera de Sistemas Docente: Ing. Edwin Ramos Velsquez
60
Introduccin a la programacin
Operaciones complejas donde el objetivo del conjunto es proporcionar un nico valor
especfico, o un conjunto reducido de valores.
Operaciones matemticas, cuyos agrupamientos pueden tomar la forma de ) (x f z =
) ..., , , (
3 2 1 N
x x x x f z = .
a) En funciones matemticas de la forma: ) (x f z = ) ..., , , (
3 2 1 N
x x x x f z = .
Ejemplos tipo 1: Funciones que encapsulan
operaciones matemticas
Implemente la funcin 6 ) (
3
+ = x x f
Solucin:
float funcionDeA(float X)
{ float temp;
temp = (X * X *X) + 6;
return temp;
}
Implemente la funcin z y x z y x f 20 5 ) , , (
2
+ =
Solucin:
float funcionDeB(float X, float Y, float Z)
{ float temp;
temp = (X * X)+(5 * Y)-(20 * Z);
return temp;
}
Implemente la funcin z
y
x z y x f 41
1
8 ) , , ( + =
Solucin:
float funcionDeC(float X)
{ float temp;
temp = X + (8 * 1/Y) - (41 * Z);
return temp;
}
Luego de ser implementadas, cualquiera de estas funciones
puede ser reutilizada desde alguna otra funcin (o procedimiento) o desde el mismo
programa principal (void main)
Ejemplos: Implemente un programa que use la funcin
FuncionDeA (es decir 6 ) (
3
+ = x x f )
Solucin:
void main()
{ float f, x;
cin>>x;
f = FuncionDeA(x);
cout<<f;
}
b) Con Funciones en operaciones iterativas.
Existen algunas operaciones matemticas en donde se realizan bucles iterativos, en
tales situaciones, para facilidad de la programacin, estas rutinas se deberan en una
funcin que luego es invocada repetitivamente.
FIN
INICIO
R = X * X * X
FuncionDeA (X: Float): Float
Return N
INICIO
R = ( X ) + ( 8/Y ) - ( 41 * Z )
FuncionDeC (X, Y, Z: Float): Float
Return R
FIN
INICIO
FIN
R = ( X * X ) + ( 5 * Y ) - ( 20 * Z )
FuncionDeB (X, Y, Z: Float): Float
Return R
INICIO
F = FuncionDeA( X )
FIN
Leer X
Print F
Universidad Nacional de Andahuaylas - UNAJMA Algoritmos y Estructura de Datos I
Ingeniera de Sistemas Docente: Ing. Edwin Ramos Velsquez
61
Introduccin a la programacin
b.1) Ejemplo de funciones matemticas que tienen la forma:
Funcin sumatoria Funcin producto
=
=
N
i
i
x f z
1
) (
tambin
) ( .... ) ( ) (
2 1 N
x f x f x f z + + + =
=
=
N
i
i
x f z
1
) ( tambin
) ( * .... * ) ( * ) (
2 1 N
x f x f x f z =
En este caso, se presume que las variables X
i
estn almacenadas en un array de
valores (en un arreglo X), o que su acceso es secuencial.
En este tipo de funciones, se puede notar que tenemos:
Sumatoria Producto
=
=
N
i
i
x f z
1
) (
=
=
N
i
i
x f z
1
) (
La funcin
) (
i
x f
La funcin sumatoria
=
N
i 1
es decir, la
funcin suma de
) (
i
x f
. Donde i:1
N
La funcin
) (
i
x f
La funcin sumatoria
=
N
i 1
es decir,
la funcin producto de
) (
i
x f
.
Donde i:1N
Variables de entrada:
N: Entero; X[]: Arreglo
Variables de entrada:
N: Entero; X[]: Arreglo
La funcin a implementar ser: FuncinZuma La funcin a implementar ser:
FuncinProducto
El formato de la solucin sera:
FuncionProducto(N: Integer; X:Array): Float
FIN
While
(i <= N)
FIN
Acum = 0
i = 1
While
(i <= N)
FuncionZuma(N: Integer; X:Array): Float
F = FuncionDe ( X [ i ] )
i = i + 1
Return Acum
Acum = Acum + F
Acum = 1
i = 1
F = FuncionDe ( X [ i ] )
i = i + 1
Return Acum
Acum = Acum * F
Universidad Nacional de Andahuaylas - UNAJMA Algoritmos y Estructura de Datos I
Ingeniera de Sistemas Docente: Ing. Edwin Ramos Velsquez
62
Introduccin a la programacin
b.2) Ejemplo de funciones matemticas que tienen la forma:
Funcin sumatoria Funcin producto
=
=
N
i
i f z
1
) ( tambin
) ( .... ) 2 ( ) 1 ( N f f f z + + + =
=
=
N
i
i f z
1
) ( tambin
) ( * .... * ) 2 ( * ) 1 ( N f f f z =
En este caso, las variables X
i
se supone que estn almacenadas en un array de
valores, o que su acceso es secuencial.
En este tipo de funciones, se puede notar que tenemos:
Sumatoria Producto
=
=
N
i
i f z
1
) (
=
=
N
i
i f z
1
) (
La funcin
) (
i
x f
La funcin sumatoria
=
N
i 1
es decir, la
funcin suma de ) (i f . Donde i:1 N
La funcin
) (
i
x f
La funcin sumatoria
=
N
i 1
es decir,
la funcin producto de ) (i f .
Donde i:1N
Variables de entrada:
N: Entero; X[ ]: Arreglo
Variables de entrada:
N: Entero; X[ ]: Arreglo
La funcin a implementar ser: FuncinZuma La funcin a implementar ser:
FuncinProducto
El formato de la solucin sera:
FuncionProducto(N: Integer): Float
FIN
While
(i <= N)
FIN
Acum = 0
i = 1
While
(i <= N)
FuncionZuma(N: Integer): Float
F = FuncionDe ( i )
i = i + 1
Return Acum
Acum = Acum + F
Acum = 1
i = 1
F = FuncionDe ( i )
i = i + 1
Return Acum
Acum = Acum * F