这个作业属于哪个课程 | 2020年面向对象程序设计 |
---|---|
这个作业要求在哪里 | 寒假作业2 |
作业正文 | 实践题 编程题 |
参考文献 | GitHub Desktop |
实践题
安装好GitHub Desktop后,选择File->New repository后填上信息。
之后找到路径,并将文件放入其中,再次点击GitHub Desktop即可发现文件已被放入。
然后点击Commit to master提交即可。
编程题
在作业1中,我只考虑到了输入为单个数字的时候,忽略了“十几”“几十”“几十几”的情况。查阅资料得,因为输入输出均为GBK编码,而GBK编译一个汉字占两个字节,于是可以通过对所占字节的大小来判断输入输出的形式。
假设d[10]是输入的字符串,则对d进行所占字节的判断:
①当d占两个字节,即输入形式类似于“零一二”时:
if (strlen(d) == 2) sum = change1(d);/*change1函数是将输入的白话文数字转化为阿拉伯数字*/
②当d占四个字节时,有两种情况,一是输入形式为“十几”,二是输入形式为“几十”:
if (strlen(d) == 4)
{
i[0] = d[0];
i[1] = d[1];
i[2] = '\0';
if (change1(i) == 10) //输入形式为“十几”时
{
i[0] = d[2];
i[1] = d[3];
i[2] = '\0';
sum = 10 + change1(i);
}
else //输入形式为“几十”时
{
sum = change1(i) * 10;
}
}
③当d占六个字节,即输入形式为“几十几”时:
if (strlen(d) == 6)
{
i[0] = d[0];
i[1] = d[1];
i[2] = '\0';
sum = change1(i) * 10;
i[0] = d[4];
i[1] = d[5];
sum = sum + change1(i);
}
再在所需之处用上以上三种情况,就可以考虑到当输入范围在(零~九十九)之间的数了。
完整代码如下:
#include
#include
int main()
{
int sum,k;
int change1(char d[10]);
void change2(int sum);
char a[10], b[10], c[10], d[10],e[10],f[10],g[10],h[10],i[10],j[10];
scanf("%s %s %s %s", a, b, c, d);
if (strcmp("整数", a) == 0 && strcmp("钱包", b) == 0 && strcmp("等于", c) == 0)
{
if (strlen(d) == 2) sum = change1(d);
if (strlen(d) == 4)
{
i[0] = d[0];
i[1] = d[1];
i[2] = '\0';
if (change1(i) == 10)
{
i[0] = d[2];
i[1] = d[3];
i[2] = '\0';
sum = 10 + change1(i);
}
else
{
sum = change1(i) * 10;
}
}
if (strlen(d) == 6)
{
i[0] = d[0];
i[1] = d[1];
i[2] = '\0';
sum = change1(i) * 10;
i[0] = d[4];
i[1] = d[5];
sum = sum + change1(i);
}
}
scanf("%s", e);
while(strcmp("钱包", e) == 0)
{
scanf("%s %s", f, g);
if (strcmp("增加", f) == 0)
{
if (strlen(g) == 2)
sum = sum + change1(g);
if (strlen(g) == 4)
{
i[0] = g[0];
i[1] = g[1];
i[2] = '\0';
if (change1(i) == 10)
{
i[0] = g[2];
i[1] = g[3];
i[2] = '\0';
sum = sum+10 + change1(i);
}
else
{
sum = sum+change1(i) * 10;
}
}
if (strlen(g) == 6)
{
i[0] = g[0];
i[1] = g[1];
i[2] = '\0';
k = change1(i) * 10;
i[0] = g[4];
i[1] = g[5];
k = k + change1(i);
sum = sum + k;
}
}
if (strcmp("减少", f) == 0)
{
if (strlen(g) == 2)
sum = sum - change1(g);
if (strlen(g) == 4)
{
i[0] = g[0];
i[1] = g[1];
i[2] = '\0';
if (change1(i) == 10)
{
i[0] = g[2];
i[1] = g[3];
i[2] = '\0';
sum = sum - 10 - change1(i);
}
else
{
sum = sum - change1(i) * 10;
}
}
if (strlen(g) == 6)
{
i[0] = g[0];
i[1] = g[1];
i[2] = '\0';
k = change1(i) * 10;
i[0] = g[4];
i[1] = g[5];
k = k + change1(i);
sum = sum - k;
}
}
scanf("%s", e);
}
if (strcmp("看看", e) == 0)
{
scanf("%s", h);
if (strcmp("钱包", h) == 0)
{
if (sum >= 0 && sum <= 10)
{
change2(sum);
}
else if (sum > 10 && sum < 20)
{
printf("十");
change2(sum);
}
else if (sum % 10 == 0 && sum >= 20)
{
change2(sum);
printf("十");
}
else
{
change2(sum / 10);
printf("十");
change2(sum % 10);
}
}
}
return 0;
}
int change1(char d[ ])
{
int sum;
if (strcmp("零", d) == 0)
sum = 0;
if (strcmp("一", d) == 0)
sum = 1;
if (strcmp("二", d) == 0)
sum = 2;
if (strcmp("三", d) == 0)
sum = 3;
if (strcmp("四", d) == 0)
sum = 4;
if (strcmp("五", d) == 0)
sum = 5;
if (strcmp("六", d) == 0)
sum = 6;
if (strcmp("七", d) == 0)
sum = 7;
if (strcmp("八", d) == 0)
sum = 8;
if (strcmp("九", d) == 0)
sum = 9;
if (strcmp("十", d) == 0)
sum = 10;
return (sum);
}
void change2(int sum)
{
switch (sum)
{
case 0:printf("零"); break;
case 1:printf("一"); break;
case 2:printf("二"); break;
case 3:printf("三"); break;
case 4:printf("四"); break;
case 5:printf("五"); break;
case 6:printf("六"); break;
case 7:printf("七"); break;
case 8:printf("八"); break;
case 9:printf("九"); break;
case 10:printf("十"); break;
}
}
测试结果:
不足之处:
虽然考虑了比之前更多的情况,但是方法不够简便,需要每次判断一遍,所以使得代码不够简洁,无法达到每个函数的行数在15行之内。
命名规范我上网查阅,发现有很多(下划线命名法等),但是能力有限,还没掌握。
制作一个编译脚本,运行该脚本可以编译你的代码,可选的脚本语言,python(2.7),windows批处理,powershell,shell。
示例脚本:
gcc 1.cpp -o lang.exe
这一部分真的好难,查阅了资料后还是选择用Windows批处理。
以下是我写的脚本代码:
写完后另存为.bat文件,注意编码要选择ANSI,不然点击时会出现一串很奇怪的文字。我将自己的代码保存至桌面,命名为after.cpp
输入atfer.cpp后弹出编译成功。
进行单元测试,即测试每一个函数,并制作一个测试脚本,运行该脚本可以进行测试,并显示测试结果。
示例脚本:
gcc 1.cpp test.cpp -o test.exe
test
我测试了两个函数,一是将白话文数字转化为阿拉伯数字,二是将阿拉伯数字转化为白话文数字。
脚本代码如下:
①:将白话文数字转化为阿拉伯数字。
单元代码
#include
#include
int main()
{
void change2(int sum);
int a = 7;
change2(a);
return 0;
}
void change2(int sum)
{
switch (sum)
{
case 0:printf("零"); break;
case 1:printf("一"); break;
case 2:printf("二"); break;
case 3:printf("三"); break;
case 4:printf("四"); break;
case 5:printf("五"); break;
case 6:printf("六"); break;
case 7:printf("七"); break;
case 8:printf("八"); break;
case 9:printf("九"); break;
case 10:printf("十"); break;
}
}
②将阿拉伯数字转化为白话文数字。
#include
#include
int main()
{
int change1(char d[]);
char d[10] = "七";
int a;
a = change1(d);
printf("%d", a);
return 0;
}
int change1(char d[])
{
int sum;
if (strcmp("零", d) == 0)
sum = 0;
if (strcmp("一", d) == 0)
sum = 1;
if (strcmp("二", d) == 0)
sum = 2;
if (strcmp("三", d) == 0)
sum = 3;
if (strcmp("四", d) == 0)
sum = 4;
if (strcmp("五", d) == 0)
sum = 5;
if (strcmp("六", d) == 0)
sum = 6;
if (strcmp("七", d) == 0)
sum = 7;
if (strcmp("八", d) == 0)
sum = 8;
if (strcmp("九", d) == 0)
sum = 9;
if (strcmp("十", d) == 0)
sum = 10;
return (sum);
}