C语言实例解析精粹学习笔记——26

实例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 {1000,1000,1000,1000},
11 {900,500,400,100},
12 {90,50,40,10},
13 {9,5,4,1},
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[25]; //转换后的罗马字母存放的数组
27     int power, index;
28 
29     //判断输入数据是否在规定范围内,如果不符合则一直循环直至符合
30     while(1)
31     {
32         printf("Please input the integer number you want to trans to roman(1..9999): \n");
33         scanf("%d", &IntToTrans);
34         if(IntToTrans < 1 || IntToTrans>9999)
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] = '\0';    //因为stract函数的性质
45     for(power=0; power<ROWS; power++)
46     {
47         for(index=0; 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 0;
58 }

第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、阿鹏

posted @ 2018-09-11 21:49  llccbb1  阅读(252)  评论(0编辑  收藏  举报