Skip to content
valeriahernandobernabe edited this page Jun 6, 2020 · 11 revisions

Welcome to the twE105_1920-informaticosas wiki!

TEATRO LA ULTIMA

Durante este cuatrimestre hemos estado trabajando en este programa de informática usando el Visual Studio en lenguaje C. El programa consiste en un teatro llamadO “LA ULTIMA” , en el que iniciando sesión uno puede ver las obras que se anuncian en el teatro y puede comprar las entradas.

El programa no sigue el mismo diagrama de flujo qué el que inicialmente estaba previsto, pero esto se debe a que si seguíamos con el diagrama se quedaba un código más engorroso y difícil de entender. Aún así, lo principal sí que lo hemos seguido, son los submenús lo que hemos cambiado respecto del inicial.

CODIGO:

En primer lugar hemos introducido las librerías que vamos a usar:

#include <stdio.h> : la libreria estándar del programa.

#include <string.h>: la necesitamos para manipular cadenas de caractéres.

#include <bool.h> : define los tipos true y false que usaremos para abrir y cerrar el programa.

#include <windows.h> : funcion que nos permite usar system("CHCP 1252") que muestra bien las tildes y las ñ.

#include <stdlib.h> : contiene protoipos para la utilizacion de memoria dinámica.

También hemos definido constantes globales : #define MAX_USUARIOS 50 y #define MAX_OBRAS 10 con las que si en futuro se quiere cambiar los valores, solo hace falta cambiar éstas variables para no tener que ir cambiándolas por el código.

Tras esto, hemos declarado las estructuras dónde agrupamos los diferentes datos de un elemento:

  • usuario_estructura : guardamos todos los datos de un solo usuario
struct usuario_estructura { //datos de cada usuario
	char nombre[30];
	char apellido1[50];
	char apellido2[50];
	char nom_usuario[25];
	char contrasena[25];
	int num_entradas;

};
  • teatro : guardamos el nombre de la obra y el numero de asientos disponibles.
struct teatro { //datos de cada obra
	int asientos;
	char obra[50];
};

A continuación hemos definido las funciones: Primero hemos definido las funciones que nos sirven para simplificar el código :

  • LOGO: void logo() : es una función con la que mostramos el logo.
  • MENU INICIO : int menuinicio(int codigo) : permite que vuelva a salir el menú sin necesidad de volver a escribir todo el código.
  • INICIO : char inicio(int n) : saluda al usuario teniendo en cuenta si es la primera vez que entra o no.

Seguido de éstas funciones, definimos en orden las funciones que representan cada una de las opciones del menú. Además, el uso de todas estas funciones implica un main más sencillo y fácil de entender.

void registro(struct usuario_estructura usuarios_completo[], int *n);
void login(struct usuario_estructura usuarios_completo[], int n, int *codigo, struct teatro cartelera[], int num_obras, int *fin, bool *cont);
void showCartelera(struct teatro cartelera[], int i);
void seeProfile(struct usuario_estructura usuarios_completo[], int codigo);
void comprarObra(struct usuario_estructura usuarios_completo[], int codigo, struct teatro cartelera[], int num_obras);
void exitProg(struct usuario_estructura usuarios_completo[], int *fin, bool *cont, int num_usuarios, struct teatro cartelera[], int num_obras);

(En otra página se explica cada función más detenidamente).

En la función principal main es dónde desarrollamos el programa.

Usamos la función system("COLOR F0"); para cambiar el color del fondo y del texto de la consola.

Definimos todas las variables que necesitamos en el main:

struct usuario_estructura usuarios[MAX_USUARIOS]; // vector de estructuras que guarda los USUARIOS
struct teatro cartelera[MAX_OBRAS];//vector de estructuras que guarda las OBRAS
int fin, n; //variables para el fin de programa y numero de iteraciones
int opcion; // opcion del menu principal
int cod_usuario = -1; //codigo que tiene cada usuario , lo inicializamos a -1 porque significa que aun no se ha iniciado ninguna sesion, ya que el primer registrado tendra el 0
int num_usuarios = 0;//Numero de usuarios totales.
int num_obras = 0; // NUmero de obras. 
int l = 2; // numero de variables que lee el scanf por linea de fichero lo inicializamos a 2 para que se meta en el while (posible cambio a do-while)
bool cont = true; //inicializamos el bool a 1

A continuación, abrimos los ficheros . Usamos dos ficheros, uno para almacenar a los usuarios y otro para almacenar las obras de teatro.

FILE *f_usuarios, *f_obras;
	f_usuarios = fopen("listaUsuarios.txt", "rb"); //abrimos el fichero con los usuarios
	f_obras = fopen("cartelera.txt", "r"); //abrimos fichero con las obras

