信息学奥赛一本通 第五章 第五章 数 组 第三节C语言非C++

发布时间:2023年12月18日

第五章 数 组

第三节 字符类型和字符数组

2046:【例5.15】替换字母

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

int main()
{
    char s[205], a, b;
    fgets(s, 205, stdin); // 读入带空格的字符串,最多可以读入204个字符
    scanf("%c %c", &a, &b); // 输入a和b
    int len = strlen(s);
    for(int i = 0; i < len; ++i)
    {
        if(s[i] == a)
            s[i] = b;
    }
    printf("%s", s); // 输出字符串
    return 0;
}



2047:【例5.16】过滤空格

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

int main()
{
    char s_in[205], s_out[205];
    fgets(s_in, 205, stdin); // 读入带空格的字符串,最多可以读入204个字符
    int len = strlen(s_in), bn = 0, si = 0; // len:输入字符串的长度,bn:空格数量计数,si:输出字符串的索引
    for(int i = 0; i <= len; ++i) // 遍历到字符串结束标志'\0'位置
    {
        if(s_in[i] == ' ')
        {
            bn++; // 空格数量计数加1
            if(bn == 1)
                s_out[si++] = s_in[i]; // 将第一个空格填充到输出字符串中
        }
        else
        {
            s_out[si++] = s_in[i]; // 将非空格字符填充到输出字符串中
            bn = 0; // 重置空格数量计数
        }
    }
    printf("%s", s_out); // 输出字符串
    return 0;
}

2048:【例5.18】串排序

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

void swap(char *a, char *b) {
    char temp[25];
    strcpy(temp, a);
    strcpy(a, b);
    strcpy(b, temp);
}

int main() {
    char s[25][25];
    int n;
    scanf("%d", &n); // 输入n
    for(int i = 0; i < n; ++i) {
        scanf("%s", s[i]); // 输入字符串
    }

    for(int i = 0; i < n - 1; ++i) { // 选择排序
        int m = i; // 找从i+1~n最小值下标
        for(int j = i + 1; j < n; ++j) {
            if(strcmp(s[j], s[m]) < 0) {
                m = j;
            }
        }
        swap(s[m], s[i]); // 交换最小值与当前值
    }

    for(int i = 0; i < n; ++i) {
        printf("%s\n", s[i]); // 输出排序后的字符串
    }
    return 0;
}

2049:【例5.19】字符串判等

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

int main() {
    char s1[105], s2[105];
    int i = 0, j = 0, l1, l2; // i:s1的下标 j:s2的下标 也可以管i,j叫做指针
    fgets(s1, 105, stdin); // 读入带空格的字符串
    fgets(s2, 105, stdin);
    l1 = strlen(s1) - 1; // -1是因为fgets会读入换行符
    l2 = strlen(s2) - 1;
    bool isSame = true;

    while(i < l1 || j < l2) { // 只要有一个数组没遍历完,就进行这一循环,直到都遍历完,或跳出。
        if(s1[i] == ' ') {
            i++;
        } else if(s2[j] == ' ') {
            j++;
        } else {
            if(tolower(s1[i]) == tolower(s2[j])) { // 如果两字母相同,或仅仅是大小写不同的相同字母
                i++;
                j++;
            } else {
                isSame = false;
                break;
            }
        }
    }

    if(isSame) {
        printf("YES");
    } else {
        printf("NO");
    }
    return 0;
}

2050:【例5.20】字串包含

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

int main() {
    char s1[35], s2[35], t[35];
    scanf("%s %s", s1, s2);
    int l1, l2, tl;
    l1 = strlen(s1);
    l2 = strlen(s2);
    bool hasSubstr = false;
    if(l1 < l2) { // 让s1是较长的字符串,s2是较短的字符串
        strcpy(t, s1);
        strcpy(s1, s2);
        strcpy(s2, t);
        l1 = strlen(s1);
        l2 = strlen(s2);
    }
    // l1 >= l2的前提下,判断s2是不是s1的子串
    for(int i = 0; i < l1; ++i) { // 循环遍历字符数组
        bool isSubStr = true;
        for(int j = 0; j < l2; ++j) {
            if(s2[j] != s1[(i+j)%l1]) { // 判断s2[j]与s1[(i+j)%l1]是否相同
                isSubStr = false;
                break;
            }
        }
        if(isSubStr) {
            printf("true");
            return 0;
        }
    }
    printf("false");
    return 0;
}

