任何人都可以简化这个与计算火车票价相关的计划吗?

时间:2016-08-14 09:47:48

标签: c++ logic

乘坐公里的输入和旅程(分别为第一,第二和第三类的1,2或3)进行火车旅行。然后,该计划应根据以下标准计算旅程票价:

enter image description here

我无法在一个单独的等式中执行该程序,所以我使用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;



}

2 个答案:

答案 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';