You are on page 1of 121

Algoritmos y estructuras

de datos

Silvia B. Gonzlez Brambila


sgb@correo.azc.uam.mx
H-293

Objetivos
Aplicar

tcnicas de programacin en
C usando estructuras y recursividad
Implementar estructuras de datos
usando memoria esttica y dinmica
en C
Seleccionar estructuras de datos
para resolver problemas especficos
Seleccionar algoritmos de bsqueda
y ordenamiento para problemas
especficos

Contenido sinttico
1.
2.
3.
4.
5.
6.
7.
8.

Tipos de datos abstractos y


estructuras dinmicas
Recursividad y eficiencia
Estructuras para listas
Estructuras para rboles
Estructuras para grficas
Algoritmos de bsqueda interna
Algoritmos de ordenamiento interno
Algoritmos de procesamiento de
cadenas

Bibliografa
Aho

A. V., Ullman, J. D., Hopcroft J.


E., Estructuras de datos y
algoritmos, Pearson, 2000
Sedgewick R., Algorithms in C Parts
1-4: Fundamentals, Data structures,
Sorting, Searching, Addison Wesley,
3ra. ed., 2001
Sedgewick R., Algorithms in C Part
5: Graph algorithms, Addison
Wesley, 3ra. ed., 2001

Forma de evaluacin
programas

(aproximadamente 6):

40%
3 exmenes:
60%

1. Tipos de datos abstractos


y estructuras dinmicas

Resolver problemas requiere de


Habilidad

para crear y usar abstracciones


Los datos representan una abstraccin de
la realidad en el sentido de que ciertas
propiedades y caractersticas de los
objetos reales son ignorados .
Una abstraccin es una simplificacin de
hechos; extraer y agrupar
Resolver problema elegir una
abstraccin o sea definir un conjunto de
datos que representa la situacin real

Eleccin de
representacin
Datos

+ operaciones
La computadoras almacenan y
manipulan datos

Definiciones
Un

tipo de datos es una coleccin


de valores
Un tipo de datos abstracto (TDA) es
un tipo de datos definido de forma
nica mediante un tipo y un
conjunto dado de operaciones
definidas sobre el tipo
Una estructura de datos es la
implementacin fsica de un tipo de
datos abstracto

Tipos de datos bsicos


Entero

tiene como tipo el


conjunto de nmeros enteros
definidos por las matemticas {1,-2, , -) {0,1,2, , }
Tipo de datos elemental En pseudocdigo
entero
int
real
real
booleano
bool
caracter
char

TDA bsicos
Enteros

tiene como tipo el conjunto


de nmeros enteros definidos por
las matemticas {-1,-2, , -)
{0,1,2, , } y como operaciones
la suma, la resta, la multiplicacin
y la divisin entera.
Reales
Booleanos
Caracteres

Operaciones para los numricos


Enteros

Las

y Reales
Operacin

Smbolo

suma
resta
multiplicaci
n
divisin
potenciacin
divisin
entera
mdulo

+
*

Priorida
d
1
1
2

/
^
div

2
3
2

prioridades se alteran con el uso


de parntesis. Cuando existen
operadores con la misma prioridad
entonces se aplica la regla de
asociatividad de izquierda a derecha.
mod

Operaciones para los Booleanos


Operacin
AND
OR
NOT

Smbolo
&
|

Clases
Evolucin

de los TDA

Representacin de una clase


bscia
Una

clase tiene la siguiente


forma:

clase Nombre {
principal {
enunciados
}
}

Detalles de las clases


El

nombre de una clase y de una variable se forma de la


siguiente manera:

Una letra seguida de cero o ms letras, dgitos, $ o _


Lo anterior se puede expresar como: <letra> <letra|dgito|$|_>*
Un

enunciado en su forma ms simple permite que una


variable almacene un valor especifico ya sea que se
exprese explcitamente o a travs de una operacin.
A esta operacin se le conoce como asignacin y se
expresa en pseudocdigo mediante el siguiente smbolo:

Ejemplo: si se desea que una variable "a" contenga el


valor de 5, se expresa explcitamente como:
a5

Poniendo todo junto


/**
*Suma el entero 5 y el entero 7
**/
clase Suma5y7 {
principal {
int a 5 //en la variable a se almacena el valor de 5
int b 7 //en la variable b se almacena el valor de 7
int c a + b //en c se almacena la suma de a con b
}
}

