• Martes 17 de Diciembre de 2024, 11:56

Autor Tema:  Problema con un programa  (Leído 1527 veces)

tonimekan

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Problema con un programa
« en: Viernes 17 de Abril de 2009, 09:35 »
0
hola, mi problema es el siguiente, yo introduzco por teclado alumnos y notas, y el programa me devuelve los alumnos que hay, las notas, la mejor nota y el mejor alumno, la peor nota y el peor alumno y la nota media.cuando quiero imprimir por pantalla los nombres y notas de los alumnos, solo me imprime uno, el ultimo, aqui dejo todo el codigo y en un rar todo el workspace, estoy programando en visual basic 6.0, y el programa tiene como argumentos el nombre del grupo y el numero de alumnos que se quieren introducir.



Esto es el programa principal
Código: C++
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<string.h>
  4. #include "alumnos.h"
  5. #include "grupos.h"
  6. #include "miString.h"
  7. #include "tipos.h"
  8.  
  9.  
  10.  
  11. int main(int argc,char* argv[]) /*como argumentos este programa tiene el nombre y el numero de alumnos*/
  12. {
  13.     char nom[MAX_NOM];
  14.     int num, i;
  15.     alumno aux;
  16.     grupo grup;
  17.    
  18.  
  19.     if (argc!=3) /*control de errores*/
  20.         return -1;
  21.  
  22.     fflush(stdin);/*limpio el buffer*/
  23.     if (sscanf(argv[1], "%s", nom)!=1)
  24.         return -2;
  25.     if (sscanf(argv[2], "%d", &num)!=1)
  26.         return -2;
  27.     printf("%s %dn", nom, num);
  28.    
  29.    
  30.  
  31.  
  32.     iniGrupo(&grup, nom); /*inicializo llmando a la función*/
  33.  
  34.    
  35.     for (i=0;i<2;++i)
  36.    
  37.     {   
  38.         leeAlumno(&aux);
  39.         addAlumnoGrupo(aux, &grup);
  40.     }
  41.  
  42.     calculaNotas(&grup);/*calculo las notas, media, mejor, peor*/
  43.     printGrupo(&grup);/*imprimo por pantalla todos los datos*/
  44.  
  45.     return 1;
  46.  
  47. }
  48.  



Aquí dejo las funciones de alumnos.c

