infoTek インフォテック株式会社

採用情報Recruit

Recruitプログラミングに挑戦しよう!

- 初心者のためのプログラミング入門 -

画像 マウスと遊ぶ猫

プログラム経験のない方と面接していると「どんなひとがプログラムに向いているでしょうか?」とか「私も開発業務ができるようになるでしょうか?」という質問をよく受けます。

回答としては、「一定の知的能力があり、やる気があれば大丈夫です。」とか、「論理的なことを考えたり、新しいことを学ぶのが好きなひとは向いていますね。」とか答えていますが、プログラムの経験のない人にプログラムという仕事を理解してもらうのは難しいものです。

プログラムとは必ずしもロジックを積み重ねていく工学的な作業だけともいえず、むしろ職人的なものづくりに似た側面があります。わたしは、これをプログラミングは工学というよりアート(技芸)に近いと説明していますが、未経験のかたにはますます訳のわからない説明になってしまいます。

プログラムという作業に向いているかどうかは意外と感覚的な要因が大きい。あるひとには時間を忘れるほど楽しい作業にもなりうるし、ある人にはたまらなく苦痛な仕事になる可能性があります。プログラムを仕事としていくことに興味のある方には、自分がプログラムに向いているかどうかを確認するために実際にプログラムを作ってみることをお奨めします。

とはいえ、経験のない人がいきなりプログラムを作ろうとしても、どこから始めていいものか見当がつかないでしょう。本稿では、そのような方が、プログラミングを体験するには、どうしたらよいかをできるだけ具体的にご説明したいと思います。

まず、コンパイラを入手する

作成したプログラムをコンピュータ上で実行するためには、もとのプログラムをコンピュータが理解し、実行できる形式に変換する必要があります。この変換を行なうプログラムをコンパイラといいます。

ここでは、言語として「C」(シーと読む)を選択し、コンパイラは定評のあるエンバカデーロ社のFree C++ Compiler(BCC32Cコンパイラ)を使用します。C言語は1972年にベル研究所で誕生して以来、広く使われ、最近では基本ソフトウェアの開発に使われることが多い本格的な言語です。詳しくは Wikipediaの記事を参考にしてください。

同コンパイラはユーザ登録をすればエンバカデーロ社のダウンロードページから無償でダウンロードすることができます。ファイルは BCC001.zip のような圧縮ファイルになっているので、Windows 10 では右クリックでメニューを表示し、「すべて展開(T) ...」を選択し任意の場所に解凍します。古いバージョンのWindowsでは解凍ソフトを使ってください。

解凍すると 「BCC101」というフォルダーの下に関連ファイルが配置されます。これを任意の場所に配置します。ここでは、Cドライブに配置したものとします。

コンパイラは C:\BCC101\bin のフォルダーにある BCC32C.exe という実行ファイルとなりますが、環境変数 Pathにこの場所を設定しておくと、どのフォルダーで作業していてもファイル名だけで実行できるので便利です。

この設定を行うにはWindowsスタートボタンを右クリック、表示されたメニューで「システム(Y)→ システムの詳細設定」を選択し「システムのプロパティ」画面を表示、さらに「環境変数(N)」ボタンをクリックして「環境変数」画面で環境変数 Path に 「C:\BCC101\bin」を追加します。(下図参照)これで パスを指定することなく「BCC32C ファイル名」 でコンパイルを行うことができるようになりました。

システムのプロパティ画面
図1 システムのプロパティ画面
環境変数の設定画面
図2 環境変数設定画面

プログラムを動かしてみよう

それでは今インストールしたコンパイラを使ってプログラムを作成していきましょう。

Windows上で動くアプリケーション、たとえばMicrosoft社のExcelなどは通常たくさんのきれいな画面により操作を行い操作した結果を表示するつくりになっています。このようなアプリケーションを作るためには入力や表示のための画面を対話型のツールで作成する必要があります。またWindows上のプログラムのルールや制御の方法を理解している必要があります。

ここではプログラムのエッセンスを理解してもらうためにコンソールアプリケーションと呼ばれるテキスト入出力を基本としたシンプルなプログラムの作成を解説します。Windowsシステムが普及するまではプログラムといえばこのような形で開発するのが一般的でした。

まず、コンパイラの対象となるプログラムを作成します。ここでは、有名なカーニハン、リッチーの下記の本(以下「K&R」と呼ぶ)の冒頭にあるこれも有名なプログラムをとにかく動かしてみることにします。

プログラミング言語C ANSI規格準拠

スタートボタンをクリックしてスタートメニューを表示し、全てのプログラムリストから 「 Windowsアクセサリー|メモ帳 」でメモ帳を起動し、下記のように入力します。

hello.cのソースコード
図3 hello.cのソースコード

文字は全て半角英字で入力します(半角英数字がわからない方はこちらを参考にしてください)。入力し終わったら、「hello.c」という名前で、適当なフォルダーに保存します。あらかじめ、プログラム練習用のフォルダーを作っておいて、そこに関連するファイルをまとめて保存するのが良いでしょう。

次に、スタートメニューで「 Windows システムツール | コマンドプロンプト 」をクリックします。すると下図のような黒い画面が表示されます。本画面は、Windows OSが世に出る前のDOSというOSの画面をシミュレーションしたもので、テキストしか表示されません。ここではコマンドプロンプト画面と呼びます。コマンドプロンプト画面ではPCへの命令(「コマンド」という)をキーボードより入力していろいろな処理を行ないます。

同画面でまず、hello.c を保存したフォルダーを既定フォルダーとして指定します。ここでは、「C:\beginC」に保存したものとします。現在のドライブがC:でない場合にはまず「c:」と入力してドライブを指定、次に「cd \beginC」と入力しフォルダーを指定します。ここでフォルダー内のファイルのリストを出力するコマンド「dir」を入力すると、hello.cがあることがわかります。下図は「dir」を入力したあとの画面を示しています。

プログラム用フォルダーの内容
図4 プログラム用フォルダーの内容

いよいよ、hello.cをコンパイルします。コンパイルは 「bcc32c ファイル名」で、行ないます。図5 は「bcc32c hello.c」でhello.cをコンパイルした後、フォルダーにどのようなファイルがあるかを表示した時の画面です。

画面に表示されたファイルのリストを見ると、hello.c以外に、hello.exeとhello.tsdのふたつのファイルができているのがわかります。hello.cは、最終的にコンピュータで動くソフトウェアのおおもとになるということから、ソースプログラム、ソースコード、あるいはソースファイルなどと呼ばれます。ソースプログラムは単純な文字だけが含まれるテキストファイルであることに注意してください。

プログラムとは、基本的にはこのソースコードを作成する作業といえます。

プログラムはメモ帳やテキストエディターと呼ばれるテキストを編集するソフトウェアで作成することができます。逆にMicrosoft社のMSワードなどで作成したファイルは、レイアウトやフォント情報なども含むアプリケーション独自の構造なのでコンパイラにそのまま処理させることはできません。

hello.tsdはディバッガーというプログラム動作を確認するソフトが参考にする情報が入っているファイルです。今回は使いませんのでとりあえず無視してください。

「bcc32c ファイル名」と入力すると、コンパイルの後、自動的にリンカーが起動されてhello.exeを作成します。hello.exe はコンピュータで実行できるプログラムの本体で、実行可能ファイルとかエグゼファイルなどと呼ばれます。

hello.cのコンパイル
図5 hello.cのコンパイル後のフォルダー

それでは、hello.exeを動かしてみましょう。下図のように「hello.exe」をタイプし、改行キーを押すと、同プログラムが実行され、「hello, world!」の文字が画面に出力されます。

プログラムの実行
図6 プログラムの実行

このようにhello.cは、「hello, world!」という文字列を画面に出力するだけのプログラムです。ここでもう一度ソースコードを見直してみましょう。(図7参照)

hello.cの解説
図7 hello.cの解説

最初の「# include <stdio.h>」は、このプログラムで標準的な入出力ライブラリーを使うための情報を取り込むようコンパイラに指示しています。具体的には、プログラムの中で呼んでいる関数「printf」を使うためにこの指示が必要になります。

main(void)は「main」という特別な名前の関数で、プログラムは必ずここから始まるというきまりになっています。つまり実行可能なCのプログラムには必ず関数mainがひとつ含まれます。ここで 「int main(void)」となっていますが、これはこれで意味があるのですが、ここでは決まり事ということでスルーしましょう。