1839:【05NOIP提高组】谁拿了最多奖学金

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

#define N 105

char name[N][50]; // name[i]: 第i人的姓名,假设姓名长度不超过50
int money[N]; // money[i]: 第i人获得的奖学金,初值为0

int main() {
    int n, gStudy, gClass, paperNum, sum = 0, mxi = 1; // gStudy: 学习成绩, gClass: 班级成绩, paperNum: 论文数量
    char isLeader, isWest; // isLeader: 是否是干部, isWest: 是否来自西部
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i) {
        scanf("%s %d %d %c %c %d", name[i], &gStudy, &gClass, &isLeader, &isWest, &paperNum);
        if (gStudy > 80 && paperNum >= 1)
            money[i] += 8000;
        if (gStudy > 85 && gClass > 80)
            money[i] += 4000;
        if (gStudy > 90)
            money[i] += 2000;
        if (gStudy > 85 && isWest == 'Y')
            money[i] += 1000;
        if (gClass > 80 && isLeader == 'Y')
            money[i] += 850;
        if (money[i] > money[mxi]) // 求最大值下标 mxi:获得最多奖学金的人的编号。如有相同最大值,只会取先出现的最大值的下标
            mxi = i;
        sum += money[i]; // sum:所有人奖学金总和
    }
    printf("%s\n%d\n%d", name[mxi], money[mxi], sum);
    return 0;
}

1129:统计数字字符个数

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

int main()
{
    char s[260];
    fgets(s, sizeof(s), stdin); // 使用fgets函数读取输入字符串,可以读取空格和换行符
    int sum = 0, len = strlen(s);
    for(int i = 0; i < len; ++i)
    {
        if(isdigit(s[i])) // 使用isdigit函数判断字符是否为数字
            sum++;
    }
    printf("%d", sum);
    return 0;
}

1130:找第一个只出现一次的字符

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

int main()
{
    int a[128] = {}; // 数组a[字母]表示该字母出现的次数,初始化为0
    char s[100005];
    scanf("%s", s);
    int len = strlen(s);
    
    for(int i = 0; i < len; ++i)
        a[s[i]]++; // 统计每个字符出现的次数
    
    for(int i = 0; i < len; ++i) // 遍历字符串,找到第一个只出现一次的字符
    {
        if(a[s[i]] == 1)
        {
            printf("%c", s[i]);
            return 0;
        }
    }
    
    printf("no"); // 没找到
    return 0;
}

1131:基因相关性

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

int main()
{
    double y; // 阈值
    char s1[505], s2[505]; // 输入的两个字符串
    scanf("%lf%s%s", &y, s1, s2); // 读取阈值和两个字符串

    int len = strlen(s1); // 字符串长度
    int ct = 0; // 计数

    // 遍历字符串,比较每个位置上的字符是否相等
    for(int i = 0; i < len; ++i)
    {
        if(s1[i] == s2[i])
            ct++; // 相等则计数加1
    }

    // 计算相等字符的比例并与阈值比较
    if((double)ct / len >= y)
        printf("yes");
    else
        printf("no");

    return 0;
}


1132:石头剪子布

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

int main()
{
    char s1[10], s2[10];
    int n;
    scanf("%d", &n);

    for(int i = 0; i < n; ++i)
    {
        scanf("%s %s", s1, s2);

        if(strcmp(s1, s2) == 0)
            printf("Tie\n");
        else
        {
            if(strcmp(s1, "Rock") == 0)
            {
                if(strcmp(s2, "Scissors") == 0)
                    printf("Player1\n");
                else
                    printf("Player2\n");
            }
            if(strcmp(s1, "Scissors") == 0)
            {
                if(strcmp(s2, "Paper") == 0)
                    printf("Player1\n");
                else
                    printf("Player2\n");
            }
            if(strcmp(s1, "Paper") == 0)
            {
                if(strcmp(s2, "Rock") == 0)
                    printf("Player1\n");
                else
                    printf("Player2\n");
            }
        }
    }

    return 0;
}

1133:输出亲朋字符串

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

