Problema organizando libros

Iniciado por MiguelSanchez1703, 31 Octubre 2016, 09:57 AM

0 Miembros y 1 Visitante están viendo este tema.

MiguelSanchez1703

Buenos dias, me ha surgido un problema creando una base de datos para libro, cuando ejecuto el vois MostrarTodos (en el dash me escribe 3 palabras y crea una nueva linea, mientras que yo quiero que me imprima una linea por libro) el código es este:

Código (cpp) [Seleccionar]
#include <iostream>
#include <string>
#include <fstream>
#include <cstdio>
#include <stdio.h>
#include <vector>

using namespace std;

void entrada ();
void buscarTitulo ();
void buscarAutor ();
void buscarEditorial ();
void buscarTomo ();
void buscarColeccion ();
void salir ();
void mostrarTodos ();
void buscar ();
void borrarLibro ();
void editarLibro ();

int main () {
system ("title Libros");
system ("cls");
system ("color 0F");
int eleccion;
cout << "1.Introducir un nuevo libro" << endl;
cout << "2.Buscar un libro" << endl;
cout << "3.Limpiar base de datos" << endl;
cout << "4.Editar un libro" << endl;
cout << "5.Salir" << endl;
cin >> eleccion;
switch (eleccion) {
case 1:
entrada();
break;
case 2:
buscar();
break;
case 3:
borrarLibro();
break;
case 4:
editarLibro();
break;
case 5:
salir();
break;

cin.get();
}
}

void editarLibro () {
char titulo [100];
char nuevoTitulo [100];
char autor [100];
char nuevoAutor [100];
char editorial [50];
char nuevoEditorial [50];
char coleccion [200];
char nuevaColeccion [200];
int tomo;
int nuevoTomo;
string entrada;
char decision;
ifstream RegistroLibros("Nuevo libro.txt");
if (!RegistroLibros.eof()) {
RegistroLibros >> titulo >> autor >> editorial >> coleccion >> tomo;
}
system ("cls");

cout << "Introduzca el titulo del libro: ";
cin >> entrada;

if (entrada == titulo) {
cout << titulo << ' ' << autor << ' ' << editorial << endl;
cout << "Es este el libro correcto S/N:";
cin >> decision;
if (decision == 'S' or decision == 's') {
cout << "Introduzca el nuevo titulo: ";
cin >> nuevoTitulo;
nuevoTitulo == titulo;
cout << "\nIntroduzca el nuevo autor: ";
cin >> nuevoAutor;
autor == nuevoAutor;
cout << "\nIntroduzca el nuevo editorial: ";
cin >> nuevoEditorial;
editorial == nuevoEditorial;
cout << "\nIntroduzca la nueva coleccion: ";
cin >> coleccion;
coleccion == nuevaColeccion;
cout << "\nIntroduzca el nuevo tomo: ";
cin >> tomo;
tomo == nuevoTomo;
}
RegistroLibros.close();
}
ofstream RegistroLibros2 ("NuevoLibro.txt", ios::app);
RegistroLibros2 << titulo << ' ' << autor << ' ' << editorial << ' ' << coleccion << ' ' << tomo << endl;
RegistroLibros2.close();
system ("pause");
main ();
}

void entrada () {
char titulo[100];
char autor[100];
char editorial[50];
char coleccion [200];
int tomo;
char decision;

ofstream NuevoLibro ("Nuevo Libro.txt", ios::app);
system ("cls");
cin.sync();
cout << "Introduzca el titulo del libro" << endl;
gets (titulo);
system ("cls");
cout << "Introduzca el autor del libro" << endl;
gets (autor);
system ("cls");
cout << "Introduzca la editorial del libro" << endl;
gets (editorial);
system ("cls");

cout << "Tiene coleccion S/N: ";
cin >> decision;
if (decision == 'S' or decision == 's'){
cout << "Introduzca el nombre de la coleccion" << endl;
gets (coleccion);
system ("cls");
cout << "Introsuzca el tomo de la coleccion" << endl;
cin >> tomo;

NuevoLibro << titulo << ' ' << autor << ' ' << editorial << ' ' << coleccion << ' ' << tomo << endl;
NuevoLibro.close();
main ();
}else{
NuevoLibro << titulo << ' ' << autor << ' ' << editorial << endl;
NuevoLibro.close();
main ();
}


}

