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数转 ...
随机推荐
- Unified Service Desk Overview
As we implement CRM in enterprise, we usually integrate with many other information system such as E ...
- (转)ArcEngine读取数据(数据访问)
读取和访问数据是进行任何复杂的空间分析及空间可视化表达的前提,ArcGIS支持的数据格式比较丰富,下面就这些格式Shapefile.Coverage.Personal Geodatabase.Ente ...
- Eclipse+ADT+Android SDK 搭建安卓开发环境(转)
要求 必备知识 windows 7 基本操作. 运行环境 windows 7(64位); eclipse-jee-luna-SR2-win32(32位);ADT-23.0.4 下载地址 环境下载 最近 ...
- 【起航计划 024】2015 起航计划 Android APIDemo的魔鬼步伐 23 App->Notification->IncomingMessage 状态栏通知
应用程序可以使用Notifications来通知用户某个事件发生了(如收到短信).类NotificationManager 用来处理Notification, NotificationManager可 ...
- u-boot分析(四)---设置异常向量表|设置SVC模式
u-boot分析(四) 通过前三篇的分析,我们对u-boot已经有了整体的认识和掌握,但是我们仍然对于其部分硬件是如何初始化的不太清楚,所以接下来几篇博文我将会对我们在http://www.cnblo ...
- linux基础命令-文件查看类命令cat/tac/more/less/tail/head
cat 查看文本文件内容 -b :给每一行编号不包括空白行 -n:给所有行编号 [root@host01 tmp]# cat -An /root/anaconda-ks.cfg # Kickstart ...
- jemter实战
业务流梳理,需要实现的内容,含jdbc和正则表达式,和取值 1. 登录用户 2. 获取一个未分配的订单,判断是否是未分配 3. 获取配货单号 4. 分配配货单 5. 查询已分配的配货单 6. 查询包裹 ...
- iOS逆向命令集
越狱命令行 破壳: 10.10.215.119 ssh root@10.10.215.119 ssh root@10.10.213.176 CCBMobileBank Fuqianlade-iPhon ...
- DP找最优配置,(POJ1018)
题目链接:http://poj.org/problem?id=1018 这个DP,我的头都快晕了. dp[i][j]表示取到第i个设备,宽带为j时的最小价格. 状态转移方程: dp[i][k]=min ...
- 【转】Android tools:context
tools:context="com.example.guolin.scrollertest.MainActivity" 有时候可以看到有这个东西,但是从来没有用过,不知道有什么作 ...