2020面向对象寒假作业(二)
这个作业属于哪里 | 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块:提示错误信息
对输入error函数的数据进行判断,如果数据错误,输出错误提示信息如果数据正确,不执行任何操作。
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块:执行字符转为数字
将输入num函数的字符进行判断,如果能转化成数字,则返回对应数字;如果不能转化成数字,则返回错误信息。
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函数的数据进行判断,如果是指定符号,则进行指定操作;如果不是指定符号,则返回错误信息。
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
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
#include
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);
}
}