C博客作业03——函数

时间:2022-04-07 15:31:59

0.展示PTA总分

截图展示:

C博客作业03——函数

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.本次作业的函数关系图;

内容导图:

C博客作业03——函数

结构导图:

C博客作业03——函数

辅助功能函数介绍:

C博客作业03——函数

3.函数功能及全局变量介绍

3.1全局变量

  • 在这个算数系统里,我没有用到全局变量,但是现在在写博客的时候,想想如果用到全局变量的话,自己的整个系统会更加简洁,因为对于每一个子函数来言,总是会有那么几个固定不变的变量需要求算,但是由于时间原因现在我不能改进我的程序,希望作业之后,自己可以改进。

  • 通用变量如下:

C博客作业03——函数

3.2.ListMenu()函数

(a)main()函数

C博客作业03——函数

  • 小贴士: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();

C博客作业03——函数

(2)showtwo();

C博客作业03——函数

(3)Op();

C博客作业03——函数

(4)praise1()

C博客作业03——函数

(5)praise2()

C博客作业03——函数

(6)fact()

C博客作业03——函数

(7)digit()

C博客作业03——函数

  • 小贴士:由于每次使至少两个随机数的运算,所以我如果要把随机生成的数的范围放到一个函数里,那么只能通过同一范围的数的变形,来得到在一个函数里,生成两个同一范围的不同两个数。

(8)proceduer1()

C博客作业03——函数

C博客作业03——函数

  • 小贴士:这个使对两个随机数进行运算的通用部分。

(9)procedure2()

C博客作业03——函数

C博客作业03——函数

  • 相比较与procedure1(),它多传入了值和运算符,并且,进行peocedure2()的,都是boss级别,这时,里面还会多嵌套一个升级版boss级别,当小朋友的分数是满分时,可以选择做或不做。

3.3.2闯关函数截图

(1)G1()

C博客作业03——函数

(2)G2()

C博客作业03——函数

  • 小贴士:G3与上述类似。

(3)G1L1()

C博客作业03——函数

  • 小贴士:对于每一个年级的小兵级别,都是两个随机数之间的运算,所以内容和上述相似。

(4)upgrade1()

C博客作业03——函数

  • 小贴士:这是一年级的升级版大boss,对于二年级和三年级的升级版,因为题型不同,则是另设一个函数,不在procedure2()里。

(5)upgrade3()

C博客作业03——函数

C博客作业03——函数

C博客作业03——函数

  • 小贴士:因为二年级和三年级的升级版大boss是求余,于是它们的函数另外写,就不与procedure1()和procedure2()混合。但是它们是也要经过procedure1()。

(6)总结

procedure1():G1L1(),G1L2(),G2L1(),G2L2(),G2L3(),G3L2(),G3L3(),G3L2(),
upgrade3(),upgrade2() procedure2():G1L3(),upgrade1(),G3L1(),

4.运行结果截图,测试用例。

在这里,选的都是其中明显与其它不同的部分,没选出来的都是与选出来的相似的,具体会在下面说明。

1.G1L1

C博客作业03——函数

  • 如果中途退出:

C博客作业03——函数

  • 小贴士:其它年级的小兵级别于此是差不多的界面。

2.upgrade1()

C博客作业03——函数

C博客作业03——函数

  • 小贴士:如果进入到一年及升级版boss级,则会出现提示,进入后,页面会被清空,进行测试,如果不想继续测试,则第二数输入0,然后回出现提示,是否继续通关,跳回年级界面。

4.upergrade3()

C博客作业03——函数

  • 在这个关卡,如果得到满分,则会出现友情提示,是体验升级版大boss,设置这个关卡的时候,我花的时间是最多的,因为我一直进不去upgrade3(),后来我在那边一直改getchar()的位置,发现还是不行,结果往上面变量定义那边看,发现自己变量定义类型出错了,所以这件事情告诉我们,出一点错就要花很长的时间去找错。
进入升级版大boss后,界面如下

C博客作业03——函数

5.调试过程中遇到得问题及解决办法

  • Q1:在进行提醒语句时,比如你是否继续闯关,要输入一个字符,一开始不知道,于是一直进入不了那个条件,后来请教学长,发现输入字符后得那个回车被当作字符吸收掉了,于是与之进不去。
  • Q2:我现在才知道,当一段代码长到无法想笑时,只要有一点的错误,就可能得大动干戈,即使我使用得了很多函数,但是一旦错了也是非常不容易改的,只能一步一步调试,然后一步一步改,真心不容易。
  • Q3:由于时间得限制,我还不能将我的程序进行进一步得完善,比如由于小学生没有负数,于是如果将值进行限制,那么在运行我的程序时,就会发现卡壳现象,被卡在那里了,这给人得体验式非常不好的,就像我们平时用手机一样。这部分我还不知道如何进行完善,之后将会请教学姐学长进行改正。