【问题标题】:c++ program to convert number into words not workingc ++程序将数字转换为单词不起作用
【发布时间】:2013-04-03 09:19:41
【问题描述】:

这是一个用 c++ 编写的程序,来自这个 Write code to convert given number into words (eg 1234 as input should output one thousand two hundred and thirty four) 问题,我修改为将数字转换为单词。

在我的程序中,我没有重复使用 cout,而是创建了一个 ostream 对象 out 并将返回值放入 out。

这是程序

#include<iostream>
using namespace std;
ostream & expand(int);
int main()
{
    int num;
    cin>>num;

   cout<<expand(num);
}
ostream & expand(int value)
{
ostream   &out;
out<<"";
    const char * const ones[21] = {"zero", "one", "two", "three","four","five","six","seven",
    "eight","nine","ten", "eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen",
    "eighteen","nineteen"};
    const char * const tens[10] = {"", "ten", "twenty", "thirty","forty","fifty","sixty","seventy",
    "eighty","ninety"};

    if(value<0)
    {
        out<<"minus "<<expand(-value);

    }
else if(value>=1000000){
out<<expand(value/1000000)<<" million";
if(value % 1000000)
{
out<<" "<<expand(value % 1000000);
}

}
    else if(value>=1000)
    {
        out<<expand(value/1000)<<" thousand";

        if(value % 1000)
        {
            if(value % 1000 < 100)
            {
                out << " and";
            }
            out << "  " <<expand(value % 1000);
        }
    }
    else if(value >= 100)
    {
        out<<expand(value / 100)<<" hundred";

        if(value % 100)
        {
            out << " and "<<expand (value % 100);
        }
    }
    else if(value >= 20)
    {
        out << tens[value / 10];
        if(value % 10)
        {
            out << " " << expand(value % 10);
        }
    }
    else
    {
        out << ones[value];
    }
    return &out;
}

但是,编译时出现以下错误。

In function 'std::ostream& expand(int)':
Line 13: error: 'out' declared as reference but not initialized
compilation terminated due to -Wfatal-errors.

请帮帮我。

我尝试设置ostream &amp;out=cout;,最后设置return out。但我得到cout&lt;&lt;expand(111234) 的以下结果。

one0x8050884 hundredeleven and 0x80508840x8050884 thousandtwo0x8050884 hundredthirtyfour 0x8050884 and 0x8050884 0x80508840x8050884

【问题讨论】:

  • 你的问题是什么>?编译问题(在这种情况下,您将 wayyyy 发布到很多代码中)?还是你得到的输出?
  • 这是我现在得到的输出......
  • 感谢您的回答@AndyProwl。但是,使用您建议的更改,我没有得到正确的输出。你能帮我编辑我的代码建议更改,以便我能得到正确的答案吗?

标签: c++ ostream


【解决方案1】:

问题出在这里:

ostream   &out;

正如编译器告诉你的,必须初始化引用。它们不能是默认构造的。根据 C++11 标准的第 8.3.5/1 段:

声明为 T& 或 T&& 的变量,即“对 T 类型的引用”(8.3.2),应由对象初始化, 或函数,类型为 T 或由可转换为 T 的对象

如果您打算将out 绑定到标准输出,那么您可以这样做:

ostream& out = std::cout;

或者,您可以将out 作为函数的参数,默认绑定到std::cout

ostream& expand(int value, ostream& out = std::cout)
{
    out << "";
    // ...
}

这样,客户端可以调用expand()并让它输出到指定的流(例如std::ostringstreamstd::ofstream),如果没有指定流,则输出到标准输出。

【讨论】:

    【解决方案2】:
    ostream   &out; // Error
    

    你必须用一个对象初始化out。因为引用总是必须引用某些东西。

    ostream   &out = cout;
    

    【讨论】:

      【解决方案3】:

      如果你想像这样链接输出,你应该使用安迪的答案中给出的方法。目前,系统正在尝试将您的 ostream 指针作为值输出,由于您没有将流作为输入参数提供,因此无法正确链接。

      【讨论】:

        【解决方案4】:
        #include<stdio.h>
        #include<conio.h>
        
        void two_dgt(int);
        void three_dgt(int);   //Function Declarations
        void four_dgt(int);
        long int num,hd_place,th_place;
        char single[10][6] = {"","one","two","three","four",
                "five","six","seven","eight","nine"};
        
        char tens_multi[10][8] = {"","ten","twenty","thirty","forty",
                "fifty","sixty","seventy","eighty","ninety"};
        
        char dual[10][10] = {"ten","eleven","twelve","thirteen","fourteen",
                 "fifteen","sixteen","seventeen","eighteen","nineteen"};
        
        void main()
        {
           clrscr();
           printf("Enter the number upto 5 digits: ");
           scanf("%ld",&num);
           if(num == 0)
             printf("Zero");
           else
           {
               clrscr();
               printf("\n\nEntered number: %ld",num);
               printf("\nIn words:       ");
               if(num < 10)
                  printf("%s",single[num]); //use to print single digit number
               else if(num < 100)
                  two_dgt(num);          //call a function to print two digits
               else if(num < 1000)
                  three_dgt(num);      //call a function to print three digits
               else if(num < 10000)
                  four_dgt(num);        //call a function to print four digits
               else if(num < 100000)
               {
                  th_place = num/1000;
                  two_dgt(th_place);
                  printf(" thousand ");
                  num = num - (th_place*1000);
                  hd_place = num/100;
                  if(hd_place == 0)
                      two_dgt(num);
                  else
                      three_dgt(num);
               }
               else if(num > 99999)
               {
                  clrscr();
                  printf("\nError: number range should be upto 5 digits");
                }     
            }
            getch();
        

        }

        void two_dgt(int num)
        {
        if(num%10 == 0)
          printf("%s",tens_multi[num/10]);
        else
        {
          if(num/10 == 1)
             printf("%s",dual[num%10]);
          else
             printf("%s %s",tens_multi[num/10],single[num%10]);
        }
        }
        
        void three_dgt(int num)
        {
         hd_place = num/100;
         printf("%s hundred ",single[hd_place]);
         num = num - (hd_place*100);
         two_dgt(num);
        }
        
        void four_dgt(int num)
        {
          th_place = num/1000;
          printf("%s thousand ",single[th_place]);
          num = num - (th_place*1000);
          hd_place = num/100;
          if(hd_place == 0)
             two_dgt(num);
          else
             three_dgt(num);
         }
        

        【讨论】:

        • 这并没有真正回答这个问题(接受的答案就是这样,投票率更高的答案也是如此)。
        猜你喜欢
        • 2017-03-08
        • 2013-03-22
        • 1970-01-01
        • 2019-03-27
        • 2011-02-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多