面向对象程序设计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字符数组的转换,我发现少了一个’\0’的话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]='\0';
for(i=0;i<10;i++)
{
if(strcmp(a,hanzi[i])==0)
t+=i;
}
return t;
}
完整代码如下
#include
#include
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]='\0';
for(i=0;i<10;i++)
{
if(strcmp(a,hanzi[i])==0)
t+=i;
}
return t;
}
单元测试
制作编译脚本
话说这个做脚本真的完全看不懂。
我搜了一下资料资料,制作脚本可以用系统自带的记事本,输入windows批处理命令来进行操作。
然后脚本代码最后一定有一个pause,不然自动结束连图都截不到
然后文件名称后缀是.bat,编码需要ANSI,不然会出现一堆中文奇怪字体。
下面是我的编译过程
经过这个就会出现
测试函数
下面是我的第一个switch1函数的测试
#include
#include
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\n");
else
printf("false\n");
}
脚本代码如下
@echo off
echo 测试开始
gcc test1.cpp -o test1.exe
test1
echo 测试结束
pause
#include
#include
char hanzi[11][10]={"零","一","二","三","四","五","六","七","八","九","十"};
void switch2(int shu1)
{
int i;
for(i=0;i<=10;i++)
{
if(shu1==i)
printf("%s\n",hanzi[i]);
}
}
int main()
{
int a=10;
switch2(a);
}
脚本代码
@echo off
echo 测试开始
gcc 未命名1.cpp -o test.exe
test
echo 测试结束
pause
#include
#include
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]='\0';
for(i=0;i<10;i++)
{
if(strcmp(a,hanzi[i])==0)
t+=i;
}
return t;
}
int main()
{
char a[50]={"三十五"};
printf("%d\n",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("输入文件名称\n") ;
scanf("%s",p);
freopen(p,"r",stdin) ;