Universidad San Pedro SAD Barranca
Escuela: Curso: Ciclo: Prof.:
Ingeniería Informática y de Sistemas Fundamentos de Programación II Ing. CIP Jorge Pariasca León
ESTRUCTURAS DE DATOS Y ARREGLOS Todas las variables que se han considerado hasta ahora son de tipo simple. Una variable de tipo simple consiste de una sola caja de memoria y sólo puede contener un valor cada vez. Una variable de tipo estructurado consiste en toda una colección de casillas de memoria. Los tipos de datos estudiados: entero, real, alfabético son considerados como datos de tipo simple, puesto que una variable que se define con alguno de estos tipos sólo puede almacenar un valor a la vez, es decir, existe una relación de uno a uno entre la variable y el número de elementos (valores) que es capaz de almacenar. En cambio un dato de tipo estructurado, como el arreglo, puede almacenar más de un elemento (valor) a la vez, con la condición de que todos los elementos deben ser del mismo tipo, es decir, que se puede tener un conjunto de datos enteros, reales, etc. Estructuras de Datos: Estructura de Datos es una colección de datos que se caracterizan por su organización y las operaciones que se definen en ella. Los datos de tipo estándar pueden ser organizados en diferentes estructuras de datos: estáticas y dinámicas. Estructura de Datos Estáticas: Son aquellas en las que el espacio ocupado en memoria se define en tiempo de compilación y no puede ser modificado durante la ejecución del programa. Corresponden a este tipo los arrays y registros
Estructuras de Datos Dinámicas: Son aquellas en las que el espacio ocupado en memoria puede ser modificado en tiempo de ejecución. Corresponden a este tipo las listas, árboles y grafos. Estas estructuras no son soportadas en todos los lenguajes.
La elección de la estructura de datos idónea dependerá de la naturaleza del problema a resolver y, en menor medida, del lenguaje. Las estructuras de datos tienen en común que un identificador, nombre, puede representar a múltiples datos individuales ARREGLOS O ARRAYS Un arreglo (array) es una colección de datos del mismo tipo, que se almacenan en posiciones consecutivas de memoria y reciben un nombre común. Para referirse a un determinado elemento de un array se deberá utilizar un índice, que especifique su posición relativa en el array. Un arreglo es una colección finita, homogénea y ordenada de elementos. Finita: Todo arreglo tiene un límite; es decir, debe determinarse cuál será el número máximo de elementos que podrán formar parte del arreglo. Homogénea: Todos los elementos del arreglo deben ser del mismo tipo. Ordenada: Se puede determinar cuál es el primer elemento, el segundo, el tercero,.... y el n-ésimo elemento. Los arreglos se clasifican de acuerdo con el número de dimensiones que tienen. Así se tienen los: • Unidimensionales (vectores) • Bidimensionales (tablas o • Multidimensionales (tres o matrices) más dimensiones) Tipos de arreglos:
Universidad San Pedro SAD Barranca
Escuela: Curso: Ciclo: Prof.:
Ingeniería Informática y de Sistemas Fundamentos de Programación II Ing. CIP Jorge Pariasca León
ARREGLOS UNIDIMENSIONALES Están formados por un conjunto de elementos de un mismo tipo de datos que se almacenan bajo un mismo nombre, y se diferencian por la posición que tiene cada elemento dentro del arreglo de datos. La declaración básica consiste en la especificación de un tipo de dato (primitivo o de clase), un identificador y los dos operandos [ ] (corchetes). tipo id[ ]; tipo [ ] id;
/* declara un arreglo vacío */
Ejemplo int arr[ ]; /* declara un arreglo vacío */ double [ ]px , [ ]py; /* declara dos arreglos vacíos o sin elementos px y py */ Las declaraciones anteriores, sirven para especificar que existe una variable de tipo arreglo, a la cual se le puede asignar un espacio (o número de elementos) o también asignar un arreglo ya existente. Para declarar un arreglo, y asignarle de inmediato un número determinado de elementos se debe usar, la estructura anterior, seguida del operador asignación, operador new, el tipo de dato y el tamaño especificado entre los operadores [ ]. Ejemplo int datos[ ] = new int[10]; double arr[ ] = new double[50]; boolean [ ]x = new boolean[100]; Ahora bien, si el algoritmo requiere asignar un tamaño en tiempo de ejecución, o sea asignado por el usuario del programa, se debe seguir el siguiente esquema: Declarar arreglo vacio id Leer N asignar a id el tamaño N
Ejemplo int arr[ ]; System.out.print(" Ingrese el numero de datos : "); int tam = leer.nextInt(); arr = new int[tam];
El arreglo arr está preparado para almacenar tam elementos de tipo entero (int). El acceso a estos elementos se hace con el
Universidad San Pedro SAD Barranca
Escuela: Curso: Ciclo: Prof.:
Ingeniería Informática y de Sistemas Fundamentos de Programación II Ing. CIP Jorge Pariasca León
operador [ ] desde el elemento 0 hasta el (tam – 1), cumpliendo cada posición con las mismas propiedades de las variables individuales. Ejemplo arr[0] = 3; arr[1] += arr[0]++; : --arr[tam - 1]; Número de elementos de un arreglo Todos los arreglos tienen una propiedad que retorna la longitud del arreglo. Esta propiedad se llama length y se accede a ella de la siguiente manera: identificador.length Ejemplo int arreglo[ ] = new int[20]; System.out.println("Longitud arreglo : " + arreglo.length); int i; /* Se asignaran los valores : 0, 10 , 20, 30 ,..., 180, 190. */ for(i = 0; i < arreglo.length; i++) { arreglo[i] = i * 10; } System.out.println("Datos del arrreglo : "); System.out.println(); for(i =0; i < arreglo.length; i++) System.out.println(arreglo[i]); Inicialización Para declarar e inicializar el arreglo con un conjunto de valores, se debe usar el siguiente esquema tipo id[ ] = {cte1 , cte2 , .... , cte_n}; Ejemplo int entry[ ] = { 0 , 7 , 23 , 44 , 87, 99 , 166 }; double nota[ ] = { 3.50 , 4.78 , 6.50 }; char letra[ ] = { 'a' , 'e' , 'i' , 'o' , 'u' }; boolean p[ ] = { false , false , true , false , true , false , true , true , false }; Inicialización y asignación de valores: Como se decía anteriormente, antes de utilizar un arreglo es necesario inicializarlo: Para inicializar todos los elementos de una vez, se colocan dentro de una estructura for que va del primer elemento al último que contiene el arreglo. Para asignar un valor a un elemento del arreglo se hace por ejemplo: Calificaciones[0] =100; Cuando se usan arreglos, una operación común es usar una variable índice para acceder a los elementos de un arreglo. Suponiendo que la variable índice I contiene el valor 3, la siguiente instrucción asigna el valor 400 a valores[3]: valores[I] = 400; Partes de un arreglo: Los componentes. Hacen referencia a los elementos que forman el arreglo, es decir, a los valores que se almacenan en cada una de las casillas del mismo. Los índices. Permiten hacer referencia a los componentes del arreglo en forma individual, especifican cuántos elementos tendrá el arreglo y además, de qué modo podrán accesarse esos componentes. Operaciones con vectores: Las operaciones que se pueden realizar con vectores durante el proceso de resolución de un problema son: • Lectura/ escritura • Asignación • Actualización (inserción, eliminación, modificación) • Recorrido (acceso secuencial)
Universidad San Pedro SAD Barranca • •
Ordenación Búsqueda
Escuela: Curso: Ciclo: Prof.:
Ingeniería Informática y de Sistemas Fundamentos de Programación II Ing. CIP Jorge Pariasca León
Universidad San Pedro SAD Barranca
Escuela: Curso: Ciclo: Prof.:
Ingeniería Informática y de Sistemas Fundamentos de Programación II 2014 Ing. CIP Jorge Pariasca León
Lectura y escritura de vectores: Lectura El proceso de lectura de un arreglo consiste en leer y asignar un valor a cada uno de sus elementos. Normalmente se realizan con estructuras repetitivas, aunque pueden usarse estructuras selectivas. Usamos los índices para recorrer los elementos del arreglo: desde i = 1 hasta 70 hacer leer ( arre[i]) fin_desde Escritura: Es similar al caso de lectura, sólo que en vez de leer el componente del arreglo, lo escribimos. leer (N) desde i = 1 hasta N hacer escribir (arre[i]) fin_desde Asignación e Inicialización de vectores: Asignación: No es posible asignar directamente un valor a todo el arreglo; sino que se debe asignar el valor deseado en cada componente. Con una estructura repetitiva se puede asignar un valor a todos los elementos del vector. Por ejemplo: arre[1] <- 120 (asignación de un valor constante único a una casilla del vector) arre[3] <- arre[1] / 4 (asignar una operación) Se puede asignar un valor constante a todos los elementos del vector: desde i = 1 hasta 5 hacer arre[i] <- 3 fin_desde O bien arre <- 3 (con arre del tipo arreglo) Inicialización Para inicializar con cero todos los elementos del arreglo: desde i = 1 hasta 70 hacer arre[i] <- 0 fin_desde Acceso secuencial y Actualización de vectores: Acceso Secuencial. (Recorrido) El acceso a los elementos de un vector puede ser para leer en él o para escribir (visualizar su contenido). Recorrido del vector es la acción de efectuar una acción general sobre todos los elementos de ese vector. Actualización. Incluye añadir (insertar), borrar o modificar algunos de los ya existentes. Se debe tener en cuenta si el arreglo está o no ordenado. Añadir datos a un vector consiste en agregar un nuevo elemento al final del vector, siempre que haya espacio en memoria. Los arrays tienen cuatro propiedades básicas: • Los elementos individuales de datos de un array se denominan elementos. • Todos los elementos deben ser del mismo tipo de dato. • Todos los elementos se almacenan en posiciones contiguas de la memoria de la computadora y el subíndice (o índice) del primer elemento es cero. • El nombre de un array es un valor constante que representa la dirección del primer elemento del array.
Universidad San Pedro SAD Barranca
Escuela: Curso: Ciclo: Prof.:
Ejemplo 1: El siguiente programa lee 5 valores de teclado y los guarda en un arreglo a. Luego los escribe.
Ingeniería Informática y de Sistemas Fundamentos de Programación II 2014 Ing. CIP Jorge Pariasca León
Ejemplo 2: Que es lo que se visualiza en este programa: public class Arreglos {
import java.util.Scanner; public class Arreglos { public static void main(String[] args) { Scanner leer=new Scanner(System.in); int a[]=new int[5]; int i; for(i=0; i<5;i++){ System.out.println("Digite el "+(i+1)+" numero: "); a[i]=leer.nextInt(); } System.out.println("Escribiendo el arreglo con los datos leidos:\n"); for(i=0; i<5;i++) { System.out.println("Elemento "+i+" es "+a[i]); } } } Ejemplo 3: El siguiente programa, pide 5 números y calcula los cubos de ellos, los cuales son guardados en un arreglo y son desplegados. import java.util.Scanner; public class Arreglos { public static void main(String[] args) { Scanner leer=new Scanner(System.in); int i; double a[]=new double[5]; for (i=0; i<5; i++){ System.out.println("Digite "+(i+1)+" numero:"); a[i]=leer.nextInt(); } System.out.println("______________________________"); System.out.println("Los cubos de los numeros leidos son:"); for (i=0; i<5; i++){ a[i]=Math.pow(a[i],3); System.out.println(a[i]); } } }
public static void main(String[] args) { /*declaracion e inicializacion del arreglo n */ int n[] = {32,27,64,18,95,14,90,70,60,37}; int i; System.out.println("Elemento\t\tValor"); for (i=0; i<=9; i++) /* ciclo para mostrar los valores del arreglo */ System.out.println("\t"+i+"\t\t"+n[i]); } } Ejemplo 4: Elabore un programa que permita leer una lista de números en un arreglo, calcule la suma, promedio, cuadrado , cubo y desviación estándar de los mismos: import java.util.Scanner; public class Arreglos { public static void main(String[] args) { Scanner leer=new Scanner(System.in); double cuadrado, cubo; double prom, desv,suma=0; int i, j,tam; System.out.println("PROGRAMA PARA CALCULAR"); System.out.println("PROMEDIO, SUMA, CUADRADO, CUBO Y DESV. EST.\n"); System.out.println("Ingrese número de elementos que desea ingresar: "); tam=leer.nextInt(); double vector[]=new double[tam]; for(i = 0 ; i < vector.length ; ++i){ System.out.println("vector ["+i+"] = "); vector[i]=leer.nextDouble(); suma+= vector[i] ; } prom = suma/tam ; System.out.println("El promedio de los numeros es: "+prom); //Calculo e impresión de cuadrado, cubo y desviación estandar System.out.println("\nNUMERO\t\tCUADRADO\tCUB O\t\tDESV. EST."); for( i = 0 ; i < vector.length ; ++i ){ cuadrado = vector[i] * vector[i] ; cubo = Math.pow (vector[i], 3) ; desv = vector [i] - prom ; System.out.print(vector[i]); System.out.print("\t\t"+cuadrado) ; System.out.print("\t\t"+cubo) ; System.out.println("\t\t"+desv) ; } } } Nota: que los valores fueron declarados de tipo double no enteros, por el tamaño de los valores que se generan en los cálculos.
Universidad San Pedro SAD Barranca
Escuela: Curso: Ciclo: Prof.:
Ingeniería Informática y de Sistemas Fundamentos de Programación II 2014 Ing. CIP Jorge Pariasca León
ARREGLOS Y METODOS Para el uso de los arreglos a través de los métodos hay que tener en cuenta que estos se pueden pasar como parámetros o pueden ser obtenidos como respuesta de un método. ARREGLOS COMO PARAMETRO Cuando se desea pasar un arreglo como parámetro se debe definir en el método que el parámetro lo es, de la siguiente manera: Public static void metodo( tipoDato nombreparametro[] ){} Acá vemos el nombre del método y dentro de los paréntesis de parámetros se define que es un arreglo, primero el tipo de dato (Puede ser cualquier tipo de dato elemental o objeto que herede de Object ), luego un nombre cualquiera para el parámetro y por ultimo un par de corchetes cuadrados para saber que es un arreglo. Ejemplos: metodo(int ar[]){} —Recibe como parámetro un arreglo de enteros metodo(String dd[]){} — Recibe como parámetro un arreglo de objetos String metodo(Casa c []){} —
Recibe como parámetro un arreglo de objetos Casa
ARREGLOS COMO RETORNO Ahora, necesitamos que el retorno de un método sea un arreglo, para esto la sintaxis es: public static tipodeRetorno[] metodo(){} Como se ve, después de la definición del tipo de alcance del método se define el tipo de retorno y los corchetes cuadrados para definir que es un arreglo lo que se retorna. De manera similar al anterior el tipo de Ejemplos: int [] metodo(){} —retorna un arreglo de enteros String[] metodo(){} — retorna un arreglo de objetos String Casa [] metodo(){} — retorna un arreglo de objetos Casa EJERCICIOS PROPUESTOS: 1.
Digite, compile y ejecute el siguiente programa.
2.
Digite, compile y ejecute el siguiente programa.
public class Arreglos { public static void main(String[] args) { int a,b=0; int c[]={1,2,3,4,5,6,7,8,9,0}; for (a=0;a<10;++a) if ((c[a]%2)==0) b+=c[a]; System.out.println("El acumulado obtenido es "+b); } }
public class Arreglos { public static void main(String[] args) { int a,b=0; int c[]={1,2,3,4,5,6,7,8,9,0}; for (a=0;a<10;++a) if ((a%2)==0) b+=c[a]; System.out.println("El acumulado obtenido es "+b); } }
¿Qué hace el programa? Cuál es la salida?
¿Qué hace el programa? Cuál es la salida? ¿En qué se diferencia del ejemplo anterior?
3.
Elabore un programa que sume los primeros 25 números enteros guardados en un vector. Se desea imprimir la lista de números y al final la suma de los mismos.
4.
Generar e imprimir un vector de 10 números enteros y encontrar el mayor de ellos. Desplegar el resultado.
5.
Modificar el programa anterior para hallar también el menor.
Universidad San Pedro SAD Barranca
6.
Escuela: Curso: Ciclo: Prof.:
Ingeniería Informática y de Sistemas Fundamentos de Programación II 2014 Ing. CIP Jorge Pariasca León
Dadas dos listas A y B de igual número de elementos, se desea generar e imprimir una lista C conteniendo las sumas: A[i] + B[i] = C[i]
7.
Diseñar un programa que permita el ingreso de 10 números positivos por teclado, luego determine e imprima cuantos son pares, y cuantos impares.
8.
Diseñar un programa que permita el ingreso de N números y luego muestre cuantos fueron positivos, negativos y nulos.
9.
Diseñar un programa que permita el ingreso de N números y calcule el promedio, luego determine cuantos valores son menores que el promedio, cuantos valores son iguales al promedio y cuántos son mayores.
10.
Diseñar un programa que permita el ingreso de N estudiantes (mínimo 3) y 3 notas (práctica, oral, parcial) luego muestre una tabla con los siguientes encabezados: Nombre
Nota Práctica
Nota Oral
Nota Ex Parcial
Promedio
11.
Realizar un programa que inicialice 20 nombres de personas, luego solicite al usuario ingresar un número (entre 3 y 10), el programa debe buscar y mostrar los nombres que tengan el número de letras igual al número ingresado por el usuario.
12.
Considerando un arreglo para 10 elementos donde se guardara los nombres de ciudades y otro arreglo para guardar las tarifas de transporte hacia dichas ciudades, realizar lo siguiente: •
Inicializar el arreglo de nombres con 10 nombres de ciudad
•
Generar tarifas aleatorias entre 15 y 50 guardándolas en el arreglo de tarifas
• • 13.
Dependiendo del monto que una persona disponga para viajar a alguna ciudad mostrar las ciudades a las cuales podría viajar con dicho monto. Determinar cual es la ciudad cuya tarifa es la mas alta
Hacer un programa que inicialice nombre, distrito de procedencia y teléfono de 10 amigos. Luego muestre los datos de todos ellos con su respectivo encabezado (Nombre – Distrito - Teléfono), si se ingresa por teclado un índice del arreglo se debe mostrar repetidamente los datos de un amigo. El programa finalizará cuando se ingrese por teclado un índice fuera del rango.
14.
Hacer un programa que lea los nombres, edades y tallas de N atletas. El programa debe calcular : a) El promedio de las edades y de las tallas. b) Determinar cuántos atletas son menores de edad y cuantos atletas son mayores de edad. c)
Determinar los nombres de los atletas que son más altos que el promedio.
d) Muestre este reporte: Nombre xxxxxxx xxxxxxx xxxxxxx Promedios Número de atletas menores de edad : Número de atletas mayores de edad : Los atletas más altos al promedio son:
Edades 99 99 99 99.99
Tallas 99 99 99 99.99 9 9 xxxxxxxxxxx xxxxxxxxxxxxx xxxxxxxxxxxxxx xxxxxxxxxx
15. 16. 17. 18. 19.
Escriba un programa en Java que genere N (dado por el usuario) números enteros entre -10 y 10. Deje en un vector A todos los números negativos y en un vector B todos los positivos o iguales a cero. Imprima en pantalla los valores en cada uno de los vectores. Realizar un ordenamiento (ascendente y descendente) Realizar una búsqueda Realizar una eliminación Realizar una inserción
Universidad San Pedro SAD Barranca
Escuela: Curso: Ciclo: Prof.:
Ingenier铆a Inform谩tica y de Sistemas Fundamentos de Programaci贸n II 2014 Ing. CIP Jorge Pariasca Le贸n
import java.util.Scanner; public class Arreglos {
import java.util.Scanner; public class Arreglos {
public static void main(String[] args) { Scanner leer=new Scanner(System.in); int num,i,c,temp; int vector[]=new int[20]; System.out.println("Cuantos numeros desea almacenar (menos de 20): "); num=leer.nextInt(); for(i=0;i<num;i++){ System.out.println("Ingrese "+(i+1)+" numero: "); vector[i]=leer.nextInt(); } do{ c=0; for(i=0;i<num-1;i++){ if(vector[i]>vector[i+1]){ temp=vector[i]; vector[i]=vector[i+1]; vector[i+1]=temp; c=1; } } }while(c==1); System.out.println("\nLos numeros ingresados ordenados de forma ascendente son: "); for(i=0;i<num;i++) System.out.print("\t"+vector[i]); do{ c=0; for(i=0;i<num-1;i++){ if(vector[i]<vector[i+1]){ temp=vector[i]; vector[i]=vector[i+1]; vector[i+1]=temp; c=1; } } }while(c==1); System.out.println("\nLos numeros ingresados ordenados de forma descendente son: "); for(i=0;i<num;i++) System.out.print("\t"+vector[i]); } }
public static void main(String[] args) { Scanner leer=new Scanner(System.in); int num,i,buscado,cont=0; int vector[]=new int[20]; System.out.println("Cuantos numeros desea almacenar (menos de 20): "); num=leer.nextInt(); for(i=0;i<num;i++){ System.out.println("Ingrese "+(i+1)+" numero: "); vector[i]=leer.nextInt(); } System.out.println("Ingrese numero a buscar: "); buscado=leer.nextInt(); for(i=0;i<num;i++){ if(buscado==vector[i]){ cont=1; System.out.println("\nEl numero si se encuentra, en la posicion: "+(i+1)); } } if(cont==0) System.out.println("\nNumero no encontrado!!!"); } }