void buscarTitulo () {
ifstream RegistroLibros ("Nuevo Libro.txt");
char titulo [100];
char autor [100];
char editorial [50];
char coleccion [200];
int tomo;
char btitulo [100];
system("CLS");
cout << "Introduzca el titulo del libro: ";
gets (btitulo);

while (RegistroLibros >> titulo >> autor >> editorial >> coleccion >> tomo) {
if (btitulo == titulo) {
system ("CLS");
cout << "Libro(s) encontrado" << endl;
cout << "------------------------------\n";
cout << titulo << " " << autor << " " << editorial << " " << coleccion << " " << tomo << endl;;
}
}

while (RegistroLibros >> titulo) {
if (btitulo != titulo) {
system ("CLS");
cout << "No hay libros con ese nombre" << endl;
}
}

system ("pause");
main ();
}

void buscarAutor() {
ifstream RegistroLibros ("Nuevo Libro.txt");
char titulo [100];
char autor [100];
char editorial [50];
char coleccion [200];
int tomo;
char bautor [100];
system ("CLS");
cout << "Introduzca el autor del libro: ";
gets (bautor);

while (RegistroLibros >> titulo >> autor >> editorial >> coleccion >> tomo) {
if (bautor == autor) {
system ("CLS");
cout << "Libro(s) encontrado" << endl;
cout << "------------------------------\n";
cout << titulo << " " << autor << " " << editorial << " " << coleccion << " " << tomo << endl;
}
}

while (RegistroLibros >> autor) {
if (bautor != autor) {
system ("CLS");
cout << "No hay libros de ese autor" << endl;
}
}

system ("pause");
cin.get();
main ();
}

void buscarEditorial() {
ifstream RegistroLibros ("Nuevo Libro.txt");
char titulo [100];
char autor [100];
char editorial [50];
char coleccion [200];
int tomo;
char beditorial [50];
system ("CLS");
cout << "Introduzca un editorial: ";
gets (beditorial);

while (RegistroLibros >> titulo >> autor >> editorial >> coleccion >> tomo) {
if (beditorial == editorial) {
system ("cls");
cout << "Libro(s) encontrado" << endl;
cout << "------------------------------\n";
cout << titulo << " " << autor << " " << editorial << " " << coleccion << " " << tomo << " " << endl;
}
}

while (RegistroLibros >> editorial) {
if (beditorial != editorial) {
system ("CLS");
cout << "No hay libros de esa editorial" << endl;
}
}

system ("pause");
cin.get();
main ();
}

void buscarColeccion () {
ifstream RegistroLibros ("Nuevo Libro.txt");
char titulo [100];
char autor [100];
char editorial [50];
char coleccion [200];
int tomo;
char bcoleccion [200];
system ("CLS");
cout << "Introduzca una coleccion: ";
gets (bcoleccion);

while (RegistroLibros >> titulo >> autor >> editorial >> coleccion >> tomo) {
if (bcoleccion == coleccion) {
system ("cls");
cout << "Libro(s) encontrado" << endl;
cout << "------------------------------\n";
cout << titulo << " " << autor << " " << editorial << " " << coleccion << " " << tomo << " " << endl;
}
}
while (RegistroLibros >> coleccion) {
if (bcoleccion != coleccion) {
system ("CLS");
cout << "No hay libros de esa coleccion" << endl;
}
}

system ("pause");
cin.get();
main ();
}

void buscarTomo () {
ifstream RegistroLibros ("Nuevo Libro.txt");
char titulo [100];
char autor [100];
char editorial [50];
char coleccion [200];
int tomo;
int btomo;
system ("CLS");
cout << "Introduzca un tomo: ";
cin >> btomo;

while (RegistroLibros >> titulo >> autor >> editorial >> coleccion >> tomo) {
if (btomo == tomo) {
system ("cls");
cout << "Libro(s) encontrado" << endl;
cout << "------------------------------\n";
cout << titulo << " " << autor << " " << editorial << " " << coleccion << " " << tomo << " " << endl;
}
}
while (RegistroLibros >> tomo) {
if (btomo != tomo) {
system ("CLS");
cout << "No hay libros con ese numero de tomo" << endl;
}
}

system ("pause");
cin.get();
main ();
}

