C/Visual C - Problemas con ciclo do-while

 
Vista:
sin imagen de perfil
Val: 26
Ha aumentado su posición en 2 puestos en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Problemas con ciclo do-while

Publicado por Ricardo (14 intervenciones) el 21/05/2018 08:40:22
Hola a todos ando haciendo un programa con array unidimensional y esto es lo que llevo hecho hasta ahora:

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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
 
void main() {
 
	int sueldo[100];
	char op[3];
	int i,D,l,a,b=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("\nSalario del empleado %i: ", i + 1);
				scanf_s("%i", &sueldo[i]);
 
				printf("\nDesea introducir otro sueldo? [si-no]: ");
				fflush(stdin);
				gets_s(op);
 
				l = strlen(op);
				for (a = 0; a <= l; a++)
				{
					op[a] = tolower(op[a]);
				}
				b++;
			}
 
		} while (strcmp("si", op) == 0);
 
		for (i = 0; i < D; i++) {
			printf("%i\n", sueldo[i]);
		}
	}
 
	else {
		printf("\nNumero de sueldos a ingresar no valido\n\nSolo se permite ingresar hasta 100 sueldos");
	}
 
system("pause>null");
}

Mi problema es que el programa no se detiene para que yo elija "si" para continuar automaticamente pide el N numero de salarios y los imprime al final; como le hago para que el programa se repita n veces y por cada vez que se repita el programa me permita elegir si deseo continuar o no.
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
Val: 148
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Problemas con ciclo do-while

Publicado por dario (29 intervenciones) el 22/05/2018 06:34:59
Hola, no entiendo muy bien tu codigo. Tienes una linea printf("Desea introducir otro sueldo [si-no]"), pero estas dentro de un bucle FOR el bucle se repite "D" veces si tecleas "no" el bucle siempre se repite hasta "D" veces.
Debes usar un WHILE o DO....WHILE
Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de abzerox
Val: 23
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Problemas con ciclo do-while

Publicado por abzerox (4 intervenciones) el 22/05/2018 06:35:44
Hola, hice algunas modificaciones en tu código, espero sea lo que estas buscando.
Nos comentas.

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
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
 
void main()
{
    char op[3];
    int sueldo[100];
    int i = 0;
    int quantity = 0;
    int isValid = 0;
 
    /* Pregunto cuantos salarios quiere ingresar */
    while (isValid == 0)
    {
        printf("\nCuántos sueldos desea ingresar?: ");
        scanf("%i", &quantity);
        if (quantity < 0 || quantity > 100)
        {
            printf("\nNumero de sueldos a ingresar no valido\n\nSolo se permite ingresar hasta 100 sueldos");
        }
        else
        {
            isValid = 1;
        }
    }
 
    /* Solicito los salarios  */
    isValid = 0;
    while (i < quantity && isValid == 0)
    {
        system("cls");
        printf("\nSalario del empleado %i: ", i + 1);
        scanf("%i", &sueldo[i]);
        if (quantity == 1)
        {
            isValid = 1;
        }
        else
        {
            /* Pregunto si desea seguir ingresando salarios */
            while (strcmp("no", op) != 0 && strcmp("si", op) != 0)
            {
                printf("\nDesea introducir otro sueldo? [si-no]: ");
                scanf("%s", &op);
                if (strcmp("no", op) == 0)
                {
                    isValid = 1;
                }
            }
        }
        i++;
    }
 
    printf("\n************* Salarios ingresados *************\n");
    for (i = 0; i < quantity; i++)
    {
        printf("Salario [%i] = %i\n", i + 1, sueldo[i]);
    }
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 26
Ha aumentado su posición en 2 puestos en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Problemas con ciclo do-while

Publicado por Ricardo (14 intervenciones) el 22/05/2018 14:25:44
Hola muchas gracias por tomarse el tiempo de responder, estuve haciendo modificaciones al programa ya logre estos avances:
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..

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
/*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");
}
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
Val: 89
Ha aumentado 1 puesto en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Problemas con ciclo do-while

Publicado por Thanatos (29 intervenciones) el 23/05/2018 09:11:32
La parte final del enunciado indica que el programa debe usar funciones...

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
#include <stdio.h>    // getchar()
#include <stdbool.h>  // bool
#include <ctype.h>    // tolower()
 
void leerSueldos(int *s, int *);
int sumar(const int *s, int);
void ordenar(int *s, int);
float promediar(const int *s, int);
int mayoresAlProm(const int *s, int);
void mostrar(const int *s, int);
bool continuar(void);
 
int main(void) {
    int sueldos[100] = { 0 };
    int nSueldos = 0;
 
    leerSueldos(sueldos, &nSueldos);
    printf("\nTotal de la nomina ---> %i\n", sumar(sueldos, nSueldos));
 
    printf("Sueldos de menor a mayor:\n");
    ordenar(sueldos, nSueldos);
    mostrar(sueldos, nSueldos);
 
    printf("Total de empleados ---> %i\n", nSueldos);
    printf("Promedio de sueldos --> %.2f\n", promediar(sueldos, nSueldos));
    printf("Mayores al promedio --> %i\n", mayoresAlProm(sueldos, nSueldos));
 
    (void) getchar();
    return 0;
}
 
void leerSueldos(int *sueldos, int *nSueldos) {
    int i = 0;
 
    printf("Ingrese los sueldos de los empleados:\n");
    while (i < 100) {
        printf("Empleado #%i: ", i + 1);
        scanf("%i", &sueldos[i]);
 
        if (sueldos[i] < 0) {
            printf("\n* No se admiten sueldos negativos *\n\n");
        } else {
            ++i;
            if (!continuar()) {
                (void) getchar();
                break;
            }
        }
    }
    *nSueldos = i;
}
 
int sumar(const int *sueldos, int nSueldos) {
    int suma = 0;
 
    for (int i = 0; i < nSueldos; ++i) {
        suma += sueldos[i];
    }
    return suma;
}
 
void ordenar(int *sueldos, int nSueldos) {
    for (int i = 1; i < nSueldos; ++i) {
        int temp = sueldos[i];
        int j = i - 1;
 
        while (j >= 0 && sueldos[j] > temp) {
            sueldos[j + 1] = sueldos[j];
            --j;
        }
        sueldos[j + 1] = temp;
    }
}
 
float promediar(const int *sueldos, int nSueldos) {
    return sumar(sueldos, nSueldos) / (float) nSueldos;
}
 
int mayoresAlProm(const int *sueldos, int nSueldos) {
    int cantidad = 0;
 
    for (int i = 0; i < nSueldos; ++i) {
        float promedio = promediar(sueldos, nSueldos);
        if (sueldos[i] > promedio) {
            ++cantidad;
        }
    }
    return cantidad;
}
 
void mostrar(const int *sueldos, int nSueldos) {
    for (int i = 0; i < nSueldos; ++i) {
        printf("%i  ", sueldos[i]);
    }
    printf("\n");
}
 
bool continuar(void) {
    char resp = '\0';
 
    do {
        printf("Desea continuar? (s / n): ");
        scanf(" %c", &resp);
        resp = (char) tolower(resp);
    } while (resp != 's' && resp != 'n');
 
    return (resp == 's') ? true : false;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 26
Ha aumentado su posición en 2 puestos en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Problemas con ciclo do-while

Publicado por Ricardo (14 intervenciones) el 23/05/2018 11:38:14
Hola muchas gracias por tu comentario y si ya lo tenia presente pero siempre primero hago los programas sin funciones y después con funciones no se asi siento que batallo menos, y pues muchas gracias de nuevo con tu ayuda podre ver que estaba haciendo mal y a prender de ello,
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
Val: 148
Bronce
Ha mantenido su posición en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Problemas con ciclo do-while

Publicado por dario (29 intervenciones) el 23/05/2018 05:33:22
Espero esto te sirva, solo falta mostrar los sueldos de menor a mayor.
Salu2.

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
#include <stdio.h>
#include <string.h>
 
#define MAXIMO 100
 
int main() {
    int j,i=0,flag=1,c=0;
    char opc = 's';
    float sueldos[MAXIMO],suma=0,prom=0;
 
    while (flag) {
    	if (i > 100) {
    		printf("Lo siento, solo pueden registrarse %d empleados",MAXIMO);
    		flag = 0;
		}
		else {
    		printf("Sueldo empleado # %d: ",i+1);
    		scanf("%f",&sueldos[i]);
    		printf("Otro sueldo s/n: ");
    		scanf(" %c",&opc);
 
    		if (opc == 'n')
    			flag = 0;
 
			else
				i++; //cuenta numero de empleados
		}
    }
 
    //calcula la suma de toda la nomina
    for (j=0; j<i+1; j++)
    	suma = suma + sueldos[j];
 
	//calcula el promedio de la nomina
	prom = suma / (i+1);
 
    printf("\nTotal nomina de la empresa %.2f\n",suma);
    printf("Cantidad de empleados capturados %d\n",i+1);
    printf("Promedio de sueldo de la nomina %.2f\n",prom);
 
    //sueldos > promedio
    for (j=0; j<i+1; j++)
    	if (sueldos[j] > prom)
    		c++;
 
	printf("Cantidad de empleados con un sueldo superior al promedio %d",c);
 
    return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 26
Ha aumentado su posición en 2 puestos en C/Visual C (en relación al último mes)
Gráfica de C/Visual C

Problemas con ciclo do-while

Publicado por Ricardo (14 intervenciones) el 23/05/2018 11:43:03
Hola dario muchas gracias por responder mis dudas, ahorita mismo probare tu codigo y lo de ordenar los sueldos eso ya lo tenia hecho así que de nuevo gracias.
Salu2.
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