问题描述
设计程序完成从阿拉伯数字到人民币风格的字符串转换,需完成的功能如下:
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)非法字符串:提示用户重新输入。
流程设计
程序实现和测试
主要模块
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;
}
测试用例
更多相关内容请参见