C语言博客作业03--函数
0.展示PTA总分
1.本章学习总结
1.1 学习内容总结
- 1、函数是一个完成特定工作的独立程序模块,包括库函数和自定义函数2种。例如scanf()、printf()、等为库函数,由C语言系统提供定义,编程时只要直接调用即可;而有些fact()函数,prime()函数,需要用户自己定义,属于自定义函数。
- 2:调用自定义函数时,程序中必须有与之对应的函数定义。
- 3:函数定义于主函数之外,分配有储存空间,独立于其他函数的形式。
- 4:函数的一般形式:
函数类型 函数名(形式参数表)/*函数首部*/
{
函数实现过程/*函数体*/
}
- 5:类型标识符函数名(形参表)———形参表可以为空,但花括号不能省略例:int fact(int n)——n为形参,形参只是一个占位符,标志着在形参出现的位置应该有一个什么类型的数据。
- 6:函数调用函数名(实参表)——实参表与形参表相对应实参可以是常量、变量,还可以是表达式,实参与形参一 一对应,数目应相同,顺序应一致,初学者建议类型也一致。
- 7:函数类型为void,表示不返回结果,函数体中可以使用没有表达式的return语句,也可以省略return。void类型的函数虽热不直接返回一个值,但它的作用通常以屏幕输出等方式实现。
此外,在不返回结果函数定义中,void不能省略;否则,函数类型被默认定义为int。 - 8、模块化设计时要遵循模块独立性的原则,即模块之间的联系应尽量简单。体现在:
(1)一个模块只完成一个指定的功能。
(2)模块之间只通过参数进行调用。
(3)一个模块只有一个入口和一个出口。
(4)模块内慎用全局变量。 - 9、上文讲到了全局变量,全局变量是定义在函数外而不属于任何函数的变量,它对作用范围内所有的函数都起作用。一般情况下把全局变量定义在程序的最前面,即第一个函数的前面。而,局部变量则定义在函数的内部,它们的有效使用范围被局限于所在的函数内,使用局部变量可以避免各个函数之间的变量互相干扰,保证了函数的独立性。
静态局部变量:是一种特殊的局部变量,它存放在静态储存区,生存周期会持续到程序结束,一旦含有静态局部变量的函数被再次调用,则静态局部变量会被重新激活,上一次函数调用后的值仍然保持着,可以本次调用继续使用,定义格式:static 类型名 变量表。
1.2 本章学习体会及代码量学习体会
1.2.1 学习体会:
做题看书,看书做题。没有不理解的地方,就是遇到新题型需要思考良久而已。
1.2.2 代码累计
本次综合作业代码量:1023行
2、综合作业
题目:小学生口算表达式自动生成系统
2、本次作业函数关系图
3、函数功能及全局变量介绍
3、1全局变量:
- num1,num2,num3,是3个随机数,其实每次进入分支函数的时候都会被重新赋值,只不过定义成全局变量,以后就不需要每个函数内都定义了。
3、2 ListMenu函数
- ListMenu,ListMenu1,ListMenu2,ListMenu3,是界面输出函数,分别输出主界面,一年级题目集界面,二年级题目集界面,三年级题目集界面。
截图:
3、3 GetChoice函数
- GetChoice1,GetChoice2,GetChoice3,获取用户选择的函数,分别对应一年级中各题目集的选择,二年级中各题目集的选择,三年级中各题目集的选择。
截图:
3、4 Problem函数
- Problem1,Problem2,Problem3...等Problem系列,针对各个不同的层次、多方面的问题题目集,在GetChoice获得选择后进去,实现各个题目集的提示,运算,判断,是检查小学生做题正确与否并记录正确率的函数。
截图:
4、运行结果截图,测试用例
一年级:
- 整十数加一位数的加法:
整十数减整十数的减法:
两位数减整十数的减法
10以内三个数连加:
100以内连加连减混合运算:
二年级:
1-9以内的表内乘除法:
整十数加整十数的加法(存在进位的)
尾数是0三位数加法(和在一千以内的):
整百数加减法(和超过一千的,退位的)
10以内除法加法混合运算
有余数的除法:
三年级:
三位数加三位数的加法(含连续进位的):
一位数乘一位、二位、三位数:
整十数乘整十数:
一位数的四则运算:
上图出现了一个9/6、3/2不能整除的情况,原因是随机随机到的数无法整除,而要使它可以随机到的数可以整除还需要再对程序进行修改,不过那个太过复杂了,这里仅仅是无视余数进行计算。
两位数除以一位数(有余数):
万以内的加减法:
5. 调试碰到问题及解决办法:
(1)在二年级表内除法处出现不能整除的情况,由于只有2个数易操作,于是加入判断if (num2 % num1 == 0)正常执行,否则 i--;continue;不输出任何内容而重新赋予随机数再判断。使得输出的随机数总能整除。
(2)输出列表和提示的时候曾出现同一行出现多个内容的情况,判断是漏掉了\n,于是补上。
(3)在生成1-9数字的时候出现过0的情况,于是把rand()%9改成(rand()%8+1),百位数则是将rand()%1000(会出现二位数和一位数的情况)改成(rand()%900+100),还有许多数据范围的修改,这里不重复列举,反正最后除数不为0啦,三位数就三位数啦,整十数就整十数啦,不会有0啦。
(4)在输入用户题目输入的时候,输入1(即一道题目),回答之后会出现 ”输入N退出答题,否则继续答题“ 提示退出的情况,可就1道题,退出个鬼,于是在提示退出的语句前加上判断条件n!=1;还有最后一道题目的时候,提示退出,都最后一道题目啦,还退出个鬼,于是又补上提示退出条件i!=n;
(5)统计正确率时,曾经是用小数计数,比如0.5 , 1.0 , 0.33,现在改为50.0%,100.0%,33.0%。
(6)在程序快完成之际,发现程序在Window命令界面无法退出,只能返回上级主菜单,做题,返回上级主菜单,返回上级主菜单,于是改进为做完题目后提示输入N结束程序,否则输出主菜单并让用户继续做题。
6.大作业总结:
回顾这个作业编写过程,总结碰到问题及后续程序编写注意事项?
(1)当除法出现不能整除的情况,如果只有2个数字操作,就可以加入判断if (num2 % num1 == 0)正常执行,否则 i--;continue;不输出任何内容而重新赋予随机数再判断。使得输出的随机数总能整除。
(2)输出列表和提示的时候如果出现同一行出现多个内容的情况,判断是漏掉了\n,记得补上。
(3)如果在生成1-9数字的时候出现过0的情况,就可以把rand()%9改成(rand()%8+1),百位数则是将rand()%1000(会出现二位数和一位数的情况)改成(rand()%900+100),还有许多数据范围的修改,这里不重复列举,反正最后除数不为0啦,三位数就三位数啦,整十数就整十数啦,不会有0啦。
(4)统计正确率时,曾经是用小数计数,比如0.5 , 1.0 , 0.33,其实可以改为50.0%,100.0%,33.0%,这样易于阅读。
(6)如果在程序快完成之际,发现程序在Window命令界面无法退出,只能返回上级主菜单,就说明有循环不能结束,于是应该加入一个判断条件break使循坏结束。