3667|6

389

帖子

0

TA的资源

纯净的硅(高级)

楼主
 

我的C语言习题(与版主相似) [复制链接]

  1. // NumberToWords.cpp : Defines the entry point for the console application.
  2. //

  3. #include
  4. #include

  5. static char *digits[] = {
  6. "", "ONE ", "TWO ", "THREE ", "FOUR ", "FIVE ", "SIX ", "SEVEN ",
  7. "EIGHT ", "NINE ", "TEN ", "ELEVEN ", "TWELVE ", "THIRTEEN ",
  8. "FOURTEEN ", "FIFTEEN ", "SIXTEEN ", "SEVENTEEN ", "EIGHTEEN ",
  9. "NINETEEN "
  10. };

  11. static char *tens[] = {
  12. "", "", "TWENTY ", "THIRTY ", "FORTY ", "FIFTY ", "SIXTY ", "SEVENTY ",
  13. "EIGHTY ", "NINETY "
  14. };

  15. static char *magnitudes[] = {
  16. "", "THOUSAND ", "MILLION ", "BILLION "
  17. };

  18. static void do_one_group(unsigned int amount,char *buffer,char **magnitude)
  19. {
  20.         int value;

  21.         value=amount/1000;
  22.         if(value>0)
  23.                 do_one_group(value,buffer,magnitude+1);                //使用递归调用
  24.        
  25.         amount%=1000;
  26.         value=amount/100;
  27.         if(value>0)
  28.         {
  29.                 strcat(buffer,digits[value]);                                //不同时间,不同函数中需要想字符串中加入新的字符
  30.                 strcat(buffer,"HANDREDS ");
  31.         }

  32.         value=amount%100;
  33.         if(value>=20)
  34.         {
  35.                 strcat(buffer,tens[value/10]);
  36.                 value=amount%10;
  37.         }
  38.         if(value>0)
  39.                 strcat(buffer,digits[value]);
  40.         if ( amount>0 )
  41.                 strcat(buffer,*magnitude);
  42. }

  43. void written_amount( unsigned int amount,char * buffer)
  44. {
  45.         if ( amount == 0 )
  46.         {
  47.                 strcpy(buffer,"ZERO");
  48.         }
  49.         else
  50.         {
  51.                 *buffer='\0';
  52.                 do_one_group(amount,buffer,magnitudes);
  53.         }
  54. }
  55. int main(int argc, char* argv[])
  56. {
  57.         unsigned int check=1234;
  58.         char buffer[100];
  59.         written_amount(check,buffer);
  60.         puts(buffer);
  61.         return 0;
  62. }
复制代码
为嘛代码编辑的时候不能缩进呢?

题目要求也是要将输入的数值转换为单词的形式打印出来。
先把我的程序贴出来,大致思路是这样的:
1.先建立几个数组,把相关的数值的单词形式存贮起来,这些数组使用频繁而且空间占用庞大,故使用静态存储方式,然后用数组下标遍历相应单词;
2.由于检测输入的时候是从高位到低位,输出的时候就可以用在高位输出没完成的时候不能输出低位,
故可以使用递归调用,将中间值存贮在堆栈中,实现从高位到底为依次输出;
3.创建字符串,将每次翻译出来的单词依次连起来,该判断条件的时候判断条件,最后调用puts函数输出;
4.使用函数实现模块化设计,确定不是空字符之后再调用处理函数,否则,输出buffer的初值‘\0’;
此帖出自编程基础论坛

最新回复

期待你贴出更多的代码  详情 回复 发表于 2012-10-21 23:58
点赞 关注
 

回复
举报

7815

帖子

57

TA的资源

裸片初长成(中级)

沙发
 
不错,认真看看......
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

389

帖子

0

TA的资源

纯净的硅(高级)

板凳
 
多谢版主支持
此帖出自编程基础论坛
 
 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

4
 
1.这首先,是一个习惯问题。
下次不要把一堆子函数放到main()前面,一般看程序,首先看的就是 main,你这样,找起来多累啊。

2.main()中,buffer固定定义为100的长度,毫无理由,浪费空间;
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

5
 
  1. void written_amount( unsigned int amount,char * buffer)
  2. {
  3.         if ( amount == 0 )
  4.         {
  5.                 strcpy(buffer,"ZERO");
  6.         }
  7.         else
  8.         {
  9.                 *buffer='\0';
  10.                 do_one_group(amount,buffer,magnitudes);
  11.         }
  12. }
复制代码
这个函数,考虑一下,如果把 ZERO也写进数组里,是不是就不需要用两个分支就可以一并处理了?
这样一来,逻辑简化了,因为根本不需要条件判断分支;
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

6
 
  1. static void do_one_group(unsigned int amount,char *buffer,char **magnitude)
  2. {
  3.         int value;

  4.         value=amount/1000;
  5.         if(value>0)
  6.                 do_one_group(value,buffer,magnitude+1);                //使用递归调用
  7.       
  8.         amount%=1000;
  9.         value=amount/100;
  10.         if(value>0)
  11.         {
  12.                 strcat(buffer,digits[value]);                                //不同时间,不同函数中需要想字符串中加入新的字符
  13.                 strcat(buffer,"HANDREDS ");
  14.         }

  15.         value=amount%100;
  16.         if(value>=20)
  17.         {
  18.                 strcat(buffer,tens[value/10]);
  19.                 value=amount%10;
  20.         }
  21.         if(value>0)
  22.                 strcat(buffer,digits[value]);
  23.         if ( amount>0 )
  24.                 strcat(buffer,*magnitude);
  25. }
复制代码
这个函数,本来做的事情挺简单,被你实现的过于复杂,同时,你把这个函数处理的数据的范围限定在10000以内。
而且你还使用了递归,这里只需要循环即可。

我写出来你就知道了。

用这个数组存储每个位的数码,不需要分开几个。
当然,这里出来的结果是倒序,但是要倒回来是很简单的事情。

char Digits[5];
char i = 0;

while(value)
{
      Digits %= value % 10;
     i++;  //这里我就先不考虑i是否越界的考虑了,其实是要的。
      value /= 10;
}
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

57

TA的资源

裸片初长成(中级)

7
 
期待你贴出更多的代码
此帖出自编程基础论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表