0

Edit: Pensé que estaba en el foro en Inglés, perdón.

Buenas! He creado un programa para calcular el promedio ponderado de la universidad:

#include <iostream>
#include <stdlib.h>

using namespace std;

int main()
{
    cout << "\t\t Promedio Ponderado\n";
    cout << "\t\t ------------------\n\n";
    cout << "Luego de ingresar la calificacion, presione espacio e ingrese \nel numero de creditos y luego presione Enter\n";
    cout << "Ingrese la \n\t\tCalificacion y los Creditos:\n";

// Con iteraciones
/*float Grades [6] = {Met, Hum, Mat, Alg, Fis, Lab_Fis};
int Credits [6] {C_Met, C_Hum, C_Mat, C_Alg, C_Fis, C_Lab_Fis};

For....
*/

// Sin iteraciones
float Met, Hum, Cal, Alg, Fis, Lab_Fis, Ave;
int C_Met, C_Hum, C_Cal, C_Alg, C_Fis, C_Lab_Fis;


cout << "Metodologia: \t";
cin >> Met >> C_Met;

cout << "Humanidades: \t";
cin >> Hum >> C_Hum;

cout << "Calculo 2: \t";
cin >> Cal >> C_Cal;

cout << "Algebra Lineal: ";
cin >> Alg >> C_Alg;

cout << "Fisica: \t";
cin >> Fis >> C_Fis;

cout << "Lab. de Fisica: ";
cin >> Lab_Fis >> C_Lab_Fis;

Ave = (Met*C_Met + Hum*C_Hum + Cal*C_Cal + Alg*C_Alg + Fis*C_Fis)/(C_Met + C_Hum + C_Cal + C_Alg + C_Fis);
cout << "Tu promedio semestral es: " << Ave;

_sleep (5000);
return 0;
}

Como pueden ver, es un código un tanto largo y creo que se puede hacer un código más eficiente usando Arrays e iteraciones pero no he logrado hacerlo y me gustaría me ayuden, por favor. Cómo lo haría ustedes?

Problema:

  1. Cuando creo el .exe el programa solicita la información pero no muestra la respuesta, es por eso que tuve que agregar la librería stdlib.h y la función (no sé si sea una función) _sleep pero cuendo estoy en modo Debug, funciona sin necesidad de agregar dicha librería/función ¿Alguna forma de solucionar ésto?

Muchas gracias de antemano!

  • 1
    debes preguntar en español o la pregunta será cerrada. Por favor edita tu pregunta. – UselesssCat Apr 14 '17 at 04:19
  • Perdón, pensé que estaba en el foro en inglés. Espero pueda ayudarme, muchas gracias! – Germán Diego Guisasola Plejo Apr 14 '17 at 04:58
  • Con respecto a la sentencia `sleep` eso es porque cuando lo compilás y ejecutás fuera de un IDE como CodeBlocks en cuanto termina el programa se cierra la consola. Podrías reemplazar ese sleep por un `System("pause")`. En cuanto a las librerías podrías importar solo `#include` y eso te incluye todas las librerías que tu programa requiere sin degradar la performance – Genarito Apr 14 '17 at 05:13
  • 1
    Gracias por el aporte, intentaré agregar `System("pause")` y eliminaré el `_sleep` lo cual me permite eliminar la librería stdlib.h pero mi pregunta es por qué importar la librería `#include ` si ya importé la librería `#include `? O es que acaso ésta última me permite hacer uso de `System("pause")` ? – Germán Diego Guisasola Plejo Apr 14 '17 at 05:28
  • Tengo entendido que `System("pause")` no es buena practica. En vez de eso solo se usa `cin.get();` para pausar la ejecución. – UselesssCat Apr 14 '17 at 13:25
  • @GermánDiegoGuisasolaPlejo con esa librería estás diciendo "Incluime todas las librerías que mi código requiera", entonces te ahorras de ver si necesitas iostream, stdlib, entre muchas otras – Genarito Apr 14 '17 at 15:40

1 Answers1

1

