乘坐公里的输入和旅程(分别为第一,第二和第三类的1,2或3)进行火车旅行。然后,该计划应根据以下标准计算旅程票价:
我无法在一个单独的等式中执行该程序,所以我使用if else语句来完成它。这个程序可以缩短,并且可以在不需要if else语句的情况下设计逻辑吗?程序的逻辑可以表示为单个数学方程(仅使用算术运算符)吗?
我的代码:
//
// main.cpp
// c++
//
// Created by Aniansh Raj on 14/08/16.
// Copyright © 2016 Aniansh Raj. All rights reserved.
//
#include <iostream>
using namespace std;
int main()
{
unsigned int km, cl, amt;float r1, r2, r3;
cout<<"Enter distance in kilometer\n";
cin>>km;
cout<<"Enter Class(1, 2 or 3)\n";
cin>>cl;
switch(cl)
{
case 1:
r1=3;r2=2.5;r3=2;break;
case 2:
r1=2;r2=1.5;r3=1;break;
case 3:
r1=1.5;r2=1;r3=0.5;break;
default:
cout<<"Error!\n";
return 0;
}
if(km>=100&&km<=250)
amt=(100*r1)+(km-100)*r2;
else if(km>250)
amt=(100*r1)+(150*r2)+(amt-250)*r3;
else
amt=km*r1;
cout<<endl<<amt;
}
答案 0 :(得分:1)
严格来说,这是
的等效三元陈述if(km>=100&&km<=250)
amt=(100*r1)+(km-100)*r2;
else if(km>250)
amt=(100*r1)+(150*r2)+(amt-250)*r3;
else
amt=km*r1;
以
的形式amt = (km>=100&&km<=250) ? (100*r1)+(km-100)*r2 : (km>250) ? (100*r1)+(150*r2)+(amt-250)*r3 : km*r1;
与前一个块一样,它的可读性并不高。如果您正在寻找的是将它放在公式中,那么这应该比上面的更清洁:
amt = km * r1 +
( km > 100 ?
km > 250 ?
150 * r2 + (km - 250) * r3 - (km - 100) * r1 :
(km - 100) * (r2 - r1) :
0 ); /* readblity */
虽然我不明白为什么声明不好。它具有更高的可读性和相同的性能。
答案 1 :(得分:1)
您可以通过多种方式重新组织代码,但我认为您无法获得您想要的内容。
例如,您可以将价格存储在数组中:
unsigned int price[3][3] = {
{300, 250, 200}, // first class, Rupee cents per km
{200, 150, 100}, // second class
{150, 100, 50}, // third class
};
询问距离和班级,然后像这样计算和打印amuont:
unsigned int amount;
if ( d <= 100 )
amount = d * price[c][0]; // c = cl - 1; considering your code
else if ( d <= 250 )
amount = 100 * price[c][0] + (d - 100) * price[c][1];
else
amount = 100 * price[c][0] + 150 * price[c][1] + (d - 250) * price[c][2];
std::cout << "distance: " << d << " price: " << amount / 100.0 << '\n';
现在,我们可以简化这些(线性)方程式,注意形式如下:
amount = constant + d * price
并预先计算第一部分,这对所有类来说都是相同的,并且仅取决于范围。所以,给定这个数组:
unsigned int p0[] = {0, 5000, 17500};
以前的代码段可以像这样重写(和#34;简化&#34;):
unsigned int index = d < 250 ? ( d < 100 ? 0 : 1 ) : 2;
unsigned int amount = p0[index] + d * price[cl - 1][index];
std::cout << "distance: " << d << " price: " << amount / 100.0 << '\n';
另一个选项,只隐藏库函数中的条件部分,可以是:
unsigned int amount = std::min({
p0[0] + d * price[cl - 1][0],
p0[1] + d * price[cl - 1][1],
p0[2] + d * price[cl - 1][2]
});
std::cout << "distance: " << d << " price: " << amount / 100.0 << '\n';