2025级C语言第四次周测题解

7-1-1 你该努力了

分数 30

作者 岳金戈

单位 金陵科技学院

本学期软件工程学院,软件工程专业已经考了4次周测了,但是大部分同学成绩并不理想。那么,有些同学,你是不是该努力了。

输入格式:

以字符串形式,输入一个名字XXX。(名字皆为简写,字符串长度不超过10)

输出格式:

输出"XXX, you should study hard!"

输入样例:

在这里给出一组输入。例如:

复制代码
YJG

输出样例:

在这里给出相应的输出。例如:

复制代码
YJG, you should study hard!

参考答案:

cpp 复制代码
#include <stdio.h>
int main (void) {
    char name[15];
    gets(name);
    printf("%s, you should study hard!", name);
    return 0;
}

7-2-1 藏头诗

分数 20

作者 张泳

单位 浙江大学

本题要求编写一个解密藏头诗的程序。

注:在 2022 年 7 月 14 日 16 点 50 分以后,该题数据修改为 UTF-8 编码。

输入格式:

输入为一首中文藏头诗,一共四句,每句一行。注意:一个汉字占三个字节。

输出格式:

取出每句的第一个汉字并连接在一起形成一个字符串并输出。同时在末尾输入一个换行符。

输入样例:

复制代码
一叶轻舟向东流
帆稍轻握杨柳手
风纤碧波微起舞
顺水任从雅客流

输出样例:

复制代码
一帆风顺

参考答案:

cpp 复制代码
#include <stdio.h>
int main (void) {
    char words[5][100];
    for(int i=0; i<4; i++){
        scanf("%s", words[i]);
    }
    for(int i=0; i<4; i++){
        printf("%c%c%c", words[i][0], words[i][1], words[i][2]);
    }
    return 0;
}

7-2-2 藏尾诗

分数 20

作者 C课程组

单位 浙江大学

本题要求编写一个解密藏尾诗的程序。

注:在 2023 年 1 月 17 日 15 点 14 分以后,该题数据修改为 UTF-8 编码。

输入格式:

输入为一首中文藏尾诗,一共四句。每句一行,但句子不一定是等长的,最短一个汉字,最长九个汉字。注意:一个汉字占三个字节。

输出格式:

取出每句的最后一个汉字并连接在一起形成一个字符串并输出。同时在末尾输入一个换行符。

输入样例:

复制代码
悠悠田园风
然而心难平
兰花轻涌浪
兰香愈幽静

输出样例:

复制代码
风平浪静

参考答案:

cpp 复制代码
#include <stdio.h>
int main (void) {
    char words[4][100];
    for(int i=0; i<4; i++){
        scanf("%s", words[i]);
    }
    for(int i=0; i<4; i++){
        int len = strlen(words[i]);
        printf("%c%c%c", words[i][len-3], words[i][len-2], words[i][len-1]);
    }
    return 0;
}

7-3-1 字符串替换

分数 20

作者 C课程组

单位 浙江大学

本题要求编写程序,将给定字符串中的大写英文字母按以下对应规则替换:

原字母 对应字母
A Z
B Y
C X
D W
... ...
X C
Y B
Z A

输入格式:

输入在一行中给出一个不超过80个字符、并以回车结束的字符串。

输出格式:

输出在一行中给出替换完成后的字符串。

输入样例:

复制代码
Only the 11 CAPItaL LeTtERS are replaced.

输出样例:

复制代码
Lnly the 11 XZKRtaO OeGtVIH are replaced.

参考答案:

cpp 复制代码
#include <stdio.h>
int main (void) {
    char str[100];
    gets(str);
    for(int i = 0; i < strlen(str); i++){
        if(str[i] >= 'A' && str[i] <= 'Z'){
            str[i] = 'A' + 'Z' - str[i];
        }
    }
    puts(str);
    return 0;
}

7-3-2 字符串查找

分数 20

作者 郭奇展

单位 金陵科技学院

给定两个字符串A和B,请判断B是否是A的子串。如果是,输出B在A中第一次出现的位置(从0开始计数),否则输出-1.

输入格式:

给定两行输入:

第一行输入字符串A

第二行输入字符串B

两字符串的长度都不超过 10000,并且保证每个字符串都是由可见的ASCII码和空白字符组成。

输出格式:

输出一个整数,表示字符串B在字符串A中首次出现的位置或者-1

输入样例:

在这里给出一组输入。例如:

复制代码
Hello World!
ll

输出样例:

在这里给出相应的输出。例如:

复制代码
2

参考答案:

cpp 复制代码
#include <stdio.h>
#include <string.h>
int main (void) {
    char A[10000], B[10000];
    gets(A);
    gets(B);
    int lenA = strlen(A), lenB = strlen(B);
    for(int i = 0; i <= lenA - lenB; i++){
        int index = 0;
        for(index = 0; index < lenB; index++){
            if(A[i + index] != B[index]){
                break;
            }
        }
        if(index == lenB){
            printf("%d", i);
            return 0;
        }
    }
    printf("-1");
    return 0;
}

7-4-1 猴子选大王

分数 15

作者 徐镜春

单位 浙江大学

一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?

输入格式:

输入在一行中给一个正整数N(≤1000)。

输出格式:

在一行中输出当选猴王的编号。

输入样例:

复制代码
11

输出样例:

复制代码
7

参考答案:

