Help us understand the problem. What is going on with this article?

ABC 過去問で始める競技プログラミング #4

ABC 過去問で始める競技プログラミングの第四回です。
前回の記事はこちらです。
今回は新しい型 char の紹介をします。

0. 型について

第一回で整数を宣言するときに int 第二回で文字列を宣言するときに string という言葉を使いました。それを 「 型 」 と呼びます。 int なら int 型、 string なら string 型です、そのままですね。
ここで、今までに出てきた中で型の種類を説明せずにきたものがあります。
それは文字列 S の i 文字目を指す、 S [ i ] です。実はこれは char という型です。 ( character からきています。 )
char 型は一文字を表す型です。 string は文字列ですが char には一文字しか入れられません。
何がうれしいかはいったん置いておいて、さっそく使っていきましょう。

1. ABC038-A お茶

問題へのリンクはこちら。
https://atcoder.jp/contests/abc038/tasks/abc038_a

与えられた文字列の最後の文字が T であるかを判定する問題ですね。
解答例を見てみましょう。

#include<bits/stdc++.h>
using namespace std;
int main(){
    string S;
    cin >> S;
    if(S [ S.size() - 1 ] == 'T' ){
        cout << "YES" << endl;
    }
    else{
        cout << "NO" << endl;
    }
}

初出のものがふたつありますね。
ひとつずつ解説します。

S.size() は文字列 S の長さを取得することができます。例えば S = "AtCoder" のとき、 S.size() は 7 になります。つまり S [ S.size() - 1 ] は文字列 S の最後の文字を表しています。

次に 'T' ですが、これは char 型の文字を表す方法で '' で括ります。 string 型では "" で char 型では '' です。間違えないようにしてください。

ここで仮に 'T' を "T" としていたとすると、 if 文の条件式の左辺は char 型、右辺は string 型となり比較することができずエラーとなってしまいます。このように C++ では型はかなり重要なのでしっかり抑えましょう。

2. ABC151-A Next Alphabet

問題へのリンクはこちら。
https://atcoder.jp/contests/abc151/tasks/abc151_a

与えられた英小文字のアルファベット順で次の文字を出力する問題です。
a から y まで 25 通りの全ての文字に対して場合わけをしても書けますがここで char 型があると楽ができます。
解答例を見てみましょう。

#include<bits/stdc++.h>
using namespace std;
int main(){
    char C;
    cin >> C;
    C = C + 1;
    cout << C << endl;
}

はい、これだけです。
ひとつずつ見ていきましょう。

    char C;

これは char 型の変数の宣言です。これによって C という名前の一文字を用意します。 ( 注意ですがこの C は変数の名前としての C であって、 アルファベットの 'C' を表しているわけではないです。 )
そして cin で C に入力をした次の操作。

    C = C + 1;

C は char 型で文字を表しているのに足し算をしていますね。
これはどういうことなのでしょうか。
実は char 型は文字を表していますが、その表し方には ASCII コードというものが用いられています。
こちらのサイトなどを見ていただくとわかると思いますが、文字を数値で表しているのです。そして英小文字のところを見てください。アルファベット順に並んでいますよね。つまり、 ASCII 文字コードで表された英小文字に 1 を足してあげるだけで、アルファベット順で次の文字を表すことができるのです。

これが char 型を使うメリットと言えるでしょう。
ではこれを利用してもう一問考えてみましょう。

3. ABC059-A Three-letter acronym

問題へのリンクはこちら。
https://atcoder.jp/contests/abc059/tasks/abc059_a

与えられた三つの文字列の先頭の文字を大文字にした上でそれぞれ出力する問題です。
大文字にする操作が鍵になってきます。
解答例はこのようになります。

#include<bits/stdc++.h>
using namespace std;
int main(){
    string s1, s2, s3;
    cin >> s1 >> s2 >> s3;
    char c1 = s1 [ 0 ] + ('A' - 'a'), c2 = s2 [ 0 ] + ('A' - 'a'), c3 = s3 [ 0 ] + ('A' - 'a'); 
    cout << c1 << c2 << c3;
}

三つの文字列を入力するところまでは理解できると思います。問題は次の行ですね。
まず、変数は宣言と同時に初期化というものができます。
たとえば N という整数を用意してそれの最初の値を 0 にしたいときに使えます。

#include<bits/stdc++.h>
using namespace std;
int main(){
    int N = 0;
}

このように宣言と同時に値を与えることを初期化と言います。

前の解答例では char 型三つを宣言すると同時に初期化しているわけですね。
ではどのように初期化しているのでしょうか。
先ほどの ASCII コード表を見ていただくとわかるように、英大文字もアルファベット順に並んでいます。
つまり A と a の差を小文字の char 型に足すことで大文字に変換することができるということです。
それを使って s1, s2, s3 それぞれの文字列の先頭の文字を大文字に変換したものを c1, c2, c3 として初期化しています。
これも char 型が数値で表されているからできることですね。ありがたいです。

4. ABC051-a Haiku

問題へのリンクはこちら。
https://atcoder.jp/contests/abc051/tasks/abc051_a

長さ 19 の文字列を受け取り、 6 文字目と 14 文字目を ' ' ( 空白 ) にする問題です。
解答例を見てみましょう。

#include<bits/stdc++.h>
using namespace std;
int main(){
    string s;
    cin >> s;
    s [ 5 ] = ' ';
    s [ 13 ] = ' ';
    cout << s << endl;
}

ここで初出なのは次のところですね。

    s [ 5 ] = ' ';

これは s の 6 文字目 ( コンピュータでは 5 文字目 ) に ' ' ( 空白 ) を代入する操作です。 ( = の意味を思い出してください。 )
それまでは ',' が入っていたところに代わりに ' ' を入れるという操作になります。これにより文字の置き換えができます。
これは今後配列が出てきたときも同じような考え方になるのでマスターしてください。


今回はここでおしまいにします。
お付き合いいただきありがとうございました。
char 型の扱いについて理解ができたでしょうか。

では関連問題を。
ABC013-A A
ABC060-A Shiritori

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした