世の中にはプログラミングのスキル(解けるまでの時間やプログラムの処理効率、プログラムが使用するメモリ等のリソース効率)を競うことを目的とした「競技プログラミング」というジャンルがあるのですが、その競技プログラミングで特に有名なサイトとしてAtCoder(アットコーダー)というサイトがあります。
毎週コンテストが開催され、Google、Amazon、Microsoftやトヨタ、ソニーなど名だたる有名企業が協賛としてコンテスト上位者へ景品を贈呈したりしています。
興味がある方は以下をご覧ください。
ただし、こちらのサイトのプログラミングコンテストの問題は正直かなり難しく、とても素人が参加してランキング上位に入れるようなものではありません。おそらく世界中の本格的なプログラマーが多数参加していると思われます。
ではなぜそんな難しすぎるAtCoderを紹介したのかと言いますと、このAtCoderがプログラミング初心者を対象とした無料のプログラミング学習用サイトを提供してくれていて、「C++(シープラスプラス)」と「Python(パイソン)」の2種類のプログラミング言語を学ぶことが出来ます。
どちらのプログラミング言語が優れているという訳ではないのですが、「C++」の方がより解説が細かく丁寧で、練習問題の数も多く用意されていますので、今回はこのAtCoderの「C++」学習サイト(C++入門 AtCoder Programming Guide for beginners(APG4b))を進めてみようと思います。
まずは以下のサイトへアクセスしてください。(「Python」についてもいつか解説したいと思います)
※サイト名が長いのでインターネットで検索する際は「APG4b」と検索すると見つけやすいです。
このサイトは中学生以上のプログラミング初心者を対象としていると書かれていますが、全体的に難易度高めですし、第1章~第4章まであって問題数もかなり多いので全部やろうとするとかなり疲れます。
第1章だけでもプログラミングの基礎をしっかり学べるので、今回は第1章を解説していきます。
いきなり解説を読むのではなく、なるべく自分で問題を解いてみて、どうしても分からない時に解説を読むようにしてください。
アカウント新規登録
まずは画面右上の「新規登録」をクリックしてアカウントを作成しましょう。
-1024x459.png)
必要事項を入力し、画面下の「新規登録」をクリックすればアカウント作成完了です。
なお、ここで入力したユーザ名とパスワードは今後ログインの際に毎回入力するので忘れないようにしましょう。

第1章 進め方
アカウントの新規登録が完了すると自動的にログインした状態になるので、そのまま第1章を「1.00 はじめに」~「1.15.関数 | EX15」まで順番に進めていきます。
おそらく進めていく中で、前のページを読み返したくなることも多いと思うので、以下の最初の目次は残しておいて、それぞれのページは別のタブで開くことをお勧めします。
別のタブで開くにはキーボードのCtrlキーを押したまま各ページをクリックすると開けます。

1.00.はじめに
1.00.はじめに
基本的に各ページのプログラミングに関する内容は丁寧に説明が書いてあるので、ここで再度同じことを説明することはしません。
ここでは関連する補足説明やAtCoderのサイトの使い方に関する操作方法、演習問題の考え方と解答を説明していきます。
まずは各ページのプログラミングに関する内容をしっかりと読んで理解してください。
1.01以降で書かれている「細かい話」については、出来れば読んだ方が良いですが、読まなくても演習問題を解き進めることは出来ますので「説明が長くてこれ以上読むのが辛い!」という人は飛ばしても大丈夫です。
以下は1.00「はじめに」に書かれているプログラムの提出方法の実際の操作です。
サンプルのプログラムがあるので右上のCopyボタンをクリックしてコピーし、画面下の言語の中から「C++20(gcc12.2)」を選択したあと、ソースコードというところに先ほどコピーしたサンプルプログラムを貼り付けて「人間であることを確認します」のチェックを☑にして提出ボタンをクリックします。
「自分の提出」という画面に緑色のACが表示されればクリアです。提出結果の右端の「詳細」ボタンをクリックすると提出したプログラムの中身を確認することが出来ます。

1.01.出力とコメント
1.01.出力とコメント
ここのページに書かれている内容の「コメント」について補足します。
AtCoderの説明の中でも多少書いてありますがコメントの本来の目的はプログラムを読む人に対するメモ書きの役割で、分かりにくいプログラムを解読する際のヒントとなります。一人だけで完結するプログラミング練習のためのプログラムであればコメントはなくても良いですが、本格的なアプリやシステム開発の場合は通常複数人で行うため、自分が書いたプログラムを他の人が読むこともあります。その時にコメントが何も書かれていないとプログラムの中身を読み解くのはかなり大変になるので出来るだけ分かりやすく丁寧なコメントを書く癖を付けましょう。
またAtCoderの説明の中で「コメントアウト」についても書かれていますが、プログラミングではしょっちゅうエラーが発生します。エラーが発生したときはエラーの原因を見つけて修正する作業(デバッグと言います)が必要になりますが難しいプログラムになる原因がすぐに見つからないこともあります。
その時はプログラムの中身を処理ごとにいくつかに区切って考え、エラー原因が疑われる部分をコメントアウトした状態で試しに実行して結果がどうなるか実験していくとエラー原因の切り分けがスムーズに行えるので、普段からエラーが起きたときは上手にコメントアウトをして原因を見つける癖を付けましょう。
EX1 – コードテストと出力の練習
EX1 – コードテストと出力の練習
コードテストとは問題を提出する前に予めプログラムを試験的に実行して検証を行う際に使用します。
特に「1.05.プログラムの実行順序と入力」以降で非常によく使うので使い方を覚えておきましょう。
(詳しくは付録1.コードテストの使い方を読んでください)
画面上の「コードテスト」をクリックするとコードテストの画面を開くことが出来ます。