cpp 复制代码
#include <stdio.h>
int main (void) {
    int n;
    scanf("%d", &n);
    int monkey[1005] = {0}, count = 0, cnt = 0;
    while(1){
        for(int i = 0; i < n; i++){
            if(monkey[i] == 0){
                cnt++;
            }
            if(cnt == 3){
                monkey[i] = 1;
                count++;
                cnt = 0;
            }
        }
        if(count == n-1){
            for(int i = 0; i < n; i++){
                if(monkey[i] == 0){
                    printf("%d", i + 1);
                    return 0;
                }
            }
        }
    }
    return 0;
}

7-4-2 约瑟夫问题

分数 15

作者 孙振晢

单位 上海大学

n 个人围成一圈,从第一个人开始报数,数到 m 的人出列,再由下一个人重新从 1 开始报数,数到 m 的人再出圈,依次类推,直到所有的人都出圈,请输出依次出圈人的编号。

输入格式:

输入两个整数 n,m。

输出格式:

输出一行 n 个整数,按顺序输出每个出圈人的编号。

说明/提示

1<=n,m<=100

输入样例:

复制代码
10 3

输出样例:

复制代码
3 6 9 2 7 1 8 5 10 4

参考答案:

cpp 复制代码
#include <stdio.h>
int main (void) {
    int n, m;;
    scanf("%d %d", &n, &m);
    int flag[105] = {0};
    int count, cnt;
    count = cnt = 0;
    // cnt : 表示报数
    // count : 表示总出圈人数
    while(1){
        for(int i = 0; i < n; i++){
            // flag[i] = 0, 表示未出圈的人
            if(flag[i] == 0){
                // 报数
                cnt++;
            }
            // 报数报到 m 的人出圈
            if(cnt == m){
                // flag[i] = 1, 标记该人出圈
                flag[i] = 1;
                // 报数清零
                cnt = 0;
                // 总出圈人数++
                count++;
                printf("%d ", i+1);
            }
        }
        // 还剩最后一个人
        if(count == n-1){
            // for循环遍历flag数组 找到未出圈(flag[i]=0)的人
            for(int j = 0; j < n; j++){
                if(flag[j] == 0){
                    // 输出
                    printf("%d", j+1);
                    return 0;
                }
            }
        }
    }
    return 0;
}

7-5-1 感染人数

分数 15

作者 黄龙军

单位 绍兴文理学院

设某住宿区域是一个n×n的方阵,方阵中的每个小方格为一个房间,房间里可能住一个人,也可能空着。第一天,某些房间中住着的人得了一种高传染性的流感,以后每一天,得流感的人会使其邻居(住在其上、下、左、右方向存在的房间里面的人)传染上流感,请问:第m天总共有多少人得流感?

输入格式:

第一行输入两个整数n,m(1<n≤20,1≤m≤100),含义如上述;接着输入n行,每行n个字符,表示住宿区域第一天的房间情况,其中,@表示当天该房间住着得流感的人,.表示该房间住着健康的人,#表示该房间是空的。

输出格式:

输出一个整数,表示第m天得了流感的人数。

输入样例1:

复制代码
5 3
#....
.....
...##
.#.@.
@.#..

输出样例1:

复制代码
10

输入样例2:

复制代码
5 4
....#
.#.@.
.#@..
#....
.....

输出样例2:

复制代码
16

参考答案:

cpp 复制代码
#include <stdio.h>
int main (void) {
    int n, m;
    scanf("%d %d", &n, &m);
    getchar();
    char map[25][25];
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= n; j++){
            scanf("%c", &map[i][j]);
        }
        getchar();
    }
    int total = 0;
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= n; j++){
            if(map[i][j] == '@'){
                total++;
            }
        }
    }
    
    for(int day = 1; day < m; day++){

        for(int i = 1; i <= n; i++){
            for(int j = 1; j<= n; j++){
                if(map[i][j] == '.'){
                    if(map[i+1][j] == '@' || map[i-1][j] == '@' || 
                      map[i][j+1] == '@' || map[i][j-1] == '@'){
                        map[i][j] = '*';
                        total++;
                      }
                }
            }
        
        }

        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                if (map[i][j] == '*') {
                    map[i][j] = '@';
                }
            }
        }
    }
    printf("%d", total);
    return 0;
}
相关推荐
树在风中摇曳2 小时前
【牛客排序题详解】归并排序 & 快速排序深度解析(含 C 语言完整实现)
c语言·开发语言·算法
minji...2 小时前
算法---模拟/高精度/枚举
数据结构·c++·算法·高精度·模拟·枚举
Vic101012 小时前
Java 序列化与反序列化:深入解析与实践
java·开发语言
Sirius Wu3 小时前
开源训练框架:MS-SWIFT详解
开发语言·人工智能·语言模型·开源·aigc·swift
后端小张3 小时前
【JAVA 进阶】Spring Cloud 微服务全栈实践:从认知到落地
java·开发语言·spring boot·spring·spring cloud·微服务·原理
从零开始学习人工智能3 小时前
USDT区块链转账 vs SWIFT跨境转账:技术逻辑与场景博弈的深度拆解
开发语言·ssh·swift
星释3 小时前
Rust 练习册 31:啤酒歌与字符串格式化艺术
开发语言·网络·rust
百***58843 小时前
MacOS升级ruby版本
开发语言·macos·ruby
执笔论英雄3 小时前
【大模型训练】forward_backward_func返回多个micro batch 损失
开发语言·算法·batch