1-primero no me toma los precios Mayorista, Minorista, y Costo en DECIMALES al momento de ingresarlos, solo en INT.
2- En Nombre Y Descripcion de producto, no me los toma con espacios ni alfanumericos.
soy un desastre!!
Código
#include <stdio.h> #include <ctype.h> #include <string.h> #include <conio.h> #include <stdlib.h> //los son para el primer menu #define INGRESA_PRODU '1' #define MODIFICA_PRODU '2' #define ELIMINA_PRODU '3' #define VISUALIZA_LISTA '4' #define MAYOR_DIFE '5' #define GENERA_TXT '6' #define MUESTRA_STOCK '7' #define SALIR '8' //queda para el otro menu #define POR_NOMB '1' #define POR_CODE '2' #define SALIR_2MENU '3' //para la estructura en general #define MAX_NOMB 20 #define MAX_DESCRIP 50 #define MAX_CODE 6 #define MAX_STOCK 8 #define MAX_PRECIO 8
La definicion de la estructura y sus parametros
Código
struct producto{ char nomb[MAX_NOMB+1]; char descrip[MAX_DESCRIP+1]; long code; int stock; int pmayo; int pmino; int pcost; }; char menu_prodpri (void); //para el principal char menu_buscap (void); //es para la busqueda int cargarint(int, int, int); //es para validar int long buscar_nomb (char *, bool); //busco por nombre de producto void ingresar_produ (void); //es para el ingreso de productos void cargarstr(char *, int); //es para validar string void listado_produ (); //ver lista void mejor_dife (); //es para la diferencia del punto 5) void arch_texto (); //genera archivo de texto del punto6) void ver_stock (); //ve el stock en 0 void modificar_produ (long); //modifica el producto en el punto 2) void eliminar_produ (long); //elimina el producto en el punto 3) long cargarlong(int, int, int); //es para validar long bool IsAlphabetic (char *); //para el alfabetico bool IsNumeric (char *); //para el numero bool ExistenProductosEnArchivo (long); //cuando alla cargado el codigo bool IngresarProductoOrdenado (producto);
las condiciones del menu para las acciones
Código
//void main () { char opcion, busqueda, nomb[MAX_NOMB+1], descrip[MAX_DESCRIP+1]; long code; int flag; opcion = menu_prodpri (); while (opcion != SALIR) { switch (opcion) { case INGRESA_PRODU: ingresar_produ (); break; case MODIFICA_PRODU: //clrscr (); busqueda = menu_buscap(); while (busqueda != SALIR_2MENU) { flag = 0; switch (busqueda) { case POR_NOMB: printf ("\nINGRESE EL NOMBRE DEL PRODUCTO: "); cargarstr(nomb, MAX_NOMB); code = buscar_nomb (nomb, true); if (code == 0) printf ("\nNo se encontro ningun producto con ese nombre\n"); else modificar_produ (code); break; case POR_CODE: printf ("\nINGRESE EL CODIGO DEL PRODUCTO: "); code = cargarlong(MAX_CODE, 999999, 1); modificar_produ (code); break; default: flag = 1; break; } if(flag == 1) { printf ("Opcion invalida\n"); printf ("\nPresione ENTER para continuar\n"); getch (); busqueda = menu_buscap(); } else break; } break; case ELIMINA_PRODU: //clrscr (); busqueda = menu_buscap(); while (busqueda != SALIR_2MENU) { flag = 0; switch (busqueda) { case POR_NOMB: printf ("\nINGRESE EL NOMBRE DEL PRODUCTO: "); cargarstr(nomb, MAX_NOMB); code = buscar_nomb (nomb, true); if (code == 0) printf ("\nNo se encontro ningun producto con ese nombre\n"); else eliminar_produ (code); break; case POR_CODE: printf ("\nINGRESE EL CODIGO DEL PRODUCTO: "); code = cargarlong(MAX_CODE, 999999, 1); eliminar_produ (code); break; default: flag = 1; break; } if(flag == 1) { printf ("Opcion invalida\n"); printf ("\nPresione ENTER para continuar\n"); getch (); busqueda = menu_buscap(); } else break; } break; case VISUALIZA_LISTA: listado_produ (); break; case MAYOR_DIFE: mejor_dife (); break; case GENERA_TXT: arch_texto (); break; case MUESTRA_STOCK: ver_stock (); break; default: printf ("Opcion invalida\n"); break; } printf ("\nPresione ENTER para continuar\n"); getch (); opcion = menu_prodpri (); } printf ("\nPrograma creado por JORGE MIRANDA"); printf ("\nFinalizado Exitosamente..."); getch (); }
lo que se aplico para definir que es numerico y alfanumerico
Código
bool IsAlphabetic (char *s) { while (*s) if (!isalpha (*s++)) return false; return true; } bool IsNumeric (char *s) { while (*s) if (!isdigit (*s++)) return false; return true; }
opciones del menu
Código
char menu_prodpri () { char auxvec [50]; //clrscr (); printf ("MENU PRINCIPAL DE OPCIONES\n"); printf ("1 - INGRESO DE PRODUCTO\n"); printf ("2 - MODIFICACION DE PRODUCTO\n"); printf ("3 - ELIMINACION DE PRODUCTO\n"); printf ("4 - VISUALIZACION DEL LISTADO DE PRODUCTOS COMPLETO Y DETALLADO\n"); printf ("5 - DIFERENCIA MAS ALTA ENTRE PRECIO MAYORISTA Y PRECIO MINOROSTA\n"); printf ("6 - GENERACION DE ARCHIVO ADICIONAL CON LOS PRODUCTOS QUE NO TENGAN STOCK\n"); printf ("7 - VER LISTADO DE PRODUCTOS SIN STOCK\n"); printf ("8 - Salir\n"); printf ("\nIngrese la opcion: "); gets (auxvec); if (strlen(auxvec)!=1) //cant caracteres return '0'; return auxvec [0]; }
para el segundo menu
Código
char menu_buscap () { char auxvec [50]; //clrscr (); printf ("1 - elegir PRODUCTO por NOMBRE\n"); printf ("2 - elegir PRODUCTO por CODIGO\n"); printf ("3 - Salir\n"); printf ("\nIngrese la opcion: "); gets (auxvec); if (strlen(auxvec)!=1) return '0'; return auxvec [0]; }
bool
ExistenProductosEnArchivo (long code)
{
FILE * arch;
int cant;
struct producto produ;
bool encontrado;
if((arch=fopen("producto.dat","rb+"))==NULL)
{
if((arch=fopen("producto.dat","wb+"))==NULL)
{
printf("\nNo se puede abrir el archivo");
return false;
}
}
rewind (arch);
encontrado = false;
while (!feof(arch))
{
cant = fread (&produ, sizeof(produ), 1, arch);
if ( cant != 1 )
{
if (!feof (arch))
printf("Error al leer el ultimo registro\n");
break;
}
if(produ.code == code)
{
encontrado = true;
break;
}
}
fclose (arch);
return encontrado;
}
bool
IngresarProductoOrdenado (producto produnuevo)
{
int cant;
FILE *arch, *temp;
bool productoNoIngresado;
struct producto produ;
if((arch=fopen("c:\\tp\\producto.dat","rb+"))==NULL)
{
if((arch=fopen("c:\\tp\\producto.dat","wb+"))==NULL)
{
printf("\nNo se puede abrir el archivo");
return false;
}
}
if((temp=fopen("c:\\tp\\temporal.dat","wb"))==NULL)
{
printf("\nNo se puede abrir el archivo");
fclose (arch);
return false;
}
productoNoIngresado = true;
while (!feof(arch))
{
cant = fread (&produ, sizeof(produ), 1, arch);
if ( cant != 1 )
{
if (!feof (arch))
printf("Error leyendo ultimo registro\n");
break;
}
if (productoNoIngresado && produ.code>produnuevo.code)
{
fwrite(&produnuevo, sizeof(produnuevo), 1, temp);
productoNoIngresado=false;
}
fwrite(&produ, sizeof(produ), 1, temp);
}
if (productoNoIngresado)
fwrite(&produnuevo, sizeof(produnuevo), 1, temp);
fclose (temp);
fclose (arch);
if( remove( "c:\\tp\\producto.dat" ) != 0 )
printf ( "Error borrando producto.dat" );
if ( rename ("c:\\tp\\temporal.dat", "c:\\tp\\producto.dat") != 0 )
printf ( "Error renombrando temporal.dat a producto.dat" );
return true;
}
aca es el ingreso de los datos!!
Código
void ingresar_produ (void) { struct producto aux; char rta='s'; //clrscr (); while(rta=='s') { printf("\nINGRESE EL CODIGO DEL PRODUCTO: "); aux.code = cargarlong(MAX_CODE, 999999, 1); // Vemos si ya fue ingresado. if ( !ExistenProductosEnArchivo (aux.code) ) { printf("\nINGRESE NOMBRE DEL PRODUCTO: "); cargarstr(aux.nomb, MAX_NOMB); printf("\nINGRESE LA DESCRIPCION DEL PRODUCTO: "); cargarstr(aux.descrip, MAX_DESCRIP); printf("\nINGRESE LA CANTIDAD DISPONIBLE DEL PRODUCTO: "); aux.stock = cargarint(MAX_STOCK, 99999999, 0); printf("\nINGRESE EL PRECIO MAYORISTA: "); aux.pmayo = cargarint(MAX_PRECIO, 99999999, 0); printf("\nINGRESE EL PRECIO MINORISTA: "); aux.pmino = cargarint(MAX_PRECIO, 99999999, 0); printf("\nINGRESE EL PRECIO DE COSTO: "); aux.pcost = cargarint(MAX_PRECIO, 99999999, 0); // Se guarda el produ en el archivo. if (!IngresarProductoOrdenado (aux)) printf ("\nError, el nuevo producto no pudo ser insertado\n"); } else printf ("\nESTE CODIGO YA FUE INGRESADO!!\n"); printf("\nDesea ingresar otro PRODUCTO?[s/n] "); scanf("%c",&rta); fflush(stdin); tolower(rta); //clrscr (); } printf ("\nIngreso de productos terminado\n"); }
void
listado_produ ()
{
struct producto produ;
int cant, flag=0;
FILE *arch;
if((arch=fopen("c:\\tp\\producto.dat","rb+"))==NULL)
{
printf("\nNo se puede abrir el archivo, proceda primero a la carga de los productos");
return;
}
//clrscr ();
while(!feof(arch))
{
cant = fread (&produ, sizeof(produ), 1, arch);
if ( cant != 1 )
{
if (!feof (arch))
printf("Error leyendo ultimo registro\n");
break;
}
if (flag==0)
{
printf("******************* PRODUCTOS ********************\n\n");
printf("\nNombre \t\tDescripcion\tCodigo\tStock\tMayorista\tMinorista\tCosto\n\n");
flag = 1;
}
printf ("%-15s%-15s %8ld %9d $:%7d %7d %7d\n",
produ.nomb, produ.descrip, produ.code, produ.stock,
produ.pmayo, produ.pmino, produ.pcost);
}
fclose (arch);
}
void
mejor_dife ()
{
struct producto produ;
int dife, dife_mayor = 0;
int cant, flag = 0;
FILE *arch; //para abrir el archivo
if((arch=fopen("c:\\tp\\producto.dat","rb+"))==NULL)
{
printf("\nNo se puede abrir el archivo, proceda primero a la carga de los productos");
return;
}
//clrscr ();
while(!feof(arch))
{
cant = fread (&produ, sizeof(produ), 1, arch);
if ( cant != 1 )
{
if (!feof (arch))
printf("Error leyendo ultimo registro\n");
break;
}
dife = (produ.pmino-produ.pmayo);
if (dife > dife_mayor)
dife_mayor = dife;
}
rewind(arch);
while (!feof(arch))
{
if (flag==0)
{
printf("*********************** diferencias *********************\n\n");
printf("\nNombre\tDescripcion\tCodigo\tDiferencia\n\n");
flag = 1;
}
cant = fread (&produ, sizeof(produ), 1, arch);
if ( cant != 1 )
{
if (!feof (arch))
printf("Error leyendo ultimo registro\n");
break;
}
dife = (produ.pmino-produ.pmayo);
if (dife == dife_mayor)
printf ("%-15s %-15s %8ld %12.2d\n", produ.nomb, produ.descrip, produ.code, dife);
}
fclose (arch);
}
void
arch_texto ()
{
int flag = 0, cant;
struct producto produ;
FILE *arch, *txt;
char buff [200]; //buffer para guardar caracteres
if((arch=fopen("c:\\tp\\producto.dat","rb+"))==NULL)
{
printf("\nNo se puede abrir el archivo, proceda primero a la carga de los productos");
return;
}
if((txt=fopen("c:\\tp\\producto_sin_stock.txt","w"))==NULL)
{
printf("\nNo se puede abrir el archivo");
return;
}
//clrscr ();
while(!feof(arch))
{
cant = fread (&produ, sizeof(produ), 1, arch);
if ( cant != 1 )
{
if (!feof (arch))
printf("Error leyendo ultimo registro\n");
break;
}
if(produ.stock==0)
{
if (flag==0)
{
sprintf(buff, "***************** sin stock ******************\n\n"
"\nNombre\tDescripcion\tCodigo\tStock\n\n");
if (fwrite(buff, strlen (buff), 1, txt)!= 1)
printf ("\nERROR, no se pudo generar el archivo de texto\n");
flag = 1;
}
sprintf (buff, "%-15s %-15s %8ld %9d\n",
produ.nomb, produ.descrip, produ.code, produ.stock);
if (fwrite(buff, strlen (buff), 1, txt)!= 1)
printf ("\nERROR, no se pudo generar el archivo de texto\n");
}
}
printf ("\nSe genero un archivo adicional de texto con los productos sin stock\n");
fclose (txt);
fclose (arch);
}
void
ver_stock ()
{
struct producto produ;
int cant, flag = 0;
FILE *arch;
if((arch=fopen("c:\\tp\\producto.dat","rb+"))==NULL)
{
printf("\nNo se puede abrir el archivo, proceda primero a la carga de los productos");
return;
}
//clrscr ();
while(!feof(arch))
{
cant = fread (&produ, sizeof(produ), 1, arch);
if ( cant != 1 )
{
if (!feof (arch))
printf("Error leyendo ultimo registro\n");
break;
}
if (produ.stock==0)
{
if (flag==0)
{
printf(" **************** sin stock ***************** \n\n");
printf("\nNombre\t\t\t Descripcion\t Codigo\t \tStock\n\n");
flag = 1;
}
printf ( "%-15s %-15s %8ld %9d\n",
produ.nomb, produ.descrip, produ.code, produ.stock);
}
}
fclose (arch);
}
long
buscar_nomb (char *str, bool BuscoporNombre)
{
int cant, flag=0, cnt=0, norden;
struct producto produ;
FILE *arch;
bool resultado;
long code=0;
//clrscr ();
if((arch=fopen("c:\\tp\\producto.dat","rb"))==NULL)
{
printf("\nNo se puede abrir el archivo, proceda primero a la carga de los productos");
return 0;
}
while (!feof (arch))
{
cant = fread (&produ, sizeof(produ), 1, arch);
if ( cant != 1 )
{
if (!feof (arch))
printf("Error leyendo ultimo registro\n");
break;
}
if (BuscoporNombre)
resultado = strcmp (produ.nomb, str);
else
resultado = strcmp (produ.descrip, str);
if (resultado == 0)
{
if (flag == 0)
{
printf ("DATOS DEL PRODUCTO:\n\n"
"NRO Producto Descripcion Codigo Cantidad Mayorista Minorista Costo\n");
flag = 1;
}
cnt++;
printf ("%-3d %-15s %-15s %8ld %5d %5d %5d %5d\n", cnt,
produ.nomb, produ.descrip, produ.code, produ.stock,
produ.pmayo, produ.pmino, produ.pcost);
code = produ.code;
}
}
if (cnt>1)
{
printf ("\nIngrese el producto elegido por nro de orden (1 a %d): ", cnt);
norden = cargarint (5, cnt, 1);
rewind (arch);
cnt = 0;
while (!feof (arch))
{
cant = fread (&produ, sizeof(produ), 1, arch);
if ( cant != 1 )
{
if (!feof (arch))
printf("Error leyendo ultimo registro\n");
break;
}
if (BuscoporNombre)
resultado = strcmp (produ.nomb, str);
else
resultado = strcmp (produ.descrip, str);
if (resultado == 0)
{
cnt++;
if (cnt == norden)
{
code=produ.code;
break;
}
}
}
}
fclose (arch);
return code;
}
void
modificar_produ (long code)
{
int cant, flag=0;
struct producto produ;
FILE *arch;
//clrscr ();
if((arch=fopen("c:\\tp\\producto.dat","rb+"))==NULL)
{
printf("\nNo se puede abrir el archivo, proceda primero a la carga de los producto");
return;
}
while (!feof (arch))
{
cant = fread (&produ, sizeof(produ), 1, arch);
if ( cant != 1 )
{
if (!feof (arch))
printf("Error leyendo ultimo registro\n");
break;
}
if (produ.code == code)
{
flag=1;
printf ("DATOS DEL PRODUCTO:\n\nNombreE\tDescripcion\tCodigo\tCantidad\tMayorista\tMinorista\tCosto\n");
printf ("%-15s %-15s %8ld %9d %7d %7d %7d\n", produ.nomb, produ.descrip, produ.code, produ.stock,
produ.pmayo, produ.pmino, produ.pcost);
// Actualizamos los datos del producto.
printf("\nINGRESE EL NUEVO NOMBRE DEL PRODUCTO: ");
cargarstr(produ.nomb, MAX_NOMB);
printf("\nINGRESE LA NUEVA DESCRIPCION: ");
cargarstr(produ.descrip, MAX_DESCRIP);
printf("\nINGRSEE LA NUEVA CANTIDAD: ");
produ.stock = cargarint(MAX_STOCK, 99999999, 0);
printf("\nINGRESE EL NUEVO PRECIO MAYORISTA: ");
produ.pmayo = cargarint(MAX_PRECIO, 99999999, 0);
printf("\nINGRESE EL NUEVO PRECIO MINORISTA: ");
produ.pmino = cargarint(MAX_PRECIO, 99999999, 0);
printf("\nINGRESE EL NUEVO PRECIO DE COSTO: ");
produ.pcost = cargarint(MAX_PRECIO, 99999999, 0);
fseek (arch, (long)(-1)*sizeof(produ), SEEK_CUR);
if (fwrite(&produ, sizeof(produ), 1, arch)!= 1)
printf ("\nERROR, no se pudo actualizar el producto en el archivo\n");
else
//clrscr();
printf ("Producto actualizado ... \n\nNomnre\tDescripcion\tCodigo\tCantidad\tMayorista\tMinorista\tCosto\n");
printf ("%-15s %-15s %8ld %9d %7d %7d %7d\n", produ.nomb, produ.descrip, produ.code, produ.stock,
produ.pmayo, produ.pmino, produ.pcost);
break;
}
}
if (flag==0)
printf ("\nNo se encontro ningun producto con el codigo indicado\n");
fclose (arch);
}
void
eliminar_produ (long code)
{
int cant, flag=0;
struct producto produ;
FILE *arch, *temp;
//clrscr ();
if((arch=fopen("c:\\tp\\producto.dat","rb"))==NULL)
{
printf("\nNo se puede abrir el archivo, proceda primero a la carga de los producto");
return;
}
if((temp=fopen("c:\\tp\\temporal.dat","wb"))==NULL)
{
printf("\nNo se puede abrir el archivo");
return;
}
while (!feof (arch))
{
cant = fread (&produ, sizeof(produ), 1, arch);
if ( cant != 1 )
{
if (!feof (arch))
printf("Error leyendo ultimo registro\n");
break;
}
if (produ.code != code)
fwrite(&produ, sizeof(produ), 1, temp);
else
flag=1;
}
if (flag==0)
printf ("\nNo se encontro ningun prodcuto con el codigo indicado\n");
else
printf ("\nSe elimino el producto correctamente...\n");
fclose (temp);
fclose (arch);
if( remove( "c:\\tp\\producto.dat" ) != 0 )
printf ( "Error borrando producto.dat" );
if ( rename ("c:\\tp\\temporal.dat", "c:\\tp\\producto.dat") != 0)
printf ( "Error renombrando temporal.dat a producto.dat" );
}
por ultimo las funciones para el tipo de datos a ingresar
Código
void cargarstr(char *str, int max) //Funcion validar string { int flag=0, len; char auxvec[50]; gets(auxvec); while(flag==0) { len=strlen(auxvec); if (len==0 || len>max || len<1 || !IsAlphabetic (auxvec)) { printf ("Error, vuelva a ingresar el dato: "); gets(auxvec); } else flag = 1; } strcpy(str,auxvec); } long cargarlong (int cant, int max, int min) //Funcion validar long { int flag=0, len; long number; char auxvec[50]; gets(auxvec); while(flag==0) { number = atol (auxvec); len = strlen (auxvec); if (!IsNumeric (auxvec) || len>cant || number<min ||number>max) { printf ("Error, vuelva a ingresar el dato: "); gets(auxvec); } else flag = 1; } return (number); } int cargarint (int cant, int max, int min) //Funcion validar int { int flag=0, len, number; char auxvec[50]; gets(auxvec); while(flag==0) { number = atoi (auxvec); len = strlen (auxvec); if (!IsNumeric (auxvec) || len>cant || number<min ||number>max) { printf ("Error, vuelva a ingresar el dato: "); gets(auxvec); } else flag = 1; } return (number); }
hay esta el cod, y lo que costo, consulte y todo, nadie me dice que tiene.
lo principal es el ingreso de los datos, como dije, que los precios sean en decimal y con espacios en el nombre y la descripcion, el resto lo modifico a la marcha y de corregir lo anterioro no seria complicado
gracias Camaradas!!!