プログラマの考え方がおもしろいほど身につく本  問題解決能力を鍛えよう!

現在のプログラミング教育は、問題解決に関する十分な指針を示していない。プログラマにツールを与えて、プログラムを書かせれば、いつかきっと上手にプログラムを書けるようになるだろう、という前提のプログラミング教育である。これはこれで正しいところもある。しかし、「いつかきっと」は相当先のことだ。入門者が悟りを開くまでの道のりは長く、フラストレーションに満ちあふれている。そして多くの人が、目的地にたどり着くことなく、途中であきらめてしまうのである。

試行錯誤ではなく、もっと体系的な手順で問題解決能力を身につける方法がある。本書の目的はまさにそこだ。本書では、自分の考えをまとめるテクニック・解決方法を発見する手順・特定の問題に適用する戦略などを学ぶことができる。こうした手法を学べば、自分の創造性を解き放つことができる。プログラミングはクリエイティブな活動である。問題解決は特にそうだ。創造性という言葉は神秘的で、その機能をきちんと説明できる人はいない。作曲・執筆・絵画などを学べば、プログラミングの問題も創造的に解決できることがわかるだろう。本書は「何をすべきか」を詳細に説明した本ではない。あなたが持つ問題解決の潜在能力を引き出して、何をすべきかを見つけ出すためのものだ。つまり、あなたをプログラマとしてあるべき姿へと導く本だ。

読者のみなさんには、プログラミングのタスクをこなす体系的な手法を身につけてほしい。そして、与えられた問題を自信を持って解決できるようになってほしい。本書を読み終えれば、プログラマのように考え(think like a programmer)、自分がプログラマであると確信できるようになるだろう。

(「イントロダクション」より)

謝辞 イントロダクション 本書について

第1章 問題解決の戦略

1.1 古典的な問題 1.1.1 狐・ガチョウ・トウモロコシ 1.1.2 スライドパズル 1.1.3 数独 1.1.4 Quarrasi ロック

1.2 一般的問題解決テクニック 1.2.1 常に計画を持て 1.2.2 問題を言い換える 1.2.3 問題を分割する 1.2.4 知っていることから始める 1.2.5 問題を簡略化する 1.2.6 類似点を探す 1.2.7 実験する 1.2.8 イライラしない

1.3 演習

第2章パズル

2.1 本章で使うC++のおさらい 2.2 パターンの出力 2.3 入力の処理 2.3.1 問題をかみ砕く 2.3.2 パーツを取りまとめる 2.4 状態の追跡 2.5 結論 2.6 演習問題

第3章配列による問題解決

3.1 配列のおさらい 3.1.1 保存 3.1.2 コピー 3.1.3 取得と検索 3.1.4 ソート 3.1.5 統計処理 3.2 配列を使った問題解決 3.2.1 リファクタリング 3.3 固定データの配列 3.4 非スカラー型配列 3.5 多次元配列 3.6 いつ配列を使うのか 3.7 演習問題

第4章ポインタと動的メモリによる問題解決

4.1 ポインタのおさらい 4.2 ポインタの利点 4.2.1 データ構造のサイズを実行時に決定できる 4.2.2 データ構造のサイズを変更できる 4.2.3 メモリを共有できる 4.3 いつポインタを使うのか 4.4 メモリ重要 4.4.1 スタックとヒープ 4.4.2 メモリのサイズ 4.4.3 生存期間 4.5 ポインタの問題の解決 4.5.1 可変長文字列 4.5.2 連結リスト 4.6 結論と次のステップへ 4.7 演習問題

第5章クラスによる問題解決 5.1 クラスのおさらい 5.2 クラスを使う目的 5.2.1 カプセル化 5.2.2 コードの再利用 5.2.3 問題の分割 5.2.4 情報隠ぺい 5.2.5 読みやすさ 5.2.6 表現力 5.3 シンプルなクラスの構築 5.3.1 基本的なクラスフレームワーク 5.3.2 サポートメソッド 5.4 クラスと動的データ 5.4.1 ノードの追加 5.4.2 リストの整列 5.4.3 デストラクタ 5.4.4 ディープコピー 5.4.5 動的メモリを使ったクラスの全体像 5.5 回避すべきミス 5.5.1 フェイククラス 5.5.2 シングルタスク 5.6 演習問題

第6章再帰による問題解決 6.1 再帰のおさらい 6.2 先頭再帰と末尾再帰 6.2.1 第一の方法 6.2.2 第二の方法 6.2.3 第一の方法 6.2.4 第二の方法 6.3 再帰大作戦 6.4 ありがちな間違い 6.4.1 パラメータが多すぎる 6.4.2 グローバル変数 6.5 再帰の動的データ構造への適用 6.5.1 再帰と連結リスト 6.5.2 再帰と二分木 6.6 ラッパー関数 6.7 いつ再帰を使うのか 6.7.1 再帰に関する批判 6.8 演習問題

第7章コードの再利用による問題解決 7.1 よい再利用・悪い再利用 7.2 コンポーネントのおさらい 7.2.1 コードブロック 7.2.2 アルゴリズム 7.2.3 パターン 7.2.4 抽象データ型 7.2.5 ライブラリ 7.3 コンポーネントの知識を増やす 7.3.1 調査学習 7.3.2 随時学習 7.4 コンポーネントの選択 7.4.1 コンポーネントの選択の実例 7.4.2 結果の比較 7.5 演習問題

第8章プログラマの考え方 8.1 自分自身の基本計画を作る 8.1.1 自分の強みや弱みと向き合う 8.1.2 基本計画をまとめる 8.2 あらゆる問題に立ち向かう 8.2.1 ズルをする方法を考える 8.2.2 ハングマンでズルをするために必要な操作 8.2.3 最初の設計 8.2.4 最初のコーディング 8.2.5 最初のバージョンの分析 8.2.6 問題解決の極意 8.3 新しいプログラミングスキルを身につける 8.3.1 新しい言語 8.3.2 自分が知っている言語に関する新たなスキルを学ぶ 8.3.3 新しいライブラリを学ぶ 8.3.4 クラスに参加する 8.4 結論 8.4.1 補足:reduceByPattern 関数 8.5 演習問題