跳到主要内容

2026 年湖北师范大学专升本《C程序设计》真题与答案

考试说明:总分 150 分 | 闭卷笔试

一、程序填空题(每题 6 分,每空 3 分)

1. 查找最小字符串

读入 3 个字符串,找出字典序最小的字符串并输出:

#include <stdio.h>
#include <string.h>

int main()
{
char str[3][100];
char s[100];
int i;
for (i = 0; i < 3; i++) {
gets(str[i]);
}
strcpy(s, 1. _________);
for (i = 1; i < 3; i++) {
if (strcmp(str[i], s) < 0) {
strcpy(s, str[i]);
}
}
printf("最小的一行:%s\n", 2. _________);
return 0;
}
查看参考答案与解析
  • 空 (1)str[0]
  • 空 (2)s
  • 解析:首先初始化 s 为第一个字符串 str[0],后续遍历比对更新最小值 s 并打印。

2. 递归求解 1~n 的总和

#include <stdio.h>

int sum(int n) {
if (n == 0) {
return 0;
}
return 1. _________;
}

int main() {
int n, s;
scanf("%d", &n);
2. _________;
printf("%d\n", s);
return 0;
}
查看参考答案与解析
  • 空 (1)n + sum(n - 1)
  • 空 (2)s = sum(n)
  • 解析:递归基为 n == 0 时返回 0,递推式为 n + sum(n - 1)

3. 提取数字字符并拼接到整形数值

读取一行字符,将其中的数字字符挑选出来拼成对应的整数(例如输入 1 2 3 输出 123):

#include <stdio.h>
#include <string.h>

int main()
{
char s[100];
int i, sum = 0;
int n;
gets(s);
1. _________;
for (i = 0; i < n; i++){
if (s[i] >= '0' && s[i] <= '9'){
sum = 2. _________;
}
}
printf("%d ", sum);
return 0;
}
查看参考答案与解析
  • 空 (1)n = strlen(s)
  • 空 (2)sum * 10 + (s[i] - '0')
  • 解析:利用 sum * 10 + val 算法按十进制高位到低位累加拼接数字。

二、程序改错题(每题 6 分,每空 3 分)

1. 删除指定字符

#include <stdio.h>
int main() {
int i, j;
char c;
scanf("%c\n", &c);
char s[80];
gets(s);
for(i = j = 0; s[i]=0; i++){
if(s[i] != c)
s[j] = s[i];
}
s[j] = '\0';
puts(s);
return 0;
}
查看参考答案与修改
  • 错处 1for(i = j = 0; s[i]=0; i++) 条件为赋值语句 s[i]=0 导致直接终止。修改为 s[i] != '\0'
  • 错处 2s[j] = s[i]; 覆盖后未移动下标 j。修改为 s[j++] = s[i];

2. 选择排序算法

#include <stdio.h>
int main() {
int a[5];
int i,j,t;
for (i=0; i<5; i++)
scanf("%d", a[i]);
for (i = 0; i < 4; i++){
for (j = i; j < 5; j++){
if (a[i] > a[j]){
t = a[j];
a[j] = a[i];
a[i] = t;
}
}
}
for (i=0; i<5 ;i++)
printf("%d ", a[i]);
return 0;
}
查看参考答案与修改
  • 错处 1scanf("%d", a[i]); 缺少取地址符。修改为 scanf("%d", &a[i]);
  • 错处 2:内层循环起始 j = i 会导致自己与自己比较。修改为 j = i + 1

3. 求比指定整数大的最小素数

#include <stdio.h>
int findNextPrime(int m)
{
int i, j, k;
for (i = m + 1;; i++){
for (k = 2; k < i; j++){
if (i % k == 0)
break;
}
if (k <= i)
return k;
}
}
int main()
{
int x;
printf("请输入 x: ");
scanf("%d", x);
int result = findNextPrime(x);
printf("比 %d 大的最小素数是: %d\n", x, result);
return 0;
}
查看参考答案与修改
  • 错处 1scanf("%d", x); 缺少取地址符。修改为 scanf("%d", &x);
  • 错处 2if (k <= i) return k; 应该返回找到的素数 i 且判断条件为未提前 break(k == i)。修改为 if (k == i) return i;

