跳到主要内容

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

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

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

1. 统计单词数量

编写程序统计字符串 s 中单词的个数:

void main()
{
char s[100];
gets(s);
int c=0, i, f=1, n=strlen(s);
for (i=0; i<n; i++)
{
if (1. _____________)
f=1;
else if (s[i]!=' ' && f==1)
{
c++;
f=0;
}
}
2. _____________;
}
查看参考答案与解析
  • 空 (1)s[i] == ' ' && f == 0
  • 空 (2)printf("%d", c);
  • 解析:当遇到空格且标志 f 为 0 时,重置 f = 1 标记单词间隔;统计完成后输出单词总数 c

2. 查找特定字符下标

输入字符串 s 和字符 ch,查找 chs 中首次出现的下标:

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

void main()
{
char s[100], ch;
scanf("%s %c", s, &ch);
int i, n=strlen(s);
for (i = 0; 1. _____________;)
i++;
if (2. ____________)
printf("没有找到");
else
printf("ch 的下标是%d", i);
}
查看参考答案与解析
  • 空 (1)s[i] != '\0' && s[i] != ch
  • 空 (2)i >= ns[i] == '\0'
  • 解析:循环在未到达字符串末尾且未查找到 ch 时继续递增;若循环结束后 i >= n 说明末尾仍未匹配到目标字符。

3. 冒泡排序与 swap 交换函数

#include <stdio.h>

void swap(int *a, int *b) {
int temp = *a;
2. _____________
*b = temp;
}

int main() {
int arr[10] = {5, 7, 2, 8, 3, 1, 6, 9, 4, 10};
int i, j;
for (i = 0; i < 9; i++) {
for (j = 0; j < 9 - i; j++) {
int *p = &arr[j], *q = &arr[j+1];
1. _____________;
}
}
printf("排序后的数组:");
for (i = 0; i < 10; i++) {
printf("%d ", arr[i]);
}
return 0;
}
查看参考答案与解析
  • 空 (1)if (*p > *q) swap(p, q);
  • 空 (2)*a = *b;
  • 解析:通过指针传参实现变量原位交换,外层循环控制冒泡轮次,若前数大于后数则调用 swap 交换。

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

1. 模拟加减法 switch 用法

#include <stdio.h>
int main() {
int a,b;
char op;
scanf("%d %c %d",&a,&op,&b);
switch(op)
{
case +:printf("%d+%d=%d",a,b,a+b);break;
case -:printf("%d-%d=%d",a,b,a-b);break;
default:printf("error",a,b,a+b);
}
return 0;
}
查看参考答案与修改
  • 错处 1case +: 格式错误,字符常量需加单引号。修改为 case '+':
  • 错处 2case -: 格式错误,修改为 case '-':

2. 输入输出的格式规范

#include <stdio.h>
int main() {
double area;
int h,w;
scanf("%d %d",h,w);
area = (1.0/2)*h*w;
printf("三角形的面积=%f",area);
return 0;
}
查看参考答案与修改
  • 错处 1scanf("%d %d",h,w); 缺少取地址符。修改为 scanf("%d %d", &h, &w);
  • 错处 2printf("三角形的面积=%f",area); 格式占位符不匹配,double 建议用 %lf。修改为 %lf

3. for 循环范围与取余运算符

#include <stdio.h>
int main() {
int x[10]={14, 22, 31, 49, 56, 62, 77, 81, 92, 110}, i, c=0;
for (i=0; i>=10; i++)
{
if (x[i]/7==0)
{
c++;
}
}
printf("能被 7 整除的数有%d 个",c);
return 0;
}
查看参考答案与修改
  • 错处 1for (i=0; i>=10; i++) 循环条件方向错误。修改为 i < 10
  • 错处 2x[i]/7==0 除法与取余混淆。修改为整除判断 x[i] % 7 == 0

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

1. 追踪循环与递减逻辑

#include <stdio.h>
int main() {
int x=6, y=2, z=0;
while(x-- != (y+=1))
{
z++;
if (y > x) break;
}
printf("x=%d, y=%d, z=%d", x, y, z);
return 0;
}
查看运算输出结果
  • 输出结果x=3, y=5, z=3

