第7章 第9、10节:函数应用实例(练习)-《C语言程序设计》(电子工业出版社)上好课

2026-04-30
| 2份
| 37页
| 39人阅读
| 0人下载

内容正文:

7.9与7.10节:函数应用实例 一、单项选择题 1.关于C语言函数,以下叙述正确的是( ) A. 函数必须返回一个值,否则无法通过编译 B. 函数可以嵌套定义,即在一个函数内部定义另一个函数 C. 函数的实参和形参占用相同的内存单元 D. 函数可以没有参数,也可以没有返回值 【答案】D 【解析】C语言中函数可以没有参数(void)和没有返回值(void返回类型)。A错误,void函数不返回值;B错误,C不支持函数嵌套定义;C错误,实参和形参占用不同内存单元。 2.以下程序的输出结果是( ) #include <stdio.h> int func(int a, int b) { static int count = 0; count++; return a + b + count;} main() { printf("%d,", func(1, 2)); printf("%d", func(1, 2));} A. 4,4 B. 4,5 C. 4,6 D. 3,4 【答案】B 【解析】static局部变量只初始化一次,func第一次调用时count=1,返回1+2+1=4;第二次调用count=2,返回1+2+2=5。 3.静态局部变量static int a的核心特性是( ) A. 函数调用结束后,变量 a 的内存会立即释放 B. 变量 a 的初始化仅执行一次,值会跨函数调用保留 C. 变量 a 可以被程序中所有的函数直接访问和修改 D. 变量 a 的作用域等同于全局变量,无范围限制 【答案】B 【解析】静态局部变量初始化仅 1 次,生命周期贯穿程序全程,作用域仅限定义它的函数内。 4.全局变量与局部变量同名时,函数内的访问规则是( ) A. 优先访问全局变量,局部变量会被自动屏蔽 B. 优先访问局部变量,全局变量会被临时隐藏 C. 程序会报错,不允许同名变量同时存在 D. 随机访问全局变量或局部变量,结果不确定 【答案】B 【解析】作用域就近原则,函数内同名局部变量优先级高于全局变量。 5.关于函数声明(函数原型),下列说法正确的是( ) A. 函数声明必须写在主函数之后,不能写在开头 B. 函数声明的作用是告诉编译器函数的名称、参数和返回值 C. 所有自定义函数都必须写声明,否则无法编译 D. 函数声明的参数名必须和函数定义的参数名完全一致 【答案】B 【解析】函数声明用于提前告知编译器函数信息,参数名可省略;函数定义在主函数前时,可省略声明。 6.C 语言函数调用中,实参向形参传递数据的方式是( ) A. 地址传递,形参会直接修改实参的原始值 B. 值传递,形参是实参的副本,修改不影响实参 C. 引用传递,形参和实参共用同一块内存空间 D. 随机传递,传递方式由数据类型自动决定 【答案】B 【解析】C 语言默认值传递,形参是实参的拷贝,修改形参不会改变实参。 7.下列关于函数嵌套调用的说法,正确的是( ) A. C 语言不允许任何形式的函数嵌套调用 B. 函数可以嵌套调用,也可以嵌套定义 C. 函数可以嵌套调用,但不能嵌套定义 D. 嵌套调用的层数最多为 2 层,超过会报错 【答案】C 【解析】C 语言支持函数嵌套调用(A 调 B,B 调 C),但严格禁止函数嵌套定义。 8.若有函数定义 int func(int x) { static int y = 0; y += x; return y; },连续执行 func(1); func(2); func(3); 后,最后一次调用的返回值是( ) A. 3 B. 6 C. 1 D. 0 【答案】B 【解析】static 修饰的局部变量 y 在函数调用结束后不会销毁,而是保留其值。第一次调用 y 变为 1;第二次 y 变为 1+2=3;第三次 y 变为 3+3=6。 9.若有如下代码,则程序输出的结果是( ) int fun(int a, int b) { return a > b ? a : b; } main() { int x = 5, y = 10; printf("%d", fun(x++, y));} A. 5 B. 6 C. 10 D. 11 【答案】C 【解析】 函数参数求值时,x++ 是后置自增,表达式的值是 5,然后 x 变为 6。函数调用 fun(5, 10),返回较大值 10。 10.设函数原型为 void f(int a, int b[]);,若定义 int x[10], y;,则下列函数调用正确的是( ) A. f(x, y); B. f(y, x); C. f(y, x[0]); D. f(x[0], y); 【答案】B 【解析】 形参 a 是 int,对应实参 y;形参 b[] 接受数组名,对应实参 x。 二、填空题。 1.阅读下列代码,输出结果是___________。 int k = 5; void p() { int k = 10; printf("%d ", k); } main() { p(); printf("%d", k);} 【答案】10 5 【解析】函数 p 内部定义了局部变量 k,遮蔽了全局变量 k,所以 p() 输出 10。main 中访问的是全局变量 k,输出 5。 2.若函数定义如下,该函数的功能是计算___________。 int test(int n) { if (n <= 1) return 1; else return n * test(n - 1);} 【答案】n的阶乘 【解析】典型的阶乘递归逻辑: n!=n×(n−1)! 。 3.以下程序运行后的输出结果是___________。 #include <stdio.h> void swap(int x, int y) { int temp = x; x = y; y = temp;} main() { int a = 5, b = 10; swap(a, b); printf("a=%d,b=%d", a, b);} 【答案】a=5,b=10 【解析】参数传递是值传递,swap函数交换的是形参x和y的值,不影响实参a和b的值。 4.以下函数的返回值类型是___________。 fun(float x) { double y = 2.5; return (int)(x + y);} 【答案】int 【解析】C语言中,如果函数没有显式声明返回类型,默认返回int类型。函数内返回的是(int)(x+y),是int类型。 5.以下程序运行后的输出结果是___________。 #include <stdio.h> int f(int n) { if (n <= 1) return 1; return n * f(n - 1);} main() { printf("%d", f(5));} 【答案】120 【解析】递归计算阶乘,f(5)=5×4×3×2×1=120。 6.以下程序的输出结果是___________。 #include <stdio.h> int a = 1; void test() { int a = 2; a += 1;} main() { test(); printf("%d", a);} 【答案】1 【解析】test函数中的a是局部变量,修改的是局部变量,不影响全局变量a的值。 7.以下程序的输出结果是___________。 #include <stdio.h> int func(int n) { if (n == 0) return 0; if (n == 1) return 1; return func(n - 1) + func(n - 2);} main() { printf("%d", func(6));} 【答案】8 【解析】递归计算斐波那契数列,func(6)=func(5)+func(4)=5+3=8。 8.函数值传递中,修改形参的值______(填会 / 不会)影响实参的原始值。 【答案】不会 【解析】形参是实参的副本,二者内存空间独立,修改互不干扰。 9.以下程序的输出结果是___________。 #include <stdio.h> int f(int x) { return x * x;} int g(int x) { return x + f(x);} main() { printf("%d", g(3));} 【答案】12 【解析】g(3)=3+f(3)=3+3×3=3+9=12。 10.若有 int f(int x) { return x + 1; },则表达式 f(f(1)) 的值是___________。 【答案】3 【解析】先计算内部 f(1) 返回 2,再计算 f(2) 返回 3。 三、阅读程序题。 1.写出下列程序段的输出结果:________________。 #include <stdio.h> void p(int x) { static int s = 0; s += x; printf("%d,", s);} main() { p(1); p(2); p(3);} 【答案】1,3,6, 2.写出下列程序段的输出结果:________________。 #include <stdio.h> int func(int a, int b) { return a > b ? a : b;} main() { int m = 3, n = 5, p = 2; printf("%d", func(func(m, n), p));} 【答案】5 3.写出下列程序段的输出结果:________________。 #include <stdio.h> int f(int n) { if (n == 0) return 0; return n % 10 + f(n / 10);} main() { printf("%d", f(1234));} 【答案】10 4.写出下列程序段的输出结果:________________。 #include <stdio.h> int f(int a, int b) { if (b == 0) return 1; if (b % 2 == 0) { int t = f(a, b / 2); return t * t; } else { return a * f(a, b - 1); } } main() { printf("%d", f(2, 5));} 【答案】32 5.写出下列程序段的输出结果:________________。 #include <stdio.h> int f(int a) { auto int b = 0; static int c = 3; b = b + 1; c = c + 1; return a + b + c; } main() { int a = 2, i; for (i = 0; i < 3; i++) printf("%d ", f(a)); } 【答案】7 8 9 6.写出下列程序段的输出结果:________________。 #include <stdio.h> void mystery(int arr[], int n) { int i, j, temp; for (i = 0; i < n - 1; i++) { for (j = 0; j < n - 1 - i; j++) { if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } main() { int data[] = {64, 34, 25, 12, 22, 11, 90}; int i; mystery(data, 7); for (i = 0; i < 7; i++) { printf("%d ", data[i]); } } 【答案】11 12 22 25 34 64 90 7.写出下列程序段的输出结果:________________。 #include <stdio.h> int sumDiagonal(int matrix[][3], int n) { int i, sum = 0; for (i = 0; i < n; i++) { sum += matrix[i][i]; if (i != n - 1 - i) { sum += matrix[i][n - 1 - i]; } } return sum; } main() { int mat[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; printf("%d", sumDiagonal(mat, 3)); } 【答案】25 8.写出下列程序段的输出结果:________________。 #include <stdio.h> int check(int x) { int count = 0; while (x > 0) { if (x % 2 == 1) count++; x = x / 2; } return count; } main() { int num = 13; printf("%d", check(num));} 【答案】3 9.写出下列程序段的输出结果:________________。 #include <stdio.h> int count_factors(int n) { int i, count = 0; for (i = 1; i <= n; i++) { if (n % i == 0) count++; } return count; } main() { int i; for (i = 1; i <= 5; i++) { if (count_factors(i) == 2) { printf("%d ", i); } } } 【答案】2 3 5 10.写出下列程序段的输出结果:________________。 #include <stdio.h> int is_palindrome(int arr[], int len) { int i; for (i = 0; i < len / 2; i++) { if (arr[i] != arr[len - 1 - i]) { return 0; } } return 1; } main() { int a1[] = {1, 2, 3, 2, 1}; int a2[] = {1, 2, 2, 1}; printf("%d %d", is_palindrome(a1, 5), is_palindrome(a2, 4));} 【答案】1 1 四、程序填空题(根据题意,将空缺的语句补上) 1.下列程序的功能是使用递归实现杨辉三角的输出。 #include <stdio.h> int yanghui(int i, int j) { if (_________①________) { return 1; } return ___________②__________; } main() { int n, r, c; scanf("%d", &n); for (r = 0; r <= n; r++) { for (c = 0; c <= r; c++) { printf("%d ", yanghui(r, c)); } printf(" "); } } 【答案】①j == 0 || i == j ②yanghui(i - 1, j - 1) + yanghui(i - 1, j) 2.程序功能:二分查找算法。 #include <stdio.h> int binarySearch(int arr[], int left, int right, int key) { if (_______①_______) { return -1; } int mid = ________②_______; if (arr[mid] == key) { return mid; } else if (arr[mid] > key) { return binarySearch(arr, left, mid - 1, key); } else { return ___________③___________; } } main() { int arr[] = {1, 3, 5, 7, 9}; printf("%d", binarySearch(arr, 0, 4, 5));} 【答案】①left > right ②(left + right) / 2 ③binarySearch(arr, mid + 1, right, key) 3.下列程序的功能是使用递归解决汉诺塔问题。 #include <stdio.h> void hanoi(int n, char from, char to, char aux) { if (_______①______) { printf("Move disk 1 from %c to %c ", from, to); return; } hanoi(_______②_________); printf("Move disk %d from %c to %c ", n, from, to); hanoi(_______③_________); } main() { hanoi(3, 'A', 'C', 'B');} 【答案】①n == 1 ②n - 1, from, aux, to ③n - 1, aux, to, from 4.下列程序的功能是实现数组逆序存放。 #include <stdio.h> void reverseArray(int arr[], int start, int end) { if (________①_______) { return; } int temp = arr[start]; arr[start] = arr[end]; arr[end] = temp; _________②___________; } main() { int arr[] = {1, 2, 3, 4, 5}; reverseArray(arr, 0, 4); for (int i = 0; i < 5; i++) { printf("%d ", arr[i]); } } 【答案】①start >= end ②reverseArray(arr, start + 1, end - 1) 5.编写函数将数字 1 到 n2 按顺时针螺旋填入二维数组中。请补全控制方向和边界的逻辑。 #include <stdio.h> void spiralFill(int matrix[][10], int n) { int num = 1; int top = 0, bottom = n - 1, left = 0, right = n - 1; while (top <= bottom && left <= right) { // 从左到右填充上边 for (int i = left; i <= right; i++) { matrix[top][i] = num++; } top++; // 上边界下移 // 从上到下填充右边 for (int i = top; i <= bottom; i++) { matrix[i][right] = num++; } right--; // 右边界左移 // 从右到左填充下边 if (top <= bottom) { // 防止单行重复 for (int i = right; i >= left; i--) { matrix[bottom][i] = num++; } _____①_____; // 下边界上移 } // 从下到上填充左边 if (left <= right) { // 防止单列重复 for (int i = bottom; i >= top; i--) { matrix[i][left] = num++; } _____②_____; // 左边界右移 } } } main() { int mat[10][10]; spiralFill(mat, 3); printf("%d", mat[1][1]); // 输出中心值 } 【答案】①bottom-- ②left++ 五、编程题。 1. 编写函数 void reverse_str(char str[]),将字符串的内容逆序存放(例如 "abc" 变为 "cba")。 【参考代码】 #include <stdio.h> #include <string.h> void reverse_str(char str[]) { int len = strlen(str); for(int i = 0; i < len / 2; i++) { char temp = str[i]; str[i] = str[len - 1 - i]; str[len - 1 - i] = temp; } } main() { char s[] = "hello"; reverse_str(s); printf("%s ", s); } 2. 编写函数 void transpose(int a[][3], int n),将一个 3x3 的矩阵转置(行列互换)。 【参考代码】 #include <stdio.h> void transpose(int a[][3], int n) { for(int i = 0; i < n; i++) { for(int j = i + 1; j < n; j++) { int temp = a[i][j]; a[i][j] = a[j][i]; a[j][i] = temp; } } } main() { int m[3][3] = {{1,2,3},{4,5,6},{7,8,9}}; transpose(m, 3); for(int i = 0; i < 3; i++) { for(int j = 0; j < 3; j++) printf("%d ", m[i][j]); printf(" "); } } 3.编写函数 int count_words(char str[]),统计字符串中的单词个数,单词之间用空格分隔。 【参考代码】 #include <stdio.h> int count_words(char str[]) { int count = 0, in_word = 0; for(int i = 0; str[i] != '\0'; i++) { if(str[i] != ' ') { if(in_word == 0) { count++; in_word = 1; } } else { in_word = 0; } } return count; } main() { char s[] = "Hello world this is C"; printf("%d ", count_words(s)); } 4.编写函数 void goldbach(int n),将偶数 n 分解为两个素数之和(只需输出一组解)。编写函数 is_prime 判断素数。 【参考代码】 #include <stdio.h> int is_prime(int n) { if(n < 2) return 0; for(int i = 2; i * i <= n; i++) if(n % i == 0) return 0; return 1; } void goldbach(int n) { for(int i = 2; i <= n/2; i++) { if(is_prime(i) && is_prime(n - i)) { printf("%d=%d+%d ", n, i, n-i); return; } } } main() { int n; scanf("%d", &n); goldbach(n); } 5.编写一个递归函数quickSort,对整型数组进行升序排序。要求: 函数原型:void quickSort(int arr[], int low, int high) 使用“三数取中”或“首元素”作为基准值(pivot) 必须原地排序(in-place),不使用额外的大数组 当low >= high时递归终止 输入:数组{64, 34, 25, 12, 22, 11, 90} 输出:11 12 22 25 34 64 90 【参考代码】 #include <stdio.h> int partition(int arr[], int low, int high) { int pivot = arr[high]; int i = low - 1; for (int j = low; j < high; j++) { if (arr[j] <= pivot) { i++; int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } int temp = arr[i + 1]; arr[i + 1] = arr[high]; arr[high] = temp; return i + 1; } void quickSort(int arr[], int low, int high) { if (low < high) { int pi = partition(arr, low, high); quickSort(arr, low, pi - 1); quickSort(arr, pi + 1, high); } } main() { int arr[] = {64, 34, 25, 12, 22, 11, 90}; int n = sizeof(arr) / sizeof(arr[0]); quickSort(arr, 0, n - 1); for (int i = 0; i < n; i++) { printf("%d ", arr[i]); } } 原创精品资源学科网独家享有版权,侵权必究! 学科网(北京)股份有限公司 $ 7.9与7.10节:函数应用实例 一、单项选择题 1.关于C语言函数,以下叙述正确的是( ) A. 函数必须返回一个值,否则无法通过编译 B. 函数可以嵌套定义,即在一个函数内部定义另一个函数 C. 函数的实参和形参占用相同的内存单元 D. 函数可以没有参数,也可以没有返回值 2.以下程序的输出结果是() #include <stdio.h> int func(int a, int b) { static int count = 0; count++; return a + b + count;} main() { printf("%d,", func(1, 2)); printf("%d", func(1, 2));} A. 4,4 B. 4,5 C. 4,6 D. 3,4 3.静态局部变量static int a的核心特性是() A. 函数调用结束后,变量 a 的内存会立即释放 B. 变量 a 的初始化仅执行一次,值会跨函数调用保留 C. 变量 a 可以被程序中所有的函数直接访问和修改 D. 变量 a 的作用域等同于全局变量,无范围限制 4.全局变量与局部变量同名时,函数内的访问规则是() A. 优先访问全局变量,局部变量会被自动屏蔽 B. 优先访问局部变量,全局变量会被临时隐藏 C. 程序会报错,不允许同名变量同时存在 D. 随机访问全局变量或局部变量,结果不确定 5.关于函数声明(函数原型),下列说法正确的是() A. 函数声明必须写在主函数之后,不能写在开头 B. 函数声明的作用是告诉编译器函数的名称、参数和返回值 C. 所有自定义函数都必须写声明,否则无法编译 D. 函数声明的参数名必须和函数定义的参数名完全一致 6.C 语言函数调用中,实参向形参传递数据的方式是() A. 地址传递,形参会直接修改实参的原始值 B. 值传递,形参是实参的副本,修改不影响实参 C. 引用传递,形参和实参共用同一块内存空间 D. 随机传递,传递方式由数据类型自动决定 7.下列关于函数嵌套调用的说法,正确的是() A. C 语言不允许任何形式的函数嵌套调用 B. 函数可以嵌套调用,也可以嵌套定义 C. 函数可以嵌套调用,但不能嵌套定义 D. 嵌套调用的层数最多为 2 层,超过会报错 8.若有函数定义 int func(int x) { static int y = 0; y += x; return y; },连续执行 func(1); func(2); func(3); 后,最后一次调用的返回值是() A. 3 B. 6 C. 1 D. 0 9.若有如下代码,则程序输出的结果是() int fun(int a, int b) { return a > b ? a : b; } main() { int x = 5, y = 10; printf("%d", fun(x++, y));} A. 5 B. 6 C. 10 D. 11 10.设函数原型为 void f(int a, int b[]);,若定义 int x[10], y;,则下列函数调用正确的是() A. f(x, y); B. f(y, x); C. f(y, x[0]); D. f(x[0], y); 二、填空题。 1.阅读下列代码,输出结果是___________。 int k = 5; void p() { int k = 10; printf("%d ", k); } main() { p(); printf("%d", k);} 2.若函数定义如下,该函数的功能是计算___________。 int test(int n) { if (n <= 1) return 1; else return n * test(n - 1);} 3.以下程序运行后的输出结果是___________。 #include <stdio.h> void swap(int x, int y) { int temp = x; x = y; y = temp;} main() { int a = 5, b = 10; swap(a, b); printf("a=%d,b=%d", a, b);} 4.以下函数的返回值类型是___________。 fun(float x) { double y = 2.5; return (int)(x + y);} 5.以下程序运行后的输出结果是___________。 #include <stdio.h> int f(int n) { if (n <= 1) return 1; return n * f(n - 1);} main() { printf("%d", f(5));} 6.以下程序的输出结果是___________。 #include <stdio.h> int a = 1; void test() { int a = 2; a += 1;} main() { test(); printf("%d", a);} 7.以下程序的输出结果是___________。 #include <stdio.h> int func(int n) { if (n == 0) return 0; if (n == 1) return 1; return func(n - 1) + func(n - 2);} main() { printf("%d", func(6));} 8.函数值传递中,修改形参的值______(填会 / 不会)影响实参的原始值。 9.以下程序的输出结果是___________。 #include <stdio.h> int f(int x) { return x * x;} int g(int x) { return x + f(x);} main() { printf("%d", g(3));} 10.若有 int f(int x) { return x + 1; },则表达式 f(f(1)) 的值是___________。 三、阅读程序题。 1.写出下列程序段的输出结果:________________。 #include <stdio.h> void p(int x) { static int s = 0; s += x; printf("%d,", s);} main() { p(1); p(2); p(3);} 2.写出下列程序段的输出结果:________________。 #include <stdio.h> int func(int a, int b) { return a > b ? a : b;} main() { int m = 3, n = 5, p = 2; printf("%d", func(func(m, n), p));} 3.写出下列程序段的输出结果:________________。 #include <stdio.h> int f(int n) { if (n == 0) return 0; return n % 10 + f(n / 10);} main() { printf("%d", f(1234));} 4.写出下列程序段的输出结果:________________。 #include <stdio.h> int f(int a, int b) { if (b == 0) return 1; if (b % 2 == 0) { int t = f(a, b / 2); return t * t; } else { return a * f(a, b - 1); } } main() { printf("%d", f(2, 5));} 5.写出下列程序段的输出结果:________________。 #include <stdio.h> int f(int a) { auto int b = 0; static int c = 3; b = b + 1; c = c + 1; return a + b + c; } main() { int a = 2, i; for (i = 0; i < 3; i++) printf("%d ", f(a)); } 6.写出下列程序段的输出结果:________________。 #include <stdio.h> void mystery(int arr[], int n) { int i, j, temp; for (i = 0; i < n - 1; i++) { for (j = 0; j < n - 1 - i; j++) { if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } } main() { int data[] = {64, 34, 25, 12, 22, 11, 90}; int i; mystery(data, 7); for (i = 0; i < 7; i++) { printf("%d ", data[i]); } } 7.写出下列程序段的输出结果:________________。 #include <stdio.h> int sumDiagonal(int matrix[][3], int n) { int i, sum = 0; for (i = 0; i < n; i++) { sum += matrix[i][i]; if (i != n - 1 - i) { sum += matrix[i][n - 1 - i]; } } return sum; } main() { int mat[3][3] = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; printf("%d", sumDiagonal(mat, 3)); } 8.写出下列程序段的输出结果:________________。 #include <stdio.h> int check(int x) { int count = 0; while (x > 0) { if (x % 2 == 1) count++; x = x / 2; } return count; } main() { int num = 13; printf("%d", check(num));} 9.写出下列程序段的输出结果:________________。 #include <stdio.h> int count_factors(int n) { int i, count = 0; for (i = 1; i <= n; i++) { if (n % i == 0) count++; } return count; } main() { int i; for (i = 1; i <= 5; i++) { if (count_factors(i) == 2) { printf("%d ", i); } } } 10.写出下列程序段的输出结果:________________。 #include <stdio.h> int is_palindrome(int arr[], int len) { int i; for (i = 0; i < len / 2; i++) { if (arr[i] != arr[len - 1 - i]) { return 0; } } return 1; } main() { int a1[] = {1, 2, 3, 2, 1}; int a2[] = {1, 2, 2, 1}; printf("%d %d", is_palindrome(a1, 5), is_palindrome(a2, 4));} 四、程序填空题(根据题意,将空缺的语句补上) 1.下列程序的功能是使用递归实现杨辉三角的输出。 #include <stdio.h> int yanghui(int i, int j) { if (_________①________) { return 1; } return ___________②__________; } main() { int n, r, c; scanf("%d", &n); for (r = 0; r <= n; r++) { for (c = 0; c <= r; c++) { printf("%d ", yanghui(r, c)); } printf(" "); } } 2.程序功能:二分查找算法。 #include <stdio.h> int binarySearch(int arr[], int left, int right, int key) { if (_______①_______) { return -1; } int mid = ________②_______; if (arr[mid] == key) { return mid; } else if (arr[mid] > key) { return binarySearch(arr, left, mid - 1, key); } else { return ___________③___________; } } main() { int arr[] = {1, 3, 5, 7, 9}; printf("%d", binarySearch(arr, 0, 4, 5));} 3.下列程序的功能是使用递归解决汉诺塔问题。 #include <stdio.h> void hanoi(int n, char from, char to, char aux) { if (_______①______) { printf("Move disk 1 from %c to %c ", from, to); return; } hanoi(_______②_________); printf("Move disk %d from %c to %c ", n, from, to); hanoi(_______③_________); } main() { hanoi(3, 'A', 'C', 'B');} 4.下列程序的功能是实现数组逆序存放。 #include <stdio.h> void reverseArray(int arr[], int start, int end) { if (________①_______) { return; } int temp = arr[start]; arr[start] = arr[end]; arr[end] = temp; _________②___________; } main() { int arr[] = {1, 2, 3, 4, 5}; reverseArray(arr, 0, 4); for (int i = 0; i < 5; i++) { printf("%d ", arr[i]); } } 5.编写函数将数字 1 到 n2 按顺时针螺旋填入二维数组中。请补全控制方向和边界的逻辑。 #include <stdio.h> int i; void spiralFill(int matrix[][10], int n) { int num = 1; int top = 0, bottom = n - 1, left = 0, right = n - 1; while (top <= bottom && left <= right) { // 从左到右填充上边 for (i = left; i <= right; i++) { matrix[top][i] = num++; } top++; // 上边界下移 // 从上到下填充右边 for (i = top; i <= bottom; i++) { matrix[i][right] = num++; } right--; // 右边界左移 // 从右到左填充下边 if (top <= bottom) { // 防止单行重复 for (i = right; i >= left; i--) { matrix[bottom][i] = num++; } _____①_____; // 下边界上移 } // 从下到上填充左边 if (left <= right) { // 防止单列重复 for (i = bottom; i >= top; i--) { matrix[i][left] = num++; } _____②_____; // 左边界右移 } } } main() { int mat[10][10]; spiralFill(mat, 3); printf("%d", mat[1][1]); // 输出中心值 } 五、编程题。 1. 编写函数 void reverse_str(char str[]),将字符串的内容逆序存放(例如 "abc" 变为 "cba")。 2. 编写函数 void transpose(int a[][3], int n),将一个 3x3 的矩阵转置(行列互换)。 3.编写函数 int count_words(char str[]),统计字符串中的单词个数,单词之间用空格分隔。 4.编写函数 void goldbach(int n),将偶数 n 分解为两个素数之和(只需输出一组解)。编写函数 is_prime 判断素数。 5.编写一个递归函数quickSort,对整型数组进行升序排序。要求: 函数原型:void quickSort(int arr[], int low, int high) 使用“三数取中”或“首元素”作为基准值(pivot) 必须原地排序(in-place),不使用额外的大数组 当low >= high时递归终止 输入:数组{64, 34, 25, 12, 22, 11, 90} 输出:11 12 22 25 34 64 90 原创精品资源学科网独家享有版权,侵权必究! 学科网(北京)股份有限公司 $

资源预览图

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