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.

eferion

Código (cpp) [Seleccionar]
registroNotas[i].alumno.registrar_estudiantes ;

si "registrar_estudiantes" es una función... tienes que llamarla con los paréntesis:

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

Código (cpp) [Seleccionar]

float promedio = 0.0;
for ( int j=0; j < cNotas; j++ )
 promedio += registroNotas[i].notas[ j ];
promedio /= (float)cNotas;

max9100

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];
}

eferion

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

max9100

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

eferion

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.

max9100

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

eferion

Código (cpp) [Seleccionar]

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

Código (cpp) [Seleccionar]

for (int i=0; i<nestudiante ;i++){
registrar_notas( i ); 
}



max9100

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");
}

eferion

Revisa el código, tiene comentarios con los errores que has cometido.

Código (cpp) [Seleccionar]

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

max9100

MUCHAS GRACIAS eferion  :D :D :D :D :D creo que mas los errores que tenia eran de logica  :-[ :-[ :-[ :-[ pero te agradezco de sobremaner