2. 静态变量 static 累加求解

#include <stdio.h>
int fun(int n)
{
static int p=1;
p *= n;
return p;
}
int main() {
int i, sum=0;
for(i=1; i<=5; i++)
{
sum += fun(i);
}
printf("sum=%d", sum);
return 0;
}
查看运算输出结果与解析
  • 输出结果sum=153
  • 过程解析fun(i) 依次计算阶乘 1! + 2! + 3! + 4! + 5! = 1 + 2 + 6 + 24 + 120 = 153。

3. 字符串偶数 ASCII 调整

#include <stdio.h>
int main() {
char s[]="abcde";
int k=0, i=0;
while (k<5)
{
if (s[i]%2==0)
{
char c = s[i];
int j;
for (j=i+1; j<5; j++)
s[j-1]=s[j];
s[j-1]=c;
}
else
i++;
k++;
}
puts(s);
return 0;
}
查看运算输出结果
  • 输出结果acebd

四、程序题(算法设计)

1. 图形打印(20 分)

编写程序输出如下数字塔图形:

12345654321
123454321
1234321
12321
121
1
121
12321
1234321
123454321
12345654321
查看参考代码与解析
#include <stdio.h>
int main() {
int n = 6;
// 上半部分(含中间行)
for (int i = 1; i <= n; i++) {
for (int j = 1; j < i; j++) printf(" ");
for (int j = 1; j <= n - i + 1; j++) printf("%d", j);
for (int j = n - i; j >= 1; j--) printf("%d", j);
printf("\n");
}
// 下半部分
for (int i = n - 1; i >= 1; i--) {
for (int j = 1; j < i; j++) printf(" ");
for (int j = 1; j <= n - i + 1; j++) printf("%d", j);
for (int j = n - i; j >= 1; j--) printf("%d", j);
printf("\n");
}
return 0;
}

2. 抛硬币模拟函数(20 分)

编写 flip() 无参数函数返回随机数 1(正面)或 0(反面),主函数循环 10 次输出正面或反面(每行 5 个),最后统计并输出正反面出现的总次数。

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

int flip() { return rand() % 2; }

int main() {
srand(time(NULL));
int heads = 0, tails = 0;
printf("抛硬币结果:\n");
for (int i = 1; i <= 10; i++) {
int res = flip();
if (res == 1) { printf("正面 "); heads++; }
else { printf("反面 "); tails++; }
if (i % 5 == 0) printf("\n");
}
printf("\n统计结果:正面%d次,反面%d次\n", heads, tails);
return 0;
}

3. 递归求解 e 的近似值(20 分)

计算 e 的近似值:e = 1 + 1/1! + 1/2! + ... + 1/n!,直到某项绝对值小于 1e-7,要求阶乘使用递归函数 facn 实现。

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

double fac(int n) {
if (n == 0 || n == 1) return 1.0;
return n * fac(n - 1);
}

int main() {
double e = 1.0, term;
int n = 1;
do {
term = 1.0 / fac(n);
e += term;
n++;
} while (fabs(term) >= 1e-7);
printf("最终结果:e ≈ %.8f (n=%d时满足精度)\n", e, n - 1);
return 0;
}

4. 单链表创建与连接(30 分)

定义两个单链表,使用 creat() 函数创建,并编写 contracte() 函数将链表二连接到链表一的末尾。

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

typedef struct Node {
int data;
struct Node* next;
} Node;

Node* creat() {
Node *head = NULL, *tail = NULL, *p = NULL;
int num;
printf("请输入整数创建单链表(-1退出):\n");
while (1) {
scanf("%d", &num);
if (num == -1) break;
p = (Node*)malloc(sizeof(Node));
p->data = num;
p->next = NULL;
if (head == NULL) { head = tail = p; }
else { tail->next = p; tail = p; }
}
return head;
}

Node* contracte(Node* list1, Node* list2) {
if (list1 == NULL) return list2;
Node* p = list1;
while (p->next != NULL) p = p->next;
p->next = list2;
return list1;
}