hola gente. soy nuevo en esto y la hago corta,tengo dos problemas de validacion en el sig codigo.
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!!
#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
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
//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
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
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
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!!
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
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!!!
que es este desorden ¬¬
te compila el codigo? sino lo hace mostra la linea del error, si el codigo compila y hay un error en tiempo de ejecucion depura el codigo o mostra en que linea
Posteá el código entre etiquetas GeSHi. Esto es ilegible.
en la parte de struct producto{
char nomb[MAX_NOMB+1];
char descrip[MAX_DESCRIP+1];
long code;
int stock;
int pmayo;
int pmino;
int pcost;
los definís como enteros allí deberían ser float, por eso salen como enteros...
ejemplo
float pmayo;
o mejor aun
double pmayo;
2°lo de los espacios y alfanumericos lo arreglas poniendo
char nomb[50];
alcanzaria para meter un nombre de 50 caracteres...eso si no se bien para que metiste la parte de
#define MAX_NOMB 20
Seguramente esos pequeños cambios generaran cambios en el resto del código..la verdad no lo leí, pero eres tu el que lo conoce así que búscalos...cualquier cosa avisa
Gracias por las aclaraciones, el programa compila a la perfeccion, el error principal esta en la validaciones que mencione.
Se que me precipite al subirlo de esta manera, mi intencion era que lo prueben y juzguen el funcionamiento, lo sigo probando.
y Flony me sirvio lo que me dijiste, sigo modificandolo para ver si con los parametros que me pediste sujeriste me funcionan bien las validaciones.
Repito, Gracias por los comentarios, no soy experto pero me ayudan!!