标题:输入一个人民币小写金额值,转化为大写金额值输出。
只看楼主
wxh525123
Rank: 2
等 级:论坛游民
帖 子:38
专家分:37
注 册:2010-4-18
结帖率:100%
已结贴  问题点数:40 回复次数:9 
输入一个人民币小写金额值,转化为大写金额值输出。
#include<stdio.h>
#include<string.h>
void main()
{
    char digit[][3]={"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};
    char place[][3]={"","拾","佰","仟","万","亿","角","分"};
    char sum_mon[44][3];/*定义存放大写钱数的二维数组*/
    int num[20],s;
    int  i,j,k,m,flag=1,len,sum;
    double money,dec_mon;
    unsigned long int_mon;
    printf("input money(0~4294967295.99):\n");
    scanf("%lf",&money);
    int_mon=(unsigned long)money;
    dec_mon=money-(double)int_mon;
    for(i=1;i<=20;i++)
    {
            num[i-1]=int_mon%10;
            int_mon=int_mon/10;
    }
       for(j=0,i=19;i>=j;i--)
    {
        if((num[i]!=0)&&(flag==1))
        {
            flag=0;
            sum=i+1;/*整数部分位数*/
            }
        if(flag==0)
        {
            s=num[i];
            num[i]=num[j];
            num[j]=s;
            j++;
            }
    }                     /*整数部分转换为字符数组*/
    switch(sum/4)
    {   
        case 0:k=sum%4;
               for(i=num[0],j=0,s=0,m=k-1;j<k;j++,m--,i=num[j])
               {
                    strcpy(sum_mon[s],digit[i]);/*把相应位的大写给sum_mon[][3]*/
                    strcpy(sum_mon[s+1],place[m]);/*在相应位大写后面加上位名*/
                    s=s+2;                  
               }              /*输入的整数部分位小于4*/
               strcpy(sum_mon[s-1],"元");
               break;
       case 1:k=sum%4;
              for(i=num[0],j=0,s=0,m=k-1;j<k;j++,m--,i=num[j])
               {
                    strcpy(sum_mon[s],digit[i]);
                    strcpy(sum_mon[s+1],place[m]);
                    s=s+2;                  
                    }
              if(k!=0)
                  strcpy(sum_mon[s-1],place[4]);/*把万给二维数组*/
              strcpy(sum_mon[s],digit[num[k]]);   
              strcpy(sum_mon[s+1],place[3]);/*把千位数和仟给数组*/
              for(i=num[k+1],j=0,s=s+2,m=2;j<3;j++,m--,i=num[j+k+1])
              {         
                    strcpy(sum_mon[s],digit[i]);     
                    strcpy(sum_mon[s+1],place[m]);
                    s=s+2;                       
                    }   
              strcpy(sum_mon[s-1],"元");
              break;   /*输入的整数部分位数小于8*/     
       case 2:k=sum%4;
              for(i=num[0],j=0,s=0,m=k-1;j<k;j++,m--,i=num[j])
               {
                    strcpy(sum_mon[s],digit[i]);
                    strcpy(sum_mon[s+1],place[m]);
                    s=s+2;                  
                    }
              if(k!=0)
                  strcpy(sum_mon[s-1],place[5]);/*把亿给二维数组*/
              strcpy(sum_mon[s],digit[num[k]]);   
              strcpy(sum_mon[s+1],place[3]);
              for(i=num[k+1],j=0,s=s+2,m=2;j<3;j++,m--,i=num[j+k+1])
              {
                    strcpy(sum_mon[s],digit[i]);
                    strcpy(sum_mon[s+1],place[m]);
                    s=s+2;                  
                    }
              strcpy(sum_mon[s-1],place[4]);
              strcpy(sum_mon[s],digit[num[k+4]]);   
              strcpy(sum_mon[s+1],place[3]);
              for(i=num[k+1+4],j=0,s=s+2,m=2;j<3;j++,m--,i=num[j+k+1+4])
              {         
                    strcpy(sum_mon[s],digit[i]);     
                    strcpy(sum_mon[s+1],place[m]);
                    s=s+2;                       
                    }   
              strcpy(sum_mon[s-1],"元");
              break;/*输入的整数部分位数小于12*/
    }
    len=2*sum;   
    for(k=0,i=0,j=0;i<2;i++,j=j+2)
    {
        dec_mon=dec_mon*10;
        k=((int)dec_mon)%10;

        strcpy(sum_mon[len+j],digit[k]);
        strcpy(sum_mon[len+j+1],place[i+6]);
    }/*小数部分*/
   for(i=0;i<len+4;i++)
        printf("%s",sum_mon[i]);/*输出大写字符*/
   getch();
}


那位高手帮忙看一下怎么回事,输出的结果怎么有时对有时差0.01呢?红色部分双精度浮点型转换为整型的时候怎么有时错误,比方说6.00就转换为5???
先谢谢了、、我看了老久也没看出来





搜索更多相关主题的帖子: 人民币 金额 小写 输出 输入 
2010-05-03 11:47
wxh525123
Rank: 2
等 级:论坛游民
帖 子:38
专家分:37
注 册:2010-4-18
得分:0 
补充:就是小数部分不对,整数部分正确。。
2010-05-03 11:47
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
得分:7 
浮点数\双精度数都是不精确类型数据.

★★★★★为人民服务★★★★★
2010-05-03 11:55
冥卫
Rank: 8Rank: 8
来 自:深山老林
等 级:蝙蝠侠
帖 子:280
专家分:772
注 册:2010-4-20
得分:7 
同意楼上
2010-05-03 13:51
wxh525123
Rank: 2
等 级:论坛游民
帖 子:38
专家分:37
注 册:2010-4-18
得分:0 
回复 3楼 cnfarer
那怎么精确的输出几角几分啊?谢谢;
2010-05-03 13:55
wxh525123
Rank: 2
等 级:论坛游民
帖 子:38
专家分:37
注 册:2010-4-18
得分:0 
强制转换是不是有时候不精确啊?
2010-05-03 14:43
glhz610
Rank: 2
等 级:论坛游民
帖 子:33
专家分:44
注 册:2010-4-4
得分:7 
楼主把dec_mon 也就是小数定位FLOAT型,不要用double型就可以解决问题了!
2010-05-03 16:51
南国利剑
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:29
帖 子:1165
专家分:3536
注 册:2010-4-12
得分:7 
浮点型本来就是不精确存储。
固有问题。

南国利剑
2010-05-03 19:54
wxh525123
Rank: 2
等 级:论坛游民
帖 子:38
专家分:37
注 册:2010-4-18
得分:0 
回复 7楼 glhz610
虽然还是不行,,但依然很感谢、、我用sprintf()函数精确得到了小数部分,强制转换可能不精确,以后尽量避免使用,,
2010-05-04 12:26
wxh525123
Rank: 2
等 级:论坛游民
帖 子:38
专家分:37
注 册:2010-4-18
得分:0 
回复 8楼 南国利剑
恩,,谢谢
2010-05-04 12:27



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-305217-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.151946 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved