Facultad de Ciencias Exactas, Ingeniera y Agrimensura UNR
Escuela de Formacin Bsica Dpto. Matemtica
Informtica I
Prctica Nro. 8 2014 Pg 1 de 11
Ejercicios propuestos de revisin Los problemas planteados renen la totalidad de los conceptos vertidos en Informtica. Realizar el Anlisis del problema y escribir el Algoritmo que permita resolverlo utilizando modularizacin, estructuras de datos y archivos, si fuera necesario.
1- Escribir un algoritmo que permita crear un archivo de nombre MP.dat para guardar en disco los datos de las materias primas del ejercicio Nro. 6 de la Prctica Nro. 7.
2- Escribir un algoritmo que permita extraer la informacin del archivo MP.dat del ejercicio anterior y las muestre en forma de tabla.
3- Un negocio de artculos de computacin tiene registradas las ventas por tarjeta de crdito del mes en un archivo de nombre VTARJ.DAT. Por experiencia se sabe que no hay ms de 500 ventas en un mes. Este archivo guarda datos de tipo registro compuestos por el nmero de tarjeta (entero) y el importe (real). Sus datos no estn ordenados de ninguna manera. Se necesita escribir un algoritmo que lea los datos del archivo y mediante un subalgoritmo PROME muestre por pantalla el promedio de ventas del mes. Adems mediante otro subalgoritmo TOP10 se debe encontrar las 10 mayores ventas para guardarlas en un archivo llamado T10.DAT.
4- Una inmobiliaria dispone de no ms de 200 propiedades en alquiler. Tiene esta informacin almacenada en dos arreglos. En un primer arreglo de nombre DIREC dispone 2 datos por cada propiedad: la direccin (mximo 20 caracteres) y la zona (mximo 10 caracteres). En el segundo, denominado PRECIO estn los precios (real) de los alquileres respectivos ordenados en forma ascendente. Se solicita hacer un algoritmo que permita: a) Mostrar las direcciones de aquellas propiedades cuyo alquiler tenga un valor dado. b) Mostrar las direcciones de aquellas propiedades que contemplen un determinado requerimiento del cliente en cuanto a alquilar en una cierta zona y pagar una cierta cantidad de dinero, c) Borrar una propiedad que ha sido alquilada. Para ello se pide escribir los siguientes subalgoritmos: CARGA( parmetros correspondientes) que permita ingresar toda la informacin de las propiedades (direccin - zona - precio) en los arreglos DIREC y PRECIO Tener en cuenta que las propiedades en un primer momento estn ordenadas segn el precio de las mismas. ALQUILER (parmetros correspondientes) que permita realizar el punto a) ZONA (parmetros correspondientes) que permita informar el punto b) SACAR(parmetros correspondientes) que permita informar el punto c)
5- Por cada alumno de 1er. ao de la Facultad se tienen los siguientes datos: Comisin (nro. entero), Legajo (8 caracteres), Apellido y nombre (mximo 30 caracteres).
Facultad de Ciencias Exactas, Ingeniera y Agrimensura UNR Escuela de Formacin Bsica Dpto. Matemtica Informtica I
Prctica Nro. 8 2014 Pg 2 de 11
Se pide escribir un programa que permita mostrar el siguiente men de opciones y las acciones que se detallan:
Men 1- Ingreso datos 2- Listado ordenado por Apellido 3- Cantidad alumnos por comisin 4- Fin
Opcin 1: Permitir al operador ingresar los datos de los alumnos y los almacenar en un archivo de nombre PRIMERO.DAT Opcin 2: Leer los datos de los alumnos del archivo creado en el punto 1 y los mostrar por pantalla ordenados por apellido en forma ascendente. Opcin 3: Leer los datos del archivo creado en el punto 1 e informar la cantidad de alumnos por comisin. Observaciones: La cantidad mxima de alumnos de 1er. Ao es 1000. La cantidad mxima de comisiones es 10, siendo sus nmeros correlativos.
6- Una empresa que trabaja todos los das del ao, realiza el seguimiento del stock de un producto del ao anterior. Los datos del stock diario son enteros (p. ej. unidades), y se tienen que almacenar en una matriz bidimensional. Al mes identificarlo como un nmero de 1 a 12 y al da con un nmero de 1 a n, donde n depende de cada mes, pero el mximo valor de n es 31. Escribir un algoritmo que realice las tareas que se solicitan, desarrollando los siguientes subalgoritmos: MES: recibe como argumento un nmero de mes, y devuelve su nombre y la cantidad de das que tuvo ese mes en el ao anterior. CARGA: para cada da del ao escribe el nombre del mes, el nmero de da, y pide que se ingrese el stock de ese da (validar positivo o cero). Por ejemplo: marzo 23 ingrese stock: _______ Observaciones: Los das no completados (si el mes tiene menos de 31 das) deben llenarse con -1. Esto no debe hacerse mediante lectura. Si se desea se puede emplear otro subalgoritmo. STOCKMAX: devuelve el stock mximo de un mes cuyo nmero se da como argumento. STOCKMIN: devuelve el stock mnimo de un mes cuyo nmero se da como argumento. El algoritmo principal debe pedir la carga de datos, y luego listar mes a mes (con su nombre), cul fue el mximo y el mnimo stock de ese mes. Si el mnimo fue cero, escribir en la misma lnea stock nulo. No deben emplearse variables globales.
7- Una industria fabrica cinco piezas de automotores. Los precios de estas piezas varan segn la variacin del mercado automotor, teniendo en general 3 precios anuales. La industria tiene cuatro comercios que distribuyen estas piezas.
Facultad de Ciencias Exactas, Ingeniera y Agrimensura UNR Escuela de Formacin Bsica Dpto. Matemtica Informtica I
Prctica Nro. 8 2014 Pg 3 de 11
Conociendo la variacin de precios de las cinco piezas y la cantidad de piezas vendidas en cada comercio, se desea determinar cunto factur cada comercio a lo largo de un ao. Para resolver este problema se solicita usar arreglos bidimensionales en el desarrollo del algoritmo y/o subalgoritmos necesarios para su resolucin. En particular, desarrollar un algoritmo que llame a un subalgoritmo de nombre PROD que multiplica matrices y cuyos parmetros sern: A el nombre de la matriz que premultiplica, B el nombre de la matriz que post- multiplica, N el nmero de filas de la matriz que pre-multiplica, P el nmero de columnas de la matriz que pre-multiplica (que como sabemos debe coincidir con el nmero de filas de la matriz que post-multiplica), M cantidad de columnas de la matriz que post-multiplica y MULT matriz producto resultante. Se recuerda indicar qu modo y tipo tendrn cada uno de los parmetros.
8- Sea un campeonato de basket en el que participan a lo sumo 20 jugadores. Durante el torneo, cada jugador realizar 5 tiros, los cuales le darn un puntaje para calificar o no a los premios. Por cada uno de los 5 tiros que realice, puede suceder lo siguiente: 0 punto (fuera) 1 punto (con rebote) 2 puntos (normal) 3 puntos (desde lnea de tres) El programa que gestiona este campeonato deber: a- Inicialmente, solicitar el apellido y nombre (no ms de 30 caracteres) de los inscriptos hasta el momento y dejarlos grabados en un archivo llamado JUGADORES.TXT. b- Luego, deber mostrar un men de opciones que permita: - Cargar algn otro interesado en participar que no se inscribi inicialmente, agregndolo al archivo JUGADORES.TXT. - Cargar el resultado de cada uno de los 5 tiros para todos los inscriptos que figuran en el archivo JUGADORES.TXT - Determinar los ganadores del campeonato. - Finalizar. c- Para determinar los ganadores a los que se les entregar un trofeo, se elegirn los primeros 3 jugadores que tengan mayor puntaje y que cumplan con lo siguiente: 1- El promedio de todos sus tiros debe ser 2 o ms 2- No debe haber realizado un tiro fallido (0 punto) Se deber mostrar un mensaje con el apellido y nombre y el trofeo que corresponde, segn se muestra a continuacin: Primer premio con 15 puntos: Lopez Jos Segundo premio con 14 puntos: Canale Alberto Tercer premio con 12 puntos: Loza Carlos Si no existen ganadores para todos los puestos, se deber mostrar una leyenda como por ejemplo: Tercer premio: sin ganador Se asume que no habr ms de un ganador para cada posible premio.
Facultad de Ciencias Exactas, Ingeniera y Agrimensura UNR Escuela de Formacin Bsica Dpto. Matemtica Informtica I
Prctica Nro. 8 2014 Pg 4 de 11
d- A su vez, se deber generar un archivo llamado MEJORES.TXT con el apellido y nombre, el detalle de los puntos obtenidos en los 5 tiros y el total de puntos, de todos los jugadores que califiquen para los premios, ordenado por puntos totales en forma descendente. e- Se solicita validar el ingreso de todos los datos.
La solucin de este problema, codificada en lenguaje C, se encuentra al final de la prctica (en Pgina 6)
9- Se pide que escriba un programa para administrar reuniones a modo de una pequea agenda. Para esto, el programa debe mostrar el siguiente men:
Cada una de las opciones del men deber ser un subalgoritmo que realice lo siguiente: 1. Cargar Citas Deber permitir el ingreso de los datos de cada una de las citas:
Da Hora Detalle Lunes 9 Reunin con el Contador Lunes 12 Partido Ftbol Martes 17 Ir a la casa de Juan Lunes 18 Clase de Informtica : : : : : : : :
Las citas corresponden siempre a la misma semana (no importa cul) y su detalle no debe ser mayor de 40 caracteres. El mximo de citas admitidas es de 50 (entre todos los das). Los das sern: Lunes, Martes, Mircoles, Jueves y Viernes (ningn otro), con un subalgoritmo se deber validar que as sea. Las horas sern nmeros enteros entre 8 y 22, con un subalgoritmo se deber validar que as sea. 2. Mostrar Citas de un da Deber preguntar por un da (validar) y deber mostrar, ordenados por hora, los detalles de las citas para ese da. 3. Controlar duplicados Mediante un subalgoritmo deber informar si existen o no citas para la misma hora y para el mismo da. Slo deber escribir la metodologa de cmo lo resolvera y el encabezamiento del mismo, sin desarrollarlo. 4. Salir. Se deber salir del programa Men de opciones 1. Cargar Citas 2. Mostrar Citas de un da 3. Controlar duplicados 4. Salir Mximo 50 Facultad de Ciencias Exactas, Ingeniera y Agrimensura UNR Escuela de Formacin Bsica Dpto. Matemtica Informtica I
Prctica Nro. 8 2014 Pg 5 de 11
10- Dado el algoritmo principal desarrollado a continuacin:
ALGORITMO condiciones { ...aqu van las declaraciones de subalgoritmos... }
Tipo estructura mat caracter(8) legajo caracter(8) DNI real notas[3] Fin tipo { ...aqu van las declaraciones de las variables... } //Inicio INGRESADATOS (Datos, Tot) Escribir( Se ingresaron, Tot ,alumnos ) Repetir mientras (OP <> F) Escribir( L : Buscar por Legajo) Escribir( D : Buscar por DNI) Escribir( F : Fin) Escribir( Elija una opcin) Leer( Op ) Si ( Op <> F ) entonces Escribir (Ingrese el nmero) Leer (Num) Pos BUSCA (Datos, Num, Op) Si (Pos == 0) entonces Escribir(No existe un alumno con ese dato) sino Escribir(Condicin Final: ,CONDI (Datos, Pos)) FinSi FinSi Fin mientras FIN
Declarar y desarrollar los subalgoritmos (funcin o subrutina, segn corresponda) con los parmetros correspondientes y respetando los llamados: INGRESADATOS( ): permite cargar legajo, DNI y 3 notas de cada uno de los alumnos, sin ningn orden. BUSCA( ): devuelve la posicin del alumno con ese nmero de legajo DNI , 0 si no existe un alumno con esos datos. CONDI( ) devuelve P, I L , segn las notas del alumno ubicado en la posicin Pos.
Observaciones: Tener en cuenta que no se conoce el nmero total de alumnos, pero se sabe que no superan los 100. Condiciones: P promovido (el promedio es superior a 7 y ninguna nota es inferior a 5) I condicin intermedia (no promovido. Adems el promedio es superior a 5 y ninguna nota es inferior a 4) L libre (no es P ni I)
Facultad de Ciencias Exactas, Ingeniera y Agrimensura UNR Escuela de Formacin Bsica Dpto. Matemtica Informtica I
Prctica Nro. 8 2014 Pg 6 de 11
Ejercicio N 8: Solucin codificada en lenguaje C
#include <stdio.h> #include <windows.h> //se incluye para usar la funcin Sleep #define N 20 //cantidad de jugadores //definicin del tipo de dato que permite trabajar con los datos de cada jugador typedef struct { char apelynbre[31]; int tiros[5], puntos; } jugador;
//subprograma que controla la apertura del archivo pasado como parmetro //si da error, avisa con un mensaje y finaliza la ejecucin del programa void controlArchivo(FILE *f, char nom[13]) { if (f==NULL) { printf ("\nError de apertura del archivo "); printf ("%-13s",nom); printf ("\nFinalizar%c el programa.", 160); fflush(stdin); getchar(); //termina la ejecucin del programa exit(1); } }
//subprograma que solicita el apellido y nombre de un jugador y lo graba en el archivo void cargaJugador(FILE *f, int i) { int j; char blancos[30], apelynbre[31]; //carga un arreglo de 30 espacios en blancos for (j=0;j<31;j++) blancos[j]=' '; printf("\n\nIngrese apellido y nombre (m%cximo 30 caracteres) del jugador %1d: ", 160, i+1); fflush(stdin); gets(apelynbre); //se valida la longitud del dato ingresado while (strlen(apelynbre)==0 || strlen(apelynbre)>30) { printf("\n\nLargo de apellido y nombre, inv%clido.\nReingrese apellido y nombre (m%cximo 30 caracteres) del jugador %1d: ", 160, 160, i+1); fflush(stdin); gets(apelynbre); }
//completa el apellido y nombre con los blancos necesarios para grabarlo con 30 caracteres strncat(apelynbre, blancos, 30-strlen(apelynbre)); //se graba el jugador en el archivo fprintf(f,"%-30s\n", apelynbre); }
//subprograma para realizar la carga inicial de los jugadores inscriptos hasta el momento void cargaInicial(int *i) { FILE *f; char resp; //se abre el archivo JUGADORES para poder grabarse f=fopen("JUGADORES.TXT","w"); //se controla la apertura del archivo Facultad de Ciencias Exactas, Ingeniera y Agrimensura UNR Escuela de Formacin Bsica Dpto. Matemtica Informtica I
Prctica Nro. 8 2014 Pg 7 de 11
controlArchivo(f, "JUGADORES.TXT"); printf ("\nCARGA INICIAL DE JUGADORES"); //se itera cargando los datos de los jugadores dependiendo de la eleccin del usuario //y de la cantidad de inscriptos cargados hasta el momento do { //se invoca al subprograma que solicita el apellido y nombre y graba el jugador en el archivo cargaJugador(f, *i); *i=*i+1; printf("\n%cContin%ca ingresando otro jugador? (S/N) ", 168, 163); fflush(stdin); resp=toupper(getchar()); }while (*i<N && resp=='S'); //se controla si se quiere cargar otro jugador y se ha alcanzado el mximo posible if (*i==N && resp=='S') { printf("\n\n\nImposible agregar otro jugador.\nSe ha alcanzado el m%cximo de jugadores posibles: %d ", 160, N); fflush(stdin); getchar(); } //se cierra el archivo fclose(f); }
//subprograma que muestra el men de opciones void menu(void) { system("cls"); printf("\n\n\n\t\tOpciones"); printf("\n\t\t--------\n"); printf("\n\t\t1- Cargar otro jugador"); printf("\n\t\t2- Cargar resultados"); printf("\n\t\t3- Determinar ganadores"); printf("\n\t\t0- Finalizar"); printf("\n\n\t\tIngrese su opci%cn: ",162); }
//subprograma que valida que el primer parmetro se encuentre dentro del intervalo definido por los otros // dos, sin importar si el 2do. parmetro es no, inferior al 3ro. int es_valido(int v, int e1, int e2) { return (e1<=v && v<=e2 || e2<=v && v<=e1); //0=falso / 1=verdadero }
//subprograma que presenta el men de opciones y solicita la opcin a ejecutar, validndola //devuelve una opcin vlida //si la opcin no es vlida, simplemente vuelve a mostrar el men y pedir la opcin //no avisa con cartel de opcin invlida int ingresarOpcion(void) { int op; do { menu(); scanf("%d", &op); } while (es_valido(op, 0, 3)==0); return op; }
Facultad de Ciencias Exactas, Ingeniera y Agrimensura UNR Escuela de Formacin Bsica Dpto. Matemtica Informtica I
Prctica Nro. 8 2014 Pg 8 de 11
//subprograma que permite cargar un jugador fuera de la carga inicial de inscriptos hasta el momento void cargarOtroJugador(int *i) { FILE *f; //se abre el archivo ya existente de jugadores para poder agregar uno nuevo f=fopen("JUGADORES.TXT","a"); //se controla la apertura del archivo controlArchivo(f, "JUGADORES.TXT"); printf ("\nCARGA DE OTRO JUGADOR"); //se invoca al subprograma que solicita el apellido y nombre y graba el jugador en el archivo cargaJugador(f, *i); *i=*i+1; //se cierra el archivo fclose(f); }
//subprograma que permite cargar el resultado de los 5 tiros de todos los jugadores inscriptos void cargarTiros(jugador jug[], int *band) { int i, j, ptos, sum; FILE *f; //se abre el archivo JUGADORES para poder leerse f=fopen("JUGADORES.TXT","r"); //se controla la apertura del archivo controlArchivo(f, "JUGADORES.TXT"); printf ("\nCARGA DE RESULTADOS DE TIROS PARA TODOS LOS JUGADORES"); //se inicializa el contador de jugadores i=0; //lee un jugador del archivo y se carga al arreglo de jugadores fgets(jug[i].apelynbre, 32, f); //se procesan todos los jugadores grabados en el archivo hasta que se encuentra el final del archivo while (!feof(f)) { sum=0; //se muestra el apellido y nombre del jugador para ingresarle los tiros printf("\n\nIngrese los resultados del jugador: %-30s", jug[i].apelynbre); //se solicita el ingreso de los 5 tiros for (j=0;j<5;j++) { printf("\nPuntaje del tiro nro. %1d: ", j+1); scanf("%d", &ptos); //se controla que los puntos ingresados sean vlidos invocando al subprograma que valida while (es_valido(ptos, 0, 3)==0) { //si no son vlidos se avisa con un cartel y se solicita se vuelva a ingresar printf("\nDebe ingresar un valor entre 0 y 3. Reingrese puntaje del tiro nro. %1d: ", j+1); scanf("%d", &ptos); } //se asignan los puntos al elemento correspondiente de la estructura segn el nmero de tiro jug[i].tiros[j]=ptos; //se totalizan los puntos del jugador sum+=ptos; //sum=sum+ptos } //se asigna el total de puntos al elemento correspondiente de la estructura jug[i].puntos=sum; //se incrementa el contador de jugadores i++; //i=i+1 //se lee del archivo otro jugador fgets(jug[i].apelynbre, 32, f); } Facultad de Ciencias Exactas, Ingeniera y Agrimensura UNR Escuela de Formacin Bsica Dpto. Matemtica Informtica I
Prctica Nro. 8 2014 Pg 9 de 11
//se cambia el valor de la bandera para indicar que se cargaron los tiros de todos los jugadores //inscriptos *band=1; //se cierra el archivo fclose(f); }
//subprograma que categoriza los jugadores, detecta los 3 ganadores y graba el archivo con los //jugadores que calificaban void categorizar(jugador jug[], int c) { int i, j, aux, mejores[c][2], k, tope, p; char auxiliar[31]; FILE *f; //se abre el archivo MEJORES para poder grabarse f=fopen("MEJORES.TXT","w"); //se controla la apertura del archivo controlArchivo(f, "MEJORES.TXT"); printf ("\nTABLA DE GANADORES"); //se inicializa el contador que contar los jugadores que pueden calificar para los trofeos tope=0; //se carga la matriz con los jugadores que califican, teniendo en cuenta el criterio establecido //la matriz contendr: // en la columna 0: la posicin correspondiente al jugador, dentro del arreglo de jugadores // en la columna 1: el total de puntos de dicho jugador for (i=0;i<c;i++) { //el jugador califica si su promedio de puntos es mayor o igual a 2 y no tuvo puntaje 0 en //ninguno de sus tiros if (jug[i].puntos/5>=2 && jug[i].tiros[0]!=0 && jug[i].tiros[1]!=0 && jug[i].tiros[2]!=0 && jug[i].tiros[3]!=0 && jug[i].tiros[4]!=0) { //se incrementa el contador de los jugadores que califican para los trofeos tope++; //tope=tope+1 mejores[tope-1][0]=i; mejores[tope-1][1]=jug[i].puntos; } } //se ordenan los jugadores que calificaron, de mayor a menor segn los puntos totales for (i=0;i<tope-1;i++) for (j=i+1;j<tope;j++) { if (mejores[i][1]<mejores[j][1]) { for (k=0;k<2;k++) { aux=mejores[i][k]; mejores[i][k]=mejores[j][k]; mejores[j][k]=aux; } } } //se muestra la tabla de trofeos for (i=0;i<3;i++) { printf("\nPremio n%cmero %1d: ", 163, i+1); if (tope-1<i) printf("No hay ganador"); else printf("Con %2d puntos - %-30s", jug[mejores[i][0]].puntos, jug[mejores[i][0]].apelynbre); }
Facultad de Ciencias Exactas, Ingeniera y Agrimensura UNR Escuela de Formacin Bsica Dpto. Matemtica Informtica I
Prctica Nro. 8 2014 Pg 10 de 11
//si hubo jugadores que calificaron, se genera el archivo MEJORES con todos sus datos if (tope==0) printf("\n\nSe gener%c vac%co el archivo con los mejores jugadores, pues no hay jugadores que califiquen como tales. ", 162, 161); else { for (i=0;i<tope;i++) { p=mejores[i][0]; //se copia el apellido y nombre a una variable auxiliar para quitarle el \n strncpy(auxiliar, jug[p].apelynbre, 30); fprintf(f, "%-30s%1d%1d%1d%1d%1d%2d\n", auxiliar, jug[p].tiros[0],jug[p].tiros[1], jug[p].tiros[2], jug[p].tiros[3], jug[p].tiros[4],jug[p].puntos); } printf("\n\nSe gener%c el archivo con los mejores jugadores que calificaban como tales. ", 162); } //se cierra el archivo fclose(f); //se genera una pausa para poder leer los resultados antes de volver al programa principal fflush(stdin); getchar(); }
//programa principal main() { int opc, cant, band; jugador jug[N]; band=0; //bandera que indica que an no comenz el torneo (no se cargaron los tiros) cant=0; //cantidad de inscriptos //se invoca al subprograma que realiza la carga de los inscriptos hasta el momento cargaInicial(&cant); opc=-1; while (opc!=0) { //se muestra el men de opciones y se ingresa una opcion opc=ingresarOpcion(); system("cls"); //se ejecuta la opcin ingresada switch (opc) { case 1: //se valida si quedan lugares para un nuevo inscripto if (cant==N) { printf("\nImposible agregar otro jugador. \nSe ha alcanzado el m%cximo de jugadores posibles: %d ", 160, N); fflush(stdin); getchar(); } else { //se valida si ya comenz o no el torneo if (band==0) //se invoca al subprograma que permite cargar un nuevo inscripto al torneo cargarOtroJugador(&cant); else { printf("\nImposible agregar otro jugador, ya comenz%c el torneo. ", 162); fflush(stdin); getchar(); } } Facultad de Ciencias Exactas, Ingeniera y Agrimensura UNR Escuela de Formacin Bsica Dpto. Matemtica Informtica I
Prctica Nro. 8 2014 Pg 11 de 11
break; case 2: //se valida si ya se cargaron o no los tiros if (band==0) //se invoca al subprograma que permite cargar los tiros de todos los jugadores cargarTiros(jug, &band); else { printf("\nYa se cargaron los tiros de todos los jugadores. "); fflush(stdin); getchar(); } break; case 3: //se valida si ya se cargaron o no los tiros como para poder categorizar if (band!=0) //se invoca al subprograma que permite categorizar los jugadores //detecta los 3 ganadores y graba el archivo con los que calificaban categorizar(jug, cant); else { printf("\nDeben cargarse los tiros antes de poder determinar los ganadores. "); fflush(stdin); getchar(); } break; case 0: printf("\n\nGracias por usar el sistema...\n\n"); //genera una pausa de 3000 milisegundos que permite leer el cartel Sleep(3000); } } }