Dev - C++ - Se me ordenan mal unos datos y se imprimen mal otros

 
Vista:
sin imagen de perfil

Se me ordenan mal unos datos y se imprimen mal otros

Publicado por frobbers (2 intervenciones) el 01/10/2021 21:19:30
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
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
#include <iostream>
#include <conio.h>
#include <cstring>
 
/* NOTAS:
        *La funcion empleados_a_jubilarse no ordena los nombres correctamente
        *Al imprimir los datos con datos_empleado, el estado civil se adjunta al sexo (ejemplo: "MC" o "FS")*/
 
using namespace std;
 
struct Empleado
{
    char nombre[30];
    int dni;
    int telefono;
    char direccion[30];
    int edad;
    char sexo[1]; // M hombre S mujer
    char estado_civil[1]; // C casado S soltero
} emp[25];
 
 
void cargar_emp();
void menu();
void ingresar_empleado();
void burbujeo();
void empleados_a_jubilarse();
void edad_promedio();
void datos_empleado();
 
int salir=0;
int cont=2;
int contJ=0;
float suma=0, promedio=0;
char jubilados[25][30];
 
int main()
{
    cargar_emp();
    while(salir!=1)
    {
        menu();
    }
 
    cout << "Programa finalizado. Presione una tecla para salir" << endl;
    return 0;
}
 
 
void menu()
{
    int opcion;
 
    cout << "MENU" << endl;
    cout << "1- Ingresar un empleado" << endl;
    cout << "2- Listar los empleados proximos a jubilarse" << endl;
    cout << "3- Edad promedio de los empleados" << endl;
    cout << "4- Datos de un empleado" << endl;
    cout << "5- Salir" << endl << endl;
    cout << "Seleccione una opcion: ";
    cin >> opcion;
 
    system("cls");
 
    switch(opcion)
    {
    case 1:
        ingresar_empleado();
        break;
    case 2:
        burbujeo();
        empleados_a_jubilarse();
        break;
    case 3:
        edad_promedio();
        break;
    case 4:
        datos_empleado();
        break;
    case 5:
        salir=1;
        break;
    default:
        cout << "Valor invalido. Presione una tecla para continuar" << endl;
        getch();
        system("cls");
        break;
    }
}
 
void ingresar_empleado()
{
    if(cont>25)
    {
        cout << "Ya se ha alcanzado la cantidad maxima de empleados. Presione una tecla para continuar" << endl;
        getch();
        system("cls");
        return;
    }
 
    cout << "EMPLEADO N" << cont+1 << endl;
    fflush(stdin);
    cout << "\t*Nombre: ";
    cin.getline(emp[cont].nombre, 30, '\n');
    cout << "\t*DNI: ";
    cin >> emp[cont].dni;
    cout << "\t*Telefono: ";
    cin >> emp[cont].telefono;
    fflush(stdin);
    cout << "\t*Direccion: ";
    cin.getline(emp[cont].direccion, 30, '\n');
    cout << "\t*Edad: ";
    cin >> emp[cont].edad;
    suma+= emp[cont].edad;
    promedio++;
    fflush(stdin);
    cout << "\t*Sexo: ";
    cin.getline(emp[cont].sexo, 1, '\n');
    if((strcmp(emp[cont].sexo,"F")==0 && emp[cont].edad<60 && emp[cont].edad>=55) || ((strcmp(emp[cont].sexo, "M")==0) && emp[cont].edad<65 && emp[cont].edad>=60))
    {
        strcpy(jubilados[cont], emp[cont].nombre);
        contJ++;
    }
    cout << "\t*Estado civil: ";
    cin.getline(emp[cont].estado_civil, 1, '\n');
 
    cout << "\nIngreso de datos exitoso. Presione una tecla para continuar" << endl;
    getch();
    system("cls");
    cont++;
}
 
void burbujeo()
{
    char aux[30];
 
    for(int i=0; i<25; i++)
    {
        for(int k=i+1; k<25; k++)
        {
            if(jubilados[i]<jubilados[k])
            {
                strcpy(aux, jubilados[i]); // aux= jubilados[i]
                strcpy(jubilados[i], jubilados[k]); // jubilados[i]= jubilados[k]
                strcpy(jubilados[k], aux); // jubilados[k]= aux
            }
        }
    }
}
 
void empleados_a_jubilarse()
{
    cout << "--EMPLEADOS A JUBILARSE ORDENADOS ALFABETICAMENTE--" << endl;
    for(int j=0; j<25; j++)
    {
        if(strcmp(jubilados[j], "Z")!=0)
        {
            cout << "\t*" << jubilados[j] << endl;
        }
    }
 
    cout << "Proceso finalizado. Presione una tecla para continuar" << endl;
    getch();
    system("cls");
}
 
void edad_promedio()
{
    cout << "EDAD PROMEDIO DE LOS EMPLEADOS: " << suma/promedio;
    cout << "\n\nPresione una tecla para continuar" << endl;
    getch();
    system("cls");
}
 
void datos_empleado()
{
    int dni_aux, error=0;
 
    cout << "Ingrese el DNI del empleado que desea buscar: ";
    cin >> dni_aux;
    fflush(stdin);
 
    for(int d=0; d<25; d++)
    {
        if(dni_aux==emp[d].dni)
        {
            cout << "\n\n\t*Nombre: " << emp[d].nombre;
            cout << "\n\t*DNI: " << emp[d].dni;
            cout << "\n\t*Telefono: " << emp[d].telefono;
            cout << "\n\t*Direccion: " << emp[d].direccion;
            cout << "\n\t*Edad: " << emp[d].edad;
            cout << "\n\t*Sexo: " << emp[d].sexo;
            cout << "\n\t*Estado civil: " << emp[d].estado_civil;
            error=0;
        }
    }
 
    if(error==1)
    {
        cout << "\n\t*No se ha encontrado el empleado. Ingrese otro valor";
    }
 
    cout << "\n\n\nProceso finalizado. Presione una tecla para continuar" << endl;
    getch();
    system("cls");
}
 
void cargar_emp()
{
    strcpy(emp[0].nombre, "Burrenzo");
    strcpy(jubilados[0], emp[0].nombre);
    emp[0].dni= 123;
    emp[0].telefono=123;
    strcpy(emp[0].direccion, "Rivadavia 5431");
    emp[0].edad= 61;
    suma+= emp[0].edad;
    promedio++;
    strcpy(emp[0].sexo, "M");
    strcpy(emp[0].estado_civil, "C");
 
    strcpy(emp[1].nombre, "Anabel");
    strcpy(jubilados[1], emp[1].nombre);
    emp[1].dni= 456;
    emp[1].telefono=123;
    strcpy(emp[1].direccion, "Casanova 1973");
    emp[1].edad= 56;
    suma+= emp[1].edad;
    promedio++;
    strcpy(emp[1].sexo, "F");
    strcpy(emp[1].estado_civil, "S");
 
    for(int z=2; z<25; z++)
    {
        strcpy(jubilados[z], "Z");
    }
}


Lo que dice el título

El programa muestra un menu con 5 opciones
1- Cargar empleado
2- Mostrar empleados próximos a jubilarse ordenados alfabéticamente según el nombre (en hombres, entre 60 y 65 años. En mujeres, entre 55 y 60 años)
3- Calcular el promedio de la edad de los empleados
4- Imprimir los datos de un empleado ingresando su DNI para buscarlo
5- Salir

(La función cargar_emp hace 3 cosas: carga los datos de los empleados, los agrega al array jubilados (ya que están en el rango de edad) y luego carga el array de jubilados (de la posición 2 para adelante) con la letra "Z" para que sea más fácil hacer el burbujeo. Esto lo hice básicamente para no tener que cargar datos cada vez que ejecuto el programa, ya que se estaba volviendo tedioso)


Cuando ingreso la opción 2, el programa coloca primero a Anabela y después a Burrenzo. Al principio no está mal, pero si cambio el nombre de "Anabela" a "Daniela" (por ejemplo), coloca primero a Daniela, cuando tendría que estar primero Burrenzo y después Daniela

Cuando ingreso la opción 4, todo parece estar en orden hasta que en vez de imprimir "*Sexo: M" me imprime "*Sexo: MC". Es decir, me agrega el estado civil al final del sexo.

Si alguien fuera tan amable de ayudarme o de darme algún consejo en general, estaría muy agradecido.
Si tienen alguna duda sobre el código, estoy abierto a cualquier pregunta
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

Se me ordenan mal unos datos y se imprimen mal otros

Publicado por anonymous (146 intervenciones) el 01/10/2021 22:09:07
Hola, mira te explico el problema de las variables `sexo' y `estado_civil'. El problema está en que tu solo reservaste un byte para almacenar el carácter correspondiente al sexo de la persona, pero necesitas dos bytes, el primero para tal carácter y el segundo para el carácter nulo '\0' el cual va al final de todas las cadenas de caracteres, pues es un indicador de que la cadena ha finalizado, todas las funciones en C/C++ que trabajen con cadenas de caracteres ASCII buscarán este carácter para saber donde termina la cadena, a menos claro que se indique la longitud de la cadena explícitamente. Este problema está presente en las variables `sexo' y `estado_civil'. Así que ya sabes siempre debes reservar un byte adicional para el carácter nulo.

Un dato curioso: La razón por la que se imprime tanto el sexo como el estado civil es porque, el carácter `estado_civil' está alojado en la posición de memoria contigua a la del carácter `sexo' y al no haber un carácter nulo que le indique a la función donde termina una cadena y donde empieza la otra, la función cree que es una sola cadena en vez de dos.

En fin espero que esta explicación te haya ayudado. Cualquier cosa avísame, Saludos.
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

Se me ordenan mal unos datos y se imprimen mal otros

Publicado por frobbers (2 intervenciones) el 01/10/2021 23:03:48
Sí, era eso! Perfecto, muchas gracias!
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

Se me ordenan mal unos datos y se imprimen mal otros

Publicado por anonymous (146 intervenciones) el 02/10/2021 00:23:53
Qué bueno, de nada!
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