这周学习了指针相关的知识,一周的学习下来我以为指针比前面任何一章的知识都要难理解,再加上上一周的数组题量比较大也比较难,因此关于指针的预习没有作到位,上课时不少知识点讲的比较快跟不上,下来作题发现不少都不懂; 指针的题目很少,最开始作指针的函数题以前我从新看了一遍课本,看完也还有一些没法理解的地方,因此在作函数题时感受本身的思路和方法都和数组差很少,但到作编程题时就发现只有用指针的方法才能够简洁明了地完成题目,因此在编程题上花的时间比函数题要多,但经过编程题也对指针的内容更加了解了。
给定一句英语,编写程序,将句中全部单词的顺序颠倒输出。算法
定义字符数组a存放单词串,定义空指针p,i=0 gest(a) 定义len计算数组a的长度 for i=len-1 to i=0 do if 某个字符不是空格且前面不是空格或者该字符为字符串第一个 then for p指向该字符即单词首字母 to *p指向空格或*p指向结束符'\0' do 输出这个字符 end for if 该字符不是首字符且第一个单词前无空格 输出一个空格 end if end for
Q1:数据的第一个单词不会在最后输出;
A1:输出字符的循环条件是前一个字符为空格且字符自己不是空格,但循环到第一个单词时它的首字母前面无空格,因此没法输出,加了一个i=0的条件后解决了。
Q2:若是输入的数据为一个单词且前面有一个空格时个人代码将会输出那个单词和空格,过不了测试点;
A2:在控制输出空格的条件中加a[0]不等于空格,就是若是第一个单词前有空格的话,倒序后输出的单词后面也不会有空格,解决这个问题改的地方很少但确实是试了不少方法。编程
void CreateExp(char *exp,int level) 定义字符数组存放运算符 level做为switch语句的条件 if level=1 生成随机数,运算符,随机数储存在数组中 end if且跳出循环 if level=2 生成对应随机式储存在数组中 end if且跳出循环 if level= 生成对应随机式储存在数组中 end if且跳出循环 then 输出随机式
定义m储存随机数,sum储存计算结果,i为循环变量 定义字符变量oldc储存为数组中的运算符 do if 字符为1-9中的数字 then 将字符转为数值 并存到赋值给m i++ end if else if oldc为运算符'+' 将m累加到sum中 数组中下一个字符赋值给oldc i++ end else 读到字符数组结束符中end do 返回运算结果sum
改造前函数1和改造后的函数1:
改造前用于生成随机运算式的函数我用了两个个,一个生成随机数,一个生成随机运算符,而且每个随机数和运算符都定义为了全局变量,在主函数中也写了很长一串,用指针改造后,本来的两个函数的功能用一个函数就实现了,随机数和运算符的生成都经过储存到字符数组中来实现输出,减小了不少全局变量的使用,并且代码也简洁了不少,函数的功能没有重复。数组
改造前函数2和改造后的函数2:
改造前计算正确结果的函数传入了6个参数,用if来判断等级和switch语句来判断运算符,不一样的运算符进行不一样的计算,改造后的函数经过判断字符的类型来直接进行计算,省去了用switch语句中重复的部分,虽然改造后的函数没有比改造前函数的代码量少不少,但内容比原先的函数精简不少,但原先的函数更容易理解一点。函数
此次的大做业虽然是在上次的做业基础上作修改,但难度不比上次的做业小,首先是由于我对指针的使用还不太熟练,不少地方在修改的时候我都会看一下作过的pta和课堂派的指针题目去了解一些指针的用法,而后再修改本身的代码,因此改造仍是花了挺多时间的,也仍然存在bug,但相较与第一次的大做业确实减小了将近十个的全局变量的使用,代码量也减小了不少。 上一次做业存在的优先级的问题还暂时没有彻底解决,接下来也会继续思考完善要解决优先级问题的代码,但愿在下一次的改进中程序的功能有更好的拓展性。