Dev - C++ - error en la lectura de dato por teclado tipo int

 
Vista:
Imágen de perfil de Juan Jose
Val: 2
Ha disminuido su posición en 104 puestos en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

error en la lectura de dato por teclado tipo int

Publicado por Juan Jose (2 intervenciones) el 07/06/2020 14:18:54
Hola Buenas :

he creado un programa que mediante un menu, va leyendo por pantalla datos, ( String, int y float)

todo correcto hasta que tiene que leer los datos de tipo int , años de experiencia , que a la hora de mostrarlos por pantalla , la variable esta vacia.

este es el codigo

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
#include <stdio.h>
 
//A continuación definimos con la orden typedeft, los tipos de datos texto20 y texto50.
 
typedef char texto25[25];
typedef char texto30[30];
 
 
//Ahora los prototipos:
 
char menu(void);
 
void datos_variedad(texto30 nom,texto25 comercializador,int exp,float *precio);
 
void modif_nombre(texto30 nom); //Para modificar el nombre de la variedad.
void modif_comercializador(texto25 comercializador); //Para modificar el nombre del comercializador
void modif_experiencia(int exp); //Para modificar los años de experiencia en uso.
void calculo_paquetes(void); //Para calcular el número de paquetes de semillas.
void precio(float precio);
void imprime(texto30 nom,texto25 comercializador,int exp,float precio);
 
/*Función que se limita a escribir por pantalla los valores de sus parámetros de E. Por tanto,
como son de E, no necesitan que sus nombres empiecen por *.Tampoco contienen return, pues no
devuelven nada al controlador.*/
 
int main(void)
{
	//Declaración de variables:
	texto25 nombre_comercializador;
	texto30 nombre_variedad;
	int control_datos=0; //Variable para controlar si ya hemmos hecho la lectura de datos.
	int exp;
	char opcion;
	float precio;
 
 
 
	do
	{
		opcion=menu();
		switch(opcion)
		{
		//Si la controladora de swicht es de tipo char, los casos van entre''(ctes char).
		case 'a': datos_variedad(nombre_variedad,nombre_comercializador,exp,&precio);
			control_datos=1;
		//Al inicio, control_datos vale 0; solo cambia a 1 aquí, en el caso de leer los datos.
		break;
 
		case 'b': if(control_datos==1)
			modif_comercializador(nombre_comercializador);
 
		else
			printf("\nNo se puede modificar porque no se han introducido los datos");
		break;
 
		case 'c': if(control_datos==1)
			modif_experiencia(exp);
 
		else
			printf("\nNo se puede modificar porque no se han introducido los datos");
		break;
 
		case'd': if(control_datos==1)
			calculo_paquetes();
		else
			printf("\nNo se puede modificar porque no se han introducido los datos");
		break;
		case 'e': if (control_datos==1)
			imprime(nombre_variedad,nombre_comercializador,exp,precio);
		else
			printf("\nNo se puede mostrar los datos pues no se han introducido.");
		break;
		case 'f':printf("\nFin del programa");
			system("PAUSE");
			break;
		default: printf("\nOpción incorrecta");
 
		} //Fin función switch.
	} while (opcion !='f'); //Fin función do...while.
} //Fin función main.
 
//Dfinición completa de funciones:
 
char menu(void)
{
	char opcion;
	printf("\n\n");
	printf("\nPulsa a para leer los datos de la variedad.");
	printf("\nPulsa b para modificar el comercializador.");
	printf("\nPulsa c para modificar los anos de experiencia.");
	printf("\nPulsa d para calcular el numero de paquetes de semillas que necesita.");
	printf("\nPulsa e para mostrar los datos de la variedad vegetal.");
	printf("\nPulsa f para finalizar el programa.\n\n");
	scanf("%c",&opcion);//Lectura de una variable tipo char.
	fflush(stdin); //Limpieza de buffer después de scanf.
	return(opcion);  //Devuelve un char.
 
}
 
void datos_variedad(texto30 nom,texto25 comercializador,int exp,float *precio)
{
	//Nótese el uso fflush(stdin).
 
	printf("\n\n");
	printf("Dame el nombre de la variedad:");
	gets(nom); //Lectura que no se para cuando hay un espacio en la cadena.
	fflush(stdin);
	printf("Dame el nombre del comercializador:");
	gets(comercializador);
	fflush(stdin);
	printf("Dame el numero de anos de experiencia:");
	scanf("%d",&exp);
	fflush(stdin);
	printf("Dame el precio de un paquete de semillas:");
	scanf("%f",&(*precio));
	fflush(stdin);
 
}
 
void modif_comercializador(texto25 comercializador)
{
	printf("\nVa a combiar de comercializador %s\n\n",comercializador); //Camiar nombre antiguo.
	printf("Dame el nuevo nombre:");
	gets(comercializador); //Parámetro de E/S, cambia al volver a leerlo.
	fflush(stdin); //Limpieza de buffer después de gets.
}
 
void modif_experiencia(int exp)
{
	printf("\nLos anos de experiencian eran: %d",exp);
	printf("\nDame los anos de experiencia nuevos:");
	scanf("%d",&exp);
	fflush(stdin);
}
 
void calculo_paquetes(void)
{
	int superficie,numpaquetes;
	printf("Dame la superficie a plantar:");
	scanf("%d",&superficie);
	fflush(stdin);
	if (superficie%15==0)
		numpaquetes=superficie/15;
	else
		numpaquetes=superficie/15+ 1;
	printf("\nNecesita %d paquetes de semillas",numpaquetes);
}
 
void precio(float precio)
{
	printf("\nDame el precio de un paquete de semillas:");
	scanf("%f",&precio);
	fflush(stdin);
}
void imprime(texto30 nom,texto25 comercializador,int exp,float precio)
		//Parámetros formales de E, sin *
{
 
	printf("\n\n");
	printf("\nEl numbre de la variedad es: %s",nom);
	printf("\nEl nombre del comercializador es: %s",comercializador);
	printf("\nLos anos de experiencia son: %d",exp);
	printf("\nEl precio de un paquete de semillas es:%f \n\n",precio);
	system("PAUSE");
	//No hay return.
}


que puedo estar haciendo mal, gracias y espero vuestra respuesta.
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