| Ver tema anterior :: Ver siguiente tema | | Autor | Mensaje |
|---|
purplestain
Registrado: 29 Oct 2007 Mensajes: 3
| Publicado: 29/10/2007 1:35 pm | | | Título: Principiante: mi primer ejercicio de estructuras |
| Hola a todos, estoy empezando con c y mas precisamente con estructuras, estuve tratando de hacer un ejercicio basico que dice textualmente "Se dispone de los siguientes datos de los empleados de una ampresa (son 100 empleados): numero de legajo,sueldo y antiguedad. Las ternas de datos se ingresan en cualquer orden.Se pide un programa que imprima un listado ordenado de forma creciente por numero de legajo, de todos aquellos empleados que superen o igualen el sueldo promedio, informando sus tres atributos." El codigo que hice es este:
| Cita: | #include <stdio.h> #include <conio.h> #define cant_max 100 struct estructura { int num_leg; int sueldo; int ant; };
void llenar (struct estructura v[],int comp){ printf ("\ningrese legajo:\n"); fflush (stdin); scanf ("%d",&v[comp].num_leg); printf ("\ningrese sueldo:\n"); fflush (stdin); scanf ("%d",&v[comp].sueldo); printf ("\ningrese antiguedad:\n"); fflush (stdin); scanf ("%d",&v[comp].ant); }
void intercambiar (int *x,int *y) {int aux; aux=*x; *x=*y; *y=aux;}
void ordenar_struct (struct estructura v[],int n) {int fin=0,k,i; k=n-1; while (!fin) { fin=1; for (i=0;i<k;i++) { if (v[i].num_leg>v[i+1].num_leg) {intercambiar (&v[i].num_leg,&v[i+1].num_leg); intercambiar (&v[i].sueldo,&v[i+1].sueldo); intercambiar (&v[i].ant,&v[i+1].ant); fin=0; } } }k--; }
void main () { struct estructura empleado_promedio [cant_max]; struct estructura empleado[cant_max]; int i,promedio,acum=0,k=0,suma; for (i=0;i<cant_max;i++){ llenar (&empleado,i); } for (i=0;i<cant_max;i++) {suma=acum+empleado[i].sueldo; acum=suma; } promedio=suma/cant_max; i=0; while (i<cant_max) {if (empleado[i].sueldo>promedio) {empleado_promedio[k].num_leg=empleado[i].num_leg; empleado_promedio[k].sueldo=empleado[i].sueldo; empleado_promedio[k].ant=empleado[i].ant; k++; }i++; } ordenar_struct (&empleado_promedio,k); for (i=0;i<k;i++){ printf ("\nLegajo: %d\n",empleado_promedio[i].num_leg); printf ("\nSueldo: %d\n",empleado_promedio[i].sueldo); printf ("\nAntiguedad: %d\n\n",empleado_promedio[i].ant); } getch(); } |
Lo probé y anda, pero como verán es bastante largo, mi pregunta es si está bien encarado o hay alguna manera mas practica (y por ahi con mas sentido comun) de ordenar un vector de estructuras a partir de alguno de sus campos. Gracias! Leo |
| | Volver arriba | |  | _Martin_

Registrado: 03 Ago 2006 Mensajes: 163
| Publicado: 29/10/2007 3:28 pm | | | Título: |
| Hola, puedes modificar la funcion intercambiar. En vez de intercambiar campo a campo, puedes hacer lo siguiente (algo1 y otro2 son dos estructuras de igual tipo):
| Código: |
/*en vez de hacer esto:*/ algo1.a=otro2.a; algo1.b=otro2.b; ...
/*Mejor esto*/
algo1=otro2;
|
Esto es perfectamente valido y es donde se puede apreciar la facilidad que permite trabajar con estructuras en vez de trabajar con variables sueltas.
Como dato, el metodo de ordenamiento que usas (burbuja) es uno de los mas ineficientes y existen otros mucho mejores (como el quicksort) No obstante el de burbuja es uno de los mas simples y si recien empezas, es mejor que te quedes con este metodo.
Saludos |
| | Volver arriba | |  | purplestain
Registrado: 29 Oct 2007 Mensajes: 3
| Publicado: 29/10/2007 4:04 pm | | | Título: |
| Muchas gracias por la respuesta! Intenté hacer lo que me decis pero me cambia solo el primer campo, es decir, cuando imprime, lo hace desordenado, solo que cambia los números de legajo. El codigo en esa parte me habia quedado asi:
| Cita: | void ordenar_struct (struct estructura v[],int n) {int fin=0,k,i; k=n-1; while (!fin) { fin=1; for (i=0;i<k;i++) { if (v[i].num_leg>v[i+1].num_leg) {intercambiar (&v[i],&v[i+1]); fin=0; } } }k--; } |
Que estaré haciendo mal? Saludos |
| | Volver arriba | |  | | rir3760

