编程题:
· 继续完成作业一的编程题。
· 优化架构,一般要求每个函数长度不超过15行。
· 优化规范,尤其是命名规范。
· 制作一个编译脚本,运行该脚本可以编译你的代码,可选的脚本语言,python(2.7),windows批处理,powershell,shell。
示例脚本:
gcc 1.cpp -o lang.exe
· 进行单元测试,即测试每一个函数,并制作一个测试脚本,运行该脚本可以进行测试,并显示测试结果。
示例脚本:
gcc 1.cpp test.cpp -o test.exe
test
· 在作业一编程题的基础上添加以下功能:
通过命令行读取一个文件,然后运行这个文件。如我的程序叫lang,lang 1.txt
代表我要运行1.txt这个文本中的代码。
假设我的1.txt
内容如下:
整数 钱包 等于 零
钱包 增加 四
钱包 减少 三
看看 钱包
输入lang 1.txt
后,命令行输出一
优化作业一编程题的代码
(1)根据优化架构的要求,将代码分为六个函数,一个主函数,五个自定义函数。其中五个自定义函数如下框所示(各自的作用标注在后面):
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); //对最终结果的数字转化为汉字并输出
(2)根据优化规范的要求,我将大部分变量的命名,定义的较为通俗易懂,如变量意义的英文或是中文缩写。
char zs[20], wallet[20], opp[20], num[20];
int sum,n;
(3)在原有代码的基础上,考虑到钱包最终的数额可能不是正数,添加了对于负数的处理。至于最终数额的大小,由原题目提到只会出现零一二三四五六七八九十,我还是只把最终数据范围限制在-99~99之间,如果数据过大,可以通过添加新的函数模块处理。
(4)完整代如下:
#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;
}
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;
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("十");
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("十");
}
(5)部分测试结果图:
制作编译脚本(脚本语言:windows批处理),运行脚本编译代码
说实话,这个题目我都看的不是很懂,参考了别的同学的作业,加上自己百度的结果,得到如下的结果。
(1)先根据各种资料,编写了代码如下:
@echo off
echo 请输入文件名
set /p b=
C:Dev-CppMinGW64ingcc %b%.cpp -o x.exe
if exist x.exe echo 编译成功
if not exist x.exe echo 编译失败
pause
(2)最开始我将代码编写在记事本里,通过另存为转化为.bat,但是运行时出现了乱码。参考别人的解决方案,我将它放入写字板,再转化就成功了,得到了如下结果。
制作测试脚本,运行脚本进行测试,得出测试结果
我选择了汉字转数字和数字转汉字两个单元进行测试。
(1)测试脚本如下:
@echo off
echo part1开始测试
part1.exe
echo part1测试结束
echo part2开始测试
part2.exe
echo part2测试结束
pause
(2) 被测试的单元代码如下:
Part1:
#include<stdio.h>
#include<string.h>
int trans_input(char num[]);
int main()
{
char zs[][4]={"零","一","二","三","四","五","六","七","八","九","十"};
int i,n;
for(i=0;i<11;i++)
{
n=trans_input(zs[i]);
printf("%d ",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;
}
Patr2:
#include<stdio.h>
#include<string.h>
void printf_wallet(int sum);
void trans_output(int sum);
int main()
{
int num[100],i;
for(i=0;i<100;i++)
{
num[i]=i;
printf_wallet(num[i]);
if((i+1)%5==0)
printf("
");
}
return 0;
}
void printf_wallet(int sum)
{
int shi;
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("十");
trans_output(sum);
}
}
}
void trans_output(int sum)
{
if (sum == 0) printf("零");
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("十");
}
(3)得到的测试结果如下图:
添加通过命令行读取一个文件,然后运行这个文件的功能
(1)通过百度和询问同学后了解到,要使用freopen函数,其格式如下:
freopen(“文件地址”,"r",stdin);
(2) 将样例文本复制,存放在1.txt中。
(3)修改源代码的主函数,如下图所示:
int main()
{
freopen("1.txt","r",stdin);
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;
}
(4)打开命令行窗口,按要求输入后,得到下图:
反思及感悟
通过本次作业学到了很多东西,对于windows批操作还有很多疑问,希望再以后的学习中能弄懂。