この問題は特に解説する必要もない気がしますが、サンプルプログラムの出力の行(5行目~7行目)のどこか1行削除し残った2行を以下のように書き換えましょう 。
cout << “こんにちは” << endl;
cout << “AtCoder” << endl;
EX1 – コードテストと出力の練習:解答
#include <bits/stdc++.h>
using namespace std;
int main() {
cout << "こんにちは" << endl;
cout << "AtCoder" << endl;
}
1.02.プログラムの書き方とエラー
1.02.プログラムの書き方とエラー
ここのページに書かれている内容の「インデント」について補足します。
インデントを適切に設定しプログラムを見やすく書くこと(可読性と言います)は、ただ綺麗で読みやすいというだけでなく、予期せぬエラーを防ぐ意味でも非常に重要です。
例えばもう少しあとのページで学習しますが、条件分岐やループの文は { から始まり } で終わる構文です。この始まりの { と終わりの } に対してインデントを適切に設定していないと、どの { と、どの } がペアなのか分かりにくく条件分岐やループの範囲を間違えやすくなります。
「プログラムなんて動けばいいじゃん」という考えではプログラミングはなかなか上達しませんので、綺麗なプログラムを書く癖をつけましょう。
以下はインデントが綺麗に設定されているプログラム(上)と汚く設定されているプログラム(下)の例です。
どちらも実行すると、「おはようございます」「こんにちは」「こんばんは」と3行表示されますが、上のプログラムの方が下のプログラムより左が揃っていて綺麗な感じがしませんか?
(プログラムの詳細な内容については現時点で理解できなくて大丈夫です)


また、エラーについてですが、AtCoderの説明に書かれている以下3種類のエラーは提出するとそれぞれオレンジ色の以下の記号で表示されます。
・コンパイルエラー CE
・実行時エラー WA
・論理エラー RE
説明に書かれていないエラーとして無限ループなどいつまで経っても処理が終わらないプログラムの場合、提出するとオレンジ色の以下の記号で表示されます。
・実行制限時間超過エラー TLE

あと、数か月に1度程度の頻度でたまに発生するエラーとして、AtCoderのサーバー側が何かしらの理由(サーバーダウンやアクセス集中など高負荷の場合など)で提出しても応答しない場合があります。
このような場合はユーザ側ではどうすることも出来ないので時間をしばらく空けてから再度実行するようにしましょう。
EX2 – エラーの修正
EX2 – エラーの修正
この問題は以下の4か所(赤文字で書かれた部分)にエラーがあります。

EX2 – エラーの修正:解答
#include <bits/stdc++.h>
using namespace std;
int main() {
cout << "いつも" << 2525 << endl;
cout << "AtCoderくん" << endl;
}
1.03.四則演算と優先順位
1.03.四則演算と優先順位
ここのページに書かれている内容については特に補足説明することはありません。
C++では「整数同士の割り算は小数点以下切り捨て」と書かれていますが、プログラミング言語によって「小数点以下切り上げ」や「四捨五入」や「整数ではなく小数点も含めた値とする」など、プログラミング言語ごとに異なる結果になるので新しいプログラミング言語を学習するときは整数型における小数の扱いについて注意しましょう。
EX3 – 計算問題
EX3 – 計算問題
この問題は以下のように問題文に書かれている順番で計算をしようとするとゼロになってしまいます。
cout << 1 / 2 * 100 * (100 + 1) << endl;
これは左から計算が実行されるので先に 1 / 2 が実行されて、0.5の小数が切り捨てられてゼロになってしまうためです。小数が発生しないようにするため 1 / 2 を計算の右側へ移動しましょう。
(詳しくは「1.03.四則演算と優先順位」の「注意点」を確認してください)
EX3 – 計算問題:解答
#include <bits/stdc++.h>
using namespace std;
int main() {
cout << 100 * (100 + 1) * 1 / 2 << endl;
}
長くなってきたので、今回はここで終わりにします。
次回は「1.04.変数と型」から続きを進めて行きましょう。
お疲れさまでした。
1つ後の記事>>
コメント