C/Visual C - Ayuda estructuras

 
Vista:
sin imagen de perfil

Ayuda estructuras

Publicado por Victor (17 intervenciones) el 02/09/2016 18:57:29
Hola buenas, quisiera que me ayudaseis en este ejercicio. El programa despues de almacenar los datos de varias personas, te da la opcion de seguir añadiendo o de buscar a una persona por su DNI.Al buscar a la persona mediante el DNI la funcion te tiene que devolver la edad de la persona asociada a ese DNI, mi problema es que introduzco dos DNI's exactamente iguales, y me dice que no coinciden, y yo creo que es al pasar la variable dni como parametro de la funcion, y no se como resolverlo. El programa tiene un fallo muy evidente y es que si le das a buscar una persona sin antes haber almacenado personas, el programa no te suelta ningun fallo, pero bueno, no vengo por ese error, vengo por el problema mencionado anteriormente.

PD: si pones *dni al comparar los strings con strcmp te salta error :(

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
//Ejercicio 26
 
 
#include <stdio.h>
#include <string.h>
 
typedef struct{
 
	char DNI[10];
	char nombre[50];
	char apellidos[50];
	int edad;
	int lleno;
 
}personas;
 
personas person[20];
 
void vacio();
void anadepersonas();
int busca_persona(personas x[],char *dni);
void cambio(char palabra[]);
 
 
int main(){
 
	int op, aux;
	char dni[10], key;
 
	vacio();
 
  do{
 
 
	do{
 
		printf("Elige que deseas hacer: \n");
		printf("(1) Almacenar personas.\n");
		printf("(2) Buscar persona.\n");
		printf("\nSeleccione opcion: ");
		scanf("%i",&op);
 
		switch (op){
 
			case 1:
				anadepersonas();
				break;
 
			case 2:
				printf("Introduce el DNI: ");
				fflush(stdin);
				fgets(dni, 10, stdin);
				cambio(dni);
 
				aux = busca_persona(person, dni);
				if(aux == 1){
					printf("El DNI introducido no coincide con ninguna persona.\n");
				}
				else {
					printf("La edad de la persona es %i",aux);
				}
 
				break;
 
		}
 
	}while( op < 1 || op > 2);
 
	printf("Desea realizar alguna operacion mas? (S/N): ");
	fflush(stdin);
	scanf("%c",&key);
 
	}while(key == 'S' || key == 's');
 
	system("pause");
	return 0;
}
 
void vacio(){
 
	int i;
 
	for(i = 0; i < 20; i++){
		person[i].lleno = 0;
	}
 
}
 
void anadepersonas(){
 
	int i, j, aux;
 
	aux = 0;
 
	for(i = 0; i < 20 && aux == 0; i++){
		for(j = 0; j < 50 && aux == 0; j++){
			if(person[i].lleno == 0){
 
				printf("Introduce el nombre: ");
				fflush(stdin);
				fgets(person[i].nombre, 50, stdin);
				printf("Introduce los apellidos: ");
				fflush(stdin);
				fgets(person[i].apellidos, 50, stdin);
				printf("Introduce la edad: ");
				scanf("%i",&person[i].edad);
				printf("Introduce el DNI: ");
				fflush(stdin);
				fgets(person[i].DNI, 10, stdin);
				cambio(person[i].DNI);
 
				person[i].lleno = 1;
				aux = 1;
			}
		}
	}
	if(aux == 0){
		printf("No queda hueco para almacenar mas personas.\n");
	}
 
}
 
int busca_persona(personas x[],char *dni){
 
	int i, j, aux, edad, temp;
 
	aux = 1;
	temp = 0;
 
	for(i = 0; i < 20 && temp == 0; i++){
		if(x[i].lleno == 1){
		aux = strcmp(dni, x[i].DNI);
		if(aux == 0){
			edad = x[i].edad;
		}
		else{
			edad = 1;
			}
		}
		else{
			printf("No hay personas almacenadas.\n");
			temp = 1;
		}
	}
 
	return edad;
}
 
void cambio(char palabra[]){
 
	int i;
 
	for(i = 0; i < 50; i++){
		if(palabra[i] == '\n'){
			palabra[i] = '\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
sin imagen de perfil

Ayuda estructuras

Publicado por Diego (150 intervenciones) el 02/09/2016 20:06:14
BUenas tardes, fijate cómo es que queda preparada la siguiente lectura del stdin luego de usar el scanf en el menú prinicpal. Ya que cuando lo ejecuté no me dejó ingresar el nombre, pasó directamente al apellido.
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

Ayuda estructuras

Publicado por Victor (17 intervenciones) el 02/09/2016 20:24:11
como? no te entiendo bien lo que quieres decir, yo cuando ejecuto el programa si me deja ingresar el nombre :/
El problema está en que si depuras el programa y miras la variable dni, cuando la pasas como parametro a la funcion, toma el siguiente valor a pesar de ser un puntero: dni = 0x23fe30"02335467N", es decir pone la direccion de memoria y seguidamente, entre comillas, lo que introduje por teclado, que es el DNI. NO se porque me pone la direccion de memoria delante cuando lo he puesto como puntero...
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

Ayuda estructuras

Publicado por Diego (150 intervenciones) el 02/09/2016 21:06:38
probá pasando la dirección de dni ; &dni y en la función indicá que es un puintero a una cadena char **.
COn esto debería tomarte correctamente el parametro dni. Yo compilo en linux, con gcc; pero viendo bien, debo haber apretado rapidamente y por eso no me tomó el nombre. O puede que me reemplazara mal un fflush. Luego me fijo bien.
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

Ayuda estructuras

Publicado por Victor (17 intervenciones) el 02/09/2016 21:13:03
Nada, me da errores al compilarlo. Es que a ver el aspersan & no hace falta ponerlo ya que al ser un array de caracteres, los arrays siempre se pasan por referencia, y lo del doble puntero no lo entiendo mucho, pero vamos que no funciona
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

Ayuda estructuras

Publicado por dario (13 intervenciones) el 03/09/2016 15:48:50
Tu mismo codigo un poco arreglado

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
#include <stdio.h>
#include <string.h>
 
typedef struct{
	char DNI[10];
	char nombre[50];
	char apellidos[50];
	int edad;
	int lleno;
}personas;
 
personas person[20];
 
void vacio();
void anadepersonas();
int busca_persona(personas x[],char *dni);
void cambio(char palabra[]);
 
int main(){
	int op, aux;
	char dni[10], key;
	vacio();
 
	do{
		do{
			printf("Elige que deseas hacer: \n");
			printf("(1) Almacenar personas.\n");
			printf("(2) Buscar persona.\n");
			printf("\nSeleccione opcion: ");
			scanf("%i",&op);
			getchar();
 
			switch (op){
				case 1:
					anadepersonas();
					break;
				case 2:
					printf("Introduce el DNI: ");
					//fflush(stdin);
					fgets(dni, 10, stdin);
					cambio(dni);
					aux = busca_persona(person, dni);
					if(aux == 1){
						printf("El DNI introducido no coincide con ninguna persona.\n");
					}
					else {
						printf("La edad de la persona es %i\n",aux);
					}
					break;
			}
		}while( op < 1 || op > 2);
		printf("Desea realizar alguna operacion mas? (S/N): ");
		//fflush(stdin);
		scanf("%c",&key);
	}while(key == 'S' || key == 's');
	//system("pause");
	return 0;
}
 
void vacio(){
	int i;
 
	for(i = 0; i < 20; i++){
		person[i].lleno = 0;
	}
}
 
void anadepersonas(){
 
	int i, j, aux;
	aux = 0;
 
	for(i = 0; i < 20 && aux == 0; i++){
		for(j = 0; j < 50 && aux == 0; j++){
			if(person[i].lleno == 0){
				printf("Introduce el nombre: ");
				//fflush(stdin);
				fgets(person[i].nombre, 50, stdin);
				printf("Introduce los apellidos: ");
				fflush(stdin);
				fgets(person[i].apellidos, 50, stdin);
				printf("Introduce la edad: ");
				scanf("%i",&person[i].edad);
				getchar();
				printf("Introduce el DNI: ");
				//fflush(stdin);
				fgets(person[i].DNI, 10, stdin);
				cambio(person[i].DNI);
				person[i].lleno = 1;
				aux = 1;
			}
		}
	}
 
	if(aux == 0){
		printf("No queda hueco para almacenar mas personas.\n");
	}
}
 
int busca_persona(personas x[],char *dni){
	int i, j, aux, edad, temp;
	aux = 1;
	temp = 0;
 
	for(i = 0; i < 20 && temp == 0; i++){
		if(x[i].lleno == 1){
			aux = strcmp(dni, x[i].DNI);
			if(aux == 0){
				edad = x[i].edad;
			}
			else{
				edad = 1;
			}
		}
		else {
			printf("No hay personas almacenadas.\n");
			temp = 1;
		}
	}
 
	return edad;
}
 
void cambio(char palabra[]){
	int i;
 
	for(i = 0; i < 50; i++){
		if(palabra[i] == '\n'){
			palabra[i] = '\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

Ayuda estructuras

Publicado por Victor (17 intervenciones) el 04/09/2016 18:46:03
He compilado tu modificacion, y tiene fallos por quitar los fflush,en plan, cuando termino de almacenar una persona con tu modificacion no me deja realizar ninguna operacion mas, y eso es por comentar el fflush que tenia, y no resuelve el error que inicialmente puse :(
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