C博客作业03--函数

0.展示PTA总分(0----2)

截图展示题目集:函数,排名分数截图。


1.本章学习总结(2分)

1.1 学习内容总结

整理函数章节主要知识点,并能对每个知识点介绍简单案例或语法

1.自定义函数

  • 使用优点
    • 相同功能的代码可以放在同一个函数内,供其他函数调用。 解决代码重复问题,更简洁。 可读性更好,
    • 代码扩展性更好。增加新的功能,不需要更改其他函数。
    • 代码维护性更好。查错针对某个功能函数检查。
  • 结构

[数据类型说明] 函数名称 (参数)
{
    执行代码块;
    return (表达式);
}
  • 一般推荐把自定义函数放在main()函数前面。如果放在main()后面还需要对函数进行声明。

2.函数调用

  • 我们需要用到自定义的函数的时候,就得调用它,那么在调用的时候就称之为函数调用。在C语言中,函数调用的一般形式为:函数名([参数]);
    注意:
    • 1.对无参函数调用的时候可以将[ ]包含的省略。
    • 2.[ ]中可以是常数,变量或其它构造类型数据及表达式,各参数之间用逗号分隔。

3.参数


//在函数中不需要函数参数的称之为无参函数,在函数中需要函数参数的称之为有参函数,有参和无参函数的一般形式如下:
[数据类型说明] 函数名称 (参数列表)   //有参;有参函数更为灵活,可以控制输入值,而无参就比较死板了。
{
    执行代码块;
    return (表达式);
}

[数据类型说明] 函数名称 ()//无参;
{
    执行代码块;
    return (表达式);
}

  • 形参实参
    • 形参是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数,相当于接受站。实参是在调用时传递该函数的参数相当于一个发射站,其信息可以被被调函数使用。
    • 形参只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只有在函数内部有效。函数调用结束返回主调函数后则不能再使用该形参变量。(划重点!!)
    • 实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值,以便把这些值传送给形参。

4.返回值

  • 函数的返回值是指函数被调用之后,执行函数体中的程序段所取得的并返回给主调函数的值。
  • 利用函数返回值可以进行真假的判断;
//返回两个整数中较大的一个
int max(int a, int b)
{
	if (a > b)
	{
		return a;
	}
	else 
	{
		return b;
	}
}


1.2 本章学习体会及代码量学习体会

1.2.1 学习体会

  • 学习到函数这一节就会发现C语言的学习开始要偏向解决生活中的实际问题;比如说本次的综合作业,要求我们扎实地掌握所学的知识,并且能够灵活地应用。这次作业也是我第一次自己做这么大的工程,或许功能不会特别完备,但是还是在编程时学到了很多的东西。所以我觉得,函数的内容,确实要偏向于应用方面。
    自己完成作业的时候才会发现,函数的功能如此强大。比如说,当你要分别进行加减运算的时候,倘若都放在main()里面,会导致程序十分的混乱,并且要设的变量增多(当然其中很大一部分变量是意义重复的)。还便于理清做题的思路,以后要进行功能的扩展也不至于“伤筋动骨”。
  • 应用过程中很多功能还是不能更好的归纳到一个模块中,一个模块与另一个模块的接口也是我觉得不容易表达的地方。

1.2.2 代码累计

本次综合作业代码量:1012行;


2.综合作业

题目:小学生口算表达式自动生成系统


1.功能要求:

1.完成1-3年口算题自动出题系统
2.注意每个年级运算数要求,运算数和运算符要随机生成
3.用户每选择一个难度级别后必须输入题目数量,能统计用户的正确率。用户每算一题,若错误,给出正确答案。 用户中途退出,不继续做题,需要有个提示操作可中途退出。

注意:

(1)软件界面必须友好,多加文字提示,能让用户自己当前做什么,接下来怎么做,每步操作可以退到主菜单界面。
(2)注意异常数据处理,如除0错误、不合法数据、临界数据,系统保证运行时候不崩溃。
(3)注意函数封装,不管是几位数的加减乘除运算,相同功能的代码应该都封装都一函数,通过参数传递实现代码覆盖。也可以考虑数据输入、输出等函数封装,尽量不要把代码都放main中。各种异常情况也可以单独封装函数处理,让程序的扩展性更强。
(4)扩展功能:
可以设置答题时间,用户超过答题时间,提示不能继续做题,重新选抽题。请查阅C的时间函数。
扩展难度级别,比如出现2步加减乘除,然后乘除优先计算。比如2+3*4运算


