Necesito ayuda urgente! Antes del 20/5/2013

Javi Rodriguez
16 de Mayo del 2013
Antes de nada gracias por ayudarme. Tengo que hacer un programa en C de gestión de un almacén de componentes electrónicos y me he quedado atascado a la hora de hacer el pedido, contactad conmigo para que os pase el código por favor.
El enunciado es el siguiente:
Una empresa electrónica desea gestionar su almacén de componentes mediante una aplicación informática. La información disponible para cada componente es la siguiente, aunque se pueden añadir otros datos si se estima necesario:
-Tipo de componente(resistencia, bobina o condensador)
-Cantidad disponible
-Valor nominal(ohmios, henrios o faradios, respectivamente)
-Tolerancia(por ejemlo: 1%, 5% o 10%)
-Precio unitario(euros)
El programa mostrará al usuarioun menú con las siguientes opciones:
1.-Dar de alta o modificar datos de un componente. Permite introducir los datos de un nuevo componente desde el teclado o desde un archivo de texto.
2.-Búsqueda un componente individual. Permite buscar en la case de datos un determinado componente a partir del tipo, valor nominal y tolerancia. El programa indicará si existe, la cantidad disponible y el precio unitario.
3.-Búsqueda paramétrica de componentes. Permite buscar componentes de un determinado tipo para intervalos de su valor nominal y tolerancia. Por ejemplo, resistencia entre 10 y 100 ohmios y tolerancia menor del 5%. El programa presentará una lista ordenada de menor a mayor valor nominal.
4.-Hacer un pedido.El usuario podrá hacer un pedido de un componente siempre que haya unidades disponibles. El programa indicará el importe total del pedido y descontará el número de unidades correspondiente. Si no hay unidades suficientes, no se podrá hacer el pedido, pero se podrá hacer una compra previa de componentes ara poder realizarlo.
5.-Valoración del almacén. El programa mostrará el valor económico actual del almacén, por ejemplo, el valor total del mismo o por tipo de componente.
6.-Salir del programa. Si no se han guardado las nóminas en un archivo, el programa avisará al usuario y le dará la oportunidad de hacerlo antes de salir.

Nota:
1.-Es obligatorio que el programa se realice con funciones.
2.-Está prohibido usar variables globales.
3.-Pueden usarse funciones de la biblioteca string.h
Muchas gracias por la atención. =)


El código es el siguiente:

#include
#include
#include
#include

#define NOMBRE_DB "BasedeDatos.txt"
#define RESISTENCIA "resistencia"
#define CONDENSADOR "condensador"
#define BOBINA "bobina"

// Tipos de componentes posibles.
enum TipoComponente
{
TIPO_RESISTENCIA = 1,
TIPO_CONDENSADOR,
TIPO_BOBINA
};

// Estructura del componente.
struct Componente
{
int tipo;
int cantidad;
int valor;
int tolerancia;
float precio;
};

// Firma de las funciones
int Menu();
void AltaComponente();
void AltaComponenteFichero();
int nComponentesFichero(FILE* file);
char* ToLower(char *str);
void BuscarComponente();
void BuscarComponenteParametrico();
void HacerunPedido();
void ordenaBurbuja(struct Componente l [], int nElem);
void valoracionAlmacen();
// Funcion main
int main()
{
int opcion = 0;
do
{
opcion = Menu();
switch(opcion)
{
case 1:
AltaComponente();
break;
case 2:
AltaComponenteFichero();
break;
case 3:
BuscarComponente();
break;
case 4:
BuscarComponenteParametrico();
break;
case 5:
HacerunPedido();
break;
case 6:
valoracionAlmacen();
break;
case 7:
break;
default:
break;
}

system("cls");
}
while(opcion != 7);
return 0;
}

// Devuelve la opcion elegida
int Menu()
{
int opcion = 0;

do
{
printf("******************************************n");
printf("*** ALMACEN COMPONENTES ELECTRONICOS ***n");
printf("******************************************nn");
printf("Elija una opcion:nn");
printf(" 1 Dar de alta componenten");
printf(" 2 Dar de alta componente desde ficheron");
printf(" 3 Busqueda Individualn");
printf(" 4 Busqueda Parametrican");
printf(" 5 Hacer un pedidon");
printf(" 6 Valoracion del almacenn");
printf(" 7 Salir del programann");
printf("Opcion: ");
scanf("%d", &opcion);
fflush(stdin);
}
while(opcion < 1 || opcion > 7);

return opcion;
}

