elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía actualizada para evitar que un ransomware ataque tu empresa


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [Estructuras] ¿Por qué me muestra basura?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [Estructuras] ¿Por qué me muestra basura?  (Leído 2,048 veces)
Zodiak98

Desconectado Desconectado

Mensajes: 120


Ver Perfil
[Estructuras] ¿Por qué me muestra basura?
« en: 22 Mayo 2016, 22:57 pm »

Verán, el programa que tengo que hacer es el siguiente.
Leer N cantidad de estudiantes, y dentro de otra estructura sus notas (parte teórica y parte práctica), como un máximo de 5 calificaciones para cada alumno. Es decir, si digo que son 3 notas prácticas serán 3 notas prácticas para todos los alumnos, lo mismo para la parte teórica.

En fin, todo chévere, pero cuando intento mostrar las calificaciones que ingresé previamente, me muestra valores basura.

¿Alguien podría echarme una mano? El programa lo estoy haciendo en Code::Blocks.
Acá les dejo el código fuente que llevo hasta ahora:

Código
  1. #include <iostream>
  2. #include <cstdlib>
  3.  
  4. using namespace std;
  5.  
  6. //Variables globales para la cantidad de prácticos y parciales.
  7. int nPracticos, nParciales;
  8.  
  9. struct Notas {
  10.    int practicos[];
  11.    int parciales[];
  12.    float promedio;
  13. };
  14. typedef struct Notas Notas;
  15.  
  16. struct Estudiante {
  17.    char nombre[25];
  18.    char apellido[35];
  19.    char cedula[10];
  20.    char sexo;
  21.    int edad;
  22.    Notas notas;
  23. };
  24. typedef struct Estudiante Estudiante;
  25.  
  26. int leerEstudiantes();
  27. int leerEvaluaciones(char tipo[]); //Para leer la cantidad de practicos y parciales.
  28.  
  29. void llenarEstudiante(Estudiante& estudiante, int id);
  30. void mostrarEstudiante(const Estudiante& estudiante, int id);
  31.  
  32. int main() {
  33.    int nEstudiantes;
  34.    nEstudiantes = leerEstudiantes();
  35.    nPracticos   = leerEvaluaciones((char*)"Practicos");
  36.    nParciales   = leerEvaluaciones((char*)"Parciales");
  37.  
  38.    system("cls");
  39.  
  40.    Estudiante estudiante[nEstudiantes];
  41.  
  42.    //Llenando cada uno de los estudiantes.
  43.    for(int est = 0; est < nEstudiantes; est++) {
  44.        llenarEstudiante(estudiante[est], est);
  45.    }
  46.  
  47.    system("cls");
  48.  
  49.    //Mostrar datos de los estudiantes.
  50.    for(int est = 0; est < nEstudiantes; est++) {
  51.        mostrarEstudiante(estudiante[est], est);
  52.    }
  53.  
  54.    return 0;
  55. }
  56.  
  57. int leerEstudiantes() {
  58.    int nEstudiantes;
  59.  
  60.    do {
  61.        cout << "Introduzca la cantidad de estudiantes: ";
  62.        cin >> nEstudiantes;
  63.  
  64.        if(nEstudiantes <= 0) {
  65.            cerr << "Cantidad de estudiantes invalida." << endl;
  66.        }
  67.    }while(nEstudiantes <= 0);
  68.  
  69.    return nEstudiantes;
  70. }
  71.  
  72. int leerEvaluaciones(char tipo[]) {
  73.    int cantidad;
  74.  
  75.    do{
  76.        cout << "Ingrese la cantidad de " << tipo << ": ";
  77.        cin >> cantidad;
  78.  
  79.        if(cantidad <= 0 || cantidad > 5) {
  80.            cerr << "Cantidad incorrecta." << endl;
  81.        }
  82.    }while(cantidad <= 0 || cantidad > 5);
  83.  
  84.    return cantidad;
  85. }
  86.  
  87. void llenarEstudiante(Estudiante& estudiante, int id) {
  88.    //Variables para calcular el promedio.
  89.    int pPracticos = 0, pParciales = 0;
  90.  
  91.    //Lectura de datos generales.
  92.    cout << "Ingrese nombre de estudiante [" << (id + 1) << "]: ";
  93.    cin >> estudiante.nombre;
  94.    cout << "Ingrese apellido de estudiante [" << (id + 1) << "]: ";
  95.    cin >> estudiante.apellido;
  96.    cout << "Ingrese cedula de estudiane [" << (id + 1) << "]: ";
  97.    cin >> estudiante.cedula;
  98.    cout << "Ingrese edad de estudiante [" << (id + 1) << "]: ";
  99.    cin >> estudiante.edad;
  100.    cout << "Ingrese sexo de estudiante [" << (id + 1) << "] (M/F): ";
  101.    cin >> estudiante.sexo;
  102.  
  103.    //Lectura de notas prácticas.
  104.    for(int pr = 0; pr < nPracticos; pr++) {
  105.        do {
  106.            cout << "Ingrese nota del practico [" << (pr + 1) << "]: ";
  107.            cin >> estudiante.notas.practicos[pr];
  108.  
  109.            if(estudiante.notas.practicos[pr] < 0 || estudiante.notas.practicos[pr] > 10) {
  110.                cerr << "Nota incorrecta." << endl;
  111.            }
  112.        }while(estudiante.notas.practicos[pr] < 0 || estudiante.notas.practicos[pr] > 10);
  113.    }
  114.  
  115.    //Lectura de notas parciales.
  116.    for(int pa = 0; pa < nParciales; pa++) {
  117.        do {
  118.            cout << "Ingrese nota del parcial [" << (pa + 1) << "]: ";
  119.            cin >> estudiante.notas.parciales[pa];
  120.            if(estudiante.notas.parciales[pa] < 0 || estudiante.notas.parciales[pa] > 10) {
  121.                cerr << "Nota incorrecta." << endl;
  122.            }
  123.        }while(estudiante.notas.parciales[pa] < 0 || estudiante.notas.parciales[pa] > 10);
  124.    }
  125.  
  126.    //Calculando el promedio del estudiante:
  127.    //Sumatoria de Prácticos
  128.    for(int pr = 0; pr < nPracticos; pr++) {
  129.        pPracticos += estudiante.notas.practicos[pr];
  130.    }
  131.    //Sumatoria de Parciales
  132.    for(int pa = 0; pa < nParciales; pa++) {
  133.        pParciales += estudiante.notas.parciales[pa];
  134.    }
  135.    //Cálculo del promedio.
  136.    estudiante.notas.promedio = pPracticos/nPracticos*0.20 + pParciales/nParciales*0.50;
  137. }
  138.  
  139. void mostrarEstudiante(const Estudiante& estudiante, int id) {
  140.    cout << "Nombre de estudiante [" << (id + 1) << "]: " << estudiante.nombre << endl;
  141.    cout << "Apellido de estudiante [" << (id + 1) << "]: " << estudiante.apellido << endl;
  142.    cout << "Cedula de estudiante [" << (id + 1) << "]: " << estudiante.cedula << endl;
  143.    cout << "Sexo de estudiante [" << (id + 1) << "]: " << estudiante.sexo << endl;
  144.    cout << "Edad de estudiante [" << (id + 1) << "]: " << estudiante.edad << endl;
  145.  
  146.    for(int j = 0; j < nPracticos; j++) {
  147.        cout << "Nota del practico [" << (j + 1) << "] del estudiante [" << (id + 1) << "]: " << estudiante.notas.practicos[j] << endl;
  148.    }
  149.  
  150.    for(int j = 0; j < nParciales; j++) {
  151.        cout << "Nota del parcial [" << (j + 1) << "] del estudiante [" << (id + 1) << "]: " << estudiante.notas.parciales[j] << endl;
  152.    }
  153.  
  154.    cout << "Promedio del estudiante [" << (id + 1) << "]: " << estudiante.notas.promedio << endl;
  155.    cout << "-------------------" << endl;
  156. }
  157.  


En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: [Estructuras] ¿Por qué me muestra basura?
« Respuesta #1 en: 22 Mayo 2016, 23:07 pm »

estás accediendo mal a la estructura, el array es la estructura... por lo menos

Código:
cout << "Ingrese nombre de estudiante [" << (id + 1) << "]: ";
    cin >> estudiante.nombre;

pero a cual estudiante te ferienes? al primero? al último?

tienes que decirle
Código:
cout << "Ingrese nombre de estudiante [" << (id + 1) << "]: ";
    cin >> estudiante[id].nombre;

por lo menos en
Código:
cin >> estudiante.notas.practicos[pr];

estás tratando de acceder a la posición pr de la variable prácticos de el struct notas de un estudiante indefinido


En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
Zodiak98

Desconectado Desconectado

Mensajes: 120


Ver Perfil
Re: [Estructuras] ¿Por qué me muestra basura?
« Respuesta #2 en: 22 Mayo 2016, 23:35 pm »

Eso lo indico en el main, es decir, la función leerEstudiante recibe por referencia a sólo un único estudiante.
Y en la función main le indicó cuál de ellos dentro del arreglo de Estudiantes.
Código
  1. //Llenando cada uno de los estudiantes.
  2.    for(int est = 0; est < nEstudiantes; est++) {
  3.        llenarEstudiante(estudiante[est], est);
  4.    }
  5.  

Ahí le estoy pasando cada uno de los estudiantes a la función llenarEstudiante. Y como es por referencia, estoy modificando el elemento original.

Lo mismo con la función mostrarEstudiante, no entiendo por qué me muestra esa basura. :/
En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: [Estructuras] ¿Por qué me muestra basura?
« Respuesta #3 en: 22 Mayo 2016, 23:51 pm »

dime la linea donde te muestra basura mejor -.-
En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
Zodiak98

Desconectado Desconectado

Mensajes: 120


Ver Perfil
Re: [Estructuras] ¿Por qué me muestra basura?
« Respuesta #4 en: 23 Mayo 2016, 00:02 am »

Acá:
Código
  1. for(int j = 0; j < nPracticos; j++) {
  2.        cout << "Nota del practico [" << (j + 1) << "] del estudiante [" << (id + 1) << "]: " << estudiante.notas.practicos[j] << endl;
  3.    }
  4.  
  5.    for(int j = 0; j < nParciales; j++) {
  6.        cout << "Nota del parcial [" << (j + 1) << "] del estudiante [" << (id + 1) << "]: " << estudiante.notas.parciales[j] << endl;
  7.    }
  8.  

Eso se encuentra dentro de la función mostrarEstudiante, y dicha función recibe a sólo un único elemento, y luego en el main llamo a esa función enviándole cada elemento del arreglo Estudiante.

Código
  1. for(int est = 0; est < nEstudiantes; est++) {
  2.        mostrarEstudiante(estudiante[est], est);
  3.    }
  4.  
En línea

engel lex
Moderador Global
***
Desconectado Desconectado

Mensajes: 15.514



Ver Perfil
Re: [Estructuras] ¿Por qué me muestra basura?
« Respuesta #5 en: 23 Mayo 2016, 00:13 am »

no veo la memoria reservada en los array dentro de notas, lo probable es que no sepa donde guardar los datos (es raro que no te haya dado error fuera de indice)

en llenar tienes que inicializar esos int[]
Código:
estudiante.notas.practicos = new int[nPracticos];

creo que allí está el error, ya que en c++ lo array no son dinamicos, tienes que reasignar su tamaño, tu simplemente dejaste dicho que eran punteros y al escribir simplemente hacen un overflow
En línea

El problema con la sociedad actualmente radica en que todos creen que tienen el derecho de tener una opinión, y que esa opinión sea validada por todos, cuando lo correcto es que todos tengan derecho a una opinión, siempre y cuando esa opinión pueda ser ignorada, cuestionada, e incluso ser sujeta a burla, particularmente cuando no tiene sentido alguno.
Zodiak98

Desconectado Desconectado

Mensajes: 120


Ver Perfil
Re: [Estructuras] ¿Por qué me muestra basura?
« Respuesta #6 en: 23 Mayo 2016, 00:59 am »

Damn, no sabía eso. Ya se solucionó el problema, ¡gracias! :)
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines