首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有人能简化这个计算车费的程序吗?

有人能简化这个计算车费的程序吗?
EN

Stack Overflow用户
提问于 2016-08-14 09:47:48
回答 2查看 1.3K关注 0票数 1

取公里的输入,以及一、二、三等列车的行程等级(一、二、三等)。然后,该方案应根据下列标准计算旅行费用:

我不能在一个等式中完成这个程序,所以我使用if one语句完成了它。这个程序可以缩短,逻辑可以不需要if of语句来设计吗?程序的逻辑可以表示为一个单一的数学方程(仅使用算术运算符)吗?

我的守则:

代码语言:javascript
复制
//
//  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;



}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-15 21:12:15

您可以通过多种方式重新组织代码,但我不认为您能够得到您想要的东西。

例如,可以将价格存储在数组中:

代码语言:javascript
复制
unsigned int price[3][3] = {
    {300, 250, 200},        // first class, Rupee cents per km
    {200, 150, 100},        // second class
    {150, 100,  50},        // third class
};

询问距离和类别,然后计算并打印如下所示的内容:

代码语言:javascript
复制
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';

现在,我们可以简化那些(线性)方程,注意到它们的形式:

代码语言:javascript
复制
amount = constant + d * price

并预先计算第一部分,这恰好与所有类相同,并且仅取决于范围。因此,给定这个数组:

代码语言:javascript
复制
unsigned int p0[] = {0, 5000, 17500};

可以像下面这样重写(和“简化”)前面的片段:

代码语言:javascript
复制
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';

另一个只隐藏库函数中的条件部分的选项可以是:

代码语言:javascript
复制
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';
票数 1
EN

Stack Overflow用户

发布于 2016-08-14 10:20:48

严格地说,有一个等价的三元语句

代码语言:javascript
复制
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;

以…的形式

代码语言:javascript
复制
amt = (km>=100&&km<=250) ? (100*r1)+(km-100)*r2 : (km>250) ? (100*r1)+(150*r2)+(amt-250)*r3 : km*r1;

它并不像前面的块那样可读性强。如果您要寻找的是将其包含在一个公式中,那么这个应该比上面的要干净一些:

代码语言:javascript
复制
amt = km * r1 + 
          ( km > 100 ? 
              km > 250 ?
                  150 * r2 + (km - 250) * r3 - (km - 100) * r1 : 
              (km - 100) * (r2 - r1) :
          0 ); /* readblity */

虽然我不明白为什么如果陈述是错误的。它的可读性更强,性能也是一样的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38941016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档