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

1.本章学习总结

1.1 思维导图

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

1.2.1 学习体会

  • 本章主要学习了函数的相关知识,函数是一个完成特定工作的独立程序模块,包括为像scanf、printf的库函数和像fact、cylinder的自定义函数两种。主函数像树干,自定义函数就像树枝,在树干的每一段都有一个分支,分支就是函数的调用,而分支的长短简易繁杂也就是自定义函数的复杂程度,函数调用越多,树越茂密,最后的程序也就越严谨。学会利用函数的定义和用法结合过去学习的循环结构能解决规模更大的题目,像验证哥德巴赫猜想,输出指定范围内的Fibonacci数等问题都能通过自定义函数较为简便地得到解决。
  • 要求自定义函数的使用,需要通过自己定义函数到调用函数到返回,使得题目的作业难度提高,但学习了这些知识,能让我们在自己编写一个大程序的道路上更进了一步。在接下来的学习中,需要反复练习,更为熟练地进行函数的定义和调用,再通过学习课本的“附录A c语言的基本用法“,当然也不能忘记编译问题和注释,相信能在以后的大程序设计中更加得心应手。

1.2.2 代码累计

2.PTA总分

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

2.2 我的总分:

函数部分:145
总分:145

3.PTA实验作业

3.1 PTA题目1

一个能计算Fibonacci数的简单函数和一个能输出两正整数m和n(0<m≤n≤10000)之间的所有Fibonacci数的函数

3.1.1 算法分析

思路:在fib函数中,对第一和第二个数进行分开讨论其值为1,通过前两个数的和得到第三个数,不断赋值转换得到第n个数的值。在PrintFN函数中,先引用fib函数循环得出大于m的最小值作为输出数值循环的判断条件,通过if讨论第一个数前不需要加空格,最后对无Fibonacci数的情况进行语句输出。

int fib( int n ) //函数定义
	定义num为第n个数的值,i为计量数,num1=1和num2=1分别为前两个数
	if n==1或n==2 then num=1//判断i是否为1或2
	else 
	    for i=3 to n do//循环得出第n个数的值
	        num=num1+num2
	        num1=num2
	        num2=num
	    end for
	end if 
	返回num

void PrintFN( int m, int n ) //函数定义
	定义i为计量数,j判断符合条件的个数
	for i=1 to fib(i)<m do //循环得出大于m的最小值
	    i++
	end for 
	for j=1 to fib(i)<=n do //循环得出小于n的最大值
	    if j==1 then 输出fib(i) //判断当j等于一时,数字前不需要加空格
		else 输出空格加fib(i)
		end if
	    i++
	end for
    if j==1 then //判断是否存在符合条件的数
	    输出"No Fibonacci number"
    end if

3.1.2 代码截图

3.1.3 测试数据

3.1.4 PTA提交列表及说明

  • Q1:在编写自定义函数时,运用嵌套循环语句容易出现括号缺漏或者不对应
  • A1:将代码进行缩进时发现少了一个大括号,及时补上并检查了分号是否添加正确。
  • Q2:通过编译器编译编译成功后代入pta题目中,出现答案错误
  • A2:在判断为第一个数字前不需要加空格时,把”j==1“写成“j=1”,将原本的“等于”判断错写成“赋值”,造成接下来的Fibonacci数输出前面都没有空格。
  • Q3:针对类似这种需要从一串固定数列中摘取符合指定范围内的数的题目
  • A3:编写一个自定义函数用来从头列出数列中的每一个数,再用函数调用代入输入的最小值和最大值,将最小值作为循环的起始点、最大值作为循环的终止点输出,必要时可以通过if判断是否需要添加空格。总之,以不变应万变,不变的数列无论在什么情况下都有一样的本质,需要注意的就是循环条件的设定,掌握边界值的问题。

4.大作业

4.1.函数关系图

4.2.函数功能介绍

1.主函数

功能:用于构架程序的主体,作为总菜单连通各菜单
思路:从进入程序,以和善的语言引导用户进行操作,将各个主菜单列出可供选择,通过switch-case语句直达所选选项的函数,并有非法检测选项,最后可结束程序。

2.主菜单函数1

功能:用于“开始测试”的选项进入测试的子菜单,展示测试内容的主体
思路:先通过难度选项指引用户进行难度选择,输入所需难度和题数,再通过judge函数进行计算判断,展示测试结果。结束后可选择是否继续测试,若选择继续则再进行一次循环,若选择退出则退出这个函数。在每个选项输入时通过if语句进行合法检测,若输入合法则进行语句,若不合法则要求用户重新输入。

3.主菜单函数2

功能:用于“用法说明”的选项进入说明的子菜单,展示说明内容
思路:罗列出六点说明,并用分割线划分,语句清晰易懂,解决用户在测试过程中的使用障碍。

4.主菜单函数3

功能:用于“评价打分”的选项进入评分的子菜单,展示评分内容
思路:对用户征求评分,若得分较高则表示感谢,若得分较低则表示抱歉并改进,并对无效评分进行检测。

5.子菜单函数1

功能:用于测试过程中开始答题的部分,展示答题过程和结果反馈
思路:先对用户展示这是第几题,再引入degree函数进行出题;然后要求输入答案,并通过scanf返回值对答案进行合法检测,若输入不合法次数超过三次,则这题自动判错;对输入的结果和正确答案进行比较,正确和错误都有相应的语句反馈给用户,且语句采用随机分配;最后在题数统计上加一,便于开头第几题的显示。

6.子菜单函数2

功能:用于测试过程中出题的部分,作为出题机制
思路:将先前的难度选择代入switch选择难度出题,通过时间函数产生随机数作为运算数字,并同理用a[]={'+','-','*','/'}的形式,将1到4的随机数代入其中,从而生成随机运算符,再引入calculate函数将算式组合并得到正确答案。

7.子菜单函数3

功能:用于测试过程中解答题目的部分,得到题目答案
思路:通过int定义来确保答案为整数,用switch罗列每种运算符的计算方法,最后返回答案。

4.3 运行结果截图

  • 正常流程###

开始测试:####

用法说明:####

评价打分:####

  • 非法检测###

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

  • 问题1:从主函数衍生出来的函数,多数的变量具有一定关联性,多次定义过于麻烦
  • 解决1:鉴于程序不算大,采用全局变量能更好地解决函数多结果返回的问题。
  • 问题2:每个页面都需要有叠加性,能返回上一个页面
  • 解决2:使用多个循环语句的嵌套,在每此选择时加入break的选项,当输入退出时即可退出该循环。
  • 问题3:为了让用户更容易地使用这个程序
  • 解决3:在每个需要要求输入的口令前加上解释和冒号,执行后回复输入带来的结果,语句亲近,并在每个页面切换时加上分割线。
  • 问题4:对于每个选择中都会遇到非法选项的输入,会造成系统错误
  • 解决4:在switch中将每个选项用case罗列,再用default将其余输入选项视为非法选项,并让用户重新输入或默认退出,在个别地方采用“用户输入错误选项次数过多而默认退出”的方案。用while(getchar()!='\n')语句将非法字符清除,防止系统崩溃。

4.5 大作业总结

  • 面对像大作业的程序设计,可以先构建主函数,在需要引入自定义函数的地方用简单的话概括,例如“菜单函数”、“数学计算函数”,先将主函数涉及的内容大致列出,再通过一个个定义自定义函数来修改主函数,这样能让自己在多个函数中保持清晰的思路。
  • 程序的庞大需要清晰的头脑,一旦停下来休息,就可能忘记原有的思路,一忘记就很难找回。由于我所学的知识有限,一个简单的语句能解决的问题,我需要列好几个,这也加大了我在编写过程中的难度。所以我在完成大作业的过程中,每次都是一连坐几个小时,脑子只是回想哪个地方等下需要调整,哪个地方需要补充。由于第一次接触大程序,许多bug不能及时发现,函数的定义和调用也不是很合理,这是我的不足。
  • 从框架的设计到函数的定义调用,再到不断完善,虽然语法很简易浅显,但一点一点地完成,确实有自豪感由心底产生。自己做出了一个小小程序,也带动了我编程的学习乐趣,希望往后的学习能让我在程序构建中更加轻松有趣。

posted @ 2018-11-04 09:39  不凉々少年  阅读(663)  评论(0编辑  收藏  举报