ahora si ya casi termino este

Iniciado por LARANARENElol, 3 Diciembre 2018, 06:08 AM

0 Miembros y 1 Visitante están viendo este tema.

LARANARENElol

hey, ayudenme a ver que es el error en esto, miren lo que quiero hacer, esto es el programa/problema que tengo que resolver, esta es la sintaxis del problema:
1.- Elaborar un programa que capte un grupo de sueldos de los empleados de una empresa (nómina),
tomando en cuenta que el programa debe pedir sueldos mientras el usuario elija la opción de continuar.
Al finalizar la captura de la nómina, el programa deberá generar un reporte con lo siguiente:
● Total de nómina de la empresa
● Los sueldos ordenados de menor a mayor
● Cantidad de empleados capturados
● Promedio de sueldo de la nómina
● Cantidad de empleados con un sueldo superior al promedio
El programa debe usar funciones y considerar un grupo máximo de 100 empleados. Validar que no
existan sueldos negativos.

este es mi programa:

#include<stdio.h>
#include<stdlib.h> 
#include<string.h>
#include<ctype.h>

int ordendesueldos(int);
void empsupnom(int, float);
int contadorempleados = 0,w,n=0, vector[100],supmay,orden;
char fin[3], final[]="no";
float promnomina,contadornomina=0;

int main()
{
do
{
system("cls");
printf("da el sueldo del empleado:\n");
scanf_s("%d", &vector[n]);
contadornomina=vector[n]+contadornomina;
n++;
printf("quieres dar otro sueldo?\n");
fflush(stdin);
gets_s(fin);
contadorempleados++;
orden=ordendesueldos(vector[100]);
if(strcmp(final,fin)==0)
  w=1;
else
w=0;
}while(w==0||n<=100);
promnomina= contadornomina/n;
printf("el total de la nomina es %d\n", contadornomina);
printf("los sueldos son; %d\n", orden);
printf("el total de empleados en la nomina de la empresa es: %d\n",contadorempleados);
printf("el promedio de la nomina es: %f\n", promnomina);
fflush(stdin);
empsupnom(vector[100], promnomina);
system("pause");
}

int ordendesueldos(int vector[100])
{ int a,b, aux;
for(a=1;a<100;a++)
for(b=0;b<100-a;b++)
if(vector[b]>vector[b+1])
{
aux=vector[b];
vector[b]=vector[b+1];
vector[b+1]=aux;
return aux;
}
}

void empsupnom(int vector[100],float promnomina)
{
int i;
for(i=0; i<10; i++)
if(vector[i]>promnomina)
printf("%d es mayor a la media \n", vector[i]);
}


ayuda por favor, es para mañana

K-YreX

Ya estoy otra vez por aquí, primero un par de cosas que ya te dije ayer:
- No usar <system("pause")>. Cambiarlo por <getchar()>.
- No usar <fflush(stdin)>. AlbertoBSD te dejó un par de enlaces para solucionar ese y otros problemas básicos.

Cosas nuevas de este programa:
- <scanf_s> y <gets_s> son funciones muy fáciles de usar y que quitan trabajo a quien las usa... sin embargo, no son estándar, es decir que yo que compilo los programas en GNU/Linux no puedo compilar un programa con esas instrucciones.
- No es recomendable declarar tantas variables globales. Lo normal es declararlas en el <main> si las vas a usar durante el programa o en la propia función si son de uso temporal.
- Tus dos funciones reciben como primer parámetro un entero <int> pero tú lo que quieres es mandar un array de enteros (o un puntero al comienzo del array  :silbar:).
- Tu función de ordenar los sueldos has puesto que devuelva un entero pero no devuelve nada. Y no entiendo muy bien qué entero vas a devolver. Me equivocaba, sí devuelve algo, devuelve el primer sueldo que está desordenado y se sale por lo que no ordena más.
- Tu otra función además de cambiar el primer parámetro que no está del todo bien, imagino que compara todos los sueldos con el promedio para ver cuántos están por encima de la media. Y en el <for> recorres los 10 primeros sueldos sólo.
- No validas que no existan sueldos negativos. Eso se puede hacer un filtro de toda la vida con un <do while>.
- Y luego para repetir el programa, haces una comparación, si la comparación es 0, pones <w = 1> y si la comparación es distinta de 0, pones <w = 0>. Usa directamente el resultado de la comparación en el <do while> y no le des tantas vueltas a una variable (esto lo vi hace poco en otro programa, no recuerdo si también era tuyo...)

Mis recomendaciones para que trabajes con funciones:
- Una función que te vaya pidiendo los datos y compruebe que los sueldos son positivos. Como valor de retorno un entero con la cantidad de sueldos registrados y como parámetros de entrada un array de <float> para los sueldos y el máximo de sueldos a guardar. En esta función puedes crear las variables <fin> y <final> ya que sólo se usan para repetir la entrada de datos.
- Una función que te ordene los sueldos. Sin valor de retorno y como parámetros de entrada un array de enteros y un entero de cuántos sueldos se han introducido (date cuenta que justo eso es lo que devuelve la función anterior).
- Una función que calcule el total de sueldos. Recibe como entradas un array de <float> y la cantidad de sueldos introducidos. Devuelve un <float> con la suma total.
- Una función que calcule cuántos empleados están por encima de la media. Recibe como entradas un array de <float>, la cantidad de sueldos introducidos y el promedio. Devuelve un entero con la cantidad de ellos que están por encima de la media.

Con estas recomendaciones, las cuales ya sé que son ineficientes ya que recorremos el array más veces de las necesarias, pero que es con fines educativos y para practicar, el programa principal quedaría algo así:

const int MAX_SUELDOS = 100; // O con #define si te gusta más
int main(){
    float sueldos[MAX_SUELDOS];
    float sumaSueldos, sueldoMedio;
    int cantidadSueldosFinal, cantidadSueldosSuperior;

    cantidadSueldosFinal = pedirSueldos(sueldos, MAX_SUELDOS); // el segundo parametro no es necesario ya que la variable es global
    sumaSueldos = sumarSueldos(sueldos, cantidadSueldosFinal);
    sueldoMedio = totalSueldos / cantidadSueldosFinal;
    cantidadSueldosSuperiores = superiorMedia(sueldos, cantidadSueldosFinal);

    ordenarSueldos(sueldos, cantidadSueldosFinal);
    for(int i = 0; i < cantidadSueldosFinal; i++) // mostramos los sueldos que se vea que estan ordenados
        printf("%.2f  ", sueldos[i]);

    // aqui muestras todos los resultados que has ido obteniendo
}


Esto es muy mejorable, piensa por ejemplo que si primero ordenas los sueldos luego es más eficiente calcular cuántos están por encima de la media. Pero eso y como implementar cada función te lo dejo a ti. Lo he intentado hacer lo más sencillo posible para que se entienda bien. Ahora ya te toca trabajar a ti. Suerte :rolleyes:

PD: Te dejo aquí la función <sumarSueldos()> para que veas como se pasan los arrays como parámetros.

float sumarSueldos(float sueldos[], int cantidadSueldos){
    float suma = 0;
    for(int i = 0; i < cantidadSueldos; i++)
        suma += sueldos[i];
    return suma;
}
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;