Trabajo de programación

Si eres principiante y tienes alguna consulta entra en este foro.
Responder
Mensaje
Autor
Keux00
Mensajes: 3
Registrado: 04/07/2019 2:43 am

Trabajo de programación

#1 Mensaje por Keux00 » 04/07/2019 2:53 am

Buenas! Soy nuevo en este foro y la verdad quería ayuda sobre un trabajo en C# que estoy haciendo para programación en la universidad. Se me pide hacer un programa para gestionar empleados de una empresa y hasta ahí todo bien, en principio se como hacerlo. Mi duda entra al tener que introducir los datos de un nuevo empleado, tengo problemas intentando meter el nombre y los apellidos, en principio quiero que se puedan meter nombres compuestos y apellidos pero he buscado por todas partes y he usado el scanf, gets y sscanf (este último es que he acabado "usando").

Dejo mi código por aquí abajo, tened en cuenta que soy un principiante en esto y puede que el código no sea lo más bonito del mundo.

Código: Seleccionar todo

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

int main(void)
{
	unsigned long int numidentif;
	char entrada[81]="";
	char nombre[20]="", nombre2[20]="";
	char apellido[20]="", apellido2[20]="";
	int n, opcion, anyosedad, anyonacim;
	int proyectos[10];
	
	do
	{
		printf("\n 1. Introducir un nuevo empleado");
		printf("\n 2. Eliminar un empleado");
		printf("\n 3. Modificar datos de un empleado");
		printf("\n 4. Proyectos en los que participa un empleado");
		printf("\n 5. Asignar a un empleado un nuevo proyecto");
		printf("\n 6. Dar de baja un proyecto de un empleado");
		printf("\n 7. Ver lista de todos los empleados y sus datos");
		printf("\n 8. Guardar en fichero");
		printf("\n 9. Cargar fichero");
		printf("\n 10. Salir");
	
	 do
        {
            printf("\n Introduce opcion (1-10): ");
            scanf("%d", &opcion);
            
        } while (opcion< 1 || opcion> 10);

	 switch (opcion)
        {
            case 1: printf("\n  Introduce el nuevo empleado: ");
            		printf("\n ----------------------------------");
                    printf("\n  Introduce el numero identificativo del empleado: ");
                    scanf("%lu",&numidentif);
                    printf( "\n Escribe su primer y segundo nombre, separados por un espacio: " );
                    gets( entrada );
   		    sscanf( entrada, "%s %s", nombre, &nombre2 );
                    printf( "\n Escribe su primer y segundo apellido, separados por un espacio: " );
                    gets( entrada );
   		    sscanf( entrada, "%s %s", apellido, &apellido2 );
                    printf("\n Introduce su edad (en anyos): ");
                    scanf("%d",&anyosedad);
                    printf("\n Introduce su anyo de nacimiento: ");
                    scanf("%d",&anyonacim);
                    printf("\n Numero de proyectos en los que trabaja: ");
                    scanf("%d",&proyectos[10]);
                    break;
					
            /* case 2: printf("\n Escoge el empleado a eliminar: ");*/
                    
            /*case 3: printf("\n  ¿Que empleado deseas modificar?: ");*/
                    
             // Como se puede ver son 10 opciones pero todavia no he terminado la primera :(
        }
        } while (opcion!= 10);

    return 0;
}

dariodr01
Mensajes: 35
Registrado: 18/07/2017 1:35 am

Re: Trabajo de programación

#2 Mensaje por dariodr01 » 04/07/2019 5:20 am

Es tu mismo codigo con dos variaciones.
Te dejo las variaciones en comentarios en el codigo, lee acerca de fgets.
Salu2.

Código: Seleccionar todo

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

int main(void)
{
	unsigned long int numidentif;
	char entrada[81]="";
	char nombre[20]="", nombre2[20]="";
	char apellido[20]="", apellido2[20]="";
	int n, opcion, anyosedad, anyonacim;
	int proyectos[10];

	do
	{
		printf("\n 1. Introducir un nuevo empleado");
		printf("\n 2. Eliminar un empleado");
		printf("\n 3. Modificar datos de un empleado");
		printf("\n 4. Proyectos en los que participa un empleado");
		printf("\n 5. Asignar a un empleado un nuevo proyecto");
		printf("\n 6. Dar de baja un proyecto de un empleado");
		printf("\n 7. Ver lista de todos los empleados y sus datos");
		printf("\n 8. Guardar en fichero");
		printf("\n 9. Cargar fichero");
		printf("\n 10. Salir");

	 do
        {
            printf("\n Introduce opcion (1-10): ");
            scanf("%d", &opcion);

        } while (opcion< 1 || opcion> 10);

	 switch (opcion)
        {
            case 1:
                printf("\n  Introduce el nuevo empleado: ");
            	printf("\n ----------------------------------");
                printf("\n  Introduce el numero identificativo del empleado: ");
                scanf("%lu",&numidentif); getchar();
                printf( "\n Escribe su primer y segundo nombre, separados por un espacio: " );
                fgets(entrada,31,stdin); //debes usar fgets
                sscanf( entrada, "%s %s", nombre, &nombre2 );
                printf( "\n Escribe su primer y segundo apellido, separados por un espacio: " );
                fgets(entrada,31,stdin); //aca tambien
                sscanf( entrada, "%s %s", apellido, &apellido2 );
                printf("\n Introduce su edad (en anyos): ");
                scanf("%d",&anyosedad);
                printf("\n Introduce su anyo de nacimiento: ");
                scanf("%d",&anyonacim);
                printf("\n Numero de proyectos en los que trabaja: ");
                scanf("%d",&proyectos[10]);
            break;

            /* case 2: printf("\n Escoge el empleado a eliminar: ");*/

            /*case 3: printf("\n  ¿Que empleado deseas modificar?: ");*/

             // Como se puede ver son 10 opciones pero todavia no he terminado la primera :(
        }
    } while (opcion!= 10);

    return 0;
}


