寒假作业二

作业描述 详情
这个作业属于哪个课程 2020福大面向对象程序设计
这个作业要求在哪里 面向对象程序设计寒假作业二
这个作业的目标 a.新建github仓库,使用git或github desktop上传编程题代码及测试脚本到仓库
(使用.gitignore文件忽略不要上传的文件);
b.完成编程题,优化架构、规范;
c.制作编译脚本,运行脚本,编译代码;
d.进行单元测试,并制作测试脚本;
e.通过命令行读取文件,然后运行文件
作业正文 寒假作业二
其他参考文献 Git教程、Git忽略提交规则、Windows批处理

一、实践题

新建一个github仓库,使用git,或者github desktop把接下去的编程题的代码及测试脚本传到这个仓库。
请使用.gitignore文件忽略不要上传的文件

之前已经绑定用户名、邮箱(与github的相同)、配置ssh key、建立本地仓库,并关联了github的一个仓库
这里简单说一下流程

建立本地仓库

在本地建个文件夹,可以建几个空文件夹
打开Git Bash Here,进入项目目录
执行指令
git init
git add.
Git commit -m “提交文件”

关联github仓库

复制github要关联的一个仓库地址
执行指令 git remote add origin [email protected]:账户名/仓库名

上传代码及测试脚本

通过git上传,执行指令:git push -u origin master(第一次需要加参数-u,之后可以不用加)
其中用.gitignore忽略不上传的文件

寒假作业二_第1张图片

上传完的状态:
寒假作业二_第2张图片

二、编程题

编程题要求:

读题,提取出题目的要求。
分解需求,把需求分解为几个模块。
思考每个模块如何编写。
查阅资料。
对每个模块设计测试用例。

思考

首先定义初始值,之后进行加减运算,“看看”表示输出结果。
需考虑输入输出转换,以及计算过程的实现。
之前无法对初始值大于十的数进行转换,这次优化代码通过convert1函数进行转换,其中调用convert0函数进行单个数转换
代码中输出有三种情况:小于十的结果;整十的结果;大于十但不为整十的结果
代码问题:目前没有办法实现数量变量的错误输入判断

程序划分

汉字转换过程:通过两个函数实现
                 1.char num[11][3] = { "零","一","二","三","四","五","六","七","八","九","十" };作为转换桥梁
                 2.通过convert1函数把单个数转换成数字。
                 3.通过convert0函数分情况拆分输入的数,调用convert0转换成数字。
                 4.其中借助strcmp函数和strlen函数实现转换和情况拆分。

运算过程:通过opera函数实现
                 1.通过这个函数完成运算操作的输入。
                 2."增加"减少""乘以"除以"的运算编写。

还有部分输入以及输出过程:在主函数完成(其中还包括部分错误输入的排除)
                 输出过程同样进行情况拆分,并借助num字符串转换输出汉字

转化过程:

1.char num[11][3] = { "零","一","二","三","四","五","六","七","八","九","十" };

2.convert1函数

int convert1(char wen[])
{
    using namespace std;
    int z;
    for (z = 0; z < 11; z++){//通过for循环找到对应数字,进行转换
        if (strcmp(num[z], wen) == 0)
            return z;
    }
}

3.convert0函数

int convert0(char wen[])
{
    using namespace std;
    char c[10],d[10];//c,d是为了储存大于十的数量拆分出的数
    if (strlen(wen) == 2)//输入的是一位数的转换
        return convert1(wen);
    else if (strlen(wen) == 4){//输入的是两位数的转换,其中又分为十一~十九和大于十九且为整十的两种情况
        c[0] = wen[2];
        c[1] = wen[3];
        c[2] = '\0';//通过c储存个位上的数
        if (convert1(c) != 10) {//输入的是十一~十九的转换
            return convert1(c) + 10;}   
        else {//输入的是大于十九且为整十的转换
            c[0] = wen[0];
            c[1] = wen[1];
            c[2] = '\0';//通过c储存十位数的数
            return 10 * convert1(c);}   
    }
    else if (strlen(wen) == 6){//输入的是三位数的转换
        c[0] = wen[4];
        c[1] = wen[5];
        c[2] = '\0';//通过c储存个位数上的数
        d[0] = wen[0];
        d[1] = wen[1];
        d[2] = '\0';//通过d储存十位上的数
        return 10 * convert1(d) + convert1(c);
    }
}

4.opera函数

void opera(char x[])
{
    using namespace std;
    char m[20], n[20], s[20];
    while (1) {//通过while循环实现连续运算操作
        cin >> m;
        if (strcmp(m, "看看") == 0) break;//这里是对运算过程结束与否的判断,当输入"看看"时,运算结束
        if (strcmp(m, x) != 0) {//对运算对象错误输入的判断
            cout << "输入错误" << endl; break;}
        cin >> n >> s;//n为运算方式,s为变化量,接下来是运算的操作过程
        if (strcmp(n, "增加") == 0)
            integer = integer + convert0(s);
        else if (strcmp(n, "减少") == 0)
            integer = integer - convert0(s);
        else if (strcmp(n, "乘以") == 0)
            integer = integer * convert0(s);
        else if (strcmp(n, "除以") == 0)
            integer = integer / convert0(s);
        else {//对错误运算操作的反馈
            cout << "输入错误" << endl; break;}
    }
}

