Azərbaycan dili Bahasa Indonesia Bosanski Català Čeština Dansk Deutsch Eesti English Español Français Galego Hrvatski Italiano Latviešu Lietuvių Magyar Malti Mакедонски Nederlands Norsk Polski Português Português BR Românã Slovenčina Srpski Suomi Svenska Tiếng Việt Türkçe Ελληνικά Български Русский Українська Հայերեն ქართული ენა 中文
Subpage under development, new version coming soon!

Subject: base de datos en C

2010-01-04 17:20:31
Hola, buenas tardes, necesito ayuda con un programa que tengo que hacer en C porque os juro que ando desesperadísimo, no sé cómo puedo hacerlo, no tengo ni la más mínima idea, ya sea porque los profesores no dan bien la materia o porque soy un inepto (más la 2º opción).

Ahí va el programa que tengo que realizar:

Realizar una base de datos de una empresa que permita gestionar los datos personales, laborales y económicos de sus empleados.
La empresa dispone actualmente de 5 empleados y puede llegar a tener 25 como máximo.
Los datos de cada empleado son:
• Nombre: cadena de hasta 25 caracteres.
• Apellidos: cadena de hasta 50 caracteres.
• DNI: cadena de 9 caracteres.
• Datos laborales y económicos (que deberán estar agrupados, ya que pueden ser manejados independientemente de
los datos personales):
o Sueldo bruto anual: cantidad precisada hasta los céntimos de euros.
o Retención: porcentaje, precisado hasta las centésimas, de retención del IRPF.
o Puesto laboral que ocupa en la empresa: cadena de hasta 20 caracteres.

Las operaciones que se han de poder realizar y que se elegirán de un menú, son:
• Insertar un nuevo empleado. En primer lugar se comprobará si hay espacio disponible en la estructura de datos que
representa la información de los empleados. Si no hay espacio se mostrará un mensaje de error. Si hay espacio, se
solicitará, en primer lugar el DNI del empleado a insertar. En caso de que ya exista en la estructura de datos se
mostrará un mensaje de error. En caso contrario, se solicitará el resto de datos personales, laborales y económicos
del nuevo empleado y se procederá a su almacenamiento en dicha estructura de datos.
• Modificar los datos laborales y económicos de un empleado. Se solicitará el DNI del empleado del que se van a
modificar los datos. Se buscará la información correspondiente al empleado. En caso de que no exista ningún
empleado con ese DNI se mostrará un mensaje de error. En caso de que exista se solicitarán sus datos laborales y
económicos y se procederá a su almacenamiento en la estructura de datos.
• Dar de baja a un empleado. Se solicitará el DNI del empleado. Se buscará si existe un empleado con ese DNI. En
caso de que no exista se mostrará un mensaje


Tiene que codificarse en C, tengo que usar arrays y la librería string.h

gracias!
2010-01-04 17:27:34
Deberías borrar esto y copiar tu mensaje a informáticos ( hay un post de esto en freestyle ) creo.
2010-01-04 17:29:39
usando una BBDD o usando ficheros?? es que la cosa cambia radicalmente (supongo que sera usando ficheros de texto o binarios)
2010-01-04 17:32:12
Pero realmente donde tienes el problema? en como organizarlo o en como se programa?xD
2010-01-04 18:36:34
Es usando ficheros de texto
2010-01-04 18:44:58
El problema es que no se cómo empezar, y programar sé pues básico, estoy empezando y he hecho pues lo típico, programa que calcula los caráceteres de una frase, programa que te calcula una potencia, una calculadora... etc, y todo en C.

Nos han dado unas funciones auxiliares para que leamos cadenas de carácteres:
[i]
#include
#include

#define MAX_NOMBRE 25+1

/* prototipos de funciones entrada salida */
void leer_real ( const char mensaje[], double *resultado );
void leer_cadena ( const char mensaje[], const int tam, char resultado[] );

int main(void)
{
char nombre[MAX_NOMBRE];
double real;

/* ejemplo de utilizaci�n de la funci�n leer_real */
leer_real(" Sueldo bruto anual",&real);

/* ejemplo de utilizaci�n de la funci�n leer_cadena */
leer_cadena(" Nombre",MAX_NOMBRE,nombre);

/* presentaci�n de los valores le�dos */
fprintf(stdout, "\n Sueldo Bruto Anual : %f", real);
fprintf(stdout, "\n Nombre: %s",nombre);

return 0;

}


/* ******* FUNCIONES DE ENTRADA SALIDA ************* */


/**********************************************************
* leer_cadena
*
* Argumentos:
* mensaje: P. Dato, pasado por referencia por ser una cadena de caracteres. Mensaje a mostrar
* tam: P. Dato, pasado por valor. n�mero m�ximo de caracteres que pueden almacenarse en resultado
* resultado: P. Resultado pasado por referencia. L�nea le�da
***********************************************************/
void leer_cadena ( const char mensaje[], const int tam, char resultado[] )
{
int valido; /* indica si el valor introducido es v�lido o no */
char aux[tam+1]; /* almac�n temporal para los datos tecleados */


fprintf ( stdout, "%s: ", mensaje );
fflush ( stdin );
fgets ( aux, tam+1, stdin );
valido = ( aux[strlen(aux)-1]== '\n');
while ( !valido )
{

fprintf ( stdout, "ERROR: %s no v�lido\n", mensaje );
fprintf ( stdout, "%s: ", mensaje );
fflush ( stdin );
fgets ( aux, tam+1, stdin );
valido = ( aux[strlen(aux)-1]== '\n' );
}
aux[strlen(aux)-1]= '\0';
strcpy ( resultado, aux );
}

/**********************************************************
* leer_real
*
* Argumentos:
* mensaje: P. Dato, pasado por referencia por ser una cadena de caracteres. Mensaje a mostrar
* resultado: P. Resultado pasado por referencia. N�mero le�do
***********************************************************/
void leer_real ( const char mensaje[], double *resultado )
{
char aux[50]; /* almac�n temporal para la l�nea tecleada */
double valido; /* indica si el valor introducido es v�lido o no */

fprintf ( stdout, "%s: ", mensaje );
fflush ( stdin );
fgets ( aux, 50, stdin );


valido= sscanf( aux, "%lf", resultado)==1?1:0;

while ( valido==0 )
{
fprintf ( stdout, "ERROR: %s no v�lido\n", mensaje );
fprintf ( stdout, "%s: ", mensaje );
fflush ( stdin );
fgets ( aux, 50, stdin );

valido= sscanf( aux, "%lf", resultado)==1?1:0;

}
}
[/i]

La de "leer_real" sinceramente no la entiendo xD, y la de leer cadena no llego a entenderla del todo, osea que tu metes la cadena de carácteres cuando estás dentro del algoritmo parametrizado? cuando pone el 'fgets'?

Por cierto, esa función no me compila, me da el error 'ISO C90 forbids variable-size array' en la línea de 'char aux[tam+1]; /* almac�n temporal para los datos tecleados */'
2010-01-04 22:24:50
Las dos funciones tienen la misma estructura: les pasas una cadena por parámetro que se mostrará al usuario para indicarle qué dato deben rellenar. Luego leen un dato de la entrada estándar y entran en un bucle en el que comprueban la validez del dato leído. Si el dato es válido, lo devuelven. Si no, muestran un mensaje de error y vuelven a solicitar el dato.

Entiendo que, al ser un ejercicio básico, el funcionamiento que te piden del programa será el siguiente: al principio del programa leerás todos los datos del fichero y los guardarás en un array en memoria. Luego harás las operaciones sobre los datos de memoria, y por último, tras cada operación realizada, guardarás el array entero en el fichero de texto.

Te aconsejaría que para hacer un programa "complejo" como éste, primero te hagas un esquema en una hoja de qué es lo que quieres programar. Intenta dividir el problema en partes más pequeñas que puedas manejar. Algo así:

.......................[Menú]
...........................|
.......----------------------------------
.......|..................|.....................|
[Inserción]...[Modificación].........[Baja]

Y luego cada una de las opciones del menú se compondría de otras funciones como la de leer la BD, mostrar los empleados de la BD, pedir los datos del empleado, insertar el empleado, modificarlo, borrarlo...

Por último, cuando ya lo tengas claro, ponte a programar. Así verás que hay cosas que puedes reutilizar, como el listado de empleados de la BD que te sirve tanto para la opción de modificar como para la de dar de baja. Y así lo haces bien a la primera, no tienes que retocar las cosas una vez las has hecho porque te das cuenta de que cambiando esta cosa o aquélla puedes aprovechar la función.

