Vectores

Iniciado por ashtag, 16 Enero 2019, 01:23 AM

0 Miembros y 1 Visitante están viendo este tema.

ashtag

Hola, necesito ayuda en la parte de incremento hasta un 50% no se como usar otros vectores y ademas consejos con mi codigo si hay como mejorarlo. Gracias
Este es el ejercicio
En una hacienda hay un hato que se compone de N vacas. Diseñe un programa que guarde en un vector la producción de leche diaria (en litros) de cada una de las vacas, además que calcule la producción total del hato diario y cual es la ubicación de la vaca que dio más leche en el día.

Si consideramos como producción normal 25 litros diarios y ninguna vaca puede producir más de 40 litros por día, cree un nuevo vector en el que se clasifique la producción según el siguiente criterio, si la producción está entre 20 y 25 litros etiqueta "PRODUCCION MEDIA", si supera los 25 litros visualizar "ALTA PRODUCCION", contabilice cuantas vacas tienen producción media y cuantas altas. Calcule también el promedio de la producción de las vacas.

Para incrementar la producción hasta un 50% de leche nos aconsejan implementar 2 medidas:

Realizar 3 ordeños al día, cuyo incremento hasta del 30%, con posibles valores (1,2,3) que equivalen 1=0%; 2=15% y 3=30% de incremento
Tener una dieta balanceada, hasta 20% de incremento (1,2,3) que equivalen 1=0%; 2=10% y 3=20% de incremento
Cargue los vectores de ordeños y dieta, calcule los incrementos, sume los dos incrementos y calcule el incremento proyectado de producción de leche para cada vaca y el incremento total de la hacienda ganadera.
Este es mi codigo hasta el momento
#include <iostream>

using namespace std;
int cargarvector (int N, int vector[]);
int ubicacion (int N,int vector[],int *casilla);
void produccionvector(int N,int vector[],float prom);


int main()
{
 int vacas,v[20],posicion,ubica,sum;
 float ord[100];

 cout<<"Ingrese el numero de vacas: "<<endl;
 cin>>vacas;
 while (vacas<=0)
 {
     cout<<"Error ingrese otro numero: "<<endl;
     cin>>vacas;
 }
 sum=cargarvector(vacas,v);
 cout<<"La produccion total de leche es: "<<sum<<endl;
 ubica=ubicacion (vacas,v,&posicion);
 cout<<"La mayor produccion dada por una vaca es: "<<ubica<<endl;
 cout<<"ubicada en la posicion: "<<posicion<<endl;
 produccionvector(vacas,v,sum);


}
int cargarvector(int N,int vector [])
{
   int i,suma=0;
   for (i=1;i<=N;i++)
   {
    cout<<"Ingrese la produccion de la vaca: "<<i<<endl;
    cin>>vector;
    while (vector<=0 || vector>40)
    {
        cout<<"Error en la preoduccion, ingrese otro valor: "<<endl;
        cin>>vector;
    }
    suma=suma+vector;
   }
   return suma;
}
int ubicacion (int N,int vector[],int *casilla)
{
   int i,ma=vector[1];
   *casilla=1;
   for(i=1;i<=N;i++)
   {
     if (vector>ma)
     {
     ma=vector;
     *casilla=i;
     }
   }
   return ma;
}
void produccionvector(int N,int vector[],float prom )
{
   int i,media=0,alta=0;
   float prome=0;
    for(i=1;i<=N;i++)
    {
      if (vector >20 && vector<25)
      {
          media=media+1;
      }
      if (vector >=25)
      {
          alta=alta+1;
      }
    }
    cout<<"Total de vacas con produccion media: "<<media<<endl;
    cout<<"Total de vacas con produccion alta: "<<alta<<endl;
    prome=(prom/N);
    cout<<"el promedio de produccion es: "<<prome<<endl;
}

K-YreX

Te comento algunos errores que tienes en ese código y después te doy mi punto de vista con los incrementos en la producción. Bueno lo primero, el código ponlo entre etiquetas GeSHi (se seleccionan encima del cuadro de texto) porque sino el código se hace ilegible, puedes comprobarlo tú mismo, que la letra i entre corchetes desaparece.


Te recomiendo que pongas mejores nombres ya que luego para hacer cálculos y para revisar el programa te será más sencillo. Yo usaría algo así:
Código (cpp) [Seleccionar]

