1

Buenas me pidieron desarrollar un programa que permita imprimir la suma, el producto, el máximo y el mínimo de 5 números enteros. Lo desarrollé pero al momento que me imprime el menor siempre me sale que es 2(así no ingrese el número 2). Si pudieran revisar y decirme mi error. Gracias.

#include <iostream>
#include <conio>

int main () {

       int vector[5];
       int i;
       int suma=0, producto=1, mayor=vector[0], menor=vector[0];
       for (i=0; i<5; i++){
          cout<<"Ingrese el numero "<<(i+1)<<endl;
          cin>> vector[i];
       }
       for (i=0; i<5; i++){
         if (vector[i]> mayor){
            mayor=vector[i];
         }
         if (vector[i]< menor){
            menor=vector[i];
         }
       }
       for(i=0;i<5;i++) {
           suma=suma+vector[i];
       }
       for(i=0;i<5;i++) {
          producto=producto*vector[i];
       }
       cout<<"La suma es: "<<suma<<endl;
       cout<<"El producto es: "<<producto<<endl;
       cout<<"El mayor es: "<<mayor<<endl;
       cout<<"El menor es: "<<menor<<endl;

       getch();
       return 0;

}
eferion
  • 49,291
  • 5
  • 30
  • 72
Paolo
  • 31
  • 6

2 Answers2

5

Pese a que la respuesta de Mauricio Brito señala la solución, hay detalles que se han omitido y que vale la pena mencionar.

Sólo cuatro de seis variables inicializadas.

int vector[5];
int i;
int suma=0, producto=1, mayor=vector[0], menor=vector[0];

Tanto vector como i carecen de valor(es) inicial(es), sería aconsejable dar un valor a las variables no inicializadas:

int vector[5] {}; // todos los elementos del arreglo vector contienen 0
int i = 0;
int suma=0, producto=1, mayor=vector[0], menor=vector[0];

¿Por qué es tan importante dar estos valores iniciales? Porque de no acerlo, obtienen valores residuales desde la memoria y estos pueden afectar al funcionamiento del programa... por ejemplo:

al momento que me imprime el menor siempre me sale que es 2(así no ingrese el número 2).

Apuesto que el arreglo vector obtuvo varios valores desde la memoria y en la posición 0 tendría un 2, por esto, al inicializar menor esta variable obtiene ese valor residual y dicho valor residual es menor a cualquiera de los que introduces.

Dado que la variable i la usas más adelante y lo primero que haces con ella es otorgarle un valor no sería necesario inicializarla; aún así yo acosejo hacerlo.

No escoges los mejores valores para inicializar mayor y menor.

Incluso aunque hubieras otorgado valor a los elementos del arreglo vector, ninguno de esos valores es la mejor elección para mayor o menor; las mejores elecciones son respectivamente el menor número entero y el mayor número entero, los cuales puedes obtener con la cabecera <limits>:

int vector[5] {}; // todos los elementos del arreglo vector contienen 0
int i = 0;
int suma = 0, producto = 1;
int mayor = std::numeric_limits<int>::min(); // Menor entero posible
int menor = std::numeric_limits<int>::max(); // Mayor entero posible

Estas elecciones para inicializar mayor y menor te garantizan que sea cual sea el valor de entrada cualquier valor será mayor al que ya contiene mayor y menor al que ya contiene menor.

No necesitas el arreglo ni tres de los bucles for.

¿Por qué hacer las cosas en dos pasos pudiendo hacerlas en uno?

int suma = 0, producto = 1;
int mayor = std::numeric_limits<int>::min();
int menor = std::numeric_limits<int>::max();

for (int i = 0; i < 5; ++i){ // i declarado y usado solo aqui
    std::cout << "Ingrese el numero " << (i + 1) << '\n';
    int numero = 0;
    std::cin >> numero;
    mayor = std::max(mayor, numero); // std::max pertenece a la libreria <algorithm>
    menor = std::min(menor, numero); // std::min pertenece a la libreria <algorithm>
    suma += numero;
    producto *= numero;
}

Con estos cambios el programa se comporta igual y pasas de usar cuatro bucles for a usar tan sólo uno, así que el ordenador trabaja menos.

Además, usando algunas de las funciones de la cabecera de algoritmos (<algorithm>) seleccionas de manera más fácil el número mayor y menor:

  • std::max: Te devuelve el número mayor de los que le pasas por parámetros.
  • std::min: Te devuelve el número menor de los que le pasas por parámetros.

Usar estas funciones y eliminar algunas líneas, hace el código algo más legible.

Usas cabeceras innecesarias que además no son de C++.

Estás incluyendo la cabecera <conio> que forma parte de y su misión es comunicarse con la consola a la vez que incluyes la cabecera <iostream> la cuál tiene exáctamente la misma misión pero siendo esta última de , el programa ni siquiera debería compilar tal y como lo has compartido.

Las cabeceras de C++ no tienen extensión de archivo: <iostream>, <vector>, <string>, etc... excepto las cabeceras que existen por compatibilidad con C: <math.h>, <stdlib.h>, <stdint.h>, etc...

La mayoría de cabeceras de C disponen de una versión portada a C++ a la que se le ha quitado la extensión, se les ha añadido el prefijo "c" (por ejemplo <cmath>, <cstdint>) y han sido adaptadas a C++. Si estás trabajando con C++ deberías usar estas últimas no las de C.

Te falta el espacio de nombres.

Antes de cin y cout te falta el espacio de nombres, sin ello el programa no compila; puedes ahorrarte escribir el std:: contínuamente escribiendo la instrucción using namespace std. Te aconsejo que eches un vistazo a este hilo para conocer más detalles.

Abusas de std::endl.

Normalmente no es buena idea, te aconsejo echar un vistazo a este hilo para conocer más detalles.


Con todas las correcciones sugeridas aplicadas, el código [quedaría así]:

#include <iostream>
#include <limits>
#include <algorithm>

int main () {
    int suma = 0, producto = 1;
    int mayor = std::numeric_limits<int>::min();
    int menor = std::numeric_limits<int>::max();

    for (int i = 0; i < 5; ++i) {
        std::cout << "Ingrese el numero " << (i + 1) << '\n';
        int numero = 0;
        std::cin >> numero;
        mayor = std::max(mayor, numero);
        menor = std::min(menor, numero);
        suma += numero;
        producto *= numero;
    }

    std::cout << "La suma es: "     << suma     << '\n'
              << "El producto es: " << producto << '\n'
              << "El mayor es: "    << mayor    << '\n'
              << "El menor es: "    << menor    << '\n';

    return 0;
}

Por cierto, en los bucles for usa pre-incremento siempre que te sea posible.

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
2

Inicializa el menor y el mayor despues del ingreso de los números

        #include <iostream>
        #include <conio.h>

        int main () {

           int vector[5];
           int i;
           int suma=0, producto=1, mayor, menor;
           for (i=0; i<5; i++){
              cout<<"Ingrese el numero "<<(i+1)<<endl;
              cin>> vector[i];
           }
           **mayor=vector[0];
           menor=vector[0];**

           for (i=0; i<5; i++){
             if (vector[i]> mayor){
                mayor=vector[i];
             }
             if (vector[i]< menor){
                menor=vector[i];
             }
           }
           for(i=0;i<5;i++) {
               suma=suma+vector[i];
           }
           for(i=0;i<5;i++) {
              producto=producto*vector[i];
           }
           cout<<"La suma es: "<<suma<<endl;
           cout<<"El producto es: "<<producto<<endl;
           cout<<"El mayor es: "<<mayor<<endl;
           cout<<"El menor es: "<<menor<<endl;

           getch();
           return 0;
        }
rnrneverdies
  • 16,491
  • 3
  • 49
  • 79
Mauricio Brito
  • 170
  • 1
  • 2
  • 15