[ Foro de C++ ]

Problema con programa en c++

08-Nov-2018 22:35
Ricardo Humberto Cuc Salazar
1 Respuestas

estoy creando un programa:
1. Almacenar en un arreglo los datos personales de los alumnos (máximo 40) de un salón de clases (código, nombre, dirección, edad, sexo, cal1, cal2, promedio), calcular el promedio y almacenarlo en el campo promedio, posteriormente imprimir:
a) Lista de los alumnos.
b) Lista de los alumnos que tienen una determinada edad y aprobaron.
c) Promedio del grupo.
d) Promedio de los alumnos comprendido entre un rango de edades especificado por el usuario.

pero cuando quiero verificar la opción b c o d en el penúltimo alumno me muestra un codigo que no le corresponde y al ultimo alumno es todo 0 este ya no derive de imprimirse pues con el penúltimo llega al total de alumnos que ingrese dejo el codigo esperando prota respiesta
#include <iostream>
#include <stdlib.h> //NUEVA LIBRERIA
#include <conio.h>
#include <stdio.h>
#include <windows.h>
#include <string>
#include <F:\c++\proyecto final\libreria validacion de enteros\bibliotecavalidaint.cpp>

using namespace std;
using namespace validacionIngresoint;

struct alumno{
int codigo,cod;
char nombre[50];
char direccion[50];
char sexo[30];

int edad;
float cal1,cal2,prom,sumagrup,promediogrupo,promedioedad;
};


/* run this program using the console pauser or add your own getch, system("pause") or input loop */

int main() {

char opc,resp,aux,entero;
string estudiante;
int contador,ingresado=0, salida,i, j,c,k,bandera,edadbuscar;
alumno a[4];

do{
opc=aux;
system ("cls");

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED);
printf("\tBien Venido Usuario\n");
printf("Elige alguna de las siguientes Opciones\n");
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY);
printf("\n\ta) Ingresar Alumno\n");
printf("\tb) Lista de Alumnos\n");
printf("\tc) Promedio del grupo\n");
printf("\td) Promedio de alumnos de determinada edad\n");
cout<<"--> ";cin>>opc;
do{
bandera=aux;
opc=tolower(opc);
if((opc!='a')&&(opc!='b')&&(opc!='c')&&(opc!='d'))
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN);
printf("\n---<Por favor elija una opcion valida>---: ");
bandera=1;
cin>>opc;
}
}while(bandera==1);

switch(opc){

case 'a':
{

for(i=1;i<=4;i++)
{
system ("cls");
a[i].cod=i;
cout << "\n Codigo de alumno: "<<a[i].cod;
getchar ();
cout << "\nIngrese nombre del estudiante: ";
gets(a[i].nombre);
                           cout << "Ingrese direccion del estudiante: ";
                           gets(a[i].direccion);
cout << "Ingrese sexo del estudiante: ";
gets(a[i].sexo);

cout << "Ingrese edad del Estudiante: ";

do{
a[i].edad=tomarInt();

if(a[i].edad<1||a[i].edad>100)
{
cout << "\nEdad Ingresada no valida la edad deve de ser mayor a 0 años y menor a 100 o comuniquese con proveedor del sistema: \n";
}
cout<<"("<<i<<")";
}while (a[i].edad<1||a[i].edad>100);

                           cout << "Ingrese calificacion 1 (1-100pts.): ";
                           do{
a[i].cal1=tomarInt();
if(a[i].cal1>100||a[i].cal1<1)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN);
cout<<"\nNota ingresada debe ser de 1-100 pts. \e";
}
}while(a[i].cal1>100||a[i].cal1<1);

cout << "Ingrese calificacion 2 (1-100pts.): ";

do{
a[i].cal2=tomarInt();
if(a[i].cal2>100||a[i].cal2<1)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN);
cout<<"\nNota ingresada debe ser de 1-100 pts.\e ";
cout<<"("<<i<<")";
}
cout<<"("<<i<<")";
}while(a[i].cal2>100||a[i].cal2<1);
cout<<"\n\n";
a[i].prom = (a[i].cal1 + a[i].cal2)/2;
a[i].sumagrup=a[i].sumagrup+a[i].prom;
system ("pause");
ingresado++;
          }