大かっこ「{ }」で囲まれた部分は、関数mainの本体です。mainは、ここで多くの命令や関数呼び出しを行なうことができますが、ここではprintfという標準関数を呼んでいます。

Cでは、標準関数の他に、プログラマーが自分で自由に関数を定義し使用することができます。複雑で大きなプログラムはこれらの関数を組み合わせて構成することにより実現します。また、コンパイルとリンクを分けて、修正が必要な関数だけをコンパイルして、他の関数のオブジェクトファイルとリンクして実行可能ファイルを作成することもできます。プログラム開発の一般的な手順を下図に示します。

プログラム開発の手順
図8 プログラム開発の手順

サンプルプログラム:計算する

プログラムでできることは、各種の計算をする、文字処理を行なう、データを入出力する、図形などを描画するなど、およそ、データ化、論理化できる問題であれば、なんでも扱うことができます。ここでは、計算の例として同じくK&Rから華氏と摂氏の温度対応表を出力するプログラムを紹介します。

まず、前と同じようにスタートメニューから、「Windowsアクセサリー|メモ帳」でメモ帳を起動して下図のように入力して、プログラム練習用のフォルダーにtemper.cという名前で保存します。(図中、青い文字は補足説明ですので、入力しないでください。)

華氏、摂氏温度対応表出力プログラムソースコード
図9 華氏、摂氏温度対応表出力プログラムソースコード

次にhello.cをコンパイルしたのと同じ方法で、temper.cをコンパイルし、実行します。実行結果は下図になります。

ここで、ソースコードをもう少し詳しく見ていきましょう。「/*」と「*/」ではさまれた文字はコメントです。コンパイラはコメントを無視します。 つまり、コメントはひとがプログラムを見たとき、その意味や意図をより理解するためのものです。コンパイラはコメントをプログラムの実行には関係ないものとして無視します。

次のfloat、intは、変数の型を宣言するためのもので、それぞれ変数が浮動小数点、整数という型であることを宣言しています。変数は値を入れておく場所で、数値や文字など入れておける値の種類による型を持っています。型により扱えるデータの種類とその扱い方が異なります。Cでは、使用する全ての変数について型宣言をする必要があります。

次のコメントのついた3行は、intで宣言した整数の3つの変数に最初の値を入れています。これを変数の初期化といい、最初の条件を確定するための大切な手順です。1行とんだ「fahr = lower」では、華氏温度の変数fahrにlower、すなわちゼロを代入しています。

ところで、以上の各文の終わりに、「;」があるのに気づきましたか?Cでは文の終わりに必ず「;」を置くことになっています。コンパイラは「;」を見て、文の終わりと判断します。

次の「while」は、カッコ(「( )」)内の条件が成り立つ間は、「{」と「}」の間の文(文は複数でもよい)を繰り返しなさいという命令です。特定の処理を繰り返すときに使います。カッコの 中をみると、「fahr <= upper」となっていますので、fahrがupperより小さいか(<)、等しければ(=)、すなわち、300を越えるまで「{ } 」内の文を実行しなさいということを指示しているのがわかります。

ここで「{ } 」内の最後の行を見ると、「fahr = fahr + step」となっています。数学の等式として考えるとおかしいので、単に左辺に右辺の演算の結果を代入する処理と考えてください。(「fahr ← fahr + step」というのが実際の処理に近いでしょう。)具体的には現在の fahrの値にstep(すなわち20)を加えて、 fahrに入れておくという意味です。結局、while文では「{ } 」内の最後でfahrを20ずつ増やすという処理をしながら、300を越えるまで実行が繰り返されることになります。指標となる数値を増やしながら繰り返 し処理を行い、一定の値以上、あるいは以下になったら繰り返しをやめて次の処理に移るという手順はプログラムでは非常によく見られるパターンです。

このように、プログラムに共通に見られる処理については、常識ともいえる処理パターンがあり、経験を積んだプログラマーは、さまざまなパターンとその使い方を知っているため効率よく質の高いプログラムを開発することができます。これは英語などの外国語を使いこなすのにあいさつの方法や慣用表現を学ぶ必要があるのにちょっと似ています。

プログラムの説明にもどります。「{ } 」内の最初の文、「celsius = ..,」では 華氏から摂氏への温度変換を行なっています。計算式中、「*」は乗算、「/」は除算の記号です。

次のprintfは、計算結果を指定された書式(出力の形式)で出力する標準関数です。カッコの中で三つの引数(パラメータ)を指定しています。最初の引数は、出力の書式を、次の 二つの引数は出力する変数名を指定しています。最初の引数で「%3.0f」は2番目の引数fahrの浮動小数点の値を少なくとも3字幅で小数点以下0桁で 出力する、次の「%6.1f\n」は3番目の引数celsiusの値を少なくとも6字幅、小数点以下1桁で出力、続けて改行(「\n」で指示)を出力する ように指示しています。下図の出力例でその通りになっているか確認してみてください。

華氏・摂氏温度対応表出力プログラムの実行
図10 華氏・摂氏温度対応表出力プログラムのコンパイルと実行

サンプルプログラム:単語を数える

プログラムは計算のほかに文章を整形したり、単語を検索するといった文字処理をおこなうことができます。ここではやはりK&Rから、文中の単語の数などを数えるプログラムをご紹介します。

まず、メモ帳で下図のようにプログラムを入力し、wcount.cという名前で保存します。(ここで青い文字は注釈ですので、入力しないでください。)

単語数を数えるサンプルプログラム
図11 単語数を数えるサンプルプログラム

青文字の注釈でだいたいの意味はわかると思います。注釈を参考にしてプログラムの各行の意味を自分で想像してみてください。以下ではポイントだけを説明することにします。

本プログラムでは、標準入力に入ってくる英語文(欧文)を1文字ずつ判定し、改行数、文字数、 単語数をカウントし、最後にこれらを出力します。単語はスペース、改行、タブ(空白文字と総称する)に区切られた文字列として、単語の外か内かを判断しながら単語を数えていきます。

whileの判定文にあるgetchar()は、標準入力から一文字を読み取る関数です。判定文全体では、getcharの結果であるcが EOF(ファイルの終わり)でない(「!」はNOTを表し、「!=」でNOT Equal つまり等しくないの意)限り「{ }」内の文を繰り返すということになります。

2番目のifの判定文は「||」で区切られていますが、「||」は「OR」の意、つまり、cが空白か、改行か、タブの場合という意味になります。そのあとのelse ifのelseは直前のifが成立しない場合という意味で、空白文字か否かに応じた2種類の処理を定義しています。

下図にwcountの実行結果を示します。 「wcount < wcount.c」は、ファイル wcount.c 自身の内容を、プログラム wcountの標準入力に指定する命令です。これにより、wcount.cの中の文章が、wcount の標準入力として読み込まれるようになります。この結果、wcount.c には改行が26、単語が84、文字(正確にはバイト数)が419あることがわかります。

wcountの実行結果
図12 wcountの実行結果

もっと勉強するためには

以上で本稿の説明は終わりです。プログラミングの雰囲気は味わえたでしょうか?

もっと知識を深めたいと思う人には、K&Rの第1章(40ページ弱)を例題や演習をやりながら、じっくり読んでみることをおすすめします。同書の1章では、実際のプログラムによりCの特徴的な部分を説明しようとしており、1章だけで小さな入門書といった性格を持っています。ある程度プログラミ ングの知識のある読者を想定しているので、当然わからない点が出てくるのですが、その意味や背景について自分なりに考えてみることがプログラミング言語やプログラミングのより深い理解につながるように思います。

C言語の個々のテーマについての解説は、2章以降で詳しく解説されています。参考書的な本が好みの方はたくさんの入門書が出版されています。本屋で見比べて好きなものを揃えるのもいいでしょう。下記に一例をあげます。

新版 明解C言語 入門編 (Amazonページへ)

またプログラムが動くしくみをコンピュータの原理にまで戻って解説した下記の本も参考になるかと思います。

プログラムはなぜ動くか (Amzonページへ)

当社では、プログラマーになりたい若者を応援するために本記事を見てCの勉強を始めた方からのCプログラミングに関するご質問にお答えします。質問がある場合は こちらまで、氏名、所属明記のうえお問い合わせください。

engage
engage