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
    

    运行结果如下:

  • 相关阅读:
    重构:以Java POI 导出EXCEL为例
    从源码角度看LinkedList一些基本操作(jdk1.7)
    OpenCV学习笔记(1)
    尝试实现手势控制计算机(持续跟进)
    神经网络学习笔记三——梯度检验、高级优化
    神经网络学习笔记二——反向传导
    神经网络学习笔记一——Neural Network
    C++ 指针和引用 吐血整理 Pointer&Reference
    BST 解析 (二)height and deletion
    BST 解析 (一)
  • 原文地址:https://www.cnblogs.com/pekkasuper/p/12307019.html
Copyright © 2011-2022 走看看