2020面向对象程序设计寒假作业3 题解
这个作业属于哪个课程 | 数学与计算机科学学院2020年面向对象程序设计 |
---|---|
这个作业要求在哪里 | 面向对象程序设计寒假作业3 |
这个作业的目标 | 1.继续完成编程题 2.发布博客 |
其他参考文献 | https://blog.csdn.net/qq_42978418/article/details/89636029 |
编程题(请使用C语言或者C++完成以下题目):
继续完成作业二的编程题。
优化架构,思考代码的拓展性,比如我需要增加其他功能,如选择,循环语句怎么办。
思考:可以参考现有的编程语言,把这些语言的内容加入。如选择、循环语句、函数、或者扩大数字范围,支持负数等。
编程题要求:
读题,提取出题目的要求。
分解需求,把需求分解为几个你觉得不太相关的模块。
思考每个模块怎么写,可以从简单的模块开始写。
对于不会的问题进行查阅资料。
对于每一个模块设计测试用例。
详细记录下以上每一步,并写在博客中。
不要求完全做出来,但要求记录详细。
建议博客长度不少于1000字(不包含代码)。
- 我想要使输入数字的范围增加到0~99
所以我把原来输入中的string换成了char
两位数以内有一个汉字(0~9),两个汉字(n10,10+m),三个汉字(n10+m)三种情况,所以我又定义了三个函数Trans_1,Trans_2,Trans_3分别处理这三种情况- Trans_1如下,与上次作业中的基本一样;
int Trans_1(string cn1)
{
int i;
for (i = 0; i < 10; i++)
{
if (cn1 == chinese[i])
break;
}
return i;
}
- Trans_2如下,调用了Trans_1函数,因为我不知道要怎么写,只好非常浪费地再设置一个数组
int Trans_2(string cn2)
{
int t;
char copy[20];
if (cn2[0] == '十')
{
copy[0] = cn2[1];
t = Trans_1(copy)+10;
}
else if (cn2[1] == '十')
{
copy[0] = cn2[0];
t = Trans_1(copy)*10;
}
return t;
}
- Trans_3如下
int Trans_3(string cn3)
{
int t;
char copy1[20], copy2[20];
copy1[0] = cn3[0], copy2[0] = cn3[2];
t = Trans_1(copy1) * 10 + Trans_1(copy2);
return t;
}
- 原来的Transform函数和主函数也做了一些修改
- Transform函数如下
int Transform(string s)
{
int i, j, t;
char copy[20];
for (i = 0; i <= 10; i++)
{
if (s[i] == ' ')
break;
}
if (s[0] == '负')
{
for (j = 0; j < i; j++)
{
copy[i] = s[i + 1];
}
if (i == 2)
t = -1 * Trans_1(copy);
else if (i == 3)
t = -1 * Trans_2(copy);
else if (i == 4)
t = -1 * Trans_3(copy);
return t;
}
else
{
if (i == 1)
t = Trans_1(copy);
else if (i == 2)
t = Trans_2(copy);
else if (i == 3)
t = Trans_3(copy);
}
return t;
}
- 主函数如下
int main()
{
string s1, s2, s3, s4, s5, s6, s7;
char num1[20], num2[20];
cin >> s1 >> s2 >> s3 >> num1[20];
if (s1 == "整数" && s3 == "等于")
g_sum = Transform(num1);
do {
cin >> s5 >> s6;
if (s5 == s2 && s6 == "增加" || s5 == s2 && s6 == "减少")
{
cin >> num2[20];
Operate(s6, num2);
}
else if (s5 == "看看" && s6 == s2)
{
Output();
break;
}
else //if (s5 == "看看" && s6 != s2)
cout << "error!" << endl;
} while (1);
}
- 但是我尝试运行的时候,Transform函数中调用Trans_1,Trans_2,Trans_3的语句显示找不到标识符
于是我搜索了一下,发现出现原因是该函数调用的函数定义在该函数之前,所以找不到标识符(如果我的理解没错的话)
所以我把Transform函数调到这三个函数之前,这些错误就消失了
完整代码如下
#include<iostream>
#include<string>
using namespace std;
string chinese[11] = { "零","一","二","三","四","五","六","七","八","九","十" };
int g_sum;
int Trans_1(string cn1)
{
int i;
for (i = 0; i < 10; i++)
{
if (cn1 == chinese[i])
break;
}
return i;
}
int Trans_2(string cn2)
{
int t;
char copy[20];
if (cn2[0] == '十')
{
copy[0] = cn2[1];
t = Trans_1(copy)+10;
}
else if (cn2[1] == '十')
{
copy[0] = cn2[0];
t = Trans_1(copy)*10;
}
return t;
}
int Trans_3(string cn3)
{
int t;
char copy1[20], copy2[20];
copy1[0] = cn3[0], copy2[0] = cn3[2];
t = Trans_1(copy1) * 10 + Trans_1(copy2);
return t;
}
int Transform(string s)
{
int i, j, t;
char copy[20];
for (i = 0; i <= 10; i++)
{
if (s[i] == ' ')
break;
}
if (s[0] == '负')
{
for (j = 0; j < i; j++)
{
copy[i] = s[i + 1];
}
if (i == 2)
t = -1 * Trans_1(copy);
else if (i == 3)
t = -1 * Trans_2(copy);
else if (i == 4)
t = -1 * Trans_3(copy);
return t;
}
else
{
if (i == 1)
t = Trans_1(copy);
else if (i == 2)
t = Trans_2(copy);
else if (i == 3)
t = Trans_3(copy);
}
return t;
}
void Operate(string a, string b)
{
if (a == "增加")
g_sum = g_sum + Transform(b);
else if (a == "减少")
g_sum = g_sum - Transform(b);
}
void Output()
{
int i, m = g_sum % 10, n = g_sum / 10;
if (g_sum < 0)
cout << "出现财政赤字" << endl;
else if (g_sum >= 0 && g_sum <= 10)
cout << chinese[g_sum] << endl;
else if (g_sum > 10 && m == 0)
cout << chinese[n] << "十" << endl;
else if (g_sum >= 11 && g_sum <= 19)
cout << "十" << chinese[m] << endl;
else if (g_sum > 20 && m != 0)
cout << chinese[n] << "十" << chinese[m] << endl;
}
int main()
{
string s1, s2, s3, s4, s5, s6, s7;
char num1[20], num2[20];
cin >> s1 >> s2 >> s3 >> num1[20];
if (s1 == "整数" && s3 == "等于")
g_sum = Transform(num1);
do {
cin >> s5 >> s6;
if (s5 == s2 && s6 == "增加" || s5 == s2 && s6 == "减少")
{
cin >> num2[20];
Operate(s6, num2);
}
else if (s5 == "看看" && s6 == s2)
{
Output();
break;
}
else //if (s5 == "看看" && s6 != s2)
cout << "error!" << endl;
} while (1);
}
- 解释
单元测试:对每一个函数进行测试,这代表了你需要把代码分到不同的文件,使用不同的主函数切换测试/运行。
编译脚本:运行该脚本后无需任何输入就能自动编译全部代码,并输出编译结束的代码。
测试脚本:运行该脚本后可以自动的编译并运行所有测试样例,并输出测试结果。