总分:110
7-2 说反话-增强版 : 给定一句英语,要求你编写程序,将句中全部单词的顺序颠倒输出。 输入格式: 测试输入包含一个测试用例,在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用若干个空格分开。
定义i,j,k为循环变量,num1为为计算字符中空格的数目 ,num为计算字符的长度 定义a数组为要求输入的数组 ,b为倒序输出 num=strlen(a); //计算总共有多少字符 if num等于1 then 输出这个字符 返回0 end if for i=0 to a[i] do if a[i]等于' ' num1++ // 计算空格数目 if num1等于num then//全是空格的数组 返回0 end if for i=num-1 to 0 do if a[i]不等于' ' then b[j++]=a[i] //将a数组反着输入到b中 end if else if a[i-1]等于' ' then //若是下一个仍是空格则继续循环 continue end if if num1等于1 then //解决一个单词后面一个一个空格 continue for k=j-1 to 0 do //输出 倒序输出b数组 end for j=0 end for if i==-1 for k=j-1 to 0 do 倒序输出b数组 end for
Q1:一开始各类错误,有超时啊,有格式错误啊,有答案错误。。。 A1:才发现我把循环的位置弄错了,把循环包括的范围直接连最后的输出也包括进去了 Q2:最后输出的时候仍是错了。。。全是格式错误,并且改了特别久都是格式错误。。。 A2:再定义了个变量num1,经过num1计算空格有多少就能够来分别控制到底该怎么输出了,经过判断num1与num的关系来看是否全是空格 Q2:最后一个测试点一直过不去:是不是一个单词后面接一个空格这种状况,调了好多种办法,试过再新增一个变量还有其余方法 A3:最后仍是用了num1的做用,若是num1等于1,证实只出现一个空格并且仍是在末尾部分
函数1构造字符数组存放算数表达式而且还包含了对于不合法或者超出该级别小学生学习范围的表达式的处理;函数3计算出表达式的结果并将结果返回
算法分析:(对于计时函数等就不介绍了) void CreateExp(char *exp,int level,int number) 定义字符数组Ch为[-,+,*,/] 定义Flag为判断可否整除 定义answer为读者输入的答案,i为循环变量初值为1, flag为是否继续学习,result正确结果,count为题目数量 for i=1 to number do switch level do case 1 do exp[0]=rand()%10+'0' exp[1]=Ch[rand()%4] exp[2]=rand()%9+'1' if exp[1]等于'/' then //当为除法运算时候,要给小学生考虑下给它能够整除的状况 Flag=(exp[0]-'0')%(exp[2]-'0') //判断能不能整除的状况 while(Flag不等于0)do //不能整除的时候 exp[2]=rand()%9+'1' Flag=(exp[0]-'0')%(exp[2]-'0') end while end if break case 2 do exp[0]=Rand(2) exp[1]=Rand(1) exp[2]=Ch[rand()%4] ......exp[8]='\0' //参照等级一,把等级二的7位字符分别存进字符数组exp中 break case 3 do exp[0]=Rand(2) exp[1]=Rand(1) exp[2]=Rand(1) exp[3]=Ch[rand()%4] ......exp[11]='\0' //参照等级一,把等级二的10位字符分别存进字符数组exp中 break
改进这段代码是真的痛苦啊。。。改特别久绝望的啊,一直以为语法没错,但是就是随机数这里一直错误,我一开始把随机计算运算符号的也弄一个函数,后来好像就由于这样,致使随机数输出的时候出错了,还有各类死循环,状况见下图
随机数一点都不随机。。。
万恶的不知道怎么的就死循环了。。。算法
在函数1中就包括有函数2的要求内容,因此在这里就不介绍了
(PS:我将exp[2]的值直接不包含0这样子就能够不用担忧除数为0的状况了)数组
算法分析: 定义字符ch为存放计算符号 定义循环变量I,result为计算结果,sum为每位数,flag为控制变量 for i=0 to exp[i] do if exp[i]>='0'&&exp[i]<='9' //将不是运算符号的字符一个个变成数字 then sum=sum*10+exp[i]-'0' //将每个字符除了运算符号外转化为数字存在sum里 if level==1&&i==2||level==2&&i==7||level==3&&i==10 //当将最后一个运算符号存给ch时候下一循环是不会在进入到计算循环里面的 switch(ch) //判断最后一个运算符号是什么 ,而且计算出最后结果 case '+': result+=sum break case '-': result-=sum break case '*': result*=sum break case '/': result/=sum break end switch end if end if else if flag等于0 then //当遇到第一个运算符号时候,再将计算符号存到ch中 result=result+sum flag++ ch=exp[i] sum=0 continue end if else switch ch //计算结果 case '+': result+=sum break case '-': result-=sum break case '*': result*=sum break case '/': result/=sum break end switch ch=exp[i]; sum=0; end else end for return result
原有函数的截图(特别长只截取了难度为1级的代码其他两个等级也是差很少的)
函数
原有函数的截图
学习
1. 二级三级的难度乘除法中一开始改写改着。。。随机数全都不随机了。。。三个数中必定有两个数是相同,改了特别久,原本是将随机数的出现放在一个函数中,运算符号也放在一个函数中,后来我参考了秋斌的代码还有一只调试,才发现是*exp[+(i++)]错误了,我就直接用数组方法和将计算符号的函数去掉不用函数了,这样才解决了 2.我一开始在书写计算函数的时候也是参照老师所给的代码写的,写着在和本身原本的代码进行对比,而后。。。新代码最后算出来的result是一个数的值,这就绝了啊,最后仍是给写出来了。。。改了好久的代码。。。真的好久 3.经过指针改进代码仍是用得少不习惯不熟悉,仍是许多不懂,有时候写完一段一编译各类编译错误,函数的封装仍是很重要的,各类衔接都很关键,若是用得好能够减小不少工做量,代码看起来也会很精简 4.不少功能若是同样的话能够再把它封装一下,在以前也有这个想法,但是一直没实现由于函数传递参数的缘由致使要改得面目全非。如今学了指针能够直接经过改内容就能够将各类功能封装成一个函数 5.大做业仍是有些bug没能处理,就是要判断整除的方法,我是经过Flag这个变量来判断是否能够整除,但是这样耗时就有点久了,有时候devc直接卡住了 6.做业不能再拖了…不能再拖下去拖到最后一天才写了,根本没时间去改大做业啊,好不容易改了也是不少bug…之后不能再将做业拖着了……