zoukankan      html  css  js  c++  java
  • 面向对象程序设计寒假作业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
    

    运行结果如下:

  • 相关阅读:
    关于在MAC上进行 LARAVEL 环境 Homestead 安装过程记录
    js 贷款计算器
    js 实现阶乘
    js 两点间距离函数
    composer Your requirements could not be resolved to an installable set of packages
    vue 项目优化记录 持续更新...
    vue 项目打包
    vue 真机调试页面出现空白
    vue 真机调试
    谈谈-Android状态栏的编辑
  • 原文地址:https://www.cnblogs.com/pekkasuper/p/12307019.html
Copyright © 2011-2022 走看看