Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: MiguelSanchez1703 en 31 Octubre 2016, 09:57 AM

Título: Problema organizando libros
Publicado por: MiguelSanchez1703 en 31 Octubre 2016, 09:57 AM
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 ();
}
}
Título: Re: Alguien me puede ayudar con este codigo
Publicado por: MAFUS en 31 Octubre 2016, 10:37 AM
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.
Título: Re: Alguien me puede ayudar con este codigo
Publicado por: MiguelSanchez1703 en 31 Octubre 2016, 10:40 AM
Podria usted pasarme la correcion del codigo inicial, le agradezco su ayuda
Título: Re: Alguien me puede ayudar con este codigo
Publicado por: MAFUS en 31 Octubre 2016, 14:45 PM
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.
Título: Re: Alguien me puede ayudar con este codigo
Publicado por: MiguelSanchez1703 en 31 Octubre 2016, 15:47 PM
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
Título: Re: Alguien me puede ayudar con este codigo
Publicado por: engel lex en 1 Noviembre 2016, 00:20 AM
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
Título: Re: Problema organizando libros
Publicado por: MAFUS en 1 Noviembre 2016, 11:42 AM
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.