PRUEBA 2 INTRODUCCIÓN A LA PROGRAMACIÓN UNIVERSIDAD CATÓLICA DEL NORTE ESCUELA DE INGENIERÍA Coquimbo Asignatura Código Duración Introducción a la Programación II-473 2.5 horas Profesor Cátedra Nombre Carrera Firma Objetivos • Que el alumno utilice las facilidades de vectores y matrices para el procesamiento de datos y organización de la información Problema 1: Resta el Menor (30%) Dado un archivo llamado matriz.txt que almacena el contenido de una matriz de 120 filas por 100 columnas: • • • Calcular y desplegar el valor del menor elemento de la matriz Restar a cada elemento de la matriz el menor valor obtenido. Almacenar la matriz en el mismo formato que la original en un nuevo archivo llamado normal.txt El formato del archivo corresponde a un primer registro con dos números enteros que indican la cantidad de n filas y m columnas respectivamente, seguido de una cantidad n registros donde cada uno posee m elementos correspondientes a los elementos de las columnas. Ejemplo minimizado (sólo para ejemplificar el proceso, no corresponde en tamaño): Ejemplo de archivo matriz.txt 2 1 5 4 3 10 20 7 Se calcula el menor: 1 Original 1 10 5 20 4 7 Normal 0 9 4 19 3 6 1 Posible solución problema 1 import ucn.*; public class Pauta1 { public static void main(String[] args) { int[][] m = new int[120][100]; int menor=Integer.MAX_VALUE; In in = new In("matriz.txt"); int nn = in.readInt(); int mm = in.readInt(); for (int i=0;i<nn;i++){ for (int j=0;j<mm;j++) { m[i][j] = in.readInt(); if (menor > m[i][j]) menor = m[i][j]; } } in.close(); StdOut.println("menor." + menor); Out out = new Out("normal.txt"); for (int i=0;i<nn;i++){ for (int j=0;j<mm;j++) { m[i][j] = m[i][j] - menor; out.print(m[i][j] + " "); } out.println(); } } } Problema 2: SISTEMA DE NOTAS Nuestra universidad necesita obtener el promedio y varianza de las notas para cada alumno. Cada alumno posee una cantidad variable de notas (mínimo 1 y máximo 10 notas), además de la carrera y edad. La información a procesar está almacenada en un archivo que posee varias líneas o registros con el siguiente formato: 17363521 YICENIA LEYTON MEDICINA 22 4 2.33 4.54 0 1.56 Donde • • • • • • • • • • 17363521 es el rut YICENIA el nombre LEYTON el apellido MEDICINA la carrera 22 la edad 4 la cantidad de notas del alumno 2.33 la primera nota 4.54 la segunda nota 3.86 la tercera nota 1.56 la cuarta nota Lo solicitado: 1. Dibujar un esquema de las estructuras utilizadas para almacenar la información (esto es para ayudar la revisión del profesor). 2 2. 3. Desarrollar un programa en Java que permita: a. Leer el archivo entrada.txt y almacenar toda la información en las estructuras definidas b. Desplegar el promedio de edad por cada carrera c. Desplegar el promedio total de todos los alumnos para la PRIMERA nota solamente. d. Calcular y almacenar el promedio de las notas por cada alumno e. Calcular y almacenar la varianza de las notas por cada alumno f. NOTA: Existe un registro por alumno Almacenar en un archivo llamado salida.txt y ordenado en forma descendente por el promedio de las cuatro notas de cada alumno la siguiente información: RUT NOMBRE APELLIDO CARRERA PROMEDIO VARIANZA Varianza = Posible Solución import ucn.*; public class Pauta2 { public static void main(String[] args) { int[] rut = new int[100000]; String[] nombre = new String[10000]; String[] apellido = new String[10000]; String[] carrera = new String[10000]; int[] edad = new int[10000]; int[] c_notas = new int[10000]; double[][] notas = new double[100000][10]; String[] listcarreras = new String[7]; listcarreras[0] = "INDUSTRIAL"; listcarreras[1] = "COMPUTACION"; listcarreras[2] = "COMERCIAL"; listcarreras[3] = "TEOLOGIA"; listcarreras[4] = "MEDICINA"; listcarreras[5] = "CIENCIASDELMAR"; listcarreras[6] = "PREVENCION"; double[] prom_edad_carrera = new double[7]; double[] cant_edad_carrera = new double[7]; double[] prom_nota = new double[10000]; double[] varianza = new double[100000]; double prom_total=0; int idx=0; In in = new In("entrada.txt"); while (in.hasNextLine()) { rut[idx] = in.readInt(); nombre[idx] = in.readString(); apellido[idx] = in.readString(); carrera[idx] = in.readString(); edad[idx] = in.readInt(); c_notas[idx] = in.readInt(); prom_nota[idx]=0; for (int i=0; i<c_notas[idx]; i++) { notas[idx][i] = in.readDouble(); prom_nota[idx] += notas[idx][i]; } prom_nota[idx] /= c_notas[idx]; for (int i=0; i<c_notas[idx]; i++) { varianza[idx] += Math.pow(notas[idx][i] - prom_nota[idx], 2); 3 } varianza[idx] /= c_notas[idx]; prom_total += notas[idx][0]; for (int x=0; x<7; x++) if (listcarreras[x].equals(carrera[idx])) { prom_edad_carrera[x] += edad[idx]; cant_edad_carrera[x] ++; } idx++; } in.close(); int cant = idx; StdOut.println("Promedio edad por carrera:"); for (int i=0;i<7;i++) if (cant_edad_carrera[i]>0) StdOut.println(listcarreras[i]+":" + (prom_edad_carrera[i]/cant_edad_carrera[i])); else StdOut.println(listcarreras[i] + " : 0"); StdOut.println("Promedio total de las primeras notas:" + (prom_total/cant)); for (int i=0; i<cant-1; i++) { for (int j=i; j<cant; j++) { if (prom_nota[i] < prom_nota[j]) { int aux = rut[i]; rut[i] = rut[j]; rut[j] = aux; String auxnom = nombre[i]; nombre[i] = nombre[j]; nombre[j] = auxnom; String auxap = apellido[i]; apellido[i] = apellido[j]; apellido[j] = auxap; double prom = prom_nota[i]; prom_nota[i] = prom_nota[j]; prom_nota[j] = prom; double var = varianza[i]; varianza[i] = varianza[j]; varianza[j] = var; } } } Out out = new Out ("salida.txt"); for (int i=0; i<cant; i++){ out.println(rut[i]+" "+nombre[i]+" "+apellido[i] + " "+prom_nota[i]+" "+varianza[i]); } out.close(); } } 4