0.展示PTA总分
函数
1.本章学习总结
1.1 学习内容总结
1.函数可以分为库函数和自定义函数,scanf()
,printf()
等为库函数,可以直接调用,而自定义函数需要自己定义。
2.函数命名用驼峰法时首字母应大写。
3.函数定义的一般形式:
4.函数首部由函数类型,函数名和形式参数表组成,位于函数定义第一行 。函数首部不能加分号。其中形参表的格式是:
5.函数体中,用return语句
返回运算的结果。
6.在任何C程序执行时,首先从主函数main()
开始调用。
7.函数调用的一般形式:
8.函数调用一般出现在两种情况下:①赋值语句 ②输出函数的实参
9.参数传递时,形参和实参必须一一对应,二者数量相同,类型尽量一致,且只允许实参把值复制给形参。
10.形参必须是变量;而实参可以是常量,变量或表达式。二者可以同名,也可不同名。
11.函数结果返回的形式:
12.return语句
的作用:
1. 结束函数的运行。
2. 带着运算结果返回主调函数。
3. ps:return语句只能返回一个值。
13.函数声明的一般格式:
ps:与函数首部相同,但是是以分号结束的。
14.不返回结果的函数定义:
ps:在不返回结果的函数定义中,void不能省略,否则,函数类型被默认定义为int型。
15.
1.局部变量的作用范围局限于所在的函数内部,只在定义变量的函数中起作用函数调用时候有效,函数调用结束也消亡。全局变量的作用范围是从定义开始到程序所在文件的结束,作用于所有函数。静态局部变量从被调用开始一直作用到程序结束,其作用范围只能用于所定义函数,不能
用于其他函数。
2.局部变量一般定义函数或复合语句的开始处,不能定义中间位置。全局变量一般定义在程序的最前面,即第一个函数的前面,若一个变量需要传递到多个函数时用全局变量。静态局部变量在有静态保存的要求下使用,一般用于累加累乘之类的运算,一般不使用静态局部变量。
16.自动变量定义形式:
17.为了便于计算机存储管理,C语言把保存所有变量的数据区分成动态存储区和静态存储区。它们的管理方式不同,动态存储区是使用堆栈来管理的,适合函数动态分配与回收存储单元。而静态存储区相对固定,管理较简单,它用于存放全局变量和静态变量。
18.静态变量定义格式:
ps:如果静态变量定义时没有赋初值,系统将自动赋0。
1.2 本章学习体会及代码量学习体会
1.2.1 学习体会
- 在这一章函数的学习中,我认识到了自己定义函数使用函数的好处,可以使结构更加清晰,看起来也更加整齐有序,感觉能解决以前不方便的问题。
- 在函数这一章中,我认识到了函数的定义,知道了函数调用的形式,但是在运用过程中,我对于函数的运用还不熟练,一些类型还是不熟练,自定义函数的格式比较多,在形参和实参对应的参数传递时如果用还是容易弄混。
- 在局部变量和全局变量的运用选择,还有静态变量也比较混乱,以及作用范围和生存周期的区别。
- 而且变量储存的内存分布好复杂,不是很明白。
1.2.2 代码累计
我的代码量(不包括重复)
周 | 代码量(行) |
---|---|
4 | 241 |
5 | 506 |
6 | 771 |
7 | 842 |
8 | 793 |
9 | 724 |
累计 | 3877 |
本次综合作业代码量:1680行(原来理解错题意写了有300多行,后来又重新写)
2.综合作业
1.题目:小学生口算表达式自动生成系统
功能要求:
- 完成1-3年口算题自动出题系统
- 注意每个年级运算数要求,运算数和运算符要随机生成
- 用户每选择一个难度级别后必须输入题目数量,能统计用户的正确率。用户每算一题,若错误,给出正确答案。 用户中途退出,不继续做题,需要有个提示操作可中途退出。
注意:
- 软件界面必须友好,多加文字提示,能让用户自己当前做什么,接下来怎么做,每步操作可以退到主菜单界面。注意异常数据处理,如除0错误、不合法数据、临界数据,系统保证运行时候不崩溃。
- 注意函数封装,不管是几位数的加减乘除运算,相同功能的代码应该都封装都一函数,通过参数传递实现代码覆盖。也可以考虑数据输入、输出等函数封装,尽量不要把代码都放main中。各种异常情况也可以单独封装函数处理,让程序的扩展性更强。
扩展功能:
- 可以设置答题时间,用户超过答题时间,提示不能继续做题,重新选抽题。请查阅C的时间函数。
- 扩展难度级别,比如出现2步加减乘除,然后乘除优先计算。比如2+3*4运算。
2.本次作业的函数关系图
3.函数功能及全局变量介绍
3.1.全局变量
int grade;//年级名称
int number;//题目数量
int order;//题目编号
int count;//题目数量的逐渐增加
int i, j, k;//口算题目中=前面的数字
int result;//答题者输入的口算题目的结果
int error;//统计同一道题的错误数
int wrong;//统计错误题数
int right;//统计正确题数
char ch1,ch2;//运算符
int op1,op2;
int response;//记录真正的答案,原本没有定义这个的,后来发现这个比较方便
int trueRemainder;//从二年级的题目中有余数的存在,定义真正的余数
int yoursRemainder;//答题者输入的余数
double accuracyRate;//正确率
3.2.ListMenu()函数
- 我的ListMenu()函数是主要是用来输出该程序的规则
3.3 函数2&3
- 我的correctMessage()函数和incorrectMessage()函数是用来输出答案正确或错误时的提示
4.运行结果截图,测试用例。
10以内三个数连加连减混合,100以内的填括号,10以内的填括号,10以内的加减法
10以内的加减法,凑10练习
10以内相同整数连加,尾数是0三位数加减法,9以内的除法,含有小括号的混合运算
两位数的加减法,整百数乘整十数,两位数乘两位数,三位数的加减法,百以内两位数连减两位数的减法
一位数乘一位数,一位数除两位数,一位数除三位数,尾数是0的三位数乘法
5.调试碰到的问题及解决办法
1. 在运行过程中,最新发现的一个问题是计算正确率的时候,有时候就正确,有时候答案就不正确,暂时还没有找到解决办法
2. order = rand() % 10;这个语句应该放在for语句中,才可以做不同的口算,否则一直是同一个类型,通过调试找出
3. 刚开始答案一直不对,后来发现ijk产生随机数应该放在符号产生之前,通过测试找出
4. 一开始运算符号不知道应该怎么弄出随机的,后来通过07学姐的启发,自己找到了一种看起来比较复杂,但比较好理解的方法
5. 设置答题时间暂时未找到方法
6. 用户中途退出暂时未找到方法
7. 随机数刚开始只是见过,但不熟悉,而且还有规定的范围,感觉不明白不会使用,后来通过看以前课堂派上的相关代码以及上网查询资料,知道了:要产生从X到Y的数,只需要这样写:k = rand() % (Y - X + 1) + X;,在这次综合作业中不断使用,现在已经逐渐掌握
8. 用response记录真正的答案,原本没有定义这个的,后来发现使用这个比较方便,更容易进行比较
9. 调试时发现随机数一直都是同一组,后来发现定义srand(time(NULL));可以产生不同的随机数
6.大作业总结
1. 在这次综合作业中使用随机数,逐渐掌握,但还是在一些比较特殊方面比如说运算符号比较复杂时不知道应该怎么办,刚开始的时候,感觉很害怕去写这个,但是在写了第一类之后,感觉就没有那么恐怖了,所以要敢于去做
2. 在写这么长的代码时,格式非常重要,但是在复制前面的代码时不知道为什么格式就会变得不如我原来的整齐,在复制之后重新改动时由于不认真可能会漏掉一些东西,希望自己以后能更加严谨一些
3. 在写这个时真的很让人纠结,我第一次写时由于理解错题意,认为是选择年级之后再选择想要做的题型,后来明白了这个难度级别的意思应该就是年级级别,然后就重写了,所以以后要多想一些
4. 我的程序中函数使用比较少,主要都是在主函数中,这个口算系统不太会使用函数,单独封装函数处理不熟练,希望以后在写代码时多用函数
5. 输出后界面比较长,不知道怎么才可以重新清屏,即:每步操作可以退到主菜单界面
6. 在中途退出方面感觉是需要用到条件语句,但是应该用什么来做这个标志不清楚
7. 老师建议扩展功能设置答题时间,即:用户超过答题时间,提示不能继续做题,重新选抽题,虽然知道要查询时间函数,但还是不太能理解到底应该怎么规定每道题的时间,时间超过了又应该怎么办
8. 在每个后面一定要多加注释,不然很容易忘记自己写的是什么,也不能够让别人看明白,并且在调试过程中,发现的问题要及时记录下来,解决办法也要写明白
缺月挂疏桐,漏断人初静。时见幽人独往来,缥缈孤鸿影。
惊起却回头,有恨无人省。拣尽寒枝不肯栖,寂寞沙洲冷。