这是我修改后的代码,我把文件读入并且它几乎正常工作。我现在遇到的问题是售价,它只是以我的最后售价而不是收取所有价格。我知道它必须是一个简单的解决方案,但由于某种原因,我无法弄清楚我需要做些什么来解决这个问题。
#include<string>
#include <iostream>
#include <iomanip>
#include <fstream>
using namespace std;
//all functions needed for this project
void readSellingFile(ifstream &fp,double &selling);
double grossprofit(double total, double cost);
double netprofit(double gross, double total);
double totalPrice(double &selling);
void getDataFile(ifstream &fp, string &item, double &cost, int &number);
void display(string item,double total, double cost,double gross,double net);
//main function starts here
int main()
{
int i;
double gross,net,selling,total;
ifstream fp;
string item;
int number;
double cost;
fp.open ("sales.dat");
if(!fp)
{
cout<<"Error Opening the file"<<endl;
}
while(!fp.eof())
{
getDataFile(fp,item,cost,number);
for(int i=0;i<number;i++)
{
readSellingFile(fp,selling);
total=totalPrice(selling);
gross=grossprofit(total,cost);
net=netprofit(gross,total);
}
display(item,total,cost,gross,net);
cout<<"Bye!"<<endl;
}
}
void getDataFile(ifstream &fp, string &item, double &cost, int &number)
{
cout<<"Reading from the file. "<<endl;
fp>>item;
fp>>cost;
fp>>number;
}
//the selling cost of the item
void readSellingFile(ifstream &fp,double &selling)
{
fp>>selling;
}
double totalPrice(double &selling)
{
double total=0;
total+=selling;
return total;
}
//calculates the gross profit
double grossprofit(double total,double cost)
{
double gross;
gross=total-cost;
return gross;
}
//calculates the net profit
double netprofit(double gross,double total)
{
double net;
net=gross-(.06*total)-(.10*total);
return net;
}
//prints out the results
void display(string item, double total, double cost ,double gross, double net)
{
cout<<"Item:\t\t"<<item<<endl;
cout<<"cost:\t\t$"<<fixed<<setprecision(2)<<cost<<endl;
cout<<"Selling price:\t$"<<setprecision(2)<<total<<endl;
cout<<"Gross Profit: \t$"<<setprecision(2)<<gross<<endl;
cout<<"Net Profit: \t$"<<setprecision(2)<<net<<endl;
}
答案 0 :(得分:0)
创建一个包含所有返回值的结构。含义:
struct Info
{
std::string name;
double cost;
double numberOfItems;
}
然后让你的函数返回对该结构的引用,它将如下所示:
Info& CombineAllFunctions()
{
}
答案 1 :(得分:0)
我不明白你的问题,但我将举例说明如何使用面向对象的设计来进行I / O.
从您发布的代码中,项目的成本和名称为:
struct Item
{
unsigned int cost;
std::string name;
};
您可以在结构中添加输入法,以便从用户那里获取对象的名称和成本:
struct Item
{
unsigned int cost;
std::string name;
void Input_From_User(std::istream& input, std::ostream& output)
{
output << "Enter the item name: ";
output.flush();
input >> name;
output << "\nEnter the cost of the item: ";
output.flush();
input >> cost;
}
};
你可以使用它:
Item new_item;
new_item.Input_From_User(std::cin, std::cout);
在此基础上,您可以添加一个方法将项目写入文件:
struct Item
{
unsigned int cost;
std::string name;
void Input_From_User(std::istream& input, std::ostream& output)
{
output << "Enter the item name: ";
output.flush();
input >> name;
output << "\nEnter the cost of the item: ";
output.flush();
input >> cost;
}
void Output_As_CSV(std::ostream& output)
{
output << cost;
output << ", ";
output << name;
output << "\n";
}
};
用法是:
Item new_item;
new_item.Output_As_CSV(my_file);
编辑1:功能指针的结构
可以使用函数指针的结构对独立函数进行分组。
typedef std::string (*P_Get_Name_Function)(void);
typedef double (*P_Get_Cost_Function)(void);
typedef unsigned int (*P_Get_Quantity_Function)(void);
struct Item_Functions
{
P_Get_Name_Function name_function;
P_Get_Cost_Function cost_function;
P_Get_Quantity_Function qty_function;
};
您可以像以下一样使用它:
void Input_Items(const Item_Functions& inp_funcs)
{
std::string item_name = (inp_funcs.name_function)();
double item_cost = (inp_funcs.cost_function)();
unsigned int item_quantity = (inp_funcs.qty_function)();
};
Item_Functions User_Item_Funcs =
{ getItemName, getItemCost, getItemQuantity};
// ...
Input_Items(User_Item_Funcs);
上述代码满足对函数进行分组并通过引用传递它们的要求。
答案 2 :(得分:0)
你需要创建一个fstream对象
像这样 fstream file;
file.open ( " name of the file ) ;
string name[SIZE]; //array that will hold the name of each item
int quantity[SIZE];// array that will hold the quantity of each item
double cost[SIZE];// array that will hold the cost of each item
int counter = 0;
while ( !file.eof())
{
file>>name[counter]>>cost[counter]>>quantity[counter];
counter++;
}
然后你可以创建一个for循环来显示
for ( int i = 0 ; i < SIZE; i ++ )
{
cout<<"Name: " <<name[i]<<endl;
cout<<"Cost: "<<cost[i]<<endl;
cout<<"Quantity: "<<quantity[i]<<endl;
}
这是一种非常丑陋的方式来做你想做的事情..但是因为你说你是在计算机科学1,我不确定你是否知道对象.....所以如果你没有&#39;要了解它们,您可能希望为文件中的每个项目创建一个数组。并使用索引作为访问&#34;每个项目的方式&#34; 。希望它有所帮助。