Buenas amigos, un cordial saludos soy nuevo en el foro y espero ser copartícipe de los conocimientos que provee este grandioso foro.
#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.
El contador i siempre inicia en 0 y hasta menor que 5
Saludos!
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.
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]
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.
#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:
#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...
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.
#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:
#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.