Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: diego-4 en 8 Noviembre 2012, 17:38 pm



Título: Problema de Estructuras con Funciones
Publicado por: diego-4 en 8 Noviembre 2012, 17:38 pm
Hola buenas tardes, no me han explicado bien el tema "estructuras" en funciones y tengo un codigo que si me darian una ayuda podria encarar yo solo .. Muchisimas Gracias .

Errores

Type Mismatch in parameter 3 ESRANGOVALIO
Type Mismatch in parameter 3 CALCIMPFACTURA
Type Mismatch in parameter 1 CALCIMPFACTURA

Este es el codigo

Código:
#include <stdio.h>
#include <conio.h>
#define c 1000
struct cliente
{
int numcli,codreg,mincm;
float impabo;

};

int ESRANGOVALIDO(int,int,struct cliente[],int);
int ESRANGOVALIDO2(int,int,int);
float CALCIMPFACTURA(struct cliente ,int[],struct cliente,float,int,int);
int ESFECHAVALIDA(int ,int ,int);
void ORDEN_VECTOR(int,float[],int[],struct cliente);
void SEGMENTO_CONSUMO(struct cliente,int[],int[][5],int);

void main()
{

 int numcli,impabo,codigo[3],codreg,minia[20],mincm,fechad,fecham,fechaa,contcli[3],num,flag=0,abonocont=0,mat[3][5],minexc,iv,i,j,b=3;
 float minexreg1,total[3],minexreg2,minexreg3,totfactura,costominreg;
 char nomtit[41];
 struct cliente cli[c];
iv=0;

for(i=0;i<=3;i++)
 {
  total[i]=0;
  contcli[i]=0;
 }

for(i=0;i<=2;i++)
 {
  for(j=0;j<=4;j++)
   {
   mat[i][j]=0;
   }
  }
printf("Monto minuto excedido por Region 1:");
scanf("%f",&minexreg1);
printf("Monto minuto excedido por Region 2:");
scanf("%f",&minexreg2);
printf("Monto minuto excedido por Region 3:");
scanf("%f",&minexreg3);
do
 {
 printf("Ingresar Numero Cliente(1 a 100000)");
 scanf("%d",&cli[iv].numcli);
 }
while(ESRANGOVALIDO(1,100000,numcli,iv)==0);

while(flag==0)
 {

do
{
printf("Ingresar Fecha vencimiento de Factura:  ej 10/08/2012\n");
scanf("%d/%d/%d",&fechad,&fecham,&fechaa);

}while(ESFECHAVALIDA(fechad,fecham,fechaa)==0);


printf("Ingresar Nombre del Cliente(40 caracteres)");
scanf("%s",&nomtit[iv]);
fflush(stdin);

 do
 {
  printf("Ingresar Codigo de Region(1 a 3)");
  scanf("%d",&cli[iv].codreg);
 }
while(ESRANGOVALIDO(1,3,codreg,iv)==0);

 do
  {
   printf("Minutos Incluidos en el Abono(1 a 2000)");
   scanf("%d",&minia[iv]);
  }
while(ESRANGOVALIDO(1,2000,minia,iv)==0);

 do
  {
   printf("Minutos Consumidos en el Mes(Mayor que 0)");
   scanf("%d",&cli[iv].mincm);
  }
while(ESRANGOVALIDO(1,9999999,mincm,iv)==0);

 do
  {
   printf("Importe del Abono(Mayor que 0)");
   scanf("%d",&impabo[iv]);
  }
while(ESRANGOVALIDO(1,9999999,impabo,iv)==0);

  if(cli[iv].codreg==1)
    {
     if(cli[iv].mincm<=minia[iv])
      {
       minexc=0;
       abonocont++;
       totfactura=CALCIMPFACTURA(impabo,minia,mincm,minexreg1,minexc,iv);
       costominreg=minexreg1;
       }
      else
       {
         minexc=cli[iv].mincm-minia[iv];
         totfactura=CALCIMPFACTURA(impabo,minia,mincm,minexreg1,minexc,iv);
         costominreg=minexreg1;
       }
     }
  else
      {
        if(cli[iv].codreg==2)
         {
          if(cli[iv].mincm<=minia[iv])
            {
             minexc=0;
             abonocont++;
             totfactura=CALCIMPFACTURA(impabo,minia,mincm,minexreg2,minexc,iv);
             costominreg=minexreg2;
             }
         else
          {
           minexc=cli[iv].mincm-minia[iv];
           totfactura=CALCIMPFACTURA(impabo,minia,mincm,minexreg2,minexc,iv);
           costominreg=minexreg2;
          }
         }

         else
          {
           if(cli[iv].mincm<=minia[iv])
             {
              minexc=0;
              abonocont++;
              totfactura=CALCIMPFACTURA(impabo,minia,mincm,minexreg3,minexc,iv);
              costominreg=minexreg3;
             }
            else
             {
              minexc=cli[iv].mincm-minia[iv];
              totfactura=CALCIMPFACTURA(impabo,minia,mincm,minexreg3,minexc,iv);
              costominreg=minexreg3;
             }
           }
         }

  total[cli[iv].codreg-1]+=totfactura;


 SEGMENTO_CONSUMO(codreg,mincm,mat,iv);


clrscr();
contcli[cli[iv].codreg-1]++;
printf("Ingresar nuevo cliente?(1-SI ; 2-NO)");
scanf("%d",&num);
clrscr();
if(num==1)
 {
   do
    {
     iv++;
     printf("Ingresar Numero Cliente(1 a 100000)");
     scanf("%d",&numcli[iv]);
    }
   while(ESRANGOVALIDO(1,100000,numcli,iv)==0);
 }
else flag++;
}



for(i=1;i<=3;i++)
 {
  codigo[i-1]=i;
 }

ORDEN_VECTOR(b,total,contcli,codigo);

printf("\nCodigo de Region\tCantidad de Abonados\tMonto Facturacion");
for(i=0;i<=2;i++)
 {
  printf("\n%d",codigo[i]);

  printf("\t%d",contcli[i]);

  printf("\t%.2f",total[i]);
 }



printf("\n\n\t\tMinutos Consumidos(por segmentos)");
printf("\nCodigo de Region\t 0 a 1000\t 1001 a 1500\t 1501 a 2000\t >2000\n");
for(i=0;i<=2;i++)
 {printf("\n");
  for(j=0;j<=4;j++)
  {
printf("\t%d   ", mat[i][j]);
  }
 }
getch();

}

int ESRANGOVALIDO(int a,int b,struct cliente cli[],int d)
{
 if(cli[d].mincm>=a&&cli[d].mincm<=b)

   return 1;
 else return 0;
 }

float CALCIMPFACTURA(struct cliente cli,int b[],struct cliente cli,float k,int d,int e)
 {

  if(cli[iv].mincm<=b[e])
   {

    return cli[e].impabo;


   }
  else
    {
     cli[e].mincm=cli[e].mincm+(d*k);
     return cli[e].mincm;

    }
 }

int ESRANGOVALIDO2(int a,int b,int c)
{
 if(c>=a&&c<=b)
  return 1;
  else return 0;
 }

int ESFECHAVALIDA(int d,int m,int a)
 {
   if(ESRANGOVALIDO2(2010,2020,a)==1)
      {
        if(m==2)
          {
           if(a%4==0 && (a%100!=0 || a%400==0))
             {
              if(ESRANGOVALIDO2(1,29,d)==1)
                 return 1;
                 return 0;
              }
            else
                {
                 if(ESRANGOVALIDO2(1,28,d)==1)
                   return 1;
                   return 0;
                }
            }
          else
           {
              if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)
                {
                 if(ESRANGOVALIDO2(1,31,d)==1)
                 return 1;
                 return 0;
                }
              else
                  {
                   if(ESRANGOVALIDO2(1,30,d)==1)
                   return 1;
                   return 0;
                   }
             }
           }
        else return 0;
      }

void ORDEN_VECTOR(int n,float a[],int b[],int c[])
{ int i,j,aux,aux2,aux3;
 for(i=0;i<=n-1;i++)
   {
    for(j=1;j<n-i;j++)
     {
      if(a[j-1]<a[j])
      {
       aux=a[j];
       a[j]=a[j-1];
       a[j-1]=aux;

       aux2=b[j];
       b[j]=b[j-1];
       b[j-1]=aux2;


       aux3=c[j];
       c[j]=c[j-1];
       c[j-1]=aux3;
      }
     }
    }
 }


void SEGMENTO_CONSUMO(struct cliente cli,int b[],int c[][5],int d)
 {

   c[0][0]=1;
   c[1][0]=2;
   c[2][0]=3;

   if(b[d]>0&&b[d]<=1000)

    c[cli[d].codreg-1][1]++;
     else
       {
        if(b[d]>=1001&&b[d]<=1500)

          c[cli[d].codreg-1][2]++;
            else
             {
              if(b[d]>=1501&&b[d]<=2000)

                  c[cli[d].codreg-1][3]++;

              else c[cli[d].codreg-1][4]++;
       }
             }


   }


Título: Re: Problema de Estructuras con Funciones
Publicado por: naderST en 8 Noviembre 2012, 18:13 pm
Las funciones están bien, lo que ocurre es que en alguna llamada a dichas funciones no le estas pasando bien los parámetros, revisa en que línea de código te esta dando el error y fíjate por qué.


Título: Re: Problema de Estructuras con Funciones
Publicado por: diego-4 en 8 Noviembre 2012, 18:21 pm
Cuando en la funcion adentro del programa principal, llamo a la variable que esta adentro de el struct, como lo hago ?


ej1 : ESRANGOVALIDO(1,1000,numcli)

ej2: ESRANGOVALIDO(1,1000,cli.numcli)

Gracias!


Título: Re: Problema de Estructuras con Funciones
Publicado por: naderST en 8 Noviembre 2012, 19:23 pm
Con el operador de miembro (.)

Código
  1. #include <stdio.h>
  2.  
  3. struct punto {
  4.    int x,y;
  5. };
  6.  
  7. void imprimir(struct punto par)
  8. {
  9.    printf("(%d,%d)\n", par.x, par.y);
  10. }
  11.  
  12. int main()
  13. {
  14.    struct punto ejemplo = {5,2};
  15.  
  16.    imprimir(ejemplo);
  17.  
  18.    return 0;
  19. }
  20.  
  21.  


