2020面向对象程序设计寒假作业2

这个作业属于哪个课程 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,以创建新的仓库。
    2020面向对象程序设计寒假作业2_第1张图片
  • 创建子目录homework_1和homework_2。
    2020面向对象程序设计寒假作业2_第2张图片
    (因为平时.git目录是看不见的,用ls -ah可以查看)
  • 执行git add,将文件添加到仓库。
    2020面向对象程序设计寒假作业2_第3张图片
  • 登陆GitHub打开“ssh key”页面,添加“ssh key”(要使用公钥)
    2020面向对象程序设计寒假作业2_第4张图片
    2020面向对象程序设计寒假作业2_第5张图片
  • 在GitHub上创建一个新的仓库 忘了截图了
  • 把本地仓库内容推送到远程仓库
    2020面向对象程序设计寒假作业2_第6张图片
    2020面向对象程序设计寒假作业2_第7张图片

  • 使用gitignore忽略不要上传的文件,在本仓库下使用git-bash,输入touch.gitignore创建.gitignore文件,注意,这里不能够先创建一个新的文件夹再改名为.gitignore文件,不要问我为什么会知道,在仓库中找到空白的.gitignore文件进行编辑。百度学习 .gitignore的使用规则:
    2020面向对象程序设计寒假作业2_第8张图片

还是看不懂?没有关系,给出了示例:
2020面向对象程序设计寒假作业2_第9张图片

总结:全过程均学习廖雪峰老师的教程,本人也操作、尝试了很长时间,才磕磕绊绊的大致完成,虽然学到了挺多东西,但是过程一言难尽。看了很多教程,但是其中大部分都是我看不懂的。。。直到找到了廖雪峰老师的,才算是救了我一命。

编程题

要求

  • 继续完成作业一的编程题。
  • 优化架构,一般要求每个函数长度不超过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;

这段代码的输出让我不知咋搞。。
2020面向对象程序设计寒假作业2_第10张图片

所以对于输入的数字比十大时我还没找到解决方案。。。

  • 输出时数字的转化也有三个函数,命名为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

2020面向对象程序设计寒假作业2_第11张图片
2020面向对象程序设计寒假作业2_第12张图片
双击new 1,就可以发现:
2020面向对象程序设计寒假作业2_第13张图片

  • 进行单元测试
    想法是将每一个需要测试的函数都写一个测试代码
@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; 
} 

2020面向对象程序设计寒假作业2_第14张图片
我也不懂为啥名称会乱码,不想纠结了。。。 后面发现是编码没有改成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; 
} 

2020面向对象程序设计寒假作业2_第15张图片

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; 
} 

2020面向对象程序设计寒假作业2_第16张图片

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; 
} 

2020面向对象程序设计寒假作业2_第17张图片

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
2020面向对象程序设计寒假作业2_第18张图片
然后,改成这样之后

int main() {
    printf("请输入文件地址\n"); 
    char s[100];
    scanf("%s",s);
    freopen(s,"r",stdin); 

仍是error
2020面向对象程序设计寒假作业2_第19张图片
然后,现在是第三个版本

int main(int argc,char *argv[]) {
    if(argc != 1){
        freopen(argv[1],"r",stdin);
    }

还是error
2020面向对象程序设计寒假作业2_第20张图片

这三个全都是error,我也不知道要咋搞了,我看其他同学这样写都可以正确。。。

你可能感兴趣的:(2020面向对象程序设计寒假作业2)