PTA-CプログラミングNoB-文字列(12題)

7051 ワード

7-1
統計大文字と小文字
7-2
統計文字の出現回数
7-3
文字列の逆順序
7-4
文字列の大文字と小文字の変換
7-5
指定文字の検索
7-6
文字列を10進数に変換
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()) != '
') // "!=" "=" , if(ch >= 'B' && ch <= 'Z' && ch != 'E' && ch != 'I' && ch != 'O' && ch != 'U') ++cnt; printf("%d
", cnt); return 0; }

7-2統計文字出現回数(20分)
int main() {
    int cur = 0, cnt = 0;
    char str[80];
    char ch, target;
    while((ch = getchar()) != '
') // , str[cur++] = ch; scanf("%c", &target); for(int i = 0; i < cur; i++) if(target == str[i]) ++cnt; printf("%d
", cnt); return 0; }

7-3文字列逆シーケンス(15分)
int main() {
    int cur = 0;
    char str[81], ch;
    while((ch = getchar()) != '
') 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()) != '
') { if(ch == target) idx = cur; ++cur; } if(idx == -1) printf("Not Found
"); else printf("index = %d
", idx); return 0; }

7-6文字列を10進数整数(15分)に変換
この問題では、各文字が16進数文字かどうかを判断し、大文字と小文字を区別しないため、3つの状況を判断する必要があります.また、'-'が最初の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
", -sum); else printf("%d
", sum); return 0; }

7-7大文字英字(15点)を出力
26文字が現れたかどうかを1つの配列で記録すればいいだけです.
int main() {
    static int alp[26];   //       0,  26        
    int flag = 0;         //     Not Found
    char ch;
    while((ch = getchar()) != '
') { 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
"); return 0; }

7-8重複文字の削除(20点)
 
1文字を読むたびに、すでに保存されている配列の中で適切な位置を探して挿入し、同じものを見つけたらスキップします.重複しているからです.
int main() {
    char res[82], ch;
    int cur = 0;
    while ((ch = getchar()) != '
') { 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()) != '
') { 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()) != '
') if(ch >= '0' && ch <= '9') sum = sum * 10 + (ch - '0'); printf("%d
", sum); return 0; }

7-11文字列ループ左シフト(20分)
文字列を読み込んで、後半を出力し、前半を出力すればいいです.
int main() {
    char str[101], ch;
    int cur = 0, N;
    while ((str[cur++] = getchar()) != '
'); --cur; // '
' , 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進数とも2から10の間なので難しくないので、16進数というものがあれば、少し面倒になります.
int main() {
    int Q, T, sum = 0;
    scanf("%d", &Q);
    getchar();      //      
    char ch;
    while ((ch = getchar()) != '
') if (ch >= '0' && ch <= ('0' + Q - 1)) // ,2 0 1, 2 sum = sum * Q + (ch - '0'); // sum Q 10 if (sum == 0) { printf("0
"); return 0; } scanf("%d", &T); if (T == 10) { // printf("%d
", 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; }