博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C语言博客作业03--函数
阅读量:6279 次
发布时间:2019-06-22

本文共 3502 字,大约阅读时间需要 11 分钟。

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

1.本章学习总结

1.1 思维导图

关于函数的思维导图如下所示:

1476233-20181107163610442-457350298.png

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

1.2.1 学习体会

在这周的学习过程中,我们学习了有关函数的知识内容。对于函数的话,我觉得函数其实就是将某个功能独立出来的模块,可以多次调用并增强代码的整体阅读性。所以,函数题的思路跟我们之前做的题的思路是一样的,只是规定了一定的格式。但其实我发现,函数的优点在*分模块*,难点也在分模块,像我们这一周的题集里,几乎都是题目已给函数接口,也就是说,题目已经帮我们分好模块,我们直接写它的功能就好了,所以我希望老师可以多给出一些*关于函数编程题*,让我们多去练练自己的思路。

1.2.2 代码累计

1476233-20181107164116949-534188278.png

2.PTA总分

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

1476233-20181107164145747-451847252.png

2.2 我的总分:

c-循环总分:145

3.PTA实验作业

3.1 PTA题目1

本题要求实现一个计算Fibonacci数的简单函数,输出两正整数m和n(0

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 代码截图

      1476233-20181107181010828-94071647.png

      3.1.3 测试数据

      1476233-20181107182514012-150411168.png

3.1.4 PTA提交列表及说明

1476233-20181107182551817-352701870.png

  • 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.函数关系图

    1476233-20181113165529877-111697301.png

全部函数声明:

1476233-20181115234354416-1217237633.png

1.函数1:mian()

功能及思路:嗯,,,没错我的主函数就是这么简短。第一次写这么大的作业,只记得老师说主函数最好不要搁太多东西,也没那个概念到底是搁多少,就参照了课堂派中某个题目的写法。

截图:

1476233-20181113170532932-344432900.png

2.函数2: Menu()

函数功能:该函数的主要功能就是输出菜单,以及下面与Choice()函数衔接。思路:主要是想用嵌套函数的方法来实现这个题库,所以从整体上来说,其实这个Menu()函数才是这个题库的的最初的循环点。

截图:

1476233-20181113171126305-900874870.png

3.函数3:Choice()

函数功能及思路:该函数主要是对用户的输入进行处理。首先,是对非法字符的处理,尤其是当熊孩子输入一连串非法字符时,该函数只会输出一条提示语句,避免多次输出提示语句,增强界面美观性。然后是对合法字符(也就是数字)的处理,若0到3区间(也就是我们要求的)则进入Level()函数,若大于3或小于0,则提示。

截图:

1476233-20181113172051203-696208146.png

4.函数4:Level()

函数功能:传递用户的选项,分别进入相应的难易级别。思路:利用switch语句,分别进入简单,一般,困难级别的游戏以及退出游戏。

截图:

1476233-20181113172813401-1714201410.png

5.函数5:Finish()

函数功能:对结束游戏的不同情况进行处理。思路:当用户都没有做一道题时,输出没有写题的提示;当用户做过题后退出,输出游戏结束和答题正确率。

截图:

1476233-20181113173119274-2059769189.png

6.函数6:Esay()

函数功能:随机得到两个一位数,一个运算符,得到题目,输入答案并核对答案是否正确。思路:随机得到两个一位数,再任意得到一个0-3之间的数op,分别令不同值的op等于一个运算符,并得到运算结果。再嵌入BackTrack(),Tip(),OneStep()函数。

截图:

1476233-20181113174552132-1085834068.png

7.函数7:General()

函数功能:随机得到一个两位数的两步加减运算的题目,输入答案并核对答案是否正确。思路:如下图的注释所示。

截图:

1476233-20181113175532381-3938278.png

8.函数8:Difficult()

函数功能:随机得到一个三位数的两步加减运算的题目,输入答案并核对答案是否正确。思路:如下图的注释所示。

截图:

1476233-20181113175857324-1882033546.png

9.函数9:BackTrack()

函数功能:该函数实际上为一个中转函数,若选择继续,则清屏并返回主菜单(开始循环),若选择结束游戏,则跳转Finish()函数。思路:用if-else语句来判断不同情况。

截图:

1476233-20181113180026630-1278090861.png

10.函数10:Tip()

函数功能:判断用户输入的答案与正确答案是否相等,并累计答对的题数和答错的题数。思路:用if-else语句判断答案是否正确。

截图:

1476233-20181113180427968-991756414.png

11.函数11:OneStep()

函数功能:生成一步四则运算题目,并对'/'时,将正确答案保留两位小数。思路:如下图所示

截图:

1476233-20181113180731759-1910331814.png

12.函数12:TwoSteps()

函数功能:随机生成两步加减运算的题目思路:如下图注释所示。

截图:

1476233-20181113181048769-1543003626.png

4.3 运行结果截图

正常运行:

1476233-20181113181518119-1838526032.png
1476233-20181113181534030-1084875879.png

输入非法字符和不在0-3内的数字:

1476233-20181113181409960-397631082.png
选择简单级别时,除法运算中答案保留两位小数(四舍五入):
1476233-20181113181801148-377354879.png

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

  • Q1:在Choice()函数中输入非法字符,整个程序会崩掉。
  • A1:对于输入非法字符,scanf返回的值是0,输入符合要求的字符时,scanf返回的值是1。利用这一点,就可以区分非法字符和符合要求的字符了。
  • Q2:还是输入的问题。在Choice()函数中,若输入一连串的非法字符则会输出一连串的错误提示,这样子很影响用户体验。
  • A2:当输入为非法字符时,用while消耗所有的非法字符,直到字符读入为'\n'时,再输出错误提示。
  • Q3:下图为我之前的Finish()函数,当我都不选择进入游戏(即第一次就选择结束游戏),系统还是会崩掉。
    1476233-20181113183039310-569934546.png
  • 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.我还是不懂得有效利用百度这个巨大的资源库。输入非法字符也曾百度过,但那时候的自己没有耐心认真阅读完网上的代码,才浪费这么多时间。又比如,我也想写拓展要求中的时间函数,然后我又没有有效利用百度。唉,如果每次能认真看懂一个代码算法,应该就不会这么赶了吧。

转载于:https://www.cnblogs.com/yhy949/p/9924110.html

你可能感兴趣的文章
virtualbox 笔记
查看>>
Git 常用命令
查看>>
驰骋工作流引擎三种项目集成开发模式
查看>>
SUSE11修改主机名方法
查看>>
jdk6.0 + Tomcat6.0的简单jsp,Servlet,javabean的调试
查看>>
Android:apk签名
查看>>
2(2).选择排序_冒泡(双向循环链表)
查看>>
MySQL 索引 BST树、B树、B+树、B*树
查看>>
微信支付
查看>>
CodeBlocks中的OpenGL
查看>>
短址(short URL)
查看>>
第十三章 RememberMe——《跟我学Shiro》
查看>>
mysql 时间函数 时间戳转为日期
查看>>
索引失效 ORA-01502
查看>>
Oracle取月份,不带前面的0
查看>>
Linux Network Device Name issue
查看>>
IP地址的划分实例解答
查看>>
如何查看Linux命令源码
查看>>
运维基础命令
查看>>
入门到进阶React
查看>>