《C语言程序设计》期末考试试卷
考试时间: 120分钟 总分: 100分 班级: ____ 学号: ____ 姓名: ____

单项选择题(每题2分,共20分)
-
以下不是C语言合法标识符的是。 A.
_totalB.student_nameC.2nd_valueD.MAX_SIZE -
若有定义
int a = 10, b = 20;,则执行printf("%d", a > b ? a++ : ++b);后,a和b的值分别是。 A.10,21B.11,20C.10,20D.11,21 -
以下关于
switch语句的描述中,错误的是。 A.switch表达式的类型必须是整型或字符型 B.case后面的表达式必须是常量表达式 C.break语句用于跳出switch结构 D.default分支可以放在case分支之前 -
定义一个整型数组
int arr[5];,则该数组最后一个元素的正确引用方式是。 A.arr[5]B.arr[4]C.arr[6]D.arr[-1]
(图片来源网络,侵删) -
在函数调用时,以下传递方式中,函数内部对参数的修改不会影响到主调函数中实参变量的是。 A. 值传递 B. 地址传递 C. 引用传递(C语言中没有真正的引用) D. 指针传递
-
若有定义
char *str = "Hello";,则以下说法正确的是。 A.str是一个字符数组 B.str指向字符串字面量,内容可以被修改 C.str是一个指向字符的指针,它存储了字符串"Hello"的首地址 D.sizeof(str)的结果是6 -
在C语言中,为了向标准输出设备(通常是屏幕)输出数据,应使用的函数是。 A.
scanf()B.printf()C.getchar()D.puts() -
关于
struct(结构体)的描述,正确的是。 A. 结构体定义后,系统会自动为其分配内存空间 B. 结构体成员可以是基本数据类型,也可以是另一个结构体或指针 C. 两个结构体变量可以直接用 进行比较 D. 结构体的大小是其所有成员大小的简单相加
(图片来源网络,侵删) -
在文件操作中,用于以“只读”文本方式打开文件的函数是。 A.
fopen("file.txt", "r")B.fopen("file.txt", "w")C.fopen("file.txt", "a")D.fopen("file.txt", "rb") -
以下关于
malloc函数的描述,正确的是。 A.malloc函数用于释放动态分配的内存 B.malloc函数可以在栈上分配内存 C. 使用malloc分配的内存需要手动使用free释放,否则会造成内存泄漏 D.malloc分配的内存会被自动初始化为0
填空题(每空2分,共20分)
- C语言程序的基本组成单位是__。
- 在C语言中,逻辑与运算符是__,逻辑或运算符是__。
- 定义一个整型指针变量
p的语句是__。 - 若有定义
int a[3][4] = {0};,则a[1][2]的值是__。 - 一个函数由两部分组成:函数首部和__。
- 在循环结构中,
break语句的作用是跳出__循环,continue语句的作用是结束本次循环,进入__循环。 - C语言中没有字符串类型,字符串通常被存储在字符__中,并以一个特殊的字符__作为结束标志。
- 要使用
sqrt()(平方根)等数学函数,需要在程序开头包含头文件__。
读程序写结果(每题5分,共20分)
-
#include <stdio.h> int main() { int i, sum = 0; for (i = 1; i <= 5; i++) { if (i % 2 == 0) continue; sum += i; } printf("sum = %d\n", sum); return 0; }输出结果:
sum = __________ -
#include <stdio.h> int func(int x, int y) { return (x + y) * (x - y); } int main() { int a = 3, b = 4; int result = func(a++, b--); printf("a = %d, b = %d, result = %d\n", a, b, result); return 0; }输出结果:
a = __________, b = __________, result = __________ -
#include <stdio.h> int main() { int arr[] = {10, 20, 30, 40, 50}; int *p = arr; printf("%d, %d\n", *p, *(p + 2)); p++; printf("%d\n", *p); return 0; }输出结果:
__________, ____________________ -
#include <stdio.h> int main() { int i, j; for (i = 1; i <= 4; i++) { for (j = 1; j <= i; j++) { printf("*"); } printf("\n"); } return 0; }输出结果:
__________ __________ __________ __________
程序填空题(每空2分,共20分)
-
题目: 以下程序的功能是计算并输出1到100之间所有能被7整除的整数之和。
#include <stdio.h> int main() { int i, sum = 0; for (i = 1; i <= 100; i++) { if (____________________) { // (1) 填空 sum += i; } } printf("The sum is: %d\n", ____________________); // (2) 填空 return 0; } -
题目: 以下程序的功能是使用指针遍历数组并打印所有元素。
#include <stdio.h> int main() { int arr[] = {2, 4, 6, 8, 10}; int *p; int len = sizeof(arr) / sizeof(arr[0]); for (p = arr; ____________________; ____________________) { // (3) (4) 填空 printf("%d ", *p); } printf("\n"); return 0; } -
题目: 以下程序定义了一个函数
is_prime,用于判断一个整数是否为素数(质数),并在main函数中调用它。#include <stdio.h> #include <stdbool.h> // 使用 bool, true, false 需要此头文件 // (5) 函数声明 _________________________ { if (num <= 1) { return false; } for (int i = 2; i * i <= num; i++) { if (num % i == 0) { return __________________; // (6) 填空 } } return true; } int main() { int num; printf("Enter a number: "); scanf("%d", &num); if (is_prime(num)) { printf("%d is a prime number.\n", num); } else { printf("%d is not a prime number.\n", num); } return 0; }
编程题(共20分)
** 编写一个C语言程序,实现以下功能:
- 从键盘输入一个正整数
n(假设n不超过100)。 - 动态分配一个包含
n个整型元素的数组。 - 从键盘依次输入
n个整数,存入该动态数组中。 - 编写一个函数
find_max_min,该函数接收一个整型数组和数组的大小作为参数,找出数组中的最大值和最小值,并通过指针参数返回给主函数。 - 在主函数中调用
find_max_min函数,并输出数组中的最大值和最小值。 - 程序结束时,释放动态分配的内存。
要求:
- 请写出完整的
main函数和find_max_min函数。 - 注意内存的分配和释放,避免内存泄漏。
#include <stdio.h>
#include <stdlib.h>
// 函数声明
void find_max_min(int arr[], int size, int *max, int *min);
int main() {
int n;
int *arr = NULL;
int max, min;
// 1. 输入正整数 n
printf("Please enter the number of elements (n <= 100): ");
scanf("%d", &n);
// 2. 动态分配数组
if (n > 0 && n <= 100) {
arr = (int *)malloc(n * sizeof(int));
if (arr == NULL) {
printf("Memory allocation failed!\n");
return 1;
}
// 3. 输入n个整数
printf("Please enter %d integers:\n", n);
for (int i = 0; i < n; i++) {
scanf("%d", &arr[i]);
}
// 4. 调用函数查找最大值和最小值
find_max_min(arr, n, &max, &min);
// 5. 输出结果
printf("The maximum value is: %d\n", max);
printf("The minimum value is: %d\n", min);
// 6. 释放内存
free(arr);
arr = NULL; // 好习惯,防止悬空指针
} else {
printf("Invalid input for n!\n");
}
return 0;
}
// 函数定义:查找数组中的最大值和最小值
void find_max_min(int arr[], int size, int *max, int *min) {
if (size <= 0) {
// 处理空数组或无效大小的情况
*max = *min = 0; // 可以设置一个默认值或返回错误
return;
}
// 假设第一个元素是初始的最大值和最小值
*max = arr[0];
*min = arr[0];
for (int i = 1; i < size; i++) {
if (arr[i] > *max) {
*max = arr[i];
}
if (arr[i] < *min) {
*min = arr[i];
}
}
}
参考答案
单项选择题
- C
- A
- D
- B
- A
- C
- B
- B
- A
- C
填空题
- 函数
&&,int *p;- 0
- 函数体
- 当前, 下一次
- 数组,
\0(或'空字符') <math.h>
读程序写结果
sum = 9(1+3+5)a = 4, b = 3, result = -7(先计算 func(3,4) = (3+4)(3-4) = 7(-1) = -7,a++, b--)10, 3020
程序填空题
- (1)
i % 7 == 0或i % 7 == 0(2)sum - (3)
p < arr + len或p <= arr + len - 1(4)p++ - (5)
bool is_prime(int num)(6)false
