0

Tengo que crear un programa en c++ que me permita calcular los gastos diarios y semanales y usar una estructura para manejar los datos pero no se como sumar los datos de una estructura ya que me sale error. Los gastos diarios deberian ser calculados y mostrados accediendo a un menu llamado "ver gastos diarios" ademas generar reportes diarios y semanales.

#include<iostream>
#include<conio.h>
using namespace std;
//Aca la estructura
struct expenses{
    char expensesName[20];
    float expensesPrice;
    float food;
    float entertainment;
    float clothes;
    float transportation;
    float utilities;
    float housing;

}e[100];

int main(){
    //Contador para mostrar dia que se gasta mas y menos
    int n_days,mayor=0,menor=999999,posM,posm;
    
    cout<<"For how many days would you like to calculate expenses: "; cin>>n_days;

    for(int i=0;i<n_days;i++){
        fflush(stdin); //Emptying buffer to allow us to enter more values.
        cout<<"Please enter the day of the week : "; cin.getline(e[i].expensesName,20,'\n');
        cout<<"How much did you spend in food: "; cin>>e[i].food;
        cout<<"How much did you spend in entertainment: "; cin>>e[i].entertainment;
        cout<<"How much did you spend in clothes: "; cin>>e[i].clothes;
        cout<<"How much did you spend in transportation: "; cin>>e[i].transportation;
        cout<<"How much did you spend in utilities: "; cin>>e[i].utilities;
        cout<<"How much did you spend in housing: "; cin>>e[i].housing;
        cout<<"Cost of expense: "; cin>>e[i].expensesPrice;

        //MOST EXPENSIVE DAY
        if(e[i].expensesPrice > mayor){
            mayor = e[i].expensesPrice;
            posM = i;
        }
        //CHEAPER DAY
        if(e[i].expensesPrice < menor){
            menor  = e[i].expensesPrice;
            posm = i;
        }

        cout<<"\n";
    }

    cout<<"\nYou spend mostly on: "<<endl;
    cout<<"Day: "<<e[posM].expensesName<<endl;
    cout<<"Amount: "<<e[posM].expensesPrice<<endl;

    cout<<"\nYou spend less on: "<<endl;
    cout<<"Day: "<<e[posm].expensesName<<endl;
    cout<<"Amount: "<<e[posm].expensesPrice<<endl;

    cout<<"\nYour spend on food: "<<endl;
    cout<<"Day: "<<e[posM].food<<+<<utilities<<endl;
    cout<<"Amount: "<<e[posM].food<<endl;
PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82
  • No uses etiquetas no relacionadas. Aquí C# no pinta nada y C no es lo mismo que C++, aunque su sintaxis es muy parecida, estás programando en C++ y no en C. Saludos – Mauricio Contreras May 28 '22 at 17:15
  • gracias por tu super colaboracion – user287954 May 28 '22 at 17:23
  • Las etiquetas sirven para dar una idea del contenido de tu pregunta. Muchos usuarios siguen etiquetas específicas, ya que se han especializado en ellas. El poner las etiquetas correctas hace tu publicación mucho más precisa, atraerás la vista de los usuarios que dominan realmente el lenguaje o la herramienta que indica la etiqueta. Mi colaboración apunta en ese sentido, ayudar a que tu pregunta esté formulada de la mejor forma, eso incluye no sólo un buen contenido y título, también las etiquetas correctas. Saludos – Mauricio Contreras May 28 '22 at 17:27
  • @user287954 por favor, pásate por [ask] y por el [tour] para entender cómo funciona este sitio. Esto no es un foro de programación al uso. Si tu pregunta está mal etiquetada perderá atención. Por un lado recibirás visitas de gente que no sabrá responder a tu pregunta y perderás visitas de gente que sí sabría responderte. Un pelín más de humildad nunca viene mal – eferion May 30 '22 at 14:28
  • Hay un problema que no tratas y parece que nadie lo ha mencionado: ¿Qué crees que pasará si el mayor `expensesPrice` es menor a 0 y el menor `expensesPrice` es mayor a 999999? Obtendrás valores que no forman parte de tus datos. Considera inicializar las variables `mayor` y `menor` con el menor y mayor valor respectivamente, que puede representar el tipo de tu variable. O también puedes usar [`max`](https://en.cppreference.com/w/cpp/algorithm/max) y [`min`](https://en.cppreference.com/w/cpp/algorithm/min). – Mateo May 30 '22 at 17:55

1 Answers1

0

Para poder responder a tu duda, primero debemos sentar unas bases:

  1. , y son lenguajes de programación MUY DIFERENTES y cada uno de ellos tendrá una respuesta MUY DIFERENTE a la pregunta que planteas, por lo tanto es ABSURDO marcar los tres lenguajes cuando claramente se ve en tu código que estás usando sólo uno de ellos: C++. Responder de manera condescendiente a quienes te señalan este hecho no te ganará simpatías ni respuestas.
  2. Dado que estás programando en C++, deberías limitar tu código al uso de cabeceras de dicho lenguaje, la cabecera <conio.h> es de C y no debe ser usada en C++. Lee este hilo para saber más del tema.
  3. Escribir en tu pregunta "me sale error" no aporta NINGUNA información, debes describir el error que encuentras ya sea indicando los datos que provees al programa y los datos que esperabas recibir; o si es un error de compilación copia-pegando dicho error.
  4. En C++ las cadenas de caracteres se manejan usando el objeto std::string, que es más seguro y flexible que usar una formación de caracteres de tamaño prefijado.
  5. De la misma manera, si tienes colecciones de datos en C++ se usan contenedores para almacenarlos, ya que son más flexibles y seguros que las formaciones.

Una vez aclarados los puntos anteriores, puedes sumar un campo cualquiera de la estructura expenses con el siguiente código:

struct expenses
{
    std::string expensesName; // Un 'std::string' es mejor que una formación 'char[]'.
    float expensesPrice = .0f;
    float food = .0f;
    float entertainment = .0f;
    float clothes = .0f;
    float transportation = .0f;
    float utilities = .0f;
    float housing = .0f;
};

template <float expenses::*campo>
auto suma(const std::vector<expenses> &valores) // Un 'std::vector<expenses>' es mejor que una formación 'expenses[]'.
{
    float result = .0f;

    for (const auto e : valores)
        result += (e.*campo);

    return result;
}

Esa función suma puede ser usada así:

std::vector<expenses> e
{
    {"A", 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f},
    {"B", 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f},
    {"C", 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f},
    {"D", 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f},
    {"E", 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f},
    {"F", 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f},
    {"G", 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f},
    {"H", 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f},
    {"I", 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f},
    {"J", 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f},
};

std::cout
    << "Total food: " << suma<&expenses::food>(e) << '\n'
    << "Total housing: " << suma<&expenses::housing>(e);

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

PaperBirdMaster
  • 44,474
  • 6
  • 44
  • 82