人民币值的转换问题

问题描述

设计程序完成从阿拉伯数字到人民币风格的字符串转换,需完成的功能如下:
1、 由用户输入并保存一个具有两位小数的金额,单位为元;
2、 能够对用户输入的人民币金额进行输出;
3、 能够将金额数值翻译成中文的表达方式进行输出;
4、 程序不断读取用户输入,并给出两种输出,直到用户输入quit 结束执行。

注意事项:
1、用户输入纯整数或者纯小数;
2、用户输入0或者0.0或者0.00要求输出为‘’零‘’;
3、输入不是数字串或者‘quit’或者输入051.42、01.00等都为非法输入;
4、有多个零时只显示一个;
5、只有整数部分时需要后缀‘整’字样;
6、只有小数部分时整数部分的零应该省略。


问题分析

输入:
用户输入的需要转换的阿拉伯数字串或者终止程序执行的quit命令或者其它非法字符串
输出:
用户输入的待处理的字符串和(若用户输入的字符串符合处理条件)转换为RMB风格的数值表示结果
主要处理过程:
采用C风格的字符串接受用户输入判断是否满足处理要求;
(1)满足处理条件:将用户输入的字符串数组分为整数部分和小数部分进行处理并输出字符串和处理结果;
(2)结束标志‘quit’: 终止程序;
(3)非法字符串:提示用户重新输入。


流程设计

process


程序实现和测试



主要模块

1、用户输入判断模块:
主要用于判断用户输入的字符串的格式
(数字串、终止命令、非法字符串)
2、数字串转化模块:
主要用于将数字串转化为人民币风格的字符串
(整数部分转化、小数部分转化)


源代码
#include <iostream>
#include <string>
#include <stdlib.h>
#include <string.h>
#include <math.h>

using namespace std;


int main()
{
    //初始化计量单位和RMB风格的数字表示
    char measure[][4] = {"元","拾","佰","仟","万","亿"};
    char numchar[][4] = {"零","壹","贰","叁","肆","伍","陆","柒","捌","玖"};

while(true){
    //接收用户输入的字符串
    int flag = 1;
    char instr[30];
    cin >> instr;
    char* p = instr;
    if(*p == '0' && (*(p+1)!='.' && *(p+1) !='\0'))
        flag = 0;
    else
    while(*p){
        if(!isdigit(*p) && *p !='.'){
            flag = 0;
            break;
        }
        p ++;
    }

    if(flag == 1){
                //将输入的数字串转化为浮点型数据
            long double num1 = atof(instr);
            //获得输入的整数部分
            long int sector1 = static_cast<long int>(num1);
            //获得输入的小数部分
            float sector2 = num1 - sector1;
            //判断是否是数字串
            if(fabs(sector2) < 1e-6 && sector1 == 0){
                    cout << "零" << endl;
                    continue;
            }

            //将存放转化数据的串初始化为空
            string ostr = "";

            //将整数部分再转化为字符串存放在temp字符串中
            char temp[20];
            ltoa(sector1,temp,10);
            p = temp;
            int num = strlen(temp);//整数部分位数

            for(int i = 1;i <=num;i++){
                if(sector1 == 0)
                break;
                //定义k控制数字转换和计量单位的选择
                int k = (num - i) % 4;
               //将正在处理的字符串的数字位转化为数值
                int judgNum = *p & 15;

                //数字转化部分
                if(judgNum)
                    ostr += numchar[judgNum];
                else{
                    if(k && (*(p+1)&15))
                        ostr += "零";
                }

                //计量单位转化
                if(k){
                    if(judgNum)
                        ostr += measure[k];
                }
                else{
                    int j = num - i;
                    if(j)
                        ostr += measure[j/4 +3];
                    else
                        ostr += "元";
                }
                    p++;
            }

            //处理小数部分

            if(fabs(sector2) < 1e-6)
            ostr += "整";
            else{
                    p = instr;
                    while(*p){
                        if(*p == '.')
                            break;
                            p++;
                    }
                    if(*(p+1)=='0')
                        ostr = ostr+ numchar[*(p+2) & 15] + "分";
                    else{
                        ostr = ostr + numchar[*(p+1)&15] +"角" ;
                        if(*(p+2)!='\0' && *(p+2) != '0')
                            ostr = ostr + numchar[*(p+2)&15] + "分";
                    }
            }

            //输出源字符串和处理后字符串
            cout << "primitive str: " << instr << endl << "RMB: " << ostr << endl;

    }
    else{
        if(!strcmp(instr,"quit")){
            cout << "program have been stopped!" << endl;
            break;
        }
        else{
            cout << "your's input is illegal,please input legal data! " << endl;
        }
    }
}

    return 0;
}


测试用例

test1
test2

更多相关内容请参见

我的博客

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值