2.本次作业的函数关系图

可以用思维导图工具画函数调用关系。如:


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

介绍你用到所有函数接口及全局变量。

3.1.全局变量

变量名,作用。

函数名 功能
int AdditionOperation(int grade) 加法运算;
int SubtractionOperation(int grade) 减法运算;
int MultiplicationOperation(int grade) 乘法运算;
int DivisionOperation(int grade) 除法运算;
void CorrectMessage() 回馈答题正确语言
int Judgement(int result, int answer) 判断回答答案与正确答案相同与否;
int AdditionAndSubtraction(int n) 加减混合运算;
int AdditionAndDivision(int n) 加除混合运算;
int FourArithmeticOperations(int n) 四则运算混合;

3.2.ListMenu()函数

文字介绍函数功能、思路,截图函数代码。
思路历程:
(1)首先进入程序要看见一个欢迎界面void EnterInterface01();显示欢迎词并提示是否继续做;
(2)提示输入年级,要做题的数量,然后根据年级分流题目等级;


3.3 函数2等

(1)当我是一年级小朋友时

测试点 类型 结果
题目1 整十数加一位数 正确
题目3 两位数减整十数 正确
题目4 100以内加减混合混合运算 正确
题目6 10以内三个数连加 正确
。。。 整十数减整十数 暂无

(2)当我是二年级小朋友时

测试点 类型 结果
题目2 10以内除法加法混合运算 正确
题目4 整百数加减法(和超过一千的,退位的) 正确
题目1 整十数加整十数的加法(进位的) 正确

题目4|1-9以内的表内乘除法|正确
(3)当我是三年级小朋友时

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

测试点 类型 结果
题目1 三位数加三位数的加法(含连续进位的) 正确
题目5 一位数的四则运算 正确
题目9 万以内的加减法 正确
。。。 两位数除以一位数(有余数) 暂无
。。。 一位数乘一位、二位、三位数 暂无

5. 调试碰到问题及解决办法

(1)当程序十分庞大的时候,如果定义不规范容易造成程序的无法运行。比如说,第一次运行的时候,出现了20几个错误提示,原因是自定义函数函数类型不够规范,导致无法运行,所以写程序的时候务必要把思路理清;
(2)刚开始做题时加入我要做5道题,不论对错,但是调试的时候发现做完5道题并不能及时地弹出,因为我调用的switch语句没有使用break;所以,运行的时候只有完整的连续做对5道题才可以弹出;
(3)我一直想计算一次性正确率多少,但是没有办法,后来想到了用返回值return各次运算模块计算值来使right值改变,达到计算正确率地目的。同时用printf输出正确率的时候吗“ ”内需要打两个%%才能输出0.00%的结果;


6.大作业总结

(1)首先就是如何解决高年级包含低年级题目的问题。我在这里将每个年级需要做的问题进行了大概划分,一年级只有加减和加减混合;二年级有加减乘除以及加除混合;三年级有加减乘除以及四则运算。当函数进入到每一个运算模板的时候,高的年级就有机会向低的年级进行转化(这里我用了随机生成数代表重新赋年级值的结果,后续很多地方我还用了这样的方法),所以使高年级做低年级的题目;
(2)刚开始写运算模块的时候代码很多,但是它大部分是重复的内容,后来我自己定义了一个变量answer,表示正确的结果,再调用一个函数Judgement(int result, int answer);判断输入答案与真实答案是否相同;缩短了约500行的代码量;
(3)在写博客的时候发现自己的许多功能还没有完善(比如三年级的加减乘除混合运算),许多无用变量(比如在运算模块中的flag),还有许多功能重叠的变量可整合,还有,三年级做的混合运算题集没有包括低年级的混合运算题目等。所以一个完美的程序并不是一次就能写好的,这需要不断地改进;

原文地址:https://www.cnblogs.com/shenchao123/p/11784655.html