[C] Array unidimensional

Iniciado por Darklexis312, 22 Mayo 2018, 15:13 PM

0 Miembros y 2 Visitantes están viendo este tema.

Darklexis312

Hola a todos estoy haciendo un programa para la escuela pide que calcule la nomina total de una empresa entre otras cosas que describo abajo pero tengo unos problemas, explicare brevemente que hace mi programa:

Con el if pongo el rango de que solo se permiten valores mayores de 0 hasta 100,
luego dentro de un ciclo do-while pongo un ciclo for que se repetirá n veces
dependiendo de los sueldos que se quiera ingresar, por cada sueldo ingresado se
nos preguntara si queremos ingresar otro sueldo aquí es donde ya surgen mis
problemas:

1) Si por ejemplo elegí ingresar dos sueldos y solo ingreso uno, y elijo que no
quiero ingresar otro sueldo me imprime el sueldo ingresado y después números al
azar como si hubiera ingresado un segundo sueldo, como puedo arreglar eso?

2) Si por ejemplo elijo de nuevo ingresar 2 sueldos, me pide que ingrese el sueldo
del empleado 1 después me pregunta que si quiero ingresar otro sueldo elijo que
si, ingreso el sueldo del empleado 2 y despues me vuelve a preguntar si quiero
ingresar otro sueldo y no quiero que haga eso el programa quiero que imprima
directamente después de ingresar el segundo sueldo.

3) Como puedo saber cuantos empleados tienen un sueldo superior al promedio?

De antemano muchas gracias, espero que puedan ayudarme a avanzar...

/*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.*/

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

void main() {
int sueldo[100];
char op;
int i,j, D, arc, empleados=0;
float promedio, suma=0;

printf("\nCuantos sueldos desea ingresar?: ");
scanf_s("%i", &D);

if (D > 0 && D <= 100) {
do {
for (i = 0; i < D; i++) {

system("cls");

printf("Ingresa el sueldo del empleado %i: ", i + 1);
scanf_s("%i", &sueldo[i]);
suma += sueldo[i];

printf("\nDesea introducir un sueldo? [s/n]: ");
fflush(stdin);
while (getchar() != '\n');
scanf_s("%c", &op);
if (op == 'n' || op == 'N') {
break;
}

}

} while (op == 's'||op == 'S');

system("cls");

//-------------------------Total de nómina de la empresa-----------------------
printf("\nTOTAL DE NOMINA: %.2f", suma);
//-----------------------------------------------------------------------------

//------------------------Sueldos ordenados de menor a mayor------------------
for (i = 0; i < D; i++)
for(j = i + 1; j < D; j++)
if (sueldo[i] > sueldo[j]) {
arc = sueldo[i];
sueldo[i] = sueldo[j];
sueldo[j] = sueldo[i];
}

printf("\nLISTA ORDENADA DE SUELDOS");
for (i = 0; i < D; i++) {
printf("\n%i", sueldo[i]);
}
//-----------------------------------------------------------------------------

//-----------------------Cantidad de empleados capturados----------------------
empleados = empleados + i;
printf("\nCANTIDAD DE EMPLEADOS: %i", empleados);
//-----------------------------------------------------------------------------

//---------------------Promedio de sueldo de la nómina-------------------------
promedio = suma / D;
printf("\nPROMEDIO DE SUELDO: %.2f", promedio);
//-----------------------------------------------------------------------------

//----------Cantidad de empleados con un sueldo superior al promedio--------
if (sueldo[i] > promedio) {
printf("\nCANTIDAD DE EMPLEADOS CON SUELDO SUPERIOR AL PROMEDIO: %i", sueldo[i]);
}
//-----------------------------------------------------------------------------

}
else {
printf("\nNumero de sueldos a ingresar no valido.\n\nSolo se permite ingresar hasta 100 sueldos.");
}

system("pause>null");
}

Serapis

#1
Citar1) Si por ejemplo elegí ingresar dos sueldos y solo ingreso uno, y elijo que no
quiero ingresar otro sueldo me imprime el sueldo ingresado y después números al
azar como si hubiera ingresado un segundo sueldo, como puedo arreglar eso?
A - En ciertos lenguajes, al declarar un tipo de dato, es obligado inicializarlo al valor deseado. Si no se hace e valor que tienen es lo que hubiera previamente en esa posición de memoria.
B - En otros lenguajes, al declarar un tipo de datos, se inicializa al valor por defecto (0 en caso de los números).
El lenguaje C entra en la categoría A. Así que o bien, antes de nada pones a 0 todo el array sueldos, o bien antes de solicitar que se ingrese el sueldo, lo pones a 0, o bien no importa, porque si introduce el usuario un valor, ya cambia el que hubiera previo. En este último caso, todavía tendrán valores 'sucios' los sueldos no asignados desde D hasta 99.... pero te da igual, si solo vas a contabilidar y operar con los 'D' sueldos.

Citar
2) Si por ejemplo elijo de nuevo ingresar 2 sueldos, me pide que ingrese el sueldo
del empleado 1 después me pregunta que si quiero ingresar otro sueldo elijo que
si, ingreso el sueldo del empleado 2 y despues me vuelve a preguntar si quiero
ingresar otro sueldo y no quiero que haga eso el programa quiero que imprima
directamente después de ingresar el segundo sueldo.
Esto es cosa de tu diseño.
- No es mala estrategia solicitar al comienzo cuantos sueldos se desean ingresar, si elige 15... pués se solicitan 15. Pero en esete caso, sobra volver a preguntar si quiere señalar otro sueldo dentro de ese bucle... esto ya se preguntó antes.
- La otra solución es partir de la incertidumbre e ir preguntando en el bucle... en ese caso, la pregunta previa al bucle sobra y por tanto las comprobaciones deben hacerse in situ dentro del bucle al final.

Preguntar al comienzo:

Hacer
   D = Preguntar cuantos sueldos quieres tratar?
   Si D está en el rango 1-99
       bucle para i desde 0 a D-1
            sueldo(i) = Preguntar a cuanto asciende el sueldo del empleado 'i'
            // algunas operaciones de cáclulo se pueden hacer directamente dentro del propio bucle
           // por ejemplo, el total...
           total += sueldo(i)
           ...etc...
       repetir
       // y otras operaciones (como por ejemplo si se pidiera ordenar los sueldos), se deben hacer fuera dle bucle.
       // por ejemplo el promedio.
       Promedio = (Total /D)
       ...etc...
   Sino
       mensaje "error solo se permite señalar entre 1 y 99 sueldos. Vuelva a señalar un valor correcto."
   fin si
Repetir mientras ((D < 1) ó (D>99))


Preguntar sobre la marcha:

   D = 0
   i = 0
   Hacer        
       sueldo(i) = Preguntar a cuanto asciende el sueldo del empleado 'i'
       // algunas operaciones de cáclulo se pueden hacer directamente dentro del propio bucle
       // por ejemplo, el total...
       total += sueldo(i)
       ...etc...
       D += 1  //sumamos un empleado que señala su sueldo.

       massueldos = Preguntar: quiere selar el sueldo de otro empleado (S/N)
   repetir mientras ((D < 99) y (massueldos = "S" ó "s"))
   // y otras operaciones (como por ejemplo si se pidiera ordenar los sueldos), se deben hacer fuera dle bucle.
   // por ejemplo el promedio.
   Promedio = (Total /D)
   ... etc...

Tu decies que modelo usar, pero sé consecuente con el modelo elegido... no puedes mezclar ambos.

Citar
3) Como puedo saber cuantos empleados tienen un sueldo superior al promedio?
Ya te he selado claramente que algunas operaciones pueden hacerse dentro del bucle, pero otras no.
El promedio no puede calcularse hasta que el 'último empleado' haya dejado constancia de sus sueldo, porque el promedido depende del total, y este solo se sabe al final.
Luego exige un nuevo bucle donde recorras desde 0 hasta D-1, comparando:
    si suedlo(i) > promedio luego superior +=1

Darklexis312

Hola muchas gracias por responder a mis dudas fueron de mucha ayuda tus comentarios, probe lo que dijiste sobre mi problema número dos y así quedó mi programa ahora:

Ahora cuando elijo ingresar por ejemplo dos sueldos, ingreso el primer sueldo después me pregunta si quiero ingresar otro sueldo y cuando pulso s se sale del ciclo.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main() {
int sueldo[100];
    char op;
    int i,j, D, arc, empleados=0;
    float promedio, suma=0;
    printf("\nCuantos sueldos desea ingresar?: ");
    scanf("%i", &D);
    if (D > 0 && D < 100) {
        do {
            for (i = 0; i < D-1; i++){
              system("cls");
                printf("Ingresa el sueldo del empleado %i: ", i + 1);
                scanf("%i", &sueldo[i]);
                suma += sueldo[i];
               
               
                printf("\nDesea introducir un sueldo? [s/n]: ");
                fflush(stdin);
                while (getchar() != '\n');
               scanf("%c", &op);
                if (op == 'n' || op == 'N') {
                    break;
                    }
                 }
            }  while (D<1||D>99);
        system("cls");
//Total de nomina de la empresa
        printf("\nTOTAL DE NOMINA: %.2f", suma);

//Sueldos ordenados de menor a mayor
        for (i = 0; i < D; i++)
        for(j = i + 1; j < D; j++)
        if (sueldo[i] > sueldo[j]) {
        arc = sueldo[i];
            sueldo[i] = sueldo[j];
            sueldo[j] = sueldo[i];
            }
        printf("\nLISTA ORDENADA DE SUELDOS");
        for (i = 0; i < D; i++) {
        printf("\n%i", sueldo[i]);
            }

//Cantidad de empleados capturados
        empleados = empleados + i;
        printf("\nCANTIDAD DE EMPLEADOS: %i", empleados);
//Promedio de sueldo de la nomina
        promedio = suma / D;
        printf("\nPROMEDIO DE SUELDO: %.2f", promedio);
//Cantidad de empleados con un sueldo superior al promedio
        if (sueldo[i] > promedio) {
        printf("\nCANTIDAD DE EMPLEADOS CON SUELDO SUPERIOR AL PROMEDIO: %i", sueldo[i]);
            }

        }
    else {
        printf("\nNumero de sueldos a ingresar no valido.\n\nSolo se permite ingresar hasta 100 sueldos.");
        }
    system("pause>null");
    }

Serapis

#3
Cita de: Darklexis312 en 22 Mayo 2018, 18:55 PM
Hola muchas gracias por responder a mis dudas fueron de mucha ayuda tus comentarios, probe lo que dijiste sobre mi problema número dos y así quedó mi programa ahora:

Ahora cuando elijo ingresar por ejemplo dos sueldos, ingreso el primer sueldo después me pregunta si quiero ingresar otro sueldo y cuando pulso s se sale del ciclo.


