Stroustrup 第 4 章练习 6:提高效率

Posted

技术标签:

【中文标题】Stroustrup 第 4 章练习 6:提高效率【英文标题】:Stroustrup chapter 4 exercise 6: Improve efficiency 【发布时间】:2012-10-07 10:35:16 【问题描述】:

该练习要求提供一个代码,该代码可以将用户输入的数字 0-9 作为整数或字符串分别转换为字符串或整数,即如果输入0 "zero" 将被输出,反之亦然。

string number;

cout << "Let's convert strings to numbers."
     << "Enter value/string of 0-9";

while (number!= "exit")

    cin >> number;

    for (int i=0; i < digits.size(); i++) 
    
        if (number == digits[i]) cout << i << endl;
       


    if (number == "0")      cout << digits[0] << endl;
    else if (number == "1") cout << digits[1] << endl;
    else if (number == "2") cout << digits[2] << endl;
    else if (number == "3") cout << digits[3] << endl;
    else if (number == "4") cout << digits[4] << endl;  
    else if (number == "5") cout << digits[5] << endl;  
    else if (number == "6") cout << digits[6] << endl;  
    else if (number == "7") cout << digits[7] << endl;
    else if (number == "8") cout << digits[8] << endl;  
    else if (number == "9") cout << digits[9] << endl;  

digits 是一个向量类,用于存储字符串"zero""one" 等。

这段代码运行良好,但我不喜欢if/else if 语句的长链,但我无法找到将整数转换为字符串的方法。有人可以帮我提高效率吗?谢谢!

【问题讨论】:

“看起来不太好”可以是一个论据,但运行时效率不是。与 I/O 所花费的时间相比,您所做的任何事情都会很快。 【参考方案1】:

您可以使用 if number == "0" 然后使用 number[0] == '0'char

e.i 代替 if/else 语句:

if (number[0] >= '0' && number[0] <= '9' )
  std::cout << digits[number[0] - '0'] << std::endl;
else
  std::cout << "wrong input - needs to be digit" << std::endl;

string 基本上是一个字符数组,std::string 是一个char 类型的字符数组。 例如,这是在 c 或 c++ 中声明和初始化字符串的两种合法方式

char s[3] =  '0', '1', '\0' ; 
char s[3] = "01";

Char 值在技术上是整数(或者更确切地说是字节),它以某种编码(通常是 ASCII)存储字符代码。 比如'0'的字符码是48'1'的字符码是49'2'50。我们使用它,因为我们知道

'3' - '0' = 51 - 48 = 3

【讨论】:

感谢您的回复。我不太明白number-'0' 背后的想法,你能解释一下吗?程序在做什么? 我在上面的帖子中添加了解释 哦,好吧,这是有道理的,我从来没有看过这样的字符串。感谢您的解释,我将尝试实现这一点。 我设法实现了上述内容以及我已经拥有的用于将字符串输出为整数的 for 循环。我现在唯一的问题是当我输入大于 9 的数字时,例如10, 11 它的输出 "one", "one" 根据字符串的第一个字符 :S 我该如何解决这个问题? 那是一个不同的问题。 number[0] - 只获取字符串中的第一个字符(就像数组中的第一个元素一样)"12" - 是一个由两个元素组成的数组(两个字符的字符串),如果你输入了 21 你会有结果得到了两个,因为 number[0] 是“2”。你需要这样的东西:`int i;整数结果 = 0; while (number[i] != '\0') 结果 = 结果 * 10 + (number[i] - '0'); ++i; 【参考方案2】:

您可以使用digits[number[0] - 48] 来摆脱 if/else if。

【讨论】:

请...number[0] - '0'. @paddy number[0] 到底是什么?我不熟悉这个概念。我们是在定义一个新的向量类 number 吗? 不,number 是一个字符串。您可以像数组一样索引字符串中的单个字符。所以number[0] 是第一个字符。当您从中减去 '0' 时,会将 ASCII 0 值转换为数字 0 值。您是说 ASCII 0 是您的基础。数字代码按顺序排列很方便,字母字符也是如此。这是一种经常被利用的便利(例如排序字符串)。 我应该补充一点,您要确保number[0] 在有效范围内:if (number[0] &gt;= '0' &amp;&amp; number[0] &lt;= '9') ...【参考方案3】:

只需使用 isdigit 来检查它是否是 0-9 http://www.cplusplus.com/reference/clibrary/cctype/isdigit/

如果是数字,您可以使用 aoti http://www.cplusplus.com/reference/clibrary/cstdlib/atoi/ 将其转换为 int

最后还是说

cout << digits[aoti(number)];

【讨论】:

以上是关于Stroustrup 第 4 章练习 6:提高效率的主要内容,如果未能解决你的问题,请参考以下文章

《构建之法》阅读笔记6

全国计算机等级考试三级Linux应用与开发技术考试-习题汇总

《刻意练习》目录

Python核心编程第二版 第六章课后练习

无法编译应该从 Bjarne stroustrup 的编程原理和实践的第 12 章工作的图形代码

Stroustrup 天鹅书矢量问题