Programación General > C/C++
Problema con un programa
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
[#] Página Siguiente
Ir a la versión completa