• Viernes 8 de Noviembre de 2024, 19:15

Autor Tema:  Como declaro miembros de una struct en una funcion  (Leído 1986 veces)

o.ficu

  • Nuevo Miembro
  • *
  • Mensajes: 14
    • Ver Perfil
Como declaro miembros de una struct en una funcion
« en: Viernes 16 de Octubre de 2009, 00:04 »
0
Hola espero puedan ayudarme, siempre tengo problemas con esto, el problema es que no se como declarar un miembro de struct en una funcion, por ejemplo si me struct es: struct Datos{
                                 char nombre[];
                                 char apellidos[];
                                 struct direccion{
                                 char avenida[];
                                 char ciudad;
                                 struct telefonos{
                                 char casa[];
                                 char movi[];};
                                 };
                                 };
si deseo por ejemplo una funcion con argumentos de Datos seria:  void(Datos p[]) pero si deseo declarar por ejemplo una funcion con argumento del numero de telefono de la casa, como lo hago??? void(Datos.telefonos.casa)??? no se como declarar cuando una estructura esta dentro de otra, espero puedan ayudarme, gracias.
Oliver

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Como declaro miembros de una struct en una funcion
« Respuesta #1 en: Viernes 16 de Octubre de 2009, 09:49 »
0
Antes de todo, no te aconsejaría que declararas tales estructuras de datos como lo has hecho:

Código: C
  1. struct Datos
  2. {
  3.     char nombre[];
  4.     char apellidos[];
  5.     struct direccion
  6.     {
  7.         char avenida[];
  8.         char ciudad;
  9.         struct telefonos
  10.         {
  11.             char casa[];
  12.             char movi[];
  13.         };
  14.     };
  15. };
  16.  
Esto es difícil de leer, de manipular, de entender y poco flexible  :wacko: Hazlo así mejor, queda más legible y más estructurado:

Código: C
  1. typedef struct
  2. {
  3.     char casa[];
  4.     char movil[];
  5. } tTelefonos;
  6.  
  7. typedef struct
  8. {
  9.     char avenida[];
  10.     char ciudad;
  11.     tTelefonos telefonos;
  12. }  tDireccion;
  13.  
  14. typedef struct
  15. {
  16.     char nombre[];
  17.     char apellidos[];
  18.     tDireccion direccion;    
  19. } tDatos;
  20.  

Ahora ya no tienes problemas para pasar cualquier tipo a una función:

Código: C
  1. char* funcion1(tTelefonos telefonos);
  2. int funcion2(tDireccion direccion, tTelefonos telefonos, tDatos datos);
  3.  

o.ficu

  • Nuevo Miembro
  • *
  • Mensajes: 14
    • Ver Perfil
Re: Como declaro miembros de una struct en una funcion
« Respuesta #2 en: Sábado 17 de Octubre de 2009, 07:32 »
0
Gracias por tu respuesta y tus consejos!!! pero aun me queda una duda, si me piden que yo en mi funcion tenga como argumento el NUMERO DE CASA entonces solo es posible declarar funcion(tTelefonos telefono) ???? no se puede declarar con el numero de casa??? y si encaso si se puede seria funcion(tTelefonos telefono.casa)???? o como???? esa en si es mi pregunta!!!

1.typedef struct
2.{
3.    char casa[];
4.    char movil[];
5.} tTelefonos;
6.
7.typedef struct
8.{
9.    char avenida[];
10.    char ciudad;
11.    tTelefonos telefonos;
12.}  tDireccion;
13.
14.typedef struct
15.{
16.    char nombre[];
17.    char apellidos[];
18.    tDireccion direccion;    
19.} tDatos;

Dynyck

  • Nuevo Miembro
  • *
  • Mensajes: 17
    • Ver Perfil
Re: Como declaro miembros de una struct en una funcion
« Respuesta #3 en: Sábado 17 de Octubre de 2009, 14:13 »
0
Si quieres pasar a una función ese argumento, puedes pasar la estructura como referencia si no quieres ocupar "más memoria". Si así lo haces, luego en la definición de la función, accede al campo mediante el operador ".".

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Como declaro miembros de una struct en una funcion
« Respuesta #4 en: Sábado 17 de Octubre de 2009, 18:33 »
0
Código: C
  1. // Prototipo:
  2. funcion1(char* numero_de_casa);
  3.  
  4. // Llamada:
  5. funcion1(direccion.telefonos.casa);
  6.  

o.ficu

  • Nuevo Miembro
  • *
  • Mensajes: 14
    • Ver Perfil
Re: Como declaro miembros de una struct en una funcion
« Respuesta #5 en: Sábado 17 de Octubre de 2009, 18:58 »
0
Muchas gracias por su ayuda!!!!!