5.主函数

int main(void)
{
    using namespace std;
    char a[20], x[20], b[20], y[20], h[20];
    cin >> a >> x >> b >> y;
    if (strcmp(a, "整数") != 0 || strcmp(b, "等于") != 0)//对"整数""大于"错误输入与否的判断
        cout << "输入错误" << endl;
    integer = convert0(y);//将转换的值赋给integer
    opera(x);
    cin >> h;
    if (integer > 99 || integer < 0)//超出范围的结果
        cout << "超出范围";
    else if (integer >= 0 && integer < 11)//小于10的结果输出
        cout << num[integer];
    else if (integer > 11 && integer < 20)//11~19的结果输出
        cout << "十" << num[integer % 10];
    else if (integer > 19 && integer % 10 == 0)//整10(不含10)的结果输出
        cout << num[integer / 10] << "十";
    else if (integer > 19 && integer % 10 != 0)//大于19,且非整10
        cout << num[integer / 10] << "十" << num[integer % 10];
    return 0;
}

完整代码

#include
#include
char num[11][3] = { "零","一","二","三","四","五","六","七","八","九","十" };//储存要转换的几个量,用于汉字与数字间转换
int integer=0;

int convert1(char wen[])//将单个汉字转换成数字
{
    using namespace std;
    int z;
    for (z = 0; z < 11; z++){
        if (strcmp(num[z], wen) == 0)
            return z;
    }
    }
int convert0(char wen[])//将输入的数量转化成数字,其中调用了convert1函数
{
    using namespace std;
    char c[10],d[10];
    if (strlen(wen) == 2)//输入的是一位数
        return convert1(wen);
    else if (strlen(wen) == 4){输入的是两位数
        c[0] = wen[2];
        c[1] = wen[3];
        c[2] = '\0';
        if (convert1(c) != 10) {//输入的是十一~十九的情况 转换
            return convert1(c) + 10;}   
        else {//输入的是整十的情况 转换
            c[0] = wen[0];
            c[1] = wen[1];
            c[2] = '\0';
            return 10 * convert1(c);}   
    }
    else if (strlen(wen) == 6){//输入的是三位数
        c[0] = wen[4];
        c[1] = wen[5];
        c[2] = '\0';
        d[0] = wen[0];
        d[1] = wen[1];
        d[2] = '\0';
        return 10 * convert1(d) + convert1(c);
    }
}
void opera(char x[])//运算过程
{
    using namespace std;
    char m[20], n[20], s[20];
    while (1) {//用于循环输入运算操作
        cin >> m;
        if (strcmp(m, "看看") == 0) break;//输入到“看看”,结束循环,进入下一步
        if (strcmp(m, x) != 0) {//对运算对象的判断
            cout << "输入错误" << endl; break;}
        cin >> n >> s;
        if (strcmp(n, "增加") == 0)
            integer = integer + convert0(s);
        else if (strcmp(n, "减少") == 0)
            integer = integer - convert0(s);
        else if (strcmp(n, "乘以") == 0)
            integer = integer * convert0(s);
        else if (strcmp(n, "除以") == 0)
            integer = integer / convert0(s);
        else {//对错误运算操作的反馈
            cout << "输入错误" << endl; break;}
    }
}

int main(void)
{
    using namespace std;
    char a[20], x[20], b[20], y[20], h[20];
    cin >> a >> x >> b >> y;
    if (strcmp(a, "整数") != 0 || strcmp(b, "等于") != 0)
        cout << "输入错误" << endl;
    integer = convert0(y);
    opera(x);
    cin >> h;
    if (integer > 99 || integer < 0)
        cout << "超出范围";
    else if (integer >= 0 && integer < 11)
        cout << num[integer];
    else if (integer > 11 && integer < 20)
        cout << "十" << num[integer % 10];
    else if (integer > 19 && integer % 10 == 0)
        cout << num[integer / 10] << "十";
    else if (integer > 19 && integer % 10 != 0)
        cout << num[integer / 10] << "十" << num[integer % 10];
    return 0;
}

底下是几个测试结果
寒假作业二_第3张图片

寒假作业二_第4张图片

三、编译脚本以及测试脚本

刚开始没有对编码进行转换,之后运行出现乱码,后来改成ANSI就可以了
寒假作业二_第5张图片

1.编译脚本

@echo off
set line=-----------------------------------------------------------------------
echo 输入文件所在路径
set /p a=
cd "%a%"
echo 输入文件名
set /p b=
echo %line%
echo 编译开始
cl "%b%"
echo %line%
if exist "guwen.exe" echo 编译成功
if not exist "guwen.exe" echo 编译失败
pause

寒假作业二_第6张图片

2.单元测试脚本

