Академический Документы
Профессиональный Документы
Культура Документы
El archivo en el que se define una clase (también llamado unidad de compilación) debe tener el
mismo nombre de la clase más la extensión .java.
En un programa java, absolutamente todo es un objeto. Así desde el programa principal, las librerías
que usemos, y archivos extras que integremos serán clases para crear objetos
CARACTERÍSTICAS DE JAVA:
Multiplataforma
Orientado a Objetos
Integrable a la red
Seguro
Con una sintaxis similar a C++
Desarrollado por Sun Microsystems.
Adquirido por Oracle.
Actualmente ya no se le llama así sino que se le llama SDK y en la página se referencia la plataforma
en concreto.
PROGRAMANDO EN JAVA
La principal característica de Java es la de ser un lenguaje compilado e interpretado. Todo programa
en Java ha de compilarse y el código que se genera bytecodes es interpretado por una máquina
virtual. De este modo se consigue la independencia de la máquina, el código compilado se ejecuta
en máquinas virtuales que si son dependientes de la plataforma, como se ve en la figura 1.
Se encarga de
traducir el programa Se encarga de
Archivo fuente de Java a su forma ejecutar el
de java binaria (byte code) programa binario.
Compilador
De Java Máquina
virtual de
java
Archivo de byte
code (.class)
HERRAMIENTAS DE PROGRAMACIÓN:
Hay dos esquemas para desarrollar programas en Java:
Usar directamente las herramientas de línea de comando del JDK (JSE Development Kit).
Usar un Ambiente de Desarrollo Integrado o IDE (Integrated Development Environment). Un
IDE facilita las labores comunes al momento de programar: edición, compilación, ejecución
y depuración. Algunos IDEs populares para Java son: Eclipse, NetBeans, JBuilder, JCreator,
BlueJ.
ENTORNO DE DESARROLLO
El JDK incluye un conjunto de herramientas de línea de comandos para compilar y ejecutar el código
Java, que incluye una copia completa del JRE. Aunque se utilizan estas herramientas para desarrollar
aplicaciones, la mayoría de los desarrolladores valoran la funcionalidad adicional, la gestión de
tareas y la interfaz visual de un IDE.
Eclipse es un IDE de código abierto popular para el desarrollo Java. Maneja las tareas básicas, tales
como la compilación de códigos y la configuración de un entorno de depuración, para que pueda
centrase en escribir y probar códigos.
Eclipse se puede usar para organizar archivos de códigos de origen en proyectos, compilar y probar
esos proyectos y almacenar archivos de proyectos en cualquier cantidad de repositorios de origen.
Se necesita tener instalado un JDK para usar Eclipse para el desarrollo Java.
Si es que ud. ya tiene la aplicación de eclipse, copiar la carpeta sobre el escritorio y desde allí lo
ejecutaremos.
Se iniciara eclipse
La primera vez que se inicia el eclipse, este pide que se le confirme en que directorio debe conservar
los proyectos que se creen. Por defecto, esto es una carpeta bajo el directorio mismo en el que se
encuentra el programa.
Antes de poder empezar a trabajar, necesitamos crear un proyecto. Para esto nos vamos al:
Con esto se nos presenta un cuadro que nos muestra la siguiente pantalla:
Ahora aparece el diálogo donde debemos definir el nombre de nuestro proyecto, en nuestro caso
escribiremos: EjemploProyecto, luego presionamos el botón finish.
Al terminar los pasos anteriores, vemos que en la vista “Package Explorer” aparece nuestro
proyecto tal como puede verse en la siguiente figura. Al expandirlo haciendo clic en el signo “+” que
aparece al lado del nombre vemos que ya hay algo adentro. En este caso, están las librerías de
sistema, que no necesitamos conocer en detalle por ahora, por lo que simplemente las ignoraremos.
Además está la carpeta “src” que es la carpeta que contendrá todo el código fuente (todas las
clases). Pero este proyecto, así tal cual, está vacío. No hace nada. Para que haga algo, necesitamos
agregar el código apropiado.
CREAR PAQUETE
Todo proyecto en java, trabaja con paquetes. Un proyecto puede tener varios paquetes.
2
1
CREAR CLASE
En java, todo código está contenido al interior de alguna clase. Por lo anterior, si deseamos agregar
alguna funcionalidad o código, primero debemos crear una nueva clase.
Otra forma de
ejecutar 1
2
2
2
La aplicación será compilada y cualquier error será reportado. Si todo ha salido bien, en la inferior
de la pantalla debiera observar como sigue:
Salida:
2
2
Seleccionar la carpeta General y luego Existing Projects into WorkSpace, como se ve a continuacion:
2 2clic
2
1
2
2
2
Donde:
A=número entero
B= número entero
Para empezar, una vez iniciado eclipse, debe ir al menú / seleccionar new / luego
seleccionar Project, como se ve en la siguiente pantalla:
Seleccionamos Java Project y luego next como se ve a continuación:
2
2
CREAR UN PAQUETE
Crearemos el paquete ejersuma.
1
2
2
2
3
2
2
2
1
2
2
2
3
2
2
2
3
2
Luego de presionar el botón "Finish" tenemos el archivo donde podemos codificar nuestro primer
programa:
EJECUTAR EL PROGRAMA:
Para ejecutar cualquier programa realizar de la siguiente manera:
1
2
2
2
Si no hay errores de codificación debemos ver el resultado de la ejecución en una ventana del
Eclipse llamada "Console" que aparece en la parte inferior (puede aparecer un diálogo pidiendo
que grabemos el archivo, el cual confirmamos.
EJERCICIO 2.
Escribir un programa para calcular el área de un círculo, dado el radio por el usuario.
𝐴 = 𝜋 ∗ 𝑟2
Donde:
package ejersuma;
import java.util.Scanner;
System.out.println("ingrese el radio...");
r=x.nextDouble();
A=Math.PI *r*r;
System.out.printf("el area del circulo es %.2f",A);
}
}
EJECUTAMOS EL PROGRAMA
Ejercicios propuestos
1. Realizar la carga del lado de un cuadrado, mostrar por pantalla el perímetro del mismo (El
perímetro de un cuadrado se calcula multiplicando el valor del lado por cuatro)
2. Escribir un programa en el cual se ingresen cuatro números, calcular e informar la suma de
los dos primeros y el producto del tercero y el cuarto.
3. Realizar un programa que lea cuatro valores numéricos e informar su suma y promedio.
4. Se debe desarrollar un programa que pida el ingreso del precio de un artículo y la cantidad
que lleva el cliente. Mostrar lo que debe abonar el comprador.
Cualquier lenguaje suministra una serie de tipos de datos simples, como son los números enteros,
caracteres, números reales. En realidad suministra un subconjunto de éstos, pues la memoria del
ordenador es finita. Los punteros (si los tiene) son también un tipo de datos. El tamaño de todos
los tipos de datos depende de la máquina y del compilador sobre los que se trabaja.
ESTRUCTURAS FUNDAMENTALES
Los datos a procesar por una computadora se clasifican en:
Simples
Estructurados
Los datos simples ocupan sólo una casilla de memoria, por tanto una variable simple hace
referencia a un único valor a la vez.
Los datos Estructurados o Compuestos se caracterizan por el hecho de que con un nombre
(identificador de variable estructurada) se hace referencia a un grupo de casillas de memoria. Tiene
varios componentes.
Cabe hacer notar que en el presente texto, se tomará como herramienta para los
programas y representar las diferentes estructuras de datos el Lenguaje Java.
Ejemplos:
Dato Simple: Declaramos una variable A de tipo entero y asignamos el valor 25.
A Identificador
Dato Estructurado
int A[5] ; A= 20 30 40 50 60
A = {20,30,40,50,60};
Identificador
ABSTRACCIÓN
Una abstracción es un proceso mental donde se extraen rasgos esenciales de algo para
representarlos por medio de un lenguaje gráfico o escrito.
Una estructura de datos es cualquier colección de datos organizados de tal forma que tengan
asociados un conjunto de operaciones para poder manipularlos.
Al diseñar una estructura de datos con la técnica de abstracción pasa a ser un TDA, que:
Ejemplo:
LeerDatosEstudiante ()
Operaciones
ImprimirDatosEstudiante ()
ModificarDireccion()
o métodos
CalcularNotaFinal()
Como se puede notar existe una operación No Permitida denominada: CalcularNotaFinal(); que no
debiera estar presente en el TAD, debido a que no se cuenta con elementos que nos permitan
realizar esta operación.
Recuerda en todo momento que sólo deben incluirse las operaciones que puedan
trabajar con los elementos que contiene el TAD.
Las estructuras de datos desde el punto de vista de asignación de memoria, se clasifican en:
Estructuras Lineales
Estructuras No Lineales
Las estructuras dinámicas de datos son estructuras que cuya dimensión puede crecer o disminuir
durante la ejecución del programa. Por ejmplos: Listas Enlazadas, Árboles y Grafos.
Las estructuras de datos lineales se derivan de-l concepto de secuencia. Primero se definen las
secuencias como conjuntos de elementos entre los que se establece una relación de predecesor y
sucesor. Los diferentes TADs basados en este concepto se diferenciaran por las operaciones de
acceso a los elementos y manipulación de la estructura. Desde el punto de vista de la informática,
existen tres estructuras lineales especialmente importantes: vectores, las pilas, las colas y las listas.
Se denominan estructuras de datos No Lineales porque a cada elemento le pueden seguir varios
elementos o puede estar rodeado de elementos. Por ejemplo: Árboles, Grafos y Matrices
ARREGLOS
Definición: Colección finita, homogénea y ordenada de elementos. Finita: Porque todo arreglo tiene
un límite. Homogénea: Porque todos los elementos son del mismo tipo. Ordenada: Porque se puede
determinar cuál es el enésimo elemento.
Componentes
C1 C2 … Cn
Indices
i0 i1 … iN
Son los arreglos más simples y constan de un solo índice, también se llaman vectores.
Donde, C hace referencia a todo el vector, mientras que los índices hacen referencia a los elementos
en forma individual.
Para declarar un Array se utilizan corchetes para indicar que se trata de un Array y no de una simple
variable de tipo especificado. Su sintaxis es:
Tipo_dato identificador[ ];
O bien:
Tipo_dato [ ]identificador;
Donde:
Por ejemplo:
El programa: Array, trabaja con el vector losValores, que almacena un máximo de 10 elementos
enteros.
En este ejemplo se diseña el tipo de dato abstracto vector que maneja números enteros.
Vector
V[15]: Entero
N: Entero
leedim():void
leervector():void
mostrarvector(): void
main():void
package tema1;
import java.util.Scanner;
}
}
//programa principal
public static void main (String [] args)
{
leedim (); // llama al procedimiento para leer la dimensión del vector
leervector(); //llamada a LeerVector para llenar los datos en el vector
mostrarvector(); //llamada a mostrarvector para imprimir el
vector
}
Salida:
2 3 6 2
7 2 1 1
3 1 2 3
package tema1;
import java.util.Scanner;
/*Se deben crear tres vectores v1, v2,v3 y vecNuevo de m elementos cada uno;
se debe crear otro arreglo vecNuevo donde cada elemento sea la suma de los
elementos de cada arreglo. */
llenarVector (v1);
llenarVector (v2);
llenarVector (v3);
}
/* FUNCION QUE SUMA LOS ELEMENTOS DE UN VECTOR, COMO TODOS LOS VECTORES
QUE SE VA SUMAR TIENEN LA MISMA DIMENSION, NO SE NECESITA TENERLA COMO PARAMETRO
*/
Salida:
2. Escribir un programa para registrar en un vector los carnets de los estudiantes que
aprobaron Calculo I y en otro vector registrar los carnets de los estudiantes que aprobaron
Etica, y en un tercer vector los carnets de los que aprobaron ambas materias.
package tema1;
import java.util.Scanner;
}
static void llenarNuevo (int d, int d2)
{
int pos = 0;
for (int i = 0 ; i < d ; i++)
Lic Katya Perez Martinez 44 Estructura de Datos
{
if (buscaNum (vCalculo [i], d2) == true)
{
vComun [pos] = vCalculo [i];
pos++;
}
}
}
/* ME DICE CUANTOS CARNETS ESTAN EN AMBOS VECTORES.
TIENE 2 PARAMETROS: d: ES LA DIMENSION DE vCalculo,
d2: DIMENSION DE vEtica. BUSCA CADA ELEMENTO DE vCalculo en vEtica */
}
}
}
Salida
VectoresConParametros
V1[]:int
Imprime():void
Suma1():int
main()
v2 = v1;
Imprime (v2);
v3 = Suma1 (v2);
Imprime (v1);
Imprime (v3);
}
System.out.println ();
}
return elV;
}
}
Salida:
4. Programa para leer dos vectores ordenados de diferentes dimensiones y crear un tercer
vector con los elementos ordenados de ambos vectores.
Diseñamos la estructura de datos
Lic Katya Perez Martinez 47 Estructura de Datos
VectoresOrdenados
V1[]:int
llenarVector():void
ordenaVector():int
mostrarVector():void
main()
Implementando en java tenemos:
package tema1;
import java.util.Scanner;
Salida:
EJERCICIOS PROPUESTOS
1. Realizar un programa que permita leer en un vector N números enteros y luego, contar cuantos
elementos positivos y negativos existen.
2. Eliminar el primer elemento x, dado por el usuario que se encuentre en el vector de números
enteros de tamaño N.
3. Se almacena en un vector las cosechas de lechugas durante 6 meses, se pide : Leer la cantidad
de plantas de lechuga cosechadas por mes.
C es el vector que tiene en cada mes una cantidad de plantas de lechuga cosechadas, como se ve a
continuación:
15 75 23 55 85 13
1 2 3 4 5 6
2 75
4 55
5 85
b. Sabiendo que cada planta de lechuga cuesta 4Bs, se pide hallar cuanto ha ganado el
productor cada mes por su cosecha, y luego mostrar el total ganado en los 6 meses.
La salida como la siguiente:
1 15 60
2 75 300
3 23 92
4 55 220
5 85 340
6 13 52
A= 4 2 4 4 7 7
1 2 3 4 5 6
A= 4 2 7
1 2 3
1 2 3 4 5 6 … n
En la parcela 1 se cosechan: 100 toneladas de naranjas para jugo y 500 toneladas de naranjas
para comer
En la parcela 2 se cosecharon: 600 toneladas de naranjas para jugo y 0 toneladas de naranjas
para comer.
NOTA: Observe que la información de una misma parcela ocupa posiciones consecutivas en el
arreglo.
Se pide:
a. Leer la información y las toneladas por tipo de naranja de cada una de las parcelas
b. Calcular e imprimir el total de la producción por parcela
c. Imprimir las parcelas que tuvieron una producción de 0.
CADENAS EN JAVA
La clase String tiene varios métodos muy útiles como saber su longitud, trocear la cadena, etc.
Recuerda que para invocar un método debemos escribir el nombre del String, un punto y el nombre
del método, más sus parámetros. Es importante que si necesitas almacenar el valor devuelto, uses
una variable para ello.
Por ejemplo:
String cadena=”americano”;
De manera semejante se convierten los otros tipos primitivos de cadena a valores numéricos.
EJERCICIOS RESUELTOS
1. Contar el número de palabras que hay en una cadena, las palabras están separadas por
un espacio en blanco.
Diseñamos la estructura de la aplicacion
ContarPalabras
contar(): entero
main()
package cadenas;
import java.util.Scanner;
cad = sc.nextLine();
cuantos = contar (cad);
System.out.println ("Habia " + cuantos + " palabras");
}
while (i > 0)
{ // mientras haya espacios en blanco
n++; // sumo 1 al contador
st = st.substring (i + 1); // recorto la cadena para quitar una palabra
i = st.indexOf (" "); // encuentro el siguiente blanco
}
return n++; // para contar la ultima palabra
}
}
Salida:
Reemplazar
reemplazar():String
main()
import java.util.Scanner;
Salida
3. programa que pretende suprimir todos los espacios en blanco de una cadena cad. El resultado
queda en otra cadena.
Lic Katya Perez Martinez 56 Estructura de Datos
Diseñamos el TAD:
suprimir
suprime():String
main()
Implementando en java:
package cadenas;
import java.util.Scanner;
}
public static String suprime (String st, char espacio)
{
char a;
String otra = new String ("");
for (int i = 0 ; i < st.length () ; i++)
{
a = st.charAt (i);
if (a != espacio)
{
otra = otra + a;
}
}
return otra;
}
}
4. Programa que sirve para contar cuántas vocales tiene una palabra o frase.
Diseñamos el TAD
ContarVocales
contar():void
main()
package cadenas;
import java.util.Scanner;
public class ContarVocales {
static Scanner sc=new Scanner(System.in);
public static void main (String args[])
{
String palabra;
System.out.print("Dame una palabra o una frase ");
palabra = sc.next();
Contar (palabra);
}
static void Contar (String p)
{
int n = 0, cont = 0;
n = p.length ();
for (int i = 0 ; i < n ; i++)
{
if ((p.charAt (i) == 'a') || (p.charAt (i) == 'e') || (p.charAt (i)
== 'i') || (p.charAt (i) == 'o') || (p.charAt (i) == 'u'))
cont++;
}
System.out.println ("La palabra tiene " + cont + " vocales");
}
}
5. Escribir una aplicación para generar un código a partir del nombre, paterno, materno, dia,
mes y año de los datos del usuario.
Diseñamos el TAD
GenerarCodigo
Nombre: String
Paterno:String
Materno:String
Dia:
Generar():String
main()
package cadenas;
import java.util.Scanner;
static String Generar (String nom, String pat, String mat, int d, int m, int a)
{
char cod;
String Codigo = new String ("");
do
{
System.out.print ("Mes de nacimiento...");
mes = sc.nextInt();
}
while (mes > 13 || mes < 1);
System.out.print ("Año de nacimiento...");
anio = sc.nextInt();
Micodigo=Generar(Nombre,paterno,materno,dia,mes,anio);
System.out.println("El codigo es...."+Micodigo);
}
}
Salida:
EJERCICIOS PROPUESTOS
1. Crear una clase donde dado un string que representa un nombre en mayúsculas o
minúsculas devolver un string formado por las iniciales en mayúsculas seguidas de
un punto.
2. Crear una clase donde dado un string de palabras sustituir cada ocurrencia de un
caracter dado por otro caracter. (por ejemplo: todas las s por *)
4. Escriba una clase que reciba como parámetro el nombre de una persona, con el
apellido seguido de una coma, un espacio y después el nombre de pila. El
procedimiento debe imprimir el nombre de pila de la persona seguido de su apellido.
5. Escribe una clase en Java llamado Oraciones.java que contenga varias operaciones
para crear/manipular cadenas de caracteres.
Sustituya una palabra por otra dentro de una cadena de caracteres. Si no encuentra
la palabra a sustituir en la cadena original, ésta no cambiará.
static String cambiaCadena(String, String, String)
Elimine todas las ocurrencias de una palabra dentro de una cadena de caracteres. Si
no encuentra la palabra a eliminar en la cadena original, ésta no cambiará.
static String eliminaPalabra(String, String)
Nota: el esqueleto de la clase (Oraciones.java) en la que vas a agregar los métodos estáticos que se
te solicitan, es la siguiente, además, debes completar el método main
import java.util.Random;
import java.util.Scanner;
str2 = "Hola mundo como esta todo el mundo, como vemos el dia de
hoy en el mundo";
System.out.println("\nLa oracion es: " + str2);
str2 = "Hola mundo 123 como esta 4 todo 5667 el mundo, 98 como
vemos el dia 053 de hoy en el mundo";
String str2 = "Hola mundo como esta el mundo de bien o mal del mundo";
System.out.println("\nLa oracion es: " + str2);
System.out.print("\nLa palabra a cambiar es: mundo ");
System.out.print("\nLa palabra por la cual va a cambiar es: auto");
str2 = "Hola mundo como esta el mundo de bien o mal del mundo";
str2 = "Hola mundo como esta todo el mundo, como vemos el dia de
hoy en el mundo";
str2 = "Hola mundo como esta todo el mundo, como vemos el dia de
hoy en el mundo";
str2 = "Hola mundo como esta todo el mundo, como vemos el dia de
hoy en el mundo";
System.out.println("\n\n");
}
}
imprimeOraciones
Dentro del método imprimeOraciones deberás generar e imprimir las oraciones según se explica a
continuación:
Deberás utilizar los cuatro arreglos locales de Strings llamados: Artículo, Sujeto, Verbo y
Preposición.
El programa creará una oración seleccionando, aleatoriamente, una palabra de cada arreglo
en el siguiente orden: artículo, sujeto, verbo, preposición, artículo y sujeto.
Las palabras deberán estar separadas por un espacio en blanco.
Cuando se despliegue la oración formada, la primera letra deberá desplegarse en
mayúscula, y la última palabra deberá terminar con un punto.
Ejemplo de salida
En caso de que no se encuentre la primera palabra NO deberá realizar ningún cambio en la cadena
y ésta quedará igual.
Puedes utilizar StringBuilder y “jugar” entre substring, indexOf y/o lastIndexOf, append o similares.
NO podrás utilizar los métodos, replace, replaceAll, replaceFirst, delete, split o similares de la clase
String.
CambiaCadena
Suponiendo que probamos este método primero cambiando “mundo” por “auto” y luego, en otra
corrida, cambiamos “luna” por “marte” se deberá obtener una salida IDÉNTICA a la siguiente:
EliminaPalabra
El método estático llamado eliminaPalabra recibe una cadena y una palabra. Dicho
método elimina todas las ocurrencias de la palabra que se encuentran dentro de la
cadena. Regresa la cadena resultante.
Puedes utilizar StringBuilder y “jugar” entre substring, indexOf y/o lastIndexOf, append o similares.
eliminaPalabra
Suponiendo que la palabra a eliminar es “mundo” y, en una segunda corrida “luna”, el método
eliminaPalabra deberá obtener una salida IDÉNTICA a la siguiente:
cambiaCadenaMayusculas
El método estático llamado cambiaCadenaMayusculas recibe una cadena y una palabra. Dicho
método sustituye todas las ocurrencias de la palabra por la misma palabra en MAYÚSCULAS.
Regresa la cadena resultante.
En caso de que no se encuentre la palabra NO deberá realizar ningún cambio en la cadena y ésta
quedará igual.
Puedes utilizar StringBuilder y “jugar” entre substring, indexOf y/o lastIndexOf, append o similares.
NO podrás utilizar los métodos, replace, replaceAll, replaceFirst, delete, split o similares de la clase
String.
cambiaANumeros
El método estático llamado cambiaANumeros recibe una cadena. Dicho método sustituye todos los
dígitos de la cadena por su correspondiente palabra. Regresa la cadena resultante.
En caso de que no se encuentre algún dígito NO deberá realizar ningún cambio en la cadena y ésta
quedará igual.
NO podrás utilizar los métodos, replace, replaceAll, replaceFirst, delete, split o similares de la clase
String.
ARREGLOS MULTIDIMENSIONALES
Una matriz es un arreglo de dos dimensiones, y para especificar cualquier elemento, debemos hacer
referencia a dos índices (que representan la posición como renglón y columna). Aunque no se
justificará aquí, es conveniente mencionar que la representación matricial es puramente conceptual
y con el único fin de facilitar al programador el manejo de los elementos, ya que la computadora
almacena los datos en una forma totalmente diferente.
columnas
0 1
0 3 5
filas 1 8 2
2 6 1
Tipo: puede ser cualquier tipo de dato (int, float, char, etc.) incluyendo un tipo de dato
definido por el usuario.
nombre_de_Matriz es el nombre de la matriz.
Ejemplo:
Declaramos e inicializamos una matriz con los siguientes datos:
3 6 0
( )
2 5 9
int A[][]={{3,6,0},{2,5,9}};
Cabe aclarar que el primer elemento de la matriz siempre ocupa la fila 0 y la columna 0.
Las operaciones que pueden realizarse con arreglos bidimensionales son las siguientes:
Lectura/escritura
Asignación
Actualización: Inserción
Eliminación
Modificación
Ordenación
Búsqueda
En general los arreglos bidimensionales son una generalización de los unidimensionales, por lo que
se realizará un ejemplo con algunas de estas operaciones a continuación.
Ejemplo:
Escribir un programa para leer una matriz de elementos enteros, de f filas y c columnas. Por
ejemplo la siguiente matriz es de 3 filas y 2 columnas.
𝟎 𝟑 𝟏
𝟏 (𝟕 𝟔)
𝟐 𝟒 𝟗
Donde:
package matrices;
import java.util.Scanner;
A=new int[M][N] ;
for (int i = 0 ; i < M ; i++)
for (int j = 0 ; j < N ; j++)
{
System.out.print ("Ingrese elemento (" + i + "," + j + ")....");
Salida:
EJERCICIOS RESUELTOS
1. Leer una matriz cuadrada e imprimirla; también mostrar la suma de las filas, la suma de las
columnas, de la diagonal principal y de la diagonal secundaria.
𝟓 𝟔 𝟏 Diagonal principal
Diagonal secundaria (𝟗 𝟎 𝟑)
𝟕 𝟒 𝟓
La suma de la fila 0 : 5 + 6 + 1 = 12
La suma de la fila 1: 9 + 0 + 3 = 12
La suma de la fila 2: 7 + 4 + 5 = 16
La suma de la columna 0: 5 + 9 + 7 = 21
La suma de la columna 1: 6 + 0 + 4 = 10
La suma de la columna 0: 5 + 9 + 7 = 21
package matrices;
import java.util.Scanner;
static void Sumarf (int ma[] [], int t) //Sumar por filas
{
int acum = 0;
int v[] = new int [t];
static void Sumarc (int ma[] [], int t) // Sumar por columnas
{
int acum = 0;
int v[] = new int [t];
static int Sumarp (int m[] [], int t) // Suma de la diagonal principal
{
int acum = 0;
for (int i = 0 ; i < t ; i++)
{
acum += m [i] [i];
}
return acum;
}
static int Sumards (int m[] [], int t) //Suma de la diagonal secundaria
{
int acum = 0;
int h = t;
for (int i = 0 ; i < t ; i++)
{
--h;
acum += m [i] [h];
}
return acum;
}
Salida:
Ej.
2 3 4 4
0 3 7 2
0 0 8 9
0 0 0 3
2. Crear una aplicación que imprima la siguiente matriz para m filas y n columnas
11 12 13 14 15
21 22 23 24 25
31 32 33 34 35
5. Diseñe el TAD necesario para formar una matriz de orden NxM y la llene de datos enteros,
(toda esta información la proporciona el usuario), a continuación obtenga e imprima:
a. Contar los elementos pares e impares
b. Hallar la suma de los elementos de la diagonal secundaria
c. Dado la fila y la columna por el usuario, devuelva el elemento que corresponda a
esa posición
REGISTROS (ESTRUCTURAS)
Cuando se habló de los arreglos se mencionó que se trataba de una colección de datos, todos del
mismo tipo, que era un tipo estructurado de datos, y que son ellos se podía solucionar un gran
número de problemas. Sin embargo, en la práctica a veces se necesitan estructuras que permitan
almacenar distintos tipos de datos (característica con la cual no cuentan los arreglos).
Ejemplo
Una compañía tiene por cada empleado los siguientes datos:
Si se quisiera almacenar estos datos no sería posible usar un arreglo, ya que sus componentes deben
ser todos del mismo tipo.
Registro VariableRegistro;
VariableRegistro.Operacion();
Ejemplo de Registro:
Representamos gráficamente el registro de un empleado, con sus cinco campos que son: CI,
Nombre, género y sueldo.
Registro: EMPLEADO
Diseñamos ahora la estructura del registro, mediante la siguiente notación, que contiene
los datos y sus operaciones:
package registros;
import java.util.Scanner;
void imprimirE()
{
System.out.print(+ci+", "+Nombre+", "+genero+", "+cargo+",
"+sueldo);
boolean EsVaron()
Escribimos una aplicación en java para utilizar este registro, almacenamos e imprimimos a un
empleado y también verificamos si es varón:
package registros;
Salida:
REGISTROS ANIDADOS
También está permitido anidar estructuras, con lo cual se pueden conseguir superestructuras muy
elaboradas.
Ejemplo:
A los datos del empleado, del ejemplo anterior, añadir dos campos: fecha de nacimiento y fecha de
ingreso a la empresa. Pero ambas fechas tienen: día, mes año.
Entonces el campo fecha, será un registro con tres campos: día, mes y año, luego tendremos lo
siguiente:
Registro: Fecha
FECHA
Dia: int
Mes:int
Anio:int
leerFecha():void
imprimirFecha():void
package registros;
import java.util.Scanner;
void imprimirFecha()
{
System.out.print(", "+dia+", "+mes+", "+anio+" ");
}
Registro: Empleado
Ahora modificamos la estructura del registro del empleado añadiendo los dos campos de fecha de
ingreso y fecha de nacimiento del empleado:
EMPLEADO
CI: int
Nombre: String
Genero: char
Cargo: String
sueldo: float
fechaNac:Fecha
fechaIng:Fecha
LeerE():void
ImprimirE():void
EsVaron():boolean
import java.util.Scanner;
void imprimirE()
{
System.out.print(+ci+", "+Nombre+", "+genero+", "+cargo+",
"+sueldo);
fechaIng.imprimirFecha();
fechaNac.imprimirFecha();
System.out.println();
boolean EsVaron()
{
if (genero=='m')
return true;
else
return false;
}
}
Ejemplo:
Utilizaremos el registro del empleado, que se escribió anteriormente, ahora implementaremos
mediante un arreglo que almacena a N empleados.
Realizamos el Diseño de la estructura de datos del vector de registros de empleados como sigue:
VectorEmpleado
VE[N]: Empleado
N:int
i: int
LeerVE():void
ImprimirVE():void
ListarVarones():void
package registros;
import java.util.Scanner;
void LeerVectorEmpleado ()
{
System.out.print ("Cuantos empleados desea registrar...");
N = sc.nextInt();
ve=new Empleado[N];
}
void ImprimirVectorEmpleado ()
{
System.out.println (".....IMPRIMIENDO DATOS DE LOS EMPLEADOS....");
System.out.println ();
for ( i = 0 ; i <N ; i++)
{
ve[i].imprimirE();
}
}
AppVectorEmpleado
T: VectorEmpleado
main()
package registros;
Salida:
Articulo VectorArticulo
codigo: int VA[N] : Articulo
NombreArt: String N: int
precio: float i: int
stock: int LeerVA():void
fechaVencimiento: Fecha ImprimirVA():void
LeerA():void ModificarPrecios: void
ImprimirA():void
CambiarPrecio(int x):float
AppVectorArticulo
Tienda1: VectorArticulo
Tienda2 : VectorArticulo
main()
VectorFamilias AppVectorFamilias
VF[N]: Familia LP: VectorFamilias
N: int STC: VectorFamilias
I:int main()
leerVF():void
ImprimirVF(): void
Poco Densa indica una proporción muy alta de ceros entre los elementos de la matríz. Es decir una
matriz poco densa es aquella que tiene gran cantidad de elementos ceros.
Ejemplo:
La matriz A de 4 filas por 4 columnas, del total de elementos que es 16, solo 4 de ellos son diferentes
de cero.
0 1 1 0
A=
0 0 1 0
0 1 0 0
0 1 0 0
Existen diversos métodos para almacenar los valores diferentes de cero de una matríz poco densa.
A continuación presentamos uno de ellos.
Se utiliza un arreglo unidimensional, donde cada elemento es un registro formado por tres campos:
uno para guardar la fila donde se encontró el valor diferente de cero, otro para guardar la columna,
y el tercero para guardar el valor del elemento distinto de cero de la matriz.
El siguiente programa nos permite crear la estructura para una matriz poco densa, se lo ha
denominado MatrizPocoDensa.java:
Luego diseñamos el Vector de Registros para leer la matriz por filas y luego imprimir la Matriz Poco
Densa:
MatrizPocoDensa
V[k]: RegMPD
K:int
LeerMatriz():void
ImprimirMatriz():void
import java.util.Scanner;
void leerMatriz()
{
int M, N, i,j,k, e;
k = 0;
System.out.print ("INGRESE EL NUMERO DE FILAS DE LA
MATRIZ....");
M = sc.nextInt ();
System.out.print ("INGRESE EL NUMERO DE COLUMNAS DE LA
MATRIZ....");
N = sc.nextInt();
k = 1;
for (i = 1 ; i <= M ; i++)
{
for (j = 1 ; j <= N ; j++)
{
System.out.print ("Ingrese el valor de la posicion (" + i
+ "," + j + ") =");
e = sc.nextInt();
if (e != 0)
{
A [k] = new RegMPD (i, j, e);
k = k + 1;
}
}
}
A [0]= new RegMPD (M, N, (k - 1));
}
void ImprimirMatrizPocoDensa()
{
int i, j, k;
k = 1;
System.out.println ("IMPRIMIENDO LA MATRIZ POCO DENSA....");
AppMatrizPocoDensa
R: MatrizPocoDensa
main()
package matricesPocoDensas;
R.leerMatriz();
R.imprimirMatriz();
Salida:
RECURSION
“... Como el costo de la programación aumenta con regularidad y el costo de la computación
disminuye, hemos llegado al punto en donde la mayoría de los casos no vale la pena que un
programador desarrolle laboriosamente una solución no recursiva para un problema que se resuelve
con mayor naturalidad en forma recursiva”.
RECURSIÓN VS ITERACIÓN
¿Cuándo debemos utilizar la iteración y cuándo la recursión? Hay por lo menos estos tres factores
a considerar:
1. Las funciones iterativas son usualmente más rápidas que sus contrapartes recursivas. Si la
velocidad es importante, normalmente usaríamos la iteración.
RECURSIÓN
La recursividad desde el punto de vista de la programación es una poderosa herramienta que
facilita la implementación de algunos algoritmos que de otro modo se harían muy complejos.
El ejemplo clásico de esto último es el recorrido de árboles.
Se debe confiar en que, al llamar a una COPIA de la función, ESA función VA A RESOLVER EL
PROBLEMA QUE LE ENTREGAMOS. No importa cuán difícil sea ese problema, debemos creer que lo
soluciona.
Hay que verificar que el problema "más pequeño" sea efectivamente MÁS PEQUEÑO, es decir, que
el problema esté más cerca de solucionarse. La idea es que sepamos que en cada llamada recursiva
estamos más cerca del caso BASE.
Lic Katya Perez Martinez 92 Estructura de Datos
Ejemplo
La función factorial, se define en matemática como:
Claramente se ve que:
n! = n * (n-1)!
^ ^ ^
| | |
| | Problema de tamaño (n-1)
| Calculo
Problema de tamaño n
Factorial Iterativo
Factorial Recursivo
La function factorial en forma recursive, se define:
1 𝑠𝑖 𝑁 = 0
N! =
𝑁 ∗ (𝑁 − 1)! 𝑠𝑖 𝑁 > 0
¿CÓMO FUNCIONA?
Es necesario llevar un registro de todas las operaciones que se dejan pendientes hasta que se llega
al caso base.
El patrón que sigue este registro es el de una pila, en donde la operación original se deja en el fondo
y en el tope aparecería el caso base.
Una vez que se llenó la pila, se efectúa la operación de vaciar la pila efectuando todos los cálculos
que previamente se habían dejado pendientes.
Para ser realistas, la recursión no solo pasa una copia de los parámetros (operandos de los cálculos
pendientes), sino que también debe pasar una copia de las direcciones de llamada de función en
cada paso para regresar al punto original del programa donde se inició el proceso de recursión.
Por lo general, los lenguajes de alto nivel como el C, C++ o Java, enmascaran todos los detalles de la
implementación. A pesar de lo anterior, es necesario tomarlo en cuenta debido a que la pila exige
una gran cantidad de recursos (memoria y tiempo) de la máquina a la hora de ponerla a funcionar.
Fibonacci
Fibonacci (n) =
Fibonacci(n) = 0 si n = 0
1 si n = 1
Para calcular
Por lo tanto:
Utiliza recursión cuando se mejora el diseño del algoritmo y se ejecuta en un tiempo y espacio
razonable.
TIPOS DE RECURSIVIDAD
Recursividad simple: Aquella en cuya definición sólo aparece una llamada recursiva. Se
puede transformar con facilidad en algoritmos iterativos.
Recursividad múltiple: Se da cuando hay más de una llamada a sí misma dentro del cuerpo
de la función, resultando más dificil de hacer de forma iterativa.
Ejemplo
Recursividad anidada:
En algunos de los arg. de la llamada recursiva hay una nueva llamada a sí misma.
if (n == 0 ) return (m+1)
else
{ if ( nump == 0 ) { if ( numi == 0 )
return(1); return(0);
} }
LA PILA DE RECURSION
La memoria del ordenador se divide (de manera lógica, no física) en varios segmentos (4):
Segmento de código: Parte de la memoria donde se guardan las instrucciones del programa en cod.
Máquina.
Lic Katya Perez Martinez 97 Estructura de Datos
Segmento de datos: Parte de la memoria destinada a almacenar las variables estáticas.
Pila del programa: Parte destinada a las variables locales y parámetros de la función que está siendo
ejecutada.
EJERCICIOS RESUELTOS
1) Calcular x elevado a n de forma recursiva:
3^2 = 9 3^0 = 1
3*2 = 6
package ejercicios;
import java.util.Scanner;
Pablo Neruda
Ejemplo 1:
Si se declara un Vector de 5 elementos de tipo int, éste podrá cambiar su contenido, pero no su
estructura.
Hay muchas situaciones en las que se desea cambiar el tamaño de las estructuras usadas.
La técnica usada para manejar estas situaciones es la asignación dinámica de memoria. Con este
tipo de asignación se tendrán variables dinámicas o referenciadas, que pueden crearse y destruirse
en tiempo de ejecución.
Ejemplo 2:
Si se pide diseñar un programa para gestionar una agenda de teléfonos con los datos de personas
(nombre, apellidos, dirección, cumpleaños, teléfono, email, etc...). ¿Qué estructura puede utilizarse
para realizarla?
Si el número de personas de la agenda es mucho menor que MAX se está desperdiciando memoria
que podría ser utilizada por otros programas
En muchos otros casos no es posible conocer anteladamente el número de “elementos” que se van
a usar.
Ejemplo 3:
2. ÁRBOLES Y GRAFOS
LISTAS ENLAZADAS
Las listas enlazadas son estructura de datos naturales donde el número de elementos
que la integran no es conocido, o en su mejor caso, la cantidad de los mismos puede
variar.
Una lista enlazada es una estructura de datos en la que los objetos están ubicados linealmente.
En lugar de índices de arreglo aquí se emplean punteros para agrupar linealmente los
elementos.
La lista enlazada permite implementar todas las operaciones de un conjunto dinámico.
Si el predecesor de un elemento es NULL, se trata de la cabeza de la lista.
Dirección de
Puntero
memoria
cabecera
9 3 7 5
NOTA Las listas almacenadas en arreglos están sujetos al tamaño del arreglo para su crecimiento. Si
estos están vacíos se esta ocupando memoria sin uso. Además las listas reflejan el orden lógico y el
orden físico de los elementos en el arreglo.
Características:
Donde:
dirsgte: almacena la dirección del siguiente nodo de la lista, en caso de ser el último nodo entonces
apunta a nulo.
ListaLineal
Nodo
InsertarInicio(e):void
InsertarFinal(e):void
EliminarInicio():tipo_dato
EliminarFinal():tipo_dato
Recorrido():void
9 3 7 5
Nodo ListaLineal
Info:String
Dirsgte: Nodo P: Nodo
Vacia():boolean
InsertarInicio(e):void
InsertarFinal(e):void
EliminarInicio():String
EliminarFinal():String
Recorrido():void
nodo p = null;
INSERCIÓN
INSERCIÓN AL FINAL DE LA LISTA
En el siguiente segmento de código se ejemplifica solamente el caso en el que el elemento se
adiciona al final de la lista tal y como si se tratase de una estructura Pila o Cola.
9 3 7 5
q.info = elem;
q.dirsgte = null;
if (p == null)
p = q;
else
{
while (t.dirsgte != null)
t = t.dirsgte;
t.dirsgte = q;
}
}
9 3 7 5
Mary
Q
9 3 7 5
String eliminaInicio ()
{
//elimina el nodo del inicio de la lista
String elem;
nodo q = p;
p = p.dirsgte;
elem=p.info;
q = null;
return elem;
}
T Q
String eliminaFinal ()
{
//elimina un nodo del final de la lista
nodo q = p;
String elem="";
if (p.dirsgte == null)
{ elem=p.info;
p = null;
}
else
{
nodo t = p;
while (q.dirsgte != null)
{
t = q;
q = q.dirsgte;
}
t.dirsgte = null;
elem=q.info;
q = null;
}
return elem;
}
VACIA
Permite verificar si una lista esta vacia.
boolean vacia()
{
if (p==null)
return true;
else
return false;
}
BUSCAR
Busca un elemento en la lista y devuelve verdad, si el elemento existe, caso contrario devuelve
falso.
package listas;
import java.util.Scanner;
q.info = elem;
q.dirsgte = null;
if (p == null)
p = q;
else
{
while (t.dirsgte != null)
t = t.dirsgte;
t.dirsgte = q;
}
}
void recorrido ()
{
//Recorrer la lista
System.out.println (" \n....RECORRIDO DE LA LISTA....");
nodo q = p;
while (q != null)
{
System.out.print (q.info + ", ");
q = q.dirsgte;
}
}
boolean vacia()
{
if (p==null)
return true;
else
return false;
}
String eliminaInicio ()
{
//elimina el nodo del inicio de la lista
String elem;
nodo q = p;
p = p.dirsgte;
elem=p.info;
q = null;
return elem;
}
String eliminaFinal ()
{
//elimina un nodo del final de la lista
nodo q = p;
String elem="";
if (p.dirsgte == null)
{ elem=p.info;
p = null;
}
if (Q.info.equals(e) )
sw= true;
Q=Q.dirsgte;
}
return sw;
}
EJERCICIO
Escribir una aplicación en java para llamar a todas las operaciones con listas.
ListaLineal A;
A=new ListaLineal();
A.llenarLista();
A.recorrido();
if (A.buscar("maria"))
System.out.println("\n\n elemento encontrado...");
else
System.out.println("\n\n elemento no encontrado...");
System.out.println("\n\n Eliminando un elemento del final de la lista");
A.eliminaFinal();
A.recorrido();
A.eliminaInicio();
System.out.println("\n\n Eliminando un elemento del inicio de la
lista");
A.recorrido();
}
Salida:
Nodo
Donde:
EnlaIz : Enlace Izquierdo, es de tipo puntero y apunta al nodo de la izquierda del nodo actual, en
caso de ser el primer nodo apunta a null.
EnlaDer: Enlace derecho, es de tipo puntero y apunta al nodo de la derecha del nodo actual, en caso
de ser el último nodo de la lista, apunta a null.
Listas dobles lineales. En este tipo de lista doble, tanto el puntero izquierdo del primer nodo
como el derecho del último nodo apuntan a null.
Listas dobles circulares. En este tipo de lista doble, el puntero izquierdo del primer nodo
apunta al último nodo de la lista, y el puntero derecho del último nodo apunta al primer
nodo de la lista.
9 3 7 5
package listas;
import java.util.Scanner;
void recorrido ()
{
//Recorrer la lista
System.out.println (" \n....RECORRIDO DE LA LISTA....");
nodo q = p;
while (q.dirsgte !=p )
{
System.out.print (q.info + ", ");
q = q.dirsgte;
}
System.out.print (q.info );
}
boolean vacia()
{
if (p==null)
return true;
else
return false;
}
String eliminar ()
{
//elimina el segundo nodo de la lista circular
String elem="";
nodo q = p;
if (p.dirsgte==p)
{
elem=p.info;
p=null;
}
else
{
q=q.dirsgte;
elem=q.info;
p.dirsgte=q.dirsgte;
q=null;
}
return elem;
}
boolean buscar(String e)
{
nodo Q;
La aplicación para llenar una lista L y luego realizar el recorrido de la lista circular, para luego eliminar
un elemento es el siguiente:
package listas;
L.llenarLista();
L.recorrido();
En la figura siguiente se muestra un ejemplo de una lista doblemente ligada lineal que almacena
nombres: 9 2
4 3 9 Ana null
3 Ana 2
p Null Ana 3 4 Ana 9
El programa para listas lineales dobles en java, para elementos de tipo cadena es el siguiente:
package listas;
import java.util.Scanner;
}
String EliminarInicio()
{ String elem="";
Nodo Q=p;
elem=p.Info;
if(p.EnlaDer==null)
p=null;
else
{
p=p.EnlaDer;
p.EnlaIz=null;
Q=null;
}
return elem;
}
void recorrido ()
{
System.out.println (" \n....RECORRIDO DE LA LISTA....");
Nodo q = p;
while (q != null)
boolean vacia()
{
if (p==null)
return true;
else
return false;
}
package listas;
ListaDoble A;
A=new ListaDoble();
A.llenarLista();
A.recorrido();
A.EliminarInicio();
System.out.println("\n\n Eliminando un elemento del inicio de la
lista");
A.recorrido();
}
}
Lic Katya Perez Martinez 120 Estructura de Datos
Salida:
Q=new nodo();
Q.info=e;
T=p;
c=1;
La aplicacion para insertar el nombre de laura, despues del tercer nodo, sera el siguiente:
package listas;
ListaLineal A;
A=new ListaLineal();
A.llenarLista();
A.recorrido();
System.out.println("\n\n ISERTANDO EL NOMBRE DE LUARA DESPUES DEL 3ER
NODO");
A.InsertaKesimo("Laura", 3);
A.recorrido();
}
Salida:
Escribimos uma aplicacion para llamar a este procedimento que lleva al final el primer nodo, como
se ve a continuacion:
package listas;
A.llenarLista();
A.recorrido();
A.LlevarElPrimerAlUltimo();
System.out.println("\n\n LLEVANDO EL PRIMER NODO AL ULTIMO DE LA LISTA");
A.recorrido();
}
}
Salida:
INTRODUCCIÓN
Dada una pila P = (a, b, c, ... k ), se dice que a, es el elemento más inaccesible de la pila,
está en el fondo de la pila (bottom) y que k, por el contrario, el más accesible, está en el
Tope.
Las restricciones definidas para la pila implican que si una serie de elementos A, B, C, D, E
se añaden, en este orden a una pila, entonces el primer elemento que se borre de la
estructura deberá ser el E. Por tanto, resulta que el último elemento que se inserta en una
pila es el primero que se borra. Por esta razón, se dice que una pila es una lista LIFO (Last
Input First Output, es decir, el último que entra es el primero que sale).
Como en un procesador sólo se puede estar ejecutando un procedimiento, esto quiere decir
que sólo es necesario que sean accesibles los datos de un procedimiento (el último activado
que está en la cima). De ahí que la estructura pila sea muy apropiada para este fin.
Como en cualquier estructura de datos, asociadas con la estructura pila existen una serie
de operaciones necesarias para su manipulación, éstas son:
a. Crear la pila.
b. Comprobar si la pila está vacía. Es necesaria para saber si es posible eliminar elementos.
c. Acceder al elemento situado en la cima.
d. Añadir elementos a la cima.
e. Eliminar elementos de la cima.
La especificación correcta de todas estas operaciones permitirá definir adecuadamente
una pila.
1 2 3 4 … MAX
444
TOPE 222 TOPE
434
555
PILA
4
ESTRUCTURA DE UNA PILA UTILIZANDO ARREGLOS
3
2 PILA
Nombre del TAD
1
V[MAX]: tipo_dato
Tope: entero
elementos
Poner(e)
Quitar()
Imprimir()
operaciones Vacia()
Llena()
Donde:
package estructurasEstaticas;
import java.util.Scanner;
pila ()
{
tope = 0;
}
boolean vacia ()
{
if (tope == 0)
return (true);
else
return (false);
}
boolean llena ()
{
if (tope == MAX)
return (true);
else
return (false);
}
void llenarPila ()
{
int n, e;
System.out.println ("cuantos elementos ??...");
n = sc.nextInt();
for (int i = 1 ; i <= n ; i++)
{
System.out.print ("elemento?...... ");
e = sc.nextInt();
poner (e);
}
}
}
package estructurasEstaticas;
P2.imprimir ();
sumarPilas (P1, P2, P3);
System.out.println("\n\n SUMANDO LAS DOS PILAS \n\n");
P3.imprimir ();
IntercambiaFondoTope(P3);
P3.imprimir ();
}
}
Salida:
Lic Katya Perez Martinez 130 Estructura de Datos
Realizar un procedimiento para intercalar los elementos de una pila A con los elementos
de una pila B en una pila C. Es decir:
A= 3 4 77 89 B= 23 11 44 33
TOPE TOPE
C= 89 33 77 44 4 11 3 23
TOPE
}
}
Salida:
Llamadas a subprogramas
Recursión
Tratamiento de expresiones aritméticas
Ordenación
LLAMADAS A SUBPROGRAMAS
Cuando se tiene un programa que llama a un subprograma, internamente se usan pilas para guardar
el estado de las variables del programa en el momento que se hace la llamada. Así, cuando termina
Por ejemplo, se tiene un programa principal (PP) que llama a los subprogramas UNO y DOS. A su
vez, el subprograma DOS llama al subprograma TRES. Cada vez que la ejecución de uno de los
subprogramas concluye, se regresa el control al nivel inmediato superior.
Cuando el programa PP llama a UNO, se guarda en una pila la posición en la que se hizo la llamada.
Al terminar UNO, el control se regresa a PP recuperando previamente la dirección de la pila. Al
llamar a DOS, nuevamente se guarda la dirección de PP en la pila. Cuando DOS llama a TRES, se pone
en la pila la dirección de DOS. Después de procesar TRES, se recupera la posición de DOS para
continuar con su ejecución. Al terminar DOS se regresa el control a PP, obteniendo previamente la
dirección guardada en la pila.
UNO
….
DOS
…… …
….
….
TRES
….
….
….
Finalmente podemos concluir que las pilas son necesarias en esta área de aplicaciones por lo
siguiente:
Permiten guardar la dirección del programa (subprograma) desde donde se hizo la llamada
a otros subprogramas, para poder regresar y seguir ejecutándolo a partir de la instrucción
inmediata a la llamada.
Permiten guardar el estado de las variables en el momento que se hace la llamada, para
poder seguir ocupándolas al regresar del subprograma.
Lic Katya Perez Martinez 134 Estructura de Datos
RECURSIÓN
Se Tratará en el tema 5 el tema de recursión. Se dejará para entonces la aplicación de pilas en
procesos recursivos.
Dada la expresión A+B se dice que está en notación infija, y su nombre se debe a que el
operador (+) está entre los operandos ( A y B).
Dada la expresión AB+ se dice que está en notación postfija, y su nombre se debe a que el
operador (+) está después de los operandos (A y B).
Dada la expresión +AB se dice que está en notación prefija, y su nombre se debe a que el
operador (+) está antes que los operando (A y B).
La ventaja de usar expresiones en notación polaca postfija o prefija radica en que no son
necesarios los paréntesis para indicar orden de operación, ya que éste queda establecido
por la ubicación de los operadores con respecto a los operandos.
Para convertir una expresión dada en notación infija a una notación postfija (o prefija)
deberán establecerse previamente ciertas condiciones:
Solamente se manejarán los siguientes operadores (están dados ordenadamente de mayor
a menor según su prioridad de ejecución):
^ (potencia)
*/ (multiplicación y división)
+- (suma y resta)
Los operadores de más alta prioridad se ejecutan primero.
Si hubiera en una expresión dos o más operadores de igual prioridad, entonces se
procesarán de izquierda a derecha.
La subexpresiones patentizadas tendrán más prioridad que cualquier operador.
Presentaremos, paso a paso, algunos ejemplos de conversión de expresiones infijas a
notación polaca postfija.
EJEMPLO
En este ejemplo se presentan dos casos de traducción de notación infija a postfija. El primero de
ellos es una expresión simple, mientras que el segundo presenta un mayor grado de complejidad.
PILAS DINÁMICAS
Implementaremos las pilas mediantes listas enlazadas simples, a continuación
presentamos el código en java.
package estructurasDinamicas;
import java.util.Scanner;
Escribir una aplicación para utilizar las pilas dinámicas. Los ejercicios son:
package estructurasDinamicas;
while(!Aux.esVacia())
{
A.Poner(Aux.Quitar());
}
}
A.LlenarPila();
A.Imprimir();
EliminarNegativos(A);
A.Imprimir();
IntercambiaFondoTope(A);
A.Imprimir();
}
Salida:
1. Escriba un programa que elimine los elementos repetidos de una pila. Los elementos
repetidos ocupan posiciones sucesivas.
2. Escriba un subprograma que invierta los elementos de una pila.
Un hombre caminaba por el bosque cuando vió una zorra lisiada. "¿Cómo hará para alimentarse?", pensó.
En ese momento, se acercó un tigre, con un animal entre los dientes. Sació su apetito, y le dejó a la zorra lo que había
sobrado. "Si Dios ayuda a la zorra, también me va a ayudar", reflexionó.
Volvió a su casa, se encerró en ella, y se quedó esperando que los Cielos le proveyeran de alimento. Nada pasó.
Cuando ya se estaba quedando demasiado débil para salir a trabajar, se le apareció un ángel.
- ¡Levántate, toma tus herramientas, y sigue el camino del tigre! de Paulo Coelho
INTRODUCCIÓN
La estructura de datos "cola" también llamada "Queue", es un tipo de datos abstracto "TDA". Una
cola TDA permite a una lista de cosas ser removidos en el orden en que fueron almacenados.
Una cola es una lista de elementos en la que éstos se introducen por un extremo y se eliminan por
otro. Los elementos se eliminan en el mismo orden en el que se insertaron. Por lo tanto, el primer
elemento que entra a la cola será el primero en salir. Debido a esta característica, las colas también
reciben el nombre de estructuras FIFO (First In, First Out: Primero en entrar, primero en salir).
Las colas en computación son muy similares a las colas de la vida real.
Ejemplos:
Al igual que la pila, la cola es una estructura de datos dinámica, pero puede ser
representado en forma estática (arreglos).
Existe un orden de elementos ya que es una estructura lineal, pero los elementos
no están ordenados por su valor sino por orden de introducción en la cola.
- Arreglos
- Listas Enlazadas.
Como en el caso de las pilas, utilizaremos arreglos. Debe definirse el tamaño máximo para la cola y
dos variables auxiliares. Una de ellas para que guarde la posición del primer elemento de la cola
(FRENTE) y otra para que guarde la posición del último elemento de la cola (FINAL). En el ejemplo
siguiente se muestra una representación de una cola en la cual se ha insertado cuatro elementos:
11, 22, 33 y 44, en ese orden.
El elemento 11 está en el frente ya que fue el primero que entró en la cola. Mientras que el elemento
44, que fue el último en entrar, está en el FINAL de la cola.
Q=
11 22 33 44
Frente Final
Insertar(e)
operaciones Eliminar()
Imprimir()
Vacia()
Llena()
FRENTE()
FINAL()
Donde los elementos son:
Frente: es la variable que indica la posición del elemento del frente de la cola.
COLAS LINEALES
A continuación implementamos el código correspondiente al programa de manejo de colas
lineales en java:
import java.util.Scanner;
boolean llena ()
{
if (fin == MAX)
return (true);
else
return (false);
}
void insertar (int elem)
Lic Katya Perez Martinez 144 Estructura de Datos
{
if (!llena ())
{
fin++;
v [fin] = elem;
if (frente == 0)
frente = 1;
}
else
{
System.out.println ("COLA LINEAL LLENA....");
System.exit (0);
}
}
int eliminar ()
{
int e = 0;
if (!vacia ())
{
e = v [frente];
if (frente == fin)
{
frente = 0;
fin = 0;
}
else
frente = frente + 1;
}
else
{
System.out.println ("LA COLA ESTA VACIA...");
System.exit (0);
}
return (e);
}
void imprimir ()
{
System.out.println ("IMPRIMIENDO LA COLA......");
for (int i = frente ; i <= fin ; i++)
System.out.println (v [i]);
}
int FINAL ()
{
return (fin);
}
int FRENTE ()
{
return (frente);
void llenarCola ()
{
int N;
int e;
System.out.println ("Cuantos elementos desea insertar a la cola ??");
N=sc.nextInt();
for (int i = 1 ; i <= N ; i++)
{
System.out.print ("Introduzca un elemento....");
e = sc.nextInt();
insertar (e);
}
}
}
import java.util.Scanner;
while (A.FRENTE () != m + 1)
{
e = A.eliminar ();
if (x % e != 0)
A.insertar (e);
}
A.imprimir ();
}
EliminarDivisoresX (Q);
}
}
Salida:
COLAS CIRCULARES
Para hacer un uso más eficiente de la memoria disponible se trata a la cola como una estructura
circular. Es decir, el elemento anterior al primero es el último. En la siguiente figura se muestra la
representación de una cola circular.
33
45
22
85 Frente
67
Para el siguiente ejemplo (a), en el cual ya no es posible adicionar elementos siguiendo la anterior
estructura, se propone la alternativa (b):
D E
1 2 3 4 5
Frente Final
(a)
F D E
1 2 3 4 5
Final Frente
Final Final
(B)
El diseño de la estructura de datos de una cola circular no varia en relación a una estructura de datos
lineal, por tanto a continuación mostramos las operaciones que sufren cambios en este tipo de
colas.
import java.util.Scanner;
ColaCircular ()
{
frente = 0;
fin = 0;
}
boolean vacia ()
{
if (frente == 0)
return (true);
else
return (false);
}
boolean llena ()
{
if ((fin == MAX && frente == 1) || (fin + 1 == frente))
return (true);
else
return (false);
}
}
Lic Katya Perez Martinez 149 Estructura de Datos
else
{
System.out.println ("COLA CIRCULAR LLENA....");
System.exit (1);
}
}
int eliminar ()
{
int e = 0;
if (!vacia ())
{
e = v [frente];
if (frente == fin)
{
frente = 0;
fin = 0;
}
else
if (frente == MAX)
frente = 1;
else
frente = frente + 1;
}
else
{
System.out.println ("LA COLA ESTA VACIA...");
System.exit (0);
}
return (e);
}
void imprimir ()
{
System.out.println ("IMPRIMIENDO LA COLA......");
for (int i = frente ; i <= fin ; i++)
System.out.println (v [i]);
}
int FINAL ()
{
return (fin);
}
int FRENTE ()
{
return (frente);
}
package estructurasEstaticas;
while (A.FRENTE () != m + 1)
{
e = A.eliminar ();
if (e>0)
A.insertar (e);
}
A.imprimir ();
}
Salida:
COLAS DE PRIORIDADES
Una cola de prioridad es una estructura característica, donde se pude retirar e insertar un ítem
teniendo en cuenta la clave más grande o más chica (según la implementación) definida por el
programador. Si los ítems tienen claves iguales, entonces la regla usual utilizada es que el primer
ítem insertado es el que se retirará primero.
Podemos representar una cola de prioridad como una lista contigua ordenada, en la cual retirar un
ítem es una operación inmediata, pero la inserción tomaría un tiempo proporcional al número de
elementos que se encuentren en la cola, hay que tener en cuenta que dicha operación se debe
realizar en forma tal que la cola quede ordenada. Otra forma de representación es a través de una
Lic Katya Perez Martinez 152 Estructura de Datos
lista desordenada, en la cual el proceso de inserción es inmediato, pero el de extracción es muy
lento, ya que debo recorrer toda la cola para encontrar el ítem que debo retirar.
Si se plantea representar más de dos pilas sobre ese mismo array A, no es posible seguir la misma
estrategia, ya que un array unidimensional sólo tiene dos puntos fijos, A[1] y A[n], y cada pila
requiere un punto fijo para representar el elemento más profundo.
Cuando se requiere representar secuencialmente más de dos pilas, por ejemplo m pilas, es
necesario dividir en m segmentos la memoria disponible, A[1..n], y asignar a cada uno de los
segmentos a una pila. La división inicial de A[1..n] en segmentos se puede hacer en base al tamaño
esperado de cada una de las estructuras. Si no es posible conocer esa información, el array A se
puede dividir en segmentos de igual tamaño. Para cada pila i, se utilizará un índice f(i) para
representar el fondo de la pila i y un índice c(i) para indicar dónde está su tope. En general, se hace
que f(i) esté una posición por debajo del fondo real de la pila, de forma que se cumpla la condición
f(i)=c(i) si y solamente si la pila i está vacía.
COLAS DINAMICAS
package estructurasDinamicas;
import java.util.Scanner;
Cola()
{
Frente=null;
Fin=null;
}
if (esVacia ())
{
Frente = Q;
Fin = Q;
}
else
{
Fin.DirSgte = Q;
Fin = Q;
}
}
if (!esVacia ())
{
elem = Frente.Info;
if (Frente == Fin)
{
Frente = null;
Fin = null;
package estructurasDinamicas;
// COLAS LINEALES DINAMICAS
public class EjerColasDinamicas {
}
static void EliminarPrimerNeg(Cola Q)
{
int x,m,i;
boolean sw=true;
m=Q.Contar();
i=1;
System.out.println("ELIMINANDO EL PRIMER NEGATIVO");
while(i<=m && sw)
{
x=Q.Eliminar();
if(x>=0)
Q.Insertar(x);
else
sw=false;
i++;
}
while (i<=m)
{
Q.Insertar(Q.Eliminar());
i++;
}
Salida:
DEFINICIÓN ÁRBOL
Un árbol es una estructura no lineal en la que cada nodo puede apuntar a uno o varios nodos.
CONCEPTOS BÁSICOS
c. Nodo raíz: nodo que no tiene padre. Este es el nodo que usaremos para referirnos
al árbol. En el ejemplo, ese nodo es el 'A'.
d. Nodo hoja: nodo que no tiene hijos. En el ejemplo hay varios: 'G', 'H', 'I', 'K', 'L', 'M',
'N' y 'O'.
e. Nodo rama: aunque esta definición apenas la usaremos, estos son los nodos que no
pertenecen a ninguna de las dos categorías anteriores. En el ejemplo: 'B', 'C', 'D', 'E',
'F' y 'J'.
Existen otros conceptos que definen las características del árbol, con relación a su
tamaño:
f. Orden: es el numero potencial de hijos que puede tener cada elemento de árbol. De
este modo, diremos que un árbol en el que cada nodo puede apuntar a otros dos es
de orden dos, si puede apuntar a tres será de orden tres, etc.
g. Grado: el número de hijos que tiene el elemento con más hijos dentro del árbol. En
el árbol del ejemplo, el grado es tres, ya que tanto 'A' como 'D' tienen tres hijos, y
no existen elementos con más de tres hijos.
h. Nivel: se define para cada elemento del árbol como la distancia a la raíz, medida en
nodos. El nivel de la raíz es cero y el de sus hijos uno. Así sucesivamente. En el
ejemplo, el nodo 'D' tiene nivel 1, el nodo 'G' tiene nivel 2, y el nodo 'N', nivel 3.
i. Altura: la altura de un árbol se define como el nivel del nodo de mayor nivel. Como
cada nodo de un árbol puede considerarse a su vez como la raíz de un árbol, también
podemos hablar de altura de ramas. El árbol del ejemplo tiene altura 3, la rama 'B'
tiene altura 2, la rama 'G' tiene altura 1, la 'H' cero, etc.
Los arboles representan las estructuras no lineales y dinámicas de datos más importantes
en computación . Dinámicas porque las estructuras de árbol pueden cambiar durante la
ejecución de un programa. No lineales, puesto que a cada elemento del árbol pueden
seguirle varios elementos.
Los arboles pueden ser construidos con estructuras estáticas y dinámicas. Las estáticas son
arreglos, registros y conjuntos, mientras que las dinámicas están representadas por listas.
Los arboles tienen una gran variedad de aplicaciones. Por ejemplo, se pueden utilizar para
representar fórmulas matemáticas, para organizar adecuadamente la información, para
construir un árbol genealógico, para el análisis de circuitos eléctricos y para numerar los
capítulos y secciones de un libro.
2. Enlazar en forma vertical el nodo padre con el nodo hijo que se encuentra más a la
izquierda. Además, debe eliminarse el vínculo de ese padre con el resto de sus hijos.
Por medio de datos tipo punteros también conocidos como variables dinámicas o listas.
Por medio de arreglos.
Sin embargo la más utilizada es la primera, puesto que es la más natural para tratar este
tipo de estructuras.
Nodo Arbol
El algoritmo de creación de un árbol binario es el siguiente:
Procedimiento crear(q:nodo)
inicio
mensaje("Rama izquierda?")
lee(respuesta)
si respuesta = "si" entonces
new(p)
q(li) <-- nil
crear(p)
en caso contrario
q(li) <-- nil
mensaje("Rama derecha?")
lee(respuesta)
si respuesta="si" entonces
new(p)
q(ld)<--p
crear(p)
en caso contrario
q(ld) <--nil
fin
INICIO
new(p)
raiz<--p
crear(p)
FIN
A. B. DISTINTO
Se dice que dos árboles binarios son distintos cuando sus estructuras son diferentes.
Ejemplo:
A. B. SIMILARES
Dos arboles binarios son similares cuando sus estructuras son idénticas, pero la
información que contienen sus nodos es diferente. Ejemplo:
A. B. EQUIVALENTES
Son aquellos arboles que son similares y que además los nodos contienen la misma
información. Ejemplo:
A. B. COMPLETOS
Son aquellos arboles en los que todos sus nodos excepto los del ultimo nivel, tiene dos
hijos; el subarbol izquierdo y el subarbol derecho
2. PREORDEN
o Examinar la raíz.
o Recorrer el subarbol izquierdo en preorden.
o recorrer el subarbol derecho en preorden.
3. POSTORDEN
o Recorrer el subarbol izquierdo en postorden.
o Recorrer el subarbol derecho en postorden.
o Examinar la raíz.
A continuación se muestra un ejemplo de los diferentes recorridos en un árbol binario.
Inorden: GDBHEIACJKF
Preorden: ABDGEHICFJK
Postorden: GDHIEBKJFCA
Un árbol de búsqueda binaria es una estructura apropiada para muchas de las aplicaciones
que se han discutido anteriormente con listas. La ventaja especial de utilizar un árbol es que
se facilita la búsqueda.
Un árbol binario de búsqueda es aquel en el que el hijo de la izquierda (si existe) de cualquier
nodo contiene un valor más pequeño que el nodo padre, y el hijo de la derecha (si existe)
contiene un valor más grande que el nodo padre.
Un ejemplo de arbol binario de búsqueda es el siguiente:
package estructurasDinamicas;
package estructurasDinamicas;
ayudantePosorden(nodo.nodoizquierdo);
ayudantePosorden(nodo.nododerecho);
System.out.print(nodo.datos + " ");
}
}
package estructurasDinamicas;
import javax.swing.JOptionPane;
public class PruebaArbol {
System.out.println("\n\nRecorrido Inorden");
arbol.recorridoInorden();
System.out.println("\n\nRecorrido Postorden");
arbol.recorridoPosorden();
}
}
Salida:
Luego llenamos
Los vértice de un grafo pueden usarse para representar objetos. Los arcos se utilizan para
representar relaciones entre estos objetos.
DEFINICIONES BÁSICAS
CAMINO.Es una secuencia de vértices V1, V2, V3, ... , Vn, tal que cada uno de estos
V1->V2, V2->V3, V1->V3.
LONGITUD DE CAMINO. Es el número de arcos en ese camino.
CAMINO SIMPLE. Es cuando todos sus vértices, excepto tal vez el primero y el último
son distintos.
CICLO SIMPLE. Es un camino simple de longitud por lo menos de uno que empieza y
termina en el mismo vértice.
ARISTAS PARALELAS. Es cuando hay más de una arista con un vértice inicial y uno
terminal dados.
GRAFO CICLICO. Se dice que un grafo es cíclico cuando contiene por lo menos un
ciclo.
GRAFO ACICLICO. Se dice que un grafo es aciclíco cuando no contiene ciclos.
REPRESENTACIÓN EN MEMORIA ENLAZADA
Creación.
Inserción.
Búsqueda.
Eliminación.
En esta sección utilizaremos el puntero TOP para hacer referencia al primer nodo, LD para
indicar el enlace derecho y LA para indicar el enlace hacia abajo y por último usaremos los
apuntadores P y Q para hacer referencia a los nuevos nodos que vayan a ser usados .
ALGORITMO DE CREACION
repite
si top=NIL entonces
new(top)
top(la)<--NIL
top(ld)<--NIL
Lic Katya Perez Martinez 176 Estructura de Datos
lee(top(dato))
q<--top
en caso contrario
new(p)
p(ld)<--NIL
p(la)<--NIL
q(la)<--p
lee(p(dato))
q<--p
mensaje(otro vertice ?)
lee(respuesta)
hasta repuesta=no
p<--top
mientras p<>NIL haz
mensaje(tiene vértices adyacentes p(dato) ?)
lee(respuesta)
si respueta=si entonces
repite
new(q)
lee(q(dato))
q(ld)<--p(ld)
p(ld)<--q
mensaje(otro vértice ?)
lee(respuesta2)
hasta respuesta2=no
p<--p(la)
ALGORITMO DE INSERCION
mensaje(valor a insertar ?)
lee(valor_a_insertar)
si top<>NIL entonces
p<--top
mientras p(la)<>NIL haz
p<--p(la)
new(q)
lee(q(dato))
p(la)<--q
q(la)<--NIL
mensaje(Hay vértices adyacentes?)
lee(respuesta)
si respuesta=si entonces
mensaje(Cuantos vértices?)
lee(número_vértices)
desde i=1 hasta número_vértices haz
new(p)
lee(p(dato))
q(ld)<--p
q<--q(ld)
en caso contrario
mensaje(no existe lista)
ALGORITMO DE BORRADO
mensaje(vértice a borrar ?)
lee(vértice_a_borrar)
p&Lt--top
r<--p
q<--p
sw<--falso
repite
si p(dato)=vértice_a_borrar entonces
si p=top entonces
top<--top(la)
r<--top
sw<--verdadero
en caso contrario
r(la)<--p(la)
repite
p<--p(ld)
dispose(q)
q<--p
hasta p=NIL
si sw=verdadero entonces
p<--r
q<--p
en caso contrario
p<--r(la)
q<--p
en caso contrario
r<--p
repite
q<--p(ld)
si q(dato)=vértice_a_borrar entonces
p(ld)<--q(ld)
dispose(q)
q<--p
en caso contrario
p<--p(ld)
hasta p=NIL
ALGORITMO DE DIJKSTRA
El algoritmo de Dijkstra determina el camino más corto desde un vértice al resto de los
vértices del grafo. La idea del algoritmo es mantener un conjunto A de nodos "alcanzables"
desde el nodo origen e ir extendiendo este conjunto en cada iteración. Los nodos
alcanzables son aquellos para los cuales ya se ha encontrado su camino óptimo desde el
nodo origen. Para esos nodos su distancia óptima al origen es conocida. Inicialmente A={s}.
Para los nodos que no están en A se puede conocer el camino óptimo desde s que pasa sólo
por nodos de A. Esto es, caminos en que todos los nodos intermedios son nodos de A.
Llamemos a esto su camino óptimo tentativo.
En cada iteración, el algoritmo encuentra el nodo que no está en A y cuyo camino óptimo
tentativo tiene largo mínimo. Este nodo se agrega a A y su camino óptimo tentativo se
convierte en su camino óptimo. Luego se actualizan los caminos óptimos tentativos para los
demás nodos.
package grafos;
import java.util.ArrayList;
import java.util.List;
import java.util.PriorityQueue;
import java.util.Scanner;
Node(int d, int p) {
this.first = d;
this.second = p;
}
init();
Q.add(new Node(inicial, 0));
distancia[inicial] = 0;
int actual, adyacente, peso;
while (!Q.isEmpty()) {
actual = Q.element().first;
Q.remove();
if (visitado[actual]) {
continue;
}
visitado[actual] = true;
V = sc.nextInt();
E = sc.nextInt();
for (int i = 0; i <= V; ++i) {
ady.add(new ArrayList<Node>());
}
}
System.out.print("Ingrese el vertice inicial: ");
inicial = sc.nextInt();
dijkstra(inicial);
}
}
Salida:
package grafos;
import java.lang.ArrayIndexOutOfBoundsException;
import java.lang.UnsupportedOperationException;
import java.lang.RuntimeException;
this.nroAristas = 0;
return listaVacia;
}
Laboratorio Nº1
1. INSTALACION DE JAVA
Debemos instalar el compilador de Java y la máquina virtual de Java. Estas herramientas las
podemos descargar de:
https://www.java.com/es/download/manual.jsp
Dependiendo del sistema operativo instalado en su máquina cualquiera de los siguientes archivos
que contienen la máquina virtual de java (JVM):
Presionamos el botón "next". Haremos la instalación por defecto por lo que presionamos el botón
next nuevamente:
2. INSTALACION DE ECLIPSE
Eclipse es un entorno de trabajo profesional, por lo que en un principio puede parecer complejo el
desarrollo de nuestros primeros programas.
Todo programa en Eclipse requiere la creación de un "Proyecto", para esto debemos seleccionar
desde el menú de opciones:
Luego pedirá configurar la carpeta donde se guardaran los programas por defecto, es decir el
directorio del espacio de trabajo, presionamos el botón OK.
Esta es la pantalla inicial de eclipse donde nos muestra una ventana de bienvenida.
Operadores
En una condición deben disponerse únicamente variables, valores constantes y operadores
relacionales.
>Operadores Relacionales:
> (mayor)
< (menor)
>= (mayor o igual)
<= (menor o igual)
== (igual)
!= (distinto)
Operadores Matemáticos
+ (más)
- (menos)
* (producto)
/ (división)
% (resto de una división) Ej.: x=13%5; {se guarda 3}
Operadores Lógicos
&& (y)
|| (o)
! (negación)
ESTRUCTURAS SECUENCIALES
El orden en que se ejecutan por defecto las sentencias de un programa es secuencial. Esto significa
que las sentencias se ejecutan en secuencia, una después de otra, en el orden en que aparecen
escritas dentro del programa.
Creamos el proyecto:
A=B * H
Donde:
Actividades
EJEMPLO 2
Escribir un programa que permita leer los datos de un recién nacido, estos datos son: nombre,
talla, peso, hora de nacimiento, género y el nombre de la mamá. Luego de leer que los imprima.
Actividades:
1. Crear la clase DatosBebe en el paquete secuenciales
package secuenciales;
import java.util.Scanner;
Salida
if(expresión_booleana){
instrucción 1
instrucción 2
.......
}
Representación gráfica:
Condicion verdad
operaciones
Falso
Por el camino del verdadero pueden existir varias operaciones, entradas y salidas, inclusive
ya veremos que puede haber otras estructuras condicionales.
Ejemplo 1.
Ingresar el sueldo de una persona, si supera los 3000 Bs. mostrar un mensaje en pantalla
indicando que debe pagar impuestos.
Diagrama de flujo:
Podemos observar lo siguiente: Siempre se hace la carga del sueldo, pero si el sueldo que
ingresamos supera 3000 pesos se mostrará por pantalla el mensaje "Esta persona debe
abonar impuestos", en caso que la persona cobre 3000 o menos no aparece nada por
pantalla.
Programa:
Actividades:
if(expresión booleana){
instrucciones 1
}
else{
instrucciones 2
}
Falso (Condición)
Verdad
Operación 2 Operación 1
EJEMPLO:
Realizar un programa que solicite ingresar dos números distintos y muestre por pantalla el
mayor de ellos.
Diagrama de flujo:
Se hace la entrada de num1 y num2 por teclado. Para saber cuál variable tiene un valor
mayor preguntamos si el contenido de num1 es mayor (>) que el contenido de num2, si la
respuesta es verdadera vamos por la rama de la derecha e imprimimos num1, en caso que
la condición sea falsa vamos por la rama de la izquierda (Falsa) e imprimimos num2.
Como podemos observar nunca se imprimen num1 y num2 simultáneamente.
Programa:
Actividades:
import java.util.Scanner;
Se obtiene anidando sentencias if ... else. Permite construir estructuras de selección más
complejas.
if (expresion_booleana1)
instruccion1;
else if (expresion_booleana2)
instruccion2;
else
instruccion3;
Cada else se corresponde con el if más próximo que no haya sido emparejado.
Representación gráfica:
Escribir un programa que pida por teclado tres notas de un alumno, calcule el promedio e
imprima alguno de estos mensajes:
Analicemos el siguiente diagrama. Se ingresan tres valores por teclado que representan las
notas de un alumno, se obtiene el promedio sumando los tres valores y dividiendo por 3
Lic Katya Perez Martinez 211 Estructura de Datos
dicho resultado (Tener en cuenta que si el resultado es un valor real solo se almacena la
parte entera).
Programa:
Actividades:
package selectivas;
import java.util.Scanner;
public class EstructuraCondicionalAnidada {
Salida 2.
Salida 3.
switch (expresión){
case valor 1:
instrucciones;
break;
case valor 2:
instrucciones;
break;
· · ·
Lic Katya Perez Martinez 213 Estructura de Datos
default:
instrucciones;
}
La instrucción switch se puede usar con datos de tipo byte, short, char e int. También con
tipos enumerados y con las clases envolventes Character, Byte, Short e Integer. A partir de
Java 7 también pueden usarse datos de tipo String en un switch.
- Primero se evalúa la expresión y salta al case cuya constante coincida con el valor de la
expresión.
– Se ejecutan las instrucciones que siguen al case seleccionado hasta que se encuentra un
break o hasta el final del switch. El break produce un salto a la siguiente instrucción a
continuación del switch.
– Si ninguno de estos casos se cumple se ejecuta el bloque default (si existe). No es
obligatorio que exista un bloque default y no tiene porqué ponerse siempre al final, aunque
es lo habitual.
EJEMPLO.
Escribir un programa que lee por teclado un mes (número entero) y muestra el nombre del
mes.
Programa:
Actividades
1. Crear la clase SelectivaMultiple dentro del paquete selectivas
package selectivas;
import java.util.Scanner;
Salida
PROBLEMAS PROPUESTOS
1. Realizar un programa que lea por teclado dos números, si el primero es mayor al segundo
informar su suma y diferencia, en caso contrario informar el producto y la división del
primero respecto al segundo.
2. Se ingresan tres notas de un alumno, si el promedio es mayor o igual a 51 mostrar un
mensaje "APROBADO".
3. Se ingresa por teclado un número positivo de uno o dos dígitos (1..99) mostrar un mensaje
indicando si el número tiene uno o dos dígitos.
(Tener en cuenta que condición debe cumplirse para tener dos dígitos, un número entero).
4. Se cargan por teclado tres números distintos. Mostrar por pantalla el mayor de ellos.
5. Se ingresa por teclado un valor entero, mostrar una leyenda que indique si el número es
positivo, nulo o negativo.
8. Escribir un programa que pida ingresar la coordenada de un punto en el plano, es decir dos
valores enteros x e y (distintos a cero).
Posteriormente imprimir en pantalla en que cuadrante se ubica dicho punto. (1º Cuadrante
si x > 0 Y y > 0 , 2º Cuadrante: x < 0 Y y > 0, etc.)
Estructuras Repetitivas
Objetivo:
Conocer la estructura while, do-while y for.
Las instrucciones se repiten mientras o hasta que se cumpla una determinada condición.
Esta condición se conoce como condición de salida.
SINTAXIS:
while(condición)
{
Accion1;
Accion2;
.
.
.
Acción n;
}
EJEMPLO
Programa que lee números por teclado. La lectura acaba cuando el número introducido sea
negativo. El programa calcula y muestra la suma de los números leídos.
Actividad
1. Crear la clase RepetitivaWhile en el paquete repetitivas
Programa:
package repetitivas;
import java.util.Scanner;
Salida:
SINTAXIS:
do
acción;
while (condición);
Acción1;
Accion n;
}while (condición);
EJEMPLO
Programa que lee un número entre 1 y 10 ambos incluidos
Actividad:
1. Crear la clase RepetitivaDoWhile en el paquete repetivias
package repetitivas;
import java.util.Scanner;
Salida:
Este tipo de estructuras incluye un contador como parte de su estructura, lo cual, quiere decir que
SINTAXIS:
EJEMPLO:
Programa que muestra el valor de a, b y su suma mientras que la suma de ambas es
menor de 10. En cada iteración el valor de a se incrementa en 1 unidad y el de b en 2.
Lic Katya Perez Martinez 221 Estructura de Datos
Actividad:
1. Crear la clase RepetitivaFor en el paquete repetitivas
Programa:
package repetitivas;
}
Salida
BUCLES ANIDADOS
Bucles anidados son aquellos que incluyen instrucciones for, while o do-while unas dentro
de otras.
Debemos tener en cuenta que las variables de control que utilicemos deben ser distintas.
Los anidamientos de estructuras tienen que ser correctos, es decir, que una estructura
anidada dentro de otra lo debe estar totalmente.
EJEMPLO:
Programa que dibuja un rectángulo sólido de asteriscos. El número de filas y columnas se
pide por teclado
Actividades:
1. Crear la clase BuclesAnidados en el paquete repetitivas
}
}
}
Salida:
1. Escribir un programa que lea 10 números enteros y luego muestre cuántos valores
ingresados fueron múltiplos de 3 y cuántos de 5. Debemos tener en cuenta que hay
números que son múltiplos de 3 y de 5 a la vez.
2. Realizar un programa que acumule (sume) valores ingresados por teclado hasta ingresar el
9999 (no sumar dicho valor, indica que ha finalizado la carga). Imprimir el valor acumulado
e informar si dicho valor es cero, mayor a cero o menor a cero.
3. En un banco se procesan datos de las cuentas corrientes de sus clientes. De cada cuenta
corriente se conoce: número de cuenta y saldo actual. El ingreso de datos debe finalizar al
ingresar un valor negativo en el número de cuenta.
Se pide confeccionar un programa que lea los datos de las cuentas corrientes e informe:
a)De cada cuenta: número de cuenta y estado de la cuenta según su saldo, sabiendo que:
4. Escribir un programa que lea n pares de datos, cada par de datos corresponde a la medida
de la base y la altura de un triángulo. El programa deberá informar:
a) De cada triángulo la medida de su base, su altura y su superficie.
b) La cantidad de triángulos cuya superficie es mayor a 12.
5. Desarrollar un programa que solicite la carga de 10 números e imprima la suma de los
últimos 5 valores ingresados.
6. Desarrollar un programa que muestre la tabla de multiplicar del 5 (del 5 al 50)
7. Confeccionar un programa que permita ingresar un valor del 1 al 10 y nos muestre la tabla
de multiplicar del mismo (los primeros 12 términos)
Ejemplo: Si ingreso 3 deberá aparecer en pantalla los valores 3, 6, 9, hasta el 36.
8. Escribir un programa para realizar la carga de 10 valores enteros por teclado. Se desea
conocer:
a) La cantidad de valores ingresados negativos.
b) La cantidad de valores ingresados positivos.
c) La cantidad de múltiplos de 15.
d) El valor acumulado de los números ingresados que son pares.
Cadenas en Java
Objetivo:
9. Conocer el tipo de dato String (cadena) y sus diferentes funciones.
La clase String tiene varios métodos muy útiles como saber su longitud, trocear la cadena, etc.
Recuerda que para invocar un método debemos escribir el nombre del String, un punto y el nombre
del método, más sus parámetros. Es importante que si necesitas almacenar el valor devuelto, uses
una variable para ello. Por ejemplo:
String cadena=”americano”;
boolean empiezaPor=cadena.startWith (“a”);
- Si
devuelve un
0: las
cadenas son
iguales.
- Si
devuelve un
número
menor que
0: la
primera
cadena es
menor que
la segunda
- Si
devuelve un
0: las
cadenas son
iguales.
- Si
devuelve un
número
menor que
0: la
primera
cadena es
menor que
la segunda
concat Concatena dos cadenas, es Un Un nuevo
como el operador +. parámetro String con
String, las cadenas
la cadena concatenada
a s.
concatena
r
copyValueOf Crea un nuevo String a Un array String
partir de un array de char. de char
Este método debe invocarse
de manera estática, es
decir,
String.copyValueOf(array_ch
ar)
endWith Indica si la cadena acaba String boolean
con el String pasado por
parámetro.
equals Indica si una cadena es String boolean
igual que otra.
equalsIgnoreCase Es igual que el anterior, String boolean
pero ignorando mayúsculas o
minúsculas.
getBytes Devuelve un array de bytes Ningún Un array de
con el código ASCII de los parámetro bytes
caracteres que forman el
String.
indexOf Devuelve la posición en la String o int
cadena pasada por parámetro char
desde el principio. -1 si
no existe.
Lic Katya Perez Martinez 226 Estructura de Datos
indexOf Igual que el anterior, pero String o int
ademas le indicamos la char, el
posición desde donde segundo
empezamos a buscar. parámetro
es un int
lastIndexOf Devuelve la posición en la String o int
cadena pasada por parámetro char
desde el final. -1 si no
existe.
lastIndexOf Igual que el anterior, pero String o int
ademas le indicamos la char, el
posición desde donde segundo
empezamos a buscar. parámetro
es un int
lenght Devuelve la longitud de la Ningún int
cadena. parámetro
matches Indica si la cadena cumple String boolean
con la expresión pasada
como parámetro.
replace Devuelve un String Dos String
cambiando los caracteres parámetro
que nosotros le indiquemos. s char,
el
primero
es el
carácter
que
existe en
el String
y el
segundo
por el
que
queremos
cambiar.
replaceFirst Devuelve un String Dos String
intercambiando solo la parametro
primera coincidencia. s String,
el
primero
son los
caractere
s que
existe en
el String
y el
segundo
por el
que
queremos
cambiar.
replaceAll Devuelve un String Dos String
intercambiando todas las parametro
coincidencias que se s String,
encuentren. el
primero
Lic Katya Perez Martinez 227 Estructura de Datos
son los
caractere
s que
existe en
el String
y el
segundo
por el
que
queremos
cambiar.
startsWith Indica si la cadena empieza String boolean
por una cadena pasada por
parámetro.
substring Trocea un String desde una Dos String
posición a otra. parámetro
s int,
indica
desde
donde
empieza
hasta
donde
acaba,
este
ultimo no
se
incluye.
toCharArray Devuelve en un array de Ningún Un array de
char, todos los caracteres parámetro char
de una String.
toLowerCase Convierte el String a Ningún String
minúsculas. parámetro
toUpperCase Convierte el String a Ningún String
mayúsculas. parámetro
trim Elimina los espacios del Ningún String
String. parámetro
valueOf Transforma una variable Un String
primitiva en un String. parámetro
Para invocarse debe usarse , que
con String. Por ejemplo, puede ser
String.valueOf(variable) un:
boolean
char
double
int
float
long
Referenci
a a un
objeto
EJEMPLO 1.
Solicitar el ingreso de dos apellidos. Mostrar un mensaje si son iguales o distintos.
PROGRAMA:
Actividad:
1. Crear una clase ComparaApellidos en el paquete cadenaEjemplos
package cadenaEjemplos;
import java.util.Scanner;
EJEMPLO 2
Hacer un programa que ingrese una cadena de caracteres y determine el número de mayúsculas y
el número de minúsculas.
PROGRAMA:
Actividad:
package cadenaEjemplos;
import java.util.Scanner;
Salida:
EJEMPLO 3.
Hacer un programa que reciba un string S y devuelva el mismo string S al cual se le han eliminado
los espacios.
Programa:
Actividad:
package cadenaEjemplos;
import java.util.Scanner;
Salida:
EJERCICIOS PROPUESTOS
1. Escribir un programa que reciba como datos una cadena de caracteres y un carácter y
reporta el número de veces que se encuentra el carácter en la cadena.
3. Implemente un programa que reciba una cadena S y una letra X, y coloque en mayúsculas
cada ocurrencia de X en S. (la función debe modificar la variable S).
5. Hacer un programa que al recibir como datos dos cadenas de caracteres forme una tercera
cadena intercalando los caracteres de las palabras de las cadenas recibidas.
Laboratorio Nº5
Lic Katya Perez Martinez 232 Estructura de Datos
Wrapper clases
Tipos primitivos
Una variable primitiva es un nombre relacionado a una localidad de memoria que almacena un valor.
Los datos primitivos se utilizan en expresiones que manejan los operadores aritméticos y lógicos
que se definen en el lenguaje
Tipos objeto
Una variable objeto es una referencia a un bloque de memoria que contiene un objeto. Los objetos
pueden contener una gran variedad de operaciones definidas por el usuario que mejoran la
aplicación
Java ha designado clases que nos permiten convertir un valor de un tipo primitivo a un objeto del
mismo tipo.
Así, un objeto de tipo Integer puede contener el valor de una variable primitiva tipo int, pero incluye
operaciones para accederlo y desplegarlo.
3 Un EnteroEnvuelto
byte Byte
short Short
int Int
long Long
float Float
double Double
boolean Boolean
char Character
Wrapper clases
Lic Katya Perez Martinez 233 Estructura de Datos
Object
Integer unEnteroEnvuelto;
unEnteroEnvuelto = new Integer(3);
Integer unEnteroEnvuelto2;
unEnteroEnvuelto2 = new Integer(“-345”);
Operaciones
Para obtener el primitivo envuelto:
Integer objA;
objaA = new Integer(3);
int n = objA.intValue( ) ;
Nota: Así como hay intValue() hay tambien floatValue(), doubleValue(), etc…
int n = Integer.parseInt(“123”) ;
String s1 = Integer.toString(45) ;
String s2 = Integer.toString(45, 2) ;
La Clase Character
Los métodos static que pueden resultar muy útiles para el manejo de caracteres son:
EJEMPLO 1.
public static String cleanString(String str){
String s = “”;
for (int i = 0; i<str.length( ); i++){
if (Character.isLetter(str.charAt(i)))
s= s + Character.toUpperCase(str.charAt(i));
Ejemplos:
Integer objA = new Integer(35)
Integer objB = new Integer(50);
int t = objA.compareTo(objB); // t < 0 porque 35 < 50
boolean b = objB.equals(new Integer(“50”)); // b is true
Integer objMin = (objA.compareTo(objB) > 0) ? objA :
objB;