Dev - C++ - ¡Ayuda con un programa sencillo y simple! - Universidad.

 
Vista:
sin imagen de perfil
Val: 6
Ha aumentado su posición en 16 puestos en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

¡Ayuda con un programa sencillo y simple! - Universidad.

Publicado por Manuel (4 intervenciones) el 05/10/2017 02:25:23
¡Hola compañeros! Espero puedan ayudarme con un código de un ejercicio simple que me dieron en la Universidad. Podría pasar de él y hacer otro pero no quiero quedarme con la duda del por qué.

El ejercicio dice así: "Realizar un algoritmo que almacene información de libros en un arreglo estático. Un libro se define como un
struct con los siguientes campos: nombreLibro, editorial, cantidadHojas. El algoritmo finaliza luego
de cargar el libro "El hobbit", el cual debe procesarse
."

El problema surge cuando ejecuto el programa, luego de pedirme por primera vez el nombre del libro, al finalizar el bucle y comenzar de nuevo, saltea el nombre y me pide el autor. No logro darme cuenta por qué, tal vez sea un tonto pero hace dos horas que lo estoy mirando y no me doy cuenta.
Agradecería si me dan una mano. ¡Muchas gracias!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include<iostream>
#include<conio.h>
using namespace std;
 
 
 
int main(){
 
	struct libros{
		char nombrelibro [35];
		char autor [35];
		char editorial [30];
		int cantidadhojas;
 
 
	}libro[20];
 
 
	int i=0;
	do{
		for(i=0;i<=20;i++){
 
			cout<<"Nombre de libro: ";
			cin.getline(libro[i].nombrelibro,35,'\n');
 
			cout<<"\nAutor: ";
			cin.getline(libro[i].autor,35,'\n');
 
			cout<<"\nEditorial: ";
			cin.getline(libro[i].editorial,30,'\n');
 
			cout<<"\nCantidad de hojas: ";
			cin>>libro[i].cantidadhojas;
			cout<<endl;
		}
 
	}
	while((libro[i].nombrelibro != "El hobbit") || (libro[i].nombrelibro != "El Hobbit") || (libro[i].nombrelibro != "El hobbit.") || (libro[i].nombrelibro!="El Hobbit."));
 
 
 
	cout<<"La información de libro es: "<<libro<<endl;
 
	getch();
	return 0;
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Dionicio
Val: 163
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

re:¡Ayuda con un programa sencillo y simple! - Universidad.

Publicado por Dionicio (57 intervenciones) el 05/10/2017 04:48:56
En el buffer hay lo que se conoce como basura, es decir cuando va a ejecutarse por segunda vez hay un carácter que getline toma y pasa a la siguiente instrucción. Hay un método usado para limpiar el buffer de la entrada estándar, es decir, el teclado.

De paso digo que me di la tarea de eliminar y añadir unas pequeñas modificaciones que espero no te importen mucho.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
#include <iostream>
#include <cstring>//para strcasecmp
 
using namespace std;
 
int main(){
 
	struct libros{
		char nombrelibro [35];
		char autor [35];
		char editorial [30];
		int cantidadhojas;
 
 
	}libro[20];
 
	bool esElHobbit;//Nos dirá si se escribió el hobbit
 
	int i=0;
	do{
 
 
		cout<<"Nombre de libro: ";
		cin.getline(libro[i].nombrelibro,35,'\n');
 
		cout<<"\nAutor: ";
		cin.getline(libro[i].autor,35,'\n');
 
		cout<<"\nEditorial: ";
		cin.getline(libro[i].editorial,30,'\n');
 
		cout<<"\nCantidad de hojas: ";
		cin>>libro[i].cantidadhojas;
		cout<<endl;
 
					//Uso de la libreria cstring que usa la funcion strcasecmp para comparar sin importar 
					//el caso de la palabra sea minúscula o mayúscula
		esElHobbit = strcasecmp(libro[i].nombrelibro,"El hobbit") == 0;
 
		i++;
 
		//Puedes usar el método cin.ignore() que elimina de la entra estándar la "basura" que contiene
		cin.ignore();
		//Tambien puedes usar el método pasándole la cantidad de carácteres que serán borrados y hasta donde termina
		//cin.ignore(200,'\n');
 
 
		//Se lee como 
		//mientras no es el hobbit y i es menor que dos seguir iterando
 
	}while(!esElHobbit && i < 2);
 
	cout<<"La información de libro es: "<<libro<<endl;
 
	return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 203
Bronce
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

¡Ayuda con un programa sencillo y simple! - Universidad.

Publicado por dario (107 intervenciones) el 07/10/2017 10:26:26
Otra solucion

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include<iostream>
 
using namespace std;
 
int main() {
    int j,i=-1;
 
    struct libros {
        string nombrelibro;
		string autor;
		string editorial;
		int cantidadhojas;
	} libro[20];
 
 
    do {
        i++;
        cout << "Nombre de libro: ";
		getline(cin,libro[i].nombrelibro);
		cout << "\nAutor: ";
		getline(cin,libro[i].autor);
		cout << "\nEditorial: ";
		getline(cin,libro[i].editorial);
		cout << "\nCantidad de hojas: ";
		cin >> libro[i].cantidadhojas;
        cout << endl;
        cin.get();
    } while(libro[i].nombrelibro != "El hobbit");
 
    cout << "Listado de lbros" << endl << endl;
 
    for (j=0; j<1; j++) {
        cout << libro[j].nombrelibro << endl;
        cout << libro[j].autor << endl;
        cout << libro[j].editorial << endl;
        cout << libro[j].cantidadhojas << endl;
    }
 
    return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar