Problema con Arrays para almacenar [C++]

Iniciado por Jesusinfo, 22 Julio 2016, 20:21 PM

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

Jesusinfo

Buenas amigos, un cordial saludos soy nuevo en el foro y espero ser copartícipe de los conocimientos que provee este grandioso foro.


Código (cpp) [Seleccionar]

#include <iostream>

using namespace std;

int llenar (int estudiantes[], int notas[]);
int imprimir(int estudiantes[], int notas[]);
int menu ();

int num;
int asignatura=5;

int llenar (int estudiantes[], int notas []){

cout<<"Deme el numero de estudiante a insertar: "<<endl<<endl;
cin>>num;

for(int i=0; i<=num-1; i++){
cout<<"\nDame el estudiante "<<i+1<<endl;
cin>>estudiantes[i];
for (int x=0; x<asignatura; x++){
cout<<"\nNota "<<x+1<<" del estudiante "<<i+1<<" :";
cin>>notas[x];
}

}

}

int imprimir (int estudiantes [], int notas []){
for(int i=0; i<=num-1; i++){
cout<<"\nESTUDIANTE "<<i+1<<endl<<endl;
cout<<estudiantes[i]<<endl<<endl;
for (int x=0; x<asignatura; x++){
cout<<notas[x]<<endl;
}

}

}

int menu (){
int opc;
cout<<"1.LLENAR\n2.IMPRIMIR\n3.SALIR"<<endl;
cin>>opc;
return opc;
}

int main(){

int estudiantes[100];
int notas[100];
int opc;

do{
opc=menu();
switch (opc){
case 1:
llenar(estudiantes, notas);
break;
case 2:
imprimir(estudiantes, notas);
break;
case 3:
cout<<"\nADIOS"<<endl;
break;
}
}
while (opc !=3);
system ("pause");
}






¿Algo esta mal planteado? le he dado bastante vuelta al problema y no consigo la solución, de antemano les agradezco por leer mi problema.

Un saludo compañeros.

AlbertoBSD

El contador i siempre inicia en 0 y hasta menor que  5

Saludos!
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

Jesusinfo

Gracias por su pronta respuesta amigo. En este caso estoy diciendo que "i" recorrerá las n cantidad de estudiante y "x"recorrerá las 5 notas de cada estudiante, me captura las n cantidad de estudiante pero no las 5 notas diferentes de cada estudiante, me captura solo la 5 notas del ultimo estudiante y las coloca en todos los estudiante, como se visualiza en la imagen.

AlbertoBSD

En el X haces eso siempre escribes en los mismos 5 lugares.

Necesitas algo como un desplazamiento seria como

5* i +x

Te dejo este video

[youtube=640,360]https://www.youtube.com/watch?v=U-zA-VvOllM[/youtube]
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

crack81

Hola tienes varios problemas de entrada los nombres de las personas los estas manejando como enteros tienes dos opciones o manejarlos como string o un arreglo de char al ver que estas en C++ aconsejo los strings  otra cosa es que no estabas guardando correctamente las notas ya que las estabas  sobrescribiendo.

Al imprimir no recorrias correctamente los arreglos de notas y nombres de los estudiantes y por eso los datos no eran los correctos, bueno me di a la tarea de modificar tu programa y ya funciona pero tiene detalles.

Código (cpp) [Seleccionar]
#include <iostream>

using namespace std;

void llenar (string  estudiantes[], int notas[]);
void imprimir(string estudiantes[], int notas[]);
int menu ();

//variables
int num=0;
int asignatura=5;

string estudiantes[100];
int posicionesEstudiante=0;

int notas[100];
int posicionNotas=0;

int main()
{

   int opc;

   do
   {
       opc=menu();
       switch (opc)
       {
       case 1:
           llenar(estudiantes, notas);
           break;
       case 2:
           imprimir(estudiantes, notas);
           break;
       case 3:
           cout<<"\nADIOS"<<endl;
           break;
       }
   }
   while (opc !=3);
   cin.get();
}

void llenar (string estudiantes[], int notas [])
{

   cout<<"Deme el numero de estudiante a insertar: "<<endl<<endl;
   cin>>num;

   for(int i=0; i<=num-1; i++)
   {
       cout<<"\nDame el estudiante "<<i+1<<endl;
       cin>>estudiantes[posicionesEstudiante];
       for (int x=0; x<asignatura; x++)
       {
           cout<<"\nNota "<<x+1<<" del estudiante "<<i+1<<" :";
           cin>>notas[posicionNotas];
           posicionNotas++;

       }
       posicionesEstudiante++;

   }

}

void imprimir (string estudiantes [], int notas [])
{
   int contador=0;
   for(int i=0; i<=posicionesEstudiante-1; i++)
   {
       cout<<"\nESTUDIANTE "<<i+1<<endl<<endl;
       cout<<estudiantes[i]<<endl<<endl;
       for (int x=0; x<asignatura; x++)
       {
           cout<<notas[contador]<<endl;
           contador++;
       }

   }

}

int menu ()
{
   int opc;
   cout<<"1.LLENAR\n2.IMPRIMIR\n3.SALIR"<<endl;
   cin>>opc;
   return opc;
}


Si quieres puedes reformular tu  programa y usar structs para poder tener una mejor abstraccion.
Ejemplo:
Código (cpp) [Seleccionar]
#include <iostream>

using namespace std;

const int NUMERO_ASIGNTURAS=5;

struct Estudiante
{
   string nombre;
   int asignaturas[NUMERO_ASIGNTURAS];
};

int main(){
 Estudiantes estudiantes[100];

 return 0;
}


Si sabes usar vector o listas enlazadas puedes sustuir los arreglos.
Si tienes dudas avisanos saludos...

Si C/C++ es el padre de los lenguajes entonces ASM es dios.

Jesusinfo

Cita de: AlbertoBSD en 22 Julio 2016, 21:15 PM
En el X haces eso siempre escribes en los mismos 5 lugares.

Necesitas algo como un desplazamiento seria como

5* i +x

Te dejo este video

[youtube=640,360]https://www.youtube.com/watch?v=U-zA-VvOllM[/youtube]


Muchisimas gracias amigo me resolviste el problema tarde un poco en comprender el desplazamiento que debo de hacer para no sobrescribir las notas en el arreglo



Cita de: crack81 en 22 Julio 2016, 21:56 PM
Hola tienes varios problemas de entrada los nombres de las personas los estas manejando como enteros tienes dos opciones o manejarlos como string o un arreglo de char al ver que estas en C++ aconsejo los strings  otra cosa es que no estabas guardando correctamente las notas ya que las estabas  sobrescribiendo.

Al imprimir no recorrias correctamente los arreglos de notas y nombres de los estudiantes y por eso los datos no eran los correctos, bueno me di a la tarea de modificar tu programa y ya funciona pero tiene detalles.

Código (cpp) [Seleccionar]
#include <iostream>

using namespace std;

void llenar (string  estudiantes[], int notas[]);
void imprimir(string estudiantes[], int notas[]);
int menu ();

//variables
int num=0;
int asignatura=5;

string estudiantes[100];
int posicionesEstudiante=0;

int notas[100];
int posicionNotas=0;

int main()
{

   int opc;

   do
   {
       opc=menu();
       switch (opc)
       {
       case 1:
           llenar(estudiantes, notas);
           break;
       case 2:
           imprimir(estudiantes, notas);
           break;
       case 3:
           cout<<"\nADIOS"<<endl;
           break;
       }
   }
   while (opc !=3);
   cin.get();
}

void llenar (string estudiantes[], int notas [])
{

   cout<<"Deme el numero de estudiante a insertar: "<<endl<<endl;
   cin>>num;

   for(int i=0; i<=num-1; i++)
   {
       cout<<"\nDame el estudiante "<<i+1<<endl;
       cin>>estudiantes[posicionesEstudiante];
       for (int x=0; x<asignatura; x++)
       {
           cout<<"\nNota "<<x+1<<" del estudiante "<<i+1<<" :";
           cin>>notas[posicionNotas];
           posicionNotas++;

       }
       posicionesEstudiante++;

   }

}

void imprimir (string estudiantes [], int notas [])
{
   int contador=0;
   for(int i=0; i<=posicionesEstudiante-1; i++)
   {
       cout<<"\nESTUDIANTE "<<i+1<<endl<<endl;
       cout<<estudiantes[i]<<endl<<endl;
       for (int x=0; x<asignatura; x++)
       {
           cout<<notas[contador]<<endl;
           contador++;
       }

   }

}

int menu ()
{
   int opc;
   cout<<"1.LLENAR\n2.IMPRIMIR\n3.SALIR"<<endl;
   cin>>opc;
   return opc;
}


Si quieres puedes reformular tu  programa y usar structs para poder tener una mejor abstraccion.
Ejemplo:
Código (cpp) [Seleccionar]
#include <iostream>

using namespace std;

const int NUMERO_ASIGNTURAS=5;

struct Estudiante
{
   string nombre;
   int asignaturas[NUMERO_ASIGNTURAS];
};

int main(){
 Estudiantes estudiantes[100];

 return 0;
}


Si sabes usar vector o listas enlazadas puedes sustuir los arreglos.
Si tienes dudas avisanos saludos...



Crack a ti tambien muchisimas gracias por tomarte la molesta de editar mi codigo para optimizarlo, maneje a los estudiantes como enteros porque todavia no he visto string, pero gracias a tu codigo lo voy analizar y aprendere su uso para adelantarme a los contenidos y estar preparado, corri tu codigo y funciono excelente aplicado desde otra logica con el mismo objetivo.

Muchas gracias a los dos por su buena atencion y su excelente explicacion aprendi bastante, a ese mismo codigo tengo que añardirle la funcion "INSERTAR, BUSCAR y BORRAR" estare publicando mis avances si tengo alguna duda o problema en otro tema mas adelante. ya que este tema me lo resolvieron.