1.本章学习总结
1.1 思维导图
1.2 本章学习体会及代码量学习体会
1.2.1 学习体会
- 1. 老师说过指针的学习很重要,指针是C的灵魂,也给我们演示了,的确c里面很多都用到了指针,指针是C的灵魂说得很对啊。(⊙v⊙)。
- 2.指针的学习感觉难度很大了,因为抽象化了,不是再像数组或者函数与数学有些相似的那样就可以好理解些。指针跟我们以前学习了解的数据类型不一样,指针虽然也是一种数据类型,只不过是专门存放地址的数据类型。
- 3. 指针的算术运算对于理解指针的理解也是很有帮助的,因为也算是符合它“指”的特点,指针的加法运算即是指针当前所指的位置再移动n个单元,并且结果还是个指针。两个指针不能进行加法运算,这是非法操作,因为进行加法后,得到的结果指向一个不知所向的地方,而且毫无意义。两个指针可以进行减法操作,但必须类型相同。
- 4.指针的运用还是很方便的,特别是在函数上面,本来在学习和使用函数的时候就有一些比较不方便的地方:函数只能返回一个值,而且还有想要通过形参改变实参也是比较麻烦的。学习了指针以后,可以通过直接改变指针的所指对象的内容来解决函数只返回一个值的问题。而且一个函数如果使用了指针作为形参,要保证行参和实参类型一致,否则需要强制转换。︿( ̄︶ ̄)︿ ( ̄︶ ̄)︿( ̄︶ ̄)︿
- 5.后来老师又教会我们各种有关于动态分配内存有关的函数,动态存储分配函数mallo(),动态存储分配函数calloc(),动态存储释放函数free(),动态存储分配函数需要自己慢慢理解,这些需要很好的思维,因为抽象化还是很多的,要自己去想象,而且要考虑到很多地方,最后还要释放动态分配的空间
1.2.2 代码累计
2.PTA总分
2.1截图PTA中函数题目集的排名得分
2.2 我的总分:
总分:110
3.PTA实验作业
3.1 PTA题目1
7-2 说反话-加强版 :
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
输入格式:
测试输入包含一个测试用例,在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用若干个空格分开。
3.1.1 算法分析
定义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
3.1.2 代码截图
3.1.3 PTA提交列表及说明
Q1:一开始各种错误,有超时啊,有格式错误啊,有答案错误。。。
A1:才发现我把循环的位置弄错了,把循环包括的范围直接连最后的输出也包括进去了
Q2:最后输出的时候还是错了。。。全是格式错误,而且改了特别久都是格式错误。。。
A2:再定义了个变量num1,通过num1计算空格有多少就可以来分别控制到底该怎么输出了,通过判断num1与num的关系来看是否全是空格
Q2:最后一个测试点一直过不去:是否是一个单词后面接一个空格这种情况,调了好多种办法,试过再新增一个变量还有其他方法
A3:最后还是用了num1的作用,如果num1等于1,证明只出现一个空格而且还是在末尾部分
4.大作业
4.1.改造函数介绍
函数1构造字符数组存放算数表达式并且还包含了对于不合法或者超出该级别小学生学习范围的表达式的处理;函数3计算出表达式的结果并将结果返回
1.函数1:构造字符数组存放算术表达式及整除情况
算法分析:(对于计时函数等就不介绍了)
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.函数2
在函数1中就包括有函数2的要求内容,所以在这里就不介绍了
(PS:我将exp[2]的值直接不包含0这样子就可以不用担心除数为0的情况了)
3.函数3:表达式运算
算法分析:
定义字符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
4.3 与原有函数代码比较
函数1与原有函数代码比较
原有函数的截图(特别长只截取了难度为1级的代码其余两个等级也是差不多的)
- 1. 首先最直观的一点就是代码量少了很多,真的少了特别特别多,直接就是百行没了,而且感觉改进后的代码看起来比较牛了,这样子调用感觉就是会比较高大上的感觉吧,而且本来还设置了好多个变量,来放置各个随机数的值,这样子也使得代码看起来很冗长繁琐。
- 2.没改进前的代码在一个函数中有很多种功能有创造计算式、还有判断除数为不为0情况、判断答案正确与否,还有计算功能,很多功能,也使得这个函数看起来很杂乱,而且也有很多重复的功能感觉应该可以再放在一个函数中
- 3.这一次还有个新的亮点就是随机数时直接使用rand()%9+1,这样就不会得到除数为0的情况也就可以不用再去判断除数是否为0的情况,没改进前为了这个除数不能为0情况实在是写得很长,还有这回考虑到了小学生除法最好是可以整除的情况。。。
函数3与原有函数代码比较
- 1. 改进前的代码实在是很麻烦啊,每个等级的难度,我都各自设了一个对应的函数来计算他们的结果,这样子就很麻烦了,代码也很长,而且功能其实是重复了已经,但是那时候也想过改进,可无从下手,这回有老师的代码可以参考,这样子就把这一部分的很多代码量都给省掉了
- 2.改造后的代码也不用判断是一级难度还是二三级难度了,直接用一个计算函数就解决了,将这些具有相同功能的代码给弄进了一个函数里面,而且特别是这个新函数代码的可读性更好了,巧妙的将字符转化为数字再累计还有对运算符号的判断,整个代码看起来更牛逼了
4.4 改进大作业总结
1. 二级三级的难度乘除法中一开始改写改着。。。随机数全都不随机了。。。三个数中一定有两个数是相同,改了特别久,本来是将随机数的出现放在一个函数中,运算符号也放在一个函数中,后来我参考了秋斌的代码还有一只调试,才发现是*exp[+(i++)]错误了,我就直接用数组方法和将计算符号的函数去掉不用函数了,这样才解决了
2.我一开始在书写计算函数的时候也是参照老师所给的代码写的,写着在和自己本来的代码进行对比,然后。。。新代码最后算出来的result是一个数的值,这就绝了啊,最后还是给写出来了。。。改了很久的代码。。。真的很久
3.通过指针改进代码还是用得少不习惯不熟悉,还是许多不懂,有时候写完一段一编译各种编译错误,函数的封装还是很重要的,各种衔接都很关键,如果用得好可以减少很多工作量,代码看起来也会很精简
4.很多功能如果一样的话可以再把它封装一下,在之前也有这个想法,可是一直没实现因为函数传递参数的原因导致要改得面目全非。现在学了指针可以直接通过改内容就可以将各种功能封装成一个函数
5.大作业还是有些bug没能处理,就是要判断整除的方法,我是通过Flag这个变量来判断是否可以整除,可是这样耗时就有点久了,有时候devc直接卡住了
6.作业不能再拖了…不能再拖下去拖到最后一天才写了,根本没时间去改大作业啊,好不容易改了也是很多bug…以后不能再将作业拖着了……