int main()
{
    char s1[105], s2[105];
    fgets(s1, 105, stdin); // 从标准输入读取一行字符串,存储在s1中
    int len = strlen(s1); // 计算字符串s1的长度

    for(int i = 0; i < len; ++i)
        s2[i] = s1[i] + s1[(i + 1) % len]; // 将s1中每个字符与下一个字符相加,存储在s2中

    s2[len] = '\0'; // 在s2的末尾添加\0,构成字符串
    printf("%s", s2); // 输出s2

    return 0;
}

1134:合法C标识符查

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

int main()
{
    char s[25];
    scanf("%s", s); // 从标准输入读取字符串,存储在s中
    
    if (s[0] >= '0' && s[0] <= '9') // 如果第一个字符是数字
    {
        printf("no");
        return 0;
    }
    
    int len = strlen(s); // 计算字符串s的长度
    
    for (int i = 0; i < len; ++i)
    {
        // 如果出现不满足要求的字符
        if (!(s[i] >= '0' && s[i] <= '9' || 
              s[i] >= 'a' && s[i] <= 'z' ||
              s[i] >= 'A' && s[i] <= 'Z' ||
              s[i] == '_'))
        {
            printf("no");
            return 0;   
        }
    }
    
    printf("yes");
    return 0;
}

1135:配对碱基链

#include <stdio.h>

int main()
{
    char c;
    
    // 逐个读取字符,直到遇到换行符
    while ((c = getchar()) != '\n')
    {
        // 根据字符的不同,输出对应的字符
        if (c == 'A')
            printf("T");
        else if (c == 'T')
            printf("A");
        else if (c == 'G')
            printf("C");
        else
            printf("G");
    }
    
    return 0;
}

1136:密码翻译

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

int main() {
    char s[85], r[85];
    fgets(s, sizeof(s), stdin);
    int len = strlen(s);
    for (int i = 0; i < len; ++i) {
        if ((s[i] >= 'a' && s[i] <= 'y') || (s[i] >= 'A' && s[i] <= 'Y'))
            r[i] = s[i] + 1;
        else if (s[i] == 'Z' || s[i] == 'z')
            r[i] = s[i] - 25;
        else
            r[i] = s[i];
    }
    r[len] = '\0';
    printf("%s\n", r);
    return 0;
}


1137:加密的病历单

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

void reverse(char s[])//倒序
{
    int len = strlen(s);
    for(int i = 0; i < len/2; ++i)
    {
        // 交换位置
        char temp = s[i];
        s[i] = s[len - 1 - i];
        s[len - 1 - i] = temp;
    }
}

void changeCase(char s[])//大小写转换
{
    int len = strlen(s);
    for(int i = 0; i < len; ++i)
    {
        if(isupper(s[i])) // 大写字母转小写字母
            s[i] = tolower(s[i]);
        else if(islower(s[i])) // 小写字母转大写字母
            s[i] = toupper(s[i]);
    }
}

void moveRight(char s[])//字母右移3位
{
    int len = strlen(s);
    for(int i = 0; i < len; ++i)
    {
        if(isupper(s[i])) // 大写字母右移
            s[i] = (s[i] - 'A' + 3) % 26 + 'A';
        else if(islower(s[i])) // 小写字母右移
            s[i] = (s[i] - 'a' + 3) % 26 + 'a';
    }
}

int main()
{
    char s[55];
    scanf("%s", s); // 获取输入的字符串
    moveRight(s); // 字母右移3位
    changeCase(s); // 大小写转换
    reverse(s); // 倒序
    printf("%s\n", s); // 输出处理后的字符串
    return 0;
}

1138:将字符串中的小写字母转换成大写字母

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

int main()
{
    char s[105];
    fgets(s, 105, stdin); // 获取输入的字符串,包括空格
    int len = strlen(s) - 1; // 减去换行符的长度
    for(int i = 0; i < len; ++i)
    {
        if(s[i] >= 'a' && s[i] <= 'z') // 判断字符是否是小写字母
            s[i] = s[i] + 'A' - 'a'; // 转换为大写字母
    }
    printf("%s", s); // 输出处理后的字符串
    return 0;
}

文章来源:https://blog.csdn.net/weixin_44738632/article/details/134975381
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。