实例26:阿拉伯数字转换为罗马数字,将一个整数n(1~9999)转换为罗马数字,其中数字和罗马数字的对应关系如下:

原书中的开发环境很老,我也没有花心思去研究。自己在codeblocks中进行开发的,所以程序与原书中的程序有很多地方不同,但是关键的一些程序还是采用原书中的代码。

  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4.  
  5. #define ROWS 4
  6. #define COLS 4
  7.  
  8. //整数的分段标准
  9. int nums[ROWS][COLS] = {
  10. {,,,},
  11. {,,,},
  12. {,,,},
  13. {,,,},
  14. };
  15. //用于转换的罗马字符
  16. char *roms[ROWS][COLS] = {
  17. {"m","m","m","m"},
  18. {"cm","d","cd","c"},
  19. {"xc","l","xl","x"},
  20. {"ix","v","iv","i"},
  21. };
  22.  
  23. int main()
  24. {
  25. int IntToTrans; //待转换的整数(1~9999)
  26. char TransRoman[]; //转换后的罗马字母存放的数组
  27. int power, index;
  28.  
  29. //判断输入数据是否在规定范围内,如果不符合则一直循环直至符合
  30. while()
  31. {
  32. printf("Please input the integer number you want to trans to roman(1..9999): \n");
  33. scanf("%d", &IntToTrans);
  34. if(IntToTrans < || IntToTrans>)
  35. {
  36. printf("Sorry the number you input is out of range\n");
  37. continue;
  38. }else{
  39. break;
  40. }
  41. }
  42.  
  43. //用来转换的关键代码部分
  44. TransRoman[] = '\0'; //因为stract函数的性质
  45. for(power=; power<ROWS; power++)
  46. {
  47. for(index=; index<COLS; index++)
  48. {
  49. while(IntToTrans >= nums[power][index])
  50. {
  51. strcat(TransRoman,roms[power][index]);
  52. IntToTrans -= nums[power][index];
  53. }
  54. }
  55. }
  56. printf("%s\n",TransRoman);
  57. return ;
  58. }

第29行-41行算是自己写的程序代码,其实本来是一段很简单的代码,但是在实际运行时却出现了问题。

最开始设计的时候第33行的代码是

  1. scanf("%d\n",IntToTrans);

关于这个用法的错误点可以参考以下链接:

https://blog.csdn.net/weiweicsdn1/article/details/52185453

第43行-56行是将整数转换成罗马数字的关键代码,一开始是想自己用取余的方法来写一下代码,但是感觉只是有一个大概的念头,而不是比较明确的程序流程,于是就偷懒了,采用了原书中的代码。

TransRom是存放转换后罗马数字的字符串,通过将需要转换的整数与分段数(1000,900,500,……)相比较,不断地减去这些数直至0。通过第51行的stract函数将新转换的罗马数字与之前的合并。因为stract函数的原因需要先使TransRoman[0]='\0'。下图为简单的stract函数介绍

当把第44行注释掉后的运行结果如下图所示:

正常程序运行结果:

总结:有思路真的不代表你能写出程序来,还是要完整的实现出来。

致谢:同学:hcr1995、阿鹏

