• Lunes 29 de Abril de 2024, 03:17

Autor Tema:  Estructuras  (Leído 3130 veces)

alexancoC++

  • Nuevo Miembro
  • *
  • Mensajes: 14
    • Ver Perfil
Estructuras
« en: Domingo 8 de Abril de 2007, 15:53 »
0
Buenas, tengo un problemilla con una práctica que estoy haciendo de estructuras.
Tengo la siguiente estructura:

Código: Text
  1.  
  2.  
  3. #define N 30
  4. #define LON 25
  5.  
  6. struct asignatura
  7. {
  8.   char Nombre[LON];
  9.   int codigo;
  10.   float Nota;
  11.   int año;
  12. };
  13.  
  14. struct alumno
  15. {
  16.   char Nombre[LON];
  17.   long dni;
  18.   int Edad;
  19.   float media;
  20.   asignatura asignaturas[40];
  21. }Clase[N];
  22.  
  23.  
  24.  

Primeramente tengo que definir un vector Clase donde se guardaran todos los alumnos, que como máximo seran 30. ¿Esta definido correctamente en la estructura de alumno (Clase[N])?

Posteriormente, el programa pide el DNI de un alumno, si este no existe se pide el nombre, la edad y luego se mostrará un menú de asignaturas (introducir asignatura, modificar, salir). Si el DNI introducido existe aparecerá directamente el menú de asignaturas.
¿Como miro si el DNI introducido después de pedirlo existe o no? ¿Tengo que tener en cuenta el vector clase que como máximo tiene 30?

¿Alguna idea de como hacerlo?

Gracias de antemano!!

SteelX

  • Miembro MUY activo
  • ***
  • Mensajes: 218
    • Ver Perfil
Re: Estructuras
« Respuesta #1 en: Lunes 9 de Abril de 2007, 21:03 »
0
puedes hacer una funcion search o buscar. que reciba como parametro el vector de alumnos y el numero (DNI)  a buscar.. que retorne un booleano.. true si lo encontro y false si no.. lo recibes en un condicional que te muestre los respectivos menues.

No tengo que decirte que vas a tener que recorer el vector de alumnos , es decir la clase para buscar si esta el DNI.

pero por si acaso

for(i=0;i< N;i++)
{
   if ( CLase.DNI==DNI_introducido)
         return true;
}

return false; por si no encontro


N seria lo que llevas introducido hasta ahora... no sera necesario recorer los 30 si llevas 5 .
Inside the code

alexancoC++

  • Nuevo Miembro
  • *
  • Mensajes: 14
    • Ver Perfil
Re: Estructuras
« Respuesta #2 en: Miércoles 11 de Abril de 2007, 23:38 »
0
Muchas gracias por tu ayuda!!!! me fue muy bien.

Pero una pregunta, como hago para cuando devuelva el booleano en un condicional me muestre los menús (con un if-else???).
Este punto es el que no acabo de entender muy bien.

Muchas muchas muchas gracias!!

Saludos.

SteelX

  • Miembro MUY activo
  • ***
  • Mensajes: 218
    • Ver Perfil
Re: Estructuras
« Respuesta #3 en: Jueves 12 de Abril de 2007, 04:45 »
0
Cita de: "alexancoC"


Pero una pregunta, como hago para cuando devuelva el booleano en un condicional me muestre los menús (con un if-else???).
Este punto es el que no acabo de entender muy bien.

 
Pues seria algo como esto

2 funciones.
1 cuando  es el Alumno
1 cuando es el Asignatura

if(encontro)
    funcion_asignatura()
else
    funcion_alumno()


y asi
Inside the code

alexancoC++

  • Nuevo Miembro
  • *
  • Mensajes: 14
    • Ver Perfil