这里对convert1和convert0进行测试

convert1测试代码

#include
#include
char num[11][3] = { "零","一","二","三","四","五","六","七","八","九","十" };

int convert1(char wen[])
{
    using namespace std;
    int z,i;
    for (z = 0,i=0; z < 11; z++,i++) {
        if (strcmp(num[z], wen) == 0) {
            return z; 
        }           
    }
}

int main()
{
    using namespace std;
    int x[12] = { 0,2,4,6,8,10,9,7,5,3,1 ,22};
    char y[12][9] = { "零","二","四","六","八","十","九","七","五","三","一","二十二" };
    int i, h = 0;
    for (i = 0; i < 12; i++) {
        if (x[i] == convert1(y[i])) {
            cout << y[i] << "   测试成功" << endl;
            h++;
        }
        else cout << y[i]    << "   测试失败,为异常测试数据" << endl;
    }
    cout << endl;
    if (h == 12)
        cout << "测试成功";
    else cout << "出现异常测试数据";
    return 0;
}

convert1测试脚本

@echo off
title 单元测试:convert1函数
set line=-----------------------------------------------------------------------
cd "C:\Users\Q sea\source\repos\convert1\convert1"
cl convert1.cpp
echo %line%
echo 测试开始
convert1.exe
echo %line%
pause

寒假作业二_第7张图片

convert0测试代码

#include
#include
char num[11][3] = { "零","一","二","三","四","五","六","七","八","九","十" };
int integer = 0;

int convert1(char wen[])
{
    using namespace std;
    int z;
    for (z = 0; z < 11; z++) {
        if (strcmp(num[z], wen) == 0)
            return z;
    }
}
int convert0(char wen[])
{
    using namespace std;
    char c[10], d[10];
    if (strlen(wen) == 2)
        return convert1(wen);
    else if (strlen(wen) == 4) {
        c[0] = wen[2];
        c[1] = wen[3];
        c[2] = '\0';
        if (convert1(c) != 10) {
            return convert1(c) + 10;
        }
        else {
            c[0] = wen[0];
            c[1] = wen[1];
            c[2] = '\0';
            return 10 * convert1(c);
        }
    }
    else if (strlen(wen) == 6) {
        c[0] = wen[4];
        c[1] = wen[5];
        c[2] = '\0';
        d[0] = wen[0];
        d[1] = wen[1];
        d[2] = '\0';
        return 10 * convert1(d) + convert1(c);
    }
}

int main(void)
{
    using namespace std;
    int x[20] = { 7,17,70,77,110 };
    char y[17][10] = { "七","十七","七十","七十七","一百一十" };
    int i,j=0, h = 0;
    for (i = 0; i < 5; i++) {
        if (x[i] == convert0(y[i])) {
            cout << y[i] << "       测试成功" << endl;
            h++;
        }
        else 
            cout << y[i] << "   测试失败,为异常测试数据" << endl;          
    }
    cout << endl;
    if (h == 5)
        cout << "测试通过,无异常数据" << endl;
    else cout << "出现异常测试数据" << endl;
}

convert0测试脚本

@echo off
title 单元测试:convert0函数
set line=-----------------------------------------------------------------------
cd "C:\Users\Q sea\source\repos\convert0\convert0"
cl convert0.cpp
echo %line%
echo 测试开始
convert0.exe
echo %line%
pause

寒假作业二_第8张图片

四、命令行读取并运行文件
要求:在作业一编程题的基础上添加以下功能:

通过命令行读取一个文件,然后运行这个文件。如我的程序叫lang,lang 1.txt代表我要运行1.txt这个文本中的代码。
假设我的1.txt内容如下:
整数 钱包 等于 零
钱包 增加 四
钱包 减少 三
看看 钱包
输入lang 1.txt后,命令行输出一。

代码如下:
其中用了freopen_s函数,一开始查阅了资料,用freopen函数,但是在编译时,VS报错,并警告,建议我换成freopen_s

int main(void)
{
    FILE* stream;
    char file[200];
    using namespace std;
    cin >> file;
    freopen_s(&stream, "file", "r", stdin);
    char a[20], x[20], b[20], y[20], h[20];
    cin >> a >> x >> b >> y;
    if (strcmp(a, "整数") != 0 || strcmp(b, "等于") != 0)
        cout << "输入错误" << endl;
    integer = convert0(y);
    opera(x);
    cin >> h;
    if (integer > 99 || integer < 0)
        cout << "超出范围";
    else if (integer >= 0 && integer < 11)
        cout << num[integer];
    else if (integer > 11 && integer < 20)
        cout << "十" << num[integer % 10];
    else if (integer > 19 && integer % 10 == 0)
        cout << num[integer / 10] << "十";
    else if (integer > 19 && integer % 10 != 0)
}

寒假作业二_第9张图片

可以在VS的解决方案->资源文件添加要测试的输入文本

寒假作业二_第10张图片

测试结果如下
寒假作业二_第11张图片

你可能感兴趣的:(寒假作业二)