// Damos de alta a un componente a traves de la consola.
void AltaComponente()
{
struct Componente comp;

FILE* file = fopen(NOMBRE_DB, "a+b");

// Comprobamos si hemos abierto el fichero.
if(!file)
{
printf("No se ha podido crear el fichero.n");
exit(1);
}
fflush(stdin);
// Obtenemos los valores del teclado
printf("nTipo de Componente (resistencia, condensador, bobina): ");
char componente [12];
scanf("%s", componente);
fflush(stdin);

// En el fichero guardamos un 1 si es una resistencia, un 2 si es un condensador, o un 3 si es una bobina
// Asi simplificamos la lectura del fichero.
if(!strcmp(ToLower(componente), RESISTENCIA))
comp.tipo = TIPO_RESISTENCIA;
else if(!strcmp(ToLower(componente), CONDENSADOR))
comp.tipo = TIPO_CONDENSADOR;
else if(!strcmp(ToLower(componente), BOBINA))
comp.tipo = TIPO_BOBINA;
else
{
printf("No existe ese componenten");
return;
}

printf("nCantidad: ");
scanf("%d", &comp.cantidad);
fflush(stdin);
printf("nValor: ");
scanf("%d", &comp.valor);
fflush(stdin);
printf("nTolerancia (1, 5 o 10): ");
scanf("%d", &comp.tolerancia);
fflush(stdin);
printf("nPrecio Unitario: ");
scanf("%f", &comp.precio);
fflush(stdin);

fprintf(file, "%d,%d,%d,%d,%f;", comp.tipo, comp.cantidad, comp.valor, comp.tolerancia, comp.precio);
fclose(file);

// Mostramos la informacion escrita en el fichero.
printf("Anadido %d %s con valor %d con tolerancia %d y un precio/u de %fn", comp.cantidad, componente, comp.valor, comp.tolerancia, comp.precio);

system("pause");
}

// Función que a partir de un fichero con Componentes, añade a nuestra base de datos esos componentes.
void AltaComponenteFichero()
{
char nombre [20]; // Nombre del fichero
FILE *filer = NULL;
FILE *filew = NULL;
struct Componente aux; // Auxilizar

fflush(stdin); // Limpiamos buffer de teclado
printf("Nombre del fichero:n ");
scanf("%s", nombre);
fflush(stdin);

// Abrimos ficheros.
filer = fopen(nombre, "rb");
filew = fopen(NOMBRE_DB, "a+b");
fseek(filew, 0, SEEK_END);

if(!filer)// Si no encontramos el fichero, mostramos mensaje de error y nos salimos de la funcion.
{
printf("Error, no se ha encontrado el ficheron");
exit(1);
}

int i = nComponentesFichero(filer); // Obtenemos el numero de Componentes.

while(i > 0) // Hasta que no escribamos todo el fichero, no paramos.
{
fscanf(filer, "%d,%d,%d,%d,%f;", &aux.tipo, &aux.cantidad, &aux.valor, &aux.tolerancia, &aux.precio);
printf("nAnadido %d %d con valor %d con tolerancia %d y un precio/u de %fn", aux.cantidad, aux.tipo, aux.valor, aux.tolerancia, aux.precio);
fprintf(filew, "%d,%d,%d,%d,%f;", aux.tipo, aux.cantidad, aux.valor, aux.tolerancia, aux.precio);
i--;
}

// Cerramos los ficheros.
fclose(filew);
fclose(filer);

system("pause");
}

// Nos devuelve el numero de Componentes que hay en el fichero.
int nComponentesFichero(FILE* file)
{

int i = 0;
struct Componente aux; // variable auxiliar, no se usa para nada.
while(!feof(file))
{
fscanf(file, "%d,%d,%d,%d,%f;", &aux.tipo, &aux.cantidad, &aux.valor, &aux.tolerancia, &aux.precio);
++i;
}
rewind(file); // "Limpiamos" el buffer de el archivo.
return (i-1); // No se porque razon devuelve siempre uno de mas.
}

// Convierte las mayusculas a minusculas
char* ToLower(char *str)
{
int i = 0;
for(i = 0; i < strlen(str); ++i)
str[i] = tolower(str[i]);

return str;
}

// Busca un componente a partir de su tipo, valor nominal y tolerancia
void BuscarComponente()
{
char componente[12];
int tipo = -1;
printf("¿Componente a buscar?n");
scanf("%s", componente);
fflush(stdin);

if(!strcmp(ToLower(componente), RESISTENCIA))
tipo = TIPO_RESISTENCIA;
else if(!strcmp(ToLower(componente), CONDENSADOR))
tipo = TIPO_CONDENSADOR;
else if(!strcmp(ToLower(componente), BOBINA))
tipo = TIPO_BOBINA;
else
{
printf("No existe ese componenten");
return;
}

int valor = 0;
printf("¿Valor nominal?n");
scanf("%d", &valor);
fflush(stdin);

int tolerancia = 0;
printf("¿Tolerancia?n");
scanf("%d", &tolerancia);
fflush(stdin);

// Abrimos ficheros.
FILE *file = fopen(NOMBRE_DB, "rb");

if(!file)// Si no encontramos el fichero, mostramos mensaje de error y nos salimos de la funcion.
{
printf("Error, no se ha encontrado el ficheron");
fclose(file);
exit(1);
}

int i = nComponentesFichero(file); // Obtenemos el numero de Componentes.
struct Componente aux;
int total=0;

while(i > 0) // Hasta que no escribamos todo el fichero, no paramos.
{
fscanf(file, "%d,%d,%d,%d,%f; ", &aux.tipo, &aux.cantidad, &aux.valor, &aux.tolerancia, &aux.precio);
if(tipo == aux.tipo && valor == aux.valor && tolerancia == aux.tolerancia)
{
total+=aux.cantidad;
printf("Cantidad: %d Precio unitario: %fn", aux.cantidad, aux.precio);
}
i--;
}
printf("nTOTAL:%dn", total);
fclose(file);

system("pause");
}

// Busca un componente a partir de su tipo, un rango de valor nominal y un rango de tolerancia
void BuscarComponenteParametrico()
{
char componente[12];
int tipo = -1;
printf("¿Componente a buscar?n");
scanf("%s", componente);
fflush(stdin);

if(!strcmp(ToLower(componente), RESISTENCIA))
tipo = TIPO_RESISTENCIA;
else if(!strcmp(ToLower(componente), CONDENSADOR))
tipo = TIPO_CONDENSADOR;
else if(!strcmp(ToLower(componente), BOBINA))
tipo = TIPO_BOBINA;
else
{
printf("No existe ese componenten");
return;
}

int minimo = 0, maximo = 0;
printf("¿Rango del valor nominal? (min-max)n");
scanf("%d-%d", &minimo, &maximo);
fflush(stdin);

int toleranciamin = 0;
int toleranciamax = 0;
printf("¿Rango de tolerancia? (min-max)n");
scanf("%d-%d", &toleranciamin, &toleranciamax);
fflush(stdin);

// Abrimos ficheros.
FILE *file = fopen(NOMBRE_DB, "rb");

if(!file)// Si no encontramos el fichero, mostramos mensaje de error y nos salimos de la funcion.
{
printf("Error, no se ha encontrado el ficheron");
fclose(file);
exit(1);
}

int i = nComponentesFichero(file); // Obtenemos el numero de Componentes.
int j = 0;
struct Componente aux;
struct Componente lista[i]; //Ponemos un limite de 30 componentes mostrados.

while(i > 0) // Hasta que no escribamos todo el fichero, no paramos.
{
fscanf(file, "%d,%d,%d,%d,%f; ", &aux.tipo, &aux.cantidad, &aux.valor, &aux.tolerancia, &aux.precio);
if(aux.tipo == tipo && aux.valor < maximo && aux.valor > minimo && aux.tolerancia > toleranciamin && aux.tolerancia < toleranciamax)
{
lista[j] = aux;//printf("Añadido %d %d con valor %d con tolerancia %d y un precio/u de %fn", aux.cantidad, aux.tipo, aux.valor, aux.tolerancia, aux.precio);
j++;
}
i--;

}

ordenaBurbuja(lista, j);

for(i = 0; i < j; i++)
printf("%d %s con valor %d, tolerancia %d y precio %fn", lista[i].cantidad, componente, lista[i].valor, lista[i].tolerancia, lista[i].precio);


fclose(file);

system("pause");
}

