C语言博客作业03--函数

1.本章学习总结(2分)1474708-20181111154313998-920586838.jpg

1.1 思维导图

C语言博客作业03--函数_第1张图片

1.2 本章学习体会及代码量学习体会

1.2.1 学习体会

本周学习感受:
经过这一周对于函数的学习,我对于模块化的程序设计有了深刻的理解,并学会了利用函数把复杂的问题分解为多个小问题来解决。这样的代码具有良好的可读性,同时也便于我们日后对于代码的修改。个人认为函数的最大优点是可以多次调用,这样极大地缩短了代码的长度。如同之前学过的循环结构,有时候我们的代码需要反复执行同一段代码,如果单纯用顺序结构和分支结构的话,代码会显得格外冗长,可读性也极差。在本周的pta函数练习的过程中,我感觉到解决问题的思路比以往更加清晰了,因此也感觉到做题变得轻松了。后来在写斐波那契数列的时候也了解了一下递归函数的使用方法,收获很大。

1.2.2 代码累计

1474708-20181101155909065-1851399462.png

2.PTA总分(2分)

2.1截图PTA中函数题目集的排名得分

C语言博客作业03--函数_第2张图片

2.2 我的总分:

总得分:145

3.PTA实验作业(1分)

3.1 PTA题目1

本题要求实现一个计算Fibonacci数的函数,并利用其实现另一个函数,输出两正整数m和n之间的所有Fibonacci数。所谓Fibonacci数列就是满足任一项数字是前两项的和(最开始两项均定义为1)的数列。其中函数fib须返回第n项Fibonacci数;函数PrintFN要在一行中输出给定范围[m, n]内的所有Fibonacci数,相邻数字间有一个空格,行末不得有多余空格。如果给定区间内没有Fibonacci数,则输出一行“No Fibonacci number”。
测试程序:
C语言博客作业03--函数_第3张图片

3.1.1 算法分析

fib函数:
形式参数n储存被判断的数

  • if n==1 or n== 2 then //由于斐波那契数列中第一位和第二位都为1所以应该加特殊判断
    • return 1
  • else
    • return fib(n-1)+fib(n-2) //递归函数的思路就是在函数中调用函数自身达到目的
  • end if

PrintFN函数:
形式参数m储存区间左值,n储存区间右值
整型变量flag用作记录是否有斐波那契数,cnt用来记录第几个斐波那契数 flag=0,cnt=0

  • for cnt=1 to n do //末值为题目所求区间的右值
    • if fib(cnt)>=m then //判断是否大于题目所求区间的左值
      • if flag!=1 then //判断是不是第一个输出的斐波那契数,如果是则不用输出空格
        • 输出 fib(cnt)
      • else 输出 空格+fib(cnt) //为了解决末尾不带空格的问题这样设计
      • flag=1 //区间内存在斐波那契数后flag的值也要相应变化
    • end if
    • end if
  • if flag==0 输出 No Fibonacci number //当区间内不存在斐波那契数时
  • end if

3.1.2 代码截图

我的斐波那契数列函数进阶史:
  • 一开始我的代码是这样的(铁头娃的做法):
    C语言博客作业03--函数_第4张图片

  • 后来想想可以在第二个函数调用第一个函数,于是对代码进行了修改,代码就变成了这样:
    C语言博客作业03--函数_第5张图片

  • 再后来,我开始寻找与没有更加简便的方法,发现用递归函数来完成第一个函数更加简便,于是我的代码又变成了这样:
    C语言博客作业03--函数_第6张图片

  • 再对代码进行一些简化处理,我的斐波那契数列函数最终版出炉啦:
    C语言博客作业03--函数_第7张图片

3.1.3 测试数据

C语言博客作业03--函数_第8张图片

3.1.4 PTA提交列表及说明

C语言博客作业03--函数_第9张图片

  • Q1:第一次提交的时候,由于devc上测试点都能过于是开开心心地提交了,然后结果是部分正确。又试了两次,结果还是一样。
  • A1:后来发现了问题在于,当区间包括1时,1要重复输出,因为斐波那契数列中第一位和第二位都是1,于是修改了代码,再次提交就对了。
  • Q1:后来就是发现代码太过麻烦了,没有意识到第二个函数里可以调用第一个函数。
  • A1:在对第二个函数的代码修改后还学习使用递归函数来解决问题,代码变得十分简洁。

4.大作业(5分)

题目:实现小学四则运算。

4.1.函数关系图

C语言博客作业03--函数_第10张图片

4.2.函数功能介绍

注:由于代码中的注释已经比较详细,因此不再对函数思路和作用进行解读
函数1:main()
截图:C语言博客作业03--函数_第11张图片

函数2:Start()
截图:C语言博客作业03--函数_第12张图片

函数3:Input_level()
截图:C语言博客作业03--函数_第13张图片

函数4:Input_number()
截图:C语言博客作业03--函数_第14张图片

函数5:Calculate( level, number )
截图:
C语言博客作业03--函数_第15张图片

C语言博客作业03--函数_第16张图片

函数6:Boundary()
截图:1474708-20181111112612214-795185835.jpg

函数7:Praise()
截图:C语言博客作业03--函数_第17张图片

函数8:Encourage( result )
截图:C语言博客作业03--函数_第18张图片

函数9:end()
截图:1474708-20181111112647278-1596923102.jpg

4.3 运行结果截图

正常运行:
C语言博客作业03--函数_第19张图片

C语言博客作业03--函数_第20张图片

结束:
C语言博客作业03--函数_第21张图片

异常输入:
C语言博客作业03--函数_第22张图片

做除法运算的误差允许:
1474708-20181111144220438-969074193.png

4.4 调试碰到问题及解决办法

  • Q1:关于等级和题目数量的异常输入(非数字)会导致程序奔溃。
  • A1:后来改用字符输入,改成对字符的判断,同时进行文字说明,防止程序崩溃。
  • Q2:做题时输入非数字字符。
  • A2:本来想也改成用字符读入,后来想想干脆利用bug来作为程序的功能,给文字提示当做紧急退出的方法。
  • Q3:在输入多种不同类型的字符时会被储存在缓冲区导致下面的运行误读。
  • A3:用fflush(stdin)清除缓冲区的字符。
  • Q4:做除法时不知道怎么处理保留小数的问题。
  • A4:在请教助教之后,给了关于答案与正确答案的允许误差范围,同时用浮点型定义答案,问题就迎刃而解了。

4.5 大作业总结

在刚开始写这个大作业的时候我并没有感到困难,因为在之前的pta练习中有做过关于计算器的问题,同时在课堂派的任务中也有接触过随机函数的问题,所以就开开心心地去写代码了......经过一定时间的编写,程序的主体已经写好了,经过基本正常数据的测试,也没什么问题,于是让舍友来给我检查程序中的bug。由于舍友是一只皮皮虾,他立马给我找到了大堆的bug,于是我就开始了历时三天的改bug。在改bug的过程中,突然又发现自己的函数分装并不是那么的合法(为了让main函数显得简洁,我居然定义了一个函数来代替原本main函数改做的事情)这样明显不怎么规范,也没有达到老师的要求,于是我又把我的代码重头到尾给改了一遍,才有了现在的代码......经过这一次的教训,我觉得我以后应该会先想清楚问题的思路,再考虑各个函数的作用并分装,而不是一股脑写代码,想到哪里突然加又跑出去定义一个函数。

转载于:https://www.cnblogs.com/fanfaniscute/p/9889753.html

你可能感兴趣的:(c/c++)