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 ,不每个都写了。 

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

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 分)

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 分)

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 分)

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 分)

    需要注意的是,用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 分)

    这道题要判断每个字符是不是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 分)

    只需要用一个数组记录一下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 分)

 

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

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 分)

    用一个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 分)

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 分)

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

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 分)

    这道题两个进制都是 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;
}

 

你可能感兴趣的:(PTA)