第二次作业

面向对象程序设计2020第二次作业

这个作业属于哪个课程 2020面向对象程序设计张栋班
这个作业要求在哪里 面向对象程序设计寒假作业2
这个作业的目标 熟悉github仓库的使用,对前一次的编程题目进行优化 制作脚本
作业正文 第二次作业
其它参考文献 命名规范 编写批处理文件 批处理常用命令 freopen

一.编程题

实践题

1.先下载一个github desktop如下

在file那里有个 new responsibility即可创建

把作业文件放进本地的仓库里

然后就会出现

在github上就会找的到了

编程题

继续完成作业一的编程题。
对于命名规范,参考了文献,有驼峰命令法,匈牙利命名法,帕斯卡(pascal)命名法。但是这个我真的改不动,不知道如何下手,还要继续学习。
优化架构,一般要求每个函数长度不超过15行。
优化规范,尤其是命名规范。
制作一个编译脚本
我在原来的基础上,并没有考虑到输入会有几十,几十几这样的输入,而输出可以增加到几百,上千的我就没有去考虑了。
下面是我的三个函数
1.对于输入的个转换成十位数字位数字

int switch1(char shu[])
{
    int i;
    for(i=0;i<=10;i++)
    {
    	if(strcmp(hanzi[i],shu)==0)
    	return i;
	}
}

2.对于单个字符转换成汉字

int switch1(char shu[])
{
    int i;
    for(i=0;i<=10;i++)
    {
    	if(strcmp(hanzi[i],shu)==0)
    	return i;
	}
}

3.对于输入几十的输入,这个我还没有想到要怎么缩短,感觉都挺重要的,有个很奇怪的问题,对我与我a字符数组的转换,我发现少了一个’’的话strcmp函数判断的结果会有偏差,因为字符数组后面也会自动补吧,然后strcmp考虑进去了所以我卡了挺久的。

int switch3(char shu[]) 
{
	int i,t=0,j;	char a[50];
	for(i=0;i<=10;i++)
    {
    	if(strncmp(hanzi[i],shu,2)==0)
    	{
    	t=t+i*10;   break;
        }
	}
	for(j=0;j<2;j++)
	{
	if(strlen(shu)>5) 	a[j]=shu[j+4];
	else 	a[j]=shu[j+2];
    }
    a[2]='';
	for(i=0;i<10;i++)
	{
		if(strcmp(a,hanzi[i])==0)
		t+=i;
	}
	return t;
}

完整代码如下

#include<stdio.h>
#include<string.h>
char hanzi[11][10]={"零","一","二","三","四","五","六","七","八","九","十"};
int switch1(char shu[]);
void switch2(int shu1);
int switch3(char shu[]);
int main()
{
    char a[50], b[50], c[50], d[50];
    int n,s,i,t;
    char e[50], f[50], g[50],h[50];
    scanf("%s %s %s %s", a, b, c, d);
    if (strcmp("整数", a) == 0)
    {
        if (strcmp("等于", c) == 0)
        {
            n = switch1(d);
    while(1)
    {
        scanf("%s",e);
        if(strcmp("看看",e)==0)
        break;
        scanf("%s %s",f,g);
        if(strcmp("增加", f) != 0&&strcmp("减少",f) != 0)
        {
            printf("Error!");
            break;
        }
        if (strcmp("增加", f) == 0&&strlen(g)<3)
        {
            n += switch1(g);
        }
        else if(strcmp("增加", f) == 0&&strlen(g)>3)
        {
        	n += switch3(g);
		}
        if (strcmp("减少",f) == 0&&strlen(g)<3)
        {
            n -= switch1(g);
        }
        else if(strcmp("减少", f) == 0&&strlen(g)>3)
        {
        	n -= switch3(g);
		}
    }
    scanf("%s",h);
    if (strcmp("看看", e) == 0)
    {
        if (n <= 10)
        {
            switch2(n);
        }
        else if (n > 10&&n<100)
        {
            if (n % 10 == 0)
            {
                s = n / 10;
                switch2(s);
                printf("十");
            }
            else
            {
                s = n / 10;
                i = n % 10;
                switch2(s);
                printf("十");
                switch2(i);
            }
        }
        else if(n>=100)
        {
        	if(n%100==0)
        	{
        		s = n / 100;
                switch2(s);
                printf("百");
			}
			else if(n%100!=0&&n%10==0)
			{
				s=n/100;
				switch2(s);
				printf("百");
				i=n/10%10;
				switch2(i);
				printf("十");
			}
			else
			{
				s=n/100;
				switch2(s);
				printf("百");
				i=n/10%10;
				switch2(i);
				printf("十");
				t=n%100;
				switch2(t);
			}
		}
    }
    } 
    else
    printf("Error!");
    } 
    else
    printf("Error!");
    return 0;
}
int switch1(char shu[])
{
    int i;
    for(i=0;i<=10;i++)
    {
    	if(strcmp(hanzi[i],shu)==0)
    	return i;
	}
}
void switch2(int shu1)
{
    int i;
    for(i=0;i<=10;i++)
    {
    	if(shu1==i)
    	printf("%s",hanzi[i]);
	}
}
int switch3(char shu[]) 
{
	int i,t=0,j;	char a[50];
	for(i=0;i<=10;i++)
    {
    	if(strncmp(hanzi[i],shu,2)==0)
    	{
    	t=t+i*10;   break;
        }
	}
	for(j=0;j<2;j++)
	{
	if(strlen(shu)>5) 	a[j]=shu[j+4];
	else 	a[j]=shu[j+2];
    }
    a[2]='';
	for(i=0;i<10;i++)
	{
		if(strcmp(a,hanzi[i])==0)
		t+=i;
	}
	return t;
}

