面向对象程序设计寒假作业2
这个作业属于哪个课程 | 2020面向对象程序(福州大学 - 数学与计算机科学学院) |
---|---|
这个作业要求在哪里 | 面向对象程序设计寒假作业2 |
这个作业的目标 | 1.继续完成编程题。2.新建一个github仓库,并把作业推送到该仓库。3.发布博客。 |
作业正文 | 实践题 编程题 |
其他参考文献 | 待补充 |
实践题
新建一个github仓库,使用git,或者github desktop把接下去的编程题的代码及测试脚本传到这个仓库。
编程题
使用的是Windows批处理
感觉windows批处理就是。。把dos命令写一起了。。比较好做,不过我更感兴趣的是python
测试用脚本
由于代码写得比较零乱(所以就不放上来了),所以只有一个主要的函数测试
然后是,文件输入输出功能
总感觉可以改变目标文件,或者说指定文件进行测试,但是暂时我还没有找到答案
这种文件输入输出,感觉oj上应该就是这样
至于文件输出,则没有实现(似乎不需要文件输出)
另外,在编辑的时候我发现一个有趣的地方,
我是首先写了一部分测试数据,然后运行ceshi.exe
程序窗口我没有关闭
然后继续编写数据1.txt的时候,一旦保存,程序窗口也会立刻执行后面写入的数据
和我最初想的需要重新运行程序不同
总结
代码部分
#include
char w[10],x[10],s1[10],s2[10],op[10],er[10];
int eo1[10],eo2[10];
int n,n1,i,l;
void re(int a){
int j;
i=0;
while(a>=10){
j=a%10;
a/=10;
eo2[i]=j;
i++;
}
l=i+1;
eo2[i]=a;
for(int j=0,i1=i;j<=i;j++,i1--){
eo1[j]=eo2[i1];
}
if(n==10){
printf("十");
return ;
}
for(int i1=0;i1<=i;i1++){
if(l==2&&eo2[1]==1&&i!=2){
printf("十");
l--;
continue;
}
switch(eo1[i1]){
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;
}
if(l==4){
printf("千");
l--;
continue;
}
if(l==3){
printf("百");
l--;
if(n==100) return ;
continue;
}if(l==2&&eo1[i]!=0){
printf("十");
l--;
continue;
}if(l==1){
l--;
continue;
}
}
}
int izc(char s[25]){
if(!strcmp(s,"零")) return 0;
if(!strcmp(s,"一")) return 1;
if(!strcmp(s,"二")) return 2;
if(!strcmp(s,"三")) return 3;
if(!strcmp(s,"四")) return 4;
if(!strcmp(s,"五")) return 5;
if(!strcmp(s,"六")) return 6;
if(!strcmp(s,"七")) return 7;
if(!strcmp(s,"八")) return 8;
if(!strcmp(s,"九")) return 9;
if(!strcmp(s,"十")) return 10;
}
int main()
{
scanf("%s%s%s%s",s1,w,s2,x);
n=izc(x);
while(1){
scanf("%s",op);
if(!strcmp(op,w)){
memset(op,0,10);
scanf("%s%s",op,er);
if(!strcmp(op,"增加")){
n+=izc(er);
}
if(!strcmp(op,"减少")){
n-=izc(er);
}
}
if(!strcmp(op,"看看")){
memset(op,0,10);
scanf("%s",op);
if(!strcmp(op,w)){
re(n);
printf("\n");
}
}
}
return 0;
}
首先是中文和数字的转换
我个人最初的想法是,用两个数组,进行这两个数组的联系,比如char[]={'零','一','二','三','四','五','六','七','八','九'}和int[]={0,1,2,3,4,5,6,7,8,9};
然后对于给定的数据操作,其中的汉字可以由在字符数组中找到的位置,进行到整型数组的转换
比如我找到了汉字五,那对应于整型数组中的这个数字是5,由此进行运算,但是我不知道怎么去实现
然后我想到的是一个链表,将对应的汉字和数字放在一个结构体中,然后可以构建一个链表,依次寻找,但是过于复杂麻烦
最后还是学习了其他同学的实现方法,通过比较函数
然后是输出部分
我暂时没有想到一个很好的办法来解决输出
特别是当我想到如果我直接对sum进行输出的话,那么输出顺序是一个很大的问题
所以我用eo1和eo2来存储sum(代码中我使用的是n)中的每一位数
由于我希望从最高位进行输出
所以我将每一位进行截断,然后再用一个数组逆序存储
eo1和eo2的区别是其中的存储顺序不同,这样可以得到由高位到低位的每一位数字
代码中的 i 我用来存储 n 的长度
由 i 的值来进行一些如“千”,“百”的输出 (不过一次只能增加十,增加到千以上也要挺久了吧(小声))
而如果真的是需要处理一些很大的数据,比如随便举一个31415926535271828实际读起来我可能会直接每一位的数字直接读下来
但是但是如果又非要从实际应用来说的话,也的确有实现的必要,比如银行处理大额数据(会要求中文大写,其中有时候数据会很大)
我最开始也想的是直接每一位输出,不过小范围数据还是可以按照常规习惯处理hh(同时也留下了很多bug需要我处理)
优化&杂项
由于此次代码完成的时间较短,所以并未进行优化
不过由同学推荐,学习MC派大星的脚本部分的时候
注意到代码分块是一个很重要的问题,特别是对于函数处理,有助于理清思路
另:再也不在deadline肝代码了,今天中午才开始写,又第一次编程题未完成,所以今天才开始写代码,头都大了,许多优化并未来得及实现
所以要求的尽量函数长度不超过15行,并未实现
还有就是,对于一些不合法的输入,我没有进行判断,等等,这些提升用户体验的优化功能估计只能后期继续优化修改了
至于bug,我知道还有很多bug,不过暂时没有解决,后期解决bug的时候也会继续同步优化
杂项:再也不乱改路径了,vscode死活调不对,vs的路径也被我弄乱了,所以用的devc++写的
然后可能是中文编码的问题,其中的中文代码部分复制出来就乱码,只好手动修正(吐)
迷惑,待解决