面向对象程序设计寒假作业3

面向对象程序设计寒假作业3

面向对象程序设计第二次作业

这个作业属于哪个课程|2020年面向对象程序设计
-|-|-
这个作业要求在哪里|面向对象设计寒假作业3
这个作业的目标|继续完成作业二的编程题,优化架构,思考代码的拓展性,可以参考现有的编程语言,把这些适当的内容加入。
PS:由于不可抗力,在修改仓库中出现了意外不小心删
除仓库,创建新仓库后不给上传(something really
went wrong.
编程题要求:
优化架构,思考代码的拓展性,比如需要增加其他功能,
如选择,循环语句,参考现有的编程语言扩大数字范围,
支持负数。
在还未着手写相应拓展代码时想应拓展数字范围支持上
百上千上万,以及负数拓展,原函数拓展性属实差劲通
逐步判断输入汉字处理,以及对不同的数字得分类处理
每拓展范围便要求添加大量对拓展范围数字的处理,如
和对拓展范围内的汉字数字输入后逐个字进行转换属实
使得整体编写效率低下,全局变量定义过多导致难以调
试,最终也仅做到拓展到上百,以及负九十九内的负数
还是在大量删改添加的情况下也仅能拓展小范围。

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<cstdlib>
using namespace std;
int sum_Person = 0;
struct Person_info
{
	int money;
	char Person_name[20];
}person[100];
int Money_changer(int num)
{
	if (num == -29)return 0;
	if (num == -46)return 1;
	if (num == -74)return 2;
	if (num == -56)return 3;
	if (num == -53)return 4;
	if (num == -50)return 5;
	if (num == -63)return 6;
	if (num == -58)return 7;
	if (num == -80)return 8;
	if (num == -66)return 9;
	if (num == -54)return 10;
	if (num == -72)return -1;
	return 100;
}
void Csum_Nfun(char money[20])//将汉字初始钱数进行分类;
{
	int length = strlen(money);
	if (length == 8)//字节数为8比如一百零一,一百二十,负二十九;
	{
		if (Money_changer((int)money[0]) != -1)
		{
			if (!Money_changer((int)money[5]))person[sum_Person].money = Money_changer((int)money[0]) * 100 + Money_changer((int)money[6]);//即输入一百零几此类;
			else person[sum_Person].money = Money_changer((int)money[0]) * 100 + Money_changer((int)money[4]) * 10;
		}
		else person[sum_Person].money = (-1) * (Money_changer((int)money[2]) * 10 + Money_changer((int)money[6]));
	}
	else if (length == 2)//字节数为2,比如零,六;
	{
		if (!strcmp(money, "零"))person[sum_Person].money = 0;
		else person[sum_Person].money = Money_changer((int)money[0]);
	}
	else if (length == 4)//比较复杂含有小负数,十九类数字,二十类数字
	{
		if (Money_changer((int)money[0]) == -1)person[sum_Person].money = (-1) * (Money_changer((int)money[2]));
		else if (Money_changer((int)money[0]) == 10)person[sum_Person].money = 10 + Money_changer((int)money[2]);
		else person[sum_Person].money = Money_changer((int)money[0]) * 10;
	}
	else if (length == 6)//有三十八,负十九,负二十
	{
		if (Money_changer((int)money[0]) == -1 && Money_changer((int)money[4]) == 10)person[sum_Person].money = (-1) * (10 * Money_changer((int)money[2]));
		if (Money_changer((int)money[0]) == -1 && Money_changer((int)money[4]) != 10)person[sum_Person].money = (-1) * (10 + Money_changer((int)money[4]));
		if (Money_changer((int)money[0]) != -1)person[sum_Person].money = Money_changer((int)money[0]) * 10 + Money_changer((int)money[4]);
	}
	else if (length == 10)person[sum_Person].money = Money_changer((int)money[0]) * 100 + Money_changer((int)money[4]) * 10 + Money_changer((int)money[8]);//负一百二十三为例
}
int Calculate(char money[20])//将汉字初始钱数进行分类;
{
	int sum = 0;
	int length = strlen(money);
	if (length == 8)//字节数为8比如一百零一,一百二十,负二十九;
	{
		if (Money_changer((int)money[0]) != -1)
		{
			if (!Money_changer((int)money[5]))sum += Money_changer((int)money[0]) * 100 + Money_changer((int)money[6]);//即输入一百零几此类;
			else sum += Money_changer((int)money[0]) * 100 + Money_changer((int)money[4]) * 10;
		}
		else sum += (-1) * (Money_changer((int)money[2]) * 10 + Money_changer((int)money[6]));
	}
	else if (length == 2)//字节数为2,比如零,六;
	{
		if (!strcmp(money, "零"))sum += 0;
		else sum += Money_changer((int)money[0]);
	}
	else if (length == 4)//比较复杂含有小负数,十九类数字,二十类数字
	{
		if (Money_changer((int)money[0]) == -1)sum += (-1) * (Money_changer((int)money[2]));
		else if (Money_changer((int)money[0]) == 10)sum += 10 + Money_changer((int)money[2]);
		else sum += Money_changer((int)money[0]) * 10;
	}
	else if (length == 6)//有三十八,负十九,负二十
	{
		if (Money_changer((int)money[0]) == -1 && Money_changer((int)money[4]) == 10)sum += (-1) * (10 * Money_changer((int)money[2]));
		if (Money_changer((int)money[0]) == -1 && Money_changer((int)money[4]) != 10)sum += (-1) * (10 + Money_changer((int)money[4]));
		if (Money_changer((int)money[0]) != -1)sum += Money_changer((int)money[0]) * 10 + Money_changer((int)money[4]);
	}
	else if (length == 10)sum += Money_changer((int)money[0]) * 100 + Money_changer((int)money[4]) * 10 + Money_changer((int)money[6]);//负一百二十三为例
	return sum;

}
void Sum_oringinal(void)
{
	char sum_tool[20], dengyu[20], money[20];
	cin >> person[sum_Person].Person_name >> sum_tool >> dengyu >> money;//输入初始值钱包钱数;
	Csum_Nfun(money);
}
int how(char how_number[20])
{
	if (!strcmp(how_number, "减少"))return 0;
	else if (!strcmp(how_number, "增加"))return 1;
}
void Sum_Package(int number)
{
	if (number == 0)cout << "零";
	else if (number == 1)cout << "一";
	else if (number == 2)cout << "二";
	else if (number == 3)cout << "三";
	else if (number == 4)cout << "四";
	else if (number == 5)cout << "五";
	else if (number == 6)cout << "六";
	else if (number == 7)cout << "七";
	else if (number == 8)cout << "八";
	else if (number == 9)cout << "九";
	else if (number == 10)cout << "十";
}
void Hundred_Package(int number)//处理100到999的数字
{
	Sum_Package((number / 100));
	cout << "百";
	if (number % 10 == 0 && number % 100 != 0)//处理一百一十类的
	{
		Sum_Package(((number / 10) % 10));
		cout << "十";
	}
	else if (number < ((number / 100) * 100 + 10) && number % 100 != 0)
	{
		cout << "零";
		Sum_Package((number % 10));
	}
	else if (number > ((number / 100) * 100 + 10) && number <= ((number / 100) * 100 + 99))
	{
		Sum_Package((number / 10 % 10));
		cout << "十";
		Sum_Package((number % 10));
	}
}
void Negative_Package(int number)//处理负一到负九十九
{
	int numberchange;
	numberchange = abs(number);
	cout << "负";
	if (number < 0 && number >= -10)Sum_Package(numberchange);
	else
	{
		Sum_Package((numberchange / 10 % 10));
		cout << "十";
		Sum_Package((numberchange % 10));
	}
}
void Ten_Package(int number)
{
	if (number <= 10)Sum_Package(number);
	else if (number > 10 && number < 20)
	{
		cout << "十";
		Sum_Package((number % 10));
	}
	else
	{
		Sum_Package((number / 10 % 10));
		cout << "十";
		if (number % 10 != 0)Sum_Package((number % 10));
	}
}
void Sum_display(void)
{
	if (person[sum_Person].money < 100 && person[sum_Person].money >= 0)Ten_Package(person[sum_Person].money);
	else if (person[sum_Person].money < 0 && person[sum_Person].money >= -99)Negative_Package(person[sum_Person].money);
	else if (person[sum_Person].money >= 100)Hundred_Package(person[sum_Person].money);
	else cout << "不在现有计算能力之内";
}
int main()
{
	char tool[20], how_number[20], sum_change[20];
	int operation;//作为是否退出的关键;;
	while (1)
	{
		Sum_oringinal();
		while (1)
		{
			cin >> tool >> how_number;
			if (!strcmp(tool, "看看"))
			{
				Sum_display();
				break;
			}
			cin >> sum_change;
			if (!how(how_number))person[sum_Person].money -= Calculate(sum_change);
			else person[sum_Person].money += Calculate(sum_change);
		}
		cout << endl; 
		cout << "是否选择退出,请准确输入“退出输入1”“停留输入0”:"<<endl;
		(void)scanf("%d", &operation);
		if (operation == 1)break;
		else sum_Person++;
	}
	//system("pause");
	return 0;
}

从以上代码可以看出原函数拓展性着实存在问题需要添
加处理函数或者本人本体思路存在偏差需要添加,上述
上述代码仅能解决输入负九十九到九百九十九以内的数
以及处理输出负九十九到九百九十九以内的数,初步解
决循环,支持输入完一组数据(指输入看看后输出计算
结果后再次输入另一组数据,将整数关键字可替换成人
名,本以为可以支持输入相应的数值进行查询已经输入
的数据人名及其钱数,结果所写的函数并不显示已输入
的人名,仅能显示钱数还是阿拉伯数字,就删除此功能
就像代码中的函数一样,Money_changer采用汉字数字
ASCII码存在差异,来转换汉字,也正因为如此使得 函
数拓展性受限制,需要一个个比较,在主函数调用 Sum
_oringinal函数输入第一行数据后利用 Csum_Nfun函
数对输入的初始钱数进行分类后转换, 由于设计上的
错误导致需要添加Calculate函数来对 后续输入的钱数
进行转换,处理完毕后输入关键字看看调用Sum_displa
y后针对结果又有不同的Package函数进行加工包装输出
利用how函数处理减去和增加的转换;
实现效果如下:

代码支持循环由于限定person结构体的数量故不能做到
输入大于一百组数据。
关于脚本部分编译脚本内容如下:


@echo off
title 编译脚本
gcc Function.cpp
echo 编译结束
pause

运行脚本能实现自动编译,不懂题目要求中的关于输出编译
后的代码是指什么,百度玩的结果就跟搜索的内容偏差挺大
认为是准备一个存有代码的txt后使用type a.txt显示文本
中的代码内容不过这就与题目的要求关系不大。
运行结果便是编译成功。
对于测试单元函数仅需测试how,Money_changer,Csum_N
fun以及Calculate函数剩余函数均可以通过输出结果观察函
数运行效果;
各测试函数内容如下:

#include<iostream>
#include<cstring>
using namespace std;
int how(char how_number[20])
{
	if (!strcmp(how_number, "减少"))return 0;
	else if(!strcmp(how_number, "增加"))return 1;
	return 2;
}
int main()
{
	char Plus[20],Minus[20];
	strcpy(Plus,"增加");
	strcpy(Minus,"减少"); 
	if(!(how(Plus)-1))cout << "测试正常"<<endl;
	if(!(how(Minus)-0))cout << "测试正常";
	cout <<endl; 
	return 0;
} 

Csum_Nfun和Calculate函数功能实际一致仅由于涉及不当
而分家增加函数不必要的长度

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
	if(!(strlen("一")-2))cout << "测试正常" << endl;
	if(!(strlen("二十")-4))cout << "测试正常" << endl;
	if(!(strlen("十九")-4))cout << "测试正常" << endl;
	if(!(strlen("三十九")-6))cout << "测试正常" << endl;
	if(!(strlen("一百零四")-8))cout << "测试正常" << endl;
	if(!(strlen("一百二十")-8))cout << "测试正常" << endl;
	if(!(strlen("一百二十九")-10))cout << "测试正常" << endl;
	if(!(strlen("负一")-4))cout << "测试正常" << endl;
	if(!(strlen("负十九")-6))cout << "测试正常" << endl;
	if(!(strlen("负二十")-6))cout << "测试正常" << endl;
	if(!(strlen("负九十九")-8))cout << "测试正常";
	cout << endl;
	return 0;
}
#include<iostream>
using namespace std;
int Money_changer(int num)
{
	if (num == -29)return 0;
	if (num == -46)return 1;
	if (num == -74)return 2;
	if (num == -56)return 3;
	if (num == -53)return 4;
	if (num == -50)return 5;
	if (num == -63)return 6;
	if (num == -58)return 7;
	if (num == -80)return 8;
	if (num == -66)return 9;
	if (num == -54)return 10;
	if (num == -72)return -1;
	return 100;
}
int main()
{
	if(!(Money_changer(-29)-0))cout << "测试正常" << endl;
	if(!(Money_changer(-46)-1))cout << "测试正常" << endl; 
	if(!(Money_changer(-74)-2))cout << "测试正常" << endl; 
	if(!(Money_changer(-56)-3))cout << "测试正常" << endl; 
	if(!(Money_changer(-53)-4))cout << "测试正常" << endl; 
	if(!(Money_changer(-50)-5))cout << "测试正常" << endl; 
	if(!(Money_changer(-63)-6))cout << "测试正常" << endl; 
	if(!(Money_changer(-58)-7))cout << "测试正常" << endl; 
	if(!(Money_changer(-80)-8))cout << "测试正常" << endl; 
	if(!(Money_changer(-66)-9))cout << "测试正常" << endl;
	if(!(Money_changer(-54)-10))cout << "测试正常" << endl; 
	if(!(Money_changer(-72)+1))cout << "测试正常";
		system("pause");
	return 0;  
}

测试脚本内容如下:

@echo off
title 测试脚本
echo 开始Csum_Nfun和Calculate函数测试
gcc Csum_Nfun和Calculate测试函数.cpp
call a.exe
echo 开始how函数测试
gcc how测试函数.cpp
call a.exe
echo Money_changer函数开始
gcc Money_changer测试函数.cpp
call a.exe
pause

运行结果如下:

posted @ 2020-02-14 14:22  Pekkanight  阅读(145)  评论(2编辑  收藏  举报