Dev - C++ - Ayuda a como limpiar datos en este codigo

 
Vista:
sin imagen de perfil

Ayuda a como limpiar datos en este codigo

Publicado por Javier (5 intervenciones) el 06/02/2015 22:52:18
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
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
#include <iostream>
#include <windows.h>
#include <string.h>
#include <conio.h>
#include <stdio.h>
 
using namespace std;
 
struct info_empleado
{
    char comien [15];
    char ocup [15] ;
    char hora_en [15];
    char hora_sa[15];
    char rang [15];
    char dir_trab [15];
 
};
typedef struct info_empleado infodir;
 
 
struct datos_empleado
{
	int ide;
	char nombre [7];
	int edad;
	char fechanac [10];
	char tel[8];
	infodir dir;
 
} empleado[2];
 
 
main()
{
	cout<<endl;
	cout<<"EMPRESA J.M.R SA "<<endl;
	cout<<"En este menu sabras la ubicacion del empleado en la empresa con sus datos personales"<<endl;
 
	int opc ;
	int codcons;
	int resp;
	int resp2=9;
	int i, j;
	do{
 
 
    cout<<endl;
	cout<<"1.Ingrese los datos"<<endl;
	cout<<"2.Consultar datos "<<endl;
	cout<<"3. Modificar datos "<<endl;
	cout<<"4. Limpiar "<<endl;
	cout<<"5. MOSTRAR "<<endl;
	cout<<"6. Salir "<<endl;
	cout<<"Ingrese su opcion"<<endl;
	cin>>opc;
 
	 	switch(opc)
	{
	     case 1:
 
				for(i=0;i<2;i++) /* i<2 para probar el programa */
				{
 
				  system("cls");
				  cout<<"Empleado "<<i+1<<endl;
		          cout<<"Ingrese el codigo de empleado "<<endl;
		          cin>>empleado[i].ide;
		cout<<"Ingrese el Nombre de empleado "<<endl;
		cin>>empleado[i].nombre;
		cout<<"Ingrese la edad de empleado "<<endl;
		cin>>empleado[i].edad;
		cout<<"Ingrese la fecha de Naciiento del empleado "<<endl;
		cin>>empleado[i].fechanac;
		cout<<"Ingrese el telefono de empleado "<<endl;
		cin>>empleado[i].tel;
		cout<<" DATOS EN LA EMPRESA DEL EMPLEADO "<<endl;
		cout<<"Comienzo de contrato del empleado  "<<endl;
		cin>>empleado[i].dir.comien;
		cout<<" Inserte el puesto que ocupa el empleado "<<endl;
		cin>>empleado[i].dir.ocup;
		cout<<" Inserte la hora entra a trabajar "<<endl;
		cin>>empleado[i].dir.hora_en;
		cout<<"Inserte la hora de salida "<<endl;
		cin>>empleado[i].dir.hora_sa;
		cout<<"Ingrese el rango que ocupa en la empresa "<<endl;
		cin>>empleado[i].dir.rang;
		cout<<"Ingrese la direccion de la empresa  "<<endl;
		cin>>empleado[i].dir.dir_trab;
		system("cls");
 
			}
			break ;
			case 2:
				cout<<"Ingrese el codigo a consultar"<<endl;
				cin>>codcons;
			      for(i=0;i<3;i++)
			      {
						if(codcons==empleado[i].ide)
						{
						    system("cls");
						     cout<<"Datos personales "<<endl;
							cout<<"El nombre es: "<<empleado[i].nombre<<endl;
							cout<<"Fecha de nacimiento "<<empleado[i].fechanac<<endl;
							cout<<"Su edad es: "<<empleado[i].edad<<endl;
							cout<<"Contactar al numero: "<<empleado[i].tel<<endl;
							cout<<"Datos del empleado en la empresa "<<endl;
	                      	cout<<"Su puesto es: "<<empleado[i].dir.ocup<<endl;
							cout<<"Comienzo en empresa :"<<empleado[i].dir.comien<<endl;
							cout<<"El rango que ocupa es : "<<empleado[i].dir.rang<<endl;
							cout<<"Hora de comienzo de trabajo : "<<empleado[i].dir.hora_en<<endl;
							cout<<"Hora de salida es: "<<empleado[i].dir.hora_sa<<endl;
							cout<<"Direccion de empresa donde trabajar "<<empleado[i].dir.dir_trab<<endl;
 
 
							}
 
						}
				break ;
				case 3 :
				         cout<<"Datos a modificar "<<endl;
						 cout<<"Ingrese el codigo "<<endl;
						 cin>>codcons;
		                for(i=0; i<3; i++)
	                   {
	                 	if(codcons==empleado[i].ide)
	        	       {
	    cout<<"Ingrese datos personales "<<endl;
	    cout<<"Ingrese el nuevo codigo "<<endl;
	    cin>>empleado[i].ide;
	    cout<<"Ingrese el Nombre de empleado "<<endl;
		cin>>empleado[i].nombre;
		cout<<"Ingrese la edad de empleado "<<endl;
		cin>>empleado[i].edad;
		cout<<"Ingrese la fecha de Naciiento del empleado "<<endl;
		cin>>empleado[i].fechanac;
		cout<<"Ingrese el telefono de empleado "<<endl;
		cin>>empleado[i].tel;
		cout<<" DATOS EN LA EMPRESA DEL EMPLEADO "<<endl;
		cout<<"Comienzo de contrato del empleado  "<<endl;
		cin>>empleado[i].dir.comien;
		cout<<" Inserte el puesto que ocupa el empleado "<<endl;
		cin>>empleado[i].dir.ocup;
		cout<<" Inserte la hora entra a trabajar "<<endl;
		cin>>empleado[i].dir.hora_en;
		cout<<"Inserte la hora de salida "<<endl;
		cin>>empleado[i].dir.hora_sa;
		cout<<"Ingrese el rango que ocupa en la empresa "<<endl;
		cin>>empleado[i].dir.rang;
		cout<<"Ingrese la direccion de la empresa  "<<endl;
		cin>>empleado[i].dir.dir_trab;
		            system("cls");
                    	}
 
					}
 
				break ;
				case 4 :
					     cout<<"Limpiar Datos "<<endl;
					     for (i=0; i<3; i++)
                         {
      	                    empleado[i].ide=0;
                        //	empleado[i].nombre="      "; no me funciono con los espacios
                           // empleado[i].dir.ocup="              ";
                           // empleado[i].tel="      ";
                        }
                       break;
 
					case 5:
						    cout<<"Mostrar datos"<<endl;
					        for(i=0;i<3;i++)
					        {
 
							  cout<<endl;
							  cout<<"Datos Personales "<<endl;
							 cout<<"Empleado"<<i+1<<endl;
							cout<<"El nombre es: "<<empleado[i].nombre<<endl;
							cout<<"Fecha de nacimiento "<<empleado[i].fechanac<<endl;
							cout<<"Su edad es: "<<empleado[i].edad<<endl;
							cout<<"Contactar al numero: "<<empleado[i].tel<<endl;
							cout<<"Registro en la empresa "<<endl;
	                      	cout<<"Su puesto es: "<<empleado[i].dir.ocup<<endl;
							cout<<"Comienzo en empresa :"<<empleado[i].dir.comien<<endl;
							cout<<"El rango que ocupa es : "<<empleado[i].dir.rang<<endl;
							cout<<"Hora de comienzo de trabajo : "<<empleado[i].dir.hora_en<<endl;
							cout<<"Hora de salida es: "<<empleado[i].dir.hora_sa<<endl;
							cout<<"Direccion de empresa donde trabajar "<<empleado[i].dir.dir_trab<<endl;
 
 
								}
					break;
					default:
						    cout<<"Saliendo"<<endl;
						    break;
 
			}
			} while(opc!=6);
 
			return 0;
 
		}
 
 
 
