1.本章学习总结
1.1思维导图
1.2本章学习体会及代码量学习体会
1.2.1学习体会
本周学习了函数,其实,函数于之前学习的三大控制结构是密不可分的,而函数又有其特殊的地方,例如:函数的声明、函数的调用等等。我们之前编写程序是将过程写在主函数中,而函数则是将思路过程单独放出来写在主函数的外面,这样编写程序可以使得主函数更加简洁明了,使人阅读起来一目了然。一开始学习函数的时候,我还嫌用函数做麻烦,同样的代码,用函数写起来又长又不方便,觉得调用函数多此一举。后来在学习的过程中,及老师上课的讲解下,明白了:目前我们编写的程序又简单又短,比起调用函数,直接在主函数中编程更加方便。而当我们要编写一个大程序且多次用到同一种运算方法时,调用函数就是一个很好的方法,就可以不用重复多次的编写相同的代码,是程序更加简洁。
1.2.2代码累计
2.PTA总分
2.1截图PTA中函数题目集的排名得分
2.2 我的总分
函数:145
总分:145
3.PTA实验作业
3.1 PTA题目1
使用函数输出指定范围内的Fibonacci数
本题要求实现一个计算Fibonacci数的简单函数,并利用其实现另一个函数,输出两正整数m和n(0<m≤n≤10000)之间的所有Fibonacci数。所谓Fibonacci数列就是满足任一项数字是前两项的和(最开始两项均定义为1)的数列。
3.1.1 算法分析
- fib( n )函数
定义整型变量i、三个双精度浮点型变量int1=1、int2=1、int3//用于实现Fibonacci数的累加
if n=1 或者 n=2 thenreturn 1 //当n小于3时,返回1
for i=3 to i=n doint3=int1+int2 //int3等于前两个数的和int1=int2 //将第二个数的值赋给第一个数int2=int3 //将第三个数的值赋给第二个数
end for //依此循环,实现Fibonacci数
返回 int3 的值
- PrintFN( m , n )函数
定义整型变量i=1、flag=1//flag用于判断是否有Fibonacci数
while fib(i)<m do //让Fibonacci数增加到mi++
end while
while fib(i)<=n doflag=0if fib(i+1)<=n then //判断该项Fibonacci数是否为范围内最后一项输出 fib(i) 后输出空格 //不是,则在输出该数后输出空格else输出 fib(i) 后换行 //是,则在输出该项后换行end ifi++
end while
if flag=1 then //没有Fibonacci数输出 No Fibonacci number
end if
3.1.2 代码截图
3.1.3 测试数据
测试数据1
测试数据2
3.1.4 PTA提交列表及说明
Q:部分正确是有什么地方没考虑到吗?
A:一开始没考虑到第二个函数中只有1个1的情况,在另外加上这个条件语句后,这条测试点过了。
Q:中间出现的编译错误是什么情况?
A:第一次部分正确后,在添加条件语句的时候不小心将等号写成了赋值号。
Q:过了该测试点,还有什么问题?
A:之后提交多次发现 最大范围 的那个测试点过不了,之前遇到这类问题,改变一下数据类型就好了,但是我改变了数据类型后,还是一样的结果。在多次尝试未果下,请教了其他同学。但是也不知道为什么过不了,就转换了一下解题思路,换了种方法做,才将题目解出来。
4.大作业
4.1.函数关系图
4.2.函数功能介绍
1.友好输出界面函数,供用户查看
输出友好界面,供用户查看,解决非法字符输入问题,专治熊孩子
void Menu();//显示菜单
int LevelChoice();//级别选择
2.随机获取数值、运算符
使得用户做的题目不同,做到随机出题
- void NumberGet();//获取随机数
- void OperatorGet();//获取随机运算符
3.游戏运行主干函数
用于整合各个函数,保证程序运行
- void GameBegin();//游戏主程序
4.计算函数
计算程序随机给出的题目,用于判断用户答案的正误
- double Calculate();//题目计算
5.void Choice();
一轮游戏结束后,选择是否继续游戏
4.3 运行结果截图
- 非法输入(专治熊孩子)
- 情况一
- 情况二
- 正常输入
- 1
- 2
- 直接退出
4.4 调试碰到问题及解决办法
Q:是怎么解决熊孩子问题的?
A:最开始的时候,将输入的选项定义成整型,在调试的过程中发现程序无法识别除数字外的非法字符,然后就考虑用字符变量的方法做,改完代码后就可以识别任意的非法字符。在舍友的提醒下,发现还存在着一个bug,万一那孩子特皮,输入了一连串的非法字符该怎么办?后来想到可以用while循环消除掉一连串的非法字符。
Q:在改动非法字符输入的那块程序时,出现了无法输入的情况,是怎么解决的?
A:一开始是懵的,后来突然想到,前面有输出的时候要用一个空格吃掉字符,再进行输入。
Q:一级难度中除法除不尽的情况下,是怎样解决判断正误的问题的?
A:刚开始的时候,全部用整型数据,调试的时候也除法直接取整,觉得一点毛病也没有。后来写着写着突然醒悟,这不是C语言,是小学生的四则运算。然后就把所有数据都改成了double类型的,后来再运行的过程中发现,当除数除不尽的情况下输出正确答案也显示答案错误。经过一番思考,发现电脑中的结果是无限小数,与我们输入的数永远不可能相等。然后我就在想该怎样将无限小数四舍五入成有限的两位小数。第一个反应是强制类型转换,然后经过试验之后发现这个方法是可行的。
(强制转换做法:rightAnswer=number1/number2+0.005; rightAnswer=1.0*((int)(rightAnswer*100))/100;)
4.5 大作业总结
其实,编写代码就是一个写代码,发现bug,改代码的过程。在写大作业的过程中,写着写着就发现,啊,之前有一种情况又没想到,然后就火急火燎的返回去改,改一次代码就要改动好多地方,改完继续写,这时候又有人提出来会存在怎样的bug,回头一看,哎呀,我也有这样的问题,然后再次大动干戈地改动。编写代码就在反反复复的查看代码,寻找bug,改代码。这是都是需要耐心的。但是在代码完成,已知bug改正完毕之后,一股自豪感又会油然而生。