#include <iostream>
#include <fstream>
#include <cstdlib>
#include <cstring>
using namespace std;
#define _n <<char(-92)<< //la letra ñ.
const int MAX_TITULO = 100;
const int MAX_GENERO = 50;
const int MAX_SIPNOSIS = 1024;
const int MAX_PELICULAS = 1024;
const int MAX_BUFF = 1024;
typedef unsigned short USHORT;
struct pelicula {
char titulo[MAX_TITULO];
char genero[MAX_GENERO];
char sipnosis[MAX_SIPNOSIS];
USHORT anno;
};
struct videoteca {
pelicula lista[MAX_PELICULAS];
USHORT cnt;
};
/**************************************** P R O T O T I P O S **********************************/
int salir();
void iniciarVideoteca(videoteca *pVid);
void finalizarVideoteca(videoteca *pVid);
void asignarPelicula(pelicula *pPeli, const char *titulo);
void asignarPelicula(pelicula *pPeli, const char *genero);
void asignarPelicula(pelicula *pPeli, const USHORT anno);
void asignarPelicula(pelicula *pPeli, const char *sipnosis);
bool saveVideoteca(videoteca *pVid, const char *nombreArchivo, bool overwrite=false);
USHORT loadVideoteca(videoteca *pVid, const char *nombreArchivo);
void ordenarVid(videoteca *pVid);
void iniciarPelicula(pelicula *pPeli);
void AddPeli(videoteca *pVid, pelicula *pPeli);
void moverPelis(videoteca *pVid, USHORT posPeli1, USHORT posPeli2);
void borrarPeli(videoteca *pVid, const pelicula *pPeli, const USHORT opBorrar);
USHORT BuscaPeli(USHORT *temp, videoteca *pVid, USHORT modoBusqueda, pelicula *CampoPeli);
void imprimirResultados(const videoteca *pVid, USHORT *listaResultados, USHORT resultados);
void imprimirVideoteca(const videoteca *pVid, const USHORT modo, pelicula *campoPeli);
bool VidLLena(const videoteca *pVid);
bool VidVacia(const videoteca *pVid);
/****************************************** M A I N *****************************************/
int main() {
USHORT op = 0, op2 = 0, resultados = 0;
USHORT tmpList[MAX_PELICULAS];
char buffer[MAX_BUFF];
videoteca videot;
iniciarVideoteca(&videot);
pelicula temp;
while(op != 7) {
system("cls");
cout << " -------------------------------------------" << endl;
cout << "|| Videotech || Organizador de Videotecas. ||" << endl;
cout << " -------------------------------------------" << endl;
cout << "(1) A"_n"adir Pelicula." << endl;
cout << "(2) Buscar Pelicula." << endl;
cout << "(3) Mostrar Videoteca." << endl;
cout << "(4) Eliminar Pelicula." << endl;
cout << "(5) Guardar Videoteca." << endl;
cout << "(6) Cargar Videoteca." << endl;
cout << "(7) Salir." << endl;
cin >> op;
cin.get();
switch (op) {
case 1:////
cout << "Introduzca el Titulo: " << endl;
cin.getline(temp.titulo, MAX_TITULO);
cout << "Introduzca el Genero: " << endl;
cin.getline(temp.genero, MAX_GENERO);
cout << "Introduzca el A"_n"o de estreno: " << endl;
cin >> temp.anno;
cin.get();
cout << "Introduzca la Sipnosis de la Pelicula: " << endl;
cin.getline(temp.sipnosis, MAX_SIPNOSIS);
AddPeli(&videot, &temp);
break;
case 2:////
system("cls");
op2 = 0;
while(op2 != 1 && op2 != 2 && op2 != 3) {
cout << "Seleccione un Metodo de Busqueda: " << endl;
cout << "(1) Por Titulo." << endl;
cout << "(2) Por Genero." << endl;
cout << "(3) Por A"_n"o." << endl;
cin >> op2;
cin.get();
}
switch(op2) {
case 1:
cout << "Introduzca el Titulo a buscar:" << endl;
iniciarPelicula(&temp);
cin.getline(temp.titulo, MAX_TITULO);
resultados = BuscaPeli(tmpList, &videot, op2, &temp);
imprimirResultados(&videot, tmpList, resultados);
break;
case 2:
cout << "Introduzca el Genero a buscar:" << endl;
iniciarPelicula(&temp);
cin.getline(temp.genero, MAX_GENERO);
resultados = BuscaPeli(tmpList, &videot, op2, &temp);
imprimirResultados(&videot, tmpList, resultados);
break;
case 3:
cout << "Introduzca el A"_n"o a buscar:" << endl;
iniciarPelicula(&temp);
cin >> temp.anno;
cin.get();
resultados = BuscaPeli(tmpList, &videot, op2, &temp);
imprimirResultados(&videot, tmpList, resultados);
break;
}
break;
case 3:///////////////////////////////////////////////////////
cout << "Mostrar orden por: " << endl;
cout << "(1) Titulo." << endl;
cout << "(2) Genero." << endl;
cout << "(3) A"_n"o" << endl;
cin >> op2;
cin.get();
switch (op2) {
case 1:
ordenarVid(&videot);
imprimirVideoteca(&videot, op2, &temp);
break;
case 2:
iniciarPelicula(&temp);
cout << "Introduzca el Genero: " << endl;
cin.getline(temp.genero, MAX_GENERO);
imprimirVideoteca(&videot, op2, &temp);
break;
case 3:
iniciarPelicula(&temp);
cout << "Introduzca el A"_n"o" << endl;
cin >> temp.anno;
cin.get();
imprimirVideoteca(&videot, op2, &temp);
break;
system("pause");
}
break;
case 4://///////////////////////////////////////////////////////
op2 = 0;
cout << "Seleccion el criterio para Borrar: " << endl;
cout << "(1) Por Titulo" << endl;
cout << "(2) Por A"_n"o" << endl;
cout << "(3) Por Genero" << endl;
cin >> op2;
cin.get();
switch(op2) {
case 1:
cout << "Introduzca el Titulo: " << endl;
cin.getline(temp.titulo, MAX_TITULO);
borrarPeli(&videot, &temp, op2);
break;
case 2:
cout << "Introduzca el Genero: " << endl;
cin.getline(temp.genero, MAX_GENERO);
borrarPeli(&videot, &temp, op2);
break;
case 3:
cout << "Introduzca el A"_n"o: " << endl;
cin >> temp.anno;
cin.get();
borrarPeli(&videot, &temp, op2);
break;
}
case 5:////////////////////////////////////////////////////////////////////////////
cout << "Introduzca el nombre de la Videoteca: " << endl;
cin.getline(buffer, MAX_BUFF);
while(!saveVideoteca(&videot, buffer)) {
do {
cout << "Desea sobreescribir la Videoteca: " << buffer << "?" << endl;
cout << "(1) Si." << endl;
cout << "(2) No." << endl;
op2=0;
cin >> op2;
cin.get();
if(op2 == 1) { saveVideoteca(&videot, buffer, true); }
if(op2 == 2) {
cout << "Introduzca el nuevo nombre de la Videoteca: " << endl;
cin.getline(buffer, MAX_BUFF);
saveVideoteca(&videot, buffer);
}
} while(op2 != 1 && op2 != 2);
}
break;
case 6:
cout << "Introduzca el nombre de la Videoteca" << endl;
cin.getline(buffer, MAX_BUFF);
loadVideoteca(&videot, buffer);
break;
case 7://////////////////////////////////////////////////////////////////////////////
salir();
break;
}
}
return 0;
}
/************************************************ End Of Main *********************************************/
/***************************** R U T I N A S *************************************/
void iniciarVideoteca(videoteca *pVid) {
pVid->cnt = 0;
}
void finalizarVideoteca( videoteca *pVid ) {
}
void iniciarPelicula(pelicula *pPeli) {
pPeli->titulo[0] = 0;
pPeli->genero[0] = 0;
pPeli->anno = 0;
pPeli->sipnosis[0] = 0;
}
void asignarTitulo(pelicula *pPeli, const char *titulo) {
strncpy(pPeli->titulo, titulo, MAX_TITULO);
}
void asignarGenero(pelicula *pPeli, const char *genero) {
strncpy(pPeli->genero, genero, MAX_GENERO);
}
void asignarAnno(pelicula *pPeli, const USHORT anno) {
pPeli->anno = anno;
}
void asignarSipnosis(pelicula *pPeli, const char *sipnosis) {
strncpy(pPeli->sipnosis, sipnosis, MAX_SIPNOSIS);
}
/******************************************** G U A R D A R V I D E O T E C A ****************************************/
bool saveVideoteca(videoteca *pVid, const char *nombreArchivo, bool overwrite) {
USHORT i=0;
ifstream varchivo(nombreArchivo);
if(!varchivo) {
ofstream varchivo(nombreArchivo);
while(i<pVid->cnt) {
varchivo << pVid->lista[i].titulo << endl;
varchivo << pVid->lista[i].genero << endl;
varchivo << pVid->lista[i].anno << endl;
varchivo << pVid->lista[i].sipnosis << endl;
i++;
}
return true;
varchivo.close();
}
else {
if(overwrite) {
ofstream varchivo(nombreArchivo);
while(i<pVid->cnt) {
varchivo << pVid->lista[i].titulo << endl;
varchivo << pVid->lista[i].genero << endl;
varchivo << pVid->lista[i].anno << endl;
varchivo << pVid->lista[i].sipnosis << endl;
i++;
}
return true;
} else {
cout << "El archivo ya existe" << endl;
system("pause");
return false;
}
}
varchivo.close();
}
/******************************************** C A R G A R V I D E O T E C A ****************************************/
USHORT loadVideoteca(videoteca *pVid, const char *nombreArchivo) {
USHORT i=0;
iniciarVideoteca(pVid);
ifstream varchivo(nombreArchivo);
if(!varchivo) {
cout << "Error al abrir el archivo" << endl;
return 1;
}
while(!varchivo.eof()) {
varchivo.getline(pVid->lista[i].titulo, MAX_TITULO);
varchivo.getline(pVid->lista[i].genero, MAX_GENERO);
varchivo >> pVid->lista[i].anno;
varchivo.get();
varchivo.getline(pVid->lista[i].sipnosis, MAX_SIPNOSIS);
pVid->cnt++;
i++;
}
varchivo.close();
}
/********************************************** O R D E N A R V I D E O T E C A ************************************/
void ordenarVid(videoteca *pVid) {
pelicula temp;
USHORT ialfab;
for(USHORT i = 0; i<pVid->cnt; i++) {
for(USHORT i2 = 0; i2<pVid->cnt-2; i2++) {
if(strcmp(pVid->lista[i2].titulo, pVid->lista[i2+1].titulo) > 0) {
temp = pVid->lista[i2];
pVid->lista[i2] = pVid->lista[i2+1];
pVid->lista[i2+1] = temp;
}
}
}
}
/******************************************** I M P R I M I R V I D E O T E C A ************************************/
void imprimirVideoteca(const videoteca *pVid, const USHORT modo, pelicula *campoPeli) {
switch(modo) {
case 1:
for(USHORT i = 0; i<pVid->cnt; i++) {
cout << pVid->lista[i].titulo << endl;
cout << pVid->lista[i].genero << endl;
cout << pVid->lista[i].anno << endl;
cout << pVid->lista[i].sipnosis << endl;
cout << "----------------------------" << endl;
}
break;
case 2:
for(USHORT i = 0; i<pVid->cnt; i++) {
if(!strcmp(pVid->lista[i].genero, campoPeli->genero)) {
cout << pVid->lista[i].titulo << endl;
cout << pVid->lista[i].genero << endl;
cout << pVid->lista[i].anno << endl;
cout << pVid->lista[i].sipnosis << endl;
cout << "----------------------------" << endl;
}
}
break;
case 3:
for(USHORT i = 0; i<pVid->cnt; i++) {
if(pVid->lista[i].anno == campoPeli->anno) {
cout << pVid->lista[i].titulo << endl;
cout << pVid->lista[i].genero << endl;
cout << pVid->lista[i].anno << endl;
cout << pVid->lista[i].sipnosis << endl;
cout << "----------------------------" << endl;
}
}
break;
}
}
/********************************************** A Ñ A D I R P E L I C U L A *****************************************/
void AddPeli(videoteca *pVid, pelicula *pPeli) {
if(!VidLLena(pVid)) {
pVid->lista[pVid->cnt] = *pPeli;
pVid->cnt++;
}
}
/******************************************** B U S C A R P E L I C U L A S *****************************************/
USHORT BuscaPeli(USHORT *tmpList, videoteca *pVid, USHORT modoBusqueda, pelicula *CampoPeli) {
USHORT b = 0;
switch (modoBusqueda) {
case 1:
for(USHORT i=0; i<pVid->cnt; i++) {
if(!strcmp(pVid->lista[i].titulo, CampoPeli->titulo)) {
tmpList[b] = i;
b++;
}
}
break;
case 2:
for(USHORT i=0; i<pVid->cnt; i++) {
if(!strcmp(pVid->lista[i].genero, CampoPeli->genero)) {
tmpList[b] = i;
b++;
}
}
break;
case 3:
for(USHORT i=0; i<pVid->cnt; i++) {
if(pVid->lista[i].anno == CampoPeli->anno) {
tmpList[b] = i;
b++;
}
}
}
return b;
}
/*************************************** M O V E R P E L I C U L A **********************************************/
void moverPelis(videoteca *pVid, USHORT posPeli1, USHORT posPeli2) {
pelicula temp;
temp = pVid->lista[posPeli1];
pVid->lista[posPeli1] = pVid->lista[posPeli2];
pVid->lista[posPeli2] = temp;
}
/*************************************** E L I M I N A R P E L I C U L A *****************************************/
void borrarPeli(videoteca *pVid, const pelicula *pPeli, const USHORT opBorrar) {
switch (opBorrar) {
case 1:
for(USHORT i = 0; i<MAX_PELICULAS; i++) {
if(!strcmp(pVid->lista[i].titulo, pPeli->titulo)) {
iniciarPelicula(&pVid->lista[i]);
moverPelis(pVid, i, pVid->cnt);
pVid->cnt--;
}
}
break;
case 2:
for(USHORT i = 0; i<MAX_PELICULAS; i++) {
if(!strcmp(pVid->lista[i].genero, pPeli->genero)) {
iniciarPelicula(&pVid->lista[i]);
moverPelis(pVid, i, pVid->cnt);
pVid->cnt--;
}
}
break;
case 3:
for(USHORT i = 0; i<MAX_PELICULAS; i++) {
if(pVid->lista[i].anno == pPeli->anno) {
iniciarPelicula(&pVid->lista[i]);
moverPelis(pVid, i, pVid->cnt);
pVid->cnt--;
}
}
break;
}
}
/*************************************** I M P R I M I R R E S U L T A D O S ******************************************/
void imprimirResultados(const videoteca *pVid, USHORT *listaResultados, USHORT resultados) {
for(USHORT i=0;i<resultados;i++) {
cout << resultados << " Resultados encontrados en " << pVid->cnt << " Peliculas totales." << endl;
cout << pVid->lista[listaResultados[i]].titulo << endl;
cout << pVid->lista[listaResultados[i]].genero << endl;
cout << pVid->lista[listaResultados[i]].anno << endl;
cout << pVid->lista[listaResultados[i]].sipnosis << endl;
system("pause");
}
}
/********************************************** C O M P R O B A C I O N E S *********************************************/
bool VidLLena(const videoteca *pVid) {
return pVid->cnt == MAX_PELICULAS;
}
bool VidVacia(const videoteca *pVid) {
return pVid->cnt == 0;
}
int salir() {
return 0;
}