C语言博客作业03--函数
C语言博客作业03--函数
1.本章学习总结
1.1 思维导图
关于函数的思维导图如下所示:
1.2 本章学习体会及代码量学习体会
1.2.1 学习体会
在这周的学习过程中,我们学习了有关函数的知识内容。对于函数的话,我觉得函数其实就是将某个功能独立出来的模块,可以多次调用并增强代码的整体阅读性。所以,函数题的思路跟我们之前做的题的思路是一样的,只是规定了一定的格式。但其实我发现,函数的优点在*分模块*,难点也在分模块,像我们这一周的题集里,几乎都是题目已给函数接口,也就是说,题目已经帮我们分好模块,我们直接写它的功能就好了,所以我希望老师可以多给出一些*关于函数编程题*,让我们多去练练自己的思路。
1.2.2 代码累计
2.PTA总分
2.1截图PTA中函数题目集的排名得分
2.2 我的总分:
c-循环总分:145
3.PTA实验作业
3.1 PTA题目1
本题要求实现一个计算Fibonacci数的简单函数,输出两正整数m和n(0<m≤n≤10000)之间的所有Fibonacci数。其中函数fib须返回第n项Fibonacci数;函数PrintFN要在一行中输出给定范围[m, n]内的所有Fibonacci数,相邻数字间有一个空格,行末不得有多余空格。如果给定区间内没有Fibonacci数,则输出一行“No Fibonacci number”。
3.1.1 算法分析
- 在fib( n )函数中:
- 定义第一个数firstNumber=1;第二个数scondNumber=1;
- 定义项数count=2;
- while 项数<n do
- 定义item=原本的第二个数; //用item暂存 secondNumber的值
- 新的第二个数=原本第一个数+原本第二个数;
- 新的第一个数=原本第二个数(item);
- 项数count自增;
- end while;
- 返回新的第二个数;
- 在PrintFN(m, n)函数中:
- 定义i=1;
- while 一直循环 do
- 定义number=第i项 Fibonacci数(调用fib( n )函数);
- if m<=number<=n then
- 输出number; //输出【m,n】区间内的 Fibonacci数
- if 第i+1项Fibonacci数>n then
- 结束循环; *//控制最后一个数后面没有空格 *
- end if
- 输出空格; //最后一个数外,其余数后都有空格
- end if
- if number>n then //在区间【m,n】找不到Fibonacci数
- 输出No Fibonacci number;
- 结束循环;
- end if
- i递增;
- end while
3.1.2 代码截图
3.1.3 测试数据
3.1.4 PTA提交列表及说明
- Q1:在fib( n )函数中,最后要返回的值我不确定是firstNumber,还是secondNumber。
- A1:通过拿简单的例子当n=3,n=4自己在外面按程序算一遍,看是我们要求的第n项Fibonacci数是firstNumber还是secondNumber。
(在这里的话,我觉得由我们自己算的话比调试简单方便,因人而异吧) - Q2:最后一个数后不能有空格,我想过用立flag的方法,在不同条件下令flag=0或flag=1,就是若满足flag=1,printf(“%d ”);若满足flag=0,printf(“%d”)。但是我不是很能找出那个不同条件是什么。
- A2:想了挺久后还是想不出来,就决定换个思路。用最寻常的判断,判断它是否是最后一个数以此来控制行末没有空格。
4.大作业
4.1.函数关系图
全部函数声明:
1.函数1:mian()
功能及思路:
嗯,,,没错我的主函数就是这么简短。第一次写这么大的作业,只记得老师说主函数最好不要搁太多东西,也没那个概念到底是搁多少,就参照了课堂派中某个题目的写法。
截图:
2.函数2: Menu()
函数功能:该函数的主要功能就是输出菜单,以及下面与Choice()函数衔接。
思路:主要是想用嵌套函数的方法来实现这个题库,所以从整体上来说,其实这个Menu()函数才是这个题库的的最初的循环点。
截图:
3.函数3:Choice()
函数功能及思路:该函数主要是对用户的输入进行处理。首先,是对非法字符的处理,尤其是当熊孩子输入一连串非法字符时,该函数只会输出一条提示语句,避免多次输出提示语句,增强界面美观性。然后是对合法字符(也就是数字)的处理,若0到3区间(也就是我们要求的)则进入Level()函数,若大于3或小于0,则提示。
截图:
4.函数4:Level()
函数功能:传递用户的选项,分别进入相应的难易级别。
思路:利用switch语句,分别进入简单,一般,困难级别的游戏以及退出游戏。
截图:
5.函数5:Finish()
函数功能:对结束游戏的不同情况进行处理。
思路:当用户都没有做一道题时,输出没有写题的提示;当用户做过题后退出,输出游戏结束和答题正确率。
截图:
6.函数6:Esay()
函数功能:随机得到两个一位数,一个运算符,得到题目,输入答案并核对答案是否正确。
思路:随机得到两个一位数,再任意得到一个0-3之间的数op,分别令不同值的op等于一个运算符,并得到运算结果。
再嵌入BackTrack(),Tip(),OneStep()函数。
截图:
7.函数7:General()
函数功能:随机得到一个两位数的两步加减运算的题目,输入答案并核对答案是否正确。
思路:如下图的注释所示。
截图:
8.函数8:Difficult()
函数功能:随机得到一个三位数的两步加减运算的题目,输入答案并核对答案是否正确。
思路:如下图的注释所示。
截图:
9.函数9:BackTrack()
函数功能:该函数实际上为一个中转函数,若选择继续,则清屏并返回主菜单(开始循环),若选择结束游戏,则跳转Finish()函数。
思路:用if-else语句来判断不同情况。
截图:
10.函数10:Tip()
函数功能:判断用户输入的答案与正确答案是否相等,并累计答对的题数和答错的题数。
思路:用if-else语句判断答案是否正确。
截图:
11.函数11:OneStep()
函数功能:生成一步四则运算题目,并对'/'时,将正确答案保留两位小数。
思路:如下图所示
截图:
12.函数12:TwoSteps()
函数功能:随机生成两步加减运算的题目
思路:如下图注释所示。
截图:
4.3 运行结果截图
正常运行:
输入非法字符和不在0-3内的数字:
选择简单级别时,除法运算中答案保留两位小数(四舍五入):
4.4 调试碰到问题及解决办法
- Q1:在Choice()函数中输入非法字符,整个程序会崩掉。
- A1:对于输入非法字符,scanf返回的值是0,输入符合要求的字符时,scanf返回的值是1。利用这一点,就可以区分非法字符和符合要求的字符了。
- Q2:还是输入的问题。在Choice()函数中,若输入一连串的非法字符则会输出一连串的错误提示,这样子很影响用户体验。
- A2:当输入为非法字符时,用while消耗所有的非法字符,直到字符读入为'\n'时,再输出错误提示。
- Q3:下图为我之前的Finish()函数,当我都不选择进入游戏(即第一次就选择结束游戏),系统还是会崩掉。
- A3:通过调试,发现问题出在Finish函数上,因为不进入游戏,直接结束游戏,correctMessage和wrongMessage之和为0;正确率计算的分母为0,所以程序会崩掉。所以我再用if-else语句通过判断correctMessage和wrongMessage之和是否为0,分情况输出。
- Q4:在 简单级别中当遇到除法时,如何令电脑计算的正确答案保留两位小数。
- A4:先将result定义为double型函数(我原先是int型),然后在原先result=1.0num1/num2后再加上0.005,实现四舍五入。再进行强制类型转换result=(int)(result100)/100,此时电脑计算出来的答案就会保留两位小数。
4.5 大作业总结生成
1.在写这个大作业的时候,时间耗费最多的是在输入也就是Choice()函数这一块,有模糊的思路,但是一直处理不好,找不到之间的关系,后来询问同学,才记得scanf的返回值问题。
2.因为一个输入问题,我又发现自己蠢,卡在一个函数可以先跳去写下一个函数。可是我却一直停在原地耗费了很多时间。
3.我还是不懂得有效利用百度这个巨大的资源库。输入非法字符也曾百度过,但那时候的自己没有耐心认真阅读完网上的代码,才浪费这么多时间。又比如,我也想写拓展要求中的时间函数,然后我又没有有效利用百度。唉,如果每次能认真看懂一个代码算法,应该就不会这么赶了吧。