本周学习感觉:自从接触了指针,感受打开了新世界的大门。原先在数组、字符串的学习中已经对于地址这个概念有了一个较为深入的了解,经过本章对指针的学习,对于内存、地址有了更加全面的认识,而且掌握了如何使用指针去访问内存单元。相较以前的数组、字符串来讲,直接用指针去访问内存单元会更加直观。指针被称为c语言的灵魂是有依据的,由于它确实很方便,同时也是c语言的特点。但同时,指针也是一个难点。好比野指针的概念,我刚开始使用指针的时候就总是犯错误。并且对于指针的更深层次的研究,如二次指针,就有些复杂,须要仔细思考一番才能理解它的意思。总而言之,本周对于指针的学习较为顺利,我的认为指针的引入十分的有意义,指针使得访问内存单元更加直观,确实很好用;可是要用得熟练,仍须要训练。算法
给定一句英语,要求你编写程序,将句中全部单词的顺序颠倒输出。测试输入包含一个测试用例,在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用若干个空格分开。数组
定义字符串a存放单词串,字符型指针p存放a的首地址 输入字符串a 定义整数len存放a的长度,i、j为循环变量,变量flag控制是否输出空格 for i=len-1 to 0 do if 此时p指向的字符为单词首字母 then if flag==1 then 输出空格 end if for j=i to p+j指向的字符为空格或为字符串末字符 do 输出该字符 end for if flag==0 then flag=1 end if end if end for
其实这题我原本用的字符串作的......后来强行改为了指针
安全
声明:因为个人第一次大做业代码几乎没有使用全局变量,因此只是对原有的程序结构及功能进行完善函数
声明:因为在第一次大做业时个人代码中这三个函数的功能都集中在一个大函数Calculate中,所以此次改进,我主要把该函数拆分并改善学习
传入用于储存计算式的地址,储存到字符型指针变量exp中,传入等级level 整型变量i,j为循环变量 字符数组“+-*/” if level=1 then 生成一步一位数加减乘除计算式,并储存 while *(exp+2)==0 do //保证分母不会出现0 *(exp+2)=rand()%10+'0' end while else if level==2 orlevel==3 then 生成两步2/3位加减计算式,并储存 end if 输出 请输入“计算式”的答案
传入计算式的地址,由字符型指针exp存放 整形sign=1 if 前一个数不能整除后一个数 then sign=0 end if if 当运算符为-或/且前一个数小于后一个数时 then sign=0 end if 返回 sign
传入算式字符串的地址给字符指针变量exp,传入答案地址给整型指针变量answer *answer初始化为0,oldop记录旧的计算符,初始化为'+' 定义i为循环变量m为中间变量,记录每一个数字的值 while *(exp+i-1)!=0 do if *(exp+i)是数字字符 then m=m*10+*(exp+i)-'0' //计算m的值 else if oldop为'+' then *answer+=m; else if oldop为'-' then *answer-=m; else if oldop为'*' then *answer*=m; else if oldop为'/' then *answer/=m; end if oldop=*(exp+i); //新的字符取代旧的字符 m=0 //从新初始化为0 i++ end while
原先只有一个长得吓人的大函数:
测试
3.两者缺点:新函数的分块实现虽然将功能分块实现,可是功能有待完善,同时参数间的传递较为复杂,不便阅读。旧函数的缺点就很明显,功能集中致使代码冗长,可读性差,拓展性也很弱。3d
第一次写大做业时:第一次写还算比较顺利,由于不须要大量调用函数(由于构思时的函数模块划得不是特别好),主要困难是调试一些bug,以及在程序的交互性上花了比较大的功夫。由于是重头开始写,因此花的时间还算久。
第二次写大做业时:第二次进行改良的时候明显就困难多了,由于改代码要比从头开始写代码可贵多(我的观点),虽然是本身的代码,但毕竟也有一段时间了,因此改以前仍是瞅了很久hh。而后此次的修改主要有两个方面:第一是对以前安全输入bug的修复(我加了个安全输入的函数),第二就是为了程序的拓展性而把大函数拆分红几个函数,这也是重难点。在写程序的时候,明显感受到在进行参数传递的时候,不够熟练(由于写得仍是太少)。再就是此次得代码中加入了被调函数中再调用函数的状况,致使代码写得很慢,思路也比较乱。指针