第7章 第4、5节:函数的返回值及其调用时的参数传递(练习)-《C语言程序设计》(电子工业出版社)上好课

2026-04-30
| 2份
| 26页
| 38人阅读
| 0人下载

内容正文:

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]); } 原创精品资源学科网独家享有版权,侵权必究! 学科网(北京)股份有限公司 $

资源预览图

第7章 第4、5节:函数的返回值及其调用时的参数传递(练习)-《C语言程序设计》(电子工业出版社)上好课
1
第7章 第4、5节:函数的返回值及其调用时的参数传递(练习)-《C语言程序设计》(电子工业出版社)上好课
2
第7章 第4、5节:函数的返回值及其调用时的参数传递(练习)-《C语言程序设计》(电子工业出版社)上好课
3
所属专辑
由于学科网是一个信息分享及获取的平台,不确保部分用户上传资料的 来源及知识产权归属。如您发现相关资料侵犯您的合法权益,请联系学科网,我们核实后将及时进行处理。