C++上机作业实验四 金额转换

C++上机作业实验四 金额转换

实验目的:练习字符型数组和字符串类string的使用方法

实验内容:

西北银行的客户经理提出需求,需要设计一个在银行前台不断执行的程序,该程序能够帮助客户将输入的罗马数字金额转换成中文金额,具体功能如下:

  1. 由用户输入并保存一个具有两位小数的金额,单位为元;
  2. 能够对用户输入的人民币金额进行输出;
  3. 能够将金额数值翻译成中文的表达方式进行输出;
  4. 程序不断读取用户输入,并给出两种输出,直到用户输入quit结束执行;

实验要求:

  1. 作为一个软件,请为软件设计一个良好的交互流程和方式;
  2. 建议使用C风格字符串保存用户输入的金额数值;
  3. 转换过程请自行设计,重点关注几种边缘条件:

(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;
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_43628888/article/details/89739333
今日推荐