Necesito ayuda con un for

Iniciado por SergioT, 26 Noviembre 2020, 23:09 PM

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

SergioT

Hola, ¿qué tal? no puedo realizar este for de matrices. Me toma la primer parte, pero cuando quiero saber la nota, no me lo pide directamente. ¿Qué estaría haciendo mal?


Código (cpp) [Seleccionar]

for(int i=0;i<alumnos;i++)
{
cout<<"Ingrese la cantidad de materias del alumno " << nombrealum[i]<<endl;
cin>> notas[i][j];
if(notas[i][j]>4)
{
cout<<"Solo pueden tener hasta 4 materias, ingrese nuevamente la cantidad de materias."<<endl;
while(notas[i][j]>4)
{
cout<<"Ingrese nuevamente la cantidad de materias para " << nombrealum[i]<<endl;
cin>> notas[i][j];
}
for(int j=0;j<materias;j++)
{
cout<<"Ingrese las notas de cada materia de " << nombrealum[i]<<endl;
cin>>notas[i][j];
}
}
}



MOD: El código debe ir entre etiquetas de Código GeSHi

K-YreX

Lo primero de todo, el código debes publicarlo entre etiquetas de Código GeSHi. Para ello debes seleccionar el código e ir al desplegable que dice Código GeSHi (encima del cuadro de texto) para seleccionar el lenguaje correspondiente.
También puedes agregar las etiquetas manualmente.


Ese fragmento es una locura de código y la identación de las llaves lo hace todavía más complicado:
  • Líneas 4/5/8/11 -> Utilizas una variable j que no aparece por ningún sitio.
  • Línea 13 -> Declaras una variable j que interferirá con la que tenías antes declarada (en caso de que así fuese).
  • Línea 13 -> Utilizas una variable <materias> que tiene toda la pinta de no estar declarada o inicializada. -> Esto da que pensar que la variable <alumnos> igual tampoco lo está.
  • Utilizas la matriz notas[][] tanto para guardar el número de materias como las notas. Unos datos están sobrescribiendo los otros.
  • El bucle de la línea 13 solo se ejecuta cuando se cumple la condición de la línea 5.
  • La condición de la línea 5 y el bucle de la línea 8 son redundantes. Ese funcionamiento se puede conseguir tan solo con un bloque do-while()

    Ahí tienes los errores que veo en ese fragmento.
    Intenta solucionarlo y si no lo consigues coloca el código completo (al menos el de esa función) para poder ver lo que está bien y lo que no. Recuerda publicar el código entre etiquetas de Código GeSHi. También puedes explicar con detalles lo que estás intentando hacer.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

SergioT

