▲「データ構造」の作り方が分かれば、プログラミングがすぐに上達します。

このエントリーをはてなブックマークに追加

僕は情報系の大学・大学院を卒業して、今は本業(不動産)兼CTO兼ITエンジニアとして兼業しています。iPhoneアプリを開発してAppleの審査を通して、Appleストアで自分のアプリを配信しました。僕としては、一人でも多くの方にプログラミングを出来るようになってもらいたいと思い、プログラミング教育に関する記事を書いています。

そんなプログラミングに「クリエイティブな能力」が必要と勘違いしている人がいますが、そのような能力は全く必要なく論理的に考えることが大切です。また、プログラムが作れない原因は、入り口の取っ掛かりで「何をしたら良いのか分からない。」というのが大半です。

プログラミングではじめにやることは、土台となる「データ構造」を作ることです。

この「データ構造」という言葉を知らない人は多いですが、プログラムをしている人は必ず「データ構造」を決めてからプログラミングしていきます。

目次

プログラムの土台「データ構造」とは?

言葉から「データ構造」は、「データの集まり」と連想していると思いますが、それは結果としてデータの集まりになっているだけで、ここでやっていることは現実の事象(とそのパターン)に対して意味づけしたデータが決められていることです。

例えて言えば、更地に家を建てる際に、何もないまっさらな土地のままいきなり家が立つわけではなく、土台となる基礎を作ってから家を立てていきます。プログラムでは、その土台となる基礎の役割が「データ構造」です。この説明で分からなくても、下の具体例で必ず分かるので心配しないで下さい。

サイバーリンク PowerDVD

「データ構造」を作る練習

大切なことは、事象(とそのパターン)を網羅して意味づけしてデータ(情報)として扱えるようにすることです。そして、そのデータに機能(振る舞い)を組み合わせ、現実世界の振る舞いを描写(プログラミング)します。

1.「じゃんけんゲーム」のデータ構造

じゃんけんゲームの「データ構造」を考えます。この時に、事象(とそのパターン)を精査します。それは、プレイヤー:「自分」「相手」の2パターン、手:「ぐー」「ちょき」「ぱー」の3パターンと、勝敗:「勝ち」「あいこ」「負け」の3パターンです。

a)「じゃんけんゲーム」のデータ構造の例
/* プレイヤー */
#define IAM 0 
#define CPU 1

/* 出し手 */
#define PA 0 
#define CHOKI 1
#define GU 2

/* 勝敗 */
#define LOSE 0 
#define TIE 1 /* 単語はDRAWでも何でも良い */
#define WIN 2

/* プレイヤー情報(自分or相手、手)を格納する構造体 */
typedef struct Player {
 int player;
 int te;
} Player;

ついでに機能(振る舞い)も考えてみます。プレイヤーの手に対して勝敗を判定する機能(あいこなら繰り返す機能)が必要です。以上が、プログラム化した「じゃんけんゲーム」です。これを「データ構造」としてプログラム(C言語)で表現すると下記になります。これがプログラミングの土台です。

b)「じゃんけんゲーム」の機能の例
int judge(Player p, Player cpu); /* 引数にプレイヤー情報を与えたらじゃんけんの勝敗が判定される。 */

2.「○✕ゲーム」(三目並べ)のデータ構造

次は、○✕ゲームの「データ構造」を考えます。上の「じゃんけんゲーム」では、すべて事象(とそのパターン)を定数で定義しましたが、この辺は自由に変数と定数を組み合わせて、使いやすい形に「データ構造」を考えます。「○✕ゲーム」(三目並べ)では、定数と変数を組み合わせて「データ構造」を作ってみます。「○✕ゲーム」(三目並べ)の事象(とそのパターン)は、プレイヤー:「自分」「相手」の2パターン、手:「○(まる)」「✕(ばつ)」の2パターン、勝敗:「勝ち」「あいこ」「負け」の3パターン、その他に盤面:3×3の盤面情報です。

a)「○✕ゲーム」(三目並べ)のデータ構造の例
/* プレイヤー */
#define IAM 0 
#define CPU 1

/* 出し手 */
#define MARU 0 
#define BATSU 1

/* 勝敗 */
#define LOSE 0 
#define TIE 1 /* 単語はDRAWでも何でも良い */
#define WIN 2

/* 盤面 */
#define TATE 3
#define YOKO 3

typedef struct Game {
 int turn;
 int board[TATE][YOKO];
} Game;

次に機能(振る舞い)を考えます。「○✕ゲーム」(三目並べ)の場合は盤面情報から勝敗を判定する機能が必要です。勝敗判定の中身までは記述していませんが、皆さんで考えてみると良いでしょう(作ったもの出来は僕が採点しても構いません。)。○✕ゲームを「データ構造」としてプログラム(C言語)で表現すると下記になります。これがプログラミングの土台です。

b)「○✕ゲーム」(三目並べ)の機能の例
int judge(Game game);

この後のプログラミング(実装)については、かんたん思考ルーチンありのCPUを実装する方法も含めて詳しく記事にしています。「データ構造」が、具体化される流れの確認として参考にしていただければ幸いです。

3.「身長・体重を管理するアプリ」のデータ構造

本ケース「身長・体重を管理するアプリ」は、気持ちとしてフワッとするような「データ構造」のケースです。理由は、カチッと決まる定数値が少なく、変数によって管理される「データ構造」であるためです。こうでなければならないという解はありません。

僕の「データ構造」を示すなら、日毎に入力を促すパターンで、データが都度増えることを想定した下記です(これを動的データ構造と言います。)。ただし、直感として僕のこの「データ構造」だと中途半端な気がします。後の入力受付部のコーディングで、この「データ構造」を適宜修正してより管理しやすい形に修正すると思います。実際のプログラミングにおいては、最初から100%の「データ構造」になっていなくてもかまわないのです。おそらく、データを一意に決める識別番号の定義をどこかに組み込むと思います。

「身長・体重を管理するアプリ」のデータ構造の例
typedef struct Body {
 char name[256]; /* 名前は初回だけ入力 */
 struct tm *today; /* 測定日付の取得 */
 double height;
 double weight;
} Body;

月間10万PVメディア「MOMOHUKU」を支えるツール3選

「MOMOHUKU」"月間10万PVメディア"にまで成長しました。

最近は"DX(デジタルトランスフォーメーション)"が流行りのせいか、、、「MOMOHUKUさんのWebサイトの運営ノウハウを知りたい。」とよく聞かれます。

誰もが知る東証一部の企業からも「コンサルしてほしい」と言われます。

表向きは丁重にお断りしていますが、ITコンサルなんか「ナンセンスなので絶対やらんわ」と内心では思っています。

僕がITコンサルに手を出した時は「よほど、この人はお金に困ってるんだな」と蔑んでみてもらって構いません。

今の「DXの流れ」に一言いうなら?

興味ない。勝手にやってろ。

代わりに、このスペースでWebサイトで絶対に活用すべきツールを紹介します。

ここで紹介するツールがなければ、MOMOHUKUは「月間10万PV」にはならなかったと断言します。

ツール①:WordPressテーマ「SWELL」なら「コンテンツ作り」に専念できる。

SWELLを使えば「コンテンツ作り」「3倍」は速くなります。

SWELLを最初から導入しましょう。

僕は「Webサイト運営が軌道に乗ったら」と考えて、100記事くらい書いたのちにSWELLを導入しましたが「最初から導入しておけばよかった」と後悔しました。

余談:Webサイトは「コンテンツファースト」

僕はWebサイトを「コンテンツファースト」で運営しています。

ちなみに「ITの専門知識をできるだけ使わない」ように心がけています。

非ITの人でも「学習コストなく運営できる仕組み」になるからです。

ITの専門知識を使うと"コスト"が発生する

  • コーディングすると"保守"が発生する。
  • 非IT系が一切触れなくなる。
  • 学習コストも発生する。

まぁ、こういう配慮をすると「舐め腐ってくる」のが非IT系ですが。

長い目で見れば「コーディング排除」は組織にとって確実に使い易いシステムになります。

まぁ「舐め腐ってくる非IT系」をきちんとシバき倒して下さい。

ツール②:レンタルサーバー「ConoHa WING」なら5分でWebサイトを構築できる。

「MOMOHUKU」は、レンタルサーバーに「ConoHa WING」を利用しています。

これから自分のオウンドメディアを立ち上げる方は「ConoHa WING」の利用をオススメします。

理由は「ConoHa WING」なら5分でサイトが立ち上がるからです。

余談:ITはシンプルさ、手軽さが正義

「コンテンツファースト」を心がけていると書きました。

同様にITは「シンプルさ、手軽さ」が正義です。

技術を軽視するわけでなく「ITにこだわると面倒臭く」なるだけだからです。

例えば

「WordPressを高速化してくれ」とITエンジニアに相談してみてください。

WordPressをGatsby.jsで静的サイト化すれば爆速化します!なんて言うITエンジニアが絶対にいます。

そのITエンジニアは続けてこう言います。

サイトは爆速化されますが「非IT系」はWebサイトに触れなくなります。

うちは「エンジニアしかいない」から良いんです。

こういう会社は「先祖帰り」したいだけです。

「自分たちにしか出来ない仕事」を増やしたいだけですね。

何より前提である「サイトが爆速化」されると言うのも絶対に達成されません。

僕のサイト「MOMOHUKU」と「Gatsby.jsを一生懸命に導入したWebサイト」でPageSpeed Insights(速度評価を比較)してみれば分かります。

ツール③:WordPressのプラグインは、とりあえず「UpdraftPlus」を入れる。

僕が尽く救われてきたプラグインを一つ上げるなら「UpdraftPlus」です。

「UpdraftPlus」だけで確実に幸せになれます。

しかも、無料です。

本当に申し訳ないことに「無料」で必要十分の機能です。

そろそろ、感謝だけの気持ちで「有料」を購入しようかと思っています。

コメント

コメントする

目次
閉じる