C语言实例解析精粹学习笔记——26的更多相关文章

  1. C语言实例解析精粹学习笔记——18

    <C语言实例解析精粹>中编译环境采用的是Turbo C 2.0.但是这个编译器年代久远,较新的编译器对书中的某些例子支持不好,在学习的时候同时做一些笔记. 实例18:将一个无符号整数转换为 ...

  2. C语言实例解析精粹学习笔记——35(报数游戏)

    实例35: 设由n个人站成一圈,分别被编号1,2,3,4,……,n.第一个人从1开始报数,每报数位m的人被从圈中推测,其后的人再次从1开始报数,重复上述过程,直至所有人都从圈中退出. 实例解析: 用链 ...

  3. C语言实例解析精粹学习笔记——42(插入排序)

    实例说明: 将一个整数数组按从小到大的顺序进行排序.(主要学习基本的插入排序和改进的冒泡排序的算法和应用) 思路1: 从第一个数据开始,分别比较其后的数据,若比它小,则将这两个数的位置交换:从第一个数 ...

  4. C语言实例解析精粹学习笔记——36(模拟社会关系)

    实例: 设计一个模拟社会关系的数据结构,每个人的信息用结构表示,包含名字.性别和指向父亲.母亲.配偶.子女的指针(只限两个子女).要求编写以下函数: (1)增加一个新人的函数 (2)建立人与人之间关系 ...

  5. C语言实例解析精粹学习笔记——32

    实例32: 编制一个包含姓名.地址.邮编和电话的通讯录输入和输出函数. 思路解析: 1.用结构体来完成姓名.地址.邮编和电话的组合. 2.结构体指针的使用. 3.malloc的使用 4.scanf函数 ...

  6. C语言实例解析精粹学习笔记——31

    实例31: 判断字符串是否是回文 思路解析: 引入两个指针变量(head和tail),开始时,两指针分别指向字符串的首末字符,当两指针所指字符相等时,两指针分别向后和向前移动一个字符位置,并继续比较, ...

  7. C语言实例解析精粹学习笔记——30

    实例30: 用已知字符串s中的字符,生成由其中n个字符组成的所有字符排列.设n小于字符串s的字符个数,其中s中的字符在每个排列中最多出现一次.例如,对于s[]="abc",n=2, ...

  8. C语言实例解析精粹学习笔记——28

    实例28:从键盘读入实数 题目要求: 编制一个从键盘读入实数的函数readreal(double *rp).函数将读入的实数字符列转换成实数后,利用指针参数rp,将实数存于指针所指向的变量*rp. 思 ...

  9. C语言实例解析精粹学习笔记——19

    实例19:判断正整数n的d进制表示形式是否是回文数(顺着看和倒着看相同的数). 主要思路: 一种方法:将正整数n数转换成d进制的数,逐个比较首尾对应数字,判断是否为回文数. 另一种方法:将正整数n数转 ...

随机推荐

  1. 配置Slf4j依赖,桥接各种多个日志组件(排除commons-logging依赖的影响)

    由于各个jar组件使用的日志框架不一样,实际项目中可能会引入多个jar,通常使用的日志框架有 commons-logging log4j 若同一个项目引入多个日志组件,那么Slf4j组件会有不能捕捉到 ...

  2. ansible软件相关模块丶计划任务,剧本

    软件相关模块 yum rpm 和yum 的区别 rpm:redhat package manager yum可以解决依赖关系 yum 源配置 [epel] name=Extra Packages fo ...

  3. java技术小白的入门

    一.入门书籍 1,疯狂java讲义 2,java编程思想 3,Maven权威指南 4,Spring 3.0就是这么简单 5,Spring技术内幕 6,Spring实战 7,Maven实战 二.入门业务 ...

  4. 表单验证插件及一些属性的用法 validate

    注:必须配合jq使用. 基本语法 例如有如下: <form action="" method="post" id="demoForm" ...

  5. jQuery核心探究

    动画animate.animate({}, { duration: 5000, progress: function (now, progressNum) {}, complete: function ...

  6. Oracle的oci.dll加载错误解决办法

    开始 -> 程序 -> Oracle -> Configuration and Migration Tools -> Net Manager→本地→概要文件→Oracle高级安 ...

  7. 【技巧】如何使用UltraEdit删掉某些行并且不留空行

    例: 在S1这个文件中我想要把所有B6 96 FD 2E 49 96 2 D2的行删掉. 首先,查找这些序列,执行替换命令,替换为的内容不写. 点击“全部替换”之后,发现在原来的位置多了一行空行. 接 ...

  8. Struts2_默认Action

    配置Struts2默认跳转的Action <package name="default" namespace="/" extends="stru ...

  9. Java 开发23种设计模式

    设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用.多数人知晓的.经过分类编目的.代码设计经验的总结.使用设计模式是为了 ...

  10. jupyter notebook 报错 ImportError: No module named matplotlib

    解决办法: 打开Anaconda Prompt  列出conda环境: conda info --envs 结果显示: # conda environments: # tensorflow * D:\ ...