Registrado: 01 Oct 2004 Mensajes: 3650 Ubicación: Mexico
| Publicado: 29/10/2007 4:29 pm | | | Título: |
| Porque no solo tienes que realizar el cambio que te indico _Martin_ sino tambien cambiar la funcion de intercambio para que trabaje con estructuras:
| Código: | void intercambiar (struct estructura *x, struct estructura *y) { struct estructura aux; aux = *x; *x = *y; *y = aux; } |
Un saludo _________________ The capacity to learn is a gift; The ability to learn is a skill; The willingness to learn is a choice. -- Rebec of Ginaz |
| | Volver arriba | |  | purplestain
Registrado: 29 Oct 2007 Mensajes: 3
| Publicado: 29/10/2007 5:20 pm | | | Título: |
| Es verdad! se me pasó eso, muchisimas gracias, ya lo probé y anda perfecto, otra pregunta: Por lo que entendí de la forma de trabajar con estructuras,supuestamente no tendría problemas en cambiar el main y dejarlo así:
| Cita: | void main () { struct estructura empleado_promedio [cant_max]; struct estructura empleado[cant_max]; int i,promedio,acum=0,k=0,suma; for (i=0;i<cant_max;i++){ llenar (&empleado,i); } for (i=0;i<cant_max;i++) {suma=acum+empleado[i].sueldo; acum=suma; } promedio=suma/cant_max; i=0; while (i<cant_max) {if (empleado[i].sueldo>promedio) {empleado_promedio[k]=empleado[i]; k++; }i++; } ordenar_struct (&empleado_promedio,k); for (i=0;i<k;i++){ printf ("\nLegajo: %d\n",empleado_promedio[i].num_leg); printf ("\nSueldo: %d\n",empleado_promedio[i].sueldo); printf ("\nAntiguedad: %d\n\n",empleado_promedio[i].ant); }getch(); } |
Pero resulta que cuando lo ejecuto con este unico cambio, termino de ingresar los datos de cada empleado y el programa se queda esperando una tecla y no me muestra nada. Un saludo. |
| | Volver arriba | |  | david_celta
Registrado: 02 Jun 2005 Mensajes: 45
| Publicado: 29/10/2007 10:02 pm | | | Título: |
| #include <stdio.h> #include <conio.h>
#define cant_max 4
struct estructura { int num_leg; int sueldo; int ant; };
void llenar (struct estructura v[],int comp) { printf ("\ningrese legajo:\n"); fflush (stdin); scanf ("%d",&v[comp].num_leg); printf ("\ningrese sueldo:\n"); fflush (stdin); scanf ("%d",&v[comp].sueldo); printf ("\ningrese antiguedad:\n"); fflush (stdin); scanf ("%d",&v[comp].ant); }
void intercambiar (struct estructura &x, struct estructura &y) { struct estructura aux;
aux = x; x = y; y = aux; }
void ordenar_struct (struct estructura v[],int n) { int fin=0,k,i; k=n-1;
while (!fin) { fin=1;
for (i=0;i<k;i++) { if (v[i].num_leg>v[i+1].num_leg) { intercambiar (v[i],v[i+1]); fin=0; } } } }
void main () { clrscr(); struct estructura empleado_promedio [cant_max]; struct estructura empleado[cant_max]; int i,promedio,acum=0,k=0,suma;
for (i=0;i<cant_max;i++) { llenar (empleado,i); }
for (i=0;i<cant_max;i++) { suma=acum+empleado[i].sueldo; acum=suma; }
promedio=suma/cant_max; i=0;
while (i<cant_max) { if (empleado[i].sueldo>promedio) { empleado_promedio[k]=empleado[i]; k++; }
i++; }
ordenar_struct (empleado_promedio,k);
for (i=0;i<k;i++) { printf ("\nLegajo: %d\n",empleado_promedio[i].num_leg); printf ("\nSueldo: %d\n",empleado_promedio[i].sueldo); printf ("\nAntiguedad: %d\n\n",empleado_promedio[i].ant); }
getch(); } _________________ Este es un bloque de texto que se puede agregar a los mensajes que publique. Texto Compilado en C++. 0 errors y 1 un warning. |
| | Volver arriba | |  | | |
| No puede crear mensajes No puede responder temas No puede editar sus mensajes No puede borrar sus mensajes No puede votar en encuestas
|
|
| |