Comunicacin
Sin

embargo, el algoritmo anterior


carece de algo muy importante la
comunicacin con el usuario, dicho
de otra forma el resultado de la
suma no se muestra.
En muchas ocasiones tambin es
necesario que el usuario establezca
comunicacin con la mquina y
para esto existen las operaciones de
entrada y salida.

Operaciones de entrada/salida
En

pseudocdigo la operacin que permite


establecer comunicacin al usuario con la
mquina es:
lee nombreVariable
La instruccin anterior hace que a la
variable nombrada se le asigne el valor que
el usuario proporcion.
La operacin contraria es:
escribe nombreVariable
Cuando se desea que la mquina comunique algo
al usuario de manera predefinida, el conjunto de
smbolos se encerrara entre comillas

Ejemplo: Dar las buenas tardes


/**
* Da las buenas tardes al usuario a
travs de la pantalla
**/
clase Saludo {
principal {
escribe buenos das
}
}

Ejercicio
Escribir

un programa que permita


sumar dos nmeros enteros
proporcionados por el usuario

Solucin
/**
* Suma dos enteros proporcionados por el usuario, el resultado lo imprime en
pantalla
**/
clase Suma2Enteros {
principal {
int a, b, c
escribe De un valor entero
lee a
En algunas ocasiones se
escribe de otro valor entero
desea que la operacin de
lee b
ca+b
salida (escribe) concatene
escribe La suma de
cadenas con valores de
escribe a
variables. Conviene
escribe con
utilizar el operador de
escribe b
concatenacin (+).
escribe es
escribe c
}
}

Ms claro y compacto
/**
* Suma dos enteros proporcionados por el usuario, el resultado lo
* imprime en pantalla. Versin ms compacta que la clase anterior
**/
clase Suma2Enteros {
principal {
int a, b, c
escribe De un valor entero
lee a
escribe de otro valor entero
lee b
ca+b
escribe La suma de + a + con + b + es + c
}
}

Ejercicio
Calcular

el IVA de un producto

Solucin
/**
* Calcula el IVA de un producto. El usuario deber
* proporcionar el valor * del producto
**/
clase CalculaIVA {
principal {
real precio, iva
escribe Dame el valor del producto
lee precio
iva precio * 0.15
escribe El IVA de un producto de $ + precio + es + iva
}
}

Uso de constantes
En

algunas ocasiones existen valores que


no cambian frecuentemente o son fijos,
como el caso del IVA o el valor de (pi).
En estos casos es conveniente utilizar
constantes. Las constantes son valores de
variables que no pueden ser reasignados
es decir durante el programa no est
permitido cambiar su valor. En
pseudocdigo se empleara palabra clave
const seguida del tipo y nombre de la
constante, el smbolo de asignacin y de
su valor

Solucin con constante


/**
* Calcula el IVA de un producto. El usuario deber
proporcionar el valor * del producto. Se utiliza una constante
entera
**/
clase CalculaIVA {
principal {
const real costoIVA 0.15
real precio, iva
escribe Dame el valor del producto
lee precio
iva precio * costoIVA
escribe El IVA de un producto de $ + precio + es + iva
}
}

Ejemplo
Si

ahora se desea calcular el IVA y el costo total del producto podramos escribir la siguiente clase:

/**
* Calcula el IVA y el costo total de un producto. El usuario deber
* proporcionar el valor del producto. Se utiliza una constante
**/
clase CalculaIVA {
principal {
const int costoIVA 0.15
real precio, iva, costo
escribe Dame el valor del producto
lee precio
iva precio * costoIVA
total precio + iva
escribe El IVA de un producto de $ + precio + es + iva
escribe y su costo total es de $ + total
}
}

Ejercicio
Suponga

que se desea calcular el


costo de peaje de camiones. Los
camiones que llegan a una
cabina de peaje deben pagar
$5.00 por eje mas $10.00 por
cada tonelada del peso total del
camin.
Entradas

Procesamie
nto

Salida

Planteamiento de solucin

Entradas
nmero de
ejes, peso
total en
toneladas

Procesamien
to
nmero de
ejes * $5.00 +
peso total en
toneladas *
$10.00

Salida
costo

