Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] DUDA Promedios con c++

Estas en el tema de DUDA Promedios con c++ en el foro de C/C++ en Foros del Web. Buenas gente, molesto otra vez, pero esta vez no es para pedir ayudar para la redacción de un código. Esta vez vengo con el siguiente ...
  #1 (permalink)  
Antiguo 26/03/2016, 21:12
 
Fecha de Ingreso: marzo-2016
Mensajes: 15
Antigüedad: 8 años
Puntos: 0
Pregunta DUDA Promedios con c++

Buenas gente, molesto otra vez, pero esta vez no es para pedir ayudar para la redacción de un código. Esta vez vengo con el siguiente problema: Me están enseñando vectores, el profesor nos dio el siguiente programa y nos pidió que expliquemos el algoritmo que usa el programa para desenvolverse y así dar el promedio y la nota máxima y la nota mínima de todas la notas ingresadas, dejo el código:

Código C++:
Ver original
  1. #include <iostream>
  2.  
  3.  
  4. // Valores de las constantes
  5.  
  6. #define MAX_NOTA 5
  7. #define NOTA_BAJA 1
  8. #define NOTA_ALTA 10
  9.  
  10. using namespace std;
  11.  
  12. int main()
  13. {
  14.  
  15.     //Array de las notas
  16.        //Para empezar no entiendo por qué el profesor declara a notaMin como NOTA_ALTA y a notaMax como NOTA_BAJA
  17.     int notas[MAX_NOTA];
  18.     int sumNotas = 0;
  19.     int notaMin = NOTA_ALTA;
  20.     int notaMax = NOTA_BAJA;
  21.  
  22.     for (int i = 0; i < MAX_NOTA; i++)
  23.     {
  24.         cout << endl << "Nota " << i << ":";
  25.         cin >> notas[i];
  26.  
  27.         sumNotas += notas[i];
  28.  
  29.         if (notas[i] < notaMin)  //Sinceramente no sé para qué sirve este if, lo que se me ocurre es que evalúa todos los elementos de notas[i] y si alguno es menor a 10 (notamin), entonces se ejecuta que notaMin = a algún número entero de la matriz notas[i]
  30.             notaMin = notas[i];
  31.  
  32.         if (notas[i] > notaMax) //Lo mismo me sucede en este caso
  33.             notaMax = notas[i];
  34.  
  35.     }
  36.  
  37.     cout << endl << "La nota promedio es: " << sumNotas / MAX_NOTA << endl;
  38.     cout << "La nota más alta es: " << notaMax << endl;
  39.     cout << "La nota más baja es: " << notaMin << endl;
  40.  
  41.     system("PAUSE");
  42.  
  43.  
  44.     return 0;
  45. }

Muchas gracias de antemano y espero haberme expresado correctamente. Tengan una buena jornada
  #2 (permalink)  
Antiguo 27/03/2016, 08:27
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 5 meses
Puntos: 204
Respuesta: DUDA Promedios con c++

¿Has probado a ejecutar el programa con un depurador y ver qué queda en las variables?

¿Has intentado ver dónde se utiliza cada variable? No solo los nombres dan cierta idea de la utilidad de la variable sino que luego el programa saca mensajes que terminan de aclarar las intenciones. Si sabes para qué va a almacenar una variable en concreto deberías ser capaz de deducir qué hace el algoritmo que la manipula.

Un ejemplo: Si una variable te va a decir cuántos elementos mayores de 10 hay en un vector, está claro que el algoritmo que manipula dicha variable va a recorrer el vector e incrementar la variable cada vez que encuentre un número mayor que 10.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #3 (permalink)  
Antiguo 27/03/2016, 13:38
 
Fecha de Ingreso: enero-2014
Mensajes: 60
Antigüedad: 10 años, 2 meses
Puntos: 1
Respuesta: DUDA Promedios con c++

hola alanjo veo que estas empezando con lo basico,
mi recomendacion va en la misma direccion que la de eferion,

ejecuta el codigo y
cambia los valores de las constantes (#define) para ver en que afecta al programa
dale valores de entrada de datos muy variados y asi comprenderas como funciona el programa
por ejemplo:

- prueba a intercambiar los valores de las constantes NOTA_BAJA Y NOTA_ALTA

- cambia el valor de MAX_NOTA

- como hay preguntas de examen que descuentan es posible sacar numeros negativos, asi que, que pasaria si todos sacan numeros negativos

- introduce numeros mayores de 10 en todas las notas

- introduce cero en todas las notas

- y si intoduces un caracter, ¿que pasaria?


la manera de aprender es experimentando asi que si quieres aprender ya sabes ...

para que te compile el programa necesitas añadir "#include <stdio.h>" bajo el "#include <iostream>"
o quitar la funcion "system("PAUSE");",
por cierto el pause es un comando dependiente del sistema operativo,
hay otras maneras de pausar el programa

suerte

Última edición por vizen; 27/03/2016 a las 13:43
  #4 (permalink)  
Antiguo 27/03/2016, 20:03
 
Fecha de Ingreso: marzo-2016
Mensajes: 15
Antigüedad: 8 años
Puntos: 0
Respuesta: DUDA Promedios con c++

Muchas gracias a ambos, intenté cambiar los valores, y el programa deja de funcionar como el programa original, ya que si cambio los valores de MAX_NOTA, luego en la función IF y a la hora de mostrar la nota en pantalla, el valor cambia y es 0 o 10. Lo que no termino de entender es como funciona el análisis de los vectores, es decir, el programa está queriendo decir "De los vectores encontrados se extrae el menor" o "Se muestran todos los números menores a 10". Sinceramente vectores me complicó bastante. Disculpen las molestias y gracias por el tiempo dedicado.
  #5 (permalink)  
Antiguo 27/03/2016, 23:22
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 5 meses
Puntos: 204
Respuesta: DUDA Promedios con c++

Has probado a realizar los cálculos sobre el papel??

No son cálculos nada complejos. Un promedio, nota máxima y nota mínima. ¿Cómo los calcularías tu si tuvieses que hacerlo sobre el papel? En el caso de, por ejemplo, la nota mínima, no vale comparar todos los valores mentalmente y elegir el correcto sino que has de hacerlo TODO sobre el papel.

Y piensa que un vector no es más que una lista de valores, el uso que se hace de los mismos en el programa no es nada complejo. Lo que comentas es más un miedo propio que una realidad.

La realidad es que el programa está simplificado al extremo. No hay notas negativas, el número de notas es siempre el mismo, no se usa memoria dinámica, ...

La única parte que no comparto respecto al programa es esa mala manía de usar "using namespace std". Eso y usar conio... En fin.

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #6 (permalink)  
Antiguo 28/03/2016, 14:10
Avatar de Instru  
Fecha de Ingreso: noviembre-2002
Ubicación: Mexico
Mensajes: 2.751
Antigüedad: 21 años, 4 meses
Puntos: 52
Respuesta: DUDA Promedios con c++

Cita:
Iniciado por eferion Ver Mensaje
Has probado a realizar los cálculos sobre el papel??

No son cálculos nada complejos. Un promedio, nota máxima y nota mínima. ¿Cómo los calcularías tu si tuvieses que hacerlo sobre el papel? En el caso de, por ejemplo, la nota mínima, no vale comparar todos los valores mentalmente y elegir el correcto sino que has de hacerlo TODO sobre el papel.

Y piensa que un vector no es más que una lista de valores, el uso que se hace de los mismos en el programa no es nada complejo. Lo que comentas es más un miedo propio que una realidad.

La realidad es que el programa está simplificado al extremo. No hay notas negativas, el número de notas es siempre el mismo, no se usa memoria dinámica, ...

La única parte que no comparto respecto al programa es esa mala manía de usar "using namespace std". Eso y usar conio... En fin.

Un saludo.
Jajajaja.
He visto infinidad de tutoriales y libros que fomentan esa mala práctica. Bjarne Stroupstrup en su libro de C++ es el único lugar donde habla claramente del tema y da consejos del correcto uso así como sus consecuencias positivas (y negativas en algunos casos).
  #7 (permalink)  
Antiguo 28/03/2016, 15:38
 
Fecha de Ingreso: enero-2014
Mensajes: 60
Antigüedad: 10 años, 2 meses
Puntos: 1
Respuesta: DUDA Promedios con c++

hola alanjo

esto no es un problema de vectores, de hecho no se utilizan para nada mas que
guardar las entradas, asi que olvidalos y entiende como funciona

para entenderlo haz caso a eferion y dibuja una cuadricula con todas la
variables y en cada vez que algo cambie (una asignacion, un incremento, ...)
lo anotas en una nueva fila bajo la variable que cambia, asi entenderas lo
que hacen los ifs y todo lo demas

como harias tu el programa? hazlo tu y veras que no sera muy distinto de este

cuando hagas pruebas en el programa, haz cambios sobre una sola variable si
no, no sabras quien provoco los cambios en el funcionamiento.

te muestro el programa sin vectores, que es el mismo, y funciona igual.

Código c:
Ver original
  1. // sin vectores
  2.  
  3.     #include <iostream>
  4.     #include <stdio.h>
  5.  
  6.     // Valores de las constantes
  7.  
  8.     #define MAX_NOTA 10
  9.     #define NOTA_BAJA 10
  10.     #define NOTA_ALTA 1
  11.  
  12.     using namespace std;
  13.  
  14.     int main()
  15.     {
  16.         int notas=MAX_NOTA;
  17.         int sumNotas = 0;
  18.         int notaMin =NOTA_BAJA ;
  19.         int notaMax = NOTA_ALTA;
  20.  
  21.         for (int i = 0; i < MAX_NOTA; i++)
  22.         {
  23.             cout << endl << "Nota " << i << ":";
  24.             cin >> notas;
  25.  
  26.             sumNotas += notas;
  27.  
  28.             if (notas < notaMin) notaMin = notas;
  29.             if (notas > notaMax) notaMax = notas;
  30.  
  31.         }
  32.  
  33.         cout << endl << "La nota promedio es: " << sumNotas / MAX_NOTA << endl;
  34.         cout << "La nota más alta es: " << notaMax << endl;
  35.         cout << "La nota más baja es: " << notaMin << endl;
  36.  
  37.         getchar();
  38.  
  39.  
  40.         return 0;
  41.     }


suerte
  #8 (permalink)  
Antiguo 28/03/2016, 22:00
 
Fecha de Ingreso: marzo-2016
Mensajes: 15
Antigüedad: 8 años
Puntos: 0
Respuesta: DUDA Promedios con c++

Chicos muchas gracias a ambos que me ayudaron, me gustaría saber cómo es eso de la mala costumbre del
Código C++:
Ver original
  1. using namespace std
. El profesor nos dijo que podíamos usar
Código C++:
Ver original
  1. "std::cout<<"algo" << std::endl;"
pero nos dijo que queda a decisión de uno, pero no nos dio una explicación, me gustaría poder saber sobre el tema, lo de la librería conio.h creo entenderlo, es una librería muy pesada y que sólo se usa en ámbitos de estudios, pero a la hora de aplicarlo en lo cotidiano, no se la usa, eso según estuve leyendo en uno de las respuestas que brindó eferion en uno de los temas. Bueno, volviendo al tema central, ¡Creo que entendí y aunque sea simple, estoy contento con poder haberlo entendido! gracias a ustedes que me hicieron pensar... Lo expliqué de la siguiente manera, si alguien quiere hacer alguna corrección puede hacerme saber, ya que yo soy un novato en la programación, o quizás le sirva a otra persona a modo de entender lo que yo no podía comprender, nunca se sabe. Les dejo el código comentado:

Código C++:
Ver original
  1. // Se definen las constantes
  2. #define MAX_NOTA 5
  3. #define NOTA_BAJA 1
  4. #define NOTA_ALTA 10
  5.  
  6. using namespace std;
  7.  
  8. int main()
  9. {
  10.  
  11.     //Array de las notas
  12.     int notas[MAX_NOTA];
  13.     int sumNotas = 0;
  14.     int notaMin = NOTA_ALTA;
  15.     int notaMax = NOTA_BAJA;
  16.  
  17.     //Resolución del problema
  18.  
  19.     for (int i = 0; i < MAX_NOTA; i++) /* En la función for (para este caso) se establece un valor fijo sólo la primera vez que se
  20.                                         ejecuta el programa, si el usuario ingresa 5 como cin en "nota : 5" notaMin = 5 y
  21.                                         notaMax = 5 ahora si en Nota 1 (i++): 8 (El usuario ingresa la nota 8)
  22.                                         notamin= 5 debido a que 8 (notas[i]) no es < a 5 (notaMin del primero bucle del for "nota 0")
  23.                                         ahora bien, 8(notas[i] - ingresado por el usuario -)
  24.                                         es mayor a 5 (notaMax del primer bucle del for "nota 0") por ende la nueva notaMax=8 */
  25.     {
  26.         cout << endl << "Nota " << i << ":";
  27.         cin >> notas[i];                     /*1er caso; el usuario ingresa el número "5"
  28.                                              2do caso; el usuario ingresa el número 8*/
  29.  
  30.         sumNotas += notas[i];               /*1er caso; Se guarda la suma entre sumNotas y la nota ingresada (5) en sumNotas, ej: si ingreso 5
  31.                                             entonces sumNotas = 5
  32.                                             2do caso; sumNotas= 5, se suma a la nota ingresada notas[i] (8), 5 + 8 = 13*/
  33.  
  34.         if (notas[i] < notaMin)         /*1er caso; se evalua el 5 ingresado por el usuario, ¿Es menor a notaMin(10)? sí, entonces..
  35.                                         al ser 5 < que 10, notaMin entonces toma un nuevo valor que es 5, notaMin = 5
  36.                                         2do caso: se evalua si el 8 ingresado es menor a 5 (notaMin = 5 del recorrido del for ANTERIOR
  37.                                         8 NO es < a 5 por ende, se ignora el if ya que no cumple la condición y notaMin sigue siendo = 5 )*/
  38.             notaMin = notas[i];        
  39.  
  40.         if (notas[i] > notaMax)         /*1er caso; (Se aplica lo mismo que el if anterior con diferente operador), ¿Es mayor 5 a
  41.                                         2do caso; Es 8 mayor a 5 (del recorrido ANTERIOR del FOR), sí, es mayor, por ende notaMax
  42.                                         toma un nuevo valor y es 8 ya que notaMax=notas[i] */
  43.             notaMax = notas[i];        
  44.                                         // El programa seguirá así hasta encontrar (O NO) un número menor o mayor según el IF
  45.     }
  46.  
  47.     cout << endl << "La nota promedio es: " << sumNotas / MAX_NOTA << endl; /* Se divide las suma total de sumNotas += notas[i]
  48.                                                                             en el máximo de notas que se pueden ingresar*/
  49.     cout << "La nota más alta es: " << notaMax << endl;                     /*Se muestra la notaMax obtenida del segundo IF*/
  50.     cout << "La nota más baja es: " << notaMin << endl;                     /*Se muestra la notaMin obtenida del primer IF*/
  51.  
  52.     system("PAUSE");
  53.  
  54.  
  55.     return 0;
  56. }

Muchas gracias. Y gracias vizen por tomarte el tiempo de cambiar el código.

Última edición por alanjo; 28/03/2016 a las 22:07
  #9 (permalink)  
Antiguo 29/03/2016, 00:16
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 5 meses
Puntos: 204
Respuesta: DUDA Promedios con c++

Los espacios de nombres en C++ se crearon con la idea de catalogar el código. Es una forma práctica de agrupar el código.

Otra ventaja de usar los espacios de nombre es que puedes tener elementos que se llamen igual pero con usos distintos cada uno en un espacio de nombres distinto y el programa funcionará perfectamente:

Código C++:
Ver original
  1. namespace a
  2. {
  3.   int var = 0;
  4. }
  5.  
  6. namespace b
  7. {
  8.   int var = 0;
  9. }
  10.  
  11. int main()
  12. {
  13.   a::var=5;
  14.  
  15.   std::cout << a::var << b::var;
  16. }

El código que no se encuentra dentro de un espacio de nombres explícito se ubica en lo que podríamos denominar espacio de nombres base. De hecho podemos hacer lo siguiente:

Código C++:
Ver original
  1. namespace a
  2. {
  3.   int var = 1;
  4. }
  5.  
  6. namespace b
  7. {
  8.   int var = 2;
  9. }
  10.  
  11. int var=3;
  12.  
  13. int main()
  14. {
  15.   int var = 4;
  16.  
  17.   std::cout << a::var << b::var << ::var << var;
  18. }
Cuando se usa "using namespace" se está importando el espacio de nombres al completo. Eso hace que pierdas el control sobre lo que t e estás trayendo. Si hay variables, clases o funciones que se solapan, cual es la que va a usar el compilador?? Lo mismo no es la que tú esperas:
Código C++:
Ver original
  1. namespace a
  2. {
  3.   int var = 0;
  4. }
  5.  
  6. namespace b
  7. {
  8.   int var = 0;
  9. }
  10.  
  11. using namespace a;
  12. using namespace b;
  13.  
  14. int main()
  15. {
  16.   var=5; // cual estamos rocando a::var o b::var??
  17.  
  18.   std::cout << a::var << b::var;
  19. }
Y el problema se agrava cuando la importación la declaramos en una cabecera ya que ahí estamos forzando a que todo aquel que use la cabecera tenga que importar el ese espacio de nombres. Con eso solo conseguimos crear confusión.

Si en un momento dado lo creemos conveniente podemos importar elementos concretos, lo que evita arrastrar todo el espacio de nombres:

Código C++:
Ver original
  1. using std::cout;
  2.  
  3. int main()
  4. {
  5.   int var;
  6.   cin >> var; // error
  7.   std::cin >> var; // ok
  8.  
  9.   cout << var; // ok
  10. }

El mensaje lo he escrito desde el móvil y el código no está probado. Lo aviso por si acaso.

Un saludo.
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #10 (permalink)  
Antiguo 29/03/2016, 13:25
 
Fecha de Ingreso: enero-2014
Mensajes: 60
Antigüedad: 10 años, 2 meses
Puntos: 1
Respuesta: DUDA Promedios con c++

hola alanjo, veo que te lo has currado y ya lo tienes, por si se te escapa
algo te mando el codigo comentado

si esto te lo paso al principio, no hubieses aprendido nada y en los examenes
no hay foro

para eferion las gracias por otra de sus clases, se aprende mucho siguiendo
tus ayudas y comentarios

Código c:
Ver original
  1. #include <iostream>
  2. #include <stdio.h>
  3.  
  4.     /* Valores de las constantes*/
  5.  
  6.     // esta constante es la que nos dice cuantas notas tiene el alumno
  7.     #define MAX_NOTA 5
  8.     // aqui tenemos la nota mas baja (que deberia ser cero no uno)
  9.     #define NOTA_BAJA 0
  10.     // aqui la nota mas alta
  11.     #define NOTA_ALTA 10
  12.  
  13.     int main()
  14.     {
  15.         // en notas tenenos la cantidad de notas del alumno algo asi como cuantos examenes
  16.         int notas    = MAX_NOTA;
  17.         // aqui guardaremos la menor nota de todas, se inicializa a la maxima
  18.         // nota porque cualquier nota sera menor o igual asi que acertaremos
  19.         int notaMin  = NOTA_ALTA ;
  20.         // en esta es al reves ponemos la minima para que al comparar simpre sea
  21.         // mayor o igual a la nota mas baja
  22.         int notaMax  = NOTA_BAJA;
  23.         // este es un acumulador de notas que dividido por el numero de examenes
  24.         // nos dara el promedio
  25.         int sumNotas = 0;
  26.  
  27.         // este ciclo se repetira MAX_NOTA veces, es decir se repetira tantas
  28.         // veces como examenes (o ejercicios, o ...) tenga la asignatura
  29.         for (int i = 0; i < MAX_NOTA; i++)
  30.         {
  31.             //pedimos una nota
  32.             std::cout << endl << "Nota " << i << ":";
  33.             std::cin >> notas;
  34.  
  35.             // la acumulamos
  36.             sumNotas += notas;
  37.  
  38.             // si es menor que la nota minima (que la primera vez es la maxima)
  39.             // la guardaremos como nota menor
  40.             if (notas < notaMin) notaMin = notas;
  41.             // si la nota introducida es mayor que nota maxima la guardaremos
  42.             // como mayor (la primera vez se compara con la menor nota posible)
  43.             if (notas > notaMax) notaMax = notas;
  44.  
  45.         }
  46.  
  47.         // aqui se visualizan los resultados
  48.         std::cout << endl << "La nota promedio es: " << sumNotas / MAX_NOTA << endl;
  49.         std::cout << "La nota más alta es: " << notaMax << endl;
  50.         std::cout << "La nota más baja es: " << notaMin << endl;
  51.  
  52.         getchar();
  53.  
  54.         return 0;
  55.     }

alanjo, la insistencia en que probases tantas opciones es porque que cuando
pides un dato se comprueba si esta dentro del rango que esperas, para que el
programa no se quede colgado por algun pequeño error

en este caso seria algo como esto:
Código c:
Ver original
  1. // si notas es menor que cero o notas es mayor a diez vuelve a pedir el dato
  2. // por que este erroneo    
  3.  
  4.     do{
  5.         std::cout << endl << "Nota " << i << ":";
  6.         std::cin >> notas;
  7.     }while(notas<NOTA_BAJA || notas>NOTA_ALTA);

chao chao

Última edición por vizen; 29/03/2016 a las 13:33
  #11 (permalink)  
Antiguo 29/03/2016, 17:45
 
Fecha de Ingreso: marzo-2016
Mensajes: 15
Antigüedad: 8 años
Puntos: 0
Respuesta: DUDA Promedios con c++

Muchas gracias eferion, la verdad, apelando a lo que dice vizen, se aprende bastante con tus comentarios. Gracias chicos por ayudarme una vez más, no logro entender algo. el system("pause") puede traer algún error, o inconveniente? veo que vizen usa el getchar(); por lo que entiendo (no es tan complicado, es lógica, sólo traducir del inglés al español) el programa aguardará que el usuario ingrese algún caracter. Pero... ¿Hay alguna diferencia o puede el PAUSE, producir un resultado inesperado? Muchas gracias.
  #12 (permalink)  
Antiguo 30/03/2016, 12:21
 
Fecha de Ingreso: enero-2014
Mensajes: 60
Antigüedad: 10 años, 2 meses
Puntos: 1
Respuesta: DUDA Promedios con c++

system("comando") es una funcion de la libreria stdlib, que envia un comando al sistema operativo, claro que si no usas el mismo s.o. el comando no hara lo que se espera de el, en mi caso uso linux y ademas de no hacer la pausa da un error de comando no encontrado

por el contrario getchar() es una funcion de la libreria estandar de c que recoge un caracter de la entrada estandar (stdin), es decir espera (que es lo que buscamos) a recoger un carater, tambien podia haber utilizado un "std::cin >> notas;" y tambien hubiese esperado a introducir un dato (la pausa) y es mas del estio c++

system()
https://es.wikipedia.org/wiki/System_%28stdlib%29

getchar()
http://c.conclase.net/librerias/?ansifun=getchar

espero se entienda la diferencia
  #13 (permalink)  
Antiguo 30/03/2016, 14:38
 
Fecha de Ingreso: marzo-2016
Mensajes: 15
Antigüedad: 8 años
Puntos: 0
Respuesta: DUDA Promedios con c++

Muchas gracias vizen, muchas gracias eferion una vez más. Doy por solucionado el tema ;)

Etiquetas: int, programa, promedios, vector
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:50.