作业属于 | 2020年面向对象程序设计 |
作业要求 | 面向对象程序设计寒假作业2 |
作业目标 |
1.创建GitHub仓库,并上传文件 2.学习Windows批处理 3.使用Windows批处理编译代码 |
参考文献 |
1.使用github desktop新建一个github仓库
- 新建一个github仓库,使用git,或者github desktop把接下去的编程题的代码及测试脚本传到这个仓库。
- 请使用.gitignore文件忽略不要上传的文件。
由于之前已经创建过GitHub的账号, 安装了GitHub, 所以跳过这些步骤
(1)创建仓库
创建了一个名为"2020-opp"的仓库,将本次作业上传于此
(2)上传文件
右键文件夹, 点击Git bash here, 随后输入命令语句
git clone https://github.com/Es-war/2020-opp.git
创建成功后打开多出来的文件夹,把所需文件复制黏贴进去
继续输入命令 cd 2020-opp, 进入此文件夹
接下来依次输入以下代码即可完成其他剩余操作:
git add . (别省略".")
git commit -m "提交信息"
git push -u origin master
最后打开网页检查是否上传成功
2.编程题
·继续完成作业一的编程题。
·优化架构,一般要求每个函数长度不超过15行。
·优化规范,尤其是命名规范。
·制作一个编译脚本,运行该脚本可以编译你的代码,可选的脚本语言,python(2.7),windows批处理,powershell,shell。
·进行单元测试,即测试每一个函数,并制作一个测试脚本,运行该脚本可以进行测试,并显示测试结果。
·在作业一编程题的基础上添加以下功能
·通过命令行读取一个文件
(1)代码分块
error函数 |
在此函数中提示用户错误输入的类型
void error(int type) { switch ( type ) { case 1:printf("请输入正确数据 ");break; case 2:printf("请输入正确符号 ");break; case 3:printf("输入数值须在0~10内 ");break; case 4:printf("数值总和须在0~99范围内 "); } }
getValue函数 |
在此函数中对输入的金额进行由中文到阿拉伯数字的转换,包括第一次输入时的初始金额,和后续的钱包增加/减少操作中的转换. 在最开始的版本中,sum(钱包金额)值的增加减少我给它们各自定义了一个函数,后来发现没有这个必要,只要我输入的数据为零到十,可以直接调用getValue函数进行处理,这样也优化了代码的结构,减少代码冗余部分.
int getValue() { if (!strcmp("零", money)) return 0; else if ( !strcmp("一", money) ) return 1; else if ( !strcmp("二", money) ) return 2; else if ( !strcmp("三", money) ) return 3; else if ( !strcmp("四", money) ) return 4; else if ( !strcmp("五", money) ) return 5; else if ( !strcmp("六", money) ) return 6; else if ( !strcmp("七", money) ) return 7; else if ( !strcmp("八", money) ) return 8; else if ( !strcmp("九", money) ) return 9; else if ( !strcmp("十", money) ) return 10; else error(3); }
deal函数 |
在此函数中对用户输入的"钱包 增加"/ "钱包 减少"/ "看看 钱包"的行为进行判断处理, 根据具体行为具体操作
void deal() { for (;;) { scanf("%s", wallet); if ( !strcmp("钱包", wallet) ) { scanf("%s%s", sign, money); if ( !strcmp("增加", sign) ) sum += getValue(); else if ( !strcmp("减少", sign) ) sum -= getValue(); else error(2); } else if ( !strcmp("看看", wallet) ) { scanf("%s", wallet); break; } else error(1); } }
output函数 |
在此函数中定义了字符二维数组来保存"零一二三四五六七八九十"这些中文字符,根据下标便可轻松调用. 主要用于输出<10的数据,以及接下来被outputPlus函数的调用. 原先采用的是switch语句,但后来发现这样过于繁琐,所以这样改进.
void output(int num) { char figure[10][4] = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"}; printf("%s", figure[num]); }
outputPlus |
在此函数中,主要是对[10, 99]区间数据的输出进行处理, 较为特殊的数据为[10,19], 例如12, 按照日常表达习惯应为"十二", 而不是"一十二"
void outputPlus(int num) { int tensPlace, onesPlace; tensPlace = num / 10; onesPlace = num % 10; if ( tensPlace != 1 ) output(tensPlace); printf("十"); if ( onesPlace ) output(onesPlace); }
完整代码 |
#include<stdio.h> #include<string.h> char movement[10], wallet[10], sign[10], money[10]; int sum; void error(int type) { switch ( type ) { case 1:printf("请输入正确数据 ");break; case 2:printf("请输入正确符号 ");break; case 3:printf("输入数值须在0~10内 ");break; case 4:printf("数值总和须在0~99范围内 "); } } int getValue() { if (!strcmp("零", money)) return 0; else if ( !strcmp("一", money) ) return 1; else if ( !strcmp("二", money) ) return 2; else if ( !strcmp("三", money) ) return 3; else if ( !strcmp("四", money) ) return 4; else if ( !strcmp("五", money) ) return 5; else if ( !strcmp("六", money) ) return 6; else if ( !strcmp("七", money) ) return 7; else if ( !strcmp("八", money) ) return 8; else if ( !strcmp("九", money) ) return 9; else if ( !strcmp("十", money) ) return 10; else error(3); } void deal() { for (;;) { scanf("%s", wallet); if ( !strcmp("钱包", wallet) ) { scanf("%s%s", sign, money); if ( !strcmp("增加", sign) ) sum += getValue(); else if ( !strcmp("减少", sign) ) sum -= getValue(); else error(2); } else if ( !strcmp("看看", wallet) ) { scanf("%s", wallet); break; } else error(1); } } void output(int num) { char figure[10][4] = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"}; printf("%s", figure[num]); } void outputPlus(int num) { int tensPlace, onesPlace; tensPlace = num / 10; onesPlace = num % 10; if ( tensPlace != 1 ) output(tensPlace); printf("十"); if ( onesPlace ) output(onesPlace); } int main() { scanf("%s%s%s%s", movement, wallet, sign, money); sum = getValue(); deal(); if (sum < 10) output(sum); else if ( sum < 100 ) outputPlus(sum); else error (4); return 0; }
#不足:对于输入金额大于十的未能进行有效处理
(2)制作编译脚本
使用Windows批处理来制作编译器脚本
查阅相关资料,了解"脚本""编译器脚本""Windows批处理"等相关名词, 掌握主要的Windows批处理命令语句, 以及询问同学
(一开始, 我选择学习的脚本语言是shell, 看了一大半以后才发现原来shell是针对Linux系统的, 如果想在Windows下运行, 需下载专门的软件, 也比较麻烦. 后来了解到Git bash可以运行shell, 于是我跟着网上的教程进行操作, 但是不知道为什么老是出错, 我使用Windows自带的记事本进行编写shell指令, 然后另存为时修改后缀, 一开始总是出现闪退现象, 我一双击文件, 立马关闭, 后来我给它增加了sleep属性, 便于观察. 一番折腾后, 我最终选择Windows批处理.)
最后一句"pause"很重要, 有点类似于shell中的sleep吧(不知道有没有说错), 这可以让我们看到最终运行结果.
@echo off set /p a=请输入文件所在磁盘 cd "%a%" set /p b=请输入文件所在路径 cd "%b%" set /p c=请输入文件名 echo 编译开始 gcc "%c%" -o try.exe if exist "try.exe" echo 编译成功 if not exist "try.exe" echo 编译失败 pause
(3)测试脚本
测试脚本的编写与上述的编译脚本大同小异
测试脚本代码如下
@echo off cd C:/Users/Es war/C set /p a=请输入所要测试单元 echo 开始测试 "%a%" echo 测试结束 pause
error函数测试 |
#include<stdio.h> #include<string.h> char movement[10], wallet[10], sign[10], money[10]; int sum; void error(int type) { switch ( type ) { case 1:printf("请输入正确数据 ");break; case 2:printf("请输入正确符号 ");break; case 3:printf("输入数值须在0~10内 ");break; case 4:printf("数值总和须在0~99范围内 "); } } int main() { int i; for (i = 1; i < 5; i++) error(i); return 0; }
getValue函数测试 |
#include<stdio.h> #include<string.h> char movement[10], wallet[10], sign[10], money[10]; int sum; void error(int type) { switch ( type ) { case 1:printf("请输入正确数据 ");break; case 2:printf("请输入正确符号 ");break; case 3:printf("输入数值须在0~10内 ");break; case 4:printf("数值总和须在0~99范围内 "); } } int getValue() { if (!strcmp("零", money)) return 0; else if ( !strcmp("一", money) ) return 1; else if ( !strcmp("二", money) ) return 2; else if ( !strcmp("三", money) ) return 3; else if ( !strcmp("四", money) ) return 4; else if ( !strcmp("五", money) ) return 5; else if ( !strcmp("六", money) ) return 6; else if ( !strcmp("七", money) ) return 7; else if ( !strcmp("八", money) ) return 8; else if ( !strcmp("九", money) ) return 9; else if ( !strcmp("十", money) ) return 10; else error(3); } int main() { for (int i = 0; i<12; i++) { scanf("%s", money); sum = getValue(); printf("%d ", sum); } return 0; }
deal函数测试 |
#include<stdio.h> #include<string.h> char movement[10], wallet[10], sign[10], money[10]; int sum; void error(int type) { switch ( type ) { case 1:printf("请输入正确数据 ");break; case 2:printf("请输入正确符号 ");break; case 3:printf("输入数值须在0~10内 ");break; case 4:printf("数值总和须在0~99范围内 "); } } int getValue() { if (!strcmp("零", money)) return 0; else if ( !strcmp("一", money) ) return 1; else if ( !strcmp("二", money) ) return 2; else if ( !strcmp("三", money) ) return 3; else if ( !strcmp("四", money) ) return 4; else if ( !strcmp("五", money) ) return 5; else if ( !strcmp("六", money) ) return 6; else if ( !strcmp("七", money) ) return 7; else if ( !strcmp("八", money) ) return 8; else if ( !strcmp("九", money) ) return 9; else if ( !strcmp("十", money) ) return 10; else error(3); } void deal() { for (;;) { scanf("%s", wallet); if ( !strcmp("钱包", wallet) ) { scanf("%s%s", sign, money); if ( !strcmp("增加", sign) ) sum += getValue(); else if ( !strcmp("减少", sign) ) sum -= getValue(); else error(2); } else if ( !strcmp("看看", wallet) ) { scanf("%s", wallet); break; } else error(1); } } int main() { scanf("%s%s%s%s", movement, wallet, sign, money); sum = getValue(); deal(); printf("%d ", sum); return 0; }
output函数outputPlus函数测试 |
#include<stdio.h> #include<string.h> char movement[10], wallet[10], sign[10], money[10]; int sum; void error(int type) { switch ( type ) { case 1:printf("请输入正确数据 ");break; case 2:printf("请输入正确符号 ");break; case 3:printf("输入数值须在0~10内 ");break; case 4:printf("数值总和须在0~99范围内 "); } } void output(int num) { char figure[10][4] = {"零", "一", "二", "三", "四", "五", "六", "七", "八", "九"}; printf("%s", figure[num]); } void outputPlus(int num) { int tensPlace, onesPlace; tensPlace = num / 10; onesPlace = num % 10; if ( tensPlace != 1 ) output(tensPlace); printf("十"); if ( onesPlace ) output(onesPlace); } int main() { scanf("%d", &sum); if (sum < 10) output(sum); else if ( sum < 100 ) outputPlus(sum); else error (4); return 0; }
(4)添加功能
使C语言的freopen()函数即可
例如, 我要读入的文件名为"war.txt"
答案正确