c ++程序将数字转换为不起作用的单词

时间:2013-04-03 09:19:42

标签: c++ ostream

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

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

这是程序

#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 个答案:

答案 0 :(得分:8)

问题在于:

ostream   &out;

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

  

宣称为T&amp;的变量。或T&amp;&amp;,即“引用类型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),如果没有指定流,则输出到标准输出。

答案 1 :(得分:2)

ostream   &out; // Error

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

ostream   &out = cout;

答案 2 :(得分:0)

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

答案 3 :(得分: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);
 }