Ahí lo mando completo. Necesito ayuda :( porfa

Código (cpp) [Seleccionar]
#include <stdio.h>
#include <iostream>
#include <string>
#include <conio.h>
#include <stdlib.h>
using namespace std;
string nombrealum[30]={" Nicolas Ramos ", " Sergio Aguero " , " Santiago Milla ", " Federico Troglio " , " Mariano Piens " , " Susana Mendez " , " Fernanda Pirca " , " Marcos Pina " , " Carlos Pedrozo " , " Roman Riquelme " , " Guillermo Schelotto " , " Angel Di Maria " , " Martin Marina " , " Mariano Rossin " , " Patricio Rojas " , " Matias Suculini " , " Fernando Gago " , " Ramon Diaz " , " Martin Palermo " , " Diego Maradona " , " Daniel Pasarella " , " Rodrigo Palacios " , " Daniel Rossi " , " Pablo Perez " , " Marcos Rojo " , " Lionel Messi " , " Sebastian Villa " , " Nicolas Obando " , " Emanuel Mas " , " Emanuel Gigliotti "};

int main ()
{
int alumnos = 2;
int materias = 4;
int notas [alumnos][materias]; //matriz de datos
int i, j; //declaración de variables para los for
cout<<"***********************************************************************************************************************"<<endl;
cout<<"------------------------------------------------Bienvenidos al sistema-------------------------------------------------"<<endl;
cout<<"***********************************************************************************************************************"<<endl;
int Promgral, cantmat, notascalum;

for(int i=0;i<alumnos;i++)
{
cout<<"Ingrese la cantidad de materias del alumno " << nombrealum[i]<<endl;
cin>> cantmat;
if(cantmat>4)
{
cout<<"Solo pueden tener hasta 4 materias, ingrese nuevamente la cantidad de materias."<<endl;
while(cantmat>4)
{
cout<<"Ingrese nuevamente la cantidad de materias para " << nombrealum[i]<<endl;
cin>> cantmat;
}
for(int j=0;j<materias;j++)
{
cout<<"Ingrese las notas de cada materia de " << nombrealum[i]<<endl;
cin>>notascalum;
Promgral=Promgral+notascalum;
}
}
}
cout<<"El promedio general de notas es: " << Promgral <<endl;


}

K-YreX

Bueno, echando un vistazo por encima, veo que ya está algo mejor.
De todas formas empiezo desde el principio:

CABECERAS: Sólo tienes que incluir las cabeceras necesarias, es decir, las que contengan las funciones que tú vas a utilizar. En este caso tienes:
  • stdio.h -> Contiene las funciones de entrada/salida típicas de C (printf()/scanf() /Funciones sobre ficheros en C/...) -> No lo utilizas.
  • iostream -> Contiene las "funciones" de entrada/salida típicas de C++ (cout <</cin >>/...) -> Sí la utilizas.
  • string -> Contiene el tipo de dato std::string, entre otras cosas. -> Sí la utilizas.
  • conio.h -> Contiene entre otras cosas la función getch(). Esta librería no pertenece al estándar y está desaconsejado su uso. Un buen sustituto de getch() en C++ es cin.get() (que pertenece a <iostream>) y en C es getchar() (que pertenece a <stdio.h>). -> No la utilizas y no creo que lo necesites.
  • stdlib.h -> Contiene funciones como system()/srand()/rand() /conversores de tipos/... -> No la utilizas.
    Todas las bibliotecas que no utilizas es mejor eliminarlas. Primero para ahorrar espacio ya que cada include lo que hace es copiar el contenido de cada uno de esos ficheros. Y segundo, para sabe cuándo necesitas una u otra biblioteca.
    Además todas las que terminan en ".h" son propias de C. Estas también funcionan en C++ pero las propias de C++ se denominan igual pero quitando el ".h" del final y añadiendo una "c" al principio -> cstdio/cstdlib/...


    VARIABLES/CONSTANTES GLOBALES/LOCALES
    No es recomendable utilizar variables globales. Las variables es mejor crearlas locales a una función y utilizar los parámetros cuando sea necesario para enviarlas a otras funciones.
    Sin embargo, es mejor creas constantes globales como si fueran valores de configuración antes que colocar números sueltos por ahí. Así es más fácil modificar el programa. Aunque si se va a inicializar un array al momento de la declaración, no es necesario determinar su longitud ya que esta será la que tenga una vez inicializado.
    Además el método tradicional de crear arrays en C/C++ dice que si son estáticas, deben declararse con constantes y no se permiten variables. Para crear arrays con tamaños definidos en tiempo de ejecución hay que usar memoria dinámica.

    Por convenio, los nombres de variables/funciones se definen en lowerCamelCase (primera palabra en minúsculas y a partir de ahí cada palabra con la primera letra en mayúsculas) y los nombres de constantes en SCREAMING_SNAKE_CASE (todas las letras en mayúsculas y las palabras separadas por guión bajo _).
    Código (cpp) [Seleccionar]

    const int NUM_ALUMNOS = 2; // Este valor deberia usarse tambien para el array de nombres para asegurar la misma longitud
    const int NUM_MATERIAS = 4;



    FILTRO DE DATOS
    Cuando se quiere pedir un dato hasta que éste sea válido se suele utilizar un filtro do-while(). La estructura do-while() primero ejecuta lo que hay dentro y luego comprueba la condición. Se diferencia del while() en que el código que hay dentro del do{} al menos se ejecutará una vez.
    Código (cpp) [Seleccionar]

    int numero;
    bool valido;
    do { // Hacer esto...
      cout << "Introduce un numero positivo: ";
      cin >> numero;
      // Si se quiere mostrar un mensaje es mejor crear una variable para guardar la comprobacion
      // Sino tambien se puede poner la condicion directamente en los parentesis del while()
      valido = (numero >= 0);
      if(!valido)
        cout << "El numero debe ser positivo" << endl;
    } while(!valido); // ...mientras el numero introducido no sea valido



    OTROS ERRORES
  • Las variables i y j de la línea 14 nunca se utilizan. En los bucles de las líneas 20 y 32 estás declarando otras dos que solo existen hasta que acabe cada uno de los for().
  • El bucle de la línea 32 está dentro del if() de la línea 24 por lo que solo se ejecutará bien si de primeras introduces un número de materias no válido. Cuando apliques el filtro do-while() tendrás que poner el for() de la línea 32 después del do-while() para que se ejecute siempre que se tenga ya un número válido.
  • No estás utilizando la matriz notas[][]. Deberías utilizarla para guardar en cada fila las notas de un alumno y en cada columna la nota de una materia. Esto se haría así:
    Código (cpp) [Seleccionar]

    for(int i = 0; i < NUM_ALUMNOS; ++i){
      for(int j = 0; j < NUM_MATERIAS; ++j){
        cout << "Introduce la nota " << (j+1) << " del alumno " << (i+1) << ": ";
        cin >> notas[i][j];
      }
    }


    Ahora tienes que revisar todas estas cosas que no son pocas e introducirlas en tu programa correctamente.
    Suerte. :-X

    PD: El bucle for() de la línea 32 debería estar identado al mismo nivel que el bucle while() de la línea 27. No se trata de identar cada fragmento de código más a la derecha sino de mantener una estructura de orden para saber qué cosas están dentro de qué otras cosas y cuáles están al mismo nivel.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;