C语言博客作业05---指针
1.本章学习总结
1.1 思维导图
1.2 本章学习体会及代码量学习体会
1.2.1 学习体会
- 这一阶段学习了关于指针的知识,对于指针,个人感觉它比之前学习的知识更加抽象,更加难理解。
- 这阶段也挺累的,最近学的知识包括指针都是在没预习的情况下老师直接开始上课了,学起来有点儿吃力。但好在可以通过课堂派pta的作业来训练对指针的运用。
- 很多人都说指针是C语言的灵魂,所以可以突出它的重要性,虽然它很难搞清楚,但是也要努力去学好它。
- 学了指针之后相比之前有更加好的解题思路,没学指针之前用数组比较多,调用函数时直接把整个数组传过去,但是学了指针之后,可以直接传地址就可以了。
- 指针最大的优点就是可以提高编程的质量,也就是代码的效率。所以要好好学习对指针的运用。
1.2.2 代码累计
2.PTA总分
2.1截图PTA排名得分
2.2 我的总分:
- 110分
3.PTA实验作业
3.1 PTA题目1
给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。
测试输入包含一个测试用例,在一行内给出总长度不超过500 000的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用若干个空格分开。
3.1.1 算法分析
char op[500001];//定义最大情况
int i,j,len;
int count=0;//定义计算每个单词的长度
int flag=1;//控制空格输出
gets(op);//得到字符串
len=strlen(op);//得字符串的长度
for i=len-1 to 0 //遍历字符串
if op[i]!=' ' then count++ end if //计算每个单词的长度
if op[i]>='A'&&op[i]<='Z' then
//控制空格输出
if flag==1 then flag=0; end if
else 输出空格
for j=i to i+count 输出单词 end for
count=0//重新计算下一个单词的长度
end if
//对最大的情况进行输出
if count>0 then 输出空格
for i=0 to count 输出单词 end for
end if
3.1.2 代码截图
3.1.3 PTA提交列表及说明
Q1:第一次提交格式出错,有看了看题目,才发现结尾不可以有空格。
A1:后来定义flag来控制空格的输出,第一个单词前不输出空格,后面的单词前都需要输出空格。
Q2:没有考虑到最后一个测试点,就是最大的时候可能没有开头的大写字母就结束了,这样没遇到大写字母就没法输出。
A2:后来继续去考虑count是否大于0,如果大于0就说明还有单词没有输出,再把最后那个输出即可。
4.大作业
4.1.改造函数介绍
1.函数1
begin://以防输入非法字符,可以重新输入
int i=0,j,answer;
double totalTime;//计算每题的答题时间
char op[4]={'+','-','*','/'};定义字符串来随机生成符号
if level=1 then
生成一步一位数加减乘除计算式,并储存
end if
else if level==2 orlevel==3 then
生成两步2/3位加减计算式,并储存
end if
if strlen(exp)==3 then//判断是否可以整除,不可以则重新生成表达式
if !IsExp(exp) then goto begin end if
end if
2.函数2
int flag=1//控制输出
if 运算符是除号时 then
if 结果不能被整除时 flag=0; end if
end if
if 运算符是减号时 then
if 前一个数大于后面一个数时 flag=0; end if
end if
return flag;
3.函数3
int m,sum=0,i,answer;
char oldc='+';
if strlen(exp)==3 then//如果是第一级别的情况
if 中间的符号是+ then answer=前面的数+后面的数 end if
if 中间的符号是- then answer=前面的数-后面的数 end if
if 中间的符号是* then answer=前面的数*后面的数 end if
if 中间的符号是/ then answer=前面的数/后面的数 end if
end if
else//如果是第二,三级别的情况
for i=0 to strlen(exp)
if 字符在0到9之间 then
m=10*m+(*(exp+i)-'0');//求每个数的数值
end if
else //字符不在0到9之间
if oldc=='+' then sum=sum+m; end if
else sum=sum-m; end else
m=0;
oldc=*(exp+i)
end else
end for
answer=sum;
end else
return answer;
4.3 与原有函数代码比较
- 原来的代码
- 两者不同:主要的不同就是之前的函数运用得不好,这次有好好运用函数了。改造之前我的创建表达式的代码都是在每个级别的函数里面,之前的代码运用函数使用得不好,整个程序就只有三个函数,分别就是每个级别各一个函数,这样写可读性很差,虽然有达到要实现的功能,但是三个代码里面有很多重复的代码,可以使用函数将代码进行重新构造,就像这次写的代码,就有重新构造了函数,使代码的可读性更好,性能也更加好。
- 两者优点:新函数的分块实现功能很明显比旧函数有更好的可读性以及拓展性,实现分块包装函数,如果有出现错误的话可以更加简单的进行代码的改进,不用到处找哪里出错,很明显的就可以看出哪里出错了。而且如果要对代码进行升级的话,分块包装函数的作用就更明显了。
- 二者缺点:虽然大部分完成了所需要的功能需求,但是还是存在bug,函数之间参数的传递连接不能够很好的衔接,功能有待完善。且由于函数之间的调用,函数中还嵌套着函数,使函数不便阅读。旧函数的缺点就更明显了,功能集中导致代码很长且各个函数之间有许多重复的内容,可读性差,拓展性也很弱。
4.4 改进大作业总结
- 第一次写大作业时,由于刚学函数没多久,对函数的使用方法不是很了解,使用第一次的大作业只有三个函数,就是不同级别的函数分装在不同的函数里,但是这样的话定义变量的时候又要重新定义与之前相同的变量,导致代码的可读性很差,拓展性也很弱。
- 到了第二次写大作业时,思路由于之前就有了,所以相对于之前有比较轻松,而且这次使用了函数分装的写法,使代码看起来更规范,更有可读性。但对于函数的的使用方法还是有点不懂,形参实参的传递以及函数怎么使用还是不太熟练,可能是题目做得不够多,再加上平时的作用都是直接写,很少去使用函数,所以才会导致现在函数使用不是很明白。但好在通过这次的大作业使我对函数的使用有更加深刻的理解,用了函数的分装之后发现,代码看起来美观多了,而且每个函数的功能明确,要修改代码的时候更加的方便,而且如果要拓展函数的话,只要在定义新的函数即可,在进行函数的连接,很快就可以完成函数的拓展。