C++上机作业实验四 金额转换
实验目的:练习字符型数组和字符串类string的使用方法
实验内容:
西北银行的客户经理提出需求,需要设计一个在银行前台不断执行的程序,该程序能够帮助客户将输入的罗马数字金额转换成中文金额,具体功能如下:
- 由用户输入并保存一个具有两位小数的金额,单位为元;
- 能够对用户输入的人民币金额进行输出;
- 能够将金额数值翻译成中文的表达方式进行输出;
- 程序不断读取用户输入,并给出两种输出,直到用户输入quit结束执行;
实验要求:
- 作为一个软件,请为软件设计一个良好的交互流程和方式;
- 建议使用C风格字符串保存用户输入的金额数值;
- 转换过程请自行设计,重点关注几种边缘条件:
(1)只有小数部分和只有整数部分;
(2)错误输入;
(3)金额中存在连续的数字0等;
(4)转换完成的金额使用string对象保存;
代码实现:
#include "pch.h" //vs2017需要添加
#include <iostream>
#include<cstring>
#include<string>
using namespace std;
void rmb_units(int k);
void big_write_num(int l);
int main()
{
using namespace std;
u: int a, i, j, len, len_integer = 0, len_decimal = 0;
cout << "欢迎来到西北银行!\n" << endl;
cout << "请输入您想做的事情:"
<< endl
<< "1.输入quit,然后离开。2.输入任意其他字符,我们将展示一个数字金额转换:"
<< endl;
string s1 = "quit";
string s2;
cin >> s2;
if (s1 == s2) {
cout << "SEE YOU NEXT TIME";
return 0;
}
else cout << "开始准备转换:" << endl;
cin.get();
char money[20];
char *p;
p = money;
cout << "输入您的钱(两位小数):";
cin >> money;
cout << endl;
len = strlen(money);
cout << "长度:" << len << endl;
for (i = 0; i <= len - 1; i++) {
if (*(p + i) == '.' || *(p + i) == '/0') //*(p+i)=='/0'没小数点的情况
len_integer = i;
}
for (i = 0; i < len_integer; i++)
{
a = *(p + i) - '0';
if (a == 0)
{
if (*(p + i + 1) != '0' && i != len_integer - 5 && i != len_integer - 1 && i != len_integer - 9) //圆、万、亿位为时选择不加零 {
{
cout << "零";
continue;
}
else if (i == len_integer - 1 || i == len_integer - 5 || i == len_integer - 9) //圆万亿单位不能掉
{
rmb_units(len_integer + 1 - i);
continue;
}
else
continue;
}
big_write_num(a); //阿拉伯数字中文大写输出
rmb_units(len_integer + 1 - i); //人民币货币单位中文大写输出
}
len_decimal = len - len_integer - 1;
if (len_decimal < 0)
{
len_decimal = 0;
printf("整"); //或正
}
if (len_decimal > 2) //只取两位小数
len_decimal = 2;
//printf("%d----%d-----%d/n",len,len_integer,len_decimal);
p = money;
/*转换小数部分*/
for (j = 0; j < len_decimal; j++)
{
a = *(p + len_integer + 1 + j) - '0'; //定位到小数部分,等价于a=*(p+len-len_decimal+j)-'0';
if (a < 0 || a>9)
{
cout << "/n/n!!!!---------# Error: 输入有错误,小数部分含有错误的字符!---------!!!!/n/n";
system("pause");
exit(EXIT_FAILURE);
}
if (a == 0)
{
if (j + 1 < len_decimal)
{
if (*(p + len_integer + j + 2) != '0')
cout << "零";
else
{
cout << "整";
break;
}
}
continue;
}
big_write_num(a);
rmb_units(1 - j);
}
cout << "转换完成" << endl;
cout << "你还想继续转换金钱吗"
<< endl
<< "1.输入1则继续。2.输入其他任意值我们再见"
<< endl;
int hehe;
cin >> hehe;
if (hehe == 1) goto u;
else return 0;
}
void rmb_units(int k)
{
//"分角圆拾佰仟万拾佰仟亿拾佰仟万";
switch (k)
{
case 3:case 7:case 11: cout << "拾"; break;
case 4:case 8:case 12: cout << "佰"; break;
case 5:case 9:case 13: cout << "仟"; break;
case 6: case 14: cout << "万"; break;
case 10: cout << "亿"; break;
case 2: cout << "圆"; break;
case 1: cout << "角"; break;
case 0: cout << "分"; break;
default: break;
}
}
/*阿拉伯数字中文大写输出*/
void big_write_num(int l)
{
//相当于const char big_write_num[]="0123456789";
//"零壹贰叁肆伍陆柒捌玖"
switch (l)
{
case 0:cout << "零"; break;
case 1:cout << "壹"; break;
case 2:cout << "贰"; break;
case 3:cout << "叁"; break;
case 4:cout << "肆"; break;
case 5:cout << "伍"; break;
case 6:cout << "陆"; break;
case 7:cout << "柒"; break;
case 8:cout << "捌"; break;
case 9:cout << "玖"; break;
default:break;
}
}