Programación General > C/C++

 Problema con un programa

(1/2) > >>

tonimekan:
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++ ---#include<stdio.h>#include<stdlib.h>#include<string.h>#include "alumnos.h"#include "grupos.h"#include "miString.h"#include "tipos.h"   int main(int argc,char* argv[]) /*como argumentos este programa tiene el nombre y el numero de alumnos*/{    char nom[MAX_NOM];    int num, i;    alumno aux;    grupo grup;         if (argc!=3) /*control de errores*/        return -1;     fflush(stdin);/*limpio el buffer*/    if (sscanf(argv[1], "%s", nom)!=1)        return -2;    if (sscanf(argv[2], "%d", &num)!=1)        return -2;    printf("%s %dn", nom, num);              iniGrupo(&grup, nom); /*inicializo llmando a la función*/         for (i=0;i<2;++i)        {           leeAlumno(&aux);        addAlumnoGrupo(aux, &grup);    }     calculaNotas(&grup);/*calculo las notas, media, mejor, peor*/    printGrupo(&grup);/*imprimo por pantalla todos los datos*/     return 1; } 


Aquí dejo las funciones de alumnos.c


--- Código: C++ ---#include <stdio.h>#include <stdlib.h>#include "alumnos.h"#include "tipos.h"#include "miString.h"  /*=== Funciones =============================================================*/    /*----------------------------------------------------------------------------- Nombre: leeAlumno Descripción: la función pide el nombre del alumno y su nota,y se lee. Argumentos de entrada: (Enumeración de los argumentos por orden de aparición enel prototipo indicando para que sirven)   se pide por pantalla en nombre y nota Retorno: (Enumeración de los valores que puede devolver la función indicando enque circunstancias)- OK, si se ha terminado sin problemas  -----------------------------------------------------------------------------*/ status leeAlumno (alumno * al){    fflush(stdin);    printf("Escriba el nombre del alumnon");    scanf("%s",al->nombre); /*scanf("%s", (*al).nombre); => es lo mismo*/     do    {                printf("Escriba la nota del alumnon");        scanf("%f", &al->nota);            }while ((al->nota>=10) || (al->nota<=0)); /*control de errores*/        return OK;}   /*----------------------------------------------------------------------------- Nombre: getAlumnoNota Descripción: Conocer la nota del alumno: quien llame a esta función desea conocer la nota del alumno, por lo que esta función debe devolver dicha nota. Argumentos de entrada: (Enumeración de los argumentos por orden de aparición enel prototipo indicando para que sirven)1. al, es el alumno Retorno: (Enumeración de los valores que puede devolver la función indicando enque circunstancias)- Devuelve la nota  -----------------------------------------------------------------------------*/ float getAlumnoNota (alumno * al){    return al->nota;}    /*----------------------------------------------------------------------------- Nombre: getAlumnoNombre Descripción: Conocer el nombre del alumno: quien llame a esta función desea conocer el nombre del alumno, por lo que esta función debe devolver dicho nombre. Argumentos de entrada: (Enumeración de los argumentos por orden de aparición enel prototipo indicando para que sirven)1. al, es el alumno Retorno: (Enumeración de los valores que puede devolver la función indicando enque circunstancias)- Devuelve el nombre  -----------------------------------------------------------------------------*/ char * getAlumnoNombre (alumno * al){    return al->nombre;}    /*----------------------------------------------------------------------------- Nombre: printAlumno  Descripción: Imprimir datos de un alumno: se mostrarán por pantalla Argumentos de entrada: (Enumeración de los argumentos por orden de aparición enel prototipo indicando para que sirven)al, que es el alumno Retorno: (Enumeración de los valores que puede devolver la función indicando enque circunstancias)- OK, si se ha terminado sin problemas -----------------------------------------------------------------------------*/ status printAlumno (alumno * al){        printf("Nombre del alumno: %s ,con nota: %.2fn",getAlumnoNombre(al),getAlumnoNota(al));    return OK;    }   /*----------------------------------------------------------------------------- Nombre: alumnoCmp Descripción: Comparar dos alumnos: serán iguales si su nombre es el mismo, sean cuales sean sus notas, y distintos si difieren en el nombre. Argumentos de entrada: (Enumeración de los argumentos por orden de aparición enel prototipo indicando para que sirven)2 alumnos, al1 y al2 Retorno: (Enumeración de los valores que puede devolver la función indicando enque circunstancias)- devuelve la comparacion de 2 alumnos. -----------------------------------------------------------------------------*/ int alumnoCmp (alumno * al1, alumno * al2){    return myStrcmp(al1->nombre,al2->nombre);        }  /*----------------------------------------------------------------------------- Nombre: alumnoCopy Descripción: Copiar datos de un alumno a otro Argumentos de entrada: (Enumeración de los argumentos por orden de aparición enel prototipo indicando para que sirven)1. al1, alumno 12. al2, alumno 2 Retorno: (Enumeración de los valores que puede devolver la función indicando enque circunstancias)- al1, devuelve el alumno primero.  -----------------------------------------------------------------------------*/ alumno * alumnoCopy (alumno * al1, alumno * al2){        myStrcpy(al1->nombre,al2->nombre);    al1->nota=al2->nota;     return al1; } 

aquí las funciones de grupos.c


--- Código: C++ ---#include <stdio.h>#include <stdlib.h>#include <string.h>#include "grupos.h"#include "alumnos.h"#include "tipos.h"#include "miString.h" /*=== Funciones =============================================================*/    /*----------------------------------------------------------------------------- Nombre: iniGrupo Descripción: inicializa todos los campos. Retorno: (Enumeración de los valores que puede devolver la función indicando enque circunstancias)- OK, si se ha terminado sin problemas- ERROR en caso contrario. -----------------------------------------------------------------------------*/  status iniGrupo (grupo * a, char * nombre){    if(a==NULL)         return ERROR;    myStrcpy(a->nombregrup, nombre);    a->mejornota = 0;    a->peornota = 10;    a->notamedia = 0;    a->mejoralum = NULL;    a->peoralum = NULL;     return OK;}   /*----------------------------------------------------------------------------- Nombre: estaAlumnoGrupo Descripción: Comprueba si esta el alumno en un grupo. Retorno: (Enumeración de los valores que puede devolver la función indicando enque circunstancias)- TRUE o FALSE/*--------------------------------------------------------------------------------*/ boolean estaAlumnoGrupo (alumno * al, grupo * gr){    int i=0;    for (i=0;i<MAX_ALUM;i++)    {        if ((myStrcmp(gr->clase[i].nombre,al->nombre))==0)            return TRUE;    }    return FALSE;}   /*----------------------------------------------------------------------------- Nombre: grupoLleno Descripción: Comprueba que el grupo no esté lleno.  Retorno: (Enumeración de los valores que puede devolver la función indicando enque circunstancias)TRUE, si el grupo lleno, FALSE en caso contrario -----------------------------------------------------------------------------*/ boolean grupoLleno (grupo * gr){    if (gr->numalum==MAX_ALUM)        return TRUE;    return FALSE;} /*=== Funciones =============================================================*/ /*----------------------------------------------------------------------------- Nombre: grupoVacio Descripción: Comprueba si el grupo está vacio. Argumentos de entrada: (Enumeración de los argumentos por orden de aparición enel prototipo indicando para que sirven)1. nmr, número entero para pasar ...2. cdn, puntero a una cadena de caracteres para... Retorno: (Enumeración de los valores que puede devolver la función indicando enque circunstancias)TRUE, si está vacío, FALSE en caso contrario -----------------------------------------------------------------------------*/ boolean grupoVacio (grupo * gr){    if (gr->numalum==0)        return TRUE;    return FALSE;}    /*----------------------------------------------------------------------------- Nombre: addAlumnoGrupo Descripción: Añade un alumno al grupo. Retorno: (Enumeración de los valores que puede devolver la función indicando enque circunstancias)- Comprueba que no esté lleno.- OK, si se ha terminado sin problemas-ERROR, si ha habido problemas -----------------------------------------------------------------------------*/ status addAlumnoGrupo (alumno al, grupo * gr){    int i,num=2;    gr->numalum=num;; ///////////////////////////////////////////////AQUI HAY QUE IGUALAR AL Nº INTRODUCIDO COMO ARGUMENTOS/////////////////////////7    if (grupoLleno(gr)==TRUE)        return ERROR;    else if ((estaAlumnoGrupo(&al, gr))==TRUE)/*como al no es un puntero, hay que ponerle & para que le llegue como puntero*/        return ERROR;    else    {                for(i=0; i<=(gr->numalum);i++)        {        fflush(stdin),        strcpy(gr->clase[i].nombre, al.nombre);        gr->clase[i].nota=al.nota;        }        return OK;     }/*fin del else*/}   /*----------------------------------------------------------------------------- Nombre: calculaNotas Descripción: Calcula las notas de los alumnos. Retorno: (Enumeración de los valores que puede devolver la función indicando enque circunstancias)-Comprueba que el grupo no esté vacío.- OK, si se ha terminado sin problemas- ERROR en caso contrario. -----------------------------------------------------------------------------*/ status calculaNotas (grupo * gr){    int i=0;    float aux=0;      if ((grupoVacio(gr))==TRUE)        return ERROR;     for (i=0;i<(gr->numalum);i++)    {        aux+=gr->clase[i].nota;        if (gr->clase[i].nota>gr->mejornota)        {            gr->mejornota=gr->clase[i].nota;            gr->mejoralum=&(gr->clase[i]);        }/*fin del if*/        if (gr->clase[i].nota<gr->peornota)        {            gr->peornota=gr->clase[i].nota;            gr->peoralum=&(gr->clase[i]);        }/*fin del if*/    }/*fin del for*/    aux/=gr->numalum;    gr->notamedia=aux;    return OK;}   /*----------------------------------------------------------------------------- Nombre: printGrupo Descripción: Imprime por pantalla todo el grupo. Retorno: (Enumeración de los valores que puede devolver la función indicando enque circunstancias)- OK, si se ha terminado sin problemas- ERROR en caso contrario.- Comprueba que el grupo no este vacío. -----------------------------------------------------------------------------*/ status printGrupo (grupo * gr){    int i;        if ((grupoVacio(gr))==TRUE) /*control de errores*/        return ERROR;     printf("Nombre del grupo: %sn", gr->nombregrup);    printf("Numero de alumnos: %dn", gr->numalum);          for (i=0;i<(gr->numalum);i++)        printAlumno(&gr->clase[i]);     printf("Mejor nota: %.2f: , alumno: %s n", gr->mejornota,gr->mejoralum);    printf("Peor nota: %.2f: , alumno: %s n", gr->peornota,gr->peoralum);    printf("Nota media: %.2fn", gr->notamedia);        return OK; }  

y aqui alumnos.h, solo la estructura


--- Código: C++ ---typedef struct ALUMNO{    char nombre [MAX_NOM];    float nota; }alumno; 
y aqui grupos.h


--- Código: C++ ---typedef struct GRUPO{    char nombregrup[MAX_NOM];    int numalum;    alumno clase [MAX_ALUM],*mejoralum,*peoralum;    float notamedia,mejornota,peornota;     }grupo;  


Muchas gracias por vuestra ayuda  ;)

m0skit0:
Vale, muy bien, pero ¿cuál es el problema?  <_<


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

tonimekan:
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:
¿Por qué usas sscanf()? strcpy() y atoi() vienen mejor, creo...


--- Código: C ---strcpy(nom, argv[1]);num = atoi(argv[2]); 
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:
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

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa