AtCoder Programming Guide for beginners (APG4b)

AtCoder Programming Guide for beginners (APG4b)

プログラミング入門教材 AtCoder Programming Guide for beginners (APG4b)へようこそ。

対象読者

APG4bは中学生から社会人までのプログラミング初心者を対象としています。

多くの入門書とは異なり、APG4bは汎用的な「プログラミングの基礎」を学ぶことを目的としているため、プログラミングそのものに興味がある人から、アプリやゲームを作りたいと思っている人まで、最初のプログラミング教材としてオススメできます。

また、説明が丁寧に行われているので、「プログラミングの勉強を一度してみたが挫折してしまった」という人にもオススメです。

APG4bの特徴

APG4bの大きな特徴は、プログラムの説明に練習問題がついていること、そして練習問題の自動採点システムがあることです。

プログラミングの初学者のよくあるパターンとして、「入門書を読みながらそこに書いてあるプログラムをなんとなく写していたが、よくわからなくなってやめてしまう」というものがあります。
APG4bでプログラミングの学習を行えばその心配はありません。説明を読んだあと、練習問題を自分で考えてプログラムを書き、その正しさを採点システムで確認することで、着実にプログラムを書けるようになっていきます。

APG4bの取り組み方

AtCoderのアカウントを作成した後、このページの「参加登録」ボタンを押してください。

参加登録ができたら、下にある目次の「1.00.はじめに」から読み進めて行きましょう。

説明をしているページの一番下には練習問題がついています。説明を読み終えたら必ず練習問題を解きましょう。

目次

APG4bは大きく分けて以下の4つの章からできています。

第1章 基本文法
第2章 複雑な計算処理の書き方
第3章 競技プログラミングに役立つ知識
第4章 今まで説明していなかったこと

APG4bのメインコンテンツは1章と2章です。3章と4章はC++をより深く学びたい人や、競技プログラミングに取り組みたい人向けの説明が多くなっています。そのため、他にもっと学びたい言語がある人やアプリやゲームを作りたい人は、1章と2章まで終えたら他の教材に移っても良いです。

具体的な目次は以下のとおりです。

1.00.はじめに
1.01.出力とコメント | EX1
1.02.プログラムの書き方とエラー | EX2
1.03.四則演算と優先順位 | EX3
1.04.変数と型 | EX4
1.05.プログラムの実行順序と入力 | EX5
1.06.if文・比較演算子・論理演算子 | EX6
1.07.条件式の結果とbool型 | EX7
1.08.変数のスコープ | EX8
1.09.複合代入演算子 | EX9
1.10.while文 | EX10
1.11.for文・break・continue | EX11
1.12.文字列と文字 | EX12
1.13.配列 | EX13
1.14.STLの関数 | EX14
1.15.関数 | EX15

2.00.第2章について
2.01.ループの書き方と範囲for文 | EX16
2.02.多重ループ | EX17
2.03.多次元配列 | EX18
2.04.参照 | EX19
2.05.再帰関数 | EX20
2.06.計算量 | EX21

3.00.第3章について
3.01.数値型
3.02.pair/tupleとauto | EX22
3.03.STLのコンテナ | EX23
3.04.構造体 | EX24
3.05.ビット演算 | EX25
3.06.その他の機能 | EX26

4.00.第4章について
4.01.includeディレクティブ
4.02.名前空間
4.03.テンプレート
4.04.イテレータ
4.05.ポインタ

付録1.コードテストの使い方
付録2.提出結果の見方
付録3.コンパイルエラー集
付録4.ループの裏技repマクロ
付録5.速習APG4b

意見募集中

APG4bでは皆様のご意見をお待ちしております。
誤字・脱字等のご指摘はもちろん、わかりにくかったところや説明の改善案など、お気軽に送ってきてください。

ご意見は公式ツイッターアカウントへお願いします。


プログラミングに詳しい方へ

ここから先はプログラミング未経験者の方は読む必要がありません

APG4bは多くの一般的な教材とはいくつか違う点があるため、プログラミングに慣れた人がこの教材を見ると色々思うところがあるかもしれません。
ここではこの教材がどのようなコンセプトで書かれているかを説明した後、APG4bがなぜ一般的でないことをしているのかを説明します。

APG4bのコンセプト

プログラムとは何のためにあるのでしょうか?
「便利なアプリを作るため」「ゲームをつくるため」「『人工知能』をつくるため」など、色々あると思います。
これらの具体例は決して間違いではありませんが、プログラミングにはより根源的な用途があります。
それは「計算」です。

コンピュータが開発された当初、その用途は高度な電卓でした。
それから月日が流れ、様々な用途に応用されるようになっても、最終的にコンピュータが行っていることが計算であることには変わりません。
「スマホで友達にメッセージを送信する」「ゲームで当たり判定をする」「機械翻訳をする」等は全てコンピュータの高度な計算能力に支えられています。
そして、その計算をするコンピュータを動かすのがプログラムです。

このことを踏まえ、この教材は「計算のためのプログラミング」ということを意識して書かれています。
具体的には、「処理を一般化してループや配列を扱えるようになる」「再帰関数を扱えるようになる」ということを大きな目標にしています。
「データ構造とアルゴリズム」や「数値計算」の一歩手前くらいのイメージです。

この目標にできるだけ最短で到達するため、一般的な入門書で書かれることがある「プログラムの設計」のような話は意図的に省いています。
もちろん、設計はプログラミングの中でも一つの重要な要素ではありますが、「計算」という観点から言えば本質的ではありません。
また、C++に関する詳細な説明も省いています。この教材はC++に詳しくなることを目的としていないからです。

もしC++の詳細な知識や設計の知識が必要な場合は、この教材を終えた後、別の資料で勉強するのが良いと思っています。
それらの項目は「プログラムが書ける」ようになってから学んだほうが効率的に吸収できることもあるでしょう。

もちろん、全てのプログラミング初学者にとってこの教材が最適と言い切れるわけではありませんが、 ゲームエンジンの使い方を覚えたり、特殊なライブラリの仕様に惑わされたりすることなく、「プログラムを書ける」ところまで迅速に学べるようになっているこの教材は、多くの人にとって良いスタートになれると考えています。

オンラインコンパイラの推奨

APG4bではAtCoderのコードテスト、もしくはWandboxといったオンラインコンパイラの利用を推奨し、それを前提として書かれています。なぜそうしているかというと、プログラミング初学者はPCに不慣れな人が多く、環境構築が大きな負担になるからです。

プログラミングをはじめようと思った人の中には、環境構築で挫折してしまう人や、環境構築を苦労して終えたがそこで満足してやめてしまう人などが多くいます。 オンラインコンパイラの利用を標準にしておけばそういう人が出るのを防げますし、非本質的な作業をさせる前にプログラミング言語の解説や練習問題に入ることによって初学者のモチベーションを保ちやすいと考えています。

また、オンラインコンパイラを利用しているため、「コンパイラとは...」や「コンパイルするにはコマンドラインで...」等も最初の説明からは省いています。これらはAPG4bのコンセプト的に重要ではありませんし、初学者が最初にプログラムを書くまでの負担を減らすためです。

もちろんローカル環境で作業することにはそれなりのメリットもあるため、クラブ活動や会社等で周りの経験者が十分にサポートできる状況に限っては、環境構築を行うのも手です。
ただし、もしあなたが学習者に環境構築を行うように指示した場合は、オンラインコンパイラを使わないことによって起きる問題の解決にしっかりと協力するようにしてください。 協力することが出来ない場合は、指示はせずAPG4bの手順に従って学習させてください。

bits/stdc++.h の利用

APG4bでは全てのプログラムに#include <bits/stdc++.h>を冒頭に記述し、コピー&ペーストすることを推奨しています。これはコンパイルエラーが発生し学習が滞ることを防ぐためです。 コンパイルエラーは学習者の意欲を削ぐことに繋がるので、その原因を潰せるのに越したことはありません。また、APG4bのコンセプト的に重要でない#includeに関するしっかりとした解説を後回しにできるというメリットもあります。

#includeの詳細な解説は4章で行いますが、簡単な解説は1.01.出力とコメントの細かい話で行っています。

bits/stdc++.hに関するQ & A
  • Q. 他の環境で動かないので使うべきではないのでは?

    • A. APG4bでは指示通りに進めた場合オンラインコンパイラを利用するので、他の環境で動かないことによって問題が起きることはありません。また、インクルードパスの設定をすれば他の環境で動かすこともできます。ローカル環境で作業するよう指示した場合に関しては、上の「オンラインコンパイラの推奨」で書いたとおりです。
  • Q. C++標準で無い機能を利用すべきではないのでは?

    • A. インクルードパスを設定して自分で作成したstdc++.hファイルを使えばGCC以外でも利用できるので、少し便利なライブラリがある環境で作業しているような状況だと考えてください。それでも受け入れられない場合は、APG4bで扱っているのはC++ではなく「GCCのC++」だと認識してもらえれば結構です。
  • Q. コンパイルが遅くなるのでは?

    • A. 少なくともAPG4bや競技プログラミングで作られる規模のプログラムでは、体感できるほどコンパイルが遅くなることはありません。手元のコンピュータで計測してみてください。
  • Q. インクルードパスの設定はどうすれば良いか?

  • Q. インクルードパスの設定をしたくない/Clangで提出したい

using namespace std; の利用

APG4bでは全てのプログラムにusing namespace std;を冒頭に記述し、コピー&ペーストすることを推奨しています。これは学習者のタイプ数を可能な限り減らすためです。先程も言ったとおりプログラミング初学者はPCに不慣れな人が多く、タイピングもあまり速くないため、これは意外とメリットが大きいです。

名前の衝突が問題になると思う方もいるかもしれませんが、APG4bではグローバル変数を利用しないため、問題になることは基本的にありません。

main関数のreturnの省略

main関数のreturnは省略しています。C++のmain関数では、returnを省略すると自動的にreturn 0;がコンパイル時に追加されます。これはプログラム中から非本質的な部分を減らすために行っています。なお、main関数に関する詳細は1.15.関数で解説しています。

計算量の解説

APG4bでは計算量の解説も行っています。「計算のためのプログラミング」という観点では非常に重要な概念であり、全てのプログラミング学習者が知っておくべきことだと考えているため、C++特有の話が増えてくる3章より前の段階で解説しています。

repマクロの紹介

APG4bでは付録としてrepマクロを紹介しています。これは学習を進めていく上で読まなければいけないものという扱いではありませんが、プログラミング初学者にとって有益な情報であるため掲載しました。 repマクロの是非についてはrepマクロ解説ページに記載しているので、気になる方は読んでみてください。