三、程序结果计算(每题 8 分)

1. switch 与循环累加

#include <stdio.h>
#include <string.h>
int main()
{
int k, c = 0;
for (k=1; k<=3; k++){
switch (k) {
case 2: c++; break;
case 4: c++; break;
default: c += k;
}
}
printf("%d", c);
return 0;
}
查看运算输出结果
  • 输出结果5

2. do-while 条件逻辑跟踪

#include <stdio.h>
int main() {
int i = 1;
do {
if (i % 3 == 1)
if (i % 5 == 2) {
printf("找到符合条件的数: *%d\n", i);
break;
}
i++;
} while(i != 0);
return 0;
}
查看运算输出结果
  • 输出结果找到符合条件的数: *7

3. 数组与指针映射运算

#include <stdio.h>
int main() {
int A[9];
int P[3];
int k = 5;
for (int i = 0; i < 9; i++) A[i] = i;
for (int i = 0; i < 3; i++) P[i] = A[i * (i + 1)];
for (int i = 0; i < 3; i++) k += P[i] * 2;
printf("k = %d\n", k);
return 0;
}
查看运算输出结果
  • 输出结果k = 21

四、程序题(算法设计)

1. 倾斜数字图形输出(20 分)

实现如下数字图形输出:

5
4 9
3 8 12
2 7 11 14
1 6 10 13 15
查看参考代码与解析
#include <stdio.h>
int main() {
int i, j, x = 1, a[5][5] = {0};
for (i = 0; i < 5; i++) {
for (j = 4; j >= i; j--) a[j][i] = x++;
}
for (i = 0; i < 5; i++) {
for (j = 0; j <= i; j++) printf("%d ", a[i][j]);
printf("\n");
}
return 0;
}

2. 二分法查找数组元素(20 分)

主函数 main 中输入要查找的值 x 和数组长度 n。编写子函数 1 为数组赋值 0, 1, 2, ..., n-1,子函数 2 用二分法在数组中查找 x,如果找到返回下标,未找到返回 -1

查看参考代码与解析
#include <stdio.h>

void getarray(int a[], int n) {
for (int i = 0; i < n; i++) a[i] = i;
}

int find(int a[], int x, int n) {
int l = 0, r = n - 1;
while (l <= r) {
int m = l + (r - l) / 2;
if (a[m] == x) return m;
else if (a[m] < x) l = m + 1;
else r = m - 1;
}
return -1;
}

3. 字符串大小写互换(20 分)

写一个子函数 fun(char s[]),将字符串中的大写字母转换成小写,小写字母转换成大写。

查看参考代码与解析
#include <stdio.h>

void fun(char s[]) {
for (int i = 0; s[i] != '\0'; i++) {
if (s[i] >= 'a' && s[i] <= 'z') s[i] -= 32;
else if (s[i] >= 'A' && s[i] <= 'Z') s[i] += 32;
}
}

4. 任意进制转换(30 分)

采用辗转相除法将一个十进制数转换为 2~16 进制数。需要实现以下函数:

  1. void fun(long int number, int digit, char result[]) 实现进制转换
  2. void reverse(char result[]) 将数组逆序
  3. 主函数实现输入与输出
查看参考代码与解析
#include <stdio.h>
#include <string.h>

void fun(long int number, int digit, char result[]) {
int i = 0;
char table[] = "0123456789ABCDEF";
if (number == 0) { result[0] = '0'; result[1] = '\0'; return; }
while (number > 0) {
result[i++] = table[number % digit];
number /= digit;
}
result[i] = '\0';
}

void reverse(char result[]) {
int n = strlen(result);
for (int i = 0; i < n / 2; i++) {
char ch = result[i];
result[i] = result[n - i - 1];
result[n - i - 1] = ch;
}
}

int main() {
long int number; int digit;
char result[32];
printf("请输入十进制数和目标进制(2-16):");
if (scanf("%ld %d", &number, &digit) == 2) {
fun(number, digit, result);
reverse(result);
printf("转换结果:%s\n", result);
}
return 0;
}