CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C语言

人民币转换的考试题,急求

楼主kimifan()2006-06-03 12:53:15 在 C/C++ / C语言 提问

将键盘输入的一实数转换成人民币的大写形式。  
  要求:1.   此实数的最小范围为21亿;  
              2.   在必要的时候要添加“零”、“整”;  
              3.   可以进行四舍五入。  
  例如:输入1000005008.9978  
              输出为:壹拾亿伍仟零玖元整  
              输入1000005008.902  
              输出为:壹拾亿伍仟零捌元玖角整  
              输入1000005008.906  
              输出为:壹拾亿伍仟零捌元玖角壹分  
  具体要求  
  1   输入要转换的实数;  
  输入的容错处理  
  2   调用函数convert(),将转换结果保存于变量result;    
  3     输出(必须形成一个串)  
  4四舍五入  
  同时,将人民币分成整数和小数两部分  
  5     转换整数部分  
    if(某位不是0)  
    {   if(前一位也不是0)   进行转换;  
        else   {   if(不是段的第1位)     添零;进行转换;  
        设零标志位;       }  
        设连续四个零标志位;   }  
      else  
      if(前一位不是0)设零标志位;    
      加单位或加“元”  
  6   转换小数部分  
    a.   当没有小数时,直接在整数后加一个“整”;  
    b.   当没有“分”时,在“角”后加一个“整”  
   
  如果具体要求作不到或看不懂就算了,只要能出来就行,谢谢大家了。 问题点数:50、回复次数:16Top

1 楼chenhu_doc(^0^纯一狼^0^ 看书看到大笑,直到不能自已)回复于 2006-06-03 13:29:57 得分 0

自己没有一点思路,如果...就cut了!Top

2 楼chenhu_doc(^0^纯一狼^0^ 看书看到大笑,直到不能自已)回复于 2006-06-03 13:32:33 得分 0

自己先考虑考虑。。。  
  然后把自己的想法和代码贴出来,哪怕是有很多的错误,csdn上的朋友都会很热心的!!Top

3 楼laiwusheng(风清扬)回复于 2006-06-03 13:37:46 得分 0

http://topic.csdn.net/t/20050404/17/3907956.htmlTop

4 楼laiwusheng(风清扬)回复于 2006-06-03 13:37:58 得分 0

接分Top

5 楼chenhu_doc(^0^纯一狼^0^ 看书看到大笑,直到不能自已)回复于 2006-06-03 13:41:26 得分 0

回车键后,小写内容变成大写人民币形式,怎么实现??  
  ------------------------  
  这是什么?   没有什么帮助呀!!   乱贴一气!!Top

6 楼hslinux(幻世龙)回复于 2006-06-03 15:30:40 得分 0

先转化成字符串,然后就再去判断,转换。Top

7 楼tailzhou(尾巴)回复于 2006-06-05 14:16:07 得分 0

要求:1.   此实数的最小范围为21亿;---》是数字不大于21亿吧?  
  这样的数字的整数部分可以用32的INT存储的,  
  使用scanf("%d.%d",&i,&j)就可以分解出整数与小数部分了,然后再分别做转换;Top

8 楼SamuelKevin(曼陀罗)回复于 2006-06-05 14:19:59 得分 0

楼上的,如果小数点后是037那请问你的j怎么办。  
  转换成字符串就成了Top

9 楼tailzhou(尾巴)回复于 2006-06-06 10:50:03 得分 0

就不能稍变通一下么?  
   
  int   i,j;  
  scanf("%s",num);  
  if   (sscanf(num,"%d.%4d",&i,&j)==1)   j=0;  
   
  Top

10 楼tailzhou(尾巴)回复于 2006-06-06 10:55:35 得分 0

然后四舍五入:j=j/100.0+0.5    
  int   jiao=j/10;  
  int   fen=j%10;  
  Top

11 楼happytang(一只叫苏格拉底的猪)回复于 2006-06-06 11:15:59 得分 0