Título: Re: Problema de Estructuras con Funciones
Publicado por: diego-4 en 8 Noviembre 2012, 19:34 pm
Modifique el codigo como me dijiste y me sigue tirando el mismo error :/  :(


Título: Re: Problema de Estructuras con Funciones
Publicado por: naderST en 9 Noviembre 2012, 01:48 am
Por ejemplo en esta línea tienes lo siguiente:

Código
  1. while(ESRANGOVALIDO(1,100000,numcli,iv)==0);
  2.  

El parámetro numcli tiene que ser del tipo struct cliente y le estas pasando un entero. No me puedo poner a ver dónde tienes más errores, pero revisa bien tu código.


Título: Re: Problema de Estructuras con Funciones
Publicado por: diego-4 en 9 Noviembre 2012, 12:58 pm
Genial . Hice lo que me dijiste pero aun asi me sigue tirando el mismo error.. Te dejo el prototipo , la llamada a la funcion y la funcion

Código:
struct cliente
{
int numcli[1000],codreg[1000],mincm[1000];
float impabo[1000];

}cli;


Código:
int ESRANGOVALIDO(int,int,struct cliente[],int);


Código:
while(ESRANGOVALIDO(1,100000,cli.numcli,iv)==0);


Código:
int ESRANGOVALIDO(int a,int b,struct cliente cli[],int d)
{
 if(cli.mincm[d]>=a&&cli.mincm[d]<=b)

   return 1;
 else return 0;
 }


Plz necesito ayuda con este codigo, Se los agradeceria !


Título: Re: Problema de Estructuras con Funciones
Publicado por: naderST en 9 Noviembre 2012, 19:53 pm
Necesitas pasar la estructura, no un campo de la misma, es decir:

Código
  1. while(ESRANGOVALIDO(1,100000,cli,iv)==0);

Asumiendo que la variable cli es de tipo struct cliente.


Título: Re: Problema de Estructuras con Funciones
Publicado por: diego-4 en 9 Noviembre 2012, 22:01 pm
De maravilla .. Esta sera mi ultima pregunta, no me toma como valido el rango .. no se como llamar a la variable adentro de la funcion. en este caso es cliente pero me tira error, querria saber q poner . desde ya muchas gracias

Código:
int ESRANGOVALIDO(int,int,struct cliente,int);


Código:
while(ESRANGOVALIDO(1,100000,cli,iv)==0);

Código:
int ESRANGOVALIDO(int a,int b,struct cliente ,int d)
{
 if(cliente[d]>=a&&cliente[d]<=b)

   return 1;
 else return 0;
 }


Título: Re: Problema de Estructuras con Funciones
Publicado por: naderST en 10 Noviembre 2012, 05:51 am
Para acceder a un campo de la estructura usas el operador de acceso punto ( . ) por ejemplo:

Código
  1. nombre_estructura.campo

En tu caso tu estructura es cliente y cuenta con los siguientes campos:

Código
  1. int numcli,codreg,mincm;
  2. float impabo;

Deberías buscar un buen libro de C y leerlo para que aclares los conceptos básicos antes de empezar a programar como tal.


Título: Re: Problema de Estructuras con Funciones
Publicado por: diego-4 en 10 Noviembre 2012, 14:07 pm
Despues de mandar el mensaje, me puse a pensar  es exactamente como me estas diciendo vos.. Pero a lo que voy es ESRANGOVALIDO la uso para numcli, codreg, mincm... y en la funcion no puedo poner :

cli.numcli > valor inferior && cli.numcli < valorfinal

Solo me tomaria esa variable y no las otras. No se si me explico a lo que me refiero

ej: distinto de mi codigo

Código:
ESRANGOVALIDO(1,20,numcli)==0
ESRANGOVALIO(1,21,codreg)==0

INT ESRANGOVALIDO(int a,int b,int c)

if(c>=a&&c<=b)
 return 1;
else return 0;

La variable c toma tanto como a numcli, y a codreg... Pero en structuras no entiendo como hacer lo mismo . Espero que ahi se me haya entendido mejor . Desde ya muchisimas gracias


Título: Re: Problema de Estructuras con Funciones
Publicado por: naderST en 10 Noviembre 2012, 18:35 pm
Podrías hacer una función general para validar el rango y que te quede algo similar a esto:

Código
  1. #include <stdio.h>
  2.  
  3. struct cliente {
  4.    int numcli,codreg,mincm;
  5.    float impabo;
  6. };
  7.  
  8. int esRangoValido(int a, int b, int c)
  9. {
  10.    return (c >= a && c <= b);
  11. }
  12.  
  13. int main()
  14. {
  15.    struct cliente prueba = { 10, 20, 30, 5.5 };
  16.  
  17.    if(esRangoValido(0,30,prueba.codreg))
  18.        printf("El rango de codreg es válido.\n");
  19.    if(esRangoValido(0,30,prueba.numcli))
  20.        printf("El rango de numcli es válido.\n");
  21.    if(esRangoValido(0,30,prueba.mincm))
  22.        printf("El rango de mincm es válido\n");
  23.  
  24.    return 0;
  25. }
  26.  
  27.  


Título: Re: Problema de Estructuras con Funciones
Publicado por: diego-4 en 10 Noviembre 2012, 18:46 pm
Genial, Gracias a vos pude terminar del trabajo practico la parte de estructuras... Me sirivio de mucha ayuda tus explicaciones (:

Aca te dejo parte del codigo, de como lo hice

Código:
struct cliente
{
int numcli[1000],codreg[1000],mincm[1000],minia[1000];
float impabo[1000];

}cli;


Código:
int ESRANGOVALIDO(int,int,struct cliente,int,int);


Código:
do
 {
 printf("Ingresar Numero Cliente(1 a 100000)");
 scanf("%d",&cli.numcli[iv]);
 }
while(ESRANGOVALIDO(1,100000,cli,iv,1)==0);


Código:
 do
 {
  printf("Ingresar Codigo de Region(1 a 3)");
  scanf("%d",&cli.codreg[iv]);
 }
while(ESRANGOVALIDO(1,3,cli,iv,2)==0);



Código:
int ESRANGOVALIDO(int a,int b,struct cliente  ,int d,int e)
{
 if(e==1)
 {
  if(cli.numcli[d]>=a&& cli.numcli[d]<=b)

   return 1;
 else return 0;
   }
  else
 {
  if(e==2)
   {
   if(cli.codreg[d]>=a&& cli.codreg[d]<=b)

   return 1;
 else return 0;
 }
 else
 {
  if(e==3)
  {
   if(cli.minia[d]>=a&& cli.minia[d]<=b)

   return 1;
 else return 0;
 }
 else
 {
 if(cli.mincm[d]>=a&& cli.mincm[d]<=b)

   return 1;
 else return 0;
   }
}

}
}

Gracias y mas gracias naderST