2025 年湖北师范大学专升本《C程序设计》真题与答案
一、程序填空题(每题 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,查找 ch 在 s 中首次出现的下标:
#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 >= n或s[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;
}
查看参考答案与修改
- 错处 1:
case +:格式错误,字符常量需加单引号。修改为case '+': - 错处 2:
case -:格式错误,修改为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;
}
查看参考答案与修改
- 错处 1:
scanf("%d %d",h,w);缺少取地址符。修改为scanf("%d %d", &h, &w); - 错处 2:
printf("三角形的面积=%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;
}
查看参考答案与修改
- 错处 1:
for (i=0; i>=10; i++)循环条件方向错误。修改为i < 10 - 错处 2:
x[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;
}