寒假作业2
这个作业属于哪个课程 | 2020年面向对象程序设计 |
---|---|
这个作业要求在哪里 | 寒假作业2 |
这个作业的目标 | 完善作业一代码、使用git建立github仓库、制作编译脚本、进行单元测试、添加文件读取功能 |
作业正文 | 寒假作业2 |
参考文献 | git教程、git上传文件教程、Windows批处理(cmd/bat)常用命令教程、freopen函数 |
实践题 | |
============= | |
新建一个github仓库,使用git,或者github desktop把接下去的编程题的代码及测试脚本传到这个仓库。 | |
请使用.gitignore文件忽略不要上传的文件。 |
-
在GitHub上创建仓库名为fzu-homework的仓库
-
安装运行Git
-
在Git上创建本地代码库fzu-homework
-
首先我们需要在github上找到和我们相连接的https链接,首先在github上创建一个代码仓库,创建好之后找到clone and download,如下图所示:
-
这个时候我们再按git上传文件教程上提示输入代码,最后系统会要求你输入你github的用户名和密码,如下图(脚本是我后来再上传的):
再上传脚本:
-
打开GitHub仓库可见代码成功上传:
再上传脚本:
编程题
- 继续完成作业一的编程题。
- 优化架构,一般要求每个函数长度不超过15行。
- 优化规范,尤其是命名规范。
- 制作一个编译脚本,运行该脚本可以编译你的代码,可选的脚本语言,python(2.7),windows批处理,powershell,shell。
- 在作业一编程题的基础上添加以下功能:通过命令行读取一个文件,然后运行这个文件。
优化代码
将代码不同功能部分更具体编写成几个函数:
- 1.读入是将汉字数字识别转换为可计算的数据——convert1函数,实现代码如下:
int convert1(char num[])
{
if (strcmp(num, "一") == 0)
return 1;
else if (strcmp(num, "二") == 0)
return 2;
else if (strcmp(num, "三") == 0)
return 3;
else if (strcmp(num, "四") == 0)
return 4;
else if (strcmp(num, "五") == 0)
return 5;
else if (strcmp(num, "六") == 0)
return 6;
else if (strcmp(num, "七") == 0)
return 7;
else if (strcmp(num, "八") == 0)
return 8;
else if (strcmp(num, "九") == 0)
return 9;
else if (strcmp(num, "零") == 0)
return 0;
else if (strcmp(num, "十") == 0)
return 10;
}
- 2.将数字0-10转换为中文的函数——convert2函数,实现代码如下:
char* convert2(int n)
{
if (n == 0) return "零";
else if (n == 1) return "一";
else if (n == 2) return "二";
else if (n == 3) return "三";
else if (n == 4) return "四";
else if (n == 5) return "五";
else if (n == 6) return "六";
else if (n == 7) return "七";
else if (n == 8) return "八";
else if (n == 9) return "九";
else if (n == 10) return "十";
}
- 3.由于中文对0-100数字的中文表达习惯的不同,所以我们需要将数字分成不同的区间,按不同的输出习惯进行输出——output函数,具体代码如下:
void output(int n)
{
if (n<=10)
{
printf("%s",convert2(n));
}
else if(n%10==0&&n<100)
{
printf("%s十",convert2(n/10));
}
else if (n<20)
{
n%=10;
printf("十%s",convert2(n));
}
else if (n<100)
{
printf("%s十%s", convert2(n/10),convert2(n%10));
}
}
- 4.对输入的数据计算以及其他部分功能的主函数,代码如下:
int main()
{
int result;
char a[10],name[10],b[10],c[10];
scanf("%s %s %s %s",a,name,b,c);
if(strcmp(a,"整数")!=0||strcmp(b,"等于")!=0)
{printf("输入错误\n");
return 0;
}
result=convert1(c);
while(1)
{
scanf ("%s ",name);
if(strcmp(name,"看看")!=0)
{
scanf("%s %s",b,c);
if(strcmp(b,"增加")==0)
{
result+=convert1(c);
}
else if(strcmp(b,"减少")==0)
{
result-=convert1(c);
}
}
else break;
}
output(result);
return 0;
}
- 5.总代码如下:
#include<stdio.h>
#include<string.h>
int convert1(char num[])
{
if (strcmp(num, "一") == 0)
return 1;
else if (strcmp(num, "二") == 0)
return 2;
else if (strcmp(num, "三") == 0)
return 3;
else if (strcmp(num, "四") == 0)
return 4;
else if (strcmp(num, "五") == 0)
return 5;
else if (strcmp(num, "六") == 0)
return 6;
else if (strcmp(num, "七") == 0)
return 7;
else if (strcmp(num, "八") == 0)
return 8;
else if (strcmp(num, "九") == 0)
return 9;
else if (strcmp(num, "零") == 0)
return 0;
else if (strcmp(num, "十") == 0)
return 10;
}
char* convert2(int n)
{
if (n == 0) return "零";
else if (n == 1) return "一";
else if (n == 2) return "二";
else if (n == 3) return "三";
else if (n == 4) return "四";
else if (n == 5) return "五";
else if (n == 6) return "六";
else if (n == 7) return "七";
else if (n == 8) return "八";
else if (n == 9) return "九";
else if (n == 10) return "十";
}
void output(int n)
{
if (n<=10)
{
printf("%s",convert2(n));
}
else if(n%10==0&&n<100)
{
printf("%s十",convert2(n/10));
}
else if (n<20)
{
n%=10;
printf("十%s",convert2(n));
}
else if (n<100)
{
printf("%s十%s", convert2(n/10),convert2(n%10));
}
}
int main()
{
int result;
char a[10],name[10],b[10],c[10];
scanf("%s %s %s %s",a,name,b,c);
if(strcmp(a,"整数")!=0||strcmp(b,"等于")!=0)
{printf("输入错误\n");
return 0;
}
result=convert1(c);
while(1)
{
scanf ("%s ",name);
if(strcmp(name,"看看")!=0)
{
scanf("%s %s",b,c);
if(strcmp(b,"增加")==0)
{
result+=convert1(c);
}
else if(strcmp(b,"减少")==0)
{
result-=convert1(c);
}
}
else break;
}
output(result);
return 0;
}
编译脚本
- 参考其他大佬同学的博客以及Windows批处理(cmd/bat)常用命令教程,先在记事本编写,而后转为bat格式,然后在菜单栏找到该文件运行即可,具体代码如下:
@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
运行结果如下图:
- 另外还有种方法是像示例脚本那样编写如下脚本,而后会生成名为lang的exe
gcc 1.cpp -o lang.exe
测试脚本
编写测试convert1函数的程序,代码如下:
#include <stdio.h>
#include <string.h>
int convert1(char num[])
{
if (strcmp(num, "一") == 0)
return 1;
else if (strcmp(num, "二") == 0)
return 2;
else if (strcmp(num, "三") == 0)
return 3;
else if (strcmp(num, "四") == 0)
return 4;
else if (strcmp(num, "五") == 0)
return 5;
else if (strcmp(num, "六") == 0)
return 6;
else if (strcmp(num, "七") == 0)
return 7;
else if (strcmp(num, "八") == 0)
return 8;
else if (strcmp(num, "九") == 0)
return 9;
else if (strcmp(num, "零") == 0)
return 0;
else if (strcmp(num, "十") == 0)
return 10;
}
void test(char* s, int a)
{
if (convert1(s)== a)
printf("pass\n");
else
printf("error\n");
}
int main(void)
{
test("九", 9);
test("零", 0);
test("一", 1);
test("十", 10);
test("五", 5);
test("六", 6);
test("七十七", 77);
test("silly", 99);
test("kobe", 66);
test("westbrook", 1);
test("TJT", 2);
return 0;
}
- 保存为test1.cpp,而后编写脚本如下(注意文件类型写exe而非cpp,不然没有测试结果):
@echo off
cd C:\Users\lenovo\Desktop
echo 开始测试
test1.exe
echo 测试结束
Pause
- 运行后结果如下图:
增加文件读取功能
-
编写1.txt内容如下:
-
通过百度和参考大佬们的博客,我知道需要用到freopen函数
freopen可以通过修改参数指针对应的结构的数据成员(真正的文件句柄)的方式,使该文件对象映射到新的文件,从而达到将特定值的文件指针重定向的效果。成功的时候返回参数文件指针。在一个地方重定向文件指针,其他使用该指针的代码操作的文件也会发生变化。该功能用于重定向标准输入输出很合适。 -
因此在main函数里添加如下代码:
printf("输入文件名\n");
char s[10];
scanf("%s",s);
freopen(s,"r",stdin);
- 运行后结果如下图:
反思总结
这些东西虽然有点麻烦,但是通过查资料和看大佬们的博客还是能学会的,总的来说这些东西还是很有意义的。