Espero que esto te sirva de ayuda para, al menos, ponerte a trabajar :)
2010-01-04 23:48:12
yo tengo una hecha sobre Jugadores de futbol xD, simplemente deberias cambiar los printf JAJAJA..
sobre alta,modificacion,baja...

totalmente en C , con ficheros de texto...
pero cuando le des caña, no te la voy a pasar y que luego no tengas ni idea xD
2010-01-04 23:52:05
se ve facil aunque hace mucho que no hago algo en c de echo cuando inteno hacer algo parece mas php que nada que c XD jaja
2010-01-05 23:21:13
a mi no me gusta C :P

Pero convivo con él xD
2010-01-06 01:46:45
a mí sólo me gusta su primo mayor c++ :P ¡Qt rulez!
2010-01-06 05:07:05
estas programando en qt ? y algo de gtk as probado ?
2010-01-06 09:38:18
hace tiempo que no pruebo QT. siguen las librerías "importantes" siendo de pago como en algunas versiones anteriores?? (sino recuerdo mal, una libería de sql)
(edited)
2010-01-06 17:37:35
A mi me gusta java x)
2010-01-07 10:51:08
Si, lo que me has dicho es lo que me ha dicho un profesor, y ya he empezado a hacerlo de ese modo, muchas gracias. Por ahora esto es lo que tengo a ver que te parece:

#include
#include

#define MAX_NOMBRE 26

void leer_real ( const char mensaje[], double *resultado );
void leer_cadena ( const char mensaje[], const int tam, char resultado[] );
void MENU(int opcion);
double RETENCION(double Sueldo);
void Base();


int main(void)
{
struct Datos
{
double Sueldo;
double Retencion;
char Puesto[25];
}
struct Empleados
{
char Nombre[25];
char Apellido[50];
char DNI[9];
struct Datos Datos;
}
struct Empleados personal[25];
int opcion;

MENU(opcion);

return 0;
}

void leer_real ( const char mensaje[], double *resultado )
{
char aux[50]; /* almac?n temporal para la l?nea tecleada */
double valido; /* indica si el valor introducido es v?lido o no */

fprintf ( stdout, "%s: ", mensaje );
fflush ( stdin );
fgets ( aux, 50, stdin );


valido= sscanf( aux, "%lf", resultado)==1?1:0;

while ( valido==0 )
{
fprintf ( stdout, "ERROR: %s no v?lido\n", mensaje );
fprintf ( stdout, "%s: ", mensaje );
fflush ( stdin );
fgets ( aux, 50, stdin );

valido= sscanf( aux, "%lf", resultado)==1?1:0;

}
}

