一、选择题(每题2分,共20分)
2. C语言中,`char'[] 与 `char *` 的关系是?B. `char'[] 是数组,`char *` 是指针,两者不同C. `char'[] 是指针,`char *` 是数组,两者不同4. 以下关于`switch`语句的描述,错误的是?A. `switch`语句中的表达式必须为整数或字符类型。B. `switch`语句中的`case`标签可以是任何表达式。C. `switch`语句可以使用`break`语句跳出当前分支。D. `switch`语句执行完一个`case`后,会继续执行后面的`case`,除非遇到`break`。5. 若有定义:`int arr[5] = {1, 2, 3, 4, 5};`,则`arr[2]`的值是?A. 指针变量可以作为函数的参数传递,但数组不能。B. 指针变量的值可以改变,但指向的地址不能改变。C. `NULL`指针可以指向任何合法的内存地址。#includeintfunc(int x) { return x * x; }intmain() { int (*p)(int) = func; printf("%d", p(3)); return 0;}
#includeFILE *fp = fopen("test.txt", "r");if (fp == NULL) { perror("Open file error"); // 代码执行到这里会停止吗?}fclose(fp);
A. 代码执行到这里会停止,因为`fopen`失败。C. 如果`test.txt`不存在,程序会崩溃。D. `perror`函数会自动关闭文件指针`fp`。1. C语言中,用于表示逻辑值`假`的关键字是 ________ 。2. 若有定义:`int a = 10;`,则表达式 `!a` 的值是 ________ 。#includeintmain(){ int i = 0; while (i < 5) { printf("%d ", i); i += 2; }return 0;}
#includeintmain(){ char str[] = "Hello"; char *p = str; while (*p) { printf("%c", *p - 32); p++; }return 0;}
5. 若有定义:`int *p = NULL;`,则以下语句的错误数量是 ________ :p = (int *)malloc(sizeof(int)); // 错误26. 以下代码段实现了两个整数的交换,请将缺失的部分补充完整:7. 定义一个结构体`Student`,包含`char name[20]`和`int age`两个成员。以下结构体变量的定义是 ________ 。struct Student stu1 = {"Alice", 20};struct Student stu2;stu2 = stu1;
8. 以下代码定义了一个函数,计算两个数的和,请将缺失的部分补充完整:int add(int x, int y) {
9. 以下代码定义了一个指针数组,请将缺失的部分补充完整:char *names[] = {"Monday", "Tuesday", ________ , "Thursday", "Friday"};10. C语言中,用于打开文件的函数是 ________ ,它需要两个参数:文件名和模式。#includeintmain(){ int i, j; for (i = 1; i <= 3; i++) { for (j = 1; j <= i; j++) { printf("*"); } printf("\n"); }return 0;}
#includeint func(int x) { if (x <= 0) return 0; if (x == 1) return 1; return func(x - 1) + func(x - 2); }int main() { printf("%d %d\n", func(4), func(5)); return 0; }
1. 以下函数`reverseStr`的功能是反转一个字符串(原地反转),请将缺失的部分补充完整:void reverseStr(char *str) { while (str[len] != '\0') len++; // 计算字符串长度 for (int i = 0; i < len / 2; i++) { char temp = ________; // 补充1 str[i] = ________; // 补充2 str[len - i] = temp; // 补充32. 以下函数`findMax`的功能是查找一个整数数组中的最大值,并返回其索引,请将缺失的部分补充完整:int findMax(int arr[], int n) { if (n <= 0) return -1; // 数组为空或长度不合法 for (int i = 1; i < n; i++) { if (arr[i] > arr[maxIndex]) { maxIndex = ________; // 补充11. 编写一个C语言函数`isPrime`,接收一个整数`n`作为参数,判断`n`是否为素数。如果是素数,返回1;如果不是素数,返回0。素数是指只能被1和它本身整除的大于1的自然数。2. 编写一个C语言程序,实现以下功能:从标准输入读取一行文本(假设不超过100个字符),然后统计并输出该行文本中英文字母(大小写敏感)、数字、空格和其他字符的数量。
试卷答案
一、选择题
解析:`char'[]`是字符数组,`char *`是指针,两者类型不同。解析:`switch`语句的`case`标签必须是常量表达式(如整常数、字符常量或枚举常量)。解析:数组下标从0开始,arr[2]是第三个元素。解析:函数指针`p`指向`func`,调用`p(3)`等价于调用`func(3)`,输出9。解析:结构体变量的大小可能大于其所有成员大小的总和,因为编译器可能会在成员之间添加填充字节以对齐。解析:`malloc`用于动态分配内存,`free`用于释放内存,`sizeof`用于计算大小,`strcpy`用于字符串拷贝。解析:`fopen`失败返回NULL,但`perror`会打印错误信息,然后代码继续执行到`fclose(fp)`。`fclose`会关闭有效的文件指针,对NULL指针调用是安全的(不执行任何操作)。二、填空题
解析:`!a`相当于`!(5)`,结果为逻辑假,C语言中逻辑假用`false`表示(虽然标准不要求,但通常用`false`)。解析:循环初始`i=0`,条件`i<5`,每次增量为2。输出0, 2, 4。解析:循环遍历`str`,将每个字符`*p`(ASCII码)减32(对应大写字母A的ASCII码65减去小写a的ASCII码97加1),得到对应的大写字母。解析:`*p = 5;`错误,因为`p`是`NULL`指针,尝试解引用`NULL`指针。解析:交换`a`和`b`的值,需要借助临时变量`temp`。补充1处存`b`的值,补充2处赋`temp`(原`b`),补充3处赋`a`(原`temp`)。解析:`stu1`使用初始化列表创建并赋值,`stu2`通过赋值运算符`=`接收`stu1`的值,这是合法的。解析:`names`数组包含5个字符串指针,第四个元素应为`"Wednesday"`。三、读程序写结果题
解析:外层循环控制行数(i从1到3),内层循环控制每行打印`*`的数量(j从1到i)。解析:`func(4)`计算斐波那契数列第4项(从0开始计为第4项),值为3。`func(5)`计算第5项,值为5。四、代码填空题
1. str[i]; str[len - i - 1]解析:反转字符串需要交换对称位置的字符。补充1处取右侧字符`str[len - i]`的值,补充2处将左侧字符`str[i]`的值赋给右侧位置,补充3处将保存的右侧字符值赋给左侧位置。解析:遍历数组,若发现当前元素`arr[i]`大于当前最大值`arr[maxIndex]`,则更新最大值索引为当前索引`i`。五、程序编写题
int isPrime(int n) {if (n <= 1) return 0; // 1和负数不是素数if (n == 2) return 1; // 2是素数if (n % 2 == 0) return 0; // 排除偶数for (int i = 3; i * i <= n; i += 2) { // 只检查奇数因子 if (n % i == 0) return 0; }return 1;}
解析思路:素数定义是大于1且只能被1和自身整除。判断方法:b. 对于大于2的奇数,检查从3开始的奇数是否能整除它,只需检查到sqrt(n)即可。#includeintmain(){char ch;int letterCount = 0, digitCount = 0, spaceCount = 0, otherCount = 0;printf("Enter a line of text (max 100 chars): ");// 使用fgets以处理空行和超过缓冲区的输入fgets(ch, 102, stdin); // ch应改为字符数组str[]// 假设输入不超过100个字符,且不包含换行符前的超长部分// 更健壮的写法应检查fgets的返回值和长度for (int i = 0; ch[i] != '\0' && i < 100; i++) {if ((ch[i] >= 'a' && ch[i] <= 'z') || (ch[i] >= 'A' && ch[i] <= 'Z')) { letterCount++; } else if (ch[i] >= '0' && ch[i] <= '9') { digitCount++; } else if (ch[i] == ' ') { spaceCount++; } else { otherCount++; }}printf("Letters: %d\n", letterCount);printf("Digits: %d\n", digitCount);printf("Spaces: %d\n", spaceCount);printf("Others: %d\n", otherCount);return 0;}
解析思路:逐个读取输入的字符,直到遇到换行符或达到最大长度。a. 使用`if`语句判断字符是否为字母(a-z或A-Z)。b. 使用`if`语句判断字符是否为数字(0-9)。