cout<<"Usted ingreso ";

a[i].promediogrupo=(a[i].sumagrup)/40;
system ("pause");
    system ("cls");

break;
  }

case 'b':
{


  system ("cls");
  SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN);
    cout << "\tLista de Alumnos\n\n" << endl;

  if(ingresado>1)
{
  for(j=1; j<=i; j++)
     {
      if(ingresado>1||ingresado<41)
 {

  cout << "SU CODIGO" << "----> " << a[j].cod << endl;
  cout << "SU NOMBRE" << "----> " << a[j].nombre << endl;
  cout << "CALIFICACION 1" << "----> " << a[j].cal1 << endl;
  cout << "CALIFICACION 2" << "----> " << a[j].cal2 << endl;
  cout << "PROMEDIO" << "----> " << a[j].prom << endl;
  cout <<"________________________________________________________________________\n";
  putchar('\a');
  }
     }

    }
    else
    {
    SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED);
    printf("\t<<< No ahi datos Ingresados >>>\n\n");
}
    break;
  }

      case 'c':
  {


     system ("cls");
     SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN);
     if(ingresado++>0){

    cout << "\n\tEl promedio del grupo de alumnos ingresado es de: " << a[i].promediogrupo<< endl;
  }
  else
  {
  SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED);
  cout << "\n\t<<NO AHI DATOS INGRESADOS>>\n";
  }

system ("pause");
system ("cls");
    break;
  }
  case 'd':{
do{
if(ingresado>1)
{

        system ("cls");
  SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED);
cout <<"\t>>>>>Verificaremos promedio de notas segun Edad <<<<<\n\n";
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY);
    cout << "\n Ingrese edad a buscar: " << endl;

  do
  {
getchar();
  edadbuscar=tomarInt();

for(k=1; k<=i; k++)
  {
  if (edadbuscar == a[k].edad)
  {
  a[k].promedioedad=a[k].promedioedad+a[k].prom ;
  contador=contador+1;
  }
  }
if(edadbuscar!=a[k].edad)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED);
cout<<"\n No existen alumnos de "<<edadbuscar<<" años\e"<<endl;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN);
cout<<"\n Si decea realizar otra busque digite s: ";
cin>>resp;
}

  }while((edadbuscar!=a[k].edad)&&(resp=='s'||resp=='S'));

  cout<<"alumnos de esta edad: "<<contador;
  a[k].promedioedad=a[k].promedioedad/contador;
  SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_GREEN);
  cout<<"\n\tEl promedio total alumnos de "<<edadbuscar<<" años es de: "<<a[k].promedioedad;
  SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED);
  cout<<"\nDigite S para realizar otra CONSULTA: ";

cin>>resp;
  system ("cls");
  }
  else{
  SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_RED);
  cout<<"\n\t>>>> NO AHI ALUMNOS INGRESADOS <<<<\n\n";
  }
}while(resp=='s'||resp=='S');

break;
  }

  }

SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), FOREGROUND_INTENSITY);
cout<<"\nDigite S para Realizar otra operacion segun opciones de menu: ";
  cin>>resp;
  }while(resp=='s'||resp=='S');

return 0;
}
dejo enlace de imajen para mostrar el error  la prueba se realizo con ingreso de 40 y 4 alumnos obteniento el mismo problema

https://www.lawebdelprogramador.com/usr/336000/336852/5be49ee897b8a-error.jpg


09-Nov-2018 09:29
Nacho Cabanes (+37)

No puedo probarlo porque depende de una biblioteca externa:

#include <F:\c++\proyecto final\libreria validacion de enteros\bibliotecavalidaint.cpp>

y si elimino esa línea, me da como desconocida la función "tomarInt". Pero no suele ser buena idea para un principiante mezclar lectura de enteros con lectura de caracteres o cadenas, porque al leer un número puede quedar en el buffer el \n del final de la introducción de datos, y falsearte lecturas posteriores.

Antes de seguir adelante, asegúrate de que la función "tomarInt" vacía el buffer del teclado, o hazlo manualmente después de cada lectura de enteros, en caso de que no puedas modificar esa función.






Si ya eres usuario del sistema, puedes contestar desde tu cuenta y así ganar prestigio.

Si sólo eres un visitante, puedes optar por...