C语言二级操作题真题【内附解析】

来源题库:c.code2ji.cn

在这里插入图片描述


题目一:去除偶数生成新数

题目描述
从输入的正整数中提取出所有奇数位上的数字,并将这些数字重新组合成一个新的整数输出。若输入无效,需重新输入。

题库出处:c.code2ji.cn

在这里插入图片描述

🎯 示例输入输出:

📥 输入:12345678
📤 输出:1357

为什么?原数 12345678 从个位开始向前找奇数:
个位 8 ❌、十位 7 ✅、百位 6 ❌、千位 5 ✅…… 依次组合成新数1357。


🔰 初始代码(填空题形式)

#include <stdio.h>

void fun(unsigned long *n) {
    unsigned long x = 0, i = 1; // x存新数,i表示当前位权值
    int t;

    while (*n) {
        t = *n % __1__;
        if (t % 2 != __2__) {
            x = x + t * i;
            i = i * 10;
        }
        *n = *n / 10;
    }
    *n = __3__;
}

int main(void) {
    unsigned long n = -1;
    while (n > 99999999 || n <= 0) {
        printf("Please input(0<n<100000000): ");
        scanf("%ld", &n);
    }
    fun(&n);
    printf("\nThe result is: %ld\n", n);
    return 0;
}

✅ 填空答案:

  • __1__: 10
  • __2__: 0
  • __3__: x

🧠 每行详细解释

unsigned long x = 0, i = 1;
  • x 是我们最终要输出的新数。
  • i 是“位权值”,开始是个位,之后乘以10,变成十位、百位……
t = *n % 10;
  • 经典操作:% 10 取个位。
  • 比如 123 % 10 = 3
if (t % 2 != 0)
  • 判断这个数字是不是奇数。
  • % 2 == 0 是偶数,!= 0 就是奇数。
x = x + t * i;
  • 如果是奇数,就加到新数中。
  • 举个例子:当前 x = 13, t = 5, i = 100
  • x = 13 + 5*100 = 513
i = i * 10;
  • 准备处理下一位,个位 → 十位 → 百位
*n = *n / 10;
  • 去掉最低位,继续处理剩下的数字。
  • 123 / 10 = 12
*n = x;
  • 把最终的新数写回原变量。
  • 因为 fun(&n) 是传地址,修改 *n 就能改主函数里的值。

题目二:结构体数组按姓名排序(字典序)

题目描述
定义学生结构体,按姓名从小到大(字典序)排序,输出排序前后的结果。

题库出处:c.code2ji.cn
在这里插入图片描述


🔰 初始代码(含填空)

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

__1__ {
    long sno;
    char name[10];
    float score[3];
};

void fun(struct student a[], int n) {
    struct student t;
    int i, j;
    for (i = 0; i < __2__; i++)
        for (j = i + 1; j < n; j++)
            if (strcmp(__3__) > 0) {
                t = a[i];
                a[i] = a[j];
                a[j] = t;
            }
}

✅ 填空答案:

  • __1__: struct student
  • __2__: n - 1
  • __3__: a[i].name, a[j].name

🧠 每段解释:

struct student {
    long sno;
    char name[10];
    float score[3];
};
  • 定义学生结构体:学号 + 姓名 + 三门成绩
void fun(struct student a[], int n)
  • 传入结构体数组,长度为n
for (i = 0; i < n - 1; i++)
  • 冒泡排序外循环,进行n-1轮
strcmp(a[i].name, a[j].name) > 0
  • 字典序判断:如果 i 的名字比 j 的大,就交换
  • strcmp 返回正数表示第一个比第二个大

以下是 所有剩余题目 的完整精讲整理(按照你要求的格式):


题目三:螺旋矩阵生成

题目描述:实现一个函数 fun,用于生成一个特殊的 N×N 二维数组图案,最外层填 1,内层填 2,以此类推,直到中心。

题库出处:c.code2ji.cn

在这里插入图片描述


示例输出:

The result is:
 1 1 1 1 1 1 1
 1 2 2 2 2 2 1
 1 2 3 3 3 2 1
 1 2 3 4 3 2 1
 1 2 3 3 3 2 1
 1 2 2 2 2 2 1
 1 1 1 1 1 1 1

初始代码(含填空)

#include <stdio.h>
#define N 7

void fun(int (*a)[N]) {
    int i, j, k, m;
    if (N % 2 == 0)
        m = N / 2;
    else
        m = N / 2 + 1;

    for (i = 0; i < m; i++) {
        for (j = i; j < N - i; j++)
            a[i][j] = a[N - i - 1][j] = i + 1;

        for (k = i + 1; k < N - i - 1; k++)
            a[k][i] = a[k][N - i - 1] = i + 1;
    }
}

int main(void) {
    int x[N][N] = {0}, i, j;
    fun(x);
    printf("\nThe result is:\n");
    for (i = 0; i < N; i++) {
        for (j = 0; j < N; j++)
            printf("%3d", x[i][j]);
        printf("\n");
    }
    return 0;
}

填空答案(题库式)

  • __1__: [N]
  • __2__: i
  • __3__: i + 1

关键逻辑讲解:

  • 函数 fun(int (*a)[N]) 代表传二维数组
  • 外层 for (i=0; i<m; i++) 表示一圈圈地填
  • a[i][j] = a[N-i-1][j] = i+1:上下对称地填数
  • a[k][i] = a[k][N-i-1] = i+1:左右对称地填数
  • 变量 m 是圈数 = N/2(奇数加1)

题目四:复制最右边的字符

题目描述:从字符串右边起截取 n 个字符保存到另一个字符串中。

题库出处:c.code2ji.cn
在这里插入图片描述


示例输入输出:

输入:

hello world
5

输出:

world

初始代码(含填空)

#include <stdio.h>
#include <string.h>
#define N 80

void fun(char *s, int n, char *t) {
    int len, i, j = 0;
    len = strlen(s);
    if (n >= len)
        strcpy(t, s);
    else {
        for (i = len - n; i <= len - 1; i++)
            t[j++] = s[i];
        t[j] = '\0';
    }
}

int main(void) {
    char s[N], t[N];
    int n;
    printf("Enter a string: ");
    gets(s);
    printf("Enter n: ");
    scanf("%d", &n);
    fun(s, n, t);
    printf("The string t: ");
    puts(t);
    return 0;
}

填空答案

  • __1__: t, s
  • __2__: s[i]
  • __3__: '\0'

分析解释:

  • strlen(s):求出原串长度
  • n >= len,说明要复制整个串
  • 否则从 len - n 开始一个个复制
  • 最后加上 '\0' 是字符串结束标志
  • gets(s) 虽然不推荐,但考试中常见

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值