/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Principiante: mi primer ejercicio de estructuras

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
purplestain



Registrado: 29 Oct 2007
Mensajes: 3

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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

MensajePublicado: 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
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com