这个作业属于哪个课程 | 2020年面向对象程序设计 |
---|---|
这个作业要求在哪里 | 面向对象程序设计寒假作业3 |
这个作业的目标 | 1.优化作业2编程题代码的架构 |
2.思考代码的拓展性 | |
3.参考现有的编程语言,把这些语言的内容加入。如选择、循环语句、函数、或者扩大数字范围,支持负数等。 | |
4.发布博客 | |
作业正文 | 编程题 |
其他参考文献 | windows批处理(cmd/bat)编程详解 |
仓库地址 | 仓库地址 |
---|---|
优化代码 | 寒假作业01.exe、寒假作业01.cpp |
单元测试 | trans_input.exe、trans_input.cpp、trans_input_test.bat |
trans_output.exe、trans_output.cpp、trans_output_test.bat | |
编译脚本 | trans_test.bat、trans_test.exe |
测试脚本 | trans1_test.bat、trans1.exe、trans1.cpp、1.txt |
编程题:
· 继续完成作业二的编程题。
· 优化架构,思考代码的拓展性,比如我需要增加其他功能,如选择,循环语句怎么办。
· 思考:可以参考现有的编程语言,把这些语言的内容加入。如选择、循环语句、函数、或者扩大数字范围,支持负数等。
一、进一步优化代码
在之前作业中,我对于代码的输出进行了一定的优化,将输出结果从099扩大到了-9999,这次考虑到之前的范围在实际应用中可能限制太多,于是扩大输出结果的范围;同时考虑到输入只有正数的输入,为了让程序更加灵活方便,添加了负数的处理。
(1)将输出数据的范围扩大到-999~999。
依照想法进行扩大数据范围,在绝对值100~999之中,有几个特别情况,比如整百的数(100、200、300)、没有十位的三位数(101、102、103)、十位为一的百位数读法的特殊(“110” 读作 “一百一十” 而非 “一百十”)等,针对这些特殊情况,我通过添加if选择语句来进行处理。
更改后的输出部分代码如下:
void printf_wallet(int sum)
{
int shi,bai;
if(sum <= 10) trans_output(sum);
else
{
if(sum >= 100)
{
bai = sum /100;
sum = sum %100;
if(bai == 1)
printf("一百");
else
{
trans_output(bai);
printf("百");
}
if(sum<10&&sum!=0)
printf("零");
if(sum>=10&&sum<20)
printf("一");
}
if(sum <= 10) trans_output(sum);
else
{
shi = sum / 10;
sum = sum % 10;
if (shi == 1)
{
printf("十");
trans_output(sum);
}
if(shi > 1)
{
trans_output(shi);
printf("十");
if(sum!=0)
trans_output(sum);
}
}
}
}
(2)对于输入的数据增加负数的处理。
这个处理并不难,在汉字转数字处理部分,添加-1~-10的情况即可。
更改后的输入_汉字转数字部分代码如下:
int trans_input(char num[])
{
if (strcmp(num, "零") == 0) return 0;
if (strcmp(num, "一") == 0) return 1;
if (strcmp(num, "二") == 0) return 2;
if (strcmp(num, "三") == 0) return 3;
if (strcmp(num, "四") == 0) return 4;
if (strcmp(num, "五") == 0) return 5;
if (strcmp(num, "六") == 0) return 6;
if (strcmp(num, "七") == 0) return 7;
if (strcmp(num, "八") == 0) return 8;
if (strcmp(num, "九") == 0) return 9;
if (strcmp(num, "十") == 0) return 10;
if (strcmp(num, "负一") == 0) return -1;
if (strcmp(num, "负二") == 0) return -2;
if (strcmp(num, "负三") == 0) return -3;
if (strcmp(num, "负四") == 0) return -4;
if (strcmp(num, "负五") == 0) return -5;
if (strcmp(num, "负六") == 0) return -6;
if (strcmp(num, "负七") == 0) return -7;
if (strcmp(num, "负八") == 0) return -8;
if (strcmp(num, "负九") == 0) return -9;
if (strcmp(num, "负十") == 0) return -10;
}
(3)优化后的完整代码如下:
#include<stdio.h>
#include<string.h>
int trans_input(char num[]); //将输入的汉字转化为数字,便于计算
int input_op(int sum); //输入多组数据,直到查看标志字符出现停止循环
int op(int n, char b[],int sum); //对输入数据进行处理
void printf_wallet(int sum); //输出最终结果
void trans_output(int sum); //对最终结果的数字转化为汉字并输出
char zs[20], wallet[20], opp[20], num[20];
int sum,n;
int main()
{
scanf("%s %s %s %s",zs,wallet,opp,num);
sum = trans_input(num);
sum = input_op(sum);
if(sum < 0) //处理钱包数额为负数
{
printf("负");
sum=-sum;
}
printf_wallet(sum);
return 0;
}
int trans_input(char num[])
{
if (strcmp(num, "零") == 0) return 0;
if (strcmp(num, "一") == 0) return 1;
if (strcmp(num, "二") == 0) return 2;
if (strcmp(num, "三") == 0) return 3;
if (strcmp(num, "四") == 0) return 4;
if (strcmp(num, "五") == 0) return 5;
if (strcmp(num, "六") == 0) return 6;
if (strcmp(num, "七") == 0) return 7;
if (strcmp(num, "八") == 0) return 8;
if (strcmp(num, "九") == 0) return 9;
if (strcmp(num, "十") == 0) return 10;
if (strcmp(num, "负一") == 0) return -1;
if (strcmp(num, "负二") == 0) return -2;
if (strcmp(num, "负三") == 0) return -3;
if (strcmp(num, "负四") == 0) return -4;
if (strcmp(num, "负五") == 0) return -5;
if (strcmp(num, "负六") == 0) return -6;
if (strcmp(num, "负七") == 0) return -7;
if (strcmp(num, "负八") == 0) return -8;
if (strcmp(num, "负九") == 0) return -9;
if (strcmp(num, "负十") == 0) return -10;
}
int input_op(int sum)
{
while (1)
{
scanf("%s %s",wallet,opp);
if (strcmp(wallet,"看看") == 0)
break;
scanf("%s", num);
n = trans_input(num);
sum = op(n, opp, sum);
}
return sum;
}
int op(int n, char opp[], int sum)
{
if (strcmp(opp, "增加") == 0) sum = sum + n;
if (strcmp(opp, "减少") == 0) sum = sum - n;
return sum;
}
void printf_wallet(int sum)
{
int shi,bai;
if(sum <= 10) trans_output(sum);
else
{
if(sum >= 100)
{
bai = sum /100;
sum = sum %100;
if(bai == 1)
printf("一百");
else
{
trans_output(bai);
printf("百");
}
if(sum<10&&sum!=0)
printf("零");
if(sum>=10&&sum<20)
printf("一");
}
if(sum <= 10) trans_output(sum);
else
{
shi = sum / 10;
sum = sum % 10;
if (shi == 1)
{
printf("十");
trans_output(sum);
}
if(shi > 1)
{
trans_output(shi);
printf("十");
if(sum!=0)
trans_output(sum);
}
}
}
}
void trans_output(int sum)
{
if (sum == 1) printf("一");
if (sum == 2) printf("二");
if (sum == 3) printf("三");
if (sum == 4) printf("四");
if (sum == 5) printf("五");
if (sum == 6) printf("六");
if (sum == 7) printf("七");
if (sum == 8) printf("八");
if (sum == 9) printf("九");
if (sum == 10) printf("十");
}
部分测试数据结果如下:
(1)钱包的初始数据为负数:-3
(2)对于钱包操作的数据为负数:-10 -1
(3)输出的结果为整百:100
(4)输出结果为十位数是一的三位数:210
(5)输出结果为十位数是零的三位数:103
二、单元测试
(1)输入_汉字转化为数字单元测试
代码如下:
#include<stdio.h>
#include<string.h>
int trans_input(char num[]);
int main()
{
char num[20];
int n=100,i;
for(i=0;i<21;i++)
{
printf("请输入大写数字:");
scanf("%s",num);
n=trans_input(num);
if(n<=10&&n>=-10)
printf("%d pass
",n);
}
return 0;
}
int trans_input(char num[])
{
if (strcmp(num, "零") == 0) return 0;
if (strcmp(num, "一") == 0) return 1;
if (strcmp(num, "二") == 0) return 2;
if (strcmp(num, "三") == 0) return 3;
if (strcmp(num, "四") == 0) return 4;
if (strcmp(num, "五") == 0) return 5;
if (strcmp(num, "六") == 0) return 6;
if (strcmp(num, "七") == 0) return 7;
if (strcmp(num, "八") == 0) return 8;
if (strcmp(num, "九") == 0) return 9;
if (strcmp(num, "十") == 0) return 10;
if (strcmp(num, "负一") == 0) return -1;
if (strcmp(num, "负二") == 0) return -2;
if (strcmp(num, "负三") == 0) return -3;
if (strcmp(num, "负四") == 0) return -4;
if (strcmp(num, "负五") == 0) return -5;
if (strcmp(num, "负六") == 0) return -6;
if (strcmp(num, "负七") == 0) return -7;
if (strcmp(num, "负八") == 0) return -8;
if (strcmp(num, "负九") == 0) return -9;
if (strcmp(num, "负十") == 0) return -10;
}
测试脚本如下:
@echo off
cd C:C:Users86133Desktopoop.homer寒假作业3
echo 开始测试
trans_input.exe
echo 测试结束
pause
测试结果如下图:
(2)输出_数字转化为汉字单元测试
代码如下:
#include<stdio.h>
#include<string.h>
void printf_wallet(int sum);
void trans_output(int sum);
int main()
{
int sum,i;
for(i=0;i<15;i++)
{
printf("请输入数字:");
scanf("%d",&sum);
if(sum < 0)
{
printf("负");
sum=-sum;
}
printf_wallet(sum);
printf("
");
}
return 0;
}
void printf_wallet(int sum)
{
int shi,bai;
if(sum <= 10) trans_output(sum);
else
{
if(sum >= 100)
{
bai = sum /100;
sum = sum %100;
if(bai == 1)
printf("一百");
else
{
trans_output(bai);
printf("百");
}
if(sum<10&&sum!=0)
printf("零");
if(sum>=10&&sum<20)
printf("一");
}
if(sum <= 10) trans_output(sum);
else
{
shi = sum / 10;
sum = sum % 10;
if (shi == 1)
{
printf("十");
trans_output(sum);
}
if(shi > 1)
{
trans_output(shi);
printf("十");
if(sum!=0)
trans_output(sum);
}
}
}
}
void trans_output(int sum)
{
if (sum == 1) printf("一");
if (sum == 2) printf("二");
if (sum == 3) printf("三");
if (sum == 4) printf("四");
if (sum == 5) printf("五");
if (sum == 6) printf("六");
if (sum == 7) printf("七");
if (sum == 8) printf("八");
if (sum == 9) printf("九");
if (sum == 10) printf("十");
}
测试脚本如下:
@echo off
cd C:C:Users86133Desktopoop.homer寒假作业3
echo 开始测试
trans_output.exe
echo 测试结束
pause
测试结果如下图:
三、编译脚本
这一部分参考之前作业完成的。
脚本如下:
@echo off
echo 请输入文件名
set /p b=
C:Dev-CppMinGW64ingcc %b%.cpp -o trans.exe
if exist trans.exe echo 编译成功
if not exist trans.exe echo 编译失败
pause
编译结果如下图(编译的代码是上面的那个完整代码):
四、测试脚本
因为反复输入过于繁琐,我选择运用freopen函数,将要测试的数据保存为txt格式,每次通过改变地址来改变测试数据,或者直接改变文档的内容。
脚本如下:
@echo off
echo trans1开始测试
trans1.exe
echo trans1测试结束
pause
测试代码如下:
#include<stdio.h>
#include<string.h>
int trans_input(char num[]); //将输入的汉字转化为数字,便于计算
int input_op(int sum); //输入多组数据,直到查看标志字符出现停止循环
int op(int n, char b[],int sum); //对输入数据进行处理
void printf_wallet(int sum); //输出最终结果
void trans_output(int sum); //对最终结果的数字转化为汉字并输出
char zs[20], wallet[20], opp[20], num[20];
int sum,n;
int main()
{
freopen("C:\Users\86133\Desktop\oop.homer\x.txt","r",stdin); //x代表某个文本
scanf("%s %s %s %s",zs,wallet,opp,num);
sum = trans_input(num);
sum = input_op(sum);
if(sum < 0) //处理钱包数额为负数
{
printf("负");
sum=-sum;
}
printf_wallet(sum);
printf("
");
return 0;
}
int trans_input(char num[])
{
if (strcmp(num, "零") == 0) return 0;
if (strcmp(num, "一") == 0) return 1;
if (strcmp(num, "二") == 0) return 2;
if (strcmp(num, "三") == 0) return 3;
if (strcmp(num, "四") == 0) return 4;
if (strcmp(num, "五") == 0) return 5;
if (strcmp(num, "六") == 0) return 6;
if (strcmp(num, "七") == 0) return 7;
if (strcmp(num, "八") == 0) return 8;
if (strcmp(num, "九") == 0) return 9;
if (strcmp(num, "十") == 0) return 10;
if (strcmp(num, "负一") == 0) return -1;
if (strcmp(num, "负二") == 0) return -2;
if (strcmp(num, "负三") == 0) return -3;
if (strcmp(num, "负四") == 0) return -4;
if (strcmp(num, "负五") == 0) return -5;
if (strcmp(num, "负六") == 0) return -6;
if (strcmp(num, "负七") == 0) return -7;
if (strcmp(num, "负八") == 0) return -8;
if (strcmp(num, "负九") == 0) return -9;
if (strcmp(num, "负十") == 0) return -10;
}
int input_op(int sum)
{
while (1)
{
scanf("%s %s",wallet,opp);
if (strcmp(wallet,"看看") == 0)
break;
scanf("%s", num);
n = trans_input(num);
sum = op(n, opp, sum);
}
return sum;
}
int op(int n, char opp[], int sum)
{
if (strcmp(opp, "增加") == 0) sum = sum + n;
if (strcmp(opp, "减少") == 0) sum = sum - n;
return sum;
}
void printf_wallet(int sum)
{
int shi,bai;
if(sum <= 10) trans_output(sum);
else
{
if(sum >= 100)
{
bai = sum /100;
sum = sum %100;
if(bai == 1)
printf("一百");
else
{
trans_output(bai);
printf("百");
}
if(sum<10&&sum!=0)
printf("零");
if(sum>=10&&sum<20)
printf("一");
}
if(sum <= 10) trans_output(sum);
else
{
shi = sum / 10;
sum = sum % 10;
if (shi == 1)
{
printf("十");
trans_output(sum);
}
if(shi > 1)
{
trans_output(shi);
printf("十");
if(sum!=0)
trans_output(sum);
}
}
}
}
void trans_output(int sum)
{
if (sum == 1) printf("一");
if (sum == 2) printf("二");
if (sum == 3) printf("三");
if (sum == 4) printf("四");
if (sum == 5) printf("五");
if (sum == 6) printf("六");
if (sum == 7) printf("七");
if (sum == 8) printf("八");
if (sum == 9) printf("九");
if (sum == 10) printf("十");
}
测试数据及其测试结果如下: