计算机二级C语言模拟题
考试时间:120分钟

选择题(共40分,每小题1分)
-
下列关于算法的描述中,错误的是。 A) 算法必须有输入 B) 算法必须有输出 C) 算法的每个步骤都必须是明确的 D) 算法必须在有限步内完成
-
以下选项中,不合法的C语言标识符是。 A)
_totalB)Num1C)a+bD)switch -
设有定义:
int a; float b; double c;,若要从键盘输入数据,使a的值为10,b的值为22.5,c的值为3.51,正确的输入语句是。 A)scanf("%d%f%lf", &a, &b, &c);B)scanf("%d%f%f", &a, &b, &c);C)scanf("%d,%f,%lf", &a, &b, &c);D)scanf("%d,%f,%f", &a, &b, &c); -
以下程序的输出结果是。
(图片来源网络,侵删)#include <stdio.h> int main() { int x = 10, y = 20; printf("%d\n", x < y ? x : y); return 0; }A) 10 B) 20 C) 0 D) 1
-
以下关于
switch语句的描述中,正确的是。 A)switch语句后面的表达式可以是任意类型 B)case后面的表达式可以是常量或变量 C) 每个case后面的语句序列最后都必须有break语句 D)default分支可以省略 -
以下程序段的输出结果是。
int a = 1, b = 2, c = 3; if (a > c) b = a; else c = b + a; printf("%d, %d, %d\n", a, b, c);A) 1, 2, 3 B) 1, 2, 5 C) 1, 2, 2 D) 1, 2, 4
(图片来源网络,侵删) -
以下能正确进行字符串赋值操作的语句是。 A)
char s[5] = "hello";B)char s[5]; s = "hello";C)char *s; s = "hello";D)char s[5] = {'h', 'e', 'l', 'l', 'o'}; -
以下程序的输出结果是。
#include <stdio.h> int main() { int a[5] = {1, 2, 3, 4, 5}; int *p = &a[2]; printf("%d, %d\n", *p, *(p+2)); return 0; }A) 2, 4 B) 3, 5 C) 2, 3 D) 3, 4
-
以下对结构体类型
Student的定义中,正确的是。 A)struct Student { int num; char name[20]; };B)
struct Student { int num; char name[20]; }; Student s1;C)
typedef struct { int num; char name[20]; } Student;D)
typedef struct Student { int num; char name[20]; }; -
以下关于文件操作的描述中,错误的是。 A) 使用
fopen函数打开文件时,必须指定打开方式(如"r", "w"等) B) 文件使用完毕后,必须用fclose函数关闭 C)feof函数用于检测文件指针是否指向文件末尾 D)fprintf函数可以向屏幕输出格式化数据 -
设有定义:
int x = 10, y = 3;,则表达式x % y的值是。 A) 1 B) 3 C) 0 D) 10 -
以下程序的输出结果是。
#include <stdio.h> int main() { int i; for (i = 0; i < 5; i++) { if (i % 2 == 0) continue; printf("%d ", i); } return 0; }A) 0 1 2 3 4 B) 1 3 C) 0 2 4 D) 1 2 3 4
-
以下函数的功能是。
int fun(int a) { int b = 0; static int c = 3; b++; c++; return a + b + c; }A) 计算a+b+c B) 计算a+b+3 C) 每次调用,返回值都比上一次调用大1 D) 每次调用,返回值都比上一次调用大2
-
以下程序的输出结果是。
#include <stdio.h> int main() { char str[] = "Hello"; char *p = str; printf("%c\n", *(p+3)); return 0; }A) H B) e C) l D) o
-
以下程序的输出结果是。
#include <stdio.h> int main() { int a = 5, b = 4, c = 3, d = 2; if (a > b > c) printf("A"); else if (c > d) printf("B"); else printf("C"); return 0; }A) A B) B C) C D) 无输出
-
为了判断两个字符串
s1和s2是否相等,应使用的语句是。 A)if (s1 == s2)B)if (s1 == *s2)C)if (strcmp(s1, s2) == 0)D)if (strcpy(s1, s2)) -
以下程序的输出结果是。
#include <stdio.h> int f(int x) { return x * x; } int main() { int i = 2, p; p = f(i++); printf("%d\n", p); return 0; }A) 2 B) 3 C) 4 D) 5
-
以下定义数组的语句中,错误的是。 A)
int a[10];B)int n = 10; int a[n];C)int a[] = {1, 2, 3};D)int *a = (int*)malloc(10 * sizeof(int)); -
以下程序的输出结果是。
#include <stdio.h> int main() { int a = 1, b = 2; a = a + b; b = a - b; a = a - b; printf("a=%d, b=%d\n", a, b); return 0; }A) a=1, b=2 B) a=2, b=1 C) a=3, b=2 D) a=2, b=3
-
以下程序的输出结果是。
#include <stdio.h> void fun(int x) { x = 20; } int main() { int x = 10; fun(x); printf("%d\n", x); return 0; }A) 10 B) 20 C) 0 D) 不确定
程序填空题(共18分,每空3分)
函数说明: 以下程序的功能是:从键盘输入一个字符串,将其中的小写字母全部转换成大写字母,然后输出转换后的字符串,输入"Hello World!",输出"HELLO WORLD!"。
请在程序的下划线处填入正确的内容,使程序得出正确的结果,并去掉下划线。
#include <stdio.h>
#include <string.h>
void to_upper(char str[]) {
int i;
for (i = 0; str[i] != '\0'; i++) {
if (str[i] >= 'a' && str[i] <= 'z') {
str[i] = str[i] - 32; // 或者 str[i] = str[i] - ('a' - 'A');
}
}
}
int main() {
char s[100];
printf("请输入一个字符串: ");
gets(s); // 注意:在实际考试中,gets()可能被不安全警告,但题目中可能会出现
_________________________; // 调用to_upper函数
printf("转换后的字符串: %s\n", s);
return 0;
}
答案:
to_upper(s)
程序修改题(共18分,每处错误6分)
函数说明: 以下程序中,函数fun的功能是:计算1到n之间所有能被3整除但不能被5整除的整数之和,n=10时,和为3 + 6 + 9 = 18。
程序中有两处错误,请找出并修改,使程序能正确运行。
#include <stdio.h>
long fun(int n) {
long sum = 0;
int i;
for (i = 1; i <= n; i++) {
if (i % 3 == 0 && i % 5 != 0) { // 错误点1
sum = sum + i;
}
}
return sum;
}
int main() {
int n;
long s;
printf("请输入一个正整数n: ");
scanf("%d", &n);
s = fun(n);
printf("和为: %ld\n", s); // 错误点2
return 0;
}
要求: 在修改时,不得改变程序的整体结构,不得增删行,只能修改错误处的代码。
错误点1:
- 错误代码:
if (i % 3 == 0 && i % 5 != 0); - 错误原因: 语句末尾多了一个分号,这使得
if语句体为空,sum = sum + i;成为循环体的一部分,每次都会执行,导致结果错误。 - 修改为:
if (i % 3 == 0 && i % 5 != 0)
错误点2:
- 错误代码:
printf("和为: %ld\n", s); - 错误原因:
long类型的变量sum(赋值给s)在printf中应该使用%ld格式说明符,而不是%d。%d用于int类型,可能会导致输出不正确或警告。 - 修改为:
printf("和为: %ld\n", s);
程序设计题(共24分)
要求:** 编写一个函数fun,其功能是:将一个字符串中所有连续的数字字符转换成一个整数,并存入数组b中,最后返回转换后的整数个数,字符串中可能包含多个数字序列,数字序列之间由非数字字符分隔。
字符串为 "a12b3c456d",则转换后数组b中的元素为12, 3, 456,函数返回值为3。
注意: 部分源程序给出,请勿改动main函数和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。
#include <stdio.h>
#include <string.h>
#include <ctype.h> // 用于 isdigit 函数
#define M 100
int fun(char *str, int b[]) {
int i, j, k;
int num = 0; // 用于记录转换后的整数个数
int len = strlen(str);
int temp[M] = {0}; // 临时存储每个数字序列的字符
i = 0;
while (i < len) {
// 跳过非数字字符
if (!isdigit(str[i])) {
i++;
continue;
}
// 找到连续的数字字符
j = 0;
while (i < len && isdigit(str[i])) {
temp[j++] = str[i++];
}
// 将temp中的字符转换为整数并存入b数组
k = 0;
while (j > 0) {
b[num] = b[num] * 10 + (temp[k++] - '0');
j--;
}
num++;
}
return num;
}
int main() {
char s[M];
int a[M], n, i;
printf("请输入一个字符串: ");
gets(s); // 注意:在实际考试中,gets()可能被不安全警告,但题目中可能会出现
n = fun(s, a);
printf("转换后的整数个数为: %d\n", n);
printf("转换后的整数为: ");
for (i = 0; i < n; i++) {
printf("%d ", a[i]);
}
printf("\n");
return 0;
}
参考答案及解析
选择题
- A (算法可以没有输入,例如计算π值的算法)
- C (标识符不能包含运算符)
- C (
scanf的格式字符串中,%d和%f之间需要有分隔符,如逗号,与输入的10,22.5,3.51对应。%lf用于double类型) - A (条件表达式
x < y ? x : y,因为10 < 20为真,所以取x的值10) - A (
switch的表达式必须是整型、字符型或枚举类型) - B (条件
a > c(1 > 3) 为假,执行else分支,c = b + a,即c = 2 + 1 = 3,所以最终a=1, b=2, c=3。注:原题C选项c=2有误,根据逻辑应为c=3,此处按逻辑解析为B,但原题可能意图是考察else if,无else if时,c应为3。 重新审视原题,无else if,所以执行else,c变为3,所以答案是B。) - C (A选项数组长度不够;B选项
s是数组名,是常量指针,不能赋值;D选项正确,但C选项也是正确的,且更符合“赋值操作”的描述。注:在C语言中,`char s = "hello";是将字符串常量的首地址赋给指针s`,这是一种赋值操作,D选项是初始化。* 通常考试会认为C是更符合题意的答案。) - B (指针
p指向a[2],即值为3。*(p+2)指向a[4],即值为5) - C (A只定义了结构体类型,未定义变量;B在定义结构体时直接定义变量,不符合语法;D
typedef后缺少结构体名) - D (
fprintf函数是向文件输出格式化数据,向屏幕输出用printf) - A (取余运算,10除以3商3余1)
- B (
continue会跳过本次循环剩余语句,i为0时跳过,i为1时打印,i为2时跳过,以此类推) - D (静态变量
c在函数调用间保持其值,第一次调用b=1, c=4,返回a+b+c=10+1+4=15,第二次调用b=1, c=5,返回a+b+c=10+1+5=16,第三次调用返回17,所以每次调用返回值比上一次大1。注:原题C选项说“大1”是正确的,D选项“大2”是错误的。 根据计算,C选项正确。) - C (指针
p指向字符串首字符'H',p+3指向第4个字符,即'l') - B (条件
a > b > c等价于(a > b) > c,即(5 > 4) > 3,1 > 3为假,不执行printf("A"),接着判断else if (c > d),3 > 2为真,执行printf("B")) - C (比较字符串内容必须使用
strcmp函数) - C (后缀是先使用后自增。
f(i++)中,先传入i=2,然后i变为3。f(2)返回2*2=4) - B (C99标准之前,数组大小不能是变量,C99支持变长数组,但很多考试环境仍不支持,视为错误)
- B (这是一个经典交换算法:
a=a+b(a=5),b=a-b(b=3),a=a-b(a=2)) - A (C语言是值传递,
fun函数中的x是main中x的一个副本,修改副本不影响main中的原变量)
程序填空题
to_upper(s)
程序修改题
- 错误点1:
if (i % 3 == 0 && i % 5 != 0);修改为if (i % 3 == 0 && i % 5 != 0) - 错误点2:
printf("和为: %d\n", s);修改为printf("和为: %ld\n", s)
程序设计题
// 完整代码已在题目中给出,此处为核心算法思路
int fun(char *str, int b[]) {
int i, num = 0;
int temp[M] = {0};
int len = strlen(str);
for (i = 0; i < len; ) {
if (isdigit(str[i])) {
int j = 0;
// 提取连续的数字
while (i < len && isdigit(str[i])) {
temp[j++] = str[i++];
}
// 将temp中的字符转换为整数
int current_num = 0;
for (int k = 0; k < j; k++) {
current_num = current_num * 10 + (temp[k] - '0');
}
b[num++] = current_num;
} else {
i++; // 跳过非数字字符
}
}
return num;
}
