problemas con una linea de codigo c++

Iniciado por max9100, 8 Abril 2014, 08:04 AM

0 Miembros y 1 Visitante están viendo este tema.

max9100

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

eferion

#1
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

Código (cpp) [Seleccionar]

// 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...

Código (cpp) [Seleccionar]
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 '.'

Código (cpp) [Seleccionar]
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:

Código (cpp) [Seleccionar]
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.

max9100

#2
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

eferion

cambia estudiante por Estudiante...

y luego

Registro_Notas registorNotas[cEstudiantes ];

max9100

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

max9100

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

eferion

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??

max9100

#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


eferion

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

max9100

#9
 :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;
}
}