C语言博客作业03--函数
0.展示PTA总分
0.1 c05-函数
1.本章学习总结
1.1 学习内容总结
函数
1.函数定义、声明与调用
函数是一个完成特定工作的独立程序模块,包括库函数和自定义函数。
函数的首部由函数类型,函数名和形式参数表组成,位于函数定义的第一行。例如:double cylinder(double r, double h)
.
函数体体现函数的实现过程,由一对大括号内的若干条语句组成,用以计算,或完成特定的工作,并用return语句返回运算的结果。
函数定义的一般形式为
函数类型 函数名(形式参数表)
{
函数体
}
例如:
int even(int n)
{
if(n%2==0) return 1;
else return 0;
}
自定义函数如果放在main函数之后,则应在之前给与声明,如int even(int n);
函数调用通常有以下形式:k=fun(x)
, if(fun(x))
, fun(x)
等等
函数调用通常出现在两种情况下:1.赋值语句。如:volume=cylinder(radius,height)
2.输出函数的实参。如:printf("%f",cylinder(radius,height))
参数传递的实质是传值,函数的return语句只能返回一个值,若要返回多个值,则需借助全局变量或者指针。
2.结构化程序设计思想
结构化程序设计强调程序设计的风格和程序结构的规范化,提倡清晰的结构,其基本思路是将一个复杂问题的求解过程划分为若干阶段,每个阶段要处理的问题都应是容易被理解和处理的。例如开发一个学生成绩统计程序,应将其分解为成绩输入,数据计算,数据查找和输出成绩四个部分,其中数据计算又可以细分为计算学生平均分和计算课程平均分。当这一个个简单的小问题都处理完毕的时候,整个复杂的问题也就随之解决了。
其中比较重要的是模块化设计。模块化设计时要遵循模块独立性原则,即模块之间的联系应尽量简单。体现在:
- 一个模块只完成一个指定的功能
- 模块之间只通过参数进行调用
- 一个模块只有一个入口和一个出口
- 模块内慎用全局变量
3.全局变量
全局变量具有全局的生存期和作用域,它往往会用于多个函数和实现返回多个值。全局变量定义于函数之外,例如:
float cash;
int main()
{
函数体
}
4.静态局部变量
静态局部变量具有全局的生存期和局部的作用域。静态局部变量会保存上一次被调用的值,当再次调用的时候,静态局部变量会被重新激活。静态局部变量定义格式为static 类型名 变量名
使用静态局部变量求阶乘:
double fact_s(int n)
{
static double f = 1;
f=f*n;
return f;
}
1.2 本章学习体会及代码量学习体会
1.2.1 学习体会
学习了函数之后,明白将一个个具体的功能封装成函数可以让问题变得更加清晰,更易于解决。但是同时也存在一个问题,如何将一个问题分解成一个个具体的模块,我想这就是以后学习过程中需要不断训练的一个能力。老师讲函数会贯穿以后的学习,在学习新知的过程也会对函数的运用不断锤炼,训练自己灵活运用函数以及模块化编程思维将成为我学习C语言过程中需要不断加强的两个方面。
1.2.2 代码累计
本次综合作业代码量:461行
综合作业
题目:小学生口算表达式自动生成系统
2.本次作业的函数关系图
3.函数功能及全局变量介绍
3.1.全局变量
变量名 | 作用 |
---|---|
right | 记录做对的题数 |
wrong | 记录做错的题数 |
3.2.ListMenu()函数
- 功能:输出菜单
- 思路:使用输出语句并返回用户的输入
- 截图:
3.3 GetCorrectMessage()函数
- 功能:输出正确信息
- 思路:printf语句结合rand函数
- 截图:
3.4 GetIncorrectMessage()函数
- 功能:输出错误信息
- 思路:printf语句结合rand函数
- 截图:
3.5 Judge_Right_Wrong(double result)函数
- 功能:判断作答是否正确
- 思路:比较用户的作答和答案得出结论并输出相应的信息
- 截图:
3.6 Addition(int num)函数
- 功能:加法运算目录
- 思路:switch语句结合函数调用
- 截图:
3.7 Subtraction(int num)函数
- 功能:减法运算目录
- 思路:switch语句结合函数调用
- 截图:
3.8 Multiplication(int num)函数
- 功能:乘法法运算目录
- 思路:switch语句结合函数调用
- 截图:
3.9 Division(int num)函数
- 功能:除法法运算目录
- 思路:switch语句结合函数调用
- 截图:
3.10 GradeOne(int num)函数
- 功能:随机生成一年级四则运算表达式
- 思路:for循环控制题数,配合switch随机生成题目
- 截图:
3.11 GradeTwo(int num)函数
- 功能:随机生成二年级四则运算表达式
- 思路:for循环控制题数,配合switch随机生成题目
- 截图:
3.12 GradeThree(int num)函数
- 功能:随机生成三年级四则运算表达式
- 思路:for循环控制题数,配合switch随机生成题目
- 截图:
3.13 Numbers_Of_Questions()函数
- 功能:获取用户想做的题数()
- 思路:printf输出提示,用户输入题数
- 截图:
3.14 GetOperator(int num)函数
- 功能:随机生成运算符()
- 思路:定义字符数组存放+ - * /,配合switch以及rand函数
- 截图:
3.15 GradeOneAdd1()函数
- 功能:一年级加法题型1(整十数加一位数)
- 思路:利用rand函数生成操作数并调用Judge_Right_Wrong()函数判断正误
- 截图:
3.16 GradeOneAdd2()函数
- 功能:一年级加法题型2(十以内连加)
- 思路:利用rand函数生成操作数并调用Judge_Right_Wrong()函数判断正误
- 截图:
3.17 GradeOneSubtraction1()
- 功能:一年级减法题型1(整十数减整十数)
- 思路:利用rand函数生成操作数并调用Judge_Right_Wrong()函数判断正误
- 截图:
3.18 GradeOneSubtraction2()函数
- 功能:一年级减法题型2(两位数减整十数)
- 思路:利用rand函数生成操作数并调用Judge_Right_Wrong()函数判断正误
- 截图:
3.19 Mixed_Add_Sub()函数
- 功能:加减混合运算(100以内加减混合运算)
- 思路:利用rand函数生成操作数,调用GetOperator(rand() % 2)函数随机生成运算符配合switch生成表达式,并调用Judge_Right_Wrong()函数判断正误
- 截图:
3.20 GradeTwo_Multiplication_Division()函数
- 功能:二年级乘除法(10以内)
- 思路:利用rand函数生成操作数,调用GetOperator(rand() % 2)函数随机生成运算符配合switch生成表达式,并调用Judge_Right_Wrong()函数判断正误
- 截图:
3.21 GradeTwoAddtion1()函数
- 功能:二年级加法1(整十数加整十数)
- 思路:利用rand函数生成操作数,利用while循环控制两数之和小于100,并调用Judge_Right_Wrong()函数判断正误
- 截图:
3.22 GradeTwoAddtion2()函数
- 功能:二年级加法2(尾数是0三位数加法)
- 思路:利用rand函数生成操作数,利用while循环控制两数之和大于1000,并调用Judge_Right_Wrong()函数判断正误
- 截图:
3.23 GradeTwo_Add_Sub()函数
- 功能:二年级加减法(整百数加减法)
- 思路:利用rand函数生成操作数,调用GetOperator(rand() % 2)函数配合switch随机生成表达式,并调用Judge_Right_Wrong()函数判断正误
- 截图:
3.24 Mixed_Add_Division()函数
- 功能:加减乘除混合运算(10以内)
- 思路:利用rand函数生成操作数,调用GetOperator(rand() % 2)函数配合switch随机生成表达式,并调用Judge_Right_Wrong()函数判断正误
- 截图:
3.25 GradeTwoDivision()函数
- 功能:二年级除法(10以内)
- 思路:利用rand函数生成操作数,并调用Judge_Right_Wrong()函数判断正误
- 截图:
3.26 GradeThree_AddOrSub1()函数
- 功能:二年级加减法(1000以内)
- 思路:利用rand函数生成操作数,调用GetOperator(rand() % 2)函数配合switch随机生成表达式,并调用Judge_Right_Wrong()函数判断正误
- 截图:
3.27 GradeThree_AddOrSub2()函数
- 功能:二年级加减法(10000以内)
- 思路:利用rand函数生成操作数,调用GetOperator(rand() % 2)函数配合switch随机生成表达式,并调用Judge_Right_Wrong()函数判断正误
- 截图:
3.28 GradeThreeMultiplication1()函数
- 功能:三年级乘法(一位乘一位、两位、三位)
- 思路:利用rand函数生成操作数,配合switch随机生成表达式,并调用Judge_Right_Wrong()函数判断正误
- 截图:
3.29 GradeThreeMultiplication2()函数
- 功能:三年级乘法(整十数乘整十数)
- 思路:利用rand函数生成操作数,并调用Judge_Right_Wrong()函数判断正误
- 截图:
3.30 GradeThreeDivision()函数
- 功能:三年级除法(两位数除以一位数)
- 思路:利用rand函数生成操作数,并调用Judge_Right_Wrong()函数判断正误
- 截图:
4.运行结果截图,测试用例
- 一年级:
- 二年级:
- 三年级:
5. 调试碰到问题及解决办法
1.问题1:常常忘记进行函数声明 解决办法:每写完一个函数就马上跟上函数声明
2.问题2:无法正确读入用户是否继续进行训练的字符 解决办法:在%c前添加空格来吸收换行符
3.问题3:rand函数使用不当造成有些题型无法显示 解决办法:认真分析涉及的所有题型,谨慎使用rand函数
6.大作业总结
- 注意变量和函数的命名,一个容易辨识的变量名和函数名有利于自己调试程序以及增强代码可读性
- 程序应该多加文字提示,软件的界面应该要友好
- 要灵活调用各个函数,来实现代码覆盖,简化代码,这一点我做的不好