o.ficu

  • Nuevo Miembro
  • *
  • Mensajes: 14
    • Ver Perfil
Re: Como declaro miembros de una struct en una funcion
« Respuesta #6 en: Domingo 18 de Octubre de 2009, 00:30 »
0
Hola nuevamente, espero no caer "pesado" pero no entiendo que estoy haciendo mal, recien me estoy familiarizando bien en estos temas y espero me tengan paciencia, en el problema trata de que una seria de usuarios, que hacen un numero de llamadas con cierto tiempo cada llamada y con cierta fecha, el problema me dice que haga una funcion llamada CONSUMO que reciba como parametros: El array de usuarios(usuarios),la dimension de usuarios(n),el numero telefonico(del numero con mayor tiempo en la llamada telef) y el mes(q se realizo dicha llamada), el programa funciona bien mientras el codigo que lo explicare en el mismo codigo para que puedan entenderme esta dentro de otra funcion, pero cuando quiero hacer esta funcion consumo no me sale :S gracias de antemano por su ayda:
Código: C
  1. #include<iostream>
  2. #include<stdlib.h>
  3. #include<stdio.h>
  4.  
  5. using namespace std;
  6.  
  7. const int N=1000;
  8.  
  9. typedef {int dia,mes,anio;}fecha;
  10. typedef{
  11.        fecha f;
  12.        char numTlf[14];        // numero al cual se llama
  13.        float tiempo;             // linea control
  14.        }llamada;
  15. typedef{
  16.        char numero[14];
  17.        char usuario[40];
  18.        int nllam;              //numero de llamadas
  19.        llamada llam[100];       //array de llamadas
  20.        }LineaControl;
  21.        
  22.  
  23. void IngresaDatos(LineaControl usuarios[],int &n);       //ojo que tenemos que hacer como puntero para que la variable n pueda avanzar
  24. void ImprimeDatos(LineaControl usuarios[],int &n);   //notese que cuando solo se declara int n te pedira siempre Ingrese el numero de telefono del 1 cliente
  25.                                                          //siempre sera 1 cliente, 1 cliente
  26. void consumo(LineaControl usuarios[],int &n,llamada llam.numTlf[],fecha f.mes);
  27.  
  28. void IngresaDatos(LineaControl usuarios[],int &n)
  29. {    
  30.       fflush(stdin);
  31.       cout<<"tttIngrese el numero de telefono del "<<n<<" cliente: ";    gets(usuarios[n].numero);fflush(stdin);cout<<endl<<endl;
  32.       cout<<"Ingrese el nombre del cliente: ";                gets(usuarios[n].usuario);fflush(stdin);
  33.       cout<<"Ingrese cantidad de llamadas que realizo el cliente: ";    cin>>usuarios[n].nllam;fflush(stdin);
  34.       cout<<endl;
  35.      
  36.       cout<<"Ingreso de datos de llamadas que realizo el cliente "<<usuarios[n].usuario<<endl;
  37.       for(int i=1;i<=usuarios[n].nllam;i++)
  38.       {   cout<<"Ingrese el "<<i<<" numero: ";       gets(usuarios[n].llam[i].numTlf); fflush(stdin);
  39.           cout<<"Ingrese la duracion de la llamada: ";    cin>>usuarios[n].llam[i].tiempo; fflush(stdin);
  40.           cout<<endl<<"Ingrese la fecha que se realizo la llamada dd/mm/aaaa: ";   cin>>usuarios[n].llam[i].f.dia>>usuarios[n].llam[i].f.mes>>usuarios[n].llam[i].f.anio;fflush(stdin);
  41.           cout<<endl;
  42.       }
  43.  
  44.       n++;
  45. }  
  46.  
  47.  
  48. void ImprimeDatos(LineaControl usuarios[],int &n)
  49. {    
  50.       cout<<"Los datos ingresados fueron: "<<endl<<endl;
  51.       for(int i=1;i<n;i++)
  52.       {
  53.       cout<<"..................................................."<<endl;
  54.       cout<<"numero del cliente: "<<usuarios[i].numero;               cout<<endl<<endl;
  55.       cout<<"nombre del cliente: "<<usuarios[i].usuario;cout<<endl;
  56.       cout<<"datos de llamadas que realizo el cliente "<<usuarios[i].usuario<<endl;
  57.         for(int j=1;j<=usuarios[i].nllam;j++)
  58.         {   cout<<usuarios[i].llam[j].numTlf<<endl;
  59.             cout<<"duracion de la llamada: "<<usuarios[i].llam[j].tiempo<<endl;
  60.             cout<<"fecha que se realizo la llamada dd/mm/aaaa: "<<usuarios[i].llam[j].f.dia<<"  "<<usuarios[i].llam[j].f.mes<<"  "<<usuarios[i].llam[j].f.anio;
  61.             cout<<endl<<endl;
  62.         }
  63.       cout<<"..................................................."<<endl;
  64.       }
  65. cout<<endl<<endl;
  66.  
  67. /* ACA ES DONDE EXPLICO QUE SI ME FUNCIONA SIN CREAR LA FUNCION QYE ME PIDEN
  68.  
  69.      int posic;
  70.       for(int i=1;i<n;i++)
  71.       {    float mayor=0;
  72.            for(int j=1;j<=usuarios[i].nllam;j++)
  73.            {   if(usuarios[i].llam[j].tiempo>mayor)
  74.                {mayor=usuarios[i].llam[j].tiempo;}
  75.            }
  76.            for(int j=1;j<=usuarios[i].nllam;j++)
  77.            {    if(mayor==usuarios[i].llam[j].tiempo)
  78.                 {posic=j;}
  79.            }
  80.            cout<<"La llamada mas larga que realizo "<<usuarios[i].usuario<<" fue al numero: "<<usuarios[i].llam[posic].numTlf<<" y duro: "<<usuarios[i].llam[posic].tiempo<<" en el mes de "<<usuarios[i].llam[posic].f.mes<<endl;
  81.      
  82.       }
  83. ACA TERMINA*/
  84.  
  85. }
  86.  
  87. void consumo(LineaControl usuarios[],int &n,llamada llam.numTlf[],fecha f.mes)
  88. {     int posic;
  89.       for(int i=1;i<n;i++)
  90.       {    float mayor=0;
  91.            for(int j=1;j<=usuarios[i].nllam;j++)      //busco el de mayor tiempo de llamada
  92.            {   if(usuarios[i].llam[j].tiempo>mayor)
  93.                {mayor=usuarios[i].llam[j].tiempo;}
  94.            }
  95.            for(int j=1;j<=usuarios[i].nllam;j++)   //busco a quien le pertenece ese mayor tiempo de llamada
  96.            {    if(mayor==usuarios[i].llam[j].tiempo)
  97.                 {posic=j;}
  98.            }
  99.          
  100.           cout<<"La llamada mas larga que realizo "<<usuarios[i].usuario<<" fue al numero: "<<
  101.           cout<<usuarios[i].llam[posic].numTlf<<" y duro: "<<usuarios[i].llam[posic].tiempo<<" en el mes de "<<
  102.           cout<<usuarios[i].llam[posic].f.mes<<endl;
  103.       }
  104.  
  105. }
  106.  
  107. int main()
  108. {    int personas,i,n=1;
  109.      fecha f;
  110.      llamada llam[];
  111.      
  112.      cout<<"Ingrese la cantidad de personas a procesar: ";  cin>>personas;
  113.      
  114.      for(i=1;i<=personas;i++)
  115.      {    IngresaDatos(usuarios,n);
  116.      
  117.      }
  118.      ImprimeDatos(usuarios,n);
  119.      consumo(usuarios,n,llam.numTlf,f.mes);
  120.      
  121.      
  122.      system("PAUSE");
  123.      return 0;
  124. }
  125.  
