problemas de validacion, auxilio!!!

Iniciado por larezaka, 1 Junio 2012, 17:21 PM

0 Miembros y 1 Visitante están viendo este tema.

larezaka

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!!

Código (cpp) [Seleccionar]
#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 (cpp) [Seleccionar]
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 (cpp) [Seleccionar]
//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 (cpp) [Seleccionar]
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 (cpp) [Seleccionar]

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 (cpp) [Seleccionar]
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 (cpp) [Seleccionar]
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 (cpp) [Seleccionar]
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!!!

x64core

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

Ferno

Posteá el código entre etiquetas GeSHi. Esto es ilegible.

flony

#3
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
si un problema no tiene solucion entonces no es un problema...es algo inevitable

larezaka

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!!