/*Como hago para limpiar datos ayuda*/
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 a como limpiar datos en este codigo

Publicado por Rene gar (50 intervenciones) el 07/02/2015 02:09:56
Ha que te refieres con limpiar datos?
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 a como limpiar datos en este codigo

Publicado por Javier Mayorga (5 intervenciones) el 07/02/2015 03:39:44
me refiero a la opcion de limpiar datos... en el menu se supone que si eliges limpiar datos se limpia todo lo que has insertado ya..
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 a como limpiar datos en este codigo

Publicado por Javier Mayorga (5 intervenciones) el 07/02/2015 03:39:01
me refiero a la opcion de limpiar datos... en el menu se supone que si eliges limpiar datos se limpia todo lo que has insertado ya..
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
Imágen de perfil de vangodp
Val: 73
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Ayuda a como limpiar datos en este codigo

Publicado por vangodp (287 intervenciones) el 07/02/2015 16:01:45
Solo he mirado los casos 1, 2 y 4. También he mirado que tienes unos errores muy muy chungos.
1º el código te lo dejo aquí: http://codepad.org/mKAra64a

Primero voy a comentar los errores que tienes.
Si bien no lo he buscado a fondo el mas importante es que te estas saliendo del rango en casi todos los bucles tuyos.

si declaras empleados[2] ¿Como es que en los bucles vas hasta i < 3 si solo tienes 2 empleados y esos son empleado[0] y empleado[1] (o sea 2)? Si intentas editar empleado[2] ya te sales de rango ya que solo puedes editar has ta i<2 ya que iniciamos a contar de cero. ¡Eso es fatal eh! Es que pasas eso a alguien y hasta te lo puedes cargar el pc a la peña, a ver si te tiene mas cuidado con esas cosas XDD

