C语言实例解析精粹学习笔记——26
实例26:阿拉伯数字转换为罗马数字,将一个整数n(1~9999)转换为罗马数字,其中数字和罗马数字的对应关系如下:

原书中的开发环境很老,我也没有花心思去研究。自己在codeblocks中进行开发的,所以程序与原书中的程序有很多地方不同,但是关键的一些程序还是采用原书中的代码。
#include <stdio.h>
#include <string.h>
#include <stdlib.h> #define ROWS 4
#define COLS 4 //整数的分段标准
int nums[ROWS][COLS] = {
{,,,},
{,,,},
{,,,},
{,,,},
};
//用于转换的罗马字符
char *roms[ROWS][COLS] = {
{"m","m","m","m"},
{"cm","d","cd","c"},
{"xc","l","xl","x"},
{"ix","v","iv","i"},
}; int main()
{
int IntToTrans; //待转换的整数(1~9999)
char TransRoman[]; //转换后的罗马字母存放的数组
int power, index; //判断输入数据是否在规定范围内,如果不符合则一直循环直至符合
while()
{
printf("Please input the integer number you want to trans to roman(1..9999): \n");
scanf("%d", &IntToTrans);
if(IntToTrans < || IntToTrans>)
{
printf("Sorry the number you input is out of range\n");
continue;
}else{
break;
}
} //用来转换的关键代码部分
TransRoman[] = '\0'; //因为stract函数的性质
for(power=; power<ROWS; power++)
{
for(index=; index<COLS; index++)
{
while(IntToTrans >= nums[power][index])
{
strcat(TransRoman,roms[power][index]);
IntToTrans -= nums[power][index];
}
}
}
printf("%s\n",TransRoman);
return ;
}
第29行-41行算是自己写的程序代码,其实本来是一段很简单的代码,但是在实际运行时却出现了问题。
最开始设计的时候第33行的代码是
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的更多相关文章
- C语言实例解析精粹学习笔记——18
<C语言实例解析精粹>中编译环境采用的是Turbo C 2.0.但是这个编译器年代久远,较新的编译器对书中的某些例子支持不好,在学习的时候同时做一些笔记. 实例18:将一个无符号整数转换为 ...
- C语言实例解析精粹学习笔记——35(报数游戏)
实例35: 设由n个人站成一圈,分别被编号1,2,3,4,……,n.第一个人从1开始报数,每报数位m的人被从圈中推测,其后的人再次从1开始报数,重复上述过程,直至所有人都从圈中退出. 实例解析: 用链 ...
- C语言实例解析精粹学习笔记——42(插入排序)
实例说明: 将一个整数数组按从小到大的顺序进行排序.(主要学习基本的插入排序和改进的冒泡排序的算法和应用) 思路1: 从第一个数据开始,分别比较其后的数据,若比它小,则将这两个数的位置交换:从第一个数 ...
- C语言实例解析精粹学习笔记——36(模拟社会关系)
实例: 设计一个模拟社会关系的数据结构,每个人的信息用结构表示,包含名字.性别和指向父亲.母亲.配偶.子女的指针(只限两个子女).要求编写以下函数: (1)增加一个新人的函数 (2)建立人与人之间关系 ...
- C语言实例解析精粹学习笔记——32
实例32: 编制一个包含姓名.地址.邮编和电话的通讯录输入和输出函数. 思路解析: 1.用结构体来完成姓名.地址.邮编和电话的组合. 2.结构体指针的使用. 3.malloc的使用 4.scanf函数 ...
- C语言实例解析精粹学习笔记——31
实例31: 判断字符串是否是回文 思路解析: 引入两个指针变量(head和tail),开始时,两指针分别指向字符串的首末字符,当两指针所指字符相等时,两指针分别向后和向前移动一个字符位置,并继续比较, ...
- C语言实例解析精粹学习笔记——30
实例30: 用已知字符串s中的字符,生成由其中n个字符组成的所有字符排列.设n小于字符串s的字符个数,其中s中的字符在每个排列中最多出现一次.例如,对于s[]="abc",n=2, ...
- C语言实例解析精粹学习笔记——28
实例28:从键盘读入实数 题目要求: 编制一个从键盘读入实数的函数readreal(double *rp).函数将读入的实数字符列转换成实数后,利用指针参数rp,将实数存于指针所指向的变量*rp. 思 ...
- C语言实例解析精粹学习笔记——19
实例19:判断正整数n的d进制表示形式是否是回文数(顺着看和倒着看相同的数). 主要思路: 一种方法:将正整数n数转换成d进制的数,逐个比较首尾对应数字,判断是否为回文数. 另一种方法:将正整数n数转 ...
随机推荐
- hdu 3586 最小代价切断根与叶子联系
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3586 http://blog.csdn.net/woshi250hua/article/details ...
- SVN中建立项目
下午建个svn的时候,出错,有个东西配置错了,晚上google看到一篇文章,觉得作者写的不错,而且很用心,转来共享. [转至]5分钟快速建立项目版本控制 – Face Code,Brain bloom ...
- Asp.net防御XSS攻击组件库
一.AntiXss 翻看mvc4高级编程,偶看到作者强烈推荐使用AntiXss防御XSS攻击,收集资料看下. 目前类库已融入到.netframework中,类库主页不再更新. 使用方法:使用Nuget ...
- adobe air ane 中有的java class 打包 apk 后却没有了报NoClassDefFoundError ,ClassNotFoundException
apache flex sdk 手机项目 09-18 10:34:55.030: E/AndroidRuntime(19513): FATAL EXCEPTION: main 09-18 10:34: ...
- Azure 7 月新公布
Azure 7月新发布:Cosmos DB,事件中心捕捉功能,Hybrid Connections,流量管理器快速故障转移功能. 您现有的 DocumentDB 资源现已作为 Azure 门户上 Az ...
- SaberSama【css总结】
为什么要转过来呢? 因为我觉到,同样是一个初学者,应该互相学习,交流. css:Cascading Style Sheets 层叠样式表 CSS引入方式: 1.内嵌: <p style=&quo ...
- PHP文件是什么?如何打开PHP文件?
在平时我们可能会碰到过php文件,可是很多用户不知道php文件是什么文件?也不知道怎么打开php文件?为了满足一些用户的好奇心,小编现在就给大家讲解php文件以及如何打开php文件的方法. 1.PHP ...
- 如何把某个网站的SSL Server certificate链导入到ABAP Netweaver系统里
我们在用ABAP代码消费外网的url时会遇到一些异常,比如ICM_HTTP_SSL_PEER_CERT_UNTRUSTED,这是因为请求的url所在的网站的SSL Server certificate ...
- 少年开始学习c#编程,过路的大神请担待!
这应该真正算开始学习编程, 安装好了 linux, 开通了博客员的博客, 同时今天也需要把sublime安好, 安装MonoDevelop Codeblocks mysql-workbench 配置好 ...
- 【BZOJ1269】[AHOI2006] 文本编辑器editor(Splay)
点此看题面 大致题意: 让你维护一个字符串,有插入字符串.删除区间.反转区间和输出单个字符操作. \(Splay\) 这应该是一道比较简单的\(Splay\)题(虽然因为各种细节我调了很久). 我们可 ...