Código: C++
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include "alumnos.h"
  4. #include "tipos.h"
  5. #include "miString.h"
  6.  
  7.  
  8. /*=== Funciones =============================================================*/
  9.  
  10.  
  11.  
  12.  
  13. /*-----------------------------------------------------------------------------
  14.  
  15. Nombre: leeAlumno
  16.  
  17. Descripción: la función pide el nombre del alumno y su nota,y se lee.
  18.  
  19. Argumentos de entrada: (Enumeración de los argumentos por orden de aparición en
  20. el prototipo indicando para que sirven)
  21.  
  22.   se pide por pantalla en nombre y nota
  23.  
  24. Retorno: (Enumeración de los valores que puede devolver la función indicando en
  25. que circunstancias)
  26. - OK, si se ha terminado sin problemas
  27.  
  28.  
  29. -----------------------------------------------------------------------------*/
  30.  
  31. status leeAlumno (alumno * al)
  32. {
  33.     fflush(stdin);
  34.     printf("Escriba el nombre del alumnon");
  35.     scanf("%s",al->nombre); /*scanf("%s", (*al).nombre); => es lo mismo*/
  36.  
  37.     do
  38.     {
  39.        
  40.         printf("Escriba la nota del alumnon");
  41.         scanf("%f", &al->nota);
  42.        
  43.     }while ((al->nota>=10) || (al->nota<=0)); /*control de errores*/
  44.    
  45.     return OK;
  46. }
  47.  
  48.  
  49.  
  50. /*-----------------------------------------------------------------------------
  51.  
  52. Nombre: getAlumnoNota
  53.  
  54. Descripción: Conocer la nota del alumno: quien llame a esta función desea conocer la nota del alumno,
  55. por lo que esta función debe devolver dicha nota.
  56.  
  57. Argumentos de entrada: (Enumeración de los argumentos por orden de aparición en
  58. el prototipo indicando para que sirven)
  59. 1. al, es el alumno
  60.  
  61. Retorno: (Enumeración de los valores que puede devolver la función indicando en
  62. que circunstancias)
  63. - Devuelve la nota
  64.  
  65.  
  66. -----------------------------------------------------------------------------*/
  67.  
  68. float getAlumnoNota (alumno * al)
  69. {
  70.     return al->nota;
  71. }
  72.  
  73.  
  74.  
  75.  
  76. /*-----------------------------------------------------------------------------
  77.  
  78. Nombre: getAlumnoNombre
  79.  
  80. Descripción: Conocer el nombre del alumno: quien llame a esta función desea conocer el nombre del alumno,
  81.  por lo que esta función debe devolver dicho nombre.
  82.  
  83. Argumentos de entrada: (Enumeración de los argumentos por orden de aparición en
  84. el prototipo indicando para que sirven)
  85. 1. al, es el alumno
  86.  
  87. Retorno: (Enumeración de los valores que puede devolver la función indicando en
  88. que circunstancias)
  89. - Devuelve el nombre
  90.  
  91.  
  92. -----------------------------------------------------------------------------*/
  93.  
  94. char * getAlumnoNombre (alumno * al)
  95. {
  96.     return al->nombre;
  97. }
  98.  
  99.  
  100.  
  101.  
  102. /*-----------------------------------------------------------------------------
  103.  
  104. Nombre: printAlumno
  105.  
  106. Descripción: Imprimir datos de un alumno: se mostrarán por pantalla
  107.  
  108. Argumentos de entrada: (Enumeración de los argumentos por orden de aparición en
  109. el prototipo indicando para que sirven)
  110. al, que es el alumno
  111.  
  112. Retorno: (Enumeración de los valores que puede devolver la función indicando en
  113. que circunstancias)
  114. - OK, si se ha terminado sin problemas
  115.  
  116. -----------------------------------------------------------------------------*/
  117.  
  118. status printAlumno (alumno * al)
  119. {
  120.    
  121.     printf("Nombre del alumno: %s ,con nota: %.2fn",getAlumnoNombre(al),getAlumnoNota(al));
  122.     return OK;
  123.    
  124. }
  125.  
  126.  
  127.  
  128. /*-----------------------------------------------------------------------------
  129.  
  130. Nombre: alumnoCmp
  131.  
  132. Descripción: Comparar dos alumnos: serán iguales si su nombre es el mismo, sean cuales sean sus notas,
  133. y distintos si difieren en el nombre.
  134.  
  135. Argumentos de entrada: (Enumeración de los argumentos por orden de aparición en
  136. el prototipo indicando para que sirven)
  137. 2 alumnos, al1 y al2
  138.  
  139. Retorno: (Enumeración de los valores que puede devolver la función indicando en
  140. que circunstancias)
  141. - devuelve la comparacion de 2 alumnos.
  142.  
  143. -----------------------------------------------------------------------------*/
  144.  
  145. int alumnoCmp (alumno * al1, alumno * al2)
  146. {
  147.     return myStrcmp(al1->nombre,al2->nombre);
  148.        
  149. }
  150.  
  151.  
  152. /*-----------------------------------------------------------------------------
  153.  
  154. Nombre: alumnoCopy
  155.  
  156. Descripción: Copiar datos de un alumno a otro
  157.  
  158. Argumentos de entrada: (Enumeración de los argumentos por orden de aparición en
  159. el prototipo indicando para que sirven)
  160. 1. al1, alumno 1
  161. 2. al2, alumno 2
  162.  
  163. Retorno: (Enumeración de los valores que puede devolver la función indicando en
  164. que circunstancias)
  165. - al1, devuelve el alumno primero.
  166.  
  167.  
  168. -----------------------------------------------------------------------------*/
  169.  
  170. alumno * alumnoCopy (alumno * al1, alumno * al2)
  171. {
  172.    
  173.     myStrcpy(al1->nombre,al2->nombre);
  174.     al1->nota=al2->nota;
  175.  
  176.     return al1;
  177.  
  178. }
  179.  


aquí las funciones de grupos.c

Código: C++
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "grupos.h"
  5. #include "alumnos.h"
  6. #include "tipos.h"
  7. #include "miString.h"
  8.  
  9. /*=== Funciones =============================================================*/
  10.  
  11.  
  12.  
  13.  
  14. /*-----------------------------------------------------------------------------
  15.  
  16. Nombre: iniGrupo
  17.  
  18. Descripción: inicializa todos los campos.
  19.  
  20. Retorno: (Enumeración de los valores que puede devolver la función indicando en
  21. que circunstancias)
  22. - OK, si se ha terminado sin problemas
  23. - ERROR en caso contrario.
  24.  
  25. -----------------------------------------------------------------------------*/
  26.  
  27.  
  28. status iniGrupo (grupo * a, char * nombre)
  29. {
  30.     if(a==NULL)
  31.         return ERROR;
  32.     myStrcpy(a->nombregrup, nombre);
  33.     a->mejornota = 0;
  34.     a->peornota = 10;
  35.     a->notamedia = 0;
  36.     a->mejoralum = NULL;
  37.     a->peoralum = NULL;
  38.    
  39.  
  40. return OK;
  41. }
  42.  
  43.  
  44.  
  45. /*-----------------------------------------------------------------------------
  46.  
  47. Nombre: estaAlumnoGrupo
  48.  
  49. Descripción: Comprueba si esta el alumno en un grupo.
  50.  
  51. Retorno: (Enumeración de los valores que puede devolver la función indicando en
  52. que circunstancias)
  53. - TRUE o FALSE
  54. /*--------------------------------------------------------------------------------*/
  55.  
  56. boolean estaAlumnoGrupo (alumno * al, grupo * gr)
  57. {
  58.     int i=0;
  59.     for (i=0;i<MAX_ALUM;i++)
  60.     {
  61.         if ((myStrcmp(gr->clase[i].nombre,al->nombre))==0)
  62.             return TRUE;
  63.     }
  64.     return FALSE;
  65. }
  66.  
  67.  
  68.  
  69. /*-----------------------------------------------------------------------------
  70.  
  71. Nombre: grupoLleno
  72.  
  73. Descripción: Comprueba que el grupo no esté lleno.
  74.  
  75.  
  76. Retorno: (Enumeración de los valores que puede devolver la función indicando en
  77. que circunstancias)
  78. TRUE, si el grupo lleno, FALSE en caso contrario
  79.  
  80. -----------------------------------------------------------------------------*/
  81.  
  82. boolean grupoLleno (grupo * gr)
  83. {
  84.     if (gr->numalum==MAX_ALUM)
  85.         return TRUE;
  86.     return FALSE;
  87. }
  88.  
  89. /*=== Funciones =============================================================*/
  90.  
  91. /*-----------------------------------------------------------------------------
  92.  
  93. Nombre: grupoVacio
  94.  
  95. Descripción: Comprueba si el grupo está vacio.
  96.  
  97. Argumentos de entrada: (Enumeración de los argumentos por orden de aparición en
  98. el prototipo indicando para que sirven)
  99. 1. nmr, número entero para pasar ...
  100. 2. cdn, puntero a una cadena de caracteres para...
  101.  
  102. Retorno: (Enumeración de los valores que puede devolver la función indicando en
  103. que circunstancias)
  104. TRUE, si está vacío, FALSE en caso contrario
  105.  
  106. -----------------------------------------------------------------------------*/
  107.  
  108. boolean grupoVacio (grupo * gr)
  109. {
  110.     if (gr->numalum==0)
  111.         return TRUE;
  112.     return FALSE;
  113. }
  114.  
  115.  
  116.  
  117.  
  118. /*-----------------------------------------------------------------------------
  119.  
  120. Nombre: addAlumnoGrupo
  121.  
  122. Descripción: Añade un alumno al grupo.
  123.  
  124. Retorno: (Enumeración de los valores que puede devolver la función indicando en
  125. que circunstancias)
  126. - Comprueba que no esté lleno.
  127. - OK, si se ha terminado sin problemas
  128. -ERROR, si ha habido problemas
  129.  
  130. -----------------------------------------------------------------------------*/
  131.  
  132. status addAlumnoGrupo (alumno al, grupo * gr)
  133. {
  134.     int i,num=2;
  135.     gr->numalum=num;; ///////////////////////////////////////////////AQUI HAY QUE IGUALAR AL Nº INTRODUCIDO COMO ARGUMENTOS/////////////////////////7
  136.     if (grupoLleno(gr)==TRUE)
  137.         return ERROR;
  138.     else if ((estaAlumnoGrupo(&al, gr))==TRUE)/*como al no es un puntero, hay que ponerle & para que le llegue como puntero*/
  139.         return ERROR;
  140.     else
  141.     {
  142.        
  143.         for(i=0; i<=(gr->numalum);i++)
  144.         {
  145.         fflush(stdin),
  146.         strcpy(gr->clase[i].nombre, al.nombre);
  147.         gr->clase[i].nota=al.nota;
  148.         }
  149.         return OK;
  150.  
  151.     }/*fin del else*/
  152. }
  153.  
  154.  
  155.  
  156. /*-----------------------------------------------------------------------------
  157.  
  158. Nombre: calculaNotas
  159.  
  160. Descripción: Calcula las notas de los alumnos.
  161.  
  162. Retorno: (Enumeración de los valores que puede devolver la función indicando en
  163. que circunstancias)
  164. -Comprueba que el grupo no esté vacío.
  165. - OK, si se ha terminado sin problemas
  166. - ERROR en caso contrario.
  167.  
  168. -----------------------------------------------------------------------------*/
  169.  
  170. status calculaNotas (grupo * gr)
  171. {
  172.     int i=0;
  173.     float aux=0;
  174.  
  175.  
  176.     if ((grupoVacio(gr))==TRUE)
  177.         return ERROR;
  178.  
  179.     for (i=0;i<(gr->numalum);i++)
  180.     {
  181.         aux+=gr->clase[i].nota;
  182.         if (gr->clase[i].nota>gr->mejornota)
  183.         {
  184.             gr->mejornota=gr->clase[i].nota;
  185.             gr->mejoralum=&(gr->clase[i]);
  186.         }/*fin del if*/
  187.         if (gr->clase[i].nota<gr->peornota)
  188.         {
  189.             gr->peornota=gr->clase[i].nota;
  190.             gr->peoralum=&(gr->clase[i]);
  191.         }/*fin del if*/
  192.     }/*fin del for*/
  193.     aux/=gr->numalum;
  194.     gr->notamedia=aux;
  195.     return OK;
  196. }
  197.  
  198.  
  199.  
  200. /*-----------------------------------------------------------------------------
  201.  
  202. Nombre: printGrupo
  203.  
  204. Descripción: Imprime por pantalla todo el grupo.
  205.  
  206. Retorno: (Enumeración de los valores que puede devolver la función indicando en
  207. que circunstancias)
  208. - OK, si se ha terminado sin problemas
  209. - ERROR en caso contrario.
  210. - Comprueba que el grupo no este vacío.
  211.  
  212. -----------------------------------------------------------------------------*/
  213.  
  214. status printGrupo (grupo * gr)
  215. {
  216.     int i;
  217.    
  218.     if ((grupoVacio(gr))==TRUE) /*control de errores*/
  219.         return ERROR;
  220.  
  221.     printf("Nombre del grupo: %sn", gr->nombregrup);
  222.     printf("Numero de alumnos: %dn", gr->numalum);
  223.  
  224.    
  225.  
  226.     for (i=0;i<(gr->numalum);i++)
  227.         printAlumno(&gr->clase[i]);
  228.  
  229.     printf("Mejor nota: %.2f: , alumno: %s n", gr->mejornota,gr->mejoralum);
  230.     printf("Peor nota: %.2f: , alumno: %s n", gr->peornota,gr->peoralum);
  231.     printf("Nota media: %.2fn", gr->notamedia);
  232.    
  233.     return OK;
  234.  
  235. }
  236.  
  237.  


