内容正文:
7.4与7.5节:函数的返回值及其调用时的参数传递
一、单项选择题
1.在函数调用中,若实参是普通变量,形参也是普通变量,则参数传递的方式是( )
A. 地址传递,形参值改变会影响实参 B. 值传递,形参值改变可能会影响实参
C. 地址传递,形参值改变不会影响实参 D. 值传递,形参值改变不会影响实参
2.下列关于函数返回值的说法中,正确的是()
A. 函数可以没有返回值,但不能有多个return语句
B. 函数必须有返回值,否则程序无法编译
C. 函数的返回值通过return语句返回,每次调用只能执行一个return
D. 函数中可以写多个return语句,每次调用可执行多个
3.若函数定义为 void print(),则在主函数中调用 x = print(); 的结果是()
A. 编译错误 B. 运行时错误
C. x 被赋值为0 D. x 被赋值为随机值
4.下列程序段的输出是()
#include <stdio.h>
int func(int x) {
return x * 2;}
int main() {
int a = 5;
printf("%d", func(a));}
A. 5 B. 10 C. 0 D. 编译错误
5.以下关于值传递的说法,正确的是()
A. 形参改变会影响实参 B. 实参和形参共用同一内存单元
C. 值传递是单向的,实参传给形参 D. 值传递可以返回多个值
6.数组名作为函数参数时,传递的是()
A. 数组第一个元素的值 B. 数组的长度
C. 数组首地址 D. 整个数组的副本
7.数组作为参数传递时,函数内修改数组元素()
A. 不会影响原数组 B. 会影响原数组
C. 编译错误 D. 运行时错误
8.以下程序输出是()
#include <stdio.h>
void swap(int a, int b) {
int t = a; a = b; b = t;}
main() {
int x = 1, y = 2;
swap(x, y);
printf("%d %d", x, y);}
A. 1 2 B. 2 1 C. 0 0 D. 随机值
9.以下函数调用语句中,实参的个数是()
fun(exp1, exp2+exp3, (exp4, exp5));
A. 2 B. 3 C. 4 D. 5
10.以下关于函数形参的描述,正确的是()
A. 形参只在函数被调用时才会分配内存
B. 形参是全局变量,在整个程序运行期间都有效
C. 形参的生存期与主调函数中实参的生存期相同
D. 定义函数时必须指明形参的类型,但形参名可省略
二、填空题。
1.函数定义为void print_arr(int arr[], int n),主函数中定义int a[3]={1,2,3};,则调用方式应书写为___________。
2.return语句的两种一般形式为return 表达式;和___________。
3.不返回函数值的函数应定义为______类型,其类型标识符为______。
4.void类型函数调用时,______(能 / 不能)将函数调用赋值给变量。
5.有函数int add(int a, int b) { return a+b; },主函数中int x=2,y=3; int c=add(x,y);,则c的值为___________。
6.函数float avg(float x, float y) { return (x+y)/2; },调用时avg(3,5)的返回值类型会自动转换为______类型,值为______。
7.有函数int fun(int a[], int n) { return a[0]+a[n-1]; },主函数中int b[3]={1,2,3};,调用fun(b,3)的返回值为___________。
8.函数void show(int x) { x = x*2; },主函数中int a=3; show(a);,则a的值为___________。
9.若函数定义为double func(int x, int y),而函数体中仅有语句return x/y;,当以func(5, 2)调用时,返回值是______(填数字)。
10.在函数定义int max(int a, int b)中,a和b被称为______参数。
三、阅读程序题。
1.写出下列程序段的输出结果:________________。
#include <stdio.h>
void proc(int arr[]) {
arr[1] = 99;
}
main() {
int list[3] = {1, 2, 3};
proc(list);
printf("%d", list[1]);
}
2.写出下列程序段的输出结果:________________。
#include <stdio.h>
int find(int x[], int n) {
x[0] = n * 10;
return x[0];
}
main() {
int a[2] = {1, 2};
int r = find(a, 3);
printf(“%d %d”, a[0], r);
}
3.写出下列程序段的输出结果:________________。
#include <stdio.h>
void setToZero(int list[], int len) {
int i;
for(i=0; i<len; i++)
list[i] = 0;
}
main() {
int data[3] = {5,6,7};
setToZero(data, 3);
printf("%d %d %d", data[0], data[1], data[2]);
}
4.写出下列程序段的输出结果:________________。
#include <stdio.h>
void printArr(int a[], int size) {
int i;
for(i=0; i<size; i++)
printf(“%d “, a[i]);
}
main() {
int arr[4] = {8,1,3,9};
printArr(arr, 4);
}
5.写出下列程序段的输出结果:________________。
#include <stdio.h>
float avg(float a[], int n) {
float s=0;
for(int i=0; i<n; i++) s+=a[i];
return s/n;
}
main() {
float b[3]={10,20,30};
printf("%.1f", avg(b,3));
}
6.写出下列程序段的输出结果:________________。
#include <stdio.h>
void modify(int arr[], int n) {
for(int i=0; i<n; i++) arr[i] *= 2;
}
main() {
int a[3]={1,2,3};
modify(a,3);
printf("%d", a[1]);
}
7.写出下列程序段的输出结果:________________。
#include <stdio.h>
float calc(float a[], int n) {
float max=a[0];
for(int i=1; i<n; i++) if(a[i]>max) max=a[i];
return max;
}
main() {
float b[4]={1.5, 3.2, 2.8, 4.1};
printf("%.1f", calc(b,4));
}
8.写出下列程序段的输出结果:________________。
#include "stdio.h"
void change(int a[], int n) {
int i;
for(i=0; i<n; i++) {
if(a[i] % 2 == 0)
a[i] = 0;
}
}
main() {
int b[4] = {1,2,3,4};
change(b, 4);
printf("%d %d %d %d
", b[0], b[1], b[2], b[3]);
}
9.写出下列程序段的输出结果:________________。
#include <stdio.h>
void process(int arr[], int n) {
for(int i=0; i<n; i++) arr[i] += 10;
}
main() {
int data[3] = {5, 15, 25};
process(data, 3);
printf("%d", data[2]);
}
10.写出下列程序段的输出结果:________________。
#include <stdio.h>
void process(int a, int b[], int n) {
int i;
a = a + 10;
for (i = 0; i < n; i++) {
b[i] = b[i] + a;
a++;
}
}
main() {
int x = 5;
int arr[3] = {1, 2, 3};
process(x, arr, 3);
printf("%d,%d,%d,%d
", x, arr[0], arr[1], arr[2]);
}
四、程序填空题(根据题意,将空缺的语句补上)
1.以下函数将数组 a 中的 n 个元素向左循环移动一位(第一个元素移到最后)。
void shift_left(int a[], int n) {
int temp = a[0];
int i;
for (i = 0; i < ________; i++) {
a[i] = ________;
}
a[n - 1] = temp;
}
2.函数 count_odd 用于统计数组中奇数的个数并返回。
int count_odd(int arr[], int n) {
int count = 0;
int i;
for (i = 0; i < n; i++) {
if (________) {
________;
}
}
return count;
}
3.函数 reverse 将数组中的元素首尾倒置。
void reverse(int a[], int n) {
int i, temp;
for (i = 0; i < ________; i++) {
temp = a[i];
a[i] = a[n - 1 - i];
________ = temp;
}
}
4.函数 is_prime 判断整数 n 是否为素数,是则返回1,否则返回0。
int is_prime(int n) {
int i;
if (n < 2) return 0;
for (i = 2; i * i <= n; i++) {
if (________) {
return 0;
}
}
return 1;
}
5.函数 search 在数组中查找 key,找到返回下标,未找到返回 -1。
int search(int arr[], int n, int key) {
int i;
for (i = 0; i < n; i++) {
if (________) {
return i;
}
}
return ________;
}
五、编程题。
1. 编写函数void reverse(int arr[], int n),将数组元素逆序(如{1,2,3}变{3,2,1})。在main中调用。
2.编写函数int count_even(int arr[], int n),统计数组中偶数个数。
3. 编写函数int find_max_index(int arr[], int n),返回最大值下标。
4.编写一个函数 int remove_duplicates(int arr[], int n)。该函数接收一个已排序的整数数组 arr 和长度 n。函数需原地删除重复出现的元素,使每个元素只出现一次,并返回去重后数组的新长度。
要求: 不要使用额外的数组空间,必须在原数组上修改。
5.编写函数 int delete_val(int a[], int n, int val),删除数组 a 中所有值为 val 的元素,函数返回删除后的新长度。
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$
7.4与7.5节:函数的返回值及其调用时的参数传递
一、单项选择题
1.在函数调用中,若实参是普通变量,形参也是普通变量,则参数传递的方式是( )
A. 地址传递,形参值改变会影响实参 B. 值传递,形参值改变可能会影响实参
C. 地址传递,形参值改变不会影响实参 D. 值传递,形参值改变不会影响实参
【答案】D
【解析】变量作为函数参数是“值传递”,实参和形参占用不同内存单元,形参变化不影响实参。
2.下列关于函数返回值的说法中,正确的是( )
A. 函数可以没有返回值,但不能有多个return语句
B. 函数必须有返回值,否则程序无法编译
C. 函数的返回值通过return语句返回,每次调用只能执行一个return
D. 函数中可以写多个return语句,每次调用可执行多个
【答案】C
【解析】函数可以没有返回值(void类型),也可以有多个return语句,但每次调用只能执行其中一个,因此只能返回一个值。C正确。
3.若函数定义为 void print(),则在主函数中调用 x = print(); 的结果是( )
A. 编译错误 B. 运行时错误
C. x 被赋值为0 D. x 被赋值为随机值
【答案】A
【解析】void 类型函数无返回值,不能用于赋值表达式,编译器会报错。
4.下列程序段的输出是( )
#include <stdio.h>
int func(int x) {
return x * 2;}
int main() {
int a = 5;
printf("%d", func(a));}
A. 5 B. 10 C. 0 D. 编译错误
【答案】B
【解析】func(5) 返回 5*2=10,输出10。
5.以下关于值传递的说法,正确的是( )
A. 形参改变会影响实参 B. 实参和形参共用同一内存单元
C. 值传递是单向的,实参传给形参 D. 值传递可以返回多个值
【答案】C
【解析】值传递是将实参的值复制给形参,形参修改不影响实参,是单向传递。
6.数组名作为函数参数时,传递的是( )
A. 数组第一个元素的值 B. 数组的长度
C. 数组首地址 D. 整个数组的副本
【答案】C
【解析】 数组名表示首元素地址,传递的是地址,属于地址传递。
7.数组作为参数传递时,函数内修改数组元素( )
A. 不会影响原数组 B. 会影响原数组
C. 编译错误 D. 运行时错误
【答案】B
【解析】地址传递,函数内通过地址修改原数组元素。
8.以下程序输出是( )
#include <stdio.h>
void swap(int a, int b) {
int t = a; a = b; b = t;}
main() {
int x = 1, y = 2;
swap(x, y);
printf("%d %d", x, y);}
A. 1 2 B. 2 1 C. 0 0 D. 随机值
【答案】A
【解析】值传递,swap内交换的是形参,不影响实参x,y。
9.以下函数调用语句中,实参的个数是( )
fun(exp1, exp2+exp3, (exp4, exp5));
A. 2 B. 3 C. 4 D. 5
【答案】B
【解析】这是一个函数调用,包含三个实参:exp1、exp2+exp3、(exp4, exp5)(这是一个逗号表达式)。
10.以下关于函数形参的描述,正确的是( )
A. 形参只在函数被调用时才会分配内存
B. 形参是全局变量,在整个程序运行期间都有效
C. 形参的生存期与主调函数中实参的生存期相同
D. 定义函数时必须指明形参的类型,但形参名可省略
【答案】A
【解析】形参是局部变量,调用时分配内存,调用结束释放;定义函数时形参类型必须指定,但形参名在函数原型中可省略,在函数定义时通常需要。
二、填空题。
1.函数定义为void print_arr(int arr[], int n),主函数中定义int a[3]={1,2,3};,则调用方式应书写为___________。
【答案】print_arr(a,3);
【解析】数组名a代表数组首地址,可作为形参数组的实参,同时传递数组长度3。
2.return语句的两种一般形式为return 表达式;和___________。
【答案】return (表达式);
【解析】return语句两种形式,带返回值的“return 表达式”和不带返回值的“return;”。
3.不返回函数值的函数应定义为______类型,其类型标识符为______。
【答案】空(或 void);void
【解析】无返回值的函数定义为void类型,提高可读性并降低出错率。
4.void类型函数调用时,______(能 / 不能)将函数调用赋值给变量。
【答案】不能
【解析】void类型函数无返回值,不能赋值给变量或作为表达式的一部分。
5.有函数int add(int a, int b) { return a+b; },主函数中int x=2,y=3; int c=add(x,y);,则c的值为___________。
【答案】5
【解析】add(2,3)返回2+3=5,赋值给c。
6.函数float avg(float x, float y) { return (x+y)/2; },调用时avg(3,5)的返回值类型会自动转换为______类型,值为______。
【答案】float;4.0
【解析】函数定义类型为float,return表达式(3+5)/2=4自动转换为float类型4.0。
7.有函数int fun(int a[], int n) { return a[0]+a[n-1]; },主函数中int b[3]={1,2,3};,调用fun(b,3)的返回值为___________。
【答案】4
【解析】a[0]=1,a[2]=3,和为4,函数返回4。
8.函数void show(int x) { x = x*2; },主函数中int a=3; show(a);,则a的值为___________。
【答案】3
【解析】值传递中,形参x的变化不影响实参a的值。
9.若函数定义为double func(int x, int y),而函数体中仅有语句return x/y;,当以func(5, 2)调用时,返回值是______(填数字)。
【答案】2.0
【解析】x/y是整数除法得2,但函数返回类型是double,因此转换为2.0。
10.在函数定义int max(int a, int b)中,a和b被称为______参数。
【答案】形(或形式)
【解析】函数定义时括号内的参数是形式参数。
三、阅读程序题。
1.写出下列程序段的输出结果:________________。
#include <stdio.h>
void proc(int arr[]) {
arr[1] = 99;
}
main() {
int list[3] = {1, 2, 3};
proc(list);
printf("%d", list[1]);
}
【答案】99
2.写出下列程序段的输出结果:________________。
#include <stdio.h>
int find(int x[], int n) {
x[0] = n * 10;
return x[0];
}
main() {
int a[2] = {1, 2};
int r = find(a, 3);
printf(“%d %d”, a[0], r);
}
【答案】 30 30
3.写出下列程序段的输出结果:________________。
#include <stdio.h>
void setToZero(int list[], int len) {
int i;
for(i=0; i<len; i++)
list[i] = 0;
}
main() {
int data[3] = {5,6,7};
setToZero(data, 3);
printf("%d %d %d", data[0], data[1], data[2]);
}
【答案】0 0 0
4.写出下列程序段的输出结果:________________。
#include <stdio.h>
void printArr(int a[], int size) {
int i;
for(i=0; i<size; i++)
printf(“%d “, a[i]);
}
main() {
int arr[4] = {8,1,3,9};
printArr(arr, 4);
}
【答案】 8 1 3 9
5.写出下列程序段的输出结果:________________。
#include <stdio.h>
float avg(float a[], int n) {
float s=0;
for(int i=0; i<n; i++) s+=a[i];
return s/n;
}
main() {
float b[3]={10,20,30};
printf("%.1f", avg(b,3));
}
【答案】20.0
6.写出下列程序段的输出结果:________________。
#include <stdio.h>
void modify(int arr[], int n) {
for(int i=0; i<n; i++) arr[i] *= 2;
}
main() {
int a[3]={1,2,3};
modify(a,3);
printf("%d", a[1]);
}
【答案】4
7.写出下列程序段的输出结果:________________。
#include <stdio.h>
float calc(float a[], int n) {
float max=a[0];
for(int i=1; i<n; i++) if(a[i]>max) max=a[i];
return max;
}
main() {
float b[4]={1.5, 3.2, 2.8, 4.1};
printf("%.1f", calc(b,4));
}
【答案】4.1
8.写出下列程序段的输出结果:________________。
#include "stdio.h"
void change(int a[], int n) {
int i;
for(i=0; i<n; i++) {
if(a[i] % 2 == 0)
a[i] = 0;
}
}
main() {
int b[4] = {1,2,3,4};
change(b, 4);
printf("%d %d %d %d
", b[0], b[1], b[2], b[3]);
}
【答案】1 0 3 0
9.写出下列程序段的输出结果:________________。
#include <stdio.h>
void process(int arr[], int n) {
for(int i=0; i<n; i++) arr[i] += 10;
}
main() {
int data[3] = {5, 15, 25};
process(data, 3);
printf("%d", data[2]);
}
【答案】35
10.写出下列程序段的输出结果:________________。
#include <stdio.h>
void process(int a, int b[], int n) {
int i;
a = a + 10;
for (i = 0; i < n; i++) {
b[i] = b[i] + a;
a++;
}
}
main() {
int x = 5;
int arr[3] = {1, 2, 3};
process(x, arr, 3);
printf("%d,%d,%d,%d
", x, arr[0], arr[1], arr[2]);
}
【答案】5,16,18,20
四、程序填空题(根据题意,将空缺的语句补上)
1.以下函数将数组 a 中的 n 个元素向左循环移动一位(第一个元素移到最后)。
void shift_left(int a[], int n) {
int temp = a[0];
int i;
for (i = 0; i < ________; i++) {
a[i] = ________;
}
a[n - 1] = temp;
}
【答案】n - 1 a[i + 1]
2.函数 count_odd 用于统计数组中奇数的个数并返回。
int count_odd(int arr[], int n) {
int count = 0;
int i;
for (i = 0; i < n; i++) {
if (________) {
________;
}
}
return count;
}
【答案】arr[i] % 2 != 0 (或 arr[i] % 2 == 1); count++
3.函数 reverse 将数组中的元素首尾倒置。
void reverse(int a[], int n) {
int i, temp;
for (i = 0; i < ________; i++) {
temp = a[i];
a[i] = a[n - 1 - i];
________ = temp;
}
}
【答案】n / 2 ; a[n - 1 - i]
4.函数 is_prime 判断整数 n 是否为素数,是则返回1,否则返回0。
int is_prime(int n) {
int i;
if (n < 2) return 0;
for (i = 2; i * i <= n; i++) {
if (________) {
return 0;
}
}
return 1;
}
【答案】n % i == 0
5.函数 search 在数组中查找 key,找到返回下标,未找到返回 -1。
int search(int arr[], int n, int key) {
int i;
for (i = 0; i < n; i++) {
if (________) {
return i;
}
}
return ________;
}
【答案】arr[i] == key ; -1
五、编程题。
1. 编写函数void reverse(int arr[], int n),将数组元素逆序(如{1,2,3}变{3,2,1})。在main中调用。
【参考代码】
#include <stdio.h>
void reverse(int arr[], int n) {
for(int i=0; i<n/2; i++) {
int t = arr[i];
arr[i] = arr[n-1-i];
arr[n-1-i] = t;
}
}
main() {
int a[3] = {1,2,3};
reverse(a, 3);
for(int i=0; i<3; i++) printf("%d ", a[i]);
}
2.编写函数int count_even(int arr[], int n),统计数组中偶数个数。
【参考代码】
#include <stdio.h>
int count_even(int arr[], int n) {
int cnt = 0;
for(int i=0; i<n; i++)
if(arr[i] % 2 == 0) cnt++;
return cnt;
}
main() {
int a[5] = {1,2,3,4,5};
printf("%d", count_even(a,5));
}
3. 编写函数int find_max_index(int arr[], int n),返回最大值下标。
【参考代码】
#include <stdio.h>
int find_max_index(int arr[], int n) {
int max_idx = 0;
for(int i=1; i<n; i++)
if(arr[i] > arr[max_idx]) max_idx = i;
return max_idx;
}
main() {
int a[4] = {3,7,2,9};
printf("%d", find_max_index(a,4));
}
4.编写一个函数 int remove_duplicates(int arr[], int n)。该函数接收一个已排序的整数数组 arr 和长度 n。函数需原地删除重复出现的元素,使每个元素只出现一次,并返回去重后数组的新长度。
要求: 不要使用额外的数组空间,必须在原数组上修改。
【参考代码】
#include <stdio.h>
int remove_duplicates(int arr[], int n) {
if (n == 0) return 0;
int k = 0; // 慢指针,指向不重复区域的最后一个位置
int i;
for (i = 1; i < n; i++) { // 快指针
if (arr[i] != arr[k]) {
k++;
arr[k] = arr[i];
}
}
return k + 1; // 新长度
}
main() {
int data[] = {1, 1, 2, 2, 3, 4, 4, 5};
int len = 8;
int new_len = remove_duplicates(data, len);
for(int i=0; i<new_len; i++) printf("%d ", data[i]);
}
5.编写函数 int delete_val(int a[], int n, int val),删除数组 a 中所有值为 val 的元素,函数返回删除后的新长度。
【参考代码】
#include <stdio.h>
int delete_val(int a[], int n, int val) {
int k = 0; // 新数组的下标
for(int i = 0; i < n; i++) {
if(a[i] != val) {
a[k++] = a[i];
}
}
return k;
}
main() {
int arr[] = {1, 2, 3, 2, 4, 2};
int n = 6;
n = delete_val(arr, n, 2);
for(int i = 0; i < n; i++) printf("%d ", arr[i]);
}
原创精品资源学科网独家享有版权,侵权必究!
学科网(北京)股份有限公司
$