作业描述 | 详情 |
---|---|
这个作业属于哪个课程 | 2020福大面向对象程序设计 |
这个作业要求在哪里 | 面向对象程序设计寒假作业三 |
这个作业的目标 | a.继续完成作业二的编程题; b.优化架构,思考代码的拓展性; c.参考现有的编程语言,加入部分语言内容, 如:选择、循环语句、函数、或扩大数值范围; |
作业正文 | 寒假作业三 |
其他参考文献 | markdown、代码优化、switch |
编程题
编程题要求:
- 读题,提取出题目的要求。
- 分解需求,把需求分解为几个模块。
- 思考每个模块如何编写。
- 查阅资料。
- 对每个模块设计测试用例。
思考
1.需考虑输入输出转换,以及计算过程的实现。
2.在作业二的基础上扩大数值范围,增加负数。
3.代码规范优化
4.代码问题:数值范围仍然较小
程序划分
汉字转换过程:通过三个函数实现
1.char num[11][3] = { "零","一","二","三","四","五","六","七","八","九","十" };作为转换桥梁 2.通过judge函数判断数值正负,并调用convert0函数,最终返回输入数值对应阿拉伯数字 2.通过convert0函数分情况拆分输入数值,调用convert0转换成数字。 3.通过convert1函数把单个数值转换成数字。 4.其中借助strcmp函数和strlen函数实现转换和情况拆分。
运算过程:通过opera函数实现
1.完成运算操作的输入。 2."增加""减少""乘以""除以"的运算。
运算结果输出过程:通过output函数实现
1.完成正负判断 2.借助num字符串转换输出汉字
主函数:进行部分数据的输入,输出,以及函数调用
增加负数
在作业二的基础上增加一个judge函数:对正负进行判断,并返回对应阿拉伯数字
输出部分也独立出来,增加一个output函数
judge函数如下:
int judge(char y[])
{
using namespace std;
char j[20], k[20];
k[0] = y[0];
k[1] = y[1];
k[2] = '\0';
if (strcmp(k, "负") != 0){
return convert0(y);
}
else {
j[0] = y[2];
j[1] = y[3];
j[2] = y[4];
j[3] = y[5];
j[4] = y[6];
j[5] = y[7];
j[6] = '\0';
return (-1) * convert0(j);
}
}
代码优化
函数之间应该用空行分开;
用空行将代码按照逻辑片断划;
if 、for 、do、while 、case、switch、defaul 等语句自占一行,且if 、for 、do、while等语句的执行语句部分无论多少都要加括号{};
函数头部应进行注释,列出函数的目的/功能、输入参数、输出参数、返回值等。
例如:
/* Description: // 函数功能、性能等的描述 Input: // 输入参数说明,包括每个参数的作用、取值说明及参数间关系。 Output: // 对输出参数的说明。 Return: // 函数返回值的说明 Others: // 其它说明 */
尽可能的使用位运算来代替常规的乘法、除法、除余运算。
优先级: 位运算 -> 自增减运算 -> 加减法运算 -> 乘法运算 -> 除法运算 ->求余运算
例如:
s = b / 4; 可以替换为 s = b >> 2; s = b % 4; 可以替换为 s = b & 3; s = b * 3; 可以替换为 s = b << 1 + b; s = s + b; 可以代替位 s += b; s = s * b; 可以代替位 s *= b; s = s / b; 可以代替位 s /= b;
if 是每一个分支语句都去做一次判断的,影响了代码的运行效率
可以使用switch代替if语句。
完整代码
#include<iostream>
#include<string>
char num[11][3] = { "零","一","二","三","四","五","六","七","八","九","十" };
int integer = 0;
/*
功能:将单个汉字数值转换成阿拉伯数字
参数:wen为需要转换的单个汉字数值
返回值: 转换后的阿拉伯数字
*/
int convert1(char wen[])
{
using namespace std;
int z,i=0;
for (z = 0; z < 11; z++) {//利用for循环找到汉字数值对应的阿拉伯数字
if (strcmp(num[z], wen) == 0) {
return z;
i++;
break;
}
}
if (i == 0) {//i==0说明找不到对应数字,输入的数值错误
cout << "输入的数值错误";
}
}
/*
功能:分解每个数位上的数,通过调用convert1函数转换成阿拉伯数字
参数:wen为需要转换的汉字数值
返回值: 数值转换后的阿拉伯数字
*/
int convert0(char wen[])
{
using namespace std;
char c[10], d[10];//c,d用来暂时储存汉字数值部分数位上的数
int l = strlen(wen);
switch (l) {//利用switch语句分情况对数值进行拆分转换
case 2:return convert1(wen); break;//十以内的数值转换
case 4: {//十几或几十的数值转换
c[0] = wen[2];
c[1] = wen[3];
c[2] = '\0';//储存个位数
if (convert1(c) != 10) {
return convert1(c) + 10;
}
else {
c[0] = wen[0];
c[1] = wen[1];
c[2] = '\0';//储存十位数
return 10 * convert1(c);
}
}; break;
case 6: {
c[0] = wen[4];
c[1] = wen[5];
c[2] = '\0';//储存十位数
d[0] = wen[0];
d[1] = wen[1];
d[2] = '\0';//储存个位数
return 10 * convert1(d) + convert1(c);
}; break;
default:cout << "输入的数值超出范围"; break;
}
}
/*
功能:判断输入数值的正负,并返回转换后的阿拉伯数字,期间通过调用
convert0函数得到数值绝对值转换后的阿拉伯数字
参数:y为输入的汉字数值
返回值: 输入数值对应的阿拉伯数字
*/
int judge(char y[])
{
using namespace std;
char j[20], k[20];
k[0] = y[0];
k[1] = y[1];
k[2] = '\0';//储存输入数值的第一个字
if (strcmp(k, "负") != 0){
return convert0(y);
}
else {
j[0] = y[2];
j[1] = y[3];
j[2] = y[4];
j[3] = y[5];
j[4] = y[6];
j[5] = y[7];
j[6] = '\0';//去掉第一个字--“负”,保留绝对值数值
return (-1) * convert0(j);
}
}
/*
功能:进行运算操作,得到最终运算结果
参数:x为运算操作对象
*/
void opera(char x[])
{
using namespace std;
char m[20], n[20], s[20];//m为每次操作的运算对象,n为运算方式,s为运算变化值
while (1) {
cin >> m;
if (strcmp(m, "看看") == 0){//当m为“看看”时,运算结束
break;
}
if (strcmp(m, x) != 0) {
cout << "输入的运算对象错误" << endl;
break;
}
cin >> n >> s;
if (strcmp(n, "增加") == 0){
integer += judge(s);
}
else if (strcmp(n, "减少") == 0){
integer -= judge(s);
}
else if (strcmp(n, "乘以") == 0){
integer *= judge(s);
}
else if (strcmp(n, "除以") == 0&&strcmp(s,"零")!=0) {
integer /= judge(s);
}
else {
cout << "输入的运算操作错误" << endl;
break;
}
}
}
/*
功能:输出运算结果对应的汉字数值
参数:integer为运算结果,是阿拉伯数字
*/
void output(int integer)
{
using namespace std;
if (integer < 0) {//判断正负,若为负数,先输出“负”,再对绝对值进行转换
cout << "负";
integer = -integer;
}
if (integer >= 0 && integer < 11){
cout << num[integer];
}
else if (integer > 11 && integer < 20){
cout << "十" << num[integer % 10];
}
else if (integer > 19 && integer % 10 == 0){
cout << num[integer / 10] << "十";
}
else if (integer > 19 && integer % 10 != 0) {
cout << num[integer / 10] << "十" << num[integer % 10];
}
}
//进行部分数据的输入,输出,以及函数调用
int main(void)
{
using namespace std;
char a[20], x[20], b[20], y[20], h[20];
cin >> a >> x >> b >> y;
if (strcmp(a, "整数") != 0 || strcmp(b, "等于") != 0) {
cout << "输入错误" << endl;
}
integer = judge(y);
opera(x);
cin >> h;
if (integer > 99 || integer < -99) {
cout << "运算结果超出范围";
}
else {
output(integer);
}
return 0;
}
编译脚本以及测试脚本
1.编译脚本
同作业二
@echo off
set line=----------------------------------------------------------------------------------------------------------------------
echo 输入文件所在路径
set /p b=
cd "%b%"
echo 输入文件名
set /p c=
echo %line%
echo 编译开始
cl "%c%"
echo %line%
if exist "guwen.exe" echo 编译成功
if not exist "guwen.exe" echo 编译失败
pause
2.测试脚本
这里就测试新增的judge函数
测试代码如下:
#include<iostream>
#include<string>
char num[11][3] = { "零","一","二","三","四","五","六","七","八","九","十" };
int integer = 0;
int convert1(char wen[])
{
using namespace std;
int z, i = 0;
for (z = 0; z < 11; z++) {
if (strcmp(num[z], wen) == 0) {
return z;
i++;
break;
}
}
if (i == 0) {
cout << "输入的数值错误";
}
}
int convert0(char wen[])
{
using namespace std;
char c[10], d[10];
int l = strlen(wen);
switch (l) {
case 2:return convert1(wen); break;
case 4: {
c[0] = wen[2];
c[1] = wen[3];
c[2] = '\0';
if (convert1(c) != 10) {
return convert1(c) + 10;
}
else {
c[0] = wen[0];
c[1] = wen[1];
c[2] = '\0';
return 10 * convert1(c);
}
}; break;
case 6: {
c[0] = wen[4];
c[1] = wen[5];
c[2] = '\0';
d[0] = wen[0];
d[1] = wen[1];
d[2] = '\0';
return 10 * convert1(d) + convert1(c);
}; break;
default:cout << "输入的数值超出范围"; break;
}
}
int judge(char y[])
{
using namespace std;
char j[20], k[20];
k[0] = y[0];
k[1] = y[1];
k[2] = '\0';
if (strcmp(k, "负") != 0) {
return convert0(y);
}
else {
j[0] = y[2];
j[1] = y[3];
j[2] = y[4];
j[3] = y[5];
j[4] = y[6];
j[5] = y[7];
j[6] = '\0';
return (-1) * convert0(j);
}
}
int main(void)
{
using namespace std;
int x[20] = { -7,17,-70,77};
char y[17][10] = { "负七","十七","负七十","七十七"};
int i, j = 0, h = 0;
for (i = 0; i < 4; i++) {
if (x[i] == judge(y[i])) {
cout << y[i] << " 测试成功" << endl;
h++;
}
else
cout << y[i] << " 测试失败,为异常测试数据" << endl;
}
cout << endl;
if (h == 4)
cout << "测试通过,无异常数据" << endl;
else cout << "出现异常测试数据" << endl;
return 0;
}
测试脚本:
@echo off
title 单元测试:judge函数
set line=----------------------------------------------------------------------------------------------------------------------
cd "C:\Users\Q sea\source\repos\judge\judge"
cl judge.cpp
echo %line%
echo 测试开始
judge.exe
echo %line%
pause