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章 今まで説明していなかったこと

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

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

2.00.第2章について
2.01.ループの書き方
2.02.多重ループ
2.03.多次元配列
2.04.参照
2.05.再帰
2.06.計算量

3.00.第3章について
3.01.数値型
3.02.pairとtuple
3.03.構造体
3.04.STLのコンテナ
3.05.ビット演算
3.06.文字コード
3.07.条件演算子
3.08.グローバル変数と定数

4.00.第4章について
4.01.includeとdefineマクロ
4.02.名前空間
4.03.テンプレート
4.04.イテレータ

付録1.コードテストの使い方
付録2.提出結果の見方
付録3.典型エラー集
付録4.速習APG4b

意見募集中

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

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

プログラミングに詳しい人向けの説明

プログラミングに慣れた人がこの教材を見た時、色々思うところがあるかもしれません。
そこで、この教材がどのようなコンセプトで書かれているかを説明しておきたいと思います。

...

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

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

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

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

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

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

...

ここまで書いた段階で、まず議論に上がりそうな要素について触れておきます。

この教材では#include <bits/stdc++.h>とグローバル空間でのusing namespace std;を使っています。
保守する必要があり、集団開発を行っているような場合、この機能を使うことは許されないことが多いでしょう。

しかし、プログラミング入門で使われるような、短くて保守する必要のないプログラムではこれらを使うことによる問題がほとんど起きません。
もちろん影響はゼロではありませんが、それよりも「おまじない」的に用いられる部分が多くなってしまうことを避けるため、これらを使用することにしました。
(「おまじない」と言っていますが説明がないわけではありません。後で説明することを明記した上、教材の終盤で説明しています。)

また、細かい話ですが、main関数のreturnも省略しています。これも序盤における「おまじない」要素を減らすために行っています。(C++のmain関数では、returnを省略するとreturn 0;がコンパイル時に追加されます。)