1

Estoy aprendiendo C++ y me presentaron el siguiente escenario:

Se tienen los costos de producción de llantas de una empresa automotriz correspondientes a los 12 meses del año anterior. Elaborar un programa que pueda proporcionar la siguiente información:

  • ¿En qué mes (número) se registró el mayor costo de producción?
  • ¿Cuál es el Promedio Anual de los costos de producción?
  • ¿En qué mes se registró el menor costo de producción?

Realicé el programa de la manera como la presento abajo... pero no logro enlazar de alguna manera el mes con el dato ingresado(el costo del mes), quería saber si hay alguna forma de cumplir con esto que se me pide con lo que llevo de código o si tendría que volver a pensar una forma distinta. La idea es que se imprima "El mayor de los costos de producción fue: [costo] presentado en el mes [mes]"

 #include "iostream"
    #include "stdio.h"
    #include "cstring"
    #include "cstdlib"
    //system("pause"); system("cls");
    
    using namespace std;
    
    //Declaracion de Variables
    int mes,i,j;
    float costo[11],temp;
    
    //introduccion de los costos
    void matriz(){
    
        cout<<"Ingrese los costos de produccion del mes "<<mes<<endl;
        cin>>costo[i];
        i++;
        
    }
    
    //Impresion de la matriz
    void imprimir(){
    
        
        for(int i;i<12;i++){
            cout<<" "<<costo[i];
        }
    }
    
    //Ordenamiento de la matriz
    void orden(){
        
        for(i=0;i<12;i++){
            for(j=0;j<12;j++){
                if(costo[j]>costo[j+1]){
                    temp=costo[j];
                    costo[j]=costo[j+1];
                    costo[j+1]=temp;
                    
                }
            }
        }   
    }
    
    
        
    
    
    
    //Menor y Mayor de los costos
    void mayormenor(){
        cout<<"\nEl menor de los costos es: "<<costo[0];
        cout<<"\nEl mayor de los costos es: "<<costo[10];
    }
    
    
    //Main del Programa
    int main(){
        
        
        for(mes=1;mes<13;mes++){
        matriz();
        }
        system("cls");
        cout<<"El Array resultante es el siguiente: "<<endl;
        imprimir();
        cout<<"\n";
    
        orden();
        
        cout<<"\n";
        
        mayormenor();
        
        
        
    return 0;
        }
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
  • Que tal si el numero del mes es su posicion en el array. Y luego lo que guardas es la posicion del mayor y del menor. – Pablochaches Apr 28 '21 at 01:27
  • Entiendo... la verdad es que si simplifica bastante lo que tenia pensado, sin embargo, no sabría como hacerlo. Supongo que se podría hacer con un puntero...? muchas gracias por tu respuesta y perdón es que no llevo mucho tiempo programando. – Carlos Daniel Apr 28 '21 at 01:34
  • 1
    No entiendo. ¿Que se supone que hace el metodo Matriz de donde sale "i"? Si entiendo te tienen que ingresar 12 montos. Basta con el arreglo de costo[12] y un indice. No trates que tu mes coincida con tu indice porque te complicas la vida. Con tu arreglo de costo[12] haces todo. Ahora el indice para este arreglo empieza en 0 y va hasta el 11. El 0 es enero y el 11 es diciembre. Calcula como tal y cuando obtengas los resultados le sumas 1 al indice y tienes el mes. Si quieres mostrar el numero de mes haces cout << (i+1). – Juan Carlos Guibovich Apr 28 '21 at 02:32
  • @JuanCarlosGuibovich bien entiendo, y como podría hacer para encontra el mayor costo y el menor en el arreglo? en el código que presente ordené el arreglo para asi encontrarlo, pero en el caso que tu me propones no me serviria ya que desordenaria los indices por decirlo asi (ya el 0 o enero podria no tener el verdadero valor que se ingresó en dicho "mes"). – Carlos Daniel Apr 28 '21 at 05:47

1 Answers1

0

Necesitas un completo cambio de paradigma en tu código, debes pensar cómo organizar tus datos. Parece que la clave de clasificación de tus datos es el mes y año:

  • ¿En qué mes (número) se registró el mayor costo de producción?
  • ¿Cuál es el Promedio Anual de los costos de producción?
  • ¿En qué mes se registró el menor costo de producción?

Así que valdría la pena guardar los datos por mes o por mes y año. Tú pierdes esa información al guardar (presuntamente) los datos ordenados por mes pero después reordenas los datos; te lo explico con un ejemplo... supón este escenario:

costo[0] = 1;
costo[1] = 2;
costo[2] = 3;
costo[3] = 4;
costo[4] = 5;
costo[5] = 6;
costo[6] = 6;
costo[7] = 5;
costo[8] = 4;
costo[9] = 3;
costo[10] = 2;
costo[11] = 1;

Los meses con mayor "costo de producción" son el 5 (junio) y 6 (julio), pero después de ordenar:

costo[0] = 6;
costo[1] = 6;
costo[2] = 5;
costo[3] = 5;
costo[4] = 4;
costo[5] = 4;
costo[6] = 3;
costo[7] = 3;
costo[8] = 2;
costo[9] = 2;
costo[10] = 1;
costo[11] = 1;

Los meses con mayor "costo" son 0 (enero) y 1 (febrero). Conclusión: No ordenes los datos. De hecho, ni siquiera debes reinventar la rueda: puedes buscar el mayor y menor valor con funciones ya existentes en la cabecera <algorithm> en concreto, la función std::minmax_element:

void mayormenor(){
    auto [min, max] = minmax_element(begin(costo), end(costo));
    cout<<"\nEl menor de los costos es: "<<*min;
    cout<<"\nEl mayor de los costos es: "<<*max;
}

Si además seguimos buenas prácticas de programación y no programamos como si fuera 1995, tu código podría parecerse a:

#include <iostream>
#include <algorithm>
#include <iterator>
// La cabecera "stdio.h" pertenece a C, no debe incluirse en un programa C++
// La cabecera "cstring" no es usada en este programa
// La cabecera "cstdlib" no es usada en este programa
    
using namespace std;
    
/* Las variables globales son mala práctica, consulta https://es.stackoverflow.com/a/183489/2742
int mes,i,j;
float costo[11],temp;
*/

// Alias de doce numeros para representar un anyo
using anyo = float[12];

const char *nombre_mes[]{"enero", "febrero", "marzo", "abril", "mayo", "junio",
        "julio", "agosto", "septiembre", "octubre", "noviembre", "diciembre" };

// Introduccion de los costos: pasamos el anyo por referencia
void matriz(anyo &costos) {
    for (int mes = 0; mes != 12; ++mes) {
        cout<<"Ingrese los costos de produccion de "<<nombre_mes[mes]<<endl;
        cin>>costos[mes];
    }
}
    
// Impresion de la matriz: pasamos el anyo por referencia constante porque no lo cambiamos
void imprimir(const anyo &costos) {
    for(const auto &mes : costos) {
            cout<<" "<<mes;
    }
}

// Menor y Mayor de los costos: pasamos el anyo por referencia constante porque no lo cambiamos
void mayormenor(const anyo &costos) {
    auto [min, max] = minmax_element(begin(costos), end(costos));
    cout    << "\nEl menor de los costos es: " << *min
        << " en " << nombre_mes[distance(begin(costos), min)]
        << "\nEl mayor de los costos es: " << *max
        << " en " << nombre_mes[distance(begin(costos), max)];
}

// Los comentarios con obviedades son molestos, escribir "Main del Programa"
// no aporta ninguna informacion util
int main() {
    anyo costos;
    matriz(costos);

    cout<<"El Array resultante es el siguiente: "<<endl;
    imprimir(costos);

    cout<<"\n";
    mayormenor(costos);

    return 0;
}

Puedes ver el código funcionando en Try it online!.

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82