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