单元测试

制作编译脚本

话说这个做脚本真的完全看不懂。
我搜了一下资料资料,制作脚本可以用系统自带的记事本,输入windows批处理命令来进行操作。
然后脚本代码最后一定有一个pause,不然自动结束连图都截不到

然后文件名称后缀是.bat,编码需要ANSI,不然会出现一堆中文奇怪字体。

下面是我的编译过程

经过这个就会出现

测试函数

下面是我的第一个switch1函数的测试

#include<stdio.h>
#include<string.h>
char hanzi[11][10]={"零","一","二","三","四","五","六","七","八","九","十"};
int switch1(char shu[])
{
    int i;
    for(i=0;i<=10;i++)
    {
    	if(strcmp(hanzi[i],shu)==0)
    	return i;
	}
}
int main()
{
	int i,b;
	char a[50]={"十"};
	b=switch1(a);
	if(b==10)
	printf("true
");
	else
	printf("false
");
 } 

脚本代码如下

@echo off
echo 测试开始
gcc test1.cpp -o test1.exe
test1
echo 测试结束
pause


结果是这样。
接下来第二个函数
测试代码如下

#include<stdio.h>
#include<string.h>
char hanzi[11][10]={"零","一","二","三","四","五","六","七","八","九","十"};
void switch2(int shu1)
{
    int i;
    for(i=0;i<=10;i++)
    {
    	if(shu1==i)
    	printf("%s
",hanzi[i]);
	}
}
int main()
{
	int a=10;
	switch2(a);
} 

脚本代码

@echo off
echo 测试开始
gcc 未命名1.cpp -o test.exe
test
echo 测试结束
pause


第三个函数

#include<stdio.h>
#include<string.h>
char hanzi[11][10]={"零","一","二","三","四","五","六","七","八","九","十"};
int switch3(char shu[]) 
{
	int i,t=0,j;	char a[50];
	for(i=0;i<=10;i++)
    {
    	if(strncmp(hanzi[i],shu,2)==0)
    	{
    	t=t+i*10;   break;
        }
	}
	for(j=0;j<2;j++)
	{
	if(strlen(shu)>5) 	a[j]=shu[j+4];
	else 	a[j]=shu[j+2];
    }
    a[2]='';
	for(i=0;i<10;i++)
	{
		if(strcmp(a,hanzi[i])==0)
		t+=i;
	}
	return t;
}
int main()
{
	char a[50]={"三十五"};
	printf("%d
",switch3(a));
} 

脚本代码

@echo off
echo 测试开始
gcc test3.cpp -o test3.exe
test3
echo 测试结束
pause

结果

增加功能

这个瞄了别的大佬的博客才知道要用freopen函数来实现

形参说明:
filename:需要重定向到的文件名或文件路径。
mode:代表文件访问权限的字符串。例如,"r"表示“只读访问”、"w"表示“只写访问”、"a"表示“追加写入”。
stream:需要被重定向的文件流。
返回值:如果成功,则返回该指向该输出流的文件指针,否则返回为NULL。
参考文献在上面

下面是我的测试文件


这是增加的,freopen中的r代表的是只读写入,接下来只要写上文件名就不用管汉字的输入了,直接得出结果。

        char p[100];
	printf("输入文件名称
") ;
	scanf("%s",p);
	freopen(p,"r",stdin) ;
原文地址:https://www.cnblogs.com/Misanthropel/p/12242947.html