Fork me on GitHub

寒假作业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;
}

编译脚本

@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);
  • 运行后结果如下图:

反思总结

这些东西虽然有点麻烦,但是通过查资料和看大佬们的博客还是能学会的,总的来说这些东西还是很有意义的。

posted @ 2020-02-04 20:32  TJThunder  阅读(246)  评论(0编辑  收藏  举报