c语言函数精选题
- 一、易错概念题
- 1.1💡建立函数的目的
- 1.2💡函数的定义
- 1.3💡return语句
- 1.4💡函数的参数
- 1.5💡复合语句声明变量
- 二、代码填空题
- 2.1💡四舍五入
- 2.2💡二分法求方程根
- 2.3💡输出菱形
- 2.4💡求三个数的最小公倍数
- 2.4💡两个整数最大公约数
🔍计算机二级,考研复试,期末复习…
一、易错概念题
1.1💡建立函数的目的
A 选项:函数调用本身会有一定的开销,比如参数传递、栈操作等,在某些情况下甚至可能降低程序执行效率,建立函数的主要目的不是提高执行效率,该选项错误。
B 选项:将程序中实现特定功能的代码封装成函数,使程序结构更加清晰,每个函数完成一个独立的功能,就像一个个模块,方便理解和维护,从而提高了程序的可读性,该选项正确。
C 选项:虽然函数可以复用代码,但在实际程序中,函数定义和调用的相关代码也会占用一定篇幅,不一定能减少程序篇幅,该选项错误。
D 选项:函数只是程序逻辑结构的一种组织方式,对程序文件所占内存大小没有直接的减少作用,程序文件大小主要和代码量、编译后的目标格式等因素有关,该选项错误。
答案B
建立函数的目的:
提高可读性和可维护性 实现代码复用 模块化编程 增强程序逻辑性
1.2💡函数的定义
A 选项:double fun(int x, int y) ,这是一个标准的函数定义形式,返回值类型为double,函数名为fun,形参列表中包含两个int类型的参数x和y,符合 C 语言函数定义规则,该选项正确。
B 选项:double fun(int x;int y) ,在形参列表中,参数之间应该用逗号分隔,而不是分号,该选项错误。
C 选项:double fun(int x, int y); ,函数声明末尾需要加分号,但函数定义末尾不能加分号,该选项错误。
D 选项:double fun(int x, y); ,第二个参数y没有指定类型,不符合函数定义中形参需明确类型的要求,该选项错误。
答案A
声明有分号,定义无分号!!!
1.3💡return语句
A 选项:如果函数的返回值类型不是void ,即使函数中没有return语句,它依然有返回值,只是这个返回值是不确定的,所以该选项错误。
B 选项:函数不会返回若干个系统默认值,没有这样的规则,该选项错误。
C 选项:没有return语句,函数无法按照用户期望返回特定值,因为函数执行结束后,其返回值区域的值是不确定的,该选项错误。
D 选项:当函数返回值类型不是void且没有return语句时,函数会返回一个不确定的值,这是因为函数结束时,其返回值所在的内存区域未被正确赋值,该选项正确。
答案 D
再学一个知识:在早期的 C 语言(如 C89 标准)中,当函数值类型缺省定义时,该函数值隐含的类型是int型。
1.4💡函数的参数
A 选项:在 C 语言中,函数调用时,实参可以是常量(如5 、'a’等)、变量(已定义的合法变量)或表达式(如3 + 5 、a * b等),该选项正确。
B 选项:形参是在函数定义时用于接收实参传递过来的值的参数,它只能是变量,不能是常量或表达式。常量没有存储地址,无法接收实参传递的数据,表达式也不具备接收数据的功能,所以该选项错误。
C 选项:实参可以为任意类型,只要在调用函数时的类型匹配正确即可,比如int 、float 、char 、指针类型等,该选项正确。
D 选项:为了保证数据传递的正确性,形参应与其对应的实参类型一致(或存在合理的类型转换关系),否则可能导致数据错误或程序运行异常,该选项正确。
答案B
实参多样常变表,类型任意皆可行。
形参只能是变量,类型要与实参应 。
1.5💡复合语句声明变量
在 C 语言中,在函数的复合语句(通常由花括号 {} 括起来)中定义的变量,其作用域仅限于该复合语句内部。当程序执行离开这个复合语句时,该变量的生命周期结束,不能在复合语句之外被访问,所以该变量只在该复合语句中有效,该选项正确。
答案A
普通变量的生存空间就是那个大括号{}!
二、代码填空题
2.1💡四舍五入
对于【1】处:
题目要求对value中的值进行四舍五入计算,在 C 语言中,可以使用(int)(value + 0.5)来实现对浮点数value的四舍五入并转换为整数,所以【1】处应填(int)(value + 0.5) 。
对于【2】处:
需要判断计算后的值val与ponse是否相等,若相等则显示"Well done!!",所以判断条件应该是val == ponse,故【2】处应填val == ponse。
2.2💡二分法求方程根
【1】 f( r) * f(n)<0:
在二分法求根过程中,每次取区间[m, n]的中点r=(m + n)/2 。判断f( r)与f(n)的乘积的符号是为了确定根所在的区间。
若f( r)* f(n)<0,根据零点存在定理(如果函数y = f(x)在区间[a, b]上的图象是连续不断的一条曲线,并且有f(a)·f(b)<0,那么函数y = f(x)在区间(a, b)内有零点),可知根在区间[r, n]内,此时应将r赋值给m,即m = r,来缩小根所在的区间范围。
【2】 n - m<0.001:
这里n - m表示当前根所在区间的长度。题目要求绝对误差不超过0.001,当区间长度小于0.001时,就认为找到了满足精度要求的近似根,此时可以跳出循环 。
二分法求方程根的基本思想是:对于区间[m, n]上连续不断且f(m) * f(n) < 0的函数y = f(x),通过不断地把函数f(x)的零点所在的区间一分为二,使区间的两个端点逐步逼近零点,进而得到零点近似值。
2.3💡输出菱形
【1】处:
观察输出图形可知,每一行的数量是有规律变化的。当i = 0时,第一行有1个;i = 1时,第二行有3个* ;i = 2时,第三行有5个* 。可以总结出规律,第i行*的数量为2 * i + 1。所以此处应填2 * i + 1。
【2】处:
在main函数中,第一个for循环for(i = 0; i < 3; i++) 是用于控制上半部分图形的输出。要输出对应的图形,需要调用函数a,所以此处应填a(i)。
【3】处:
第二个for循环for(i = 3; i >= 0; i–) 是用于控制下半部分图形的输出,同样需要调用函数a来输出对应的图形,所以此处应填a(i)。
2.4💡求三个数的最小公倍数
【1】处:
在max函数中,其功能是找出三个数x、y、z中的最大值。已经判断了x是否为最大值,接下来要判断y是否为最大值,条件应该是y > x && y > z,所以此处应填y > x && y > z。
【2】处:
在main函数中,通过不断让x0(三个数中的最大值)乘以i得到一个新的数j,然后判断j是否能同时被输入的三个数x1、x2、x3整除,如果能整除,那么j就是这三个数的最小公倍数,此时可以跳出循环。判断整除可以使用取余运算,条件为j % x1 == 0 && j % x2 == 0 && j % x3 == 0,所以此处应填j % x1 == 0 && j % x2 == 0 && j % x3 == 0。
三个数最小公倍数求解思路:
找出最大值:
max函数通过一系列条件判断找出输入的三个数x、y、z中的最大值。
寻找最小公倍数:
利用一个无限循环while(1) ,从i = 1开始,让最大值x0乘以i得到j(即j = x0 * i)。
然后通过判断j能否同时被原来的三个数x1、x2、x3整除(即【2】处的条件j % x1 == 0 && j % x2 == 0 && j % x3 == 0)。如果能整除,说明j是这三个数的公倍数,并且由于是从i = 1逐步递增寻找,找到的第一个满足条件的j就是最小公倍数,此时跳出循环。如果不能整除,则i自增 1(i = i + 1),继续寻找下一个可能的公倍数。
2.4💡两个整数最大公约数
【1】处:
该函数使用辗转相除法求最大公约数,在进行辗转相除之前,需要保证num1是较大的数,num2是较小的数。如果num1小于num2,就需要交换它们的值。所以此处应填<。
【2】处:
辗转相除法的核心是用较大数除以较小数,再用出现的余数(第一余数)去除除数,再用出现的余数(第二余数)去除第一余数,如此反复,直到最后余数是 0 为止。此时的除数就是两个数的最大公约数。在循环中,当余数不为 0 时,就继续进行辗转相除操作,所以循环条件应该是b != 0。
辗转相除法求最大公约数!