void salir () {
system ("CLS");
cout << ("Gracias por usar esta base de datos");
system ("pause");
cin.get();
}

void mostrarTodos() {
ifstream RegistroLibro ("Nuevo Libro.txt");
char titulo [100];
char autor [100];
char editorial [50];
char coleccion [200];
int tomo;
system ("cls");
cout << "Todos los libros\n";
cout << "-------------------------------------\n";

while (RegistroLibro >> titulo >> autor >> editorial) {
system ("cls");
cout << titulo << " " << autor << " " << editorial << " " << coleccion << " " << tomo << endl;
}

system ("pause");
cin.get();
main ();
}

void buscar () {
char titulo [100];
char autor [100];
char editorial [50];
char coleccion [200];
int tomo;
int eleccion2;
system ("CLS");

cout << "1.Buscar por titulo" << endl;
cout << "2.Buscar por autor" << endl;
cout << "3.Buscar por editorial" << endl;
cout << "4.Buscar por coleccion" << endl;
cout << "5.Buscar por tomo" << endl;
cout << "6.Todos los libros" << endl;
cout << "7.Atras" << endl;
cout << "8.Salir" << endl;
cin >> eleccion2;

switch (eleccion2) {
case 1:
buscarTitulo ();
break;
case 2:
buscarAutor ();
break;
case 3:
buscarEditorial ();
break;
case 4:
buscarColeccion ();
break;
case 5:
buscarTomo ();
break;
case 6:
mostrarTodos ();
break;
case 7:
main ();
break;
case 8:
salir ();
break;
}
}

void borrarLibro () {
char decision;
cout << "Estas seguro? S/N" << endl;
cin >> decision;
if (decision == 'S' or decision == 's') {
ofstream RegistroLibros ("Nuevo Libro.txt");
system ("cls");
cout << "Accion realizada con exito" << endl;
system ("pause");
RegistroLibros.close();
main ();
}else{
main ();
}
}

MAFUS

Viéndolo así, por encima:
Usas gets para capturar las cadenas de las variables de tus libros. Esta función captura el caracter  de nueva línea y te puede dar resultados indeseados cuando la imprimas. Aparte de otros problemas intrínsecos de la función.

Veo que al final de las funciones llamas explícitamente a main. Muy mala práctica porque fada vez vas llenando más y más la pila de la memoria. Las funciones deben volver de forma natural y en main, o quien controle el programa, debe tener un bucle que haga que todo se repita hasta que el usuario quiera salir.

MiguelSanchez1703

Podria usted pasarme la correcion del codigo inicial, le agradezco su ayuda

MAFUS

En cuanto tenga una máquina delante para teclear código te voy a hacer unos ejemplos. No voy a corregirte todo el código ya que supongo esti es un trabajo escolar tuyo.

MiguelSanchez1703

#4
No es ningun trabajo escolar, ya que yo ya me gradue, simplemente he creado este codigo para tener todos mis libros en una base de datos, Gracias

engel lex

en dado caso para dicha tarea es infinitamente más util usar un sistema ya con ese fin como puede ser SQL... con sqlite para C puedes hacerlo con peticiones simples

Titulo modificado, el mimo debe ser descriptivo a la temática
El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.

MAFUS

Acabo de revisar tu código y tienes una cantidad bastante grande de fallos con el trabajo de las cadenas.

Por ejemplo:
Línea 76:
Código (c++) [Seleccionar]
if (entrada == titulo)
Así no se compara el contenido de dos cadenas tipo C (array de caracteres), lo que haces es comprobar si los dos direcciones de inicio de sendas cadenas son iguales. Para comparar deberías haber usado strcmp o strncmp.

No muy lejos de allí, línea 83:
Código (c++) [Seleccionar]
nuevoTitulo == titulo;
Después de capturar una cadena con cin y dejarla en nuevoTitulo querías pasársela a la variable titulo. En es línea has cometido tres errores.
1. El operador de asignación es '=', un sólo símbolo de igualdad.
2. El operando que recibe el valor se sitúa a la izquierda, a la derecha va el que entrega el dato.
3. Los dos operandos son cadenas C por tanto no se puede usar la igualdad sino el strcpy o strncpy.

Después está lo de gets y lo de main, como te había dicho. Ahora tienes trabajo para corregir.