Re: Estructuras
« Respuesta #4 en: Jueves 12 de Abril de 2007, 23:19 »
0
Una ultima pregunta.
Cuando pido el DNI al principio, se lo paso al vector clase asi?
Código: Text
  1.  
  2. printf(&#34;Introduce el dni&#092;n&#34;);
  3. scanf(&#34;%d&#34;,&Classe[i].dni);
  4.  
  5.  
O no lo paso en el vector y lo paso como un scanf("%d",&dni) por ejemplo? Porque luego cuando hago la funcion buscar que reciba como parametro el vector de alumnos y el dni a buscar, de que forma se lo paso?

Muchisimas gracias!!!!!

saludos.

SteelX

  • Miembro MUY activo
  • ***
  • Mensajes: 218
    • Ver Perfil
Re: Estructuras
« Respuesta #5 en: Viernes 13 de Abril de 2007, 00:57 »
0
Luego primero no tienes que comprobar si existe??. si se lo pasas a la estructura lo estas introduciendo, sera mejor que lo almacenes en una variable diferente a la estructura.

int DNI_In=0;
lo recibes y despues lo comparas con el de la clase
Inside the code

alexancoC++

  • Nuevo Miembro
  • *
  • Mensajes: 14
    • Ver Perfil
Re: Estructuras
« Respuesta #6 en: Domingo 15 de Abril de 2007, 18:35 »
0
Hola de nuevo, sigo avanzando con la práctica. Recordando la estructura:
Código: Text
  1.  
  2. struct asignatura
  3. {
  4.   char Nombre[LON];
  5.   int codigo;
  6.   float Nota;
  7.   int año;
  8. };
  9.  
  10. struct alumno
  11. {
  12.   char Nombre[LON];
  13.   long dni;
  14.   int Edad;
  15.   float media;
  16.   asignatura Asignatures[M];
  17. }Clase[N];
  18.  
  19.  

Tengo que introducir una asignatura mirando que el codigo de la misma no exista. He pensado en hacer un bool como antes, sería esto?:

Código: Text
  1.  
  2. bool buscar_codigo(alumno Clase[],int num)
  3. {
  4.   int i;
  5.   for(i=0;i&#60;N;i++)
  6.   {
  7.     if(Clase[i].Asignatures[i].codigo==num)
  8.     {
  9.       return true;
  10.     }
  11.   }return false;
  12. }
  13.  
  14.  
Esta función me da errooorrr!!!!!!

Después de comprobar que el codigo no esta, podría ponerle el nombre a la asignatura de esta forma?:

printf("Introduce el nombre de la asignatura:\n");
scanf("%s",&Clase.Asignatures.Nombre);

Gracias. Saludos.

SteelX

  • Miembro MUY activo
  • ***
  • Mensajes: 218
    • Ver Perfil
Re: Estructuras
« Respuesta #7 en: Lunes 16 de Abril de 2007, 18:25 »
0
Código: Text
  1.  
  2. for(i=0;i&#60;N;i++)
  3.  
  4.  

te da error  porque no sabe que es N???
Inside the code

alexancoC++

  • Nuevo Miembro
  • *
  • Mensajes: 14
    • Ver Perfil
Re: Estructuras
« Respuesta #8 en: Lunes 16 de Abril de 2007, 23:08 »
0
N lo tengo definido arriba de esta forma:

Código: Text
  1.  
  2. #define N 30
  3. #define M 40
  4. #define LON 25
  5.  
  6. bool buscar_codigo(alumno [],int );
  7.  
  8.  

Quizás tengo mal definida la función.
Para llamarlo lo hago de esta forma:

Código: Text
  1.  
  2. c=buscar_codigo(Clase[i].Asignatures,codigo_in);
  3. if(c==1)
  4. {
  5.   printf(&#34;Asignatura ja introducida&#092;n&#34;);
  6.   printf(&#34;Vuelve a introducir el codigo&#092;n&#34;);
  7.   scanf(&#34;%d&#34;,&codigo_in);
  8.                 c=buscar_codigo(Clase[i].Asignatures,codigo_in);
  9. }
  10.  
  11.  

Si el codigo existe vuelvo a llamar a la función. ¿Es así? ¿Se llama asi a la función y se define asi?

SteelX

  • Miembro MUY activo
  • ***
  • Mensajes: 218
    • Ver Perfil
Re: Estructuras
« Respuesta #9 en: Martes 17 de Abril de 2007, 05:02 »
0
Código: Text
  1.  
  2.  
  3. bool buscar_codigo(alumno Clase[],int num)
  4. {
  5.   int i;
  6.   for(i=0;i&#60;N;i++)
  7.   {
  8.     if(Clase[i].Asignatures[i].codigo==num)
  9.     {
  10.       return true;
  11.     }
  12.   }return false;
  13. }
  14.  
  15.  
  16.  

tu funcion la veo bien implementada..

el problema es cuando la llamas
Código: Text
  1.  
  2. c=buscar_codigo(Clase[i].Asignatures,codigo_in);
  3.  
  4.  

en tu declaracion le pasas como parametro un array de alumnos
y en el llamado le estas pasando un array de
Código: Text
  1.  
  2. asignatura Asignatures[M];
  3.  
  4.  
alli hay conflictos

si le pasaras
Código: Text
  1. c=buscar_codigo(Clase,codigo_in);
  2.  

no habria error
Inside the code

alexancoC++

  • Nuevo Miembro
  • *
  • Mensajes: 14
    • Ver Perfil
Re: Estructuras
« Respuesta #10 en: Martes 17 de Abril de 2007, 12:53 »
0
Perfecto, ya no me da error!!!

Si tengo la siguiente estructura:

Código: Text
  1.  
  2. struct asignatura
  3. {
  4.   char Nombre[LON];
  5.   int codigo;
  6.   float Nota;
  7.   int año;
  8. };
  9.  
  10. struct alumno
  11. {
  12.   char Nombre[LON];
  13.   long dni;
  14.   int Edad;
  15.   float media;
  16.   asignatura Asignatures[M];
  17. }Clase[N];
  18.  
  19.  
Y quiero que me devuelva la nota media de las asignaturas que tiene, tendría que sumar la nota de todas sus asiganturas con un for dentro de cada alumno, y luego calcular la media y pasarla a Classe.media??

SteelX

  • Miembro MUY activo
  • ***
  • Mensajes: 218
    • Ver Perfil
Re: Estructuras
« Respuesta #11 en: Martes 17 de Abril de 2007, 16:24 »
0
Cita de: "alexancoC"
Y quiero que me devuelva la nota media de las asignaturas que tiene, tendría que sumar la nota de todas sus asiganturas con un for dentro de cada alumno, y luego calcular la media y pasarla a Classe.media??
Sip. puedes usar cualquier loop para hallar la media.
Inside the code

alexancoC++

  • Nuevo Miembro
  • *
  • Mensajes: 14
    • Ver Perfil
Re: Estructuras
« Respuesta #12 en: Jueves 19 de Abril de 2007, 23:13 »
0
Hola de nuevo!!!! Ya he acabado la practica. Pero al parecer cundo le paso los valores a la estructura assignatura no los debe leer bien. Me los acepta y no me da errores, pero al calcular la media de las notas no me encuentra ningun valor de assignatura.
Es posible que el problema este al llamar esta función? NO PUEDO UTILIZAR VARIABLES GLOBALES!!!
La función es la siguiente:

Código: Text
  1.  
  2. void menu_assignatures(assignatura t[M])
  3. {
  4.   int opcio;
  5.  
  6.   while(opcio!=3)
  7.   {
  8.     printf(&#34;Estas al menu Assignatures!&#092;n&#092;n&#34;);
  9.     printf(&#34;Quina opcio vols realitzar?&#092;n&#092;n&#34;);
  10.     printf(&#34;1. Introduir assignatura.&#092;n&#34;);
  11.     printf(&#34;2. Modificar assignatura.&#092;n&#34;);
  12.     printf(&#34;3. Sortir.&#092;n&#34;);
  13.     scanf(&#34;%d&#34;,&opcio);
  14.  
  15.     switch(opcio)
  16.     {
  17.       case 1:
  18.                                   {
  19.       int codi_in=0,c=0,i=0,j=0,m=0;
  20.  
  21.       printf(&#34;Entra el codi de l'assignatura:&#092;n&#34;);
  22.       scanf(&#34;%d&#34;,&codi_in);
  23.       c=buscar_codi(t,codi_in);
  24.       while(c==1)
  25.       {
  26.       printf(&#34;Assignatura ja introduida&#092;n&#34;);
  27.       printf(&#34;Torna a introduir el codi&#092;n&#34;);
  28.       scanf(&#34;%d&#34;,&codi_in);
  29.       c=buscar_codi(t,codi_in);
  30.       }
  31.       if(c==0)
  32.       {
  33.       if(i&#60;40)
  34.       {
  35.       t[i].codi=codi_in;
  36.       printf(&#34;Introdueix el nom de l'assignatura:&#092;n&#34;);
  37.       scanf(&#34;%s&#34;,t[i].Nom);
  38.       printf(&#34;Ara la nota de l'expedient:&#092;n&#34;);
  39.       scanf(&#34;%f&#34;,&t[i].Nota);
  40.       printf(&#34;I per ultim lany en que la va realitzar:&#092;n&#34;);
  41.       scanf(&#34;%d&#34;,&t[i].any);
  42.       i++;
  43.       }
  44.       else
  45.       {
  46.     printf(&#34;L'alumne no pot tenir mes assignatures&#092;n&#34;);
  47.       }
  48.       }
  49.          
  50.       break;
  51.       }
  52.       case 2:
  53.       {
  54.       int busca_codi=0,b=0,i=0;
  55.  
  56.   printf(&#34;De quina assignatura vols modificar la nota i l'any?&#092;n&#34;);
  57.       scanf(&#34;%d&#34;,&busca_codi);
  58.       b=buscar_codi(t,busca_codi);
  59.       if(b==1)
  60.       {
  61.       printf(&#34;Quina es la nova nota de l'alumne?&#092;n&#34;);
  62.       scanf(&#34;%d&#34;,&t[i].Nota);
  63.       printf(&#34;I el nou any?&#092;n&#34;);
  64.       scanf(&#34;%d&#34;,&t[i].any);
  65.       i++;
  66.       }
  67.       else
  68.       {
  69.       printf(&#34;Aquest codi no existeix!&#092;n&#092;n&#34;);
  70.       }
  71.       break;
  72.                     }
  73.       case 3:
  74.       {
  75.       break;
  76.       }
  77.     }
  78.   }
  79. }
  80.  
  81.  

A esta función la llamo asi:
Código: Text
  1.  
  2. menu_assignatures(Classe[i].Assignatures);
  3.  
  4.  
Y definida de la siguiente manera:
Código: Text
  1.  
  2. void menu_assignatures(assignatura []);
  3.  
  4.  

No se lo que puede pasar pero no debo hacer algo bien al llamar la función o dentro de ella.
Gracias de todos modos!!!!!
Saludos!

SteelX

  • Miembro MUY activo
  • ***
  • Mensajes: 218
    • Ver Perfil
Re: Estructuras
« Respuesta #13 en: Viernes 20 de Abril de 2007, 05:08 »
0
Bueno tengo 2 cosas.

1- No se Mucho catalan. casi 0.
2- Usa el depurador para ver si sigues conservando los datos

cuando pasas un array a una funcion este conserva los datos. pero el array esta dentro de uns estructura y eso puede generar problemas de conservacion de datos.
Inside the code