这是我在大二学习C++时写的一段代码,功能是实现将金额的阿拉伯数字转换为大写汉字。在银行,会计等方面用处很大,希望对大家有所帮助。以下是在Visual C++ 6.0下调试通过的源代码:
#include
#include
void main()
{
int num=0,j=0; /*变量j用来存储各个位上的数值*/
int x=0; /*负数标记*/
int k=0,l=0,m=0,n=0; /*分别记录千万位至万位是否输出过零*/
int a=0,b=0,c=0,d=0; /*分别记录千位至个位是否输出过零*/
int temp1=0,temp2=0,temp4=0,temp5=0; /*用来解决高四位和低四位重复输出的零*/
char c1[]={"壹"},c2[]={"贰"},c3[]={"叁"},c4[]={"肆"},c5[]={"伍"},c6[]={"陆"},c7[]={"柒"},c8[]={"捌"},c9[]={"玖"},c0[]={"零"};
char *string[]={c0,c1,c2,c3,c4,c5,c6,c7,c8,c9};
cout<
cout<
cout<
cout<
next:
cin>>num;
if(num<0)
{
num=-num; /*将负数取反,变为正数处理,以x=1作为负数标记*/
x=1;
}
if(num>99999999) {cout<
if(x){cout<
if(num==0)cout<
if(num<=99999999&&num>=10000000)
{
j=(int)num/10000000;
cout<
num=num-j*10000000;
k++;
}
if(num<=9999999&&num>=1000000)
{
j=(int)num/1000000;
cout<
num=num-j*1000000;
l++;
}
if(k==1&&l==0) {cout<
if(num<=999999&&num>=100000)
{
j=(int)num/100000;
cout<
num=num-j*100000;
m++;
}
if((k==1&&l==1&&m==0)||(l==1&&m==0)) {cout<
if(num<=99999&&num>=10000)
{
j=(int)num/10000;
cout<
num=num-j*10000;
n++;
}
{
{
if(k==1&&l==0&&m==0&&n==0)cout<
if(l==1&&m==0&&n==0)cout<
}
if(k==1||l==1||m==1||n==1){cout<
}
if(n==0&&(k==1||l==1||m==1)){cout<
if(num<=9999&&num>=1000)
{
j=(int)(num/1000);
cout<
num=num-j*1000;
a++;
}
if(k==1||l==1||m==1||n==1){cout<
if((a==1)&&(temp1==1)){cout<
if(temp4==4&&temp1==1){cout<
if(num<=999&&num>=100)
{
j=(int)(num/100);
cout<
num=num-j*100;
b++;
}
if(a==1&&b==0) {cout<
if(num<=99&&num>=10)
{
j=(int)(num/10);
cout<
num=num-j*10;
c++;
}
if(b==1&&c==0) {cout<
if(num<=9&&num>0)
{
j=num;
d++;
if(j!=0) {cout<
}
/*下面四个IF语句作用是对结果中多出的"零"进行处理*/
if(temp5==5&&d==0)cout<
if(temp1==1&&a==0&&b==0&&c==0&&d==0){cout<
if(a==1&&b==0&&c==0&&d==0&&temp2==2) {cout<
if(b==1&&c==0&&d==0&&temp2==2) {cout<
cout<
k=0,l=0,m=0,n=0; /*以下三行用来将记录状态的变量重置,以进行便下一次循环*/
a=0,b=0,c=0,d=0;
temp1=0,temp2=0,temp4=0,temp5=0;
//goto next;
}
默认情况下我注释掉了最后一行的GOTO语句,这样程序每次只执行一遍,这时没有任何问题。
但如果取消掉了注释程序就会执行无限次,但这时会有一个问题:就是若输入的数不是整数,如5.0 或是 abc 程序会进入死循环,屏幕上一直输出“零圆整”。为什么会进入这个死循环,我一直也没能搞明白,希望如果有谁能知道为什么会进入这个死循环,还请告诉我一声,感激不尽。