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

狂风中的少年 提交于 2020-02-14 14:45:11

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

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

这个作业属于哪个课程 2020年面向对象程序设计
这个作业要求在哪里 面向对象设计寒假作业3
这个作业的目标 继续完成作业二的编程题,优化架构,思考代码的拓展性,可以参考现有的编程语言,把这些适当的内容加入。
GITHUB仓库 JudgementZero

编程题要求:
优化架构,思考代码的拓展性,比如需要增加其他功能,
如选择,循环语句,参考现有的编程语言扩大数字范围,
支持负数。
在还未着手写相应拓展代码时想应拓展数字范围支持上
百上千上万,以及负数拓展,原函数拓展性属实差劲通
逐步判断输入汉字处理,以及对不同的数字得分类处理
每拓展范围便要求添加大量对拓展范围数字的处理,如
和对拓展范围内的汉字数字输入后逐个字进行转换属实
使得整体编写效率低下,全局变量定义过多导致难以调
试,最终也仅做到拓展到上百,以及负九十九内的负数
还是在大量删改添加的情况下也仅能拓展小范围。

#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

运行结果如下:

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!