接受平凡 努力出众 2023-11-05 20:49 采纳率: 0%
浏览 3

关于#c##的问题,请各位专家解答!

7-23 币值转换 这个代码有什么问题?
分数 20
作者 陈建海
单位 浙江大学
输入一个整数(位数不超过9位)代表一个人民币值(单位为元),请转换成财务要求的大写中文格式。如23108元,转换后变成“贰万叁仟壹百零捌”元。为了简化输出,用小写英文字母a-j顺序代表大写数字0-9,用S、B、Q、W、Y分别代表拾、百、仟、万、亿。于是23108元应被转换输出为“cWdQbBai”元。

输入格式:
输入在一行中给出一个不超过9位的非负整数。

输出格式:
在一行中输出转换后的结果。注意“零”的用法必须符合中文习惯。

输入样例1:
813227345
输出样例1:
iYbQdBcScWhQdBeSf
输入样例2:
6900
输出样例2:
gQjB


#include<stdio.h>
int main()
{
    long n;
  long m;
  int i=0,c=1,j=0,f=0;
    char b[100],a[10]={'a','b','c','d','e','f','g','h','i','j'},s[10]={'S','B','Q','W','Y'};
    scanf("%ld",&n);
     while(n!=0)
     {
      
       m=n%10;
       n=n/10;
       if(f==0 && m==0)
       {
         c++;
       }
       if(m!=0)
       {
        
         f=1;
         if(c>1)
           b[i++]=s[c-2];
                  
         b[i++]=a[m];

         c++;
        }
         
}
  for(j=i-1;j>=0;j--)
    printf("%c",b[j]);
  
  return 0;
}
  • 写回答

1条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-11-05 22:13
    关注

    【以下回答由 GPT 生成】

    问题的代码实现了将一个整数表示的金额转换成财务要求的大写中文格式。具体实现流程如下:

    1. 定义变量和数组:
    2. n表示输入的金额,m表示n的个位数。
    3. i表示数组b的索引,c表示一个计数器,用于记录当前数字所在的位置。
    4. j用于循环打印数组b的元素。
    5. f用于判断是否已经开始处理非零的数字。
    6. 数组a存储着小写英文字母a-j,对应于大写数字0-9。
    7. 数组s存储着大写中文数字的单位拾、百、仟、万、亿,对应于数组b中的某些索引位置。

    8. 读取输入的金额。

    9. 进行金额的处理:
    10. 判断个位数是否为零且前面没有出现非零数字,如果是,则计数器c加1。
    11. 如果个位数不为零,则将f设置为1表示已经开始处理非零数字。
    12. 如果计数器c大于1,则将s[c-2](单位)添加到数组b中。
    13. 将a[m](数字a-j对应的大写数字)添加到数组b中。
    14. 计数器c加1。
    15. 不断地将金额除以10,然后继续处理倒数第二位、倒数第三位......直到金额为0。
    16. 从数组b的末尾开始循环打印每个元素,从而得到最终的大写中文金额。

    代码中可能存在的问题和可以优化的地方: 1. 代码没有对输入的合法性进行验证,可能导致非法输入引发错误或出错结果。 2. 代码中使用了硬编码的数组,不够灵活可维护。可以考虑将其提取为常量或使用更具语义化的变量名。 3. 变量命名不够清晰,可读性较差。可以使用更有描述性的变量名来提高代码的可理解性。 4. 代码没有给出任何错误处理或容错机制,可以添加对异常情况的处理,提高代码的健壮性。

    为了优化代码,可以采取如下措施: 1. 将硬编码的数组提取为常量或使用更语义化的变量名,以提高代码可读性。例如,可以将数组a和s改为以下形式:

    c const char digitChars[10] = {'a','b','c','d','e','f','g','h','i','j'}; const char unitChars[5] = {'S','B','Q','W','Y'};

    1. 改善变量命名以提高代码可读性。例如,可以将变量名n改为amount、m改为digit、i改为index、c改为count等等。

    ```c int main() { long amount; // 金额 long digit; // 当前位的数字 int index = 0; // 数组b的索引 int count = 1; // 计数器,记录当前数字所在的位置 int j = 0; // 循环打印数组b的元素 int flag = 0; // 判断是否已经开始处理非零数字 char result[100]; // 用于存储最终结果的数组 const char digitChars[10] = {'a','b','c','d','e','f','g','h','i','j'}; // 数字对应的大写字母数组 const char unitChars[5] = {'S','B','Q','W','Y'}; // 单位对应的大写中文字母数组

       scanf("%ld", &amount);
    
       while (amount != 0) {
           digit = amount % 10;
           amount /= 10;
           if (flag == 0 && digit == 0) {
               count++;
           }
           if (digit != 0) {
               flag = 1;
               if (count > 1)
                   result[index++] = unitChars[count - 2];
               result[index++] = digitChars[digit];
               count++;
           }
       }
       for (j = index - 1; j >= 0; j--)
           printf("%c", result[j]);
    
       return 0;
    

    } ```

    1. 添加输入合法性的验证。例如,可以在输入读取后对输入的值进行范围和类型的验证。

    ```c int main() { // ...

       scanf("%ld", &amount);
       if (amount < 0) {
           printf("Invalid input: value should be non-negative.\n");
           return 1;
       }
    
       // ...
    
       return 0;
    

    } ```

    通过以上优化,能够提高代码的可读性和可维护性,并增加程序的健壮性。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

问题事件

  • 创建了问题 11月5日

悬赏问题

  • ¥15 javaweb项目无法正常跳转
  • ¥15 VMBox虚拟机无法访问
  • ¥15 skd显示找不到头文件
  • ¥15 机器视觉中图片中长度与真实长度的关系
  • ¥15 fastreport table 怎么只让每页的最下面和最顶部有横线
  • ¥15 R语言卸载之后无法重装,显示电脑存在下载某些较大二进制文件行为,怎么办
  • ¥15 java 的protected权限 ,问题在注释里
  • ¥15 这个是哪里有问题啊?
  • ¥15 关于#vue.js#的问题:修改用户信息功能图片无法回显,数据库中只存了一张图片(相关搜索:字符串)
  • ¥15 texstudio的问题,