c语言博客作业03--函数
0.展示PTA总分
![](https://img2018.cnblogs.com/blog/1772649/201910/1772649-20191025005426204-1985580764.png ''函数'')
1.本章学习总结
1.1 学习内容总结
1.函数的定义
- 1.一般形式:
函数类型 函数名 (形式参数表) /*函数首部*/
{
函数实现过程 /*函数体*/
}
- 2.函数首部:由函数类型,函数名和形式参数表(简称形参表)
- 函数名:是函数整体的称谓,需要用一个合法的标识符表示;
- 函数类型:指出函数结果返回的类型,一般与return语句中的表达式的类型一致;在不返还结果的函数定义中,void不能省略,因为,如果不写函数类型,计算机会默认定义为int类型!
- 形参表:这里给出函数计算需要用到的相关已知条件,类似变量定义的形式给出,格式为
类型1 形参1,类型2 形参2 ,...类型n 形参n
每个形参前面的类型必须分别写明!!,例如:int x,y是错误的;形参只能为变量!
- 3.函数体:函数体体现函数实现的过程,由一对大括号内的若干条语句组成,或完成特定工作,并用return语句返回运算结果。
2.函数的调用
- 1.函数的调用过程:任何c语言程序,首先都是从主函数main()开始,如果遇到某个函数被调用,将暂停主函数的运行,转而执行相应的函数,执行完该函数后,再返回主函数继续执行接下来的步骤,我们通常把调用其他函数的函数称为主调函数,如main(),被调用的函数称为被调函数;
- 2.被调用的形式:
函数名(实际参数表)
-
3.参数传递
- 1.实参:主调函数中的参数,可以将其值传递给形参;实参可以是常量,变量,表达式
- 2.形参和实参必须一一对应,两者数量相同,类型一致,且只能由实参传给形参,方向是单向的!,例如:主函数中定义a的值为1,b的值为2,在自定义函数sum()中对a,b的值进行加2,看看最后主函数中输出a,b的值是多少?
显然我们看到主函数中的a,b的值并没有因为执行了函数sum()而改变他们的值,说明c语言在调用函数的时候,永远只能传值给函数,而不是传变量,即使实参传给形参的值在其函数中改变了,也不会影响到实参。
-
4.函数的返回结果
-
- 形式为
return 表达式
- 形式为
- 2.一般情况下表达式的类型和函数类型一致,如果不一致,以函数类型为主;
- 3.return作用:结束函数的运行,return之后的语句不再执行;带着表达式的值返回主调函数;
- 4.return语句一次只能返回一个值;
- 5.在void类型的函数中,如果不写return语句,当函数中所以语句都执行完了以后,遇到最后的大括号会自动返回主调函数。
-
-
5.函数原型声明
- 1.’形式为
函数类型 函数名(参数表);
- 2.其目的是说明函数类型和参数情况,以保证程序编译时能判断对该函数的调用是否正确;
- 3.在调用函数前一定要先声明,再调用。
- 1.’形式为
-
6.全局变量,局部变量和静态局部变量
- 1.区别
定义的位置 | 作用范围 | 什么情况下使用 | 优点 | |
---|---|---|---|---|
全局变量 | 函数外部 | 从定义位置开始有效,一直到程序结束 | 一个变量需要传递到多个函数中 | 可以解决单个变量在多个函数之间的传递和返回多个结果的问题 |
局部变量 | 函数内部 | 只在定义变量的函数起作用,函数调用时有效,函数调用结束时就消亡 | 一个变量只在单个函数中起作用 | 可以避免各个函数之间相互干扰 |
静态变量 | 函数内部 | 从被调用开始一直作用到程序结束 | 一般用于这个变量需要累积之类的运算 | 可以保留上一次函数调用后的值 |
- 2.注意:
- 1.由于局部变量和全局变量的作用范围不同,允许它们同名,当某函数的局部变量于全局变量同名时,在该函数中全局变量不起作用,而由局部变量起作用;
- 2.自动变量:当函数被调用时,其形参和局部变量才被分配相应的储存单元,一旦函数调用结束,在函数中定义的所有形参和局部变量就不存在了,局部变量就是自动变量;自动变量的定义形式是
auto 类型名 变量表;
,auto可省略; - 3.静态变量赋初值只在第一次调用时起作用,若没有赋初值,系统将自动赋0;自动变量若没有赋初值,其储存单元中将是随机值;
1.2 本章学习体会及代码量学习体会
1.2.1 学习体会
刚开始感觉函数不就是把主函数里面的代码搬出来吗这有什么难,然后...全局变量局部变量是什么东东??为什么函数只能返回一个值啊啊我想要返回两个不行吗呜呜
但是总的来说,学习了函数真的方便了很多!!遇到差不多的题型,可以不用重新写代码或者考虑怎么改代码了,读代码也轻松起来了!我在调试这方面本身就比较薄弱,学习了函数之后,大大减少了我的困扰!!
1.2.2 代码累计
本次综合作业代码量:350
2.综合作业(题目:小学生口算表达式自动生成系统)
2.1本次作业的函数关系图
2.2函数功能及全局变量介绍
2.2.1全局变量
- 1.Num1为算式中的第一个数据;
- 2.Num2为算式中的第二个数据;
- 3.Num3为算式中的第三个数据;
- 4.Ch1为算式中的第一个运算符;
- 5.Ch2为算式中的第二个运算符;
- 6.Answer1为答案;
- 7.Answer2用来保存余数,一输出完余数就变为0;
- 8.Grade用来保存用户输入的年级;
- 9.Problems用来保存用户输入的题目数量;
- 10.Worry用来记录做错的题目;
- 11.Right用来记录做对的题目;
- 12.Count用来记录已经做了的题目;
2.2.2函数功能
1.void Star(); //开始
开始输出提示,指导用户输入相应的数据;
2.void ListMenu(); //主菜单
包含随机选择几个数据的计算和答案正确与否的判断;
3.void Choice(); //随机选择进入三个数据的运算还是两个数据的运算
随机选择进行三个数据的运算还是两个数据的运算,我这里把三个数据的运算出现的概率变小了我们要保护祖国花朵幼小的心灵
4.char Symbol(int grade); //对运算符的处理
随机生成运算符;
5.void Calculation2(int grade); //生成题目,求两个数据之间的运算
根据对应的年级,随机生成两个数据,并输出题目;
6.void Calculation3(int grade); //生成题目,求三个数据之间的运算
根据对应的年级,随机生成三个数据,并输出题目;
7.int Solution(int num1, int num2, char ch); //两个数据间的运算的答案
求出两个数据之间的答案;
8.void Over();//结束
结束,计算正确率和做题的数据;
2.3运行结果截图,测试用例
一年级
二年级
三年级
中途退出
2.4调试碰到问题及解决办法
- 1.在询问是否要继续做题时,用户还未输入回答就自动继续出题:
调试以后发现,没有读入Y和N,而是读入了换行符,加上getchar()吸收换行符就可以了; - 2.有时候运行到一半的时候,程序会突然退出:
忘记考虑除数为0的情况,于是我把除数后面的数据全部改成rand()%9+1
这样就可以避免除数为0的问题; - 3.正确率计算错误:
刚开始没有设置变量count,而是直接用i来表示做题的数目,结果i的值会比用户输入的题目数据大1,导致正确率计算错误; - 4.三年级出现了一位数乘4位数的错误类型:
switch()括号内的数值范围大于case的个数,导致生成随机数没有进入switch语句中;
修改后:
2.5大作业总结
- 1.太太太太难了,赶在最后一个小时内完成TAT,感觉代码写的有些乱,函数的分装还是有些复杂,从我的思维导图就可以看出我的思路还是有些不清晰....
- 2.起初一点思路都没有,每个年级大概只能完成一两种类型,后来在同学的帮助下,逐渐变得有些清晰,但有些地方还是不太严谨;
- 3.从我的测试数据中看到,还是存在错误类型,调试多次,还是没有找到原因,代码调试这一块较为薄弱;
- 4.关于程序运行到一半会卡顿,应该是我的代码太过复杂,导致计算机运算量变大,运行效率变慢,希望接下来时间可以加以改进一下。