C言語で作ったバナナとリンゴの足し算 [プログラム]
今日は前回よりもっと簡単なC言語で作ったサンプルで、小学生の算数、国語のレベルと、中学生の英語、代数がわかる人ならすぐ覚えられるコードです。コードはこれ:
#include <stdio.h>
int main()
{
char *banana = "banana", *apple = "apple";
printf("%s , %s\n", banana, apple);
printf("%c%c%c%c%c%c\n", banana[0], banana[1], banana[2], banana[3], banana[4], banana[5]);
int _banana = 5, _apple = 5;
banana = _banana;
apple = _apple;
printf("%d + %d = 10\n", banana, apple);
printf("%d\n", _banana + _apple);
return 0;
}
これを$ cc -o calc2 calc2.c でコンパイルすると、
calc2.c:9:9: warning: incompatible integer to pointer conversion assigning to 'char *' from 'int' [-Wint-conversion]
banana = _banana;
^ ~~~~~~~
calc2.c:10:8: warning: incompatible integer to pointer conversion assigning to 'char *' from 'int' [-Wint-conversion]
apple = _apple;
^ ~~~~~~
calc2.c:12:27: warning: format specifies type 'int' but the argument has type 'char *' [-Wformat]
printf("%d + %d = 10\n", banana, apple);
~~ ^~~~~~
%s
calc2.c:12:35: warning: format specifies type 'int' but the argument has type 'char *' [-Wformat]
printf("%d + %d = 10\n", banana, apple);
~~ ^~~~~
%s
と言った4つの警告が出ますが、実行ファイルはできて、$ ./calc2 で実行すると
banana , apple
banana
5 + 5 = 10
10
と出てきます。まあ英語だとありふれたprintf()の説明です。他聞ラテン系では気付かないかと思うことがあるのですが、後で説明します。で、警告が出るので普通はやらないのだと思いますが、charとintで同じものを作るのに名前が同じだとエラーになるので、_で変えてあります。よく使う手ですが、これで代入が使えて型キャストと同じことができました。つまり、文字に数字を代入できる方法もあるのだと言うことを示しました。これ、日本語にするともっときれいな形でできます。日本語だと文字表現でリンゴをりんご、林檎、appleとしても通じるほど名詞は多彩です。つまり、文法上で都合の悪いことがそれで解決できるのであれば、使わない手はありません。では、このコードを普通に日本語に直すと、こうなります。
#include <stdio.h>
int main()
{
char *バナナ = "バナナ", *リンゴ = "リンゴ";
printf("%s , %s\n", バナナ, リンゴ);
printf("%c%c%c%c%c%c%c%c%c\n", バナナ[0], バナナ[1], バナナ[2], バナナ[3], バナナ[4], バナナ[5], バナナ[6], バナナ[7], バナナ[8]);
int ばなな = 5, りんご = 5;
バナナ = ばなな;
リンゴ = りんご;
printf("%d + %d = 10\n", バナナ, リンゴ);
printf("%d\n", ばなな + りんご);
return 0;
}
これで、全く同じ警告でコンパイルできます。ただ、ちょっと違うのがバナナを配列で表示するのに、一文字に三つの配列を使っているところです。で、ちょっと考え直して前のブログでC++で作った日本語の配列はcoutで表示することはできませんでした。なのにprintfでは、普通にできます。これが、ラテン系では気付かないことだということなのです。日本語での解説は大概英語を日本語に置き替えた受け売りの説明ですから、多分こんなことになるとは誰も試さなかったでしょう。
まあこれはこれとして、CやC++では何かを宣言すれば、それを[ ]で取り出せます。で、これはObjective-Cでしょっちゅう使われている記号です。これに注目して大きく飛躍したのが、smalltalkの流れを酌む今使っているOSXです。つまり、[ ]はCを更に分割して底辺から組み立てられたということもできます。まあ気付いたとしてもそこまで誰もやろうとは思わなかったでしょうけど。
ちょっと話が脱線しましたが、これからが本題です。これは、ある意味小学生でも理解できるバナナ5本とリンゴ5個の足し算のプログラムです。算数では 5 + 5 = 10 と黒板に書いて教えるでしょう。国語では、目の前にあるバナナとリンゴは全部で10個あると教えるでしょう。しかし実はこれ、ものすごく曖昧なのです。教える側はやさしい教え方と称して良いかもしれませんが、受け取る側は様々です。様々なのが当たり前なのですが、これを画一化する方法がテストと称する
点数評価区別です。では、ちょっと視点を変えたプログラムはどうでしょうか。今度は今のところ困るのが教える側です。極端に言うとまだ早いとか言う話ではなく、1+1がただ教えられないだけなのです。1+1がですよ。これだけ世の中にパソコンが普及し、利用している社会でです。そのくせ、インターネットにまつわる犯罪の事件は後を絶ちません。なんか矛盾していませんか。言い過ぎたかもしれませんが、その難しさは低学年にも分かるようにと作られたスクラッチがあるのを知って、ダウンロードして使ってみました。画像ではこんな感じです。:
これ、マンガチックで簡単そうに見えましたが、漫画になんか興味のない私には逆に使ってみようと言った簡単なものではなく、余計な知識が邪魔をして、ターミナルのemacsで、試した方がいいやってなってしまいました。第一音声がでるのですが、日本語は話せないので、こんにちはとは、言いません。konnichiwaとすれば別ですが。で、プログラムを教えるとは、算数と国語と英語を同時に教えなければならないので、総合学科となりそうです。つまり、全部の知識が必要とされますが、どうでしょうか、分担して教えている今の教育制度ではこんな教師は育ち難いということになって、極端になれば教える必要がないとなり、好奇心旺盛な子供達の独壇場となって変なものに手を染めて終いには…と言うことになるのではないですか。教えられないのであれば、学生にスマートホーンなるものは持たせてはいけないのです。そこまで言うと突っ込みどころ満載となりそうですが、私の子供の時代に、携帯電話なるものはありませんでした。社会に出てからもよっぽど後になってからです。まして、スマートホーン?本当に必要なんでしょうか?ただし、プログラムは別個に考えています。iPhoneのプログラムとか、勉強になります。
では今度は、Objective-Cで同じ内容をコード化して試してみます。
#import <Foundation/Foundation.h>
#include <stdio.h>
int main()
{
@autoreleasepool{
NSString *バナナ = @"バナナ", *林檎 = @"林檎";
NSLog(@"%@ , %@\n", バナナ, 林檎);
char *リンゴ = "リンゴ";
printf("%c%c%c%c%c%c%c%c%c\n", リンゴ[0], リンゴ[1], リンゴ[2], リンゴ[3], リンゴ[4], リンゴ[5], リンゴ[6], リンゴ[7], リンゴ[8]);
NSInteger ばなな = 5, りんご = 5;
バナナ = ばなな;
林檎 = りんご;
NSLog(@"%d + %d = 10\n", バナナ, 林檎);
NSLog(@"%d\n", ばなな + りんご);
}
return 0;
}
その実行結果:
$ ./たしざん
2014-07-06 22:23:12.107 たしざん[7401:507] バナナ , 林檎
リンゴ
2014-07-06 22:23:12.114 たしざん[7401:507] 5 + 5 = 10
2014-07-06 22:23:12.115 たしざん[7401:507] 10
大体似たようなものなのですが、NSLogではcoutと同じリンゴ[0]とかの値は取れないようなので、printfで代用しました。さて、同じものを三つの言語で変えた’りんご’ですが、漢字は元は漢語で今の中国が源流であり、ひらがなは大和語?でありカタカナはどちらかと言えば和西折衷語です。ですから、本当はこのプログラムでは結構言語が混じっているんですね。なんだかたったこれだけのコードなのにテンコ盛りになってしまいましたが、もうちょいです。プログラムでは、ばなな = 5 と書いたりするのは当たり前ですが、数学や国語ではこのような表現をしたら0点です。逆にコードに10 + 10 = 20と書いては間違いです。エラーでコンパイルはできません。また国語で、りんごと林檎は等しいとは言いません。文になっていないのです。しかし、算数や国語を勉強する意味は、その教えが将来でも通用するだろうと思う教師のための教育と、プログラマーやそのユーザで使うだろうと思われる片手間な教えだけです。ほかの世界では全くと言っていい程、必要ではないのです。大概の人は社会に入って新たに組み立てて覚えているはずです。念のため言っておきますが、コードでは、ばなな+りんごとは書いていますが、ばなな+りんご=10とは書いていません、厳密に言えば、書いてはいけないのです。これは計算機の電卓でもそうですが、=のキーを押していると思っているでしょうけれども、この=はラベルであり文字です。実際はキャリッジであるエンターなはずです。
これからの社会情勢を考えれば、私は低学年での早期のプログラム学習を推奨します。
コメント 0