実みつるのPreプログラミング

プログラミングの学習を考えている方へ

おわりに

◆おわりに

ここまでお読み頂きまして有難うございました。現段階で大半の人は、「…それでプログラミングは?」と思われていることでしょう。

 

「はじめに」で申し上げました通り、この文章を読んでもプログラミングは習得できません。実際にプログラミングを習得されたい場合は、この後何らかの方法でプログラミングを学んで頂かなければなりません。しかし、この文章を最後まで読まれた人は、間違いなくプログラミングの学習が楽になると思います。

 

私は、プログラミングには向き不向きが有ると思っています。ですから皆が必ずしも習得しなくてはいけない技能だとは決して思いません。しかし、今となっては義務教育の一環に組み入れられるほどのメジャーなスキルとなりました。また巷には子供向けのプログラミング教室が沢山できました。

 

多くの子供向けの教室では、ロボットを動かすことで、或いはゲームを題材としプログラムに接するという試みが行われています。しかし大人向けの教室ではここから飛躍して、最初からアルファベットの羅列を見なくてはならない…というのが大半ではないでしょうか。

 

稚拙過ぎず、また難しすぎないちょうど中間に位置する講座って無いのかな…それがこの文章を書いた動機になります。取り上げた5項目は比較的多くのプログラミング言語で採用されている概念です。これ以外にも色々学ばなければならない事は有りますが、基本を理解すれば応用の習得は楽になります。

 

この文章を読んで頂き、「プログラミングって面白そうだな」と思ってもらえる人が一人でも増えれば嬉しい限りです。プログラミング言語は沢山有ります。それぞれの学習で是非楽しんで下さい。

5-4 両方とも無い関数

前回まで色々な関数を見てきましたが、いよいよ今回は「引数も戻り値も存在しない」という関数を考えていきたいと思います。

 

前回の最後に少し述べましたが、コンピューターのプログラムにおける関数とは「処理」のイメージがあります。ですから、その関数を呼び出した(実行したという感じでしょうか)時に何かが行われると考えれば、引数も戻り値も要らないのではないか、という事です。

 

具体的な例を挙げてみましょう。前回出てきたチャイムを鳴らす関数を思い出して下さい。

 

Chime(チャイムを鳴らす回数)

 

この関数は引数に数字を設定すると、その回数だけチャイムを鳴らすというものでした。そこでこの関数を応用し「1回だけチャイムを鳴らす」という関数、Chime1を作ってみます。この関数は実行されたら1回しかチャイムを鳴らしませんので、回数を指定する引数は要りません。つまり、

 

Chime1( )

 

となります。この関数は引数も戻り値も存在していません。もはや関数では無い様に思えますが、プログラムではこれも立派な関数なのです。

 

では、もしこのChime1を使って、3回チャイムを鳴らしたい場合はどうしたら良いでしょうか。その場合はChime1を3回呼び出せば良いのです。

 

Chime1( )

Chime1( )

Chime1( )

 

そしてこれは、

 

Chime(3)

 

と同じ結果になることが分かりますでしょうか。

 

この様に引数を使えば「チャイムを100回鳴らす」という処理でもChime1を100回呼び出す必要は無く、

 

Chime(100)

 

と1回で済みます。この場合は明らかに引数が必要なChimeという関数の方が便利に見えますが、もしチャイムは常に1回しか鳴らさない、或いは複数鳴らしてもせいぜい2回まで、という環境であればChime1の方が便利かもしれません。

 

いずれにしましてもこの項では関数の形式の優劣は本題では有りません。ここでは引数も戻り値も要らない関数が存在し得るという事を覚えておいて下さい。

 

関数の章はここで終了と致します。今回でお伝えしたかった以下の5項目、

 

  1. 定数と変数
  2. 比較
  3. 条件分岐
  4. 繰り返し
  5. 関数

 

を全て述べました。長い時間お付き合い頂きまして有難うございました。

5-3 戻り値の無い関数

第五章 関数

(3)戻り値の無い関数

前回は関数の一つの要素である引数について見てきましたが、今回は戻り値について考えていきたいと思います。

 

これまで見てきた通り、関数の戻り値とは与えられた引数(前回お話した引数が無いというケースも含みます)に応じ1つだけ返ってくるものです。戻り値は引数と違い、一度に複数返ってくることは有りません。

 

では、引数と同様に「戻り値が無い」などという関数は有り得るのでしょうか。引数が無い場合と同じく、本来の関数の役割に反する様に思えますが、実はコンピューターのプログラムでは存在します。イメージとしては、「関数に引数を渡したのだが、何らかの動きをしたあと答えが返ってこなかった」という感じでしょうか。

 

例えば、「引数の数だけコンピューターがチャイムを鳴らす」という関数、Chimeを考えてみます。

 

? = Chime(1)

 

上に書かれた通り、引数に1を設定すると「ピンポーン」とチャイムが1回鳴ります。2なら2回、10なら10回鳴ります。この場合、「チャイムが鳴る」という事象自体が実質戻り値になっているのが分かりますでしょうか。この事象は数値でも語句でもありませんので、関数における戻り値として表現する事は不可能です。あえて表現するなら、

 

1回チャイムが鳴る = Chime(1)

 

とでもなるでしょうか。しかし1回チャイムが鳴るのは動作であり、値ではありません。よってこの場合は、

 

Chime(1)

 

と書くのが一般的です。これは「戻り値が無い」という事を表しています。

 

同様に前回例として挙げた、2つの色を混ぜた結果を戻り値とする関数を考えてみます。以下の様な関数でした。

 

ピンク = f(白,赤)

 

ここで新たな関数ChangeBackgroudというものを作ってみます。これは「引数として与えられた2つの色を混ぜ、画面の背景色をその色にする」という機能があるとします。先程と同様に、結果は「画面の背景色が変わる」という事象ですので、戻り値は存在しません。つまり

 

ChangeBackground(白,赤)

 

と書かれていたら、画面の背景色がピンク色に変わるというイメージです。

 

さて、これまで引数や戻り値の無い関数を見てきて気付いたと思いますが、コンピューターのプログラムにおける関数は、本来関数が持っている性質から少し離れます。関数というよりは、「処理」というイメージに近いと思いませんか。

 

そうです。実はプログラムにおける関数は、コンピューターが行うべき処理、すなわちプログラムそれ自体というイメージです。コンピューターのプログラムを数学で出てくる関数を利用して表現した…という感覚でしょうか。ですから引数や戻り値が無い、というやや強引な表現をした関数が存在してしまうのです。

 

そこで次回は関数の究極の形を考えたいと思います。いよいよ最終回となりますので、どうか最後までお付き合い下さい。

5-2 引数の無い関数

第五章 関数

(2)引数の無い関数

前回は「関数」とは何かという事を考えてきましたが、今回は関数の要素の一つである「引数」、すなわち関数に引き渡すものについて考えていきたいと思います。

 

これまでは引数が1つという事例を見てきましたが、引数は1つでなくても構いません。例えば、以下の様な数式を考えてみます。

 

z = x + y

 

zはxとyを足したものである、という内容になります。xが1でyが2であれば、zは3になります。この場合、xとyの値が定まって初めてzが決まります。これを関数で表すと以下の様になります。

 

z = f(x,y)

 

関数に渡す引数(xとy)がカンマで区切られて2つ有ります。この様に、引数を複数にしても関数は成り立ちます。では以下の関数はどんな機能をもっているでしょうか。

 

あ = f(1,1)

お = f(1,5)

か = f(2,1)

 

引数の数字に応じ、仮名が一文字戻っています。これは50音表の位置を数字で与えると該当する仮名を答える関数になります。1番目の引数が「あ、か、さ、た、な」といった「行」を、2番目の引数は「あ、い、う、え、お」の母音の位置を表す「段」を指定しています。では以下の関数はどうでしょうか。

 

ピンク = f(白,赤)

オレンジ = f(赤,黄)

緑 = f(黄,青)

 

絵の具で色と色を混ぜると、別の色になります。この関数は与えられた2つの色を引数として、混ぜた結果の色を答えています。

 

これまでは引数の個数を増やすケースを見てきました。では逆に、引数が0個、すなわち「引数無し」という関数は存在するのでしょうか。引数の数に制限は無いのですが、そもそも「何かを与えた結果、一定の規則に従い何かを得る」という関数本来の役割に反している様です。

しかし数学では考えられないこの様な関数が、コンピューターのプログラムでは存在します。例えば以下の様な関数OutputYoubiを考えてみます。

 

日曜日 = OutputYoubi(2023年1月1日)

月曜日 = OutputYoubi(2023年1月2日)

火曜日 = OutputYoubi(2023年1月3日)

 

この関数は、年月日を引数としてその日の曜日を戻り値として返します。ところで「今日の曜日を知りたい」という場合はどうしたら良いでしょうか。仮に今日が2023年1月4日だったとすれば、先ほどの関数の引数に「2023年1月4日」を設定すれば良いでしょう。

 

水曜日 = OutputYoubi(2023年1月4日)

 

ですがこの場合、曜日を知りたいたびに今日の日付を確認しなくてはなりませんのでやや不便です。仮に今日の日付をコンピューターが自力で得られるとすれば、新しくYoubiTodayという関数を作る事ができます。例えば今日が2023年1月4日だったとすれば、

 

水曜日 = YoubiToday( )

 

という感じです。この関数の機能は「今日の曜日を戻り値として返す」ですので、与えられる情報、すなわち引数は不要なのです。ですからカッコの中に何も無い状態、すなわち「( )」という表記になります。

 

これより一つ前の関数、OuuputYoubiとは何が違うか考えてみます。OutputYoubiは戻り値の根拠になる情報として年月日が必要です。引数として年月日が無ければ曜日を求められません。一方、YoubiTodayは「今日の曜日」と限定されていますので、これ以上の情報は不要となります。すなわち、引数が要らない関数になるのです(実際にはこの関数を利用すると、コンピューターに格納されている今日の日付を読み込み、内部で曜日を算出するといった作業が行われます)。

 

この様に、関数とも思えない「引数が無い関数」はコンピューターのプログラムでは多く見られます。この段階で見慣れておくとプログラミングの勉強で役立つと思います。

 

今回は引数が複数、或いは無い関数というものを見てきました。次回は戻り値について考えていきたいと思います。

5-1 関数とは

第五章 関数

関数と言えば、学生時代に数学で勉強したなと思う人が多いのではないでしょうか。数学が苦手だった人は、この単語を聞いてアレルギー反応を起こすかもしれません。しかしプログラミングで使われる関数というのは、数学で扱うそれとはちょっと異なります。いわば概念の様な物だと思って下さい。つまりそんなに難しいものではありませんのでご安心下さい。

 

(1)関数とは

関数とは「一つ、もしくは複数の数字に対し一定の規則に従い順応する数」の事だと私は考えます(本来はきちんとした定義が有ると思いますが、ここでは追及しない事とします)。難しい言い回しになってしまいましたが、要するに「何かを入力すればルールに従って何かが返ってくる」というイメージです。

 

良く数学では、関数を説明する際にxとyというアルファベットが使われますが、一番簡単な関数は以下の様なものです。

 

y = x

 

yはxである、という事です。つまり、xが1ならyも1、xが100ならyも100になります。この場合のyを関数と呼ぶのですが、「yはxの値に応じて定まる」という事を以下の様に表現します。

 

y = f(x)

 

「f」はfunction(関数)という英語の略と思われます。この場合のfは「与えられた値をそのまま返せ」という役割を持っています。

 

あくまでも私見になりますが、本来は得られる結果、すなわちyそのものを関数というのでしょうが、ここ最近はf自体、つまり役割のことを関数と解釈している様に思えます。確かにfunctionという英単語は「機能」といった意味も持っていますので、あながち間違いではない様です。

 

その様に考えると、関数、すなわち機能をもう少し応用できるように思います。例えば、

 

東京 = f(日本)

 

という式が有ったとします。これは「日本」を与えると、「東京」が返ってくる関数です。どういうことでしょうか…同じ関数を使ってもう一つ例を示します。

 

北京 = f(中国)

 

そうです。この関数は「入力された国名から、その国の首都名を返す」という関数です。「首都名算出関数」とでも言うのでしょうか。この様に関数を「役割」として捉えると、数字だけでなく文字なども扱えるようになります。もしこの関数に「OutputShuto」と名前を付ければ、以下の様に表現できます。

 

首都名 = OutputShuto(国名)

 

ではクイズの様になりますが、以下の関数はどの様な役割を果たしていると思いますか。

 

北 = f(南)

左 = f(右)

支出 = f(収入)

義務 = f(権利)

 

この関数は「入力された単語の反対語を返す」という機能をもっています。この関数に「Hantaigo」と名前を付ければ、以下の様に表現できます。

 

単語の反対語 = Hantaigo(単語)

 

ここで覚えて欲しい言葉が有ります。関数自体の名前は「関数名」なのですが、関数に入力するもの(数や単語)を「引数(ひきすう)」、関数から返ってくるものを「戻り値(もどりち)」と言います。

 

戻り値 = 関数名(引数)

 

今回は関数とは何かという事を述べてきました。次回以降は様々な形の関数を見ていきたいと思います。

4-4 回数に気をつける

第四章 繰り返し

(4)回数に気をつける

この章の最後は、繰り返す回数について考えてみます。これまで例に挙げてきた陸上競技では、トラックを周る回数が正確でなくてはなりません。1周多く、或いは1周少なく周ることは当然認められません。コンピューターの場合も同様で、繰り返しの回数を間違えてしまうと、思った通りの結果を得られない可能性が有ります。よって回数をきちんと管理する事は重要です。

 

コンピューターで管理する場合、コンピューターが保持するカウンターと表示器の数字を比較する方法を間違えない様にする事がポイントになります。具体的には、以下2点が重要になります。

 

①カウンターの初期値

②繰り返しを止める条件設定

 

例えば前項では、カウンターの値が10だった場合に繰り返しを止める、つまりゴールとしましたが、仮に初めに設定する値を0ではなく1にした場合はどうでしょうか。

 

1周走り終えた時、カウンターの値は2となります。つまりカウンターの値は「周回した数+1」という事になります。これに従えば、9周走り終えた段階でカウンターの値は10となります。すると、次の分岐で「COUNTER = 10」という条件を満たしてしまいますので、ゴールという事になります。しかし実際には9周しかしていませんので、本来の目的を達成できなくなってしまいます。

 

では、分岐の条件を「COUNTER > 10」としてみたらどうでしょうか。「カウンターの値が10よりも大きかったら」という意味です。この場合、仮にカウンターの値が10であったとしても条件を満たしません。「10より大きい」とは10ではダメだからです。次の1周を終え、カウンターの値が11になったら条件を満たしゴールします。このケースでは10周するので、目的を達成できます。

 

この様に、カウンターの初期値と繰り返しを止める条件の組み合わせが適正でないと、コンピューターは思う通りに動きません。以下にいくつか組み合わせを例示してみますので、きちんと10周する(すなわち10回繰り返す)のはどれか、考えてみて下さい。

 

A) COUNTER初期値: 0|条件: COUNTER = 10

B) COUNTER初期値: 1|条件: COUNTER > 10

C) COUNTER初期値: 0|条件: COUNTER > 9

D) COUNTER初期値: 1|条件: COUNTER >= 11

E) COUNTER初期値: 0|条件: COUNTER >= 10

 

答えは、全て10周して終わります。慎重に確認してみて下さい。

 

繰り返しの章はここで終了と致します。次回は「関数」について考えていきたいと思います。

4-3 途中で止める

第四章 繰り返し

(3)途中で止める

前回は、繰り返しの途中で何か別の事をする方法を考えましたが、今回は繰り返しを途中で止めてしまうという事を考えてみます。実際の競技でも選手が途中で棄権する事は有りますね。例えば体調が悪くなった、足がつってしまったといった事態が発生した時です。

 

まずはこれまで使ってきた条件分岐で表現を試みます。以下の図を見て下さい。

 

 

前項で水分補給の判断に使った箇所を、競技の継続が可能かどうかを判定する内容に変更しました。そして継続が不可能な場合は、棄権して中止する様にします。これで繰り返しを途中で止めるという事が実現できました。

 

しかしこれでは競走を棄権できるタイミングがスタートラインのみになってしまいます。実際の競技では、アクシデントはいつ発生するか判りません。これでは足がつってしまっても、取りあえずスタートラインまで辿り着かないと棄権する事ができなくなってしまいます。

 

では前項の水分補給で行った様に、半周した時にも条件分岐を設定したらどうでしょうか。確かに棄権できるタイミングは倍になります。しかし先に述べた通り、選手は走っている間ずっと棄権のリスクを抱えています。半周ごとでも不十分ではないでしょうか。

 

では、1/4周ごとにチェックしたら?10メートルごとに…1メートルごとに…とチェックのタイミングを増やせば、確かに実現したい事に近づきます。しかし本当に実現したいのは「選手が選手の意思でいつでも棄権できる」という事ですから、このやり方ですと理論上は実現できないという結論になります。

 

コンピューターのプログラムでは、条件分岐の箇所を無数に増やす事は可能です。しかし、プログラムが実行されている最中に「繰り返しを止めろ」という指示は出せません。実際には、「コンピューターに対し何らかの指示が出されたら特定のプログラムが実行される」という仕組みを設ける事はできます。しかし実行されている最中のプログラムに割り込むという事は、基本的にできません(実行されているプログラムを強制的に終了させるという事はできます)。

 

前項で取り上げた無限ループになってしまった場合も、そのプログラム内の変数を書き換えれば止まるじゃないかと思われるかもしれません。しかし動いてしまっているプログラムに対し、途中で中身を操作する事はできないのです。

 

今回は繰り返しを途中で止める方法と、一度動いたプログラムは原則として途中で中身を変えられないという事を述べてきました。次回は繰り返しの回数について考えてみます。