C博客作业03——函数
0.展示PTA总分
截图展示:
1.本章学习总结
1.1学习内容总结
(a)函数的定义
-
1)函数是一个完成特定工作的独立程序模块,包括库函数和自定义函数两种,scanf(),printf()等为库函数,编程时直接调用即可,而用户自己定义,属于自定义函数。
-
函数定义的一般形式:
-
函数类型 函数名(形式参数表) /*函数首部*/ { 函数实现过程 /*函数体*/ }
-
函数类型目前学的有 void,int,double等,void不返回值,所以可以不需要return,虽然它没有返回值,但是它的作用通常以屏幕输出等方式体现,在函数调用的时候,通常以独立的语句方式,如List()。而后面的函数类型则需要返回相应类型的数值。
(b)函数的调用
- 调用自定义函数时,程序中必须有与调用函数相对应的函数定义,称为函数声明。
- 函数的调用过程:
- 任何C程序执行,首先从主函数main()开始,如果遇到某个函数调用,主函数被暂停执行,转而执行相应的函数,该函数执行完后将返回主函数,然后再从原先暂停的为止继续执行。
(c)函数的形参和实参。
- 函数定义时,位于参数表的被称为形参,在main()函数里主调函数的参数成为实参,形参除了接受实参的值外,使用方法与普通变量类似。形参和实参必须一一对应,两者数量相同,类型尽量一直,实参的作用只是把值传给形参,形参在自定义函数里起作用,作用范围仅限于自定义函数范围内,形参的任何变化与实参没有关系。
(d)全局变量,局部变量,静态局部变量。
-
C语言中把定义在函数内部的变量称为局部变量,局部变量的有效作用范围局限在函数内部。使用局部变量可以避免各个函数之间的变量相互干扰。在使用多个函数时,即使使用了同名的形参,且与主函数实参变量也同名,但由于分属不同函数,它们有各自不同的变量实体和使用范围,不会相互干扰。
-
定义在函数外而不属于任何函数的变量称为全局变量。全局变量的作用范围是从定义开始到程序所在文件的结束,它对作用范围内所有函数都起作用。我们一般情况下把全局变量定义在程序的最前面。
-
由于全局变量和局部变量的作用范围不同,允许它们同名。当某函数的局部变量与全局变量同名时,在该函数全局变量不起作用,而由局部变量起作用,同样,当函数局部变量与复合语句局部变量同名时,以复合语句为准。
-
全局变量虽然可以用于多个函数之间的数据交流。但一般情况下,应尽量使用局部变量和函数参数。
-
静态局部变量存放再静态存储区,不会像普通局部变量那样因为函数调用结束而被系统回收,它的生存周期会持续到程序结束。由于储存单元被保留,一旦含有静态局部变量的函数被再次调用,上一次函数调用的值仍被保存,可供本次调用继续使用。
(e)数据类型
-
计算机处理的信息都以二进制形式表示,数值可以采用原码,反码,补码表示。
-
0代表正数,1代表负数。
-
正数的原码,反码,补码都相同。
-
负数:
-
原码 :符号位为1,其余各位表示数值的绝对值。
-
反码:符号位是1,其余各位对原码取反。
-
补码:反码加1;
-
-1的原码是:10000000 00000001 -1的反码是:11111111 11111110 -1的补码是:11111111 11111111
-
(f)转义字符
-
转义字符由反斜杠加上一个字符或数字组成,它把后面的字符或数字转换成别的意义,虽然转义字符形式上由多个字符组成,但它是字符常量,只代表一个字符,它的使用方法与其它字符常量使用相同。
-
字符 含义 \n 换行 \t 横向跳格 \\ 反斜杠 '' 双引号 ' 单引号 \ddd 1~3位八进制整数所代表的字符 \xhh 1~2位十六进制整数所代表的字符。
(h)数据的输入和输出
-
十进制 八进制 十六进制 int %d %o %x long %ld %lo %lx unsigned %u %o %x unsigned long %lu %lo %lx
(i)部分运算符的优先级和结合性
运算符总类 | 运算符 | 结合方向 | 优先级 |
---|---|---|---|
逻辑运算符 | ! | 从右向左(右结合) | 高 |
算数运算符 | ++ -- + - | ||
* / %(双目) | 从左向右(左结合) | ||
+ -(单目) | |||
关系运算符 | < <= > >= | ||
== != | |||
逻辑运算符 | && | ||
|| | |||
条件表达式 | ?: | 从右向左(右结合) | |
赋值运算符 | = += -= *= /= %= | 从左向右(左结合) | 低 |
逗号运算符 | , |
(j)逻辑运算符
- &&:
- 求解表达式exp1&&exp2时,先算exp1,若其值位0,则exp1&&exp2的值一定时0,此时,已经没有必要计算exp2的值。
- ||:
- 求解exp1||exp2时,先算exp1,若其值为非0,则exp1||exp2的值一定是1,此时,也不必计算exp2的值。
1.2本章学习体会及代码量的学习体会;
1.2.1学习体会
学习这个章节,我觉得自己已经开始有点hold不住了,特别是当数组与函数结合以后,就发现题目难度不再是开学那样简单,已经是小巫见大巫了,总结一下自己,发现自己刷题的时间越来越少,一个是因为最近的体育运动会,开始之前社团的安排,以及运动会期间要做的事情,但是其实这并不是主要原因,我做的事情,别人同样也要干,但是有些人却能够把学习和社团的事情分的很清楚,把这两者的时间分配的很好,但是我没有做到,但是更重要的是,我做一道题花的时间太长,总想着自己一定要把它做出来,在那边死磕到底,于是花了很多时间,其实,如果向别人多多请教,收益的可能会更多。
1.2.2代码累计
代码量 |
---|
900多 |
2.综合作业
题目:小学生口算表达式自动生成系统
2.本次作业的函数关系图;
内容导图:
结构导图:
辅助功能函数介绍:
3.函数功能及全局变量介绍
3.1全局变量
-
在这个算数系统里,我没有用到全局变量,但是现在在写博客的时候,想想如果用到全局变量的话,自己的整个系统会更加简洁,因为对于每一个子函数来言,总是会有那么几个固定不变的变量需要求算,但是由于时间原因现在我不能改进我的程序,希望作业之后,自己可以改进。
-
通用变量如下:
3.2.ListMenu()函数
(a)main()函数
-
小贴士:cai()引出年级选择目录;
-
小贴士:system(“cls”)函数是用来当闯关结束后把屏幕上的东西清掉,就是起清屏作用,使整体的体验更好点。
-
小贴士:system("pause"),屏幕会出现提示词“按任意键关闭此窗口”
3.3子函数功能介绍及截图
(a)闯关函数目录介绍:
一年级:
G1L1(); //整十数加一位数或整十数加整十数(一年级lever1)
G1L2(); //整十数加一百以内的数(一年级lever2)
G1L3(); //三个数十以内的混合运算(一年级lever3)
upgrade1(); //一百以内连加连减混合运算;(升级版)
二年级:
G2L1(); //1~9的乘除法运算(二年级lever1)
G2L2(); //1~9的乘法运算(二年级lever2)
G2L3(); //整百数加减整十数(二年级lever3)
upgrade2(); //取余(升级版)
三年级:
G3L1();//十以内除法加法的混合运算(三年级lever1)
G3L2();//三位数相加减(三年级lever2)
G3L3();//两位数相乘(三年级lever3)
upgrade3();//两位数除一位数,有余数(升级版)
(b)辅助功能函数介绍:
showone(); //年级选择菜单;
showtwo(); //闯关目录;
Op(); //随机生成不同的运算符;
praise2(); //随机生成不同奖励的话;
praise1(); //告诉级别;
digit(); //随机生成不同范围类型的数;
procrdure1(); //对于两个数的四则运算,通用的过程;
procedure2(); //对于三个数的四则运算,通用的过程;
3.3.1辅助功能函数截图
(1)showone();
(2)showtwo();
(3)Op();
(4)praise1()
(5)praise2()
(6)fact()
(7)digit()
- 小贴士:由于每次使至少两个随机数的运算,所以我如果要把随机生成的数的范围放到一个函数里,那么只能通过同一范围的数的变形,来得到在一个函数里,生成两个同一范围的不同两个数。
(8)proceduer1()
- 小贴士:这个使对两个随机数进行运算的通用部分。
(9)procedure2()
- 相比较与procedure1(),它多传入了值和运算符,并且,进行peocedure2()的,都是boss级别,这时,里面还会多嵌套一个升级版boss级别,当小朋友的分数是满分时,可以选择做或不做。
3.3.2闯关函数截图
(1)G1()
(2)G2()
- 小贴士:G3与上述类似。
(3)G1L1()
- 小贴士:对于每一个年级的小兵级别,都是两个随机数之间的运算,所以内容和上述相似。
(4)upgrade1()
- 小贴士:这是一年级的升级版大boss,对于二年级和三年级的升级版,因为题型不同,则是另设一个函数,不在procedure2()里。
(5)upgrade3()
- 小贴士:因为二年级和三年级的升级版大boss是求余,于是它们的函数另外写,就不与procedure1()和procedure2()混合。但是它们是也要经过procedure1()。
(6)总结
procedure1():G1L1(),G1L2(),G2L1(),G2L2(),G2L3(),G3L2(),G3L3(),G3L2(),
upgrade3(),upgrade2()
procedure2():G1L3(),upgrade1(),G3L1(),
4.运行结果截图,测试用例。
在这里,选的都是其中明显与其它不同的部分,没选出来的都是与选出来的相似的,具体会在下面说明。
1.G1L1
- 如果中途退出:
- 小贴士:其它年级的小兵级别于此是差不多的界面。
2.upgrade1()
- 小贴士:如果进入到一年及升级版boss级,则会出现提示,进入后,页面会被清空,进行测试,如果不想继续测试,则第二数输入0,然后回出现提示,是否继续通关,跳回年级界面。
4.upergrade3()
- 在这个关卡,如果得到满分,则会出现友情提示,是体验升级版大boss,设置这个关卡的时候,我花的时间是最多的,因为我一直进不去upgrade3(),后来我在那边一直改getchar()的位置,发现还是不行,结果往上面变量定义那边看,发现自己变量定义类型出错了,所以这件事情告诉我们,出一点错就要花很长的时间去找错。
进入升级版大boss后,界面如下
5.调试过程中遇到得问题及解决办法
- Q1:在进行提醒语句时,比如你是否继续闯关,要输入一个字符,一开始不知道,于是一直进入不了那个条件,后来请教学长,发现输入字符后得那个回车被当作字符吸收掉了,于是与之进不去。
- Q2:我现在才知道,当一段代码长到无法想笑时,只要有一点的错误,就可能得大动干戈,即使我使用得了很多函数,但是一旦错了也是非常不容易改的,只能一步一步调试,然后一步一步改,真心不容易。
- Q3:由于时间得限制,我还不能将我的程序进行进一步得完善,比如由于小学生没有负数,于是如果将值进行限制,那么在运行我的程序时,就会发现卡壳现象,被卡在那里了,这给人得体验式非常不好的,就像我们平时用手机一样。这部分我还不知道如何进行完善,之后将会请教学姐学长进行改正。