mollok
Mensajes: 511
Registrado: 30/01/2018 9:47 am
Ubicación: Mallorca, España

Re: Trabajo de programación

#3 Mensaje por mollok » 04/07/2019 5:32 am

fgets toma una cadena hasta, inclusive, encontrar un carácter de nueva línea.
scanf hace algo parecido, pero sin tomar el carácter de nueva línea (que se queda en el buffer) si le das el argumento %[^\n]. También puedes darle un número máximo de caracteres a obtener mediante %80[^\n] (en este caso para 80 caracteres).

Pero tal vez te interese crearte función personalizada al estilo:

Código: Seleccionar todo

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

void obtener_cadena(char buffer[], size_t buff_len) {
    char *pc;
    // Se toma la frase
    fgets(buffer, buff_len, stdin);
    // Si existe un carácter de nueva línea se transforma en final de línea.
    // No me interesa que la frase me salte automáticamente una línea al ser escrita
    if((pc = strchr(buffer, '\n')))
        *pc = '\0';
    else
        // Y sino es que la frase adquirida va mas allá de lo que quedó en mi buffer,
        // descarto el resto del buffer de stdin para evitar extraños cuando vuelva a pedir
        // otra frase.
        fseek(stdin, 0, SEEK_END);
}

int main(void) {
    char cadena[80];

    printf("> ");
    obtener_cadena(cadena, sizeof(cadena)-1);

    printf("%s\n", cadena);
}
while(is_alive(yourself)) {
    make_true(yourself, yourdreams);
}

Keux00
Mensajes: 3
Registrado: 04/07/2019 2:43 am

Re: Trabajo de programación

#4 Mensaje por Keux00 » 04/07/2019 7:10 am

Muchísimas gracias a ambos, la verdad es que había leído acerca del fgets pero me creía que se usaba sólo para ficheros, en plan para un archivo a parte del programa y que no se podía usar en el mismo sin hacer referencia al archivo. En fin, me habré liado yo solo :P

Keux00
Mensajes: 3
Registrado: 04/07/2019 2:43 am

Re: Trabajo de programación

#5 Mensaje por Keux00 » 05/07/2019 6:00 am

Buenas de nuevo! Se me vuelve a atrancar una parte y necesito ayuda. Dejo una explicación debajo del código con lo que me atranco. Muchas gracias y perdón por molestar.

Código: Seleccionar todo

case 1:
                /*
                printf("\n  Introduce el nuevo empleado: ");
            	printf("\n ----------------------------------");
                printf("\n  Introduce el numero identificativo del empleado: ");
                scanf("%lu",&numidentif); getchar();
                printf( "\n Escribe su primer y segundo nombre, separados por un espacio: " );
                fgets(entrada,31,stdin);
                sscanf( entrada, "%s %s", nombre, &nombre2 );
                printf( "\n Escribe su primer y segundo apellido, separados por un espacio: " );
                fgets(entrada,31,stdin);
                sscanf( entrada, "%s %s", apellido, &apellido2 );
                printf("\n Introduce su edad (en anyos): ");
                scanf("%d",&anyosedad);
                while (anyosedad>=65 && anyosedad<=17)
                {
					printf("\n El empleado ha de tener menos de 65 anyos y 18 o mas anyos");
					printf("\n Introduce de nuevo una edad valida: ");
					scanf("%d",&anyosedad);
				}
                printf("\n Introduce su anyo de nacimiento: ");
                scanf("%d",&anyonacim);
                while (anyonacim >= 2019 || anyonacim<=1954 || anyonacim>=2002)
				{
					printf("\n El empleado ha de tener menos de 64 anyos y 18 o mas anyos");
					printf("\n Introduce de nuevo un anyo de nacimiento valido: ");
					scanf("%d",&anyonacim);
				}
				*/
                printf("\n Numero de proyectos en los que trabaja: ");
                scanf("%d",j);
                while (proyectos[j]>=11)
            	{
            		printf("\n No puede tener mas de 10 proyectos");
            		printf("\n Asignale 10 proyectos o menos: ");
            		scanf("%d",j);
		}
		break;
		
El problema está a partir de la parte que te pide el numero de proyectos, como digo arriba, necesito que esos proyectos se queden almacenados (con su nombre y presupuesto) y que luego al solicitar los datos del empleado aparezca dicho proyecto, a parte también necesito asignar un trabajo a un empleado y dar de baja de un proyecto a un empleado, con un número máximo de 10 proyectos.

Responder

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 10 invitados