Un programa en C++ que aplica ciclos es algo como esto:

#include <iostream>
#include <stdlib.h>

using namespace std;

#define NOTA_MIN 1.0f
#define NOTA_MAX 7.0f

#define CRED_MIN 0
#define CRED_MAX 10

int main(){
    cout << "\t\t Promedio Ponderado\n";
    cout << "\t\t ------------------\n\n";
    cout << "Luego de ingresar la calificacion, presione espacio e ingrese \nel numero de creditos y luego presione Enter\n";
    cout << "Ingrese la \n\t\tCalificacion y los Creditos:\n";

    string nombres[] = {
        "Metodologia",
        "Humanidades", 
        "Calculo 2", 
        "Algebra Lineal", 
        "Fisica", 
        "Lab. de Fisica"
    };

    float notas [6];
    int creditos [6];

    float sumCreditos = 0, sumPonderacion = 0;

    for (int i = 0; i < 6; i++){
        cout << nombres[i] << ": \t" << endl;

       // codigo para validar. Esto no valida la entrada de strings, solo
       // rangos numericos de las entradas. Para validar strings mira
       // https://stackoverflow.com/a/12755068/6658955
        do {
            cout << "nota:\t\t";
            cin >> notas[i];
            cin.clear();
        } while (notas[i] < NOTA_MIN || notas[i] > NOTA_MAX);

        do {
            cout << "credito:\t";
            cin >> creditos[i];
            cin.clear();
        } while (creditos[i] < CRED_MIN || creditos[i] > CRED_MAX);

       // sumar las notas*creditos y los creditos
        sumCreditos += creditos[i];
        sumPonderacion += notas[i] * creditos[i];
    }

    cout << "Tu promedio semestral es: " << sumPonderacion / sumCreditos << endl;
    cin.get();
    return 0;
}

El problema del pause se produce por que ciertos sistemas operativos y ciertos IDEs cierran la terminal al terminar la ejecución. Esto es un problema del usuario y no debes intentar solucionarlo tu. Para que no se cierre la terminal, ejecuta el programa desde una terminal ya abierta. Con respecto a este tema te recomiendo que leas esta respuesta en inglés.

UselesssCat
  • 3,127
  • 1
  • 18
  • 43
  • Muchas gracias!!! Voy a estudiar el código y si tengo alguna pregunta, le escribiré. Que tenga un buen día! Bendiciones, – Germán Diego Guisasola Plejo Apr 14 '17 at 19:17
  • Happy coding. Bendiciones igual. :p – UselesssCat Apr 14 '17 at 20:38
  • Listo! Ya entendí todo el código, desde las variables globales, el uso del `do-while` para verificar que no se estén ingresando datos incorrectos y el uso de `cin.get()` para pausar la consola y visualizar la respuesta. Ahora, mi pregunta es, cómo puedo hacer para que la persona que vaya a usar este programa no tenga que estar escribiendo la cantidad de créditos de cada asignatura cada vez que lo abre sino que sólo los digite una sóla vez y que el programa lo recuerde para que la próxima sólo ingrese la calificación? Resolviendo esto, ya podría generalizar más el programa. Muchas gracias! – Germán Diego Guisasola Plejo Apr 19 '17 at 01:26
  • definitivamente debes usar ficheros. Pero es un tema mas amplio. De todas formas no es tan complicado, c++ provee librerias/bibliotecas estándar para eso. puedes ver preguntas como [esta](https://es.stackoverflow.com/questions/33669/escritura-en-ficheros-en-c) o hacer tus propias preguntas acá (en stackovverflow español). Tambien puedes buscar en tutoriales en internet como en [conclase.net](http://c.conclase.net/curso/?cap=039) – UselesssCat Apr 19 '17 at 02:57
  • Muchas gracias! Ahora me pongo a ello y si tengo alguna pregunta, la formularé, por lo pronto, la pregunta que hice aquí ya fue solucionada con lujo de detalles. Que tenga un buen día! – Germán Diego Guisasola Plejo Apr 19 '17 at 04:23