• 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.我还是不懂得有效利用百度这个巨大的资源库。输入非法字符也曾百度过,但那时候的自己没有耐心认真阅读完网上的代码,才浪费这么多时间。又比如,我也想写拓展要求中的时间函数,然后我又没有有效利用百度。唉,如果每次能认真看懂一个代码算法,应该就不会这么赶了吧。
    
  • 相关阅读:
    C++练习--实现客户机(CLIENT)类
    C++创建一个名为Ellipse的椭圆类--练习
    C++创建People类--练习
    C++定义一个简单的Computer类
    C++创建学生类练习
    第十四届浙江财经大学程序设计竞赛重现赛--A-A Sad Story
    第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛--I-填空题
    第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛--K-密码
    第13届景驰-埃森哲杯广东工业大学ACM程序设计大赛--G-旋转矩阵
    Hadoop学习笔记(2) 关于MapReduce
  • 原文地址:https://www.cnblogs.com/yhy949/p/9924110.html
Copyright © 2020-2023  润新知