PTA - C编程 NoB - 字符串 (12道题)

7-1 统计大写辅音字母
7-2 统计字符出现次数
7-3 字符串逆序
7-4 字符串字母大小写转换
7-5 查找指定字符
7-6 字符串转换成十进制整数
7-7 输出大写英文字母
7-8 删除重复字符
7-9 字符串替换
7-10 字符转换
7-11 字符串循环左移
7-12 Q进制转换成T进制

所有题目都只需要 #include <stdio.h>,不每个都写了。 

7-1 统计大写辅音字母 (15 分)

英文辅音字母是除AEIOU以外的字母。本题要求编写程序,统计给定字符串中大写辅音字母的个数。

输入格式:

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

输出格式:

输出在一行中给出字符串中大写辅音字母的个数。

输入样例: HELLO World!

输出样例: 4

int main()
{
    char ch;
    int cnt = 0;
    while((ch = getchar()) != '\n')   // "!=" 优先级比 "=" 高,所以需要小括号
        if(ch >= 'B' && ch <= 'Z' && ch != 'E' && ch != 'I' && ch != 'O' && ch != 'U')
            ++cnt;
    printf("%d\n", cnt);
    return 0;
}

7-2 统计字符出现次数 (20 分)

本题要求编写程序,统计并输出某给定字符在给定字符串中出现的次数。

输入格式:

输入第一行给出一个以回车结束的字符串(少于80个字符);第二行输入一个字符。

输出格式:

在一行中输出给定字符在给定字符串中出现的次数。

输入样例:

programming is More fun!
m

输出样例: 2

int main()
{
    int cur = 0, cnt = 0;
    char str[80];
    char ch, target;
    while((ch = getchar()) != '\n')    // 因为是后输入要找的字符,所以只能先全读到字符数组中
        str[cur++] = ch;
    scanf("%c", &target);
    for(int i = 0; i < cur; i++)
        if(target == str[i])
            ++cnt;
    printf("%d\n", cnt);
    return 0;
}

7-3 字符串逆序 (15 分)

输入一个字符串,对该字符串进行逆序,输出逆序后的字符串。

输入格式:

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

输出格式:

在一行中输出逆序后的字符串。

输入样例:

Hello World!

输出样例:

!dlroW olleH
int main()
{
    int cur = 0;
    char str[81], ch;
    while((ch = getchar()) != '\n')
        str[cur++] = ch;
    for(int i = cur - 1; i >= 0; i--)
        printf("%c", str[i]);
    return 0;
}

7-4 字符串字母大小写转换 (15 分)

本题要求编写程序,对一个以“#”结束的字符串,将其小写字母全部转换成大写字母,把大写字母全部转换成小写字母,其他字符不变输出。

输入格式:

输入为一个以“#”结束的字符串(不超过30个字符)。

输出格式:

在一行中输出大小写转换后的结果字符串。

输入样例:

Hello World! 123#

输出样例:

hELLO wORLD! 123
int main()
{
    char ch;
    while((ch = getchar()) != '#')
    {
        if(ch >= 'a' && ch <= 'z')      printf("%c", ch + 'Z' - 'z');
        else if(ch >= 'A' && ch <= 'Z') printf("%c", ch - 'Z' + 'z');
        else                            printf("%c", ch);
    }
    return 0;
}

7-5 查找指定字符 (15 分)

本题要求编写程序,从给定字符串中查找某指定的字符。

输入格式:

输入的第一行是一个待查找的字符。第二行是一个以回车结束的非空字符串(不超过80个字符)。

输出格式:

如果找到,在一行内按照格式“index = 下标”输出该字符在字符串中所对应的最大下标(下标从0开始);否则输出"Not Found"。

解:

    需要注意的是,用getchar(),把第一行后边的空格读掉。 

int main()
{
    char ch, target;
    int idx = -1, cur = 0;
    scanf("%c", &target);
    getchar();
    while((ch = getchar()) != '\n')
    {
        if(ch == target)  idx = cur;
        ++cur;
    }
    if(idx == -1) printf("Not Found\n");
    else          printf("index = %d\n", idx);
    return 0;
}

7-6 字符串转换成十进制整数 (15 分)

输入一个以#结束的字符串,本题要求滤去所有的非十六进制字符(不分大小写),组成一个新的表示十六进制数字的字符串,然后将其转换为十进制数后输出。如果在第一个十六进制字符之前存在字符“-”,则代表该数是负数。

输入格式:

输入在一行中给出一个以#结束的非空字符串。

输出格式:

在一行中输出转换后的十进制数。题目保证输出在长整型范围内。

输入样例:

+-P-xf4+-1!#

输出样例:

-3905

解:

    这道题要判断每个字符是不是16进制字符,因为不区别大小写,所以需要判断三种情况,还需要判断 '-' 是不是出现在第一个十六进制字符前边。判断好这两个就解决了。

int main()
{
    int flaghex = 0, minus = 0;  // 是否已经出现过16进制字符,是否是负数
    int sum = 0;
    char ch;
    while((ch = getchar()) != '#')
    {
        if(ch >= '0' && ch <= '9')
        {
            flaghex = 1;
            sum = sum * 16 + (ch - '0');
        }
        else if(ch >= 'a' && ch <= 'f')
        {
            flaghex = 1;
            sum = sum * 16 + (ch - 'a') + 10;
        }
        else if(ch >= 'A' && ch <= 'F')
        {
            flaghex = 1;
            sum = sum * 16 + (ch - 'A') + 10;
        }
        else if(ch == '-' && flaghex == 0)  // '-'出现在第一个十六进制数前边
            minus = 1;
    }
    if(minus == 1) printf("%d\n", -sum);
    else           printf("%d\n",  sum);
    return 0;
}

7-7 输出大写英文字母 (15 分)

本题要求编写程序,顺序输出给定字符串中所出现过的大写英文字母,每个字母只输出一遍;若无大写英文字母则输出 “Not Found”。

输入格式:

输入为一个以回车结束的字符串(少于80个字符)。

输出格式:

按照输入的顺序在一行中输出所出现过的大写英文字母,每个字母只输出一遍。若无大写英文字母则输出“Not Found”。

解:

    只需要用一个数组记录一下26个字母是否出现过就行了。

int main()
{
    static int alp[26];   // 全部初始化为0,表示26个字母是否出现过
    int flag = 0;         // 为判断 Not Found
    char ch;
    while((ch = getchar()) != '\n')
    {
        if(ch > 'Z' || ch < 'A') continue;  // 不是就跳过
        if(alp[ch - 'A'] == 0)  // 还没出现过
        {
            printf("%c", ch);
            alp[ch - 'A'] = 1;
            flag = 1;
        }
    }
    if(flag == 0) printf("Not Found\n");
    return 0;
}

7-8 删除重复字符 (20 分)

本题要求编写程序,将给定字符串去掉重复的字符后,按照字符ASCII码顺序从小到大排序后输出。

输入格式:

输入是一个以回车结束的非空字符串(少于80个字符)。

输出格式:

输出去重排序后的结果字符串。

输入样例:

ad2f3adjfeainzzzv

输出样例:

23adefijnvz

    每次读进来一个字符,在已经存起来的数组里边找并找合适位置插入,如果找到了相同的,就跳过,因为重复了。

int main()
{
    char res[82], ch;
    int cur = 0;
    while ((ch = getchar()) != '\n')
    {
        int flag = 0;            // 判断是否出现过,或者成功插入了
        for (int i = 0; i < cur; i++)
        {
            if (res[i] == ch)    // 出现过,直接跳过
            {
                flag = 1;
                break;
            }
            if (res[i] > ch)     // ascii 码的比较, 插入在这个位置前边
            {
                for (int j = cur; j > i; j--)    // i右边所有元素右移一位
                    res[j] = res[j - 1];
                res[i] = ch;     // ch 插入到i位置
                ++cur;           // res大小加一
                flag = 1;
                break;
            }
        }
        if (flag == 0)           // 没有出现过,而且res里都比ch小
            res[cur++] = ch;     // res大小加一
    }
    // 按序输出res即可
    for (int i = 0; i < cur; i++)
        printf("%c", res[i]);
    return 0;
}

7-9 字符串替换 (15 分)

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

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

输入格式:

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

输出格式:

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

解:

    用一个26大小数组表示字母表,比如 alp[1] 就代表 ‘B’ ,然后如果是大小英文字母,就把他对应的位置 i 变成 25 - i 就行了,对应位置上就是他要变成的大小字母。

int main()
{
    char alp[27] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";	// 最后一位是 '\0'
    char ch;
    while ((ch = getchar()) != '\n')
    {
        if (ch >= 'A' && ch <= 'Z')
            printf("%c", alp[25 - (ch - 'A')]);
        else
            printf("%c", ch);
    }
    return 0;
}

7-10 字符转换 (15 分)

本题要求提取一个字符串中的所有数字字符('0'……'9'),将其转换为一个整数输出。

输入格式:

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

输出格式:

在一行中输出转换后的整数。题目保证输出不超过长整型范围。

输入样例:

free82jeep5

输出样例:

825
int main()
{
    int sum = 0;
    char ch;
    while ((ch = getchar()) != '\n')
        if(ch >= '0' && ch <= '9')
          sum = sum * 10 + (ch - '0');
    printf("%d\n", sum);
    return 0;
}

7-11 字符串循环左移 (20 分)

输入一个字符串和一个非负整数N,要求将字符串循环左移N次。

输入格式:

输入在第1行中给出一个不超过100个字符长度的、以回车结束的非空字符串;第2行给出非负整数N。

输出格式:

在一行中输出循环左移N次后的字符串。

输入样例:

Hello World!
2

输出样例:

llo World!He

读入字符串,然后先输出后半部分,在输出前半部分就行了。

int main()
{
    char str[101], ch;
    int cur = 0, N;
    while ((str[cur++] = getchar()) != '\n');
    --cur;        // 最后的 '\n' 被读进来,要扔掉
    scanf("%d", &N);
    N %= cur;
    // 先输出后边的,然后输出前边的
    for (int i = N; i < cur; i++)   printf("%c", str[i]);
    for (int i = 0; i < N; i++)     printf("%c", str[i]);
    return 0;
}

7-12 Q进制转换成T进制 (20 分)

给定一个整数Q(2<=Q<=10),一个非空字符串,以及另一个整数T(2<=T<=10), 编程要求过滤掉字符串中所有非Q进制数对应的字符组成一个新的字符串,该字符串无正负号,将该字符串表示的Q进制数转换为T进制数的字符串输出。

输入格式:

第一行输入一个整数Q, 代表Q进制(2<=Q<=10)

第二行输入以回车结束的一行非空字符串。

第三行输入一个整数T, 代表要转换成T进制

输出格式:

输出转换后的T进制数字符串。

输入样例:

10
15
2

输出样例:

1111

解:

    这道题两个进制都是 2 到 10 之间所以难度不大,如果有16进制这种的,就会麻烦一些了。

int main()
{
    int Q, T, sum = 0;
    scanf("%d", &Q);
    getchar();      // 要读掉回车
    char ch;
    while ((ch = getchar()) != '\n')
        if (ch >= '0' && ch <= ('0' + Q - 1))  // 其他字符都过滤掉,2进制可取值为0和1,没有2
            sum = sum * Q + (ch - '0');        // sum为Q进制转为10进制
    if (sum == 0)
    {
        printf("0\n");
        return 0;
    }
    scanf("%d", &T);
    if (T == 10)    // 转成十进制的话直接输出就行
    {
        printf("%d\n", sum);
        return 0;
    }
    // 下面是10进制数sum转为T进制
    int cur = 0, a[100000];
    while (sum != 0)
    {
        a[cur++] = sum % T;
        sum /= T;
    }
    for (int i = cur - 1; i >= 0; i--)
        printf("%d", a[i]);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Bob__yuan/article/details/84864558