这个作业属于哪个课程 | https://edu.cnblogs.com/campus/fzu/2020OOP |
---|---|
这个作业要求在哪里 | https://edu.cnblogs.com/campus/fzu/2020OOP/homework/10231 |
这个作业的目标 | 1.继续完成作业1的编程题。 |
2.新建一个github仓库,并把作业推送到该仓库。 | |
3.发布博客。 | |
作业正文 | https://www.cnblogs.com/bamboo233/p/12241068.html |
其他参考文献 | 1.file:///C:/Program%20Files/Git/ReleaseNotes.html |
2.https://blog.csdn.net/bowen11233/article/details/85051325 | |
3.https://www.liaoxuefeng.com/wiki/896043488029600/896067074338496 | |
4.https://www.runoob.com/manual/git-guide/ | |
5.https://www.liaoxuefeng.com/wiki/896043488029600/896827951938304 | |
6.https://www.cnblogs.com/dingjiaoyang/p/9988734.html | |
7.https://www.jianshu.com/p/74bd0ceb6182 |
实践题
要求
- 新建一个GitHub仓库,使用git,或者github desktop把接下去的编程题的代码及测试脚本传到这个仓库.使用gitignore文件忽略不要上传的文件。
过程
- 首先了解git是什么
①Git是一个开源的分布式版本控制系统,可以有效、高速地处理从很小到非常大的项目版本管理。
②Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
③Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务器端软件支持。 - 安装git
- 使用git-bash创建新仓库——创建新文件夹,打开,然后执行git init,以创建新的仓库。
- 创建子目录homework_1和homework_2。
(因为平时.git目录是看不见的,用ls -ah可以查看) - 执行git add,将文件添加到仓库。
- 登陆GitHub打开“ssh key”页面,添加“ssh key”(要使用公钥)
- 在GitHub上创建一个新的仓库
忘了截图了 使用gitignore忽略不要上传的文件,在本仓库下使用git-bash,输入touch.gitignore创建.gitignore文件,注意,这里不能够先创建一个新的文件夹再改名为.gitignore文件,
不要问我为什么会知道,在仓库中找到空白的.gitignore文件进行编辑。百度学习 .gitignore的使用规则:
总结:全过程均学习廖雪峰老师的教程,本人也操作、尝试了很长时间,才磕磕绊绊的大致完成,虽然学到了挺多东西,但是过程一言难尽。看了很多教程,但是其中大部分都是我看不懂的。。。直到找到了廖雪峰老师的,才算是救了我一命。
编程题
要求
- 继续完成作业一的编程题。
- 优化架构,一般要求每个函数长度不超过15行。
- 优化规范,尤其是命名规范。
- 制作一个编译脚本,运行该脚本可以编译你的代码,可选的脚本语言,python(2.7),windows批处理,powershell,shell。
- 进行单元测试,即测试每一个函数,并制作一个测试脚本,运行该脚本可以进行测试,并显示测试结果。
- 添加以下功能: 通过命令行读取一个文件,然后运行这个文件。如我的程序叫lang,lang 1.txt代表我要运行1.txt这个文本中的代码。
1.优化(并没有) - 首先是输入的数字的情况(我写了三个转化函数,发现不太好命名,所以决定还是用change1,2,3来区分,再加注释。
- 因为我的思路是先判断输入字符串的长度,再决定调用哪个函数。
- 分三种情况,因为一个汉字占的长度是2,所以当len=2时,0<=数字<=10;当len=4时,可能是11-19或者是整十数;当len=6时,21<=数字<=99除整十数。
①len=2时,比较简单,就是最开始的情况
int change1(char a[]){
int n;
if(strcmp(a,"零")==0) n=0;
else if (strcmp(a,"一")==0) n=1;
else if (strcmp(a,"二")==0) n=2;
else if (strcmp(a,"三")==0) n=3;
else if (strcmp(a,"四")==0) n=4;
else if (strcmp(a,"五")==0) n=5;
else if (strcmp(a,"六")==0) n=6;
else if (strcmp(a,"七")==0) n=7;
else if (strcmp(a,"八")==0) n=8;
else if (strcmp(a,"九")==0) n=9;
else n=10;
return n;
}
②③一个汉字长度是2,所以在汉字判断上我有点问题,后来我写了一段简单代码,
int main(){
char a[10]="十四";
printf("%c%c",a[0],a[1]);
return 0;
所以对于输入的数字比十大时我还没找到解决方案。。。
- 输出时数字的转化也有三个函数,命名为switch1,2,3,分别表示输出结果在0-10,11-19,20-99的范围内;阿拉伯数字转汉字会比汉字转阿拉伯要简单。。。
①0-10时
void switch1(int n)//<=结果<=10
{
if(n==0) printf("零");
else if(n==1) printf("一");
else if(n==2) printf("二");
else if(n==3) printf("三");
else if(n==4) printf("四");
else if(n==5) printf("五");
else if(n==6) printf("六");
else if(n==7) printf("七");
else if(n==8) printf("八");
else if(n==9) printf("九");
if(n==10) printf("十");
}
②11-19时
void switch2(int n)//11<=结果<=19
{
if(n==1) printf("十一");
else if(n==2) printf("十二");
else if(n==3) printf("十三");
else if(n==4) printf("十四");
else if(n==5) printf("十五");
else if(n==6) printf("十六");
else if(n==7) printf("十七");
else if(n==8) printf("十八");
else if(n==9) printf("十九");
}
③20-99时
void switch3(int n){
int shiwei,gewei;
shiwei=n/10;
gewei=n%10;
if(gewei==0)//整十
{
switch1(shiwei);
printf("十");
}
else//十位不为1,个位不为0
{
switch1(shiwei);
printf("十");
switch2(gewei);
}
}
所以我能做的就只是让命名更加规范,函数架构更加合理而已
完整代码
#include
#include
int flag=1;
int n;
//对输入做处理 ,转为判断字符串长度
//当长度==2时,<=10;
//长度==4时,可能是11-20,或者是整十数;
//长度==6时,21-99除整十数;
int change1(char a[]){
int n;
if(strcmp(a,"零")==0) n=0;
else if (strcmp(a,"一")==0) n=1;
else if (strcmp(a,"二")==0) n=2;
else if (strcmp(a,"三")==0) n=3;
else if (strcmp(a,"四")==0) n=4;
else if (strcmp(a,"五")==0) n=5;
else if (strcmp(a,"六")==0) n=6;
else if (strcmp(a,"七")==0) n=7;
else if (strcmp(a,"八")==0) n=8;
else if (strcmp(a,"九")==0) n=9;
else n=10;
return n;
}
int input(char a[]){
int len,n;
len=strlen(a);
if(len==2){
n=change1(a);
}
}
//一下对输出做处理
void switch1(int n)//<=结果<=10
{
if(n==0) printf("零");
else if(n==1) printf("一");
else if(n==2) printf("二");
else if(n==3) printf("三");
else if(n==4) printf("四");
else if(n==5) printf("五");
else if(n==6) printf("六");
else if(n==7) printf("七");
else if(n==8) printf("八");
else if(n==9) printf("九");
if(n==10) printf("十");
}
void switch2(int n)//11<=结果<=19
{
if(n==1) printf("十一");
else if(n==2) printf("十二");
else if(n==3) printf("十三");
else if(n==4) printf("十四");
else if(n==5) printf("十五");
else if(n==6) printf("十六");
else if(n==7) printf("十七");
else if(n==8) printf("十八");
else if(n==9) printf("十九");
}
void switch3(int n){
int shiwei,gewei;
shiwei=n/10;
gewei=n%10;
if(gewei==0)//整十
{
switch1(shiwei);
printf("十");
}
else//十位不为1,个位不为0
{
switch1(shiwei);
printf("十");
switch1(gewei);
}
}
void output(int n){
if(n<=9){
switch1(n);
}
else if(n>=11&&n<=19){
n%=10;
switch2(n);
}
else{
switch3(n);
}
}
int main(){
int n;
char lei[10],rong[10],fu[10],shu[10],r2[10];//分别代表类别,容器,符号,数字
scanf("%s %s %s %s",lei,rong,fu,shu);
n=input(shu);
if(strcmp(lei,"整数")==0) {
if(strcmp(rong,"钱包")==0){
while(1){
scanf("%s",r2);
if(strcmp(r2,"钱包")==0) {
scanf("%s %s",fu,shu);
if(strcmp(fu,"增加")==0) n+=input(shu);
else n-=input(shu);
}
if(strcmp(r2,"看看")==0) break;
}
}
else flag=0; //标记变量不为“钱包”
}
else flag=0;//标记变量不为“整数”
if(flag==0) printf("error");
else output(n);
return 0;
}
- 制作编译脚本
先了解什么是脚本(一种纯文本保存的程序),然后在查阅资料以及参考同学的作业之后,用Windows批处理命令语句,将语句写在记事本或者写字板上,保存,修改名称,加后缀.bat就可以了
首先用的脚本是这样的
@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
不知道是是路径的问题还是其他什么问题(我没有找出来),一直是编译失败,给人弄到头大,还有就是用记事本的时候会出现乱码,用写字板的时候就不会,不懂为啥。百度之后,放弃了这两个,改用notepad++,并将notepad++的编码改成ANSI编码以及换了一个脚本,脚本如下,然后保存于zuoye.cpp所在的文件夹。要记得加.bat
@echo off
title 编译脚本
gcc zuoye.cpp -o zuoye.exe
if exist zuoye.exe echo 编译成功!
pause
- 进行单元测试
想法是将每一个需要测试的函数都写一个测试代码
@echo off
title 测试脚本
gcc test.cpp -o test.exe
test.exe
pause
在测试每个函数时把test改成相对应的名称即可
change1函数
#include
#include
int flag=1;
int n;
int change1(char a[]){
int n;
if(strcmp(a,"零")==0) n=0;
else if (strcmp(a,"一")==0) n=1;
else if (strcmp(a,"二")==0) n=2;
else if (strcmp(a,"三")==0) n=3;
else if (strcmp(a,"四")==0) n=4;
else if (strcmp(a,"五")==0) n=5;
else if (strcmp(a,"六")==0) n=6;
else if (strcmp(a,"七")==0) n=7;
else if (strcmp(a,"八")==0) n=8;
else if (strcmp(a,"九")==0) n=9;
else n=10;
return n;
}
int main(){
char shu[10];
scanf("%s",shu);
int n;
//scanf("%d",&n);
n=change1(shu);
printf("%d\n",n);
return 0;
}
我也不懂为啥名称会乱码,不想纠结了。。。 后面发现是编码没有改成ANSI的缘故,但是我已经贴图了,就不再修改了。。。
因为比十大的输入函数不完整,所以input函数的功能和change1函数的功能是一样的,就不再进行测试了。
switch1函数
后来我觉得改测试代码改来改去很麻烦,所以全都叫test
#include
#include
int flag=1;
int n;
void switch1(int n)//<=结果<=10
{
if(n==0) printf("零");
else if(n==1) printf("一");
else if(n==2) printf("二");
else if(n==3) printf("三");
else if(n==4) printf("四");
else if(n==5) printf("五");
else if(n==6) printf("六");
else if(n==7) printf("七");
else if(n==8) printf("八");
else if(n==9) printf("九");
if(n==10) printf("十");
}
int main(){
//char shu[10];
//scanf("%s",shu);
int n;
scanf("%d",&n);
switch1(n);
printf("\n");
return 0;
}
switch2函数
#include
#include
int flag=1;
int n;
void switch2(int n)//11<=结果<=19
{
if(n==1) printf("十一");
else if(n==2) printf("十二");
else if(n==3) printf("十三");
else if(n==4) printf("十四");
else if(n==5) printf("十五");
else if(n==6) printf("十六");
else if(n==7) printf("十七");
else if(n==8) printf("十八");
else if(n==9) printf("十九");
}
int main(){
//char shu[10];
//scanf("%s",shu);
int n;
scanf("%d",&n);
n%=10;
switch2(n);
printf("\n");
return 0;
}
switch3函数
#include
#include
int flag=1;
int n;
void switch1(int n)//<=结果<=10
{
if(n==0) printf("零");
else if(n==1) printf("一");
else if(n==2) printf("二");
else if(n==3) printf("三");
else if(n==4) printf("四");
else if(n==5) printf("五");
else if(n==6) printf("六");
else if(n==7) printf("七");
else if(n==8) printf("八");
else if(n==9) printf("九");
if(n==10) printf("十");
}
void switch2(int n)//11<=结果<=19
{
if(n==1) printf("十一");
else if(n==2) printf("十二");
else if(n==3) printf("十三");
else if(n==4) printf("十四");
else if(n==5) printf("十五");
else if(n==6) printf("十六");
else if(n==7) printf("十七");
else if(n==8) printf("十八");
else if(n==9) printf("十九");
}
void switch3(int n){
int shiwei,gewei;
shiwei=n/10;
gewei=n%10;
if(gewei==0)//整十
{
switch1(shiwei);
printf("十");
}
else//十位不为1,个位不为0
{
switch1(shiwei);
printf("十");
switch1(gewei);
}
}
int main(){
//char shu[10];
//scanf("%s",shu);
int n;
scanf("%d",&n);
switch3(n);
printf("\n");
return 0;
}
output函数实际上就是对switch1,2,3函数的不同情况的调用,所以就不进行测试了。
在测试或者编译的过程中,我对于要输入路径的还有问题,先用简单一些的测试代码,对于路径输入的还需要好好研究。
3.添加功能
在这一块上面也是弄了很久,然后知道了要用到freopen()函数来实现从特定文本中读取代码
freopen函数
freopen(“文件地址”,"r",stdin);
代码修改为
int main(){
freopen("C:\\Users\\LKH\\Desktop\\4\\1.txt","r",stdin);
int n;
char lei[10],rong[10],fu[10],shu[10],r2[10];//分别代表类别,容器,符号,数字
scanf("%s %s %s %s",lei,rong,fu,shu);
n=input(shu);
if(strcmp(lei,"整数")==0) {
if(strcmp(rong,"钱包")==0){
while(1){
scanf("%s",r2);
if(strcmp(r2,"钱包")==0) {
scanf("%s %s",fu,shu);
if(strcmp(fu,"增加")==0) n+=input(shu);
else n-=input(shu);
}
if(strcmp(r2,"看看")==0) break;
}
}
else flag=0; //标记变量不为“钱包”
}
else flag=0;//标记变量不为“整数”
if(flag==0) printf("error");
else output(n);
return 0;
}
但是代码修改成这样之后,运行的结果直接是error
然后,改成这样之后
int main() {
printf("请输入文件地址\n");
char s[100];
scanf("%s",s);
freopen(s,"r",stdin);
int main(int argc,char *argv[]) {
if(argc != 1){
freopen(argv[1],"r",stdin);
}
这三个全都是error,我也不知道要咋搞了,我看其他同学这样写都可以正确。。。