void leer_cadena ( const char mensaje[], const int tam, char resultado[] )
{
int valido; /* indica si el valor introducido es v?lido o no */
char aux[256]; /* almac?n temporal para los datos tecleados */


fprintf ( stdout, "%s: ", mensaje );
fflush ( stdin );
fgets ( aux, tam+1, stdin );
valido = ( aux[strlen(aux)-1]== '\n');
while ( !valido )
{

fprintf ( stdout, "ERROR: %s no v?lido\n", mensaje );
fprintf ( stdout, "%s: ", mensaje );
fflush ( stdin );
fgets ( aux, tam+1, stdin );
valido = ( aux[strlen(aux)-1]== '\n' );
}
aux[strlen(aux)-1]= '\0';
strcpy ( resultado, aux );
}
void MENU(int opcion)
{
opcion=0;
Base;



fprintf(stdout, "BIENVENIDO A LA BASE DE DATOS DE LA EMPRESA\n");
fprintf(stdout, "\n");
fprintf(stdout, "MENU DE LA BASE DE DATOS\n");
fprintf(stdout, "\n");
fprintf(stdout, "1.Insertar nuevo empleado en la base de datos.\n");
fprintf(stdout, "2.Modificar datos de algun empleado\n");
fprintf(stdout, "3.Dar de baja a algun empleado\n");
fprintf(stdout, "4.Listar todos los datos de todos los empleados.\n");
fprintf(stdout, "\n");
fprintf(stdout, "Seleccione una opcion\n");
fscanf(stdin, "%d", &opcion);
switch(opcion)
{
case 1:
break;
case 2:
break;
case 3:
break;
case 4:
break;
default:
break;
}
}
double RETENCION(double Sueldo)
{
/*Vamos a poner una retencion del 12% para todos nuestros empleados*/
Sueldo=0.12*Sueldo;
return Sueldo;
}
void Base()
{
const char nombre1[]={'M','a','n','u','e','l'};
const char apellido1[]={'A','r','a','n','d','a'};
const char DNI1[]={5,3,5,6,5,0,0,6,'F'};
const double sueldo1=4501.89;
const char puesto1[]={'M','a','x','i','m','o',' ','A','c','c','i','o','n','i','s','t','a'};

const char nombre2[]={'A','l','b','e','r','t','o'};
const char apellido2[]={'C','a','m','a','c','h','o'};
const char DNI2[]={5,3,5,6,5,5,5,3,'Y'};
const double sueldo2=3845.34;
const char puesto2[]={'D','i','r','e','c','t','o','r',' ','J','e','f','e'};

const char nombre3[]={'A','l','b','e','r','t','o'};
const char apellido3[]={'G','a','l','a','n'};
const char DNI3[]={5,3,5,1,9,0,8,6,'Z'};
const double sueldo3=3029.95;
const char puesto3[]={'V','i','c','e','p','r','e','s','i','d','e','n','t','e'};

const char nombre4[]={'R','o','b','e','r','t','o'};
const char apellido4[]={'B','e','n','i','t','o'};
const char DNI4[]={5,3,5,0,1,2,3,4,'B'};
const double sueldo4=3075.03;
const char puesto4[]={'J','e','f','e',' ','d','e',' ','P','r','e','n','s','a'};

const char nombre5[]={'C','r','i','s','t','o','f','e','r'};
const char apellido5[]={'G','o','n','z','a','l','e','z'};
const char DNI5[]={5,3,5,6,5,0,8,6,'K'};
const double sueldo5=2901.45;
const char puesto5[]={'J','e','f','e',' ','d','e',' ','S','e','g','u','r','i','d','a','d'};

strcpy(Empleados.Nombre ,nombre1);
strcpy(Empleados.Apellido ,apellido1);
strcpy(Empleados.DNI ,DNI1);
Empleados.Sueldo=sueldo1;
Empleados.retencion=RETENCION(sueldo1);
strcpy(Empleados.puesto ,puesto1);
Empleados personal[0]=Empleados;

strcpy(Empleados.Nombre ,nombre2);
strcpy(Empleados.Apellido ,apellido2);
strcpy(Empleados.DNI ,DNI2);
Empleados.Sueldo=sueldo2;
Empleados.retencion=RETENCION(sueldo2);
strcpy(Empleados.puesto ,puesto2);
Empleados personal[1]=Empleados;

strcpy(Empleados.Nombre ,nombre3);
strcpy(Empleados.Apellido ,apellido3);
strcpy(Empleados.DNI ,DNI3);
Empleados.Sueldo=sueldo3;
Empleados.retencion=RETENCION(sueldo3);
strcpy(Empleados.puesto ,puesto3);
Empleados personal[2]=Empleados;

strcpy(Empleados.Nombre ,nombre4);
strcpy(Empleados.Apellido ,apellido4);
strcpy(Empleados.DNI ,DNI4);
Empleados.Sueldo=sueldo4;
Empleados.retencion=RETENCION(sueldo4);
strcpy(Empleados.puesto ,puesto4);
Empleados personal[3]=Empleados;

strcpy(Empleados.Nombre ,nombre5);
strcpy(Empleados.Apellido ,apellido5);
strcpy(Empleados.DNI ,DNI5);
Empleados.Sueldo=sueldo5;
Empleados.retencion=RETENCION(sueldo5);
strcpy(Empleados.puesto ,puesto5);
Empleados personal[4]=Empleados;
}
2010-01-07 17:40:54
fprintf(stdout, ...);
¿Por qué no usas printf y te ahorras el stdout? Lo mismo con scanf y fscanf... :P

const char nombre1[]={'M','a','n','u','e','l'};
Las cadenas de texto tienen que tener el carácter \0 al final para indicar el final de la cadena. Además, es más cómodo definirlas así (creo que es así, que hace mucho que no programo en C :P), y de paso te ahorras ese \0:
const char nombre1[]="Manuel";

void MENU(int opcion)
{
opcion=0;
...

¿Para qué creas un parámetro si antes de leer su valor ya se lo estás cambiando? :P

(edited)