En ves de liarte parda con los rangos de los arreglos, mejor es usar una variable constante para el tamaño de esta forma:

const int MAX = 2;

struct lol{

} datos[MAX];

¿Por que hacer eso? ¡Simples! por que luego en los bucles hacemos:

for(int i = 0; i < MAX; i++)

luego si quiero cambiar el tamaño del arreglo datos solo cambio la constante MAX y todos los bucles funcionan perfectamente así ya que nunca pasara de MAX -1 que en nuestro caso es 2, datos[0] y datos[1]. No existe datos[2](seria 3).

Ahora sobre la duda de como limpiar esos datos.
Existe una función llamada memset() que se usa para formatear una cadena de caracteres como por ejemplo

char frase[20] = "Hello baby!";

cout << frase << endl;

memset(frase, 'a', sizeof (frase) -1 );

cout << frase << endl;


Lo que hace memset es establecer byte a byte, todos los bytes indicados por sizeof(frase) a cero. Si frase tiene 20 establece los 20 caracteres a 'a', pero como sabemos que en las cadenas de caracteres no debemos setear el ultimo valor ya que ese es el que indica el fin de la cadena. Entonces si lo vamos setear toda la cadena a NULL podemos hacer sizeof (frase), pero si vamos a setear con una letra mejor no poner el tamaño completo sino el tamaño menos 1 para indicar que el ultimo no lo toque sizeof (frase) -1.

Ahora bien... ¿Por que te digo de una función de cadenas de caracteres? Pues por que con esa función usaremos para vaciar una estructura.

La función memset() recibe 3 parámetros. El primer parámetro es un puntero de donde quieres iniciar el formateo, si le pasamos frase como 1º parámetros indicamos que queremos formatear la cadena desde el principio.
El 2º parámetro de memeset es el valor que queremos que tenga cada byte de la cadena, esos valores son letras, podemos pasar cualquier valor de la tabla asc2 ya sean esos letras números o el NULL entre otros claro.
El 3º parámetro es el tamaño en bytes(conjunto de 8bits). Cada byte es se supone que es un char ya que esta función trabaja con chars.

Ahora veremos como usar esa función para formatear una estructura en vez de una cadena de caracteres.
Si tenemos una estructura como la tuya: struct datos_empleado, que a su vez tiene otra dentro typedef struct info_empleado infodir;. adaptamos memset para formatear desde el inicio de la estructura hasta sizeof(datos_empleado) que es el tamaño de datos_empleado con info_empleado dentro. Veamos un ejemplo:

si mis estructuras son:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
struct info_empleado {
    char comien [15];
    char ocup [15] ;
    char hora_en [15];
    char hora_sa[15];
    char rang [15];
    char dir_trab [15];
 
 
};
typedef struct info_empleado infodir;
 
 
struct datos_empleado {
    int ide;
    char nombre [7];
    int edad;
    char fechanac [10];
    char tel[8];
    infodir dir;
 
} empleado;

...Tengo un objeto llamado empleado del tipo datos_empleado.
A memset hay que pasar 1º el puntero de la estructura, en ese caso empleado ya es un puntero a la dirección de la estructura así que memset(empleado, ?, ?).

El segundo parámetro es que valor le ponemos a cada byte de la estructura, como lo que vamos es formatear pues ponemos un 0: memset(empleado, 0, ?);

El 3º parámetro es el tamaño de la estructura. Usaremos para pasar el tamaño a sizeof(datos_empleado). Aquí es donde resalto la importancia en que te lea sobre el tamaño que toman las estructuras que contienen diferentes tipos de datos ya que por ejemplo si tenemos un entero y un char en una misma estructura, la estructura toma el tamaño del mayor dato, o sea que te dirá que tienes 8 bytes, pero en realidad solo tengo 5.A eso se le denomina (alineación de bytes o byte aling). Para entender eso lea aquí: http://c.conclase.net/curso/?cap=011b#STR_sizeof