y aqui alumnos.h, solo la estructura

Código: C++
  1. typedef struct ALUMNO
  2. {
  3.     char nombre [MAX_NOM];
  4.     float nota;
  5.  
  6. }alumno;
  7.  

y aqui grupos.h

Código: C++
  1. typedef struct GRUPO
  2. {
  3.     char nombregrup[MAX_NOM];
  4.     int numalum;
  5.     alumno clase [MAX_ALUM],*mejoralum,*peoralum;
  6.     float notamedia,mejornota,peornota;
  7.  
  8.    
  9. }grupo;
  10.  
  11.  



Muchas gracias por vuestra ayuda  ;)

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Problema con un programa
« Respuesta #1 en: Viernes 17 de Abril de 2009, 10:01 »
0
Vale, muy bien, pero ¿cuál es el problema?  &lt;_&lt;

Cita de: "tonimekan"
estoy programando en visual basic 6.0
Supongo que querrás decir Visual C++ 6.0...  :P

tonimekan

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: Problema con un programa
« Respuesta #2 en: Viernes 17 de Abril de 2009, 10:04 »
0
el problema es que cuando yo quiero imprimir por pantalla el nombre de los alumnos y sus notas, solo me imprime uno, independientemente de los alumnos que yo introduzca por teclado. ese es uno.

y otro es: como argumentos del programa tiene el nombre del grupo(clase) y el numero de alumnos que se quiere introducir, pues la cosa es que el numero de alumnos se guarda en argv[2], y luego intento sacar lo que hay ahí dentro y no se como hacerlo para llevar ese valor a una función.


si. llevas razón, es visual basic 6.0 c++ xD

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Problema con un programa
« Respuesta #3 en: Viernes 17 de Abril de 2009, 10:50 »
0
¿Por qué usas sscanf()? strcpy() y atoi() vienen mejor, creo...

Código: C
  1. strcpy(nom, argv[1]);
  2. num = atoi(argv[2]);
  3.  

Prueba ahora pasando num como argumento a addAlumnoGrupo() y me dices qué tal.

Por cierto, boolean es un tipo de datos de C++, no de C. Ojito con esto. De todas formas haces una programación en C muy orientada a objetos. ¿Por qué no usas C++ directamente?

tonimekan

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Re: Problema con un programa
« Respuesta #4 en: Viernes 17 de Abril de 2009, 14:24 »
0
pero la función addAlumnoGrupo() recibe como argumentos un dato de tipo alumno, y un puntero de tipo grupo no? entonces como el paso num? que se supone que num es un int  :huh:


Gracias

m0skit0

  • Miembro de PLATA
  • *****
  • Mensajes: 2337
  • Nacionalidad: ma
    • Ver Perfil
    • http://fr33kk0mpu73r.blogspot.com/
Re: Problema con un programa
« Respuesta #5 en: Lunes 20 de Abril de 2009, 11:31 »
0
¿No le puedes añadir parámetros o qué?  :huh:

F_Tanori

  • Moderador
  • ******
  • Mensajes: 1919
  • Nacionalidad: mx
    • Ver Perfil
Re: Problema con un programa
« Respuesta #6 en: Lunes 20 de Abril de 2009, 12:14 »
0
Antes de ..
Código: C
  1. iniGrupo(&grup, nom);
  2.  

deberias colocar el numero no?

Código: C
  1. grup->numalum=num;
  2. iniGrupo(&grup, nom);
  3.  

o tener el metodo que lo inicialice

Código: C
  1. setNum(&grup,num)
  2.  


Ahora lo que esta muy raro es en la funcion addAlumnoGrupo cada vez que agregas un alumno al grupo, le dices que la cantidad de alumnos es 2 :S, sin sentido aparente


Código: C++
  1.  status addAlumnoGrupo (alumno al, grupo * gr)
  2. {
  3.     int i,num=2;
  4.    gr->numalum=num;
  5.  
  6.  

Saludos
" ExIsTo y A vEcEs PiEnSo "

NOTA:
===========================================================================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
===========================================================================================================================