常数在这里是否真的合适,还是有另一种方法? - C ++

时间:2010-01-19 01:08:12

标签: c++ constants magic-numbers

我是第二个OOP课程的编程学生,用C ++教授。我知道在代码中使用幻数通常是不好的做法,所以这是我的问题:

在下一个我必须为这个课程编写的程序中,税表中有超过120个数字给我们,我们需要使用它们来计算税收和其他相关信息。如此大量的数字,我为每个数字定义一个常量吗?或者我还能做些什么吗?

5 个答案:

答案 0 :(得分:8)

常数比魔术数字更合适 -

然而,由于许多“常量”,以及随时间变化的东西(税表),我个人会通过配置文件加载这些,并使用某种类型的字典查找单个值。这样可以更容易地调整到新的税表而无需重新编译。

答案 1 :(得分:3)

考虑一下你最终会看到的数据结构,然后决定你需要的常量或枚举。 (不是税务专家所以我会在这里猜一下)

各州的税率

 std::map<std::string, double> stateRates;
 stateRates["CA"] = 20.7;
 stateRates["MN"] = 1.2;
 ....

我不认为这里需要常量,尽管有些人会枚举州名

 enum States
 {
     CA, MN
 };
 std::map<States, double> stateRates;
 stateRates[CA] = 20.7;
 stateRates[MN] = 1.2;

但是你还需要从字符串CA转换为枚举CA

但对于非表格内容,那么你真的需要常量

 const int EXTRA_TAX_FOR_BIG_HOUSE = 2;
 const int BIG_HOUSE_LIMIT = 6000; // sqft

 if(houseSize > BIG_HOUSE_LIMIT)
    rate += EXTRA_TAX_FOR_BIG_HOUSE;

答案 2 :(得分:1)

问题是,您的代码将如何使用它们?如果你真的必须编写以特定和特殊的方式使用其中每一个的代码,那么你也可以将它们全部转换为常量。

另一方面,如果你遍历它们,某种关联数据结构(想想,'STL map')可能会更有帮助。

还有一个考虑因素:如果有人希望你的程序经常消化一个新的集合,那么你需要 names 的常量,以及你用值加载的数据结构

答案 3 :(得分:1)

通常使用此类作业,您将学习如何从文件中读取/写入。然后,您可以将这些数字加载到数组或向量或您可能需要的任何内容中。如果您没有从文件中学习过读写,那么选择起来相当简单。

这是一个你可以看到的教程,但还有更多的快速谷歌搜索 http://fredosaurus.com/notes-cpp/io/readtextfile.html

答案 4 :(得分:0)

Reed Copsey有正确的答案,但我不知道答案是否足够明确。

当你有这么多不同的“常量”时,最好把它们放在外部,比如文件或数据库。这些所谓的“常数”往往会改变:不同国家的税率会随着立法机构决定他们需要更多钱而改变。

如果将这些幻数存储在文件中,请使用ifstream来读取这些常量。如果您使用数据库来存储这些幻数,那么您需要阅读该数据库的文档。

您应该将数字存储在哪里取决于您使用它们的内容。例如,如果您只是州税,请使用map从州名(或缩写)到税率。

祝你好运!