const int MAX_VACAS = 20; // cantidad maxima de vacas (variable global)
const int NUM_VECES = 3; // numero de veces que se toma leche de cada vaca (variable global)
const int NUM_DIETAS = 3; // numero de dietas que se puede aplicar a cada vaca (variable global)
int numero_vacas; // cantidad de vacas que vas a contabilizar
int max_posicion; // posicion de la vaca que mas produce
double max_produccion; // cantidad producida por la vaca que mas produce
double suma_leche, promedio_leche; // total producido y promedio por vaca
int produccion_media, produccion_alta; // contador de producciones altas y medias
double leche_vacas[MAX_VACAS] = {0}; // array para guardar la produccion de cada vaca
double veces[NUM_VECES] = {0, 0.15, 0.3}; // array con los incrementos de cada vez que tomamos leche
double dieta[NUM_DIETAS] = {0, 0.1, 0.2}; // array con los incrementos segun la dieta de cada vaca

Con estas variables puedes hacer todo el programa, pero algunas de estas tienes que declararlas globales (antes del <main>); otras, en el <main> y otras es mejor que las declares dentro de una función especifica (en el último punto especifico esto).


Código (cpp) [Seleccionar]

cout<<"Ingrese el numero de vacas: "<<endl;
cin>>vacas;
while (vacas<=0){
    cout<<"Error ingrese otro numero: "<<endl;
    cin>>vacas;
}

Primero tienes este trozo de código. Ese <while> es un filtro de toda la vida. Los filtros se suelen hacer con <do while>:
Código (cpp) [Seleccionar]

const int MAX_VACAS = 20;
double leche_vaca[MAX_VACAS] = {0};
do{
    cout << "Ingrese el numero de vacas (1," << MAX_VACAS << "): "<<endl;
    cin >> numero_vacas;
}  while(numero_vacas <= 0 || numero_vacas > MAX_VACAS);

Ahí tienes lo mismo, pero creo que se ve mejor. Además si tienes un vector estático, controla que no se introducen más vacas que el máximo (que lo puedes controlar con esa constante MAX_VACAS). A partir de aquí usas la variable <numero_vacas> para recorrer el array, ya que si vas a introducir 5 vacas, no tiene sentido recorrer el array entero que son 20 (eso ya lo haces con la variable <vacas>).


En C/C++ los arrays empiezan en el elemento 0. Por lo que los <for> que estás usando en las funciones que inicializas la i siempre a 1, es más correcto hacerlo a 0 (y si quieres que salga un 1 por pantalla pues muestras (i+1) en vez de i). Además en la función <ubicacion()> tienes que empezar a contar en el elemento 0. Tal y como lo estás haciendo te estás saliendo siempre del array y estás accediendo a memoria que puede estar reservada para otra cosa. Eso tienes que corregirlo (no es opcional).


La función <ubicacion()> es más correcto que devuelva la posición del máximo (que para algo se llama <ubicacion()>) y si quieres por referencia puedes guardar el valor de ese máximo. Sino pues haces que se llame <produccionMaxima()> y haces que devuelva la producción máxima y por referencia guardas la posición si quieres. Es más fácil de ver para el resto de personas.


Los valores que calculas en la última función es mejor guardarlos en variables sin mostrar nada y mostrarlo en el programa principal (imagina que en un punto del programa quieres calcular el promedio porque lo necesitas pero no quieres mostrarlo); pues lo calculas con la función y luego ya lo usas como tú quieras o lo muestras o lo usas para hacer más cálculos sin mostrarlo.


El tema de los porcentajes, no sé si tienes que hacerlo aleatoriamente o no. Lo que yo entiendo es que por cada vaca tienes que pedir <NUM_VECES> valores de leche tomada y cada valor se multiplica por (1+veces[m]+dieta[n]). Yo entiendo algo así:
Código (cpp) [Seleccionar]

double calcularSuma(double leche_vacas, int numero_vacas){
    // aqui creamos los arrays veces y dietas ya que no se usan mas veces en el main
    double toma_actual, suma = 0;
    for(int i = 0; i < numero_vacas; i++){
        for(int j = 0; j < NUM_VECES; j++){
            // puedes hacer el filtro para asegurar cantidades de leche validas
            cout << "Leche tomada de la vaca " << i+1 << "(" << j+1 << "/" << NUM_VECES << "): ";
            cin >> toma_actual;
            leche_vacas[i] += toma_actual * (1+veces[j]+dieta[j]); // dieta[j] u otro valor aleatorio o no
        }
        // haces la suma de cada vaca
    }
    return suma;
}

Algo así entiendo yo. Faltaría terminar esa función (aunque te la he dejado mascada ya...) y adaptarla al resto del programa ya que habría que cambiar más cosas para que quede bien adaptado. Suerte :-X
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;