Solucin
/**
* Calcula la cuota de peaje que deber pagar un camin con base
* a su peso
**/
clase Peaje {
principal {
const real costoEje 5.0
const real costoTonelada 10.0
int numEjes, numToneladas
escribe Proporcione el nmero de ejes del camin
lee numEjes
escribe Cuntas toneladas son?
lee numToneladas
costo numEjes * costoEje + numToneladas * costoTonelada
escribe El peaje del camin de: + numToneladas + y + numEjes +
es $ + costo
}
}

Algunas reglas
Los

nombres de variables y algoritmos


debern ser significativos
Estrictamente prohibido utilizar del lado
derecho de una expresin una variable que
no haya sido inicializada previamente, i. e.,
del lado derecho de una expresin siempre
debern aparecer variables que tengan un
valor determinado o bien un valor
Los nombres de las clases debern ser
diferentes a los de cualquier variable que
se utilice en el algoritmo (por el momento)

Elementos de
programacin

El orden en que los enunciados se


ejecutan en un algoritmo se conoce como
flujo de control.

Flujo de control
A

menos que se especifique lo contrario la


ejecucin de un programa se realiza de
manera lineal, de tal forma que se inicia en
la primera sentencia y se procede a
ejecutar la siguiente, y as sucesivamente
hasta que se encuentra la ltima sentencia.
Esta estructura de control se conoce como
secuenciacin.
Es posible alterar el flujo de control a
travs de otras estructuras de control, las
cuales pueden clasificarse en dos
categoras: seleccin e iteracin.

Seleccin
Las

estructuras de seleccin a veces


llamadas condicionales permiten
discriminar qu sentencia se ejecutara
despus. En pseudocdigo se
estudiarn las siguientes: si-entoncesotro y el si-entonces. La decisin entre
qu sentencia ejecutar est basada en
una expresin booleana (aquella que
al ser evaluada produce un valor de
verdadero o un valor de falso).

Seleccin
Pseudocdigo

Java

si c1

if (c1 )

e1

otro
e2
si c2
e3

e1;

else
e2;
if (c1 )
e1;

Ejemplo
/**
* Determina si una persona es joven (menor de 21 aos)
**/

clase SiempreJoven {
principal {
const int joven 21 //Declaracin de la constante joven
int edad
escribe Proporcione su edad
lee edad
si edad < joven
escribe La juventud es un tesoro divino, disfrtala
escribe La edad es un estado mental
}
}

Iteracin
Las

estructuras iterativas o
repetitivas permiten que una
sentencia se ejecute varias veces
dependiendo de una expresin
booleana. En pseudocdigo se
consideran las siguientes:
para
mientras
repite

Para
El

para permite escribir una


iteracin que se realizar de
acuerdo al valor inicial de una
variable y hasta que dicha
variable alcance un valor final.

para variable valorInicial hasta valorFinal,


incremento
e1

Ejemplo
/**
* Imprime los nmeros del 1 al 100
**/
clase Imprime1-100 {
principal {
para i 1 hasta 100, 1
Debido a que
muchas veces
escribe i
el incremento
es 1 se
}
obviara, es
decir no se
}
pondr.

Ejercicio
Imprimir

los mltiplos de 5 entre


un lmite inferior y un lmite
superior

Solucin
/**
* Imprime los nmeros mltiplos de 5 comprendidos entre un
* lmite inferior y un lmite superior
**/
clase ImprimeMultiplos5 {
principal {
int limInf, limSup
escribe Proporcione el lmite inferior y el lmite superior
lee limInf, limSup
para i limInf hasta limSup
si i mod 5 = 0 entonces
escribe i
}
}

Mientras
Se

usa para repetir una instruccin durante


todo el tiempo en que una condicin
particular sea verdadera.
En pseudocdigo:
mientras c1
e1

Ejemplo
class EjemMientras {
principal {
int i 0
mientras (i < 10) {
escribe i
i++
}
Ejercicio:
}
}
Modificar la clase anterior
para que imprima los pares
entre 0 y 10 inclusive

Ejercicio
Escribir

una clase para


determinar cundo un nmero
dado es un primo

Solucin

clase DeterminaPrimo {
principal {
escribe "Dame un entero"
lee num
int i 2
mientras num mod i != 0
i++
escribe "El nmero " + num
si i = num
escribe "es un primo"
otro
escribe "no es un primo"
}
}

Repite
En

pseudocdigo:

repite
e1
mientras c1
En Java o C:
do {
enunciados
} while (c1 );

El enunciado do es similar al
while, excepto que la
condicin de terminacin es
al final del cuerpo del ciclo. El
ciclo do ejecuta las
sentencias dentro del cuerpo
hasta que la condicin es
falsa. El cuerpo de un ciclo
do al menos se ejecuta una
vez.

Ejemplo
class ejemRepite {
principal {
const int LIMITE 7; //constante
entera
int cuenta 0
repite {
cuenta++;
escribe "Cuenta: " + cuenta
} mientras cuenta < LIMITE
}
}

Creacin de clases

Objetivos del subttulo


Discutir

la estructura y contenido de una

clase
Establecer el concepto de estado de un
objeto
Describir el efecto de los modificadores de
visibilidad en los mtodos y datos
Explorar la estructura de la definicin de
un mtodo, incluyendo parmetros y
valores de regreso
Discutir la estructura y propsito de un
constructor

Recordando
Una

clase representa un
concepto general
Un objeto tiene un estado, que
define los valores de sus
atributos y comportamientos, que
estn definidos por las
operaciones asociadas.

Clase
Datos

miembro (Atributos)
Funciones o mtodos miembro
(Operaciones)
Ejemplos:

Estudiante
Rectngulo
Acuario
Vuelo
Empleado

Diagrama UML (Unified Modeling


Language)
Para representar una
clase:
tipo:
int, real, bool, char

tipoRegreso:
int, real, bool, char,
void, Clase

NombreClase
Datos Miembro
tipo nomDato1
tipo nomDato2
.
tipo nomDatoN
Funciones Miembro
tipoRegreso nomFun1
()
.
tipoRegreso nomFunN

Ejemplo
Genoma
int nmero
bool
identificado
principal

