C博客作业03--函数
0.展示PTA总分(0----2)
截图展示题目集:函数,排名分数截图。
1.本章学习总结(2分)
1.1 学习内容总结
整理函数章节主要知识点,并能对每个知识点介绍简单案例或语法
1.自定义函数
- 使用优点
- 相同功能的代码可以放在同一个函数内,供其他函数调用。 解决代码重复问题,更简洁。 可读性更好,
- 代码扩展性更好。增加新的功能,不需要更改其他函数。
- 代码维护性更好。查错针对某个功能函数检查。
- 结构
[数据类型说明] 函数名称 (参数)
{
执行代码块;
return (表达式);
}
- 一般推荐把自定义函数放在main()函数前面。如果放在main()后面还需要对函数进行声明。
2.函数调用
- 我们需要用到自定义的函数的时候,就得调用它,那么在调用的时候就称之为函数调用。在C语言中,函数调用的一般形式为:函数名([参数]);
注意:- 1.对无参函数调用的时候可以将[ ]包含的省略。
- 2.[ ]中可以是常数,变量或其它构造类型数据及表达式,各参数之间用逗号分隔。
3.参数
//在函数中不需要函数参数的称之为无参函数,在函数中需要函数参数的称之为有参函数,有参和无参函数的一般形式如下:
[数据类型说明] 函数名称 (参数列表) //有参;有参函数更为灵活,可以控制输入值,而无参就比较死板了。
{
执行代码块;
return (表达式);
}
[数据类型说明] 函数名称 ()//无参;
{
执行代码块;
return (表达式);
}
- 形参实参
- 形参是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数,相当于接受站。实参是在调用时传递该函数的参数相当于一个发射站,其信息可以被被调函数使用。
- 形参只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效。函数调用结束返回主调函数后则不能再使用该形参变量。(划重点!!)
- 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。
4.返回值
- 函数的返回值是指函数被调用之后,执行函数体中的程序段所取得的并返回给主调函数的值。
- 利用函数返回值可以进行真假的判断;
//返回两个整数中较大的一个
int max(int a, int b)
{
if (a > b)
{
return a;
}
else
{
return b;
}
}
1.2 本章学习体会及代码量学习体会
1.2.1 学习体会
- 学习到函数这一节就会发现C语言的学习开始要偏向解决生活中的实际问题;比如说本次的综合作业,要求我们扎实地掌握所学的知识,并且能够灵活地应用。这次作业也是我第一次自己做这么大的工程,或许功能不会特别完备,但是还是在编程时学到了很多的东西。所以我觉得,函数的内容,确实要偏向于应用方面。
自己完成作业的时候才会发现,函数的功能如此强大。比如说,当你要分别进行加减运算的时候,倘若都放在main()里面,会导致程序十分的混乱,并且要设的变量增多(当然其中很大一部分变量是意义重复的)。还便于理清做题的思路,以后要进行功能的扩展也不至于“伤筋动骨”。 - 应用过程中很多功能还是不能更好的归纳到一个模块中,一个模块与另一个模块的接口也是我觉得不容易表达的地方。
1.2.2 代码累计
本次综合作业代码量:1012行;
2.综合作业
题目:小学生口算表达式自动生成系统
1.功能要求:
1.完成1-3年口算题自动出题系统
2.注意每个年级运算数要求,运算数和运算符要随机生成
3.用户每选择一个难度级别后必须输入题目数量,能统计用户的正确率。用户每算一题,若错误,给出正确答案。 用户中途退出,不继续做题,需要有个提示操作可中途退出。
注意:
(1)软件界面必须友好,多加文字提示,能让用户自己当前做什么,接下来怎么做,每步操作可以退到主菜单界面。
(2)注意异常数据处理,如除0错误、不合法数据、临界数据,系统保证运行时候不崩溃。
(3)注意函数封装,不管是几位数的加减乘除运算,相同功能的代码应该都封装都一函数,通过参数传递实现代码覆盖。也可以考虑数据输入、输出等函数封装,尽量不要把代码都放main中。各种异常情况也可以单独封装函数处理,让程序的扩展性更强。
(4)扩展功能:
可以设置答题时间,用户超过答题时间,提示不能继续做题,重新选抽题。请查阅C的时间函数。
扩展难度级别,比如出现2步加减乘除,然后乘除优先计算。比如2+3*4运算
2.本次作业的函数关系图
可以用思维导图工具画函数调用关系。如:
3.函数功能及全局变量介绍
介绍你用到所有函数接口及全局变量。
3.1.全局变量
变量名,作用。
函数名 | 功能 |
---|---|
int AdditionOperation(int grade) | 加法运算; |
int SubtractionOperation(int grade) | 减法运算; |
int MultiplicationOperation(int grade) | 乘法运算; |
int DivisionOperation(int grade) | 除法运算; |
void CorrectMessage() | 回馈答题正确语言 |
int Judgement(int result, int answer) | 判断回答答案与正确答案相同与否; |
int AdditionAndSubtraction(int n) | 加减混合运算; |
int AdditionAndDivision(int n) | 加除混合运算; |
int FourArithmeticOperations(int n) | 四则运算混合; |
3.2.ListMenu()函数
文字介绍函数功能、思路,截图函数代码。
思路历程:
(1)首先进入程序要看见一个欢迎界面void EnterInterface01();显示欢迎词并提示是否继续做;
(2)提示输入年级,要做题的数量,然后根据年级分流题目等级;
3.3 函数2等
(1)当我是一年级小朋友时
测试点 | 类型 | 结果 |
---|---|---|
题目1 | 整十数加一位数 | 正确 |
题目3 | 两位数减整十数 | 正确 |
题目4 | 100以内加减混合混合运算 | 正确 |
题目6 | 10以内三个数连加 | 正确 |
。。。 | 整十数减整十数 | 暂无 |
(2)当我是二年级小朋友时 | ||
测试点 | 类型 | 结果 |
---|---|---|
题目2 | 10以内除法加法混合运算 | 正确 |
题目4 | 整百数加减法(和超过一千的,退位的) | 正确 |
题目1 | 整十数加整十数的加法(进位的) | 正确 |
题目4|1-9以内的表内乘除法|正确
(3)当我是三年级小朋友时
4.运行结果截图,测试用例。
测试点 | 类型 | 结果 |
---|---|---|
题目1 | 三位数加三位数的加法(含连续进位的) | 正确 |
题目5 | 一位数的四则运算 | 正确 |
题目9 | 万以内的加减法 | 正确 |
。。。 | 两位数除以一位数(有余数) | 暂无 |
。。。 | 一位数乘一位、二位、三位数 | 暂无 |
5. 调试碰到问题及解决办法
(1)当程序十分庞大的时候,如果定义不规范容易造成程序的无法运行。比如说,第一次运行的时候,出现了20几个错误提示,原因是自定义函数函数类型不够规范,导致无法运行,所以写程序的时候务必要把思路理清;
(2)刚开始做题时加入我要做5道题,不论对错,但是调试的时候发现做完5道题并不能及时地弹出,因为我调用的switch语句没有使用break;所以,运行的时候只有完整的连续做对5道题才可以弹出;
(3)我一直想计算一次性正确率多少,但是没有办法,后来想到了用返回值return各次运算模块计算值来使right值改变,达到计算正确率地目的。同时用printf输出正确率的时候吗“ ”内需要打两个%%才能输出0.00%的结果;
6.大作业总结
(1)首先就是如何解决高年级包含低年级题目的问题。我在这里将每个年级需要做的问题进行了大概划分,一年级只有加减和加减混合;二年级有加减乘除以及加除混合;三年级有加减乘除以及四则运算。当函数进入到每一个运算模板的时候,高的年级就有机会向低的年级进行转化(这里我用了随机生成数代表重新赋年级值的结果,后续很多地方我还用了这样的方法),所以使高年级做低年级的题目;
(2)刚开始写运算模块的时候代码很多,但是它大部分是重复的内容,后来我自己定义了一个变量answer,表示正确的结果,再调用一个函数Judgement(int result, int answer);判断输入答案与真实答案是否相同;缩短了约500行的代码量;
(3)在写博客的时候发现自己的许多功能还没有完善(比如三年级的加减乘除混合运算),许多无用变量(比如在运算模块中的flag),还有许多功能重叠的变量可整合,还有,三年级做的混合运算题集没有包括低年级的混合运算题目等。所以一个完美的程序并不是一次就能写好的,这需要不断地改进;