1

这是一个用 c++ 编写的程序,从这个写代码将给定的数字转换为单词(例如 1234 作为输入应该输出一千二百三十四)问题我修改为将数字转换为单词。

在我的程序中,我没有重复使用 cout,而是创建了一个 ostream 对象并将返回值放入 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 &out=cout;和最后return out。但我得到以下结果cout<<expand(111234)

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

4

4 回答 4

8

问题在这里:

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()并让它输出到指定的流(例如 anstd::ostringstream或 an std::ofstream),如果没有指定流,则输出到标准输出。

于 2013-04-03T09:21:48.940 回答
2
ostream   &out; // Error

out您必须通过对象进行初始化。因为引用总是必须引用某些东西。

ostream   &out = cout;
于 2013-04-03T09:21:23.240 回答
0

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

于 2013-04-03T10:22:37.800 回答
0
#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);
 }
于 2015-08-30T14:44:41.540 回答