由于我没有您手中具体的考核册,我将根据C语言教学的常规进度和知识点,为您模拟一份完整的“C语言程序设计形成性考核册”,这份模拟册将包含从基础到进阶的多个题目,并附上详细的答案和解析,希望能对您的学习和练习有所帮助。

C语言程序设计形成性考核册 (模拟)
课程名称: C语言程序设计 适用对象: 初学者 考核目的: 检验学生对C语言基本概念、语法、数据类型、流程控制、函数、数组、指针等核心知识的掌握程度和应用能力。
第一部分:基础知识与顺序结构
选择题 (每题2分,共10分)
-
以下不是C语言基本数据类型的是。 A)
intB)floatC)charD)string -
若有定义
int a = 3; float b = 4.5;,则表达式a + (int)b的值是。 A) 7.5 B) 7 C) 8 D) 3.5 -
下列哪个是合法的C语言标识符? A)
2sumB)_totalC)a+bD)for
(图片来源网络,侵删) -
C语言源程序的基本单位是。 A) 程序行 B) 语句 C) 函数 D) 字符
-
要为变量
x赋一个初值10,应使用的语句是。 A)x = 10B)x := 10C)x == 10D)int x = 10;
填空题 (每空2分,共10分)
- C语言程序总是从
______函数开始执行。 - 若有定义
char c = 'A';,则c + 1的值是______(用字符表示)。 printf函数用于______,scanf函数用于______。- 在C语言中,一个
int类型的变量通常占用______个字节的内存空间 (在大多数现代编译器中)。
编程题 (共20分)
编写一个程序,从键盘输入一个圆的半径(浮点数),计算并输出该圆的周长和面积,要求结果保留两位小数。 (提示:圆周长公式 C = 2 r,圆面积公式 S = π * r²,π ≈ 3.14159)**
第二部分:选择结构
选择题 (每题2分,共10分)
-
为了表示关系
x ≥ y ≥ z,应使用的C语言表达式是。 A)(x >= y) && (y >= z)B)(x >= y) >= zC)x >= y >= zD)x >= y || y >= z
(图片来源网络,侵删) -
以下
if语句语法正确的是。 A)if (x > 0) printf("positive");B)if x > 0 { printf("positive"); }C)if (x > 0) then printf("positive");D)if x > 0 printf("positive"); -
执行以下代码后,
y的值是。int x = 5, y; if (x > 0) y = 1; else if (x == 0) y = 0; else y = -1;A) 1 B) 0 C) -1 D) 未定义
-
switch语句中的case后面必须是一个。 A) 表达式 B) 变量 C) 常量或常量表达式 D) 任意类型 -
要判断一个字符
ch是否为大写字母,应使用。 A)if (ch >= 'A' && ch <= 'Z')B)if (ch >= 'a' && ch <= 'z')C)if (ch > 'A' && ch < 'Z')D)if (ch >= 65 && ch <= 90)
编程题 (共20分)
** 编写一个程序,要求用户输入一个整数,然后判断该整数是奇数还是偶数,并输出相应信息。
示例运行:
请输入一个整数: 88
88 是一个偶数。
请输入一个整数: 57
57 是一个奇数。
第三部分:循环结构
选择题 (每题2分,共10分)
-
执行以下
for循环后,i的值是。for (int i = 0; i < 5; i++);
A) 4 B) 5 C) 6 D) 无限循环
-
以下哪个循环语句至少会执行一次循环体? A)
forB)whileC)do-whileD)goto -
要实现循环100次,最合适的
for循环头是。 A)for (int i = 1; i <= 100; i++)B)for (int i = 0; i < 100; i++)C)for (int i = 100; i > 0; i--)D) 以上都可以 -
break语句在循环中的作用是。 A) 跳出当前循环 B) 跳出当前函数 C) 结束本次循环,继续下一次 D) 程序终止 -
continue语句在循环中的作用是。 A) 跳出当前循环 B) 跳出当前函数 C) 结束本次循环,继续下一次 D) 程序终止
编程题 (共20分)
** 编写一个程序,计算1到100之间所有能被3整除但不能被5整除的整数之和。
第四部分:函数
选择题 (每题2分,共10分)
-
C语言程序中,函数返回值的类型由决定。 A)
return语句中的表达式类型 B)main函数的类型 C) 函数定义时指定的函数类型 D) 调用函数时的实参类型 -
以下关于函数的说法,错误的是。 A) 函数可以没有返回值 B) 函数可以没有参数 C) 函数可以嵌套定义 D) 函数可以递归调用
-
在C语言中,变量按作用域分为全局变量和。 A) 外部变量 B) 内部变量 C) 局部变量 D) 静态变量
-
如果一个函数不需要返回值,则其函数类型应声明为。 A)
voidB)intC)floatD)char -
以下函数声明正确的是。 A)
int add(int a, b);B)int add(int a, int b)C)int add(int a, int b);D)add(int a, int b)
编程题 (共20分)
** 编写一个函数 is_prime(int num),用于判断一个整数 num 是否为素数(质数),如果是素数,函数返回1;否则返回0,然后在 main 函数中调用该函数,判断用户输入的一个数是否为素数。
素数定义: 大于1的自然数,除了1和它本身以外不再有其他因数。
第五部分:数组
选择题 (每题2分,共10分)
-
在C语言中,数组下标的下限是。 A) 0 B) 1 C) 可以自定义 D) 不确定
-
若有定义
int a[10];,则数组a的最后一个元素是。 A)a[10]B)a[9]C)a[1]D)a[0] -
以下对一维数组
a的正确初始化是。 A)int a[5] = {1, 2, 3, 4, 5, 6};B)int a[5] = {1, 2, 3};C)int a[] = {1, 2, 3, 4, 5};D)int a[5]; a = {1, 2, 3, 4, 5}; -
要将字符串
"Hello"存储起来,应定义。 A)char str[5];B)char str[6];C)char str[7];D)char str[4]; -
以下关于字符串的说法,正确的是。 A) 字符串以
'0'B) 字符串以'\0'C) 字符串以NULLD) 字符串没有结尾标志
编程题 (共20分)
** 编写一个程序,实现以下功能:
- 定义一个包含10个整型元素的数组。
- 使用循环从键盘为这10个元素赋值。
- 找出并输出数组中的最大值和最小值。
第六部分:指针
选择题 (每题2分,共10分)
-
指针变量的本质是。 A) 一个普通变量 B) 一个内存地址 C) 一个内存单元 D) 一个数据类型
-
若有定义
int a = 10; int *p = &a;,则*p的值是。 A)p的地址 B)a的地址 C) 10 D)p的值 -
以下哪个操作是非法的?(假设
p是一个指向整型的指针) A)p++B)*pC)p + 1D)p = 100; -
NULL指针通常用来表示。 A) 指向0地址的指针 B) 指针未初始化 C) 空指针,表示不指向任何有效内存 D) 指针的值为0 -
函数参数传递中,传递指针可以实现。 A) 值传递 B) 地址传递(引用传递) C) 全局变量传递 D) 静态变量传递
编程题 (共20分)
* 编写一个函数 `void swap(int a, int *b),用于交换两个整数的值,然后在main` 函数中调用该函数,交换两个变量的值并输出交换前后的结果,以验证函数的正确性。
参考答案与解析
第一部分
选择题
- D。
string不是C语言的基本数据类型,它是一个结构体类型(struct),通常用来表示字符串。 - B。
(int)b将浮点数b强制转换为整数,得到4。a + 4即3 + 4 = 7,结果类型为int。 - B,标识符必须以字母或下划线开头,不能是数字。
_total符合规则。 - C,C程序由一个或多个函数组成,
main函数是程序的入口和出口。 - D。 是赋值运算符, 不是C语言运算符, 是比较运算符。
int x = 10;是变量的定义并初始化。
填空题
main'B'(字符 'A' 的ASCII码是65,加1后是66,对应的字符是 'B')- 格式化输出;格式化输入
- 4
编程题
#include <stdio.h>
int main() {
float radius, circumference, area;
const float PI = 3.14159f; // 使用 const 定义常量,并添加 f 表示 float 类型
// 1. 提示用户输入半径
printf("请输入圆的半径: ");
// 2. 从键盘读取半径
scanf("%f", &radius);
// 3. 计算周长和面积
circumference = 2 * PI * radius;
area = PI * radius * radius;
// 4. 输出结果,保留两位小数
printf("圆的周长是: %.2f\n", circumference);
printf("圆的面积是: %.2f\n", area);
return 0;
}
第二部分
选择题
- A。
x ≥ y ≥ z等价于x ≥ yy ≥ z,逻辑与&&实现了“的关系。 - A。
if语句的语法是if (表达式) 语句;。printf是一个语句。 - A。
x的值是5,大于0,if条件成立,y被赋值为1。 - C。
case后面必须是常量或常量表达式,不能是变量。 - A,这是判断字符是否为大写字母的标准方法,D选项也是正确的,但A选项更具可读性。
编程题
#include <stdio.h>
int main() {
int num;
// 1. 提示用户输入整数
printf("请输入一个整数: ");
// 2. 读取整数
scanf("%d", &num);
// 3. 使用 if-else 结构判断奇偶性
// 取模运算 % 得到余数,如果余数为0则是偶数,否则是奇数
if (num % 2 == 0) {
printf("%d 是一个偶数,\n", num);
} else {
printf("%d 是一个奇数,\n", num);
}
return 0;
}
第三部分
选择题
- B。
for (int i = 0; i < 5; i++);注意末尾的分号,它构成了一个空循环体,循环条件i < 5执行5次(i=0,1,2,3,4),循环结束后i的值变为5。 - C。
do-while循环的特点是先执行循环体,再判断条件,所以至少执行一次。 - D,A、B、C 都能实现循环100次,只是循环变量的初始值和递增/递减方式不同。
- A。
break用于立即终止并跳出当前所在的switch或循环结构。 - C。
continue用于跳过本次循环中continue之后的语句,直接进入下一次循环条件的判断。
编程题
#include <stdio.h>
int main() {
int sum = 0;
int i;
// 使用 for 循环遍历 1 到 100
for (i = 1; i <= 100; i++) {
// 判断条件:能被3整除 (i % 3 == 0) 且 不能被5整除 (i % 5 != 0)
if (i % 3 == 0 && i % 5 != 0) {
sum += i; // 满足条件,累加到 sum
}
}
// 输出最终结果
printf("1到100之间能被3整除但不能被5整除的整数之和为: %d\n", sum);
return 0;
}
第四部分
选择题
- C,函数的返回值类型在函数定义时由返回类型指定,
return语句中的表达式会自动转换为该类型。 - C,C语言不允许在函数内部再定义一个完整的函数(函数嵌套定义)。
- C,按作用域分为全局变量(文件作用域)和局部变量(块作用域)。
- A。
void关键字表示“无类型”或“空类型”,用于声明没有返回值的函数。 - C,函数声明需要以分号 并且每个参数都要指明类型。
编程题
#include <stdio.h>
#include <math.h> // 为了使用 sqrt 函数
// 函数声明
int is_prime(int num);
int main() {
int number;
printf("请输入一个整数: ");
scanf("%d", &number);
// 调用函数并判断返回值
if (is_prime(number)) {
printf("%d 是一个素数,\n", number);
} else {
printf("%d 不是一个素数,\n", number);
}
return 0;
}
// 函数定义
int is_prime(int num) {
// 素数定义大于1
if (num <= 1) {
return 0; // 不是素数
}
// 遍历从2到 sqrt(num),检查是否有能整除的数
// 优化:只需检查到平方根即可
for (int i = 2; i <= sqrt(num); i++) {
if (num % i == 0) {
return 0; // 如果找到因数,则不是素数
}
}
// 如果循环结束都没有找到因数,则是素数
return 1;
}
第五部分
选择题
- A,C语言数组的下标总是从0开始。
- B,数组
a有10个元素,下标从0到9。 - C,A选项初始化元素个数超过数组大小;B选项合法,但只初始化了前三个元素,其余为0;D选项语法错误,不能在定义后用花括号列表整体赋值。
- B,字符串
"Hello"在内存中实际存储为'H','e','l','l','o','\0',共6个字符(包括结尾的空字符\0)。 - B,C语言中的字符串以空字符
\0(ASCII码为0) 作为结尾标志,用于字符串处理函数(如strlen)判断字符串结束。
编程题
#include <stdio.h>
int main() {
int arr[10];
int i;
int max, min;
// 1. 为数组赋值
printf("请输入10个整数,用空格隔开:\n");
for (i = 0; i < 10; i++) {
scanf("%d", &arr[i]);
}
// 2. 初始化 max 和 min 为第一个元素
max = arr[0];
min = arr[0];
// 3. 遍历数组,找出最大值和最小值
for (i = 1; i < 10; i++) {
if (arr[i] > max) {
max = arr[i]; // 如果当前元素大于max,则更新max
}
if (arr[i] < min) {
min = arr[i]; // 如果当前元素小于min,则更新min
}
}
// 4. 输出结果
printf("数组中的最大值是: %d\n", max);
printf("数组中的最小值是: %d\n", min);
return 0;
}
第六部分
选择题
- B,指针变量存储的是另一个变量的内存地址。
- C。
p存储a的地址,*p是解引用操作,表示获取p所指向地址的值,即a的值10。 - D。
p是一个地址,不能直接被赋值为一个整数100,正确的做法是*p = 100;(给 p 指向的内存赋值)。 - C。
NULL是一个宏定义,通常值为0,专门用来表示一个空指针,即不指向任何有效内存地址的指针。 - B,将变量的地址(指针)作为参数传递给函数,函数就可以通过这个地址直接操作原变量,实现了类似“引用传递”的效果。
编程题
#include <stdio.h>
// 函数声明
void swap(int *a, int *b);
int main() {
int num1, num2;
printf("请输入两个整数,用空格隔开: ");
scanf("%d %d", &num1, &num2);
printf("交换前: num1 = %d, num2 = %d\n", num1, num2);
// 调用 swap 函数,传递变量的地址
swap(&num1, &num2);
printf("交换后: num1 = %d, num2 = %d\n", num1, num2);
return 0;
}
// 函数定义
void swap(int *a, int *b) {
int temp; // 定义一个临时变量
// 通过指针访问并交换变量的值
temp = *a; // 将 a 指向的值存入 temp
*a = *b; // 将 b 指向的值赋给 a 指向的变量
*b = temp; // 将 temp 的值赋给 b 指向的变量
}
