Examen C0 0607 Ejercicio 1 (3 puntos)

Anuncio
Examen C0 0607
Ejercicio 1 (3 puntos)
En un programa que gestiona la información de vuelos comerciales se
han definido las siguientes constantes, estructuras y variables:
#define MAXCAD 50
struct tiempo { int hora, min; };
struct fecha { int dia, mes, año; };
typedef struct
{
char origen[MAXCAD], destino[MAXCAD], compañia[MAXCAD];
struct tiempo hora_salida, hora_llegada;
struct fecha fecha_salida, fecha_llegada;
} info_vuelo;
void main() {
info_vuelo *vuelos;
int nvuelos, pos, h, m;
FILE *df;
1
a) (0.75 puntos) Escribe las instrucciones
necesarias para crear el vector dinámico que
permita almacenar la información de todos los
vuelos. Supón que el número de vuelos se lee de
la primera línea de un fichero, y que el descriptor
df se encuentra apuntando al principio del fichero.
fscanf(df,"%d",&nvuelos);
vuelos = (info_vuelo *) malloc
(nvuelos * sizeof(info_vuelo));
b) (1 punto) Escribe una función "modifica_hora_salida"
que reciba como argumentos una estructura de tipo
“info_vuelo" y la nueva hora de salida (hora y minuto). La
función debe actualizar convenientemente el campo
"hora_sal" de la estructura.
void modifica_hora_salida
(info_vuelo *vuelo, int hora, int min)
{
vueloÆhora_salida.hora=hora;
vueloÆhora_salida.min=min;
}
Solución 1: Utilizando paso
por referencia de la estructura
2
Solución 2: Utilizando paso por valor y
devolviendo el resultado con return
info_vuelo modifica_hora_salida
(info_vuelo vuelo, int hora, int min)
{
vuelo.hora_salida.hora=hora;
vuelo.hora_salida.min=min;
return(vuelo);
}
c) (0.5 puntos) Realiza una llamada a la
función anterior pasándole como argumento
un vuelo del vector. La posición del vuelo a
modificar y la nueva hora deben introducirse
por el teclado.
printf("Introduce la posición del vuelo a modificar\n");
scanf("%d",&pos);
printf("Introduce la nueva hora y minuto\n");
scanf("%d%d",&h,&m);
Solución 1: Paso por referencia
modifica_hora_salida(&vuelos[pos],h,m);
Solución 2: Paso por valor y return
vuelos[pos]=modifica_hora_salida(vuelos[pos],h,m);
3
d) (0.75 puntos) Define una nueva estructura de tipo
"info_plazas" que conste de dos campos: el número de
plazas del vuelo y el número de plazas vendidas. Amplía la
estructura principal "info_vuelo" con un nuevo campo del
tipo de la nueva estructura definida "info_plazas".
struct info_plazas
{
int nplazas, vendidas;
};
typedef struct
{
char origen[MAXCAD], destino[MAXCAD];
char compañia[MAXCAD];
struct tiempo hora_salida, hora_llegada;
struct fecha fecha_salida, fecha_llegada;
struct info_plazas plazas;
} info_vuelo;
Ejercicio 2 (3.5 puntos)
Se desea obtener un programa en C que lleve a cabo la corrección ortográfica de cualquier texto. La
corrección ortográfica de un texto se puede realizar basándose en la información de un diccionario. El
diccionario contiene un gran número de palabras válidas. Las palabras del diccionario están
almacenadas en un fichero de nombre "dicc.txt". Cada línea del fichero contiene una palabra. Se
asume que el diccionario no contiene más de 100.000 palabras. El programa debe revisar un texto
almacenado en un fichero y escribir en otro fichero el texto corregido. El programa se estructurará en
las siguientes funciones:
a) leer_dicc: lee del fichero "dicc.txt" las palabras del diccionario y las almacena en una matriz
de caracteres. La función devolverá el número de palabras leídas.
b) busca_pal: busca en la matriz de palabras una palabra específica. Devuelve 1 si la palabra se
encuentra en la matriz, o 0 en caso contrario.
c) corregir_texto: dado un fichero que contiene un texto (texto origen) escribe en otro fichero el
texto corregido. Los nombres de ambos ficheros se solicitarán por el teclado. Esta función
debe comprobar, para cada palabra del texto origen, si está almacenada en el diccionario o no.
Para realizar esta comprobación se utilizará la función busca_pal. En el caso de que la palabra
se encuentre en el diccionario (palabra válida), la misma palabra se escribirá tal cual en el
fichero del texto corregido. En el caso de que la palabra no se encuentre en el diccionario
(palabra no válida), el programa permitirá dos opciones:
1. Aceptar la palabra como válida: en este caso la palabra se escribirá tal cual en el
fichero del texto corregido y se añadirá como una palabra más en la matriz de palabras
del diccionario.
2. No aceptar la palabra como válida: en este caso el programa solicitará que se
introduzca por el teclado la palabra corregida. Esta palabra introducida será la que se
escriba en el fichero del texto corregido.
El programa, antes de finalizar, debe escribir las palabras del diccionario en el fichero "dicc.txt", ya
que pueden haberse añadido nuevas palabras durante la corrección del texto.
4
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXLON 80
#define MAXPAL 100000
int leer_dicc (char m[ ][MAXLON])
{
Lee del fichero "dicc.txt" las
FILE *df;
palabras del diccionario y las
int i;
almacena en una matriz de
caracteres. La función devolverá
df=fopen("dicc.txt","r");
el número de palabras leídas.
if (df==NULL)
{
printf("Error abriendo el diccionario\n");
exit(-1);
}
i=0;
while (fscanf(df,"%s",m[i])!=EOF)
i++;
fclose(df);
return(i);
}
5
int busca_pal (char m[ ][MAXLON],
char pal[ ], int npal)
{
Busca en la matriz de palabras
int i;
una palabra específica.
Devuelve 1 si la palabra se
encuentra en la matriz, o 0 en
caso contrario.
for(i=0;i<npal;i++)
if (strcmp(m[i],pal)==0)
return(1);
return(0);
}
Dado un fichero que contiene un
int corregir_texto(char m[ ][MAXLON], int npal)
texto (texto origen) escribe en
{
otro fichero el texto corregido
FILE *df_in,*df_out;
char nomfich_in[MAXLON], nomfich_out[MAXLON], pal[MAXLON];
int op;
printf("Introduce el nombre del fichero a revisar\n");
scanf("%s", nomfich_in);
df_in=fopen(nomfich_in,"r");
if (df_in==NULL)
{
printf("Error abriendo fichero %s\n",nomfich_in);
exit(-1);
}
printf("Introduce el nombre del fichero donde guardar el texto revisado\n");
scanf("%s", nomfich_out);
df_out=fopen(nomfich_out,"w");
if (df_out==NULL)
{
printf("Error abriendo fichero %s\n",nomfich_out);
fclose(df_in);
exit(-1);
}
6
while (fscanf(df_in,"%s",pal)!=EOF)
{
if (busca_pal (m, pal, npal) == 0)
{
printf("La palabra %s no se encuentra en el
diccionario\n", pal);
do
{
printf("1. Aceptar la palabra %s como
válida\n", pal);
printf("2. No aceptar la palabra %s como
válida\n", pal);
scanf("%d",&op);
}
while ( (op<1) || (op>2) );
if (op==1) // No aceptarla como válida
{
if (npal<MAXPAL)
{ // Copiarla en la matriz de válidas
strcpy(m[npal],pal);
npal++;
}
else
printf("El diccionario contiene el número
máximo de palabras: %d\n",MAXPAL);
}
else // Aceptarla como válida (leer la corregida)
{
printf("Introduce la palabra corregida: \n");
scanf("%s",pal);
}
}
fprintf(df_out,"%s ",pal);
}
7
fclose(df_in);
fclose(df_out);
return(npal);
}
void guardar_dicc(char m[ ][MAXLON], int npal)
{
int i;
FILE *df;
df=fopen("dicc.txt","w");
if (df==NULL)
{
printf("Error abriendo el diccionario\n");
exit(-1);
}
for(i=0;i<npal;i++)
fprintf(df,"%s\n",m[i]);
fclose(df);
}
8
int main()
{
char dicc[MAXPAL][MAXLON];
int npal;
npal = leer_dicc(dicc);
npal = corregir_texto(dicc,npal);
guardar_dicc(dicc,npal);
exit(0);
}
Ejercicio 3 (3.5 puntos)
Se necesita un programa en C que permita controlar la programación de radio de un día.
La emisora tiene diariamente un máximo de 50 programas diferentes. Cada programa
emite una serie de canciones, hasta un máximo de 100 canciones por programa. La
información que se desea controlar de cada programa es: nombre del programa (cadena
de caracteres), hora y minuto de inicio, duración del programa en minutos (valor entero)
y número de canciones de que consta el programa. Para cada canción se desea
almacenar la siguiente información: título (cadena de caracteres) y duración de la
canción (valor real). Inicialmente el programa debe solicitar al usuario los datos de la
programación del día: el número de programas de ese día y los datos de cada programa.
Para cada programa debe solicitar de cuántas canciones consta el programa y los datos
de cada canción. Seguidamente mostrará un menú con las siguientes opciones:
a) Buscar un programa: solicita al usuario el nombre del programa y muestra
todos los datos del programa, incluyendo todas las canciones que se emiten.
b) Duración: se mostrará por pantalla el nombre del programa que más tiempo
dedica a canciones (un programa consta de canciones y comentarios del locutor).
Para dicho programa hay que mostrar, además, el tiempo destinado a canciones
y el tiempo destinado a comentarios del locutor.
c) Mostrar datos: muestra los datos de todos los programas ordenados por hora y
minuto de inicio. Para cada programa debe mostrar:
hora_inicio:minuto_inicio nombre_del_programa
...
d) Salir.
9
#include <stdio.h>
#include <string.h>
#define TRUE 1
#define FALSE 0
typedef struct
{
char titulo[80];
float duracion;
} cancion;
typedef struct
{
char nombre[80];
int hora_inicio, minuto_inicio, duracion;
int num_canciones;
cancion canciones[100];
} programa;
int menu ()
{
int opc;
do
{
printf("\n1. Buscar programa\n");
printf("2. Programa de máxima duración\n");
printf("3. Mostrar datos\n");
printf("4. Salir\n");
scanf("%d", &opc);
}
while (opc<1 || opc>4);
return opc;
}
10
int leer (programa p[50])
{
int n, i, j;
printf("Numero de programas: ");
scanf("%d", &n);
for (i=0; i<n; i++)
{
printf("Nombre del programa %d: ", i);
gets(p[i].nombre);
printf("Hora y minuto de inicio del programa %d: ", i);
scanf("%d%d", &p[i].hora_inicio, &p[i].minuto_inicio);
printf("Duración del programa %d: ", i);
scanf("%d", &p[i].duracion);
printf("Número de canciones del programa %d: ", i);
scanf("%d", &p[i].num_canciones);
for (j=0; j<p[i].num_canciones; j++)
{
printf("Titulo de la canción %d del programa %d: ", j, i);
gets(p[i].canciones[j].titulo);
printf("Duración de la canción %d del programa %d: ", j, i);
scanf("%f", &p[i].canciones[j].duracion);
}
}}
void duraciones (programa p[50], int n)
{
int i, j, progmax=-1;
float max=0.0, tiempo_canciones;
Se mostrará por pantalla el nombre del
programa que más tiempo dedica a
canciones (un programa consta de
canciones y comentarios del locutor).
Para dicho programa hay que mostrar,
además, el tiempo destinado a
canciones y el tiempo destinado a
comentarios del locutor
for (i=0; i<n; i++)
{
tiempo_canciones=0.0;
for (j=0; j<p[i].num_canciones; j++)
tiempo_canciones += p[i].canciones[j].duracion;
if (tiempo_canciones>max)
{
max = tiempo_canciones;
progmax = i;
}
}
printf("El programa que más tiempo dedica a canciones es %s (%.2f)\n",
p[progmax].nombre, max);
printf("Tiempo de locutor: %f\n", p[progmax].duracion - max);
}
11
void buscar_programa (programa p[50], int n)
{
char titulo[80];
int encontrado=FALSE, i=0, j;
printf("Introduce el nombre del programa: ");
scanf("%s", titulo);
while (i<n && encontrado==FALSE)
if (strcmp(titulo, p[i].nombre)==0)
encontrado=TRUE;
Solicita al usuario el nombre del
else i++;
programa y muestra todos los datos del
programa, incluyendo todas las
canciones que se emiten.
if (encontrado==TRUE)
{
printf("Programa: %s\n", p[i].nombre);
printf("Hora inicio:%d:%d Duración:%dm\n",
p[i].hora_inicio, p[i].minuto_inicio,
p[i].duracion);
printf("Numero de canciones: %d Canciones:\n",
p[i].num_canciones);
for (j=0; j<p[i].num_canciones; j++)
printf("%s%f\n", p[i].canciones[j].titulo,
p[i].canciones[j].duracion);
}
else
printf("No encontrado");
}
12
void ordenar (programa p[50], int n)
{
Ordena por hora y
int i=1, j, ordenado=FALSE;
minuto.
programa aux;
while (ordenado==FALSE)
{
ordenado=TRUE;
for (j=0; j<n-i; j++)
if ((p[j].hora_inicio>p[j+1].hora_inicio)
|| (p[j].hora_inicio==p[j+1].hora_inicio &&
p[j].minuto_inicio>p[j].minuto_inicio))
{
aux = p[j];
p[j] = p[j+1];
p[j+1] = aux;
ordenado=FALSE;
}
i++;
}}
void mostrar (programa p[50], int n)
{
Muestra los datos de todos los programas
ordenados por hora y minuto de inicio. Para
int i;
cada programa debe mostrar:
hora_inicio: minuto_inicio
nombre_del_programa
ordenar (p,n);
for (i=0; i<n; i++)
printf("%2d:%2d %s\n", p[i].hora_inicio,
p[i].minuto_inicio,p[i].nombre);
}
13
void main()
{
programa p[50];
int n, opc;
n = leer(p);
if (n<=0) exit(-1);
do
{
opc = menu();
switch(opc)
{
case 1: buscar_programa(p, n); break;
case 2: duraciones(p, n); break;
case 3: mostrar(p, n); break;
}
} while (opc!=4);
}
14
Descargar