今晚是我第三次因为学习而晚睡,第一次是高考第一天晚上,白天发挥失常未能入睡,第二次是去年全国数学建模大赛加急时间写论文,而第三次就是今晚。从上学期的编译方法课开始,我就发现自己的编程能力越来越不好,逐日下降,完全称得上是三天不练手生,十天不练脑生,当时本想通过大创来增强自己的动手能力,但由于各种意外事件的发生,把想法越推越没,直到现在。这周我们的软件工程课的作业是设置自己的学习进度条和给上周的随机加减法程序增加功能,本来是周三布置的作业,结果到今晚才差强人意的完成,中途有些时间是因为上考研课没了的,还有十几个小时是因为个人情感波动太大而浪费的,剩下没多少的时间不是被这儿折腾完,就是被那儿浪费,尽管自己的计划是满满的,但是却给变化留了太多的机会。特别是在这次的情感波动中,几近让自己崩溃,无奈,都已经打算好了放弃考研之路,放弃之前的一些努力,成为一个普普通通的过得去大学生就好。幸好我是幸运的,丟之桑榆,收之东隅,拥有很多关心自己的朋友、同学以及陌生人,是他们让我鼓起了勇气,重新点燃了自己的奋斗之火、追求之光。非常感谢我的人生中有他们的身影存在。
这次的作业是:扩充 《四则运算》题目的功能,要求:题目避免重复;可以定制数量和打印方式;可以控制下列参数;是否有乘除法;是否有括号;数值范围加减有无负数;除法有无余数;是否支持分数(真分数、假分数…);是否支持小数(精确到多少位?);打印中每行的间隔;
从我第一次拿到这个题目时,我觉得这个题目不难,可能就是思维不全有漏洞,所以我打一开始就是奔着实现全部功能去得,所以考虑了链表存储,数组存储,结构体存储等,总想找到一个简单的简便的方法去实现这些功能,因为毕竟这些功能代码逐一实现起来不难,况且以前比这复杂都写过,这个不算什么。经过那么久的思考,我开始上机验证自己的代码准确性,从一开始到现在的代码量我肯定写了超过500行的代码了,但现在留下来的300不到,其他的都被pass了,想法总是美好的,代码运行总是残酷的,并且现在的程序是自己不满意的,功能的实现比较初略浅显,代码如下:
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h> void addition(int z);//独立加法 void sub(int z);//独立减法 void mul(int z);//独立乘法 void division(int z);//独立除法 void un(int z);//加减乘除综合 //void bracket(int e1,int e2); int SS=0; int show()//输入指令 { printf("\t小学生四则运算\n"); printf("\t1:独立加法练习\n"); printf("\t2:独立减法练习\n"); printf("\t3:独立乘法练习\n"); printf("\t4:独立除法练习\n"); printf("\t5:加减乘除混合练习\n"); printf("\t请选择你所需的服务练习\n"); int yy; scanf("%d",&yy); while((yy<1)||(yy>5)) { printf("输入错误,请重新输入\n"); scanf("%d",&yy); } return yy; } int main () { int a=1; while(a) { int y=0,z=0; y=show(); printf("\t请输入练习多少题\n"); scanf("%d",&z); printf("\t请输入数值范围\n"); scanf("%d",&SS); switch(y) { case 1:addition(z);break;//进入加法 case 2:sub(z);break;//进入减法 case 3:mul(z);break;//进入乘法 case 4:division(z);break;//进入除法 case 5:un(z);break;//进入混合运算 } printf("\t是否继续做练习(0-否,1-是)"); scanf("%d",&a); } return 0; } /* e=n|e1+e2|e1-e2|e1*e2|e1/e2|(e) */ void un(int z)//加减乘除综合题 { while(z--)//(e1 op1 e2) op2 e4 { int op1; float ans; srand((int)time(0)); int e1,e2; printf("(");//( e1=rand()%SS;//随机数 e2=rand()%SS; if(e1<e2)//对调小数和大数,保证结果无负数 { ans=e1; e1=e2; e2=ans; } printf("%d",e1);//e1 op1=rand()%4; float e3; switch(op1) { case 0:printf("+");e3=e1+e2;break; case 1:printf("-");e3=e1-e2;break; case 2:printf("*");e3=e1*e2;break; case 3:printf("/");e3=e1*1.0/e2;break; }//op1 printf("%d)",e2);//e2) int e4; e4=rand()%SS; op1=rand()%4; float e5; switch(op1) { case 0:printf("+");e5=e3+e4;break; case 1:printf("-"); if(e3<e4) { ans=e3; e3=e4; e4=ans; } e5=e3-e4;break; case 2:printf("*");e5=e3*e4;break; case 3:printf("/"); while(e4==0) e4=rand()%SS; e5=e3*1.0/e4;break; }//op2 printf("%d=",e4);//e4= scanf("%f",&ans); if(ans==e5) printf("right\n"); else printf("error right=%.2f\n",e5); } } void addition(int z)//随机生成加法e1+e2 { int zz=0; zz=z; while(z--) { int C[100][2];//存储输出的题目 int e1,e2; int ans; srand((int)time(0));//随机种子 e1=rand()%SS;//随机数 C[z][0]=e1; e2=rand()%SS; C[z][1]=e2; int m=0,mm=0; for(m=zz;m>z;m--) { if((C[z][0]==C[m][0])&&(C[z][1]==C[m][1])) { z=z+1; mm=1; break; } }//对将要输出的题目做题目重复判断 if(mm==1) continue; printf("%d+%d=",e1,e2); scanf("%d",&ans);//结果输入 if(ans==(e1+e2)) printf("right\n"); else printf("error right=%d\n",e1+e2); } } void sub(int z)//随机生成减法e1-e2 { int zz=0; zz=z; while(z--) { int C[100][2];//存储输出的题目 int e1,e2; int ans; srand((int)time(0));//随机种子 e1=rand()%SS;//随机数 C[z][0]=e1; e2=rand()%SS; C[z][1]=e2; int m=0,mm=0; for(m=zz;m>z;m--) { if((C[z][0]==C[m][0])&&(C[z][1]==C[m][1])) { z=z+1; mm=1; break; } }//对将要输出的题目做题目重复判断 if(mm==1) continue; if(e1<e2)//对调小数和大数,保证结果无负数 { ans=e1; e1=e2; e2=ans; } printf("%d-%d=",e1,e2); scanf("%d",&ans);//题目作答 if(ans==(e1-e2)) printf("right\n"); else printf("error right=%d\n",e1-e2); } } void mul(int z)//随机生成乘法e1*e2 { int zz=0; zz=z; while(z--) { int C[100][2];//存储输出的题目 int e1,e2; int ans; srand((int)time(0));//随机种子 e1=rand()%SS;//随机数 C[z][0]=e1; e2=rand()%SS; C[z][1]=e2; int m=0,mm=0; for(m=zz;m>z;m--) { if((C[z][0]==C[m][0])&&(C[z][1]==C[m][1])) { z=z+1; mm=1; break; } }//对将要输出的题目做题目重复判断 if(mm==1) continue; printf("%d*%d=",e1,e2); scanf("%d",&ans);//题目作答 if(ans==(e1*e2)) printf("right\n"); else printf("error right=%d\n",e1*e2); } } void division(int z)//随机生成除法e1/e2 { int zz=0; zz=z; printf("\t若为小数,请保留4位小数\n"); while(z--) { int C[100][2];//存储输出的题目 int e1,e2; srand((int)time(0));//随机种子 e1=rand()%SS;//随机数 C[z][0]=e1; e2=rand()%SS; C[z][1]=e2; int m=0,mm=0; for(m=zz;m>z;m--) { if((C[z][0]==C[m][0])&&(C[z][1]==C[m][1])) { z=z+1; mm=1; break; } }//对将要输出的题目做题目重复判断 if(mm==1) continue; int ee; if(e2==0)//当分母为0时,分子分母调换 { ee=e1; e1=e2; e2=ee; } if((e1==0)&&(e2==0))//若分子分母都为0,重新生成题目 { z=z+1; continue; } printf("%d/%d=",e1,e2); float ans; scanf("%f",&ans);//题目作答 float e3; e3=e1*1.0/e2;//对输出结果进行处理,保证输出4位小数 if(ans==e3) printf("right\n"); else printf("error right=%.2f\n",e3); } } /*void bracket(int e1,int e2)//随机生成括号(e1 op e2) { printf("("); int op1; op1=rand()%4; switch(op1) { case 1:addition(e1,e2); case 2:sub(e1,e2); case 3:mul(e1,e2); case 4:division(e1,e2); } printf(")"); }*/ /*void natural(int a)//随机生成自然数e { int s1=0; memset(A,0,sizeof(A)); while(a--) { srand((int)time(0)); A[s1]=rand()%100; s1++; } }*/
对于自己的程序,我持很不乐观的态度,因为有些可以单独作为子函数存在的循环代码,没有被提出来,想要一个判断答题是否正确的功能,就丧失了一部分其他的东西。本来可以简化程序的地方,也没有简化,程序看起来很繁琐很复杂,放在这里时时提醒自己吧。
说完了自己的东西,下面开始其他的吧。在自己编写这个程序的时候遇到了烦心事,然后就把有每位同学博客链接的文章找到,看了很多的其他同学的博客,有自己班的,有一起上课那班的,还有另外2个班的,心中五味杂全。以前的自己总以为我的大学没有白费,至少我会那么些其他人(周围的同学)不会的,有几个其他人没有的证书,有还算不错的成绩,有,,,但今晚我发现自己以前妄浪了,是,以前的自己和其他人比是优越的,但现在还是吗?时间在变化,人也再变化,而别人一直在不断行走,而我却原地踏步。就拿今晚看到的某个同学的博客,原来自己和他的差距现在已经达到了这种地步,亏自己一直还以应该和他水平差不多而随便,尽管有时候自己看见他再努力,但都不以为然,然而今天打响了我的耳光。又拿自己看到的另外几个同学的博客来说,大一大二的时候,我扪心自问,心里面真的是没有把他们当做过对手,从他们那里感到过压力,但当看到他们博客上规规整整的C++、java时,我很鄙视自己,我们都是同样学的,为什么现在别人用C++,java用的这么好,而自己却是当时用的好,现在却是门外汉,连最基本的语法语义都不记得了,现在的自己恐怕是别人都未曾看在眼里了吧。很多时候有机会可以让自己改变的,但是自己却放弃了,别人却坚持了下来,所以现在的落后是必然的,好好反思反思现在的自己,好好总结总结曾经的一切,真真切切的规划规划明天,那样才可能在剩下的短暂时间里重新获得主动权与俯视权,我愿在前方披荆斩棘,乘风破浪,丢弃该丢弃的,拿起早已放下的,哪怕有一天被带回原点,但我相信不会有这一天。
原文:http://www.cnblogs.com/xiaoyongwu/p/5274383.html