El fichero que corresponde a los usuarios: listaUsuario.txt es un fichero que almacena sus datos en modo binario ya que de esta forma requiere menos espacio en disco. Usamos las funciones fwrite() y fread() que nos permiten leer y escribir los datos en bloques de bytes.A fread() le asignamos el vector de estructuras struct usuario_estructura usuarios[MAX_USUARIOS];para que guarde ahí los datos de cada usuario.

num_usuarios = fread(usuarios, sizeof(struct usuario_estructura), MAX_USUARIOS, f_usuarios); //devuelve el numero de usuarios que hay hasta el momento, n-1, por lo que el nuevo usuario será el numero n.

El fichero que corresponde a las obras de teatro: cartelera.txt es un fichero que almacena los datos en modo texto.Los datos se guardan de esta forma : numeroAsientos nombreObra. Utilizamos un bucle para que, con la función fscanf(), vaya guardando lo que lee linea por linea en cada espacio del vector de estructuras struct teatro cartelera[MAX_OBRAS];. Además, la funcion fscanf() devuelve el numero de elementos que lee por linea, de esta forma, cuándo ya no lee 2 elementos por línea,sabemos que ya no hay más obras y utilizando el bucle, sabemos cuántas obras hay,

while (num_obras < MAX_OBRAS) { //solo copiamos al vector el numero de obras que puede abarcar

		l = fscanf(f_obras, "%d %50[^\n]", &cartelera[num_obras].asientos, cartelera[num_obras].obra); //la funcion fscanf devuuelve el numero de variables que lee por linea de fichero, en nuestro caso tiene los asientos y el nombre la obra.
		if (l == 2) {
			num_obras++; // solo sumamos al numero de obras si l=2, porque si no las lineas del fichero que no están escritas tambien las sumara al numero de obras.
		}
		else break; //en el momento que l !=2, se sale del while y deja de copiar
	}

Después, cerrramos los ficheros:

fclose(f_usuarios); //cerramos ambos ficheros
fclose(f_obras);

Guardamos todo otra vez en los ficheros cuando salimos de programa, en la función void exitProg(struct usuario_estructura usuarios_completo[], int *fin, bool *cont, struct teatro cartelera[], int num_obras);

Lo siguiente y último del main consiste en un bucle anidado y un switch-case, dónde dependiendo de la opción que desee el cliente, se va al case que corresponde y se llama a la función deseada.

while (cont) { //cuando el booleano se cambie a 0 (false) , se cierra el programa
		fin = 0;
		n = 0;

		while (fin == 0) {
			inicio(n);
			n = 1;//como ya ha iniciliazado una vez, se cambi aa 1 para que muestre el otro mensaje de inicio
			switch (menuinicio(cod_usuario)) { //le pasamos el codigo de usuario, para que muestre un menu u otro dependiendo si ha iniciado sesion

			case 1: //REGISTRO
				registro(usuarios, &num_usuarios); //le pasamos por referencia el numero de usuarios, porque la funcion le cambiara el valor cuando se regustre un usuario mas
				break;

			case 2: //INICIO DE SESION
				login(usuarios, num_usuarios, &cod_usuario, cartelera, num_obras, &fin, &cont);//
																							   //printf("%d\n", cod_usuario); //comprobacion
				break;

			case 3: //VER CARTELERA
				showCartelera(cartelera, num_obras);
				break;

			case 4: //SALIR DEL PORGRAMA
			case 7: //SALIR DEL PROGRAMA
				exitProg(usuarios, &fin, &cont, num_usuarios, cartelera, num_obras);
				break;

			case 5: // VER PERFIL
				seeProfile(usuarios, cod_usuario);
				break;
			case 6://COMPRAR ENTRADAS
				showCartelera(cartelera, num_obras);
				comprarObra(usuarios, cod_usuario, cartelera, num_obras);
				break;


			default:  printf("Esta opcion no es valida. PRUEBE DE NUEVO\n");
			}//switch del menu principal

		}//while del fin	
		system("pause");
	}//while del booleano

}//salida del main

Después del main, vienen todas las funciones declaradas anteriormente (explicadas en otra pagina de la wiki).

Fin del Codigo

Guia de uso

(otra pagina de la wiki)

Objetivos y Conclusiones que sacamos del trabajo

Este trabajo nos ha servido para mejorar y agilizar nuestro conocimiento sobre la programacion en C. Lidiando con los problemas que nos iba dando el programa hemos aprendido a no cometer errores tontos y a detectar fallos mas rápido, lo que en un futuro nos vendrá muy bien si queremos seguir programando. Además, se tiene una mejor visión en general de como planificar y escribir un código que en una futura empresa nos puedan pedir. Es un programa que se puede mejorar en muchos aspectos, incluyéndole funciones nuevas y memoria dinámica para la lectura de ficheros pero en conjunto es un programa fácil, sencillo y del que estamos muy contentos con el resultado.