...
int main() {
int sueldo[100];
   char op;
   int i,j, D, arc, empleados=0;
   float promedio, suma=0;
   printf("\nCuantos sueldos desea ingresar?: ");
   scanf("%i", &D);
   if (D > 0 && D < 100) {
       do {
            ...
               
               
               printf("\nDesea introducir un sueldo? [s/n]: ");
               fflush(stdin);
               while (getchar() != '\n');
              scanf("%c", &op);
               if (op == 'n' || op == 'N') {
                   break;
                   }
                }
           }   while (D<1||D>99);
       system("cls");
...


Pués para haber leido mi respuesta, no veo que hayas cambiado significativamente el código, especialmente lo que te remarcaba aquí, sigue estando...
Cita de: NEBIRE en 22 Mayo 2018, 16:54 PM
... solicitar al comienzo cuantos sueldos se desean ingresar ... Pero en esete caso, sobra volver a preguntar si quiere señalar otro sueldo dentro de ese bucle... esto ya se preguntó antes.

Elige una de las  dos opciones... O preguntas al principio, cuantos (y ya nunca más), o preguntas sobre la marcha ¿otro sueldo? y en consonancia los bucles son diferentes...

nada, nada... revisando más a fondo el código, ahora veo bucles por todas partes....
Para preguntar los sueldos solo necesitas un único bucle...punto.
Luego podrás necesitar alguno más para hacer los cálculos, pero no para pedir sueldos...



Intenta entenderlo...

Si de entrada preguntas a un jefe en la oficina: Cuantos empleados tienes a sueldo? ... Si responde por ejemplo 23, tu bucle deberá ser de 23 y será exclusivamente para pedir YA, las cantidades, no se puede pedir (al jefe) más nada en ese bucle. La unica forma de salir del bucle debe ser completar el valor de los 23 sueldos... Sí o Sí... (esta es la propuesta: empezar preguntando cuantos).

Hacer
   D = Preguntar cuantos sueldos quieres tratar?
   Si D está en el rango 1-99
       bucle para i desde 0 a D-1
            sueldo(i) = Preguntar a cuanto asciende el sueldo del empleado 'i'
            // algunas operaciones de cáclulo se pueden hacer directamente dentro del propio bucle
           // por ejemplo, el total...
           total += sueldo(i)
           ...etc...
       repetir
       // y otras operaciones (como por ejemplo si se pidiera ordenar los sueldos), se deben hacer fuera dle bucle.
       // por ejemplo el promedio.
       Promedio = (Total /D)
       ...etc...
   Sino
       mensaje "error solo se permite señalar entre 1 y 99 sueldos. Vuelva a señalar un valor correcto."
   fin si
Repetir mientras ((D < 1) ó (D>99))

Hay dos bucles, pero el externo (el que aparece primero) sirve exclusivamente para asegurarse que el jefe responde un valor de empleados entre 1 y 99... una vez responde bien, ese bucle pierde su efecto, de hecho si empieza dando un valor adecuado, ese bucle se ejecuta una sola vez.

Reformulo dichos bucles para que lo veas más claro:

// primer bucle: Aqui te preguntaré hasta que me dés un valor correcto...
   // Tantas veces dé un valor incorrecto, tantas veces preguntará...
Hacer
   D = Preguntar cuantos sueldos quieres tratar (elija un valor entre 1 y 99)?
Repetir mientras ((D < 1) ó (D>99))

// segundo bucle aquí solo pregunto el valor de los sueldos y NO pregunto nada más...
   // la cantidad del bucle es ya conocida: "D veces" (pero empezando desde 0, acaba en 1 menos).
bucle para i desde 0 a D-1
   sueldo(i) = Preguntar a cuanto asciende el sueldo del empleado 'i'            
   total += sueldo(i)    
   ...etc...      
repetir
 
Promedio = (Total /D)
...etc...



En cambio imagina que no está el jefe, te encuentras en la cafetería a los empleados, tu pregunta será entonces: Hay algún empleado aqui? y si uno levanta la mano y dice "si, yo", entonces le preguntas luego (y cuál es tu sueldo?) ... en esete caso el bucle acaba cuando recibes una respuesta de 'no', ya no hay más empleados... y por tanto ya se sale del bucle... el bucle a priori desconocemos cuantas veces se ejecutará, por eso el bucle for, no se aplica en este caso. Y por supuesto con cada respuesta aquí, D aumenta en 1, inicialmente era 0, y si llegara a 99, también se sale sin preguntar a nadie más...
es más como queremos que sea mayor que 0, inicialmente no empezamos preguntando si alguien más es empleado, inicialmente preguntamos el sueldo para asegurarnos que al menos uno nos dé su sueldo, si inicialmente preguntas si hau algún empleado y te dicen que no... saldrías del bucle, pero... al salir del bucle así, tienes 0 empleados... cosa inadmisible, según los requisitos... (esta es la propuesta: preguntar sobre la marcha).

Limpiando el pseudocodigo de comentarios extras, para verlo más nítido.

   D = 0
   i = 0
   // Este bucle se repetirá mientras se indicque 'si' y no se alcance 99 empleados
   Hacer        // la condición se hace alfinal, para asegurarnos que al menos tengamos 1 sueldo.
       sueldo(i) = Preguntar a cuanto asciende el sueldo del empleado 'i'
       total += sueldo(i)
       D += 1  //sumamos un empleado que ACABA de señalar su sueldo.

       massueldos = Preguntar: quiere señalar el sueldo de otro empleado (S/N)
   repetir mientras ((D < 99) y (massueldos = "S" ó "s"))
 
   Promedio = (Total /D)
   ... etc...



Olvídate de la programación por un momento, intenta llevarlo al terreno 'personal', imagina que físicamente haces la pregunta a una o varias personas... mantén ese diálogo interno, y mira si no te resulta absurdo... lo que has escrito... ...pero intenta imaginártelo físicamente, para entenderlo. la programación no es redactar sin sentido y a ver si sale... es copia fidedigna de la realidad. Luego piensa como sucede en la vida real.
Cuando entiendas perfectamente esto, la programación será como beber cerveza, ningún misterio... aunque puedes acabar 'borracho'...  :laugh: :laugh: :laugh:

Hale, a ver si ahora lo pillas...  :rolleyes: :rolleyes:

MAFUS

Buena respuesta. Me quito el sombrero.