2024年湖北专升本C语言模拟试卷
一、单选(10道)
1、在 C 语言中,用于表示“与”逻辑运算的符号是?()
a) &&
b) ||
c) !
d) &
2、在 C 语言中,以下哪个选项正确定义了一个具有三个参数的函数指针?()
a) int (*funcPtr)();
b) int (*funcPtr)(int, float);
c) int funcPtr(int, float);
d) int funcPtr(int, int, int);
3、在 C 语言中,下列哪个关键字用于定义一个常量?()
a) var
b) const
c) let
d) final
4、在 C 语言中,以下哪个关键字用于在条件语句中执行一段代码块,只要条件为真就会一直执行?()
a) for
b) while
c) do
d) switch
5、在 C 语言中,以下哪个运算符用于获取变量的地址?()
a) *
b) &
c) ->
d) ~
6、下列哪个函数用于在 C 语言中从标准输入读取一个字符?()
a) scanf()
b) gets()
c) getchar()
d) read()
7、下列哪个函数用于在 C 语言中将一个整数转换为字符串?()
a) itoa()
b) atoi()
c) sprintf()
d) strcat()
8、在 C 语言中,以下哪个选项正确地声明了一个指向整型数组的指针?()
a) int *ptr[];
b) int (*ptr)[];
c) int *ptr();
d) int ptr[]();
9、在 C 语言中,以下哪个选项是有效的动态内存分配语句?()
a) malloc(sizeof(int));
b) calloc(sizeof(int));
c) realloc(sizeof(int));
d) free(sizeof(int));
10、下列哪个选项能够正确交换两个整型变量的值?()
a)void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
}
b)void swap(int *a, int *b) {
int temp = *a;
*a = *b;
*b = temp;
}
c)int swap(int a, int b) {
return b, a;
}
d)int swap(int &a, int &b) {
int temp = a;
a = b;
b = temp;
}
二、填空(10道,在____处填答案)
1、
以下程序运行后的输出结果是____。
void swap(int x,int y)
{ int t;
t=x;x=y;y=t;
printf("%d %d ",x,y);
}
main()
{ int a=3,b=4;
swap(a,b);
printf("%d %d\n",a,b);
}
2、
以下程序运行后的输出结果是____。
int fun(int n)
{ switch(n)
{ case 0: return 0;
case 1: return 1;
case 2: return 1;
default: return fun(n-1)+fun(n-2);
}
}
main()
{ int n=7,s;
s=fun(n);
printf("%d\n",s);
}
3、
输入一个字符串,将其倒序后输出
main()
{ int i,j;
char st[60],ch;
scanf("%s",st);
for(i=0,j=____;____;i++,j--)
{ ch=st[i];
________;
st[j]=ch;
}
printf("%s\n",st);
}
4、
输入字符串,将其中的非数字字符删除后,输出整个字符串
main()
{ char st[80];
int i=0,j=0;
scanf("%s",st);
while(st[i])
{ if(________)
st[____]=st[i];
i++;
}
________;
printf("%s\n",st);
}
5、
有以下结构体说明,请填空,以完成对结构体数组 t 定义:
struct STR
{ char a;
int b;
float c;
double d;
};
________t[20];
6、
在 C 语言中,有如下语句:
struct cat
{ int a[10];
char ch;
float f;
double *p;
} cat1;
则结构体变量 cat1 占用内存的字节数为____。
7、
在 C 语言中,有如下语句:
struct std
{ char ch;
int a[2];
float t;
double f
} std1;
则结构体变量 std1 占用内存的字节数为____。
8、
以下程序运行后的输出结果是____。
main()
{ char str[][20]={"China","Beijing"},*p=str;
printf("%s\n",p+20);
}
9、
以下程序运行后的输出结果是____。
main()
{ char a[]={‘\1’,‘ \2’,‘ \3’,‘ \4’,‘ \0’};
printf("%d %d\n",sizeof(a),strlen(a)); }
10、
以下程序运行后的输出结果是____。
main()
{ char *s1="12345",*s2="1234";
printf("%d\n",strlen(strcat(s1,s2)));
}
三、程序改错(10道)
1、错误的程序:
#include <stdio.h>
int main()
{
float radius;
printf("输入圆的半径: ");
scanf("%f", &radius);
area = 3.14 * radius * radius;
printf("Area of the circle is: %f\n", area);
return 0;
}
2、错误的程序:
#include <stdio.h>
int main() {
int n;
printf("输入一个数字:");
scanf("%d", n);
if (n % 2 == 0) {
printf("%d 是偶数\n", n);
} else {
printf("%d 是奇数\n", n);
}
return 0;
}
3、错误的程序:
#include <stdio.h>
int main() {
int num;
printf("Enter a number: ");
scanf("%d", &num);
if (num % 2) {
printf("%d is odd\n", num);
} else {
printf("%d is even\n", num);
}
return 0;
}
4、错误的程序:
#include <stdio.h>
int main() {
int a = 5, b = 10;
printf("Sum of a and b is: %d\n", sum(a, b));
return 0;
}
int sum(int x, int y) {
return x + y;
}
5、错误的程序:
#include <stdio.h>
void increment(int *x) {
x++;
}
int main() {
int num = 5;
increment(num);
printf("Incremented value: %d\n", num);
return 0;
}
6、错误的程序:
#include <stdio.h>
void printArray(int arr[]) {
int i;
for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
printArray(arr);
return 0;
}
7、错误的程序:
#include <stdio.h>
int main() {
int n;
printf("Enter a number: ");
scanf("%d", &n);
if (n > 0);
printf("%d is positive\n", n);
else if (n < 0);
printf("%d is negative\n", n);
else
printf("%d is zero\n", n);
return 0;
}
8、错误的程序:
#include <stdio.h>
int main() {
int n;
printf("Enter a number: ");
scanf("%d", n);
printf("Square of %d is: %d\n", n, square(n));
return 0;
}
int square(int x) {
return x * x;
}
9、错误的程序:
#include <stdio.h>
int main() {
int x = 5;
int y = 10;
swap(&x, &y);
printf("x: %d, y: %d\n", x, y);
return 0;
}
void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
}
10、错误的程序:
#include <stdio.h>
int main() {
int arr[] = {1, 2, 3, 4, 5};
printf("Sum of array elements: %d\n", sum(arr));
return 0;
}
int sum(int arr[]) {
int sum = 0;
for (int i = 0; i < sizeof(arr) / sizeof(arr[0]); i++) {
sum += arr[i];
}
return sum;
}
四、程序阅读(4道)
1、
#include <stdio.h>
int main() {
int arr[] = {1, 2, 3, 4, 5};
int *ptr = arr;
printf("结果为: ");
for (int i = 0; i < 5; ++i) {
printf("%d ", *ptr);
ptr++;
}
printf("\n");
return 0;
}
结果为:
2、
#include <stdio.h>
int main() {
int num=10;
int sum = 0;
for (int i = 1; i <= num; ++i) {
sum += i;
}
printf("结果为%d\n",sum);
return 0;
}
结果为:
3、
#include <stdio.h>
int main() {
int n=10;
int fib[50];
fib[0] = 0;
fib[1] = 1;
for (int i = 2; i < n; ++i) {
fib[i] = fib[i - 1] + fib[i - 2];
}
printf("结果为: ");
for (int i = 0; i < n; ++i) {
printf("%d ", fib[i]);
}
printf("\n");
return 0;
}
结果为:
4、
#include <stdio.h>
int main() {
int num=123456789, reversedNum = 0, remainder;
while (num != 0) {
remainder = num % 10;
reversedNum = reversedNum * 10 + remainder;
num /= 10;
}
printf("结果为: %d\n", reversedNum);
return 0;
}
结果为:
五、大题(5道)
1、在歌星大奖赛中, 有 10 个评委为参赛的选手打分, 分数为 1~100 分。 选手最后得分为: 去掉一个最高分和一个最低分后其余 8 个分数的平均值。 请编写一个程序实现。
2、100!的尾数有多少个零?
3、问 555555 的约数中最大的三位数是多少?
4、求 13 的 13 次方的最后三位数
5、设有一个数列包含10个数,已经按升序排好。现要求编写一程序,它能够从指定位置开始的n个数按逆序,重新排列并输出新的完整数列。
进行逆序处理时要求使用指针方法(例如原数列为2,4,6,8,10,12,14,16,18,20,若要求从第4个数开始的5个数按逆序重新排列,则得到新数列为2,4,6,16,14,12,10,8,18,20)。
参考答案
一、单选(10道)
1-5:ABBBB
6-10:CABAB
二、填空(10道,在____处填答案)
1、4 3
3 4
2、13
3、j = strlen(st) - 1;
i < j;
st[i]=st[j]
4、isdigit(st[i]
j
st[j] = '\0';
5、struct STR
6、56
7、24
8、Beijing
9、5 4
10、9
三、程序改错(10道)
1、错误:变量 area 未声明。应添加 float area;。
2、错误:scanf 应使用 &n。
3、错误:条件判断中应使用 n % 2 == 1 而不是 num % 2。
4、错误:函数 sum 未声明。int sum(int x, int y);
5、错误:
1.void increment(int *x) {
(*x)++; // 解引用指针并递增值
}
2.increment(&num); // 传递 num 的地址给 increment() 函数
6、错误:
#include <stdio.h>
void printArray(int arr[], int length) {
int i;
for (i = 0; i < length; i++) {
printf("%d ", arr[i]);
}
printf("\n");
}
int main() {
int arr[] = {1, 2, 3, 4, 5};
int length = sizeof(arr) / sizeof(arr[0]);
printArray(arr, length);
return 0;
}
7、错误:if 语句后不应有分号。
8、错误:1.函数 square 未声明。 2.scanf("%d", &n);
9、错误:
#include <stdio.h>
// 声明 swap 函数,参数为指针
void swap(int *a, int *b);
int main() {
int x = 5;
int y = 10;
swap(&x, &y); // 传递变量地址
printf("x: %d, y: %d\n", x, y);
return 0;
}
// 定义 swap 函数,参数为指针
void swap(int *a, int *b) {
int temp = *a; // 使用 * 解引用指针获取值
*a = *b; // 使用 * 解引用指针修改值
*b = temp; // 使用 * 解引用指针修改值
}
10、错误:
#include <stdio.h>
// 声明 sum 函数,并传入数组和数组长度
int sum(int arr[], int length);
int main() {
int arr[] = {1, 2, 3, 4, 5};
// 传递数组和数组长度
printf("Sum of array elements: %d\n", sum(arr, sizeof(arr) / sizeof(arr[0])));
return 0;
}
// 定义 sum 函数,接收数组和数组长度
int sum(int arr[], int length) {
int sum = 0;
// 使用传入的数组长度来遍历数组
for (int i = 0; i < length; i++) {
sum += arr[i];
}
return sum;
}
四、程序阅读(4道)
1、结果为: 1 2 3 4 5
2、结果为55
3、结果为: 0 1 1 2 3 5 8 13 21 34
4、结果为: 987654321
五、大题(5道)
1、
#include <stdio.h>
/**
* 计算给定分数数组的平均值。
* @param scores 整型数组,包含需要计算平均值的分数。
* @param size 整数,表示数组的大小。
* @return 返回计算得到的平均值,类型为浮点数。
*/
float calculateAverage(int scores[], int size);
/**
* 对给定的分数数组进行冒泡排序,使得数组元素按升序排列。
* @param scores 整型数组,包含需要排序的分数。
* @param size 整数,表示数组的大小。
*/
void sortScores(int scores[], int size);
int main() {
int scores[10];
// 读取10位评委的分数
printf("请输入 10 个评委的分数(1~100):\n");
for (int i = 0; i < 10; i++) {
printf("评委 %d 的分数:", i + 1);
scanf("%d", &scores[i]);
}
// 对分数数组进行排序
sortScores(scores, 10);
// 计算并输出去除一个最高分和一个最低分后的平均分
float average = calculateAverage(scores + 1, 8); // 从第2个分数开始计算,共8个分数
printf("选手的最终得分为:%.2f\n", average);
return 0;
}
/**
* 计算给定分数数组的和,并返回其平均值。
* @param scores 整型数组,包含需要计算平均值的分数。
* @param size 整数,表示数组的大小。
* @return 返回计算得到的平均值,类型为浮点数。
*/
float calculateAverage(int scores[], int size) {
int sum = 0;
for (int i = 0; i < size; i++) {
sum += scores[i];
}
return (float)sum / size;
}
/**
* 实现冒泡排序算法,对给定的分数数组进行排序。
* @param scores 整型数组,包含需要排序的分数。
* @param size 整数,表示数组的大小。
*/
void sortScores(int scores[], int size) {
for (int i = 0; i < size - 1; i++) {
for (int j = 0; j < size - i - 1; j++) {
if (scores[j] > scores[j + 1]) {
// 交换相邻两个分数,以实现升序排序
int temp = scores[j];
scores[j] = scores[j + 1];
scores[j + 1] = temp;
}
}
}
}
2、
#include <stdio.h>
/**
* 计算 n! 中包含的因子 x 的个数
* @param n 待计算的阶乘数
* @param x 要统计的因子
* @return 返回 n! 中包含的因子 x 的个数
*/
int countFactors(int n, int x) {
int count = 0; // 初始化统计个数为 0
while (n > 0) { // 当 n 大于 0 时循环计算
n /= x; // n 除以 x,将 n 中的 x 因子去除
count += n; // 将去除 x 因子后的 n 加到 count 上,统计 x 的个数
}
return count; // 返回统计结果
}
int main() {
// 计算 100! 中包含的因子 5 的个数
int zeros = countFactors(100, 5); // 调用函数计算 100! 中包含的因子 5 的个数
printf("100! 的尾数中有 %d 个零。\n", zeros); // 打印结果
return 0; // 程序正常结束
}
3、
#include <stdio.h>
/**
* 主函数,寻找555555的最大三位数约数。
* 无参数。
* 无返回值。
*/
int main() {
int number = 555555; // 待查找约数的数值
int max_three_digit_divisor = -1; // 初始值设为 -1,表示未找到满足条件的约数
// 从较大的三位数开始逐步向下测试,寻找能整除555555的最大三位数
for (int divisor = 999; divisor >= 100; --divisor) {
if (number % divisor == 0) {
max_three_digit_divisor = divisor; // 找到能整除的最大的三位数
break; // 找到满足条件的约数后退出循环
}
}
// 判断是否找到了满足条件的约数,并输出结果
if (max_three_digit_divisor != -1) {
printf("555555 的约数中最大的三位数是 %d\n", max_three_digit_divisor);
} else {
printf("555555 没有三位数约数。\n");
}
return 0; // 程序正常结束
}
4、
#include <stdio.h>
int main() {
int base = 13; // 底数
int exponent = 13; // 指数
int result = 1; // 用于存储最终结果
// 使用循环计算底数的指数次幂,并保留最后三位数
for (int i = 0; i < exponent; ++i) {
result *= base; // 依次将底数乘以自身,累乘得到指数次幂
result %= 1000; // 取模运算,保留最后三位数
}
// 打印结果
printf("13 的 13 次方的最后三位数为:%d\n", result);
return 0; // 程序正常结束
}
5、
#include <stdio.h>
/**
* 反转数组中的元素。
* @param arr 指向要反转的数组的指针。
* @param start 反转的起始位置。
* @param n 要反转的元素个数。
* 说明:此函数将数组 arr 中从位置 start 开始的 n 个元素进行反转。
*/
void reverseArray(int *arr, int start, int n) {
int *left = arr + start; // 定义左指针,指向反转的起始位置
int *right = left + n - 1; // 定义右指针,指向反转的结束位置
while (left < right) { // 当左指针小于右指针时循环,进行元素交换
int temp = *left;
*left = *right;
*right = temp;
left++; // 左指针向右移动
right--; // 右指针向左移动
}
}
int main() {
int arr[10] = {}; // 定义一个长度为 10 的数组
int start, n; // 定义起始位置和要反转的元素个数
printf("输入数组元素:\n");
for (int i = 0; i < 10; i++) { // 循环读取数组元素
scanf("%d", &arr[i]);
}
printf("输入起始位置:");
scanf("%d", &start);
printf("输入要反转的元素数: ");
scanf("%d", &n);
// 检查输入的起始位置和元素个数是否合法
if (start < 0 || start >= 10 || n < 0 || start + n > 10) {
printf("Invalid input\n");
return 1; // 输入不合法,退出程序
}
reverseArray(arr, start, n); // 调用函数反转数组
printf("反向数组: ");
for (int i = 0; i < 10; i++) { // 打印反转后的数组
printf("%d ", arr[i]);
}
printf("\n");
return 0; // 程序正常结束
}