1.本章学习总结
1.1 思维导图
1.2 本章学习体会及代码量学习体会
1.2.1 学习体会
- 函数的学习能够大大的简化主函数,使程序看起来更加清晰明了。其实在循环结构和分支结构中,就已经学习了一些数学函数的调用。在正式的函数学习中,则初步掌握了自定义函数的设计与运用,能够自主设计一些函数来简化程序。
需要注意的是函数结构的一些格式以及函数调用的步骤。初步学习,在函数的调用上常出现问题,源自对于函数调用流程的不熟悉与理解的不透彻。要理解实参与形参的关系,return值的意义。同时需要掌握一些变量的运用,平衡利弊,选择适合的变量(全局变量/局部变量/静态变量),熟悉不同的变量的作用范围与时间。
了解函数的规则,如传参方向等,能够较为清晰的掌握变量在运行过程中数值的变化。
1.2.2 代码累计
2. PTA总分
2.1截图PTA中函数题目集的排名得分
2.2 我的总分:
- 总分:145
3. PTA实验作业
3.1 PTA题目1
本题要求实现一个计算Fibonacci数的简单函数,并利用其实现另一个函数,输出两正整数m和n(0<m≤n≤10000)之间的所有Fibonacci数。所谓Fibonacci数列就是满足任一项数字是前两项的和(最开始两项均定义为1)的数列。
3.1.1 算法分析
int fib( int n );
定义item项目,num1第一个数字,num2第二个数字,i项数
if n==1||n==2 then item=1
end if
if n>=3 then
for i=3 to n do
item=num1+num2;//前两项和
num1=num2;//更新前两项值
num2=item;
end if
return item;
void PrintFN( int m, int n );
定义i总项数,flag=0,j项数,item项目
while fib(i)<10000 //输出所有的数
i++;
for j=1 to i
item=fib(j);
if n<item<m &&flag==0
then
printf item;
flag=1;//控制空格
end if
if n<item<m &&flag==1 //在区间内第二个数,且区间两端不相等
then
printf 空格+item
end if
end while
if(flag==0)//无输出
printf 没有F数
end if
3.1.2 代码截图
3.1.3 测试数据
3.1.4 PTA提交列表及说明
- Q:最小区间答案出现错误
- A:当区间为[1,1]时,应该输出两个F数
4.大作业
4.1.函数关系图
4.2.函数功能介绍
- 定义
1.函数1&2
Menu&Ending[菜单&结果统计]
- 为了使主函数更加简洁并具有可读性,所以直接将菜单和结果的统计装进函数里。
2.函数3&4&5
gradeA&gradeB&gradeC[ABC三个等级]
- 题目设定:答完并答对十题结束游戏
- 采用while循环限定答题次数,如果想随时随地停止输入6666,要是想不限条件,可以改成while(1)
- A等级为个位数的加减,产生随机数,利用%号限制位数,产生x,y两个值,对其进行输出与运算
- 输出提示(式子)
- 再产生一个随机数,利用switch case,随机进行加减乘除的运算。
因为三个函数内容相似,便只展示gradeA一个函数
3.函数5&6&7&8
plus&minus&multiply÷[加减乘除]
- 为了更灵活调动函数,所以根据功能直接分装成4个函数。
- 除法,先判断除数y是否为0,如果除数为0,则跳过,进入下一轮。
- 为了保证输入不被除数字外的其他非法字符干扰,因此利用fflush(stdin)清空输入缓冲区;
- 输入答案
- 利用while循环判断,当答案正确时,输出正确提示信息,答案错误时,输出错误提示信息,并再次输入数字,直到答案正确。
- 这里之前出现过一个很神奇的bug,不定期的会输出两边菜单,不过骂骂就好了,后来突然想到可能是因为判断除数条件的时候没有清屏导致der
- 利用判断输入值6666,控制条件直接跳出循环跳到endingw
- 引用暂停指令缓冲 pause
- 清屏进入下一题。
因为函数功能类似,这里只展示除法函数 - fine!!这里做一个更正划重点!!!
相较之前的代码在除数为0的情况下要清屏!!!否则碰到除数为零会重复输出鸭!!!之前思考了很久都不知道哪里出问题!!!
4.函数9&10
错误信息和正确信息
- 产生随机数
- 利用switch case随机输出提示信息
4.3 运行结果截图
版本1
版本二 fine 我来更新一下程序,增加了一个答错三次提示正确答案,输入6666直接退出的功能
menu
输入错误
答对
答错三次输出正确答案
输入非法字符
- Fine.在纠结是否要计算执行时间这方面纠结了一下下 但是发现程序末尾系统自带了一个执行时间execution time就没有再加上这个功能啦
统计结果
4.4 调试碰到问题及解决办法
- Q:输入错误的答案,没有出现相应的提示语,再次输入才出现
- A:在错误信息的提示函数中,随机产生0 1 2 3四个数,但是少写了2对应的case,增加上即解决这个问题
- Q:在菜单选择时,输入非A B C程序无响应
- A:对于非法数据的处理,首先使用while循环,使菜单重复输出,用if判断,如果输入正确,break跳出循环清屏;反之,清屏输出提示语句,再次输入。
- Q:输入答案时,输入非法字符,程序进入死循环
- A:为了解决这个问题,尝试了不同的写法,也问了学长学姐。一开始考虑采用和PTA二进制写法类似的写法。利用循环,getchar挨个输入判断,再利用 num=num*10+ch-’0’转数字。因为涉及的地方比较多,位数不固定,所以就比较麻烦,尝试了几次就放弃了这种做法。然后尝试调用fflush(stdin)语句清空缓存区,解决了这个问题
- A:在输出正确率时,无法输出%号
- Q:百度后得知需要printf(“%%”);方可
4.5 大作业总结
- 花了一定的时间去制作思维导图,但是真的开始写大作业的时候,还是有些手足无措。
- 联想到上次课堂派的最后一题,就先去仔细研究了一下课堂派那题的代码。在错误信息和正确信息的产生上,参考了课堂派的写法。为了使函数的调用更加灵活所以将+-*/都分开写,起初为了确认函数的书写无误,便先写了一个+函数试水(除法函数为了便于输入答案,全部以int类型计算)。调试通过后,就相应的写出另外的几个函数,再讲几个函数进行分装到不同的等级,对应不同的随机数。为了使函数更加简洁,引入了全局变量。分装完毕为了使函数看起来更加直观这个时候再写入menu和ending。简陋的程序雏形出现后,再进行美化和功能的拓展。
- 相比从开始写,我选择了更倾向于自己第一感觉的倒序写法,便于第一时间发现错误。(一开始也考虑顺序写,但是顺序写函数套函数,无法第一时间判断函数的正误)。这样的写法使整个写代码过程过的相对比较顺利,比较快的能够出现一个雏形。大作业给我的最深刻的启示就是——千万不要想太多,先把基础的框架写出再做修改。否则只会想想想想越想越乱。另外比较重要的一点是,尝试不同的数据。刚开始写完,没有发现一些可能使程序瘫痪的地方(因为就是按着程序提示写),给同学试了一下程序之后发现了问题,在这个方面,以后要多加思考。总的来讲,写大作业的过程比写pta还是要快乐一些,真的实现了实用性的功能,希望再接再厉,多拓展功能。
TIPS:
- 由比较简单的函数写起,再装进复杂一些的函数中
- 程序需要有一定的应付非法字符的能力,自我调整
- 程序需要有一定的提示信息
- 要能够做到重复输入