buenas tengo un programa con lo siguiente esto es lo que me pieden
Escribir un programa que contenga los siguientes elementos:
1. Dos constantes de tipo entero cNotas = 3 y cEstudiantes = 100
2. Dos estructuras una llamada Estudiante y la otra llamada Notas.
3. La estructura Estudiante debe contener los siguientes atributos:
a. string cuenta
b. string nombre
c. int edad
d. char sexo
4. La estructura Estudiante debe contener los siguientes métodos:
a. Registrar_Estudiante: Donde se ingresan los datos del estudiante.
5. La Estructura RegistroNotas debe contener los siguientes atributos:
a. Estudiante alumno[cEstudiantes]
b. int notas[cNotas]
6. La Estructura RegistroNotas, debe recibir la cantidad de estudiantes a
procesar, además debe contener los siguientes métodos:
a. Registrar_Notas: Que realiza las siguientes acciones:
i. Un ciclo para operar la cantidad de Estudiantes.
ii. Invocar el método Registrar_Estudiante del objeto alumno.
iii. Solicitar las tres notas parciales
b. Calcular_NotaFinal: Que obtendrá el promedio de las tres notas
c. Imprimir_CuadroNotas: Debe recibir la cantidad de estudiantes
procesados, donde se imprimirá el cuadro de Notas, los datos a
imprimir son los siguientes:
i. cuenta
ii. nombre
iii. notas (se imprimirá las tres notas)
iv. nota final
v. El programa determinará quién es el estudiante con mayor Nota y el número de aprobados y reprobados.
7. Crear un procedimiento principal que realice las siguientes acciones
a. Crear un objeto de RegistroNotas RN
b. Solicitar el número de estudiantes a procesar
c. Invocar el método Registrar_Notas del objeto RN, pasando el número de estudiantes a procesar.
d. Invocar el método Imprimir_CuadroNotas del objeto RN, pasando el número de estudiantes procesados.
este es mi codigo
#include<iostream>
#include<string>
const int cNotas=3, cEstudiantes=100;
using namespace std;
struct estudiante {
string cuenta;
string nombre;
int edad;
char sexo;
void registrar_estudiantes(string cuenta ,string nombre ,int edad,char sexo ){
cout<<"ingresar cuenta";getchar ();
getline(cin,cuenta);
cout<<"ingresar nombre";getchar ();
getline(cin,nombre);
cout<<"ingresar edad";
cin>>edad;
cout<<"ingresar sexo";
cin>>sexo;
}
};
struct Notas{
estudiante alumno[cEstudiantes],ptom;
int notas[cNotas];
void registrar_notas(int nestudiante){
for (int i=0;nestudiante>i;i++)
{
cout<<"ingresar la informacion del estudiante "<<i<<endl;
alumno[i].registrar_estudiantes() ;
cout<<"ingresar nota 1";
cin>>notas[0];
cout<<"ingresar nota 2";
cin>>notas[1];
cout<<"ingresar nota 3";
cin>>notas[2];
}
}
int calcular_nta_final( estudiante alumno){
int promedio =(notas[0]+notas[1]+notas[2])/3;
return promedio;
}
void imprimir(int nestudiante){
//cout<<"cuenta/tnombre/tedad/tsexo/tnota[1]/tnota[2]/tnota[3]/tpromedio/n";
for (int i=0; i<nestudiante;i++){
cout<<"cuenta\tnombre\tedad\tsexo\tnota[1]\tnota[2]\tnota[3]\tpromedio/n";
cout<< estudiante::cuenta<<"\t"<<estudiante::nombre <<"\t"<<notas [0]<<"\t" <<notas [1]<<"\t"<< notas [2]<<"\t"<<&Notas::calcular_nta_final <<"\t";
}
}
};
void main(){
int nestudiante=0;
int A[cEstudiantes];
Notas RN;
cout<<"ingrese cantidad de estudiantes a procesar";
cin>>nestudiante;
(A);
RN.registrar_notas(nestudiante);
RN.imprimir (nestudiante);
system("pause");
}
tengo el siguiente problema
void imprimir(int nestudiante){
//cout<<"cuenta/tnombre/tedad/tsexo/tnota[1]/tnota[2]/tnota[3]/tpromedio/n";
for (int i=0; i<nestudiante;i++){
cout<<"cuenta\tnombre\tedad\tsexo\tnota[1]\tnota[2]\tnota[3]\tpromedio/n";
cout<< estudiante::cuenta<<"\t"<<estudiante::nombre<< "\t"<<notas [0]<<"\t" <<notas [1]<<"\t"<< notas [2]<<"\t"<<&Notas::calcular_nta_final <<"\t";
}
}
no puedo mandar a imprimir ademas de el promedio no me lo tira y cuando lo quiero hacer calcular_nta_final
me tira que use &Notas::calcular_nta_final
Con todos mis respetos, el que te está enseñando a programar no tiene ni la más remota idea de cómo se ha de estructurar un programa:
* En C++ lo lógico es usar "class" en vez de "struct"... son bastante parecidas, pero no iguales.
* No tiene sentido usar clases o estructuras sin conocer, al menos, el uso de los constructores por defecto. En tu práctica ni se menciona este elemento.
* No tienen ningún sentido que una clase almacene datos y se comunique con el usuario a la vez.
* Las variables de una clase o estructura deberían estar, como norma general, siempre en la parte privada. Para interactuar con ellas se implementan funciones para leer y modificar dichas variables.
* En C++ existen un tipo de clases, denominadas contenedores, que te permiten almacenar colecciones de elementos de una forma sencilla y rápida. Los arrays de C, como los que te propone usar, dan muchísimos problemas si no se usan con extremo cuidado.
Alguno me podrá decir que sí, pero que estás aprendiendo... razón de más para asentar una buena base desde el principio... en vez de llenar la cabeza con ideas que no sirven de mucho.
Vale, ya me he desahogado, ahora, retomando tu práctica te comento:
5. La Estructura RegistroNotas debe contener los siguientes atributos:
a. Estudiante alumno[cEstudiantes]
b. int notas[cNotas]
Vamos a ver, si para cada alumno hay que almacenar tres notas... que (perdón por la expresión) ***** de diseño es este?? Ahí únicamente hay 2 vectores independientes... es como tener una lista de tus amigos por un lado y, por otro, una lista de teléfonos (contando con que para cada amigo puedes tener varios números ) ... no hay relación entre ellos.
Podría tener más sentido un diseño tal que
// Estructura coherente
struct RegistroNotas
{
Estudiante alumno;
int notas[ cNotas ];
};
// Array de RegistroNotas... ahora si, cada estudiante tiene sus tres parciales.
RegistroNotas[ cEstudiantes ] registroNotas;
Sigo defendiéndolo... quien te está enseñando no tiene ni idea y encima se explica fatal.
Ahora, partiendo de este diseño...
cout<< estudiante::cuenta<<"\t"<<estudiante::nombre <<"\t"<<notas [0]<<"\t" <<notas [1]<<"\t"<< notas [2]<<"\t"
la forma de acceder a las variables no es con el operador '::' eso está reservado para el caso de miembros estáticos.
En tu caso es con el operador '.'
cout << registroNotas[ nEstudiante ].alumno.cuenta << "\t"
<< registroNotas[ nEstudiante ].alumno.nombre << "\t"
<< registroNotas[ nEstudiante ].notas[ 0 ] << "\t"
<< registroNotas[ nEstudiante ].notas[ 1 ] << "\t"
<< registroNotas[ nEstudiante ].notas[ 2 ] << endl;
"registroNotas" es el nombre del array, el que he puesto antes. Como "registroNotas" es un array, necesito usar "nEstudiante" para acceder a una posición concreta... en esta posición me voy a encontrar con una estructura de tipo "RegistroNotas", que contiene un miembro "alumno" que es de tipo "Estudiante" y un array de tipo int llamado "notas"... el resto del código sigue la misma lógica.
En cualquier caso, dado que el número de notas viene definido por la constante "cNotas", la impresión debería quedar tal que:
cout << registroNotas[ nEstudiante ].alumno.cuenta << "\t"
<< registroNotas[ nEstudiante ].alumno.nombre;
for ( int i=0; i< cNotas; i++ )
{
cout << "\t" << registroNotas[ nEstudiante ].notas[ i ];
}
cout << endl;
Así, si cambias la constante cNotas, el código se adaptará de forma automática.
bueno gracias por tu sugerencia pero me sale el siguiente error en lo primero que dices
struct Registro_Notas{
estudiante alumno;
int notas[cNotas];
};
Registro_Notas [cEstudiantes ] Registro_Notas ;
el erroe es el siguiente
error C2143: syntax error : missing ';' before '['
error C2337: 'cEstudiantes' : attribute not found
cambia estudiante por Estudiante...
y luego
Registro_Notas registorNotas[cEstudiantes ];
lo e cambiado pero sigue en lo mismo solo se puede con el array o tengo que cambiar la srtruct a class???
errores solo de ese cambio a array
error C2337: 'cEstudiantes' : attribute not found
error C2337: 'cEstudiantes' : attribute not found
error C2470: 'RegistroNotas' : looks like a function definition, but there is no parameter list; skipping apparent body
lo e cambiado pero sigue en lo mismo solo se puede con el array o tengo que cambiar la srtruct a class???
errores solo de ese cambio a array
error C2337: 'cEstudiantes' : attribute not found
error C2337: 'cEstudiantes' : attribute not found
error C2470: 'RegistroNotas' : looks like a function definition, but there is no parameter list; skipping apparent body
cEstudiantes es la constante que tienes que tener definida al inicio del programa.
En qué línea te da el error?? que código tienes en esa línea?? y en las anteriores??
#include<iostream>
#include<string>
const int cNotas=3, cEstudiantes=100;
using namespace std;
struct Estudiante {
string cuenta;
string nombre;
int edad;
char sexo;
void registrar_estudiantes( ){
cout<<"ingresar cuenta";getchar ();
getline(cin,cuenta);
cout<<"ingresar nombre";getchar ();
getline(cin,nombre);
cout<<"ingresar edad";
cin>>edad;
cout<<"ingresar sexo";
cin>>sexo;
}
};
los errores solo empiezan desde el cambio de la structura después por cambio de strctura ay de declara miento de cnotas y de estudiante.
struct registroNotas{
Estudiante alumno;
int notas[cNotas];
};
solo en esta linea estan los primeros 3 errores
registroNotas [cEstudiantes ] registroNotas ;
error C2143: syntax error : missing ';' before '['
error C2337: 'cEstudiantes' : attribute not found
error C2470: 'RegistroNotas' : looks like a function definition, but there is no parameter list; skipping apparent body
Cita de: eferion en 8 Abril 2014, 09:26 AM
cambia estudiante por Estudiante...
y luego
Registro_Notas registroNotas[cEstudiantes ];
El segundo cambio no lo has aplicado
:D :Dlisto yya me quito el error
pero me sige sacando un error en el siguiente linea de codigo
for (int i=0;nestudiante>i;i++)
{
cout<<"ingresar la informacion del estudiante "<<i<<endl;
registroNotas[i].alumno.registrar_estudiantes ;
cout<<"ingresar nota 1";
cin>>registroNotas[i].notas[cNotas] ;
cout<<"ingresar nota 2";
cin>>registroNotas[i].notas[cNotas] ;
cout<<"ingresar nota 3";
cin>>registroNotas[i].notas[cNotas] ;
}
}
registroNotas[i].alumno.registrar_estudiantes ;
error C3867: 'Estudiante::registrar_estudiantes': function call missing argument list; use '&Estudiante::registrar_estudiantes' to create a pointer to member
ese error sige aparecieondo y no c porque
y en la parte de sacar el promedio no se si esta bien la linea de codigo
int calcular_nta_final(){
for (int i=0;cNotas >i;i++)
{
int promedio =(registroNotas[i].notas[0] +registroNotas[i].notas[1]+registroNotas[i].notas[2])/3;
return promedio;
}
}
registroNotas[i].alumno.registrar_estudiantes ;
si "registrar_estudiantes" es una función... tienes que llamarla con los paréntesis:
registroNotas[i].alumno.registrar_estudiantes( );
En cuanto al promedio... si lo almacenas en un int estarás perdiendo precisión, ya que un promedio únicamente almacena la parte entera de la operación... estás perdiendo los decimales.
Además, te pasa lo mismo que te he comentado antes, si cambias el valor de cNotas, el código no funcionará ya que hace todo "a piñón fijo"... la idea es que uses un bucle para calcular el promedio desde 0 hasta cNotas.
float promedio = 0.0;
for ( int j=0; j < cNotas; j++ )
promedio += registroNotas[i].notas[ j ];
promedio /= (float)cNotas;
ok ya cambie pero al momento de llamar imprimir el main me da error
for (int i=0; i<nestudiante ;i++){
registroNotas [i].imprimir()[i];
}
Es que esa línea no tiene ningún sentido.
A ver, respira hondo. Se supone que estás aprendiendo... y esto es parte del proceso de aprendizaje... si te doy todo mascado no vas a aprender nada salvo a copiar.
si "imprimir( )" es una función que retorna...nada, por qué le pones después ese ""??
perdon estoy un poco estresado porque lla ni madres sabia que hacer y no soy tan malo en la programacion de c++ :P :P :P
bueno esto es lo que tengo en el main
int main(){
int nestudiante=0;
cout<<"ingrese cantidad de estudiantes a procesar";
cin>>nestudiante;
for (int i=0; i<nestudiante ;i++){
registrar_notas(nestudiante);
}
for (int i=0; i<nestudiante ;i++){
imprimir(nestudiante);
}
system("pause");
}
pero al momento de que el programa empieza a funcionar pasa algo por ejemplo pongo 2 de los cuales estudiantes quiero ingresar pero 2,1,0,1 jeje ademas no me tira el promedio ni las notas que e ingresado
Cita de: max9100 en 8 Abril 2014, 11:07 AM
pero al momento de que el programa empieza a funcionar pasa algo por ejemplo pongo 2 de los cuales estudiantes quiero ingresar pero 2,1,0,1
Perdona pero no me he enterado de nada.
Cita de: max9100 en 8 Abril 2014, 11:07 AM
ademas no me tira el promedio ni las notas que e ingresado
Pon el código que tienes, que después de tantos cambios el anterior no es válido.
Además, estaría bien que indicases en la etiqueta "code" que el código es de C++ "code=cpp". Así tendrá un aspecto más legible.
Un último consejo... tabular el código con espacios hace que sea más legible en el foro que si usas el tabulador.
me refiero a esto que no me sale las notas ni promedio ademas de que el programa tiene un ciclo de 3 no de dos
ingrese cantidad de estudiantes a procesar 2
ingresar la informacion del estudiante 0
ingresar cuenta max
ingresar nombre max
ingresar edad 18
ingresar sexo m
ingresar nota 1 45
ingresar nota 2 45
ingresar nota 3 45
ingresar la informacion del estudiante 1
ingresar cuenta max
ingresar nombre max
ingresar edad 18
ingresar sexo m
ingresar nota 1 45
ingresar nota 2 45
ingresar nota 3 45
ingresar la informacion del estudiante 0
ingresar cuenta max
ingresar nombre max
ingresar edad 18
ingresar sexo m
ingresar nota 1 45
ingresar nota 2 45
ingresar nota 3 45
ingresar la informacion del estudiante 1
ingresar cuenta max
ingresar nombre max
ingresar edad 18
ingresar sexo m
ingresar nota 1 45
ingresar nota 2 45
ingresar nota 3 45
0 0 0reprobo
0 0 0reprobo
Presione una tecla para continuar . . .
for (int i=0; i<nestudiante ;i++){
registrar_notas(nestudiante);
}
si a registrar_notas, le pasas siempre nestudiante, obviamente, la función no va a funcionar como esperas.
"nestudiante" es una constante... si tu quieres iterar tienes que usar la variable adecuada, en este caso la que recorre todos los valores desde 0 hasta "nestudiante", es decir, "i".
for (int i=0; i<nestudiante ;i++){
registrar_notas( i );
}
aqui esta el codigo completo pero me sige tirando el error de las notas y ahora el ciclo me lo tira 1 vez y lo pongo 2.
#include<iostream>
#include<string>
#include <cstdlib>
const int cNotas=3, cEstudiantes=100;
using namespace std;
struct Estudiante {
string cuenta;
string nombre;
int edad;
char sexo;
void registrar_estudiantes( ){
cout<<"ingresar cuenta ";getchar ();
getline(cin,cuenta);
cout<<"ingresar nombre ";getchar ();
getline(cin,nombre);
cout<<"ingresar edad ";
cin>>edad;
cout<<"ingresar sexo ";
cin>>sexo;
}
};
struct Registro_Notas{
Estudiante alumno;
int notas[cNotas];
};
Registro_Notas registroNotas [cEstudiantes ] ;
void registrar_notas(int nestudiante){
for (int i=0;i<nestudiante;i++)
{
cout<<"ingresar la informacion del estudiante "<<i<<endl;
registroNotas[i].alumno.registrar_estudiantes() ;
cout<<"ingresar nota 1 ";
cin>>registroNotas[i].notas[cNotas] ;
cout<<"ingresar nota 2 ";
cin>>registroNotas[i].notas[cNotas] ;
cout<<"ingresar nota 3 ";
cin>>registroNotas[i].notas[cNotas] ;
}
}
float calcular_nta_final(float promedio = 0.0){
for ( int i=0; i < cNotas; i++ )
promedio += registroNotas[i].notas[ i ];
promedio /= (float)cNotas;
return promedio ;
}
void imprimir(int j){
cout << registroNotas[ cEstudiantes ].alumno.cuenta << "\t"<< registroNotas[ cEstudiantes ].alumno.nombre;
for ( int i=0; i< cNotas; i++ )
{
cout << "\t" << registroNotas[ cEstudiantes ].notas[ i ];
}
if(calcular_nta_final()<70)
cout<<"aprobo";
else
cout<<"reprobo";
cout << endl;
}
int main(){
int nestudiante=0;
cout<<"ingrese cantidad de estudiantes a procesar ";
cin>>nestudiante;
for (int i=0; i<nestudiante ;i++){
registrar_notas(i);
}
for (int j=0; j<nestudiante ;j++){
imprimir(j);
}
system("pause");
}
Revisa el código, tiene comentarios con los errores que has cometido.
#include <iostream>
#include <string>
#include <cstdlib>
const int cNotas=3, cEstudiantes=100;
using namespace std;
struct Estudiante
{
string cuenta;
string nombre;
int edad;
char sexo;
void registrar_estudiantes( )
{
// ***********
// getchar?? no mezcles NUNCA cin con getchar, por favor.
// funcionan de forma diferente y mezclarlas puede provocar efectos extraños.
// ***********
cout <<"ingresar cuenta ";
cin >> cuenta;
cout <<"ingresar nombre ";
cin >> nombre;
cout <<"ingresar edad ";
cin >> edad;
cout <<"ingresar sexo ";
cin >> sexo;
}
};
struct Registro_Notas
{
Estudiante alumno;
int notas[cNotas];
};
Registro_Notas registroNotas [cEstudiantes ] ;
void registrar_notas(int nestudiante)
{
// ***********
// nestudiante es el indice del estudiante actual... el bucle sobra
// ***********
// ***********
// Si cambias 'i' por 'i+1' le das al usuario un indice mas legible
// ***********
cout<<"ingresar la informacion del estudiante "<< (nestudiante+1) <<endl;
registroNotas[ nestudiante ].alumno.registrar_estudiantes( );
// ***********
// cNotas es una constante... la idea es usar un bucle
// ***********
for ( int j = 0; j < cNotas; j++ )
{
cout << "ingresar nota " << j+1 << " ";
cin >> registroNotas[ nestudiante ].notas[ j ];
}
}
// ***********
// promedio no es un argumento de la funcion... no tiene sentido
// lo que si tienes que pasarle es el indice del estudiante
// ***********
float calcular_nota_final( int estudiante )
{
float promedio = 0.0;
for ( int i=0; i < cNotas; i++ )
promedio += registroNotas[ estudiante ].notas[ i ];
promedio /= (float)cNotas;
return promedio ;
}
// ***********
// j ??? que narices es j??? y si cambiamos j por estudiante ??? ahora queda mas claro, no?
// Pues eso.
// Ahora queda claro que todos los usos de cEstudiantes que tienes en esta funcion
// son incorrectos
// ***********
void imprimir(int estudiante)
{
cout << registroNotas[ estudiante ].alumno.cuenta << "\t"
<< registroNotas[ estudiante ].alumno.nombre << "\t";
for ( int i=0; i< cNotas; i++ )
cout << registroNotas[ estudiante ].notas[ i ] << "\t";
// ***********
// Se supone que 100 es la nota máxima, no??
// Entonces se aprobara si la nota es superior a 70, no inferior.
// ***********
if( calcular_nota_final( estudiante ) > 70.0)
cout<<"aprobo";
else
cout<<"reprobo";
cout << endl;
}
int main()
{
int nestudiante=0;
cout<<"ingrese cantidad de estudiantes a procesar ";
cin>>nestudiante;
cout << endl << "###" << nestudiante << "###" << endl;
// ***********
// Si nestudiante >= cEstudiante la aplicacion va a dar error, deberias controlar eso
// ***********
for (int i=0; i<nestudiante ;i++)
{
registrar_notas(i);
}
// ***********
// Detalle: aqui puedes reutilizar i sin problemas.
// ***********
for (int i=0; i<nestudiante ;i++)
{
imprimir(i);
}
system("pause");
// ***********
// Detalle: aunque el compilador lo ponga por defecto, pon este return siempre.
// ***********
return 0;
}
MUCHAS GRACIAS eferion :D :D :D :D :D creo que mas los errores que tenia eran de logica :-[ :-[ :-[ :-[ pero te agradezco de sobremaner