clase Genoma {
//datos miembro
int nmero
bool identificado
//Funcin miembro principal
principal {
//Creacin de una referencia a un genoma
Genoma g1
//Creacin de un objeto de tipo genoma
g1 nuevo Genoma ()
//asignacin de 5 al dato miembro nmero
//del objeto referenciado por g1
g1.nmero 5
// el genoma referenciado por g1 no ha sido
identificado
g1.identificado false
//Creacin de una referencia y de un objeto
tipo genoma
Genoma g224 nuevo Genoma ()
//Inicializacin del dato miembro nmero de
g224
g224.nmero 224
//Inicializacin del dato miembro identificado
de g224
g224.identificado verdadero
//Se escriben los datos miembros de la
referencia g1
escribe El genoma g1 tiene nmero:
+g1.nmero

Otro ejemplo
// Representa un dado con
// caras del 1 al 6
clase Dado {
// valor mximo de una
cara
const int MAX 6
// valor actual de la cara
int valorCara
// Constructor, inicializa el
//valor de la cara
public Dado(){
valorCara 1
}

Dado
Const int MAX 6
int valorCara
Dado ( )
int rueda ()
void ponValorCara
(int)
dameValorCara ()
String toString ( )

Dado (continuacin)
// Tira el dado y regresa el nuevo valor de la cara
public int rueda() {
valorCara (int)(aleatorio() * MAX) + 1
regresa valorCara
}
// Cambia el valor de la cara
public void ponValorCara (int valor) {
valorCara valor
}
// Regresa el valor de la cara
public int dameValorCara() {
regresa valorCara
}
// Regresa una cadena con el valor de la cara
public String toString(){
String result new String ()
result += valorCara; //Concatena la cadena vaca con el entero
regresa result
}
}

// Demuestra la creacin y uso de clases definidas por


el usuario
class JuegaDados {
// Crea dos objetos de tipo dado y los rueda varias
veces
principal {
Dado dado1, dado2
int suma
dado1 new Dado()
dado2 new Dado()
dado1.rueda()
dado2.rueda()
escribe "Primer dado: " + dado1 + ", Segundo dado:
" + dado2
dado1.rueda()
dado1.ponValorCara(4)
escribe "Primer dado: " + dado1 + ", Segundo
dado: " + dado2
suma = dado1.dameValorCara() +
dado2.dameValorCara()
escribe "Suma: " + suma

Datos miembro
Declarados

dentro de la clase, pero fuera


de cualquier mtodo
La localizacin en donde se declara la
variable define su mbito, indica el rea
dentro del programa en que la variable
puede ser referenciada
A nivel de clase, pueden referenciarse en
cualquier mtodo de la clase

Cuando

se crea un objeto se crea el


espacio necesario para almacenar los
valores de los datos miembro
Se inicializan automticamente,
numricos en 0, booleanos en false,
objetos en null

Ejemplo
Un racional puede representarse
por su numerador y su
denominador. Por ejemplo:

R1 =
R2 =

Recordando + = 5/4

clase Racional {
//datos miembro
int numerador
int denominador
//Funcin principal
principal {
Racional r1 nuevo Racional () //Creacin de un
nuevo racional
//Inicializacin de los datos miembro de r1
r1.numerador 1
r1.denominador 2
//Creacin e inicializacin de los datos miembro de r2
Racional r2 nuevo Racional ()
r2.numerador 3; r2.denominador 4
//Creacin de un nuevo racional donde se almacena
r1+ r2
Racional r3 nuevo Racional ()
r3.numerador r1.numerador * r2.denominador
+
r2.numerador * r1.denominador
r3.denominador r1.denominador *
r2.denominador

Racional (continuacin)
//Se escribe el resultado de la suma
escribe La suma de
escribe r1.numerador + / +
r1.denominador
escribe +
escribe r2.numerador + / +
r2.denominador
escribe =
escribe r3.numerador + / +
r3.denominador
}
}

Encapsulacin
Los

objetos deben autogobernarse, lo que


significa que solo deben modificarse por si
mismos
Por ejemplo, en la clase Dado, el dado mismo
debe ser el responsable de cambiar el valor de
la variable valorCara

Un

objeto debe encapsularse, para guardar


sus datos de un acceso inapropiado
Debe interactuar con otras partes del programa
a travs de un conjunto de mtodos que brinden
tal servicio, estos mtodos definen la interface
entre el objeto y el programa que lo usa.

Encapsulacin (cont)
objeto
interface
Cliente

Mtodos

Datos

Los

modificadores de visibilidad en Java controlan


el acceso a los miembros (datos y mtodos) de una
clase:
public, puede ser referenciado directamente fuera del objeto
private, puede ser usado en cualquier parte dentro de la
clase, pero no externamente
protected, solo relevante en el contexto de herencia

Efectos de la visibilidad pblica y


privada

En

publico

privado

Datos

Viola la
encapsulaci
n

Promueve la
encapsulaci
n

Mtodos

Ofrece
servicios a los
clientes

Suporta otros
mtodos
dentro de la
clase

los diagramas UML:

El signo + define visibilidad pblica


El signo - define visibilidad privada

Anatoma de un mtodo
Un

mtodo es un grupo de
enunciados
La declaracin de un mtodo
especifica el cdigo que se
ejecutar cuando el mtodo es
invocado
Todo mtodo es parte de una
clase

Flujo de control en las llamadas


a mtodos
Cuando

se llama a un mtodo, el
flujo de control se transfiere a
ese mtodo

Encabezado de un mtodo
Incluye:

Modificadores (opcional)
Tipo de regreso
Nombre del mtodo
Lista de parmetros
Cuerpo del mtodo ({ enunciados }

public
publicvoid
voidinstrucciones
instrucciones(int
(intc)
c){{
escribe
escribeSiga
Sigatodas
todaslas
lasinstrucciones
instrucciones
escribe
escribeNo
Noms
msde
de+
+cc+
+ veces
veces
}}

El enunciado return
El

tipo de regreso especificado en el encabezado del


mtodo puede ser;
Un tipo de datos primitivo
El nombre de una clase
La palabra reservada void

Un

mtodo que regresa un valor debe tener un


enunciado return.
Cuando se ejecuta return, el control regresa al
enunciado que llamo al mtodo y el procesamiento
continua ah.
Forma: return valor
Debe ser consistente con el tipo de regreso del mtodo

Un

mtodo sin return no regresa ningn valor, pero


puede tener un enunciado return
No es conveniente tener ms de un enunciado return
Los constructores no tienen tipo de regreso

Parmetros
Un

parmetro es un valor que se


pasa al mtodo cuando se invoca
La lista de parmetros en el
encabezado especifica el tipo, los
valores y los nombres que se
pasan al mtodo
Siempre van entre parntesis
ch obj.calc (25, cont, Hola);
invocacin
char calc (int num1, int num2, String mensaje) {
.
declaracin regresa result
}

Datos locales
Una

variable que es declarada


dentro de un mtodo es local y
no puede usarse fuera de ella

Mtodos constructores
Una

funcin constructora es aquella que se llama


cuando un objeto es creado a travs del operador
nuevo.
Cuando se usa nuevo para crear una instancia se:
asigna memoria para el objeto
inicializan los datos miembro
llama al mtodo constructor

Los

mtodos constructores son como cualquier


otro mtodo pero con dos caractersticas
adicionales:
siempre tienen el mismo nombre que la clase
no tienen tipo de regreso ni regresan ningn valor

No

es necesario definir un constructor para cada


clase. Una clase tiene un constructor por defult
que no tienen parmetros y es creado por el
intrprete si no es declarado.

Ejemplo
clase Alumno {
//Datos miembro
Cad nombre
int matrcula
//Funciones miembro
//Constructora
Alumno (Cad n, int m) {
nombre n
matrcula m
}
void escribe () {
escribe Los datos son
escribe Nombre: +
nombre
escribe Matrcula: +
matrcula
}

principal {
Alumno a1 nuevo
Alumno (Sandra,
99887766)
a1.escribe ()
Alumno a2 nuevo
Alumno (Ivn,
00112233)
a2.escribe ()
}
}

Cmo mejorar Racional?

Ejercicio Perro
Disee

un diagrama UML de una


clase Perro, con al menos 2 datos
miembros, 1 mtodo constructor,
2 mtodos de servicio, 1 mtodo
toString. Adems cree una clase
Veterinario cuyo mtodo principal
cree varias instancias y actualice
varios perros.

Ejercicio Esfera
Disee

una clase Esfera que contenga


datos miembro que representen su
dimetro. Defina un constructor que
acepte e inicialice el dimetro, y
mtodos daDimetro, ponDimetro.
Incluya tambin mtodos para
calcular y regresar el volumen y el
rea de una esfera (ejercicio pasado).
Incluya un mtodo toString, que
regrese una descripcin de una lnea
de la esfera. Adems cree una clase
MultiEsferas, cuyo mtodo principal

Arreglos unidimensionales
y Cadenas

Definicin
Un

arreglo se usa para agrupar,


almacenar y organizar datos de
un mismo tipo,
preferentemente.
En un arreglo cada valor se
almacena en una posicin
numerada especfica dentro del
arreglo. El nmero
correspondiente a cada posicin
se conoce como ndice

Estructura

Normalmente

el primer objeto
del arreglo tiene el ndice 0,
aunque esto vara dependiendo
del lenguaje.

Declaracin
La

declaracin de un arreglo en pseudocdigo


que se utilizar es:
tipo [ ] nombreArreglo
Un arreglo es un objeto por lo que para crear el
espacio se utiliza el operador nuevo:
nombreArreglo nuevo tipo [max]
donde tipo puede ser un tipo de datos primitivo
o un objeto, nombre es el nombre del arreglo y
max es el nmero de localidades del arreglo. Es
una buena costumbre que max sea declarado
como una constante.
Tambin puede declararse de la siguiente forma:
tipo [] nombreArreglo nuevo tipo [max]

Operaciones
almacenamiento,

una operacin de
almacenamiento inserta un valor en el
arreglo en una localidad especfica.
nomArreglo [i] valor
recuperacin, una operacin de
recuperacin regresa el valor almacenado
en una localidad especfica del arreglo
valor nomArreglo[i]
donde i es la posicin o ndice del arreglo, que
puede ser un entero o bien una expresin que al
ser evaluada regresa un entero

Ejemplo
const int MAX 10
int [] arregloEnteros nuevo int [MAX]
arregloEnteros [0] 1
arregloEnteros [1] 10
a5
arregloEnteros [a-2] arreglosEnteros [0] +
arregloEnteros [1]

Despus

de realizar los enunciados


anteriores, esquemticamente
arregloEnteros se vera como:

Tamao de un arreglo
nmero

de localidades, como
dato miembro pblico y constante
de un arreglo se puede accesar el
nmero de localidades:

int tamao
nomArreglo.longitud

Ejemplo, arreglo de datos


primitivos
Leer

una lista de nmeros, almacenarlos en un arreglo e imprimirlos en orden


inverso

clase NumerosReves {
principal {
const int MAX 10//Nmero mximo de posiciones del arreglo
//creacin del arreglo de reales
real [] nmeros nuevo real [MAX]
escribe El tamao del arreglo es: + numeros.longitud
para indice 0 hasta numeros.longitud 1 {
//se piden los datos
escribe Dame el nmero que se encuentra en + ndice
lee numeros [indice]
} //se escribe al revs el arreglo
escribe Los nmeros al revs son:
para indice numeros.longitud-1 hasta 0, -1
escribe numeros [indice]
}
}

Otro ejemplo
Considere

los siguientes datos miembro y la funcin


constructora por default:

clase EjemplosArreglo {
const int MAXLOC 100
int [] info
EjemplosArreglo () {
info nuevo int [MAXLOC]
para i 0 hasta info.longitud-1 {
escribe Dame el valor en la posicin + i
A continuacin
lee info [i]
desarrollaremos
}
algunas funciones
}
miembro que podran
}
pertenecer a la clase
EjemplosArreglo

Ejercicio
Calcular

la suma de los
elementos de un arreglo

Solucin
int sumaElem () {
suma 0
para i 0 hasta info.longitud-1
suma suma + info[i]
regresa suma
}

Ejercicio
Determinar

el elemento ms
grande del arreglo

Solucin
int maximo () {
//El mayor es el 1ro. hasta que se demuestre lo
contrario

max info [0]


para i 1 hasta info.longitud-1
si max < info[i] entonces
max info [i]
regresa max
}

Determinar la posicin del mayor


int posMaximo () {
//El mayor es el 1ro. hasta que se demuestre lo
contrario

posMax 0
para i 1 hasta info.longitud-1
si info [posMax] < info[i]
posMax i
regresa posMax
}

Determinar el valor del elemento


que est a la mitad

Solucin
int valorEnmedio () {
regresa info [(info.longitud-1)/2]
}

Ordenamiento por
seleccin
El

algoritmo de seleccin ordena


un arreglo de valores poniendo
un valor particular en su posicin
final, i.e., el algoritmo selecciona
el valor que debera ir en una
posicin y lo pone ah.

Promedio de los valores del


arreglo
real promedio () {
regresa sumaElem
()/info.longitud
}

Ejemplo
Considere

un orden ascendente y
el siguiente arreglo de nmeros.

Se

busca el elemento menor del


arreglo y se pone en la 1ra.
posicin,

entonces el arreglo queda


como:

Note

que ahora la celda amarilla


contiene al elemento ms
pequeo y que est en la
posicin que quedara cuando el
arreglo est completamente
ordenado.
A continuacin se busca el
siguiente ms pequeo que

Ntese

que el ltimo elemento


quedar automticamente
ordenado.

Ejercicio
Escribir

el algoritmo

Solucin
void ordenSeleccion () {
int min, temp
para ndice 0 hasta info.longitud 2 {
min ndice
para busca ndice+1 hasta info.longitud-1
si info[busca] < info [min] entonces
min busca
//se intercambian
temp info [min]
info [min] info [ndice]
info [ndice] temp
}
}

Cadenas

Clase
String
String ()
char charAt (int ndice)
Int comparteTo (String str)
String concat (String str)
Boolean equals (String str)
Boolean equalsIgnoreCase (String
str)
Int length ()
String substring (int offset, int
endIndex)
String toLowerCase ()
String toUpperCase ()

Ejercicio
Determinar

su un enunciado es
un palindrome

Solucin con para


Clase Palindrome {
principal () {
String pal = new String (Dot saw I was Tod);
pal pal.toLowerCase ();
bool bandera false
para i 0, pal.length ()-|
si pal.charAt (i) != pal.charAt (pal.length()-i-1)
bandera true
si bandera
escribe no es un palindrome
otro
escribe es un palindrome
}
}

Solucin con mientras


class palindrome {
principal (){
String pal new String ("Dot saw I was tod")
pal pal.toLowerCase()
int i 0
mientras i < pal.length () /2 &&
(pal.charAt(i)==pal.charAt(pal.length ()-i-1))
i++;
escribe (pal + " ")
si i < pal.length()
escribe "No es un palindrome"
otro
escribe "Es un palindrome"
}
}

Arreglos que utilizan


objetos

Arreglo de cadenas
Ejemplo

String [] toppings new String [20]


Toppings [0] Queso
Toppings [1] Pepperoni
Toppings [2] Espinacas

Ejemplo

1:

2:

String [] toppings
..
toppings new String [20]
..
Toppings [0] Queso
Toppings [1] Pepperoni
Toppings [2] Espinacas

Ejemplo

String [] toppings {Queso,


Pepperoni}

EjercicioClase CD
CD
- String ttulo
- String autor
- real precio
CD (String, String
real)
real damePrecio ( )
String escribe ( )

Discoteca
-CD [] arregloCD
- int numCD
Discoteca ( )
insertaCD (String, String,
real)
String escribe ( )
real costo ( )
principal ( )

Arreglos en dos
dimensiones

Introduccin
Un

arreglo bidimensional, como


su nombre lo indica, tiene valores
en dos dimensiones, en algunas
ocasiones se le llama tambin
tabla y se tiene acceso a sus
elementos a travs de la columna
y el rengln del arreglo.

Definicin
Para

definir un arreglo en dos dimensiones es


necesario poner el tipo de la informacin que se
desea almacenar (un tipo primitivo o un objeto)
y especificar que se tendrn dos dimensiones:
tipo [] [] nombre
Ejemplos:
1. Definir un arreglo bidimensional de enteros: int
[] [] matriz
2. Definir una tabla de booleanos: bool [][]
tablero
3. Definir un arreglo bidimensional de fichas:
Ficha [] [] juego

Creacin de espacios
Como

en los arreglos de una sola dimensin,


el tamao de las dimensiones se especifica
cuando el arreglo es creado y el tamao de
cada dimensin puede ser diferente.
As, para el ejemplo anterior:
1. matriz nuevo int [5][5]
2. tablero nuevo bool [10][MAX], donde
MAX almacena un valor entero
3. juego nuevo ficha [NUMCELDAS]
[NUMCELDAS-2], donde NUMCELDAS
almacena un valor entero

Operaciones
Las

operaciones que pueden


realizarse con cada elemento de
un arreglo son:
almacenamiento
recuperacin

En

cada operacin es necesario


especificar unvocamente el
elemento por lo que es necesario
dar el ndice para cada dimensin:

Ejemplos operaciones
Almacenamiento
1) matriz [2][3] 3

Recuperacin
int x matriz [4]
[4]
si tablero [2][2]
e1

2)

tablero
[3][1]
verdadero

3)

juego [1][8] nuevo Ficha f juego


Ficha ()
[0][0]

Mtodos estticos
Algunos

mtodos pueden
invocarse a travs del nombre de
la clase en la que fueron
definidos, sin necesidad de
instanciar un objeto.

Dentro

de la firma del mtodo


incluir la palabra esttica

Ejercicio
Escribir

una funcin esttica que


lea los elementos de una matriz de
tamao MAX.

clase Matriz {
const int MAX 10
..
principal () {
int [][] m leeMatriz ()

Solucin
estatica int [][] leeMatriz () {
matriz nuevo int [MAX][MAX]
para i 0 hasta MAX-1
para j 0 hasta MAX-1 {
escribe Dame el elemento + i + , +
j
lee matriz[i][j]
}
regresa matriz
}

Ejercicio
Escribir

una funcin NO esttica que lea los


elementos de una matriz de tamao MAX.

clase Matriz {
const int MAX 10
int [][] info
..
principal () {
Matriz m nueva Matriz ( )
m.leeMatriz ()
..
}

Solucin
public class Matriz {
const int MAX = 3
int [][] info;
Matriz () {
info nuevo int [MAX][MAX]
}
void leeMatriz () {
para int i 0, info.length-1
para int j 0, info.length-1{
escribe"Dame el valor el elemento: " + i +","+j
lee info [i][j]
}
}
principal {
Matriz m nuevo Matriz ()
m.leeMatriz ()
m.escribeMatriz()
}
}

Cuadrado mgico

Propiedades
suma

renglones
suma columnas
suma diagonal
suma antidiagonal
=
(n3+n) / 2

You might also like