// Ordeacion por metodo de la burbuja
void ordenaBurbuja(struct Componente l[], int nelem)
{
int i;
struct Componente aux;
int hayPermuta = 1;
do
{
hayPermuta = 0;
for(i = 1; i < nelem; i++)
if(l[i-1].valor > l[i].valor)
{
aux = l[i-1];
l[i-1] = l[i];
l[i] = aux;
hayPermuta = 1;
}
}
while((hayPermuta == 1) && (nelem-- > 0));
}

void HacerunPedido()
{
struct Componente compo;
FILE* file = fopen(NOMBRE_DB, "a+b");

// Comprobamos si hemos abierto el fichero.
if(!file)
{
printf("No se ha podido crear el fichero.n");
exit(1);
}
fflush(stdin);
char componente[12];


printf("Cual es el pedido?n");
gets(componente);
fflush(stdin);

if(!strcmp(ToLower(componente), RESISTENCIA))
compo.tipo = TIPO_RESISTENCIA;
else if(!strcmp(ToLower(componente), CONDENSADOR))
compo.tipo = TIPO_CONDENSADOR;
else if(!strcmp(ToLower(componente), BOBINA))
compo.tipo = TIPO_BOBINA;
else
{
printf("No existe ese componenten");
return;
}

printf("Cantidad?n");
scanf("%d", &compo.cantidad);
printf("Valor nominal y tolerancia(1, 5 o 10)?n");
scanf("%d %d", &compo.valor, &compo.tolerancia);
printf("Cual es su precio?(en euros)n");
scanf("%f", &compo.precio);
fflush(stdin);

int i = nComponentesFichero(file); // Obtenemos el numero de Componentes.
struct Componente aux;
float total = 0;
while(i > 0) // Hasta que no leamos no paramos
{
fscanf(file, "%d,%d,%d,%d,%f; ", &aux.tipo, &aux.cantidad, &aux.valor, &aux.tolerancia, &aux.precio);
if((compo.tipo==aux.tipo) && (compo.valor==aux.valor) && (compo.tolerancia==aux.tolerancia))
total += aux.cantidad;
i--;
}
if(total>=compo.cantidad)
{
printf("Se ha hecho el pedido de %d %s de valor %d, tolerancia %d al precio de %fn", compo.cantidad, componente, compo.valor, compo.tolerancia, compo.precio);
system ("pause");
return;
}
else
{
printf("Haga un encargo de componentes antes de realizar el pedido:n");
AltaComponente();
system("pause");
return;
}


fclose(file);




}


void valoracionAlmacen()
{

char componente[12];
int tipo = -1;
printf("¿Componente a buscar?(todo para saber el precio total del almacen)n");
scanf("%s", componente);
fflush(stdin);

if(!strcmp(ToLower(componente), RESISTENCIA))
tipo = TIPO_RESISTENCIA;
else if(!strcmp(ToLower(componente), CONDENSADOR))
tipo = TIPO_CONDENSADOR;
else if(!strcmp(ToLower(componente), BOBINA))
tipo = TIPO_BOBINA;
else if(!strcmp(ToLower(componente), "todo"))
{
tipo = -1;
}
else
{
printf("No existe ese componenten");
return;
}
// Abrimos ficheros.
FILE *file = fopen(NOMBRE_DB, "rb");

if(!file)// Si no encontramos el fichero, mostramos mensaje de error y nos salimos de la funcion.
{
printf("Error, no se ha encontrado el ficheron");
fclose(file);
exit(1);
}

int i = nComponentesFichero(file); // Obtenemos el numero de Componentes.
struct Componente aux;
float total = 0;
while(i > 0) // Hasta que no leamos no paramos
{
fscanf(file, "%d,%d,%d,%d,%f; ", &aux.tipo, &aux.cantidad, &aux.valor, &aux.tolerancia, &aux.precio);
if(tipo == -1)
total += (aux.precio*aux.cantidad);
else if(tipo == aux.tipo)
total += (aux.precio*aux.cantidad);
i--;
}

printf("nTOTAL:%fn", total);
fclose(file);

system("pause");
}