GRACIAS POR SU PACIENCIA Y AYUDA

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Como declaro miembros de una struct en una funcion
« Respuesta #7 en: Lunes 19 de Octubre de 2009, 12:52 »
0
A ver. Sigues empeñado en poner nombres con referencias a registros en los parámetros de las funciones. En los parámetros de funciones sólo necesitas poner el tipo. Olvídate de si está en una estructura de datos. La función no lo necesita saber  ^_^

Código: C
  1. void consumo(LineaControl usuarios[],int &n,llamada llam.numTlf[],fecha f.mes);
  2.  
sería:

Código: Text
  1. int consumo(char usuarios[],char numTlf[],int mes);
  2.  
He suprimido n como referencia. Haz que la función devuelva ese valor con un return, siempre es más limpio y más rápido. Fíjate que declaro directamente los parámetros que necesito. No te comas la cabeza con si el mes está en fecha o no. Simplemente cuando quieras usar la función, llámala con los parámetros adecuados:

Código: C
  1. n = consumo(usuarios, una_llamada.numTlf, f.mes);
  2.  
Otro pequeño apunte: los tipos creados por ti es mejor identificarlos como tipo poniendo una t o algún carácter delante, o crear una regla para nombrarlos que las diferencien de las variables. Sino te haces un lío con tipos y variables, y el código es un caos al final.