#2020面向对象寒假做业(二)html
这个做业属于哪里 | 2020面向对象程序设计 |
---|---|
这个做业在哪里 | 2020面向对象寒假做业二 |
- | 1.继续完成编程题 |
这个做业目标 | 2.新建一个github仓库,并把做业推送到该仓库 |
- | 3.发布博客 |
做业正文 | 2020面向对象寒假做业(二) |
参考文献 | 2020面向对象程序设计寒假做业2 题解 |
- | Windows批处理(cmd/bat)经常使用命令教程 |
##1.使用github desktop新建一个github仓库 | |
###(1)下载github desktop | |
###(2)注册信息,进入以下页面 | |
![]() |
|
###(3)点在右上角file,点击new repository,填入信息创建新仓库 | |
![]() |
|
###(4)进入仓库所在文件夹,把做业相关文件复制到该文件夹,再上传到仓库 | |
![]() |
##2.编程题 ·继续完成做业一的编程题。 ·优化架构,通常要求每一个函数长度不超过15行。 ·优化规范,尤为是命名规范。 ·制做一个编译脚本,运行该脚本能够编译你的代码,可选的脚本语言,python(2.7),windows批处理,powershell,shell。 ·进行单元测试,即测试每个函数,并制做一个测试脚本,运行该脚本能够进行测试,并显示测试结果。 ·在做业一编程题的基础上添加如下功能 ·经过命令行读取一个文件 ###(1)代码分块 ####error块:提示错误信息python
对输入error函数的数据进行判断,若是数据错误,输出错误提示信息若是数据正确,不执行任何操做。git
void error(int judge) { if(judge==1) printf("数据类型输入错误\n"); else if(judge==2) printf("数值输入错误,应属于零到十范围\n"); else if(judge==3) printf("数值总和必须在0~99范围\n"); else if(judge==4) printf("符号输入错误\n"); }
####num块:执行字符转为数字github
将输入num函数的字符进行判断,若是能转化成数字,则返回对应数字;若是不能转化成数字,则返回错误信息。shell
int num(char d[]) { if(!strcmp(d,"零")) return 0; else if(!strcmp(d,"一")) return 1; else if(!strcmp(d,"二")) return 2; else if(!strcmp(d,"三")) return 3; else if(!strcmp(d,"四")) return 4; else if(!strcmp(d,"五")) return 5; else if(!strcmp(d,"六")) return 6; else if(!strcmp(d,"七")) return 7; else if(!strcmp(d,"八")) return 8; else if(!strcmp(d,"九")) return 9; else if(!strcmp(d,"十")) return 10; else error(2); }
####judge块:符号判断编程
对输入judge函数的数据进行判断,若是是指定符号,则进行指定操做;若是不是指定符号,则返回错误信息。windows
int judge(int n ,char c[],char d[]) { if(!strcmp(c,"增长")) return n+num(d); else if(!strcmp(c,"减小")) return n-num(d); else error(4); }
####sum块:将最终数据转化成字符输出架构
将输入sum函数的最终数据转化成汉字输出。函数
void sum(int n) { char nums[10][4]={"零","一","二","三","四","五","六","七","八","九"}; if(n<10) printf("%s",nums[n]); else { int m=n%10; n=n/10; if(!strcmp(nums[n],"一")) printf("十%s",nums[m]); else printf("%s十%s",nums[n],nums[m]); } }
####calculate块:针对每一次的运算调用judge、sum、num块单元测试
对输入calculate函数的运算操做,调用相关函数,执行运算操做
void calculate(int coin) { char b[10],c[10],d[10]; while(2) { scanf("%s",b); if(!strcmp(b,"看看")) { if(coin>99) error(3); else sum(coin); break; } scanf("%s%s",c,d); coin = judge(coin,c,d); } }
####main块:打开输入信息文件,链接函数
负责打开包含输入信息的文件,做为主函数链接其余函数。
int main() { char file[100]; printf("请输入文件地址\n"); scanf("%s",file); freopen(file,"r",stdin); char a[10], b[10], c[10], d[10]; int coin; scanf("%s%s%s%s",a,b,c,d); getchar(); if(!strcmp(a,"整数")) { if(num(d)==-1) error(2); else { coin += num(d); } } else error(1); if(coin>99||coin<0) error(3); else { calculate(coin); } }
###(2)制做编译脚本
题目信息理解错,分析其余同窗做业(感谢大佬)以后,改用Windows批处理。
@echo off echo 请输入文件所在磁盘 set /p a= echo 正在转移到该磁盘 cd "%a%" echo 请输入文件所在路径 set /p b= echo 转移到文件路径 cd "%b%" echo 请输入文件名 set /p c= echo 编译开始 gcc "%c%" -o try.exe if exist "try.exe" echo 编译成功 if not exist "try.exe" echo 编译失败 pause
####问题: >【1】用Notepad++编译脚本,出现乱码状况 >【2】出现bat文件快速打开快速关闭状况 >【3】出现没法用变量a实现cd、if操做问题 ####解决方法: >【1】使用Windows自带的记事本 >【2】在文件中末尾添加pause语句 >【3】使用"%a%"格式解决 ###(3)测试脚本
继续使用Windows批处理制做简单测试脚本 ####单元测试模块选取 由于代码中num函数与judge函数,承担最重要的运算部分,故选取num函数与judge函数进行单元测试。 设计测试程序
#include<stdio.h> int num(char d[]) { if(!strcmp(d,"零")) return 0; else if(!strcmp(d,"一")) return 1; else if(!strcmp(d,"二")) return 2; else if(!strcmp(d,"三")) return 3; else if(!strcmp(d,"四")) return 4; else if(!strcmp(d,"五")) return 5; else if(!strcmp(d,"六")) return 6; else if(!strcmp(d,"七")) return 7; else if(!strcmp(d,"八")) return 8; else if(!strcmp(d,"九")) return 9; else if(!strcmp(d,"十")) return 10; else return -1; } int judge(char c[]) { if(!strcmp(c,"增长")) return 1; else if(!strcmp(c,"减小")) return 2; else return -1; } int main() { int a,i,k; char d[13][10]={"零","一","二","三","四","五","六","七","八","九","十","增长","减小"}; char c[13][10]={"0","我","真","的","好","菜","啊","!","十一","1","2","加上","-"}; for(i=0,k=1;i<13;i++) { if(k==1) printf("输入 %s ",d[i]); else printf("输入 %s ",c[i]); if(i<11) { if(k==1) a=num(d[i]); else a=num(c[i]); if(a!=-1) printf("number pass\n"); else printf("number error\n"); } else { if(k==1) a=judge(d[i]); else a=num(c[i]); if(a!=-1) printf("symbol pass\n"); else printf("symbol error\n"); } if(i==12&&k==1) { k++; i=0; printf("正确输入测试完毕,进行错误输入测试\n"); } if(k==2&&i==12) printf("全部输入测试完毕"); } }
编写测试脚本
@echo off cd d: echo 开始测试 text1.exe echo 测试结束 pause
测试结果展现 ###(3)经过命令行读取一个文件
使用C语言中的freopen()函数传入包含输入信息的文件,再执行后续操做 ####首先编写几个输入信息的文件
####运行C语言程序
####问题: 【1】使用fopen函数,显示错误信息 【2】使用正确的函数,地址输入错误 ####解决方法: 【1】使用freopen函数 【2】地址错误形式"E:\aa.txt",正确形式"E:\aa.txt"或者"E:/aa.txt" ###(4)完整代码
#include<stdio.h> #include<string.h> void error(int judge) { if(judge==1) printf("数据类型输入错误\n"); else if(judge==2) printf("数值输入错误,应属于零到十范围\n"); else if(judge==3) printf("数值总和必须在0~99范围\n"); else if(judge==4) printf("符号输入错误\n"); } int num(char d[]) { if(!strcmp(d,"零")) return 0; else if(!strcmp(d,"一")) return 1; else if(!strcmp(d,"二")) return 2; else if(!strcmp(d,"三")) return 3; else if(!strcmp(d,"四")) return 4; else if(!strcmp(d,"五")) return 5; else if(!strcmp(d,"六")) return 6; else if(!strcmp(d,"七")) return 7; else if(!strcmp(d,"八")) return 8; else if(!strcmp(d,"九")) return 9; else if(!strcmp(d,"十")) return 10; else return -1; } int judge(int n ,char c[],char d[]) { if(!strcmp(c,"增长")) return n+num(d); else if(!strcmp(c,"减小")) return n-num(d); else error(4); } void sum(int n) { char nums[10][4]={"零","一","二","三","四","五","六","七","八","九"}; if(n<10) printf("%s",nums[n]); else { int m=n%10; n=n/10; if(!strcmp(nums[n],"一")) printf("十%s",nums[m]); else printf("%s十%s",nums[n],nums[m]); } } void calculate(int coin) { char b[10],c[10],d[10]; while(2) { scanf("%s",b); if(!strcmp(b,"看看")) { if(coin>99) error(3); else sum(coin); break; } scanf("%s%s",c,d); coin = judge(coin,c,d); } } int main() { char file[100]; printf("请输入文件地址\n"); scanf("%s",file); freopen(file,"r",stdin); char a[10], b[10], c[10], d[10]; int coin; scanf("%s%s%s%s",a,b,c,d); getchar(); if(!strcmp(a,"整数")) { if(num(d)==-1) error(2); else { coin += num(d); } } else error(1); if(coin>99||coin<0) error(3); else { calculate(coin); } }
##总结:此次的做业我作了很长时间,从最开始的理解错题目,用Python在错误的方向上寻找解决办法,迟迟没有成果而放弃,再到如今的成功完成。我明白正确的方向比盲目的寻找更重要。 ##Windows批处理天下第一!