Eso en realidad no nos afecta para nada pero es bueno entender.
Al 3º parámetro pasamos el sizeof(estructura) o el sizeof(objeto de estructura) normalmente de forma que memset quede:
memset(empleado, 0, sizeof(empleado) ); o memset(empleado, 0, sizeof(datos_empleado) ); que es lo mismo.

Entonces con memset(empleado, 0, sizeof(datos_empleado) ); formateamos la estructura byte a byte con el valor nulo(0) que es lo que andas buscando.

Pero como en tu caso estas trabajando con arreglos de estructuras como:
struct datos_empleado {
int ide;
//....
} empleado[2];

...Debes de indicar el objeto en cuestión a formatear.

memset (&empleado[i], 0, sizeof(datos_empleado) ); para formatear a solo uno de los empleados del arreglo indicado en la letra i. O bien memset (empleado, 0, sizeof(empleado) ); para formatear toda la lista.

memset (empleado, 0, sizeof(empleado) ); para que lo entiendas, es lo mismo que:

memset(&empleado, 0, sizeof empleado );
memset( empleado, 0, 2 * sizeof (struct datos_empleado) );
memset( empleado, 0, 2 * sizeof *empleado );

memset ( Puntero que indica inicio de cadena/estructura, Letra según la tabla asc2 como '\0' o 0, Tamaño de la estructura/arreglo de estructuras(fin de la cadena, estructura o arreglo de estructuras));

Así de fácil XD.

Así que recuerda... memset establece cada byte(char) de una cadena a un determinado valor. Pero también sirve para formatear estructuras o arreglos de estructuras completas a NULL.

Espero que no haya sido muy lioso mi respuesta pero es que son muchas cosas a tener en cuenta.
Si buscas por Internet sobre memset obtendrás explicaciones sobre cadenas de caracteres pero puedes buscar en Google como "formatear estructuras con memset en C/C++" y te sale fijo.

Con tanto raleo puede que haya explicado algo mal o haya dejado algo sin explicar. Si tienes dudas puedes seguir preguntando ;)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Ayuda a como limpiar datos en este codigo

Publicado por Javier (5 intervenciones) el 10/02/2015 04:33:44
Muchas gracias por tu respuesta de verdad que me has ayudado bastante... Solo quiero que sepas que cuando habia declarado empleados [2] y no me habia fijado en el bucle pero de igual manera siempre estoy muy agradecido.
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
Imágen de perfil de vangodp
Val: 73
Ha disminuido 1 puesto en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Ayuda a como limpiar datos en este codigo

Publicado por vangodp (287 intervenciones) el 10/02/2015 08:10:34
intenta nunca salir de rango por que cuando lo haces en realidad es como si tuvieras invadiendo la casa del vecino, pero en ese caso estas sobrescribiendo cosas que pertenecen a otro programa o quizás al tuyo proprio. Puedes provocar un gran error en el mejor de los casos provocaras que los programas no funcionen correctamente y en el peor puedes dañar algún programa crucial para el sistema que este en la memoria.

No es para tomar a la ligera el salir de rango. Claro esta que eso te puede parecer un error de C/C++ pero te aseguro que tienes sus utilidades.
Una de ellas es por ejemplo si tengo una matriz

int m[10][10];

luego voy a la casilla m[0][90] = 100;

Eso claramente me estoy saliendo de rango, pero lo hago apropósito, ya que puedo tratar una matriz como si fuera un arreglo, en la memoria ram la disposición de la matriz es de forma lineal y no "bidimensional".

Entonces cuando tengo m[3][3], y hago m[0][5]=10 es como acceder a la memoria m[1][2] y meter ahí el 10, Como dije, la memoria es lineal pues esta dispuesta de forma consecutiva de esta forma en realidad.
m[0][0], m[0][1], m[0][2], m[1][0], m[1][1], m[1][2], m[2][0], m[2][1], m[2][2]

Por muy matriz que sea puedo acceder a sus casillas como una especie de tabla(En el sentido De que la accedemos de forma lineal):
m[0][0], m[0][1], m[0][2], m[0][3], m[0][4], m[0][5], m[0][6], m[0][7], m[0][8]

Simplemente que tu la ves asi:
m[0][0], m[0][1], m[0][2],
m[0][3], m[0][4], m[0][5],
m[0][6], m[0][7], m[0][8]

Pero realmente en la memoria es eso...Lineal. XD

Para entender mejor vea ese video:

En el aprenderás que estas solo en el mundo. jajaja.
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