我正在尝试将开发者模式融入到我的程序中。考虑到汽车的责任每个月都在变化,我的目标是让用户能够修改程序中的各个变量,如关税,lccost,yen2taka和运费。
#include <iostream>
using namespace std;
class A
{
public:
int carbid,duty;
void Input()
{
cout<<"please insert the car price you want to bid for(in yen): ";
cin>>carbid;
cout<<"duty of the car: ";
cin>>duty;
}
int Exportcost()
{
int exportcost;
int servicechrg=10;
int freight=20;
exportcost=servicechrg+freight+carbid;
return exportcost;
}
int Yen2taka()
{
int yen2taka;
int taka2dollarrate=10;
int dollar2yen=1;
yen2taka=((Exportcost())/dollar2yen)*taka2dollarrate;
return yen2taka;
}
int Importcost()
{
int importcost;
int lccost=10;
int cnfcost=20;
importcost=lccost+cnfcost;
return importcost;
}
int Totalcosting()
{
int total;
int myprofit=10; //80000
total=myprofit+Importcost()+Yen2taka();
cout<<total;
return total;
}
void summary()
{
cout<<
}
};
字符串
下面的主要功能创建了一个交互式循环,用户可以在其中重复输入汽车详细信息,计算成本,并选择查看摘要或重新启动成本计算过程。
int main()
{
x:
A ob;
ob.Input();
ob.Exportcost();
ob.Yen2taka();
ob.Importcost();
ob.Totalcosting();
int ch;
cout<<"press 1 to see the summery of the costing or 2 to restart costing again"<<endl;
cin>>ch;
switch(ch)
{
case 1:
ob.summary();
break;
case 2:
goto x;
}
}
型
1条答案
按热度按时间bpsygsoo1#
首先,你应该在一个单独的类中收集这些参数:
字符串
setter也可以返回bool来指示无效值。
现在你可以在main中使用这个类:
型
请参阅this answer了解如何正确处理流错误。
如果你想知道错误处理的差异:第一种情况是,如果用户输入非数字输入,如
ss
,第二种情况是,如果输入 * 是 * 数字,但超出有效范围(77
)。现在,如果你不想一直将配置作为参数传递,你可以从(但要小心,全局变量有一些危险,尽可能少地使用它们)或实现singleton pattern。
旁注:
goto
* 有时候是一个很好的工具,但它是一个危险的工具(标签的名字x
不是一个好的,更喜欢一个明确表明意图的名字,如REENTRY_POINT
,LOOP_START
,.)。如果你可以沿着而不需要不合理的努力,更喜欢这样的变体:型
当然,一个额外的变量,一个额外的检查;不幸的是,你不能使用
break
退出(伪)无限循环(for(;;)
)(但不要将这种模式应用于嵌套循环,那么它会变得越来越不可读和低效:bool isExit = false; for(int i = 0; !isExit && i < n; ++i) { for(j = 0; j < n; ++j) { isExit = true; break; } }
-明白我的意思吗?)。一个变体可能是:型
但这也不太好。
一个非常好的变体,允许在给定的情况下退出循环,因为之后没有任何事情要做:
型
缺点:函数的退出点可能深深地嵌套在代码中。
还有其他的技巧来允许这种模式,比如将代码的子部分打包在一个lambda中,并在其中返回,然后直接调用它。
最后,如果你坚持
goto
,我的变体更倾向于:型
现在不会有隐藏循环了,你实际上在做什么变得更加明显。目前,这不是一个真正的问题,但如果你的代码增长,隐藏循环会变得越来越难以发现。
在这种情况下,我清楚地标记
goto
s,以便另一个编码器可以立即发现关键代码点:型
可以对深度嵌套的函数出口点(
return
)做同样的事情。