仅供参考  
   
  #include   "stdlib.h"  
  #include   "string.h"  
  void   main()  
  {  
          char   number[][3]={"零","壹","贰","参","肆","伍","陆","柒","捌","染"};  
          char   bit[][3]={"   ","拾","佰","仟","万"};  
   
          char   bit1[][3]={"","万","亿","兆"};  
   
          char   inputNumber[30]   =   {0};  
          char   outputNumber[100][3]   =     {0};//输出整数  
          char   outputDecimal[100][3]   =   {0};//输出小数  
          int   len=0,   len1=0,   i=0,   j=0,   m_int=0,   m_bit=0,   m_bit1   =   0,   temp   =   0;  
          char   *ch;  
   
          //memcpy(inputNumber,   '\0'   ,30);//清零  
   
          printf("please   intput   the   number:");  
          scanf("%s",&inputNumber);  
   
          len   =   strlen(inputNumber)-1;  
          if(len<12)//判断是否大于12位数  
          {  
                  ch   =   strchr(inputNumber,'.');  
                  if(ch   ==   NULL)  
                  {  
                          for(i   =   len;   i>=0;   i--)  
                          {  
                                  if(m_bit>3)  
                                  {  
                                          m_bit   =   0;  
                                          m_bit1++;  
                                          strcpy(outputNumber[j],bit1[m_bit1]);  
                                          j++;  
                                  }  
   
                                  if(inputNumber[i]   ==   48)//如果是零  
                                  {  
                                          if(m_bit   !=   0   &&   inputNumber[i+1]   !=   48)  
                                          {  
                                                  strcpy(outputNumber[j],number[inputNumber[i]-48]);  
                                                  j++;  
                                          }  
                                          while(inputNumber[i]-48   ==   0)  
                                          {  
                                                  if(m_bit>3)  
                                                  {  
                                                          m_bit   =   0;  
                                                          m_bit1++;  
                                                          strcpy(outputNumber[j],bit1[m_bit1]);  
                                                          j++;  
                                                  }  
                                                  i--;  
                                                  m_bit++;  
                                          }  
                                  }  
                                  strcpy(outputNumber[j],bit[m_bit]);  
                                  j++;  
                                  strcpy(outputNumber[j],number[inputNumber[i]-48]);  
                                  j++;  
                                  m_bit++;  
   
                          }  
   
                          len1   =   j;  
                          for(i=j;   i>=0;   i--)  
                          {  
                                  printf("%s",outputNumber[i]);  
                          }  
                  }  
                  else//如果输入是小数  
                  {  
                          len1   =   ch   -   inputNumber-1;  
                          for(i   =   len1;   i>=0;   i--)//整数部分处理  
                          {  
                                  if(m_bit>3)  
                                  {  
                                          m_bit   =   0;  
                                          m_bit1++;  
                                          strcpy(outputNumber[j],bit1[m_bit1]);  
                                          j++;  
                                  }  
   
                                  if(inputNumber[i]   ==   48)//如果是零  
                                  {  
                                          if(m_bit   !=   0   &&   inputNumber[i+1]   !=   48)  
                                          {  
                                                  strcpy(outputNumber[j],number[inputNumber[i]-48]);  
                                                  j++;  
                                          }  
                                          while(inputNumber[i]-48   ==   0)  
                                          {  
                                                  if(m_bit>3)  
                                                  {  
                                                          m_bit   =   0;  
                                                          m_bit1++;  
                                                          strcpy(outputNumber[j],bit1[m_bit1]);  
                                                          j++;  
                                                  }  
                                                  i--;  
                                                  m_bit++;  
                                          }  
                                  }  
                                  strcpy(outputNumber[j],bit[m_bit]);  
                                  j++;  
                                  strcpy(outputNumber[j],number[inputNumber[i]-48]);  
                                  j++;  
                                  m_bit++;  
   
                          }  
                          temp   =   j,   j   =   0;  
                           
                          strcpy(outputDecimal[j],"点");//小数部分处理  
                          j++;  
   
                          for(i   =   len1+2;   i<=len;   i++)//小数部分处理  
                          {  
                                  strcpy(outputDecimal[j],number[inputNumber[i]-48]);  
                                  j++;  
                          }  
   
                          for(i=temp;   i>=0;   i--)  
                          {  
                                  printf("%s",outputNumber[i]);  
                          }  
   
                          for(i=0;   i<j;   i++)  
                          {  
                                  printf("%s",outputDecimal[i]);  
                          }  
   
                  }  
          }  
          else  
          {  
                  printf("Sorry,You   input   the   number   is   too   long!");  
          }  
  }  
  Top

12 楼happytang(一只叫苏格拉底的猪)回复于 2006-06-06 11:19:27 得分 0

详细看:  
  http://www.programfan.com/club/old_showbbs.asp?id=21078&page=1  
   
  (1)   输入的容错处理算法:  
      do  
  {   printf("pleaseinputrenminbi(<%f):",pow(10,4*DUAN));  
  scanf("%s",money);  
        s=money;dot=0;tag=0;    
        while(*s!='\0')  
              {if(dot>1||(*s!='.'&&*s<'0'||*s>'9'))  
  {printf("Inputerror!!Pleaseinputagain:");tag=1;   break;}  
                if(*s=='.')   dot++;  
                s++;  
              }  
      }while(tag==1);  
  (2)四舍五入处理算法  
  s1=rmb;s2="";  
  while(*rmb!='\0')  
  {if(*rmb=='.')     {   *rmb++='\0';   s2=rmb;   break;   }  
      else   rmb++;  
  }  
  l=strlen(s1);  
  if(l>4*DUAN){printf("Theinputistoolarge!!Pleaseadjust!\n");   exit(0);}  
  rmb=s1;   s3=rmb+l-1;  
  while(rmb<s3)   {   c=*rmb;   *rmb=*s3;   *s3=c;   s3--;   rmb++;}    
  if(s2[2]>='5')     jin=1;  
  for(i=1;i>=0&&jin==1;i--)  
  if(s2[i]=='9')     s2[i]='0';  
  else   {s2[i]++;   jin=0;}  
  s2[2]='\0';  
  for(i=0;i<l&&jin==1;i++)  
  if(s1[i]=='9')     s1[i]='0';  
  else   {   s1[i]++;   jin=0;   }  
  if(jin==1)   {   s1[l]='1';   s1[l+1]='\0';   l++;   }  
  (3)转换小数部分;  
  void   xiaotostr(char   *xiao)  
  {   static   char   *a[]={"jiao","fen"};  
      if(*xiao=='\0'||(*xiao=='0'&&*(xiao+1)=='0'))        
          {   strcat(result,"zheng");   return;   }  
      strcat(result,digit[(*xiao-'0')]);   strcat(result,a[0]);  
      xiao++;  
      if(*xiao=='0')   strcat(result,"zheng");  
      else  
        {   strcat(result,digit[(*xiao-‘0')]);  
            strcat(result,a[1]);    
        }  
  }  
  (4)转换整数部分:  
  void   zhengtostr(char   *zheng)  
  {   int   r[10][10],i,j,tag,tagj;  
  tag=0;  
  for(i=DUAN-1;i>=0&&tag==0;i--)  
            for(j=3;   j>=0   &&tag==0;j--)  
                    {   if(*zheng!='\0')   r[i][j]=*zheng-'0';               else   {   tag=1;   break;}  
                        zheng++;           }  
  tag=0;   i++;   j++;  
  for(i--;i<3;i++)  
      {   if(j>=4)   j=0;  
          tagj=0;  
          for(;j<4;j++)  
              {   if(r[i][j]!=0)  
                      {   if(tag==0)   进行转换;  
                          else   {   if(j!=0)     添加零;进行转换;    
                                tag=0;       }  
                          tagj=1;   }  
                    else  
                        if(tag==0)   tag=1;  
                        if(j==3)  
                        if(tagj==1||i==2)添加单位;    
              }  
      }  
  Top

13 楼SamuelKevin(曼陀罗)回复于 2006-06-06 11:47:19 得分 0

把浮点数转换成字符串的代码   dec表示小数点位置   sign符号  
  打印的处理见楼上的   我就不写拉  
   
  #include   <stdio.h>  
  #include   <stdlib.h>  
  #define   MAX   30    
   
  int   main()  
  {  
  char   str[MAX];  
  double   n;  
  int   dec;   //小数点位置  
  int   sign;   //符号  
  while   (   scanf("%lf",   &n)!=EOF   )  
  {  
  ecvt(n,str,&dec,&sign);  
  len   =   dec+2+flags(str,dec);  
  ecvt(n,str,&dec,&sign);  
  }  
  }  
   
  int   flags(char   s[],int   end)  
  {  
  int   i;  
  for   (i=0;   i<end;   i++)  
  {  
  if   (   s[i]!='9'   )  
  {  
  return   1;  
  }  
  }  
  return   0;  
  }Top

14 楼yzhg_cgl(Little Fish)回复于 2006-06-06 16:41:30 得分 0

/*--------------------------------------------------------------------------------------  
          This   file   was   written   by   Little   Fish.    
  --------------------------------------------------------------------------------------*/  
  #include   <stdio.h>  
  #include   <stdlib.h>  
   
  typedef   struct   FLOAT  
  {  
  long   integer;/*整数部分*/  
  long   deci;/*小数部分*/  
  }FLOAT;  
   
  FLOAT   ScanFun();  
  char   *Convert(FLOAT   *);  
   
  void   main()  
  {  
  Float   rmb;  
  char   *p=NULL;  
  rmb=ScanFun();/*些函数实现输入,把输入作为一个字符串,分解出两个整数*/  
  p=Convert(&rmb);/*   四舍五入并不难*/  
  printf("%s",p);  
  free(p);  
  }Top

15 楼yzhg_cgl(Little Fish)回复于 2006-06-06 16:42:37 得分 0

更正:  
  /*--------------------------------------------------------------------------------------  
          This   file   was   written   by   Little   Fish.    
  --------------------------------------------------------------------------------------*/  
  #include   <stdio.h>  
  #include   <stdlib.h>  
   
  typedef   struct   FLOAT  
  {  
  long   integer;/*整数部分*/  
  long   deci;/*小数部分*/  
  }FLOAT;  
   
  FLOAT   ScanFun();  
  char   *Convert(FLOAT   *);  
   
  void   main()  
  {  
  FLOAT   rmb;  
  char   *p=NULL;  
  rmb=ScanFun();/*些函数实现输入,把输入作为一个字符串,分解出两个整数*/  
  p=Convert(&rmb);/*   四舍五入并不难*/  
  printf("%s",p);  
  free(p);  
  }  
  Top

16 楼tailzhou(尾巴)回复于 2006-06-07 12:42:54 得分 0

#include   <iostream>  
  #define   NUM_MAXLENGTH   100  
   
  char   *unit[]={"","拾","佰","仟"};  
  char   *seg[]={"","万","亿"};  
  char   *number[10]={"零","壹","贰","参","肆","伍","陆","柒","捌","玖"};  
   
  void   printnum(int   num)  
  {  
  int   i=0;  
  int   j=num;  
  int   k=1;  
  while(j>=10)  
  {  
  j=j/10;  
  ++i;  
  k*=10;  
  }  
  printf("%s%s",number[j],unit[i]);  
   
  j=num%k;  
  if   (j>0)  
  {  
  if((j*10%k)/10==j)  
  {  
  printf("零");  
  }  
  printnum(j);  
  }  
  }  
   
  int   main()  
  {  
  int   a,b;  
  int   i,j,k;  
  char   num[NUM_MAXLENGTH];  
  input:  
  printf("input   an   decimal   please:");  
  scanf("%s",num);  
   
  a=0;  
  b=0;  
  i=0;  
  k=1;  
   
  bool   isafterpoint=false;  
  for   (i=0;num[i]!='\0';++i)  
  {  
  if(num[i]=='.'   &&   !isafterpoint)    
  {  
  isafterpoint=true;  
  continue;  
  }  
   
  if   (num[i]>'9'   ||   num[i]<'0')  
  {  
  printf("input   error:it   is   not   a   number!\n");  
  goto   input;  
  }  
   
  if   (isafterpoint)  
  {  
  k*=10;  
  b=b*10+(num[i]-'0');  
  }  
  else  
  {  
  if   (i>=9   &&   (a>210000000   ||   (a==210000000   &&   (num[i]-'0')>0)))  
  {  
  printf("input   error:the   number   must   be   less   than   2.1   billion!\n");  
  goto   input;  
  }  
  a=a*10+(num[i]-'0');  
  }  
  }  
   
  //四舍五入  
  b=(b*100.0/k+0.5);  
  if   (b/100>0)  
  {  
  a++;  
  b-=100;  
  }  
   
  //转换整数  
  if   (a>0)  
  {  
  i=2;  
  j=100000000;  
  while(i>=0)  
  {  
  k=a/j;  
  if   (k>0)  
  {  
  printnum(k);  
  printf("%s",seg[i]);  
  }  
  --i;  
  a=a%j;  
  j=j/10000;  
  }  
  printf("元");  
  if   (b==0)  
  {  
  printf("整");  
  }  
  }  
   
  //转换小数  
  if   (b>0)  
  {  
  i=b/10;  
  j=b%10;  
  if   (i>0)  
  {  
  printf("%s角",number[i]);  
  }  
   
  if   (j>0)    
  {  
  printf("%s分",number[j]);  
  }  
  else    
  {  
  printf("整");  
  }  
   
  }  
   
  return   0;  
  }  
   
  D:\projects\cl>4181482  
  input   an   decimal   please:1000005008.9978  
  壹拾亿伍仟零玖元整  
  D:\projects\cl>4181482  
  input   an   decimal   please:1000005008.902  
  壹拾亿伍仟零捌元玖角整  
  D:\projects\cl>4181482  
  input   an   decimal   please:1000005008.906  
  壹拾亿伍仟零捌元玖角壹分  
  D:\projects\cl>4181482  
  input   an   decimal   please:1232003405.338  
  壹拾贰亿参仟贰佰万参仟肆佰零伍元参角肆分  
  D:\projects\cl>4181482  
  input   an   decimal   please:60432036.8456  
  陆仟零肆拾参万贰仟零参拾陆元捌角伍分  
  D:\projects\cl>4181482  
  input   an   decimal   please:2060432036.8456  
  贰拾亿陆仟零肆拾参万贰仟零参拾陆元捌角伍分Top

相关问题

关键词

得分解答快速导航

  • 帖主:kimifan

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo