Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Luischicho en 12 Agosto 2019, 16:06 pm



Título: problema de arreglo bidimencional
Publicado por: Luischicho en 12 Agosto 2019, 16:06 pm
Buenos dias.
para ver quien me puede ayudar.
tengo el siguiente problema.

Usando un arreglo de dos dimensiones, se requiere un sistema que permita recibir las
notas de los estudiantes de un curso. Al iniciar el sistema debe preguntar cuántos
estudiantes se van a digitar. Después de eso, por cada estudiante, el sistema debe
recibir 3 notas (números decimales entre 0 y 5). Al finalizar de digitar todas las notas el
sistema debe mostrar:
o El listado de promedios de las tres notas de cada estudiante
o Cuantos estudiantes obtuvieron un promedio superior a 3.0

realice el siguietnte codigo pero no me da el resultado que se pide.

#include <iostream>
#include <stdio.h>

using namespace std;

int main()
{
    int cant;
    float nota[3];
    float promedio[5];
    float suma;


    cout<<"PROMEDIO DE NOTAS"<<endl;
    cout<<""<<endl;
    cout<<"INGRESAR CANTIDAD DE ALUMNOS A CONSULTAR:  "; cin>>cant;

    for(int i=0; i<cant; i++){
        cout<<"INGRESAR NOTAS DEL ALUMNO "<<i+1<<":"<<endl;

        for(int i=0; i<3; i++){
            cout<<"NOTA "<<i+1<<":     "; cin>>nota;

            if (nota<=5 && nota>0){
            suma+=nota;
        }else{
        cout<<"ERROR.. LA NOTA DEBE SER ENTRE 0 - 5"<<endl;
        return 0;
        }

        for(int j=0; j<cant; j++){
            promedio[j]=suma/3;
        }
      }
    }

     for(int i=0; i<cant; i++){
            cout<<""<<endl;
        cout<<"EL ALUMNO "<<i+1<<endl;
           for(int j=0; j<1; j++){
        cout<<""<<endl;
        cout<<" TIENE UN PROMEDIO DE: "<<promedio[j]<<endl;
           }
     }


    return 0;
}

quedo atento a su ayuda...


Título: Re: problema de arreglo bidimencional
Publicado por: K-YreX en 12 Agosto 2019, 17:55 pm
Lo primero de todo: El código entre etiquetas de código GeSHi   :-X :-X

Algunos consejos y cosillas que te pueden servir de ayuda;
  • No uses <stdio.h>. Esta librería es típica de C, no de C++ (en C++ es <cstdio>) y además no la usas para nada. Usas las entradas/salidas de <iostream> por lo que no la necesitas. Hay que saber lo que se pone y por qué se pone.
  • Sobre el <cout> y el <endl>: Se pueden concatenar estos últimos y no es necesario poner unas comillas vacías para usarlo por separado. También puedes usarlo antes de una cadena y después. Además puedes usar el caracter especial "\n" para saltos de línea (hay una sútil diferencia entre "\n" y <endl> pero bueno...)
Código
  1. cout << "Texto" << endl;
  2. cout << "Texto" << endl << endl << endl;
  3. cout << endl;
  4. cout << endl << "Texto" << endl;
  5. cout << "\nTexto" << endl;

Ahora los errores de tu programa:
  • No estás usando un array/arreglo bidimensional. Esto es una matriz y se declara con dos parejas de corchetes: <tipo> <nombre_matriz>[<filas>][<columnas>].
  • Estás acumulando valores (notas) en <suma> pero no has inicializado <suma> por lo que puede tener cualquier valor.
  • Debes guardar todas las notas y al no usar una matriz, una vez que has utilizado las notas de un alumno, las pierdes porque guardas las notas del siguiente.

Todos los ejercicios de este tipo tienen una forma estándar de hacerlos que es la siguiente:
Código
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. // Usamos constantes y asi podemos agrandar o reducir los valores del programa sin tener que modificarlo entero
  6. const int MAX_ALUMNOS = 100; // numero maximo de alumnos que podemos tratar
  7. const int NUM_NOTAS = 3; // numero de notas por alumno
  8.  
  9. int main(){
  10.    // Creamos una matriz. Cada fila son las notas de un alumno y cada columna es una nota
  11.    double notas[MAX_ALUMNOS][NUM_NOTAS];
  12.    int num_alumnos; // numero de alumnos que vamos a tratar. Debe ser menor o igual que <MAX_ALUMNOS>
  13.  
  14.    // El promedio de cada alumno podemos guardarlo (necesitamos un array/arreglo mas entonces) o calcularlo y sobrescribirlo para cada alumno
  15.    double promedio[MAX_ALUMNOS] = {0}; // arreglo para guardarlos con cada celda inicializada en 0
  16.    double promedio = 0; // si no queremos guardarlos, basta con esto. Inicializamos a 0 para poder acumular luego ahi las notas
  17.  
  18.    // Podemos hacer un filtro para obtener el numero de alumnos a tratar
  19.    // El filtro te pide un valor y te lo sigue pidiendo mientras se cumpla la condicion del <while>
  20.    do{
  21.        cout << "Introduce el numero de alumnos: ";
  22.        cin >> num_alumnos;
  23.    }   while(num_alumnos < 1 || num_alumnos > MAX_ALUMNOS);
  24.    // El programa no pasara el filtro hasta que <num_alumnos> este entre 1 y <MAX_ALUMNOS>
  25.    // A partir de ahora usaremos <num_alumnos> en lugar de <MAX_ALUMNOS>
  26.  
  27.    // Pedimos las notas de cada alumno
  28.    for(size_t i = 0; i < num_alumnos; ++i){
  29.        cout << "Notas del alumno " << i+1 << endl;
  30.        for(size_t j = 0; j < NUM_NOTAS; ++j){
  31.        // Pedir cada nota
  32.        }
  33.        // Si vamos a guardar todos los promedios en un arreglo, podemos calcularlos aqui
  34.    }
  35.  
  36.    // ...El resto del programa...
  37. }

Yo creo que ya tienes una ayuda bastante grande con el programa. Ahora te queda terminarlo a ti (tampoco te lo iba a hacer entero...  :silbar:)
Si tienes algún problema en alguna parte, coloca tu código (entre etiquetas de código GeSHi) para que podamos ayudarte.