面向对象程序设计寒假作业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
运行结果如下: