这是一个用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
答案 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::ostringstream
或std::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);
}