zoukankan      html  css  js  c++  java
  • 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、阿鹏

  • 相关阅读:
    vue换一换功能原型
    一些文章收集
    mint-ui popup自动关闭
    vue 实现二选一列表
    用数组实现矩阵乘法
    表格
    表单
    django项目创建和结构解释
    js操作元素样式
    操作标签属性
  • 原文地址:https://www.cnblogs.com/llccbb1/p/9630595.html
Copyright © 2011-2022 走看看