情報学部 菅沼ホーム 目次 索引

第3章 簡単なプログラム

  1. 3.1 プログラムの書き方
  2. 3.2 基本的な演算子
    1. 3.2.1 算術演算子
    2. 3.2.2 代入演算子
    3. 3.2.3 インクリメント演算子,デクリメント演算子
  3. 3.3 簡単なプログラム
    1. A. C++
    2. B. Java
    3. C. JavaScript
    4. D. PHP
    5. E. Ruby
    6. F. Python
    7. G. C#
    8. H. VB

3.1 プログラムの書き方

  本コンテンツ内で述べる言語は,Python を除き,基本的に,フリーフォーマットで書くことができます.つまり,日本語などのように,一つの文を任意の行・列から書き始めることが可能ですし,どこで終わっても構いません.しかし,プログラムも一種の文章です.従って,よほど特殊な事情がない限り,読みやすく,理解しやすいことが,プログラムにとって最も重要な課題となります.もちろん,誤りさえなければ,読みやすい,読みにくいに関わらず,プログラムは正しく実行されます.しかし,プログラムを実行するのはコンピュータであっても,プログラムを書いたり,誤りを修正したりするのは人間です.読みやすいプログラムを書くことにより,その内容を他人に説明することが容易になると共に,まず,自分自身が誤りを犯しにくくなります.

  次に示すのは,C++ による二次方程式を解くためのプログラムです.ただし,各行の最初の番号は,説明のために付加した行番号です.プログラムの内容とは関係ありません(以下のプログラムにおいても同様).
01	#include <stdio.h>
02	#include <math.h>
03	int main(){double a,b,c,d,x,x1,x2;
04	printf("係数a,b,及び,cは? ");scanf("%lf %lf %lf",&a,&b,&c);
05	if(fabs(a) <= 1.0e-10){
06	if(fabs(b) <= 1.0e-10)printf("解を求めることができません!\n");
07	else{x=-c/b;printf("x=%f\n",x);}}
08	else{d=b*b-4.0*a*c;
09	if(d >= 0.0){d=sqrt(d);x1=0.5*(-b-d)/a;x2=0.5*(-b+d)/a;
10	printf("x=%f %f\n",x1,x2);}
11	else{d=sqrt(-d);x1=-0.5*b/a;x2=0.5*d/a;
12	printf("x=%f ± i%f\n",x1,x2);}}return 0;}
		
  上のプログラムを見て読みやすいと感じるでしょうか.もちろん,プログラム言語に関する説明がまだですので,内容自身を的確に把握することは困難かと思います.しかし,同じプログラムを下のように書いたらどうでしょうか.内容自身についてもある程度想像が付くのではないでしょうか.

01	/*********************************/
02	/* 二次方程式を解く              */
03	/*     a * x * x + b * x + c = 0 */
04	/*          coded by Y.Suganuma  */
05	/*********************************/
06	#include <stdio.h>
07	#include <math.h>
08	
09	int main()
10	{
11		double a, b, c, d, x, x1, x2;
12	/*
13	           係数の読み込み
14	*/
15		printf("係数a,b,及び,cは? ");
16		scanf("%lf %lf %lf",&a,&b,&c);
17	/*
18	          一次方程式
19	*/
20		if (fabs(a) <= 1.0e-10) {
21			if (fabs(b) <= 1.0e-10)
22				printf("   解を求めることができません!\n");
23			else {
24				x = -c / b;
25				printf("   x=%f\n",x);
26			}
27		}
28	/*
29	          二次方程式
30	*/
31		else {
32	
33			d = b * b - 4.0 * a * c;
34	               // 2実根
35			if (d >= 0.0) {
36				d  = sqrt(d);
37				x1 = 0.5 * (-b - d) / a;
38				x2 = 0.5 * (-b + d) / a;
39				printf("   x=%f %f\n",x1,x2);
40			}
41	               // 虚数
42			else {
43				d  = sqrt(-d);
44				x1 = -0.5 * b / a;
45				x2 = 0.5 * d / a;
46				printf("   x=%f ± i%f\n",x1,x2);
47			}
48		}
49
50		return 0;
51	}
		

  プログラムをどのように書けば読みやすいかということに対する明確な定義があるわけではありませんが,経験的に,以下に示すような規則を守って書くと良いと思います.もちろん,個人的な好みの問題もありますので,自分自身でも適当に工夫してみて下さい.しかし,最低限,1 ~ 3 番目の項目は守ってください

  1. プログラム全体,主要な変数・引数の説明( 1~5 行目)や,プログラムの各部分に対する説明( 12~14 行目等)を必ず入れる.

  2. 機能ブロック毎に字下げ(上のプログラムでは,tab を使用して字下げを行っている)を行う.Python 以外の言語を使用する際にも,Python の仕様に適合するような字下げをすべきである.字下げを行うことにより,その機能ブロックの範囲が一目でわかるようになる.例えば,11~50 行目は,10 行目及び 51 行目に対して,字下げしてある(プログラムの内容であることを示している).また,36~39 行目は,35 行目及び 40 行目に対して字下げしてあるので,条件 「 d >= 0 」 が満たされたときの処理であることが一目でわかる.

  3. 記述が簡単になるからといって,一見してその内容を推測できないような記号や表現を使用しない.

  4. 一つの行に複数の文を書かない.ただし,場合によっては,複数の文を書いた方が見やすい場合もある.

  5. 読み易さを考えて適当にスペースを入れる.特に,演算子の前後には必ずスペースを入れ,また,代入文が続いたときは等号をそろえる( 36~38 行目等).ただし,場合によっては,等号を揃えない方が良い場合もある.

  6. 一つのプログラム単位(関数など)は,せいぜい,50~100 行程度以内にする.

  7. 使用するプログラミング言語で記述可能だからといって,あまり凝った表現を使用しない.

  8. 言語による変数の有効範囲の違いを考慮すると,「ブロックの外側で定義された変数と同じ名前の変数を,その内側のブロックで使用しない」,「for 文などの制御変数として,できる限り,常に同じ名前の変数を使用する」といった規則を守った方が良い.

3.2 基本的な演算子

3.2.1 算術演算子

  プログラムを構成する最も基本的な処理は,定数と変数を使用し何らかの計算を行うことです.その際使用される算術演算子としては,以下のようなものがあります.ただし,除算 / と余り % に関しては,言語によって計算方法,結果等が異なりますので注意してください.

  1. +  : 加算.C++,Java,JavaScript,Ruby,Python,及び,C# においては,文字列の結合( "abc" + "xyz" -> "abcxyz" )の際にも利用できます.ただし,C++ において文字列の結合演算子として意味を持つのは,C++ 標準ライブラリ内の string クラスを使用して文字列を生成した場合だけです.また,PHP においては,文字列に対する結合演算子としてピリオド「 . 」,VB においては「 & 」が利用されます.

  2. -  : 減算

  3. *  : 乗算

  4. /  : 除算

    • C++,Java,Ruby,C# : 被除数,除数が共に整数型の場合は,除算の結果も小数点以下が切り捨てられ,整数型となります.小数点以下の結果を求めるためには,被除数,除数のいずれかを浮動小数点型に変換して計算する必要があります.定数の場合は,10.0 のように小数点を付加する,また,変数の場合は,(double)x( C++,Java の場合),Float(x) ( Ruby の場合)のような方法で浮動小数点型に変換する必要があります.

    • JavaScript,PHP,Python,VB : 被除数,除数が共に整数型の場合においても,小数点以下まで計算されます.上のように,整数型の結果を得たい場合は,Math.floor(x / y)( JavaScript の場合),floor($x / $y),intval($x / $y),(int)($x / $y),(integer)($x / $y)( PHP の場合),int(x / y)( Python の場合)などの方法によって,小数点以下を切り捨てる必要があります.なお,Python においては,x // y によって,また,VB においては,x \ y によって,小数点以下を切り捨てた結果が得られます.

  5. %  : 余り  言語による違いが大きすぎます.特別な事情が無い限り使用しない方が良いと思います.

    • C++ : 被除数,除数は共に整数型である必要があります.

    • PHP : 被除数,除数を共に整数型に変換(小数点以下を切り捨て)してから計算されます.例えば,7.3 % 2.3 の結果は,1 になります.

    • Java,JavaScript,Ruby,Python,C#,VB : 被除数,除数は共に制限はありません.除算の結果を整数として,その余りを結果とします.例えば,7.3 % 2.3 の結果は 0.4 となります( 7.3 / 2.3 の演算結果は,3 余り 0.4 ).ただし,VB の場合は,% の代わりに Mod を使用する必要があります( 7.3 Mod 2.3 ).

  数学の場合と同様に,これらの算術演算子と括弧を使用して,様々な計算を行うことができます.記述された計算式は,基本的に,左から順に計算されていきます.しかし,「 + 」や「 - 」は,「 * 」や「 / 」や「 % 」より優先度が低いため,「 * 」等より後に計算されます.しかし,括弧があれば,その中が最も優先的に計算される点は,数学の場合と同じです.なお,Ruby,Python,及び,VB では,べき乗を計算する演算子を利用可能です( Ruby と Python : 2 ** 3, VB : 2 ^ 3 ).

3.2.2 代入演算子

  代入演算子 = 」の意味については,2.2 節において詳細に述べました.定数や計算した結果を,代入演算子によって,左辺に記述された変数に代入することになりますが,C++,Java,C# においては,右辺のデータ型と左辺のデータ型が一致しなければならないことに注意してください.特に,精度が落ちるような代入を行いたい場合は,左辺の変数の型に合うような型変換を行う必要があります.例えば,double 型を int 型に代入した場合,C++ においては,警告メッセージが出力されますが,コンパイルは実行してくれます.しかし,Java 及び C# においては,コンパイルエラーとなってしまいます.また,VB の場合,何のエラーメッセージも出力せず,小数点以下を四捨五入して代入を実行します.基本的に,型が異なる値の代入は,何が起こるのか明確でない場合が存在します.十分注意してください.

  また,算術演算子だけを対象としているわけではありませんが,ある変数に関する演算と,結果のその変数への代入を同時に行う演算子が存在します.C++ の場合を例とすれば,
k = k + 3;
k = k - 3;
k = k * 3;
k = k / 3;
k = k % 3;		
k += 3;
k -= 3;
k *= 3;
k /= 3;
k %= 3;		
のようにも書けます.

3.2.3 インクリメント演算子,デクリメント演算子

  ここで述べる演算子は,Ruby,Python,VB には存在しないので注意してください.1 だけ増やしたり減らしたりするのに,「 ++ 」(インクリメント演算子)や「 -- 」(デクリメント演算子)といった演算子を使用できます.C++ の場合を例とすれば,
k++;
n = 3 + m++;		
のような使い方をします.1 行目は,
k = k + 1;		
と同じ意味です.また,2 行目は,
n = 3 + m;
m = m + 1;		
と同じ意味です.上の例では,++ を変数の後ろに付けましたが,これは,現在の値を演算に使用した後,++ の付いた変数の値を 1 だけ増加させることを意味します.しかし,++ を変数の前に付けると,その変数の値を 1 だけ増加させた後,演算に使用されます.例えば,
n = 3 + ++m;		
は,
m = m + 1;
n = 3 + m;		
と同じ意味になります.演算子 -- についても,1 だけ減少させる点を除き,++ と同様です.

3.3 簡単なプログラム

  以下,簡単なプログラムを通して,各言語の特徴を眺めてみたいと思います.この節では,2 つのデータを入力し,その乗算と除算の結果を出力するプログラムについて検討します.プログラムは,特別な命令が存在しない限り,書かれた順序に従って実行されていきます.以下に示すプログラム例では,この原則通り,最初の行から順に(実行可能な文が)実行されていきます.

  1. C++

    01	/****************************/
    02	/* 2つのデータの乗算と除算 */
    03	/*      coded by Y.Suganuma */
    04	/****************************/
    05	#include <stdio.h>
    06	//#include <iostream>
    07	
    08	//using namespace std;
    09	
    10	int main()
    11	{
    12				// データの入力
    13		int x, y;
    14		printf("2つのデータを入力して下さい ");
    15		scanf("%d %d", &x, &y);
    16	//	cout << "2つのデータを入力して下さい ";
    17	//	cin >> x >> y;
    18				// 乗算と除算
    19		int mul = x * y;
    20		int div = x / y;
    21				// 結果の出力
    22		printf("乗算=%d 除算=%d\n", mul, div);
    23	//	cout << "乗算=" << mul << " 除算=" << div << endl;
    24	
    25		return 0;
    26	}
    			
    01 行目~ 04 行目

      プログラム全体に対する注釈コメント)です.C++ の注釈は,この例のように, /* */ と囲んで表現します(複数行にわたっても良い).また,06 行目,08 行目,12 行目,... のように, // から行末までという表現方法も可能です.

      注釈は,プログラムの該当する部分における処理内容を説明するのに使用され,人間がプログラムを読む際,理解しやすくするためのものであり,コンパイラ等によって特別な処理はされません.プログラムを実行するのはコンピュータですが,プログラムを書いたり修正したりするのは人間です.従って,プログラムを書く際に最も注意すべきことは,如何に読み易く,かつ,分かり易いプログラムを書くかという点です.できるだけ多くの注釈を入れておいて下さい.そのことにより,他の人がプログラムを理解しやすくなると共に,プログラム上のエラーも少なくなるはずです.

    05 行目,06 行目

      「 # 」で始まる文は,プリプロセッサにより処理され,結果がコンパイラに渡されます.05 行目の #include は,ヘッダファイル stdio.h の取り込みを行います.C++ では,関数を多く使用します.例えば,14,15 行目の printfscanf もシステムが用意した関数です.これらの関数を使用するためには,使用するに先立って,様々な宣言等を行う必要があります.その宣言等を自分で書くのは面倒なため,システムには,使用する関数毎に必要な宣言を記述したファイルが準備されており,それをヘッダファイルと呼びます.関数によってどのようなヘッダファイルを必要とするかは,マニュアル等に書いてありますので,その都度必要なヘッダファイルを記述して下さい.

      printf や scanf を使用しないで,代わりに,16 行目,17 行目等のように cout,cin,endl 等を使用する場合は,06 行目に記述してあるように,ヘッダファイル iostream を取り込む必要があります.いずれかだけを使用する場合にも,05 行目と 06 行目の両方を記述しておいても問題ありませんが,コンパイルした結果である実行可能プログラムのサイズが大きくなります.

    08 行目

      使用する名前空間を指定しています.一般に,プログラム内でグローバルに使用する変数名や関数名は,唯一名である必要があります.しかし,名前空間を利用することによって,異なる名前空間では,同じ変数名や関数名を使用できるようになります.この行を記述しないと,cin,cout,endl などに対して,std::cin,std::cout,std::endl のように,名前空間名を付加して記述する必要があります.cin などを使用しない場合においても,この行を記述しても問題ありません.

    10 行目

      main 関数の最初であることを表します.関数は,何らかのデータ,基本的には括弧内に記述されたデータ(この例では存在しないが,引数と呼ぶ)に基づき処理を実行し,その結果を関数を呼び出したプログラムに返します.main 関数は非常に特殊な関数であり,プログラム内にただ一つだけ存在しなければならず,名前も main と決まっています.最初の int は,処理の終了後,int 型のデータを関数を呼んだ側( main 関数の場合はシステム)に返すことを意味しています.11 行目の「 { 」と 26 行目の「 } 」に囲まれた部分が関数(プログラム)の本体になります.従って,10,11,25,及び,26 行目は,C++ のプログラムにとって常に必要となります.

      また,関数の本体に当たる 13 行目から 25 行目までは,段落を下げて(字下げして)書かれていますが,これも,プログラムを読みやすくするための一つの手段であり,必ず,このように,段落を下げて書いて下さい(どの程度下げるかは任意ですが,タブを使用する方法が一般的です).

    13 行目

      コンピュータ内で使用されるデータは,データによってその表現方法やビット列の長さ等が異なります.従って,C++ のようなコンパイラ言語においては,変数を使用する前にその変数にどのようなデータを記憶できるか,つまり,変数のデータ型を宣言しておく必要があります.この行は,プログラムで使用する変数の型を宣言している型宣言文であり,変数 x,及び,y が int 型(整数型)であることを宣言しています.初期値の指定を行っていませんので,この段階では 2 つの変数の値は未定となります.また,型宣言は,変数を使用する前に行えば良いため,19 行目,20 行目のように,代入文と同時に行っても構いません.なお,この文のように,一般的に,C++ における一つの文の終わりにはセミコロン ; 」を付ける必要があります.

    14 行目~ 15 行目,22 行目

      14 行目,15 行目は,2 つのデータを入力するための文です.単に,入力のためだけなら,15 行目の scanf だけで十分ですが,その場合,何のメッセージも出力されずキーボードからの入力待ちになってしまうため,一見コンピュータが止まってしまったように感じます.また,多くの入力を要求するような場合は,scanf だけでは,どの入力を要求しているのかが分かりません.そのため,15 行目の printf が使用されています.

      標準入出力装置(一般的には,キーボードとディスプレイ)に対して入出力を行う場合,対象とするものは文字列です.キーボードから入力する場合,たとえ数値であっても,2 進数を使用したコンピュータの内部表現ではなく,例えば 123.45 のように,我々が読むことができる文字列として入力します.しかし,数値データを,入力された文字列としてそのまま記憶したならば,演算等を行うことができません.そのため,入力された文字列をコンピュータ内部で使用する表現方法に変換して記憶してやる必要があります.例えば,123.45 という文字列を数値として扱いたければ,浮動小数点表現に変換して記憶しておく必要があります.もちろん,123.45 を文字列として内部的に扱いたければ,文字列として記憶しておく必要があります.

      また,ディスプレイに出力する場合も,メモリ(変数)に記憶されているデータを文字列に変換して出力します.さもなければ,我々は,0 と 1 の並びとして出力される結果を自分自身で解釈しなければなりません.scnaf や printf を使用する場合,これらの変換方法を指定してやる必要があります.例えば,scanf は,以下のようにして使用します.
    	double d_data;
    	int i_data;
    	char c_data[10];
    	scanf("%lf %d %s", &d_data, &i_data, c_data);				
      "%lf %d %s" の部分が,入力されたデータをどのように変換するかを指定する部分です. % に続く文字列が 3 つありますので,3 つのデータが入力されることを意味します.入力された文字列に対して,%lf は double 型( float 型は %f,long double 型は %Lf )の浮動小数点表示に変換して, %d は int 型( long int 型は %ld であるが,int 型と long int 型のサイズが等しいときはいずれも %d とする.また,long long int 型は %lld となる.)の整数に変換して,また,%s は文字列としてそのまま,記憶することを意味しています.これら 3 つの % で始まる文字列は,次に続く 3 つのデータに順番に対応していますので,この scanf 関数に対して,例えば,
    	3.14 123 abc				
    のように入力すると,d_data に 3.14 が double 型に変換され,i_data に 123 が int 型に変換され,また,c_data に文字列 abc が,記憶されます.各変数に対して,アドレス演算子 & を利用してそのアドレスを指定しなければならない点に注意してください.

      printf は,scanf とは逆に,記憶されたデータを文字列に変換する操作を行います.例えば,以下のようにして使用します.
    	double d_data;
    	int i_data;
    	char c_data[10];
    	  ・・・・・
    	printf("結果は %f %10.3f %d %5d %s\n", d_data, d_data, i_data, i_data, c_data);				
      この結果,まず,"結果は" という文字列が出力されます.printf においては,% で始まる文字列とエスケープシーケンス(後述)以外は,記述された内容がそのまま出力されます.次に,以下の順序で 5 つのデータが出力されます(各データ間には,1 つのスペースが入る).

    1. %f は double 型( %Lf は long double 型)のデータを固定小数点表現の文字列に変換します.なお,1.23x10-3 のような表現方法に対応する 1.23e-03 という方法-浮動小数点表現-も存在します( %e,%Le). % と f の間に何も記述しなければ,全体の桁数や小数点以下の桁数がシステムの標準形式に従います.この場合,d_data の内容が,システムの標準形式に従って出力されます.

    2. 最初のデータと変換方法は同じですが,この場合は,出力形式を指定しています.d_data の内容が,小数点以下 3 桁,全体の桁数 10 桁で出力されます(例: △△△-12.345 ).桁数が 10 桁に満たない場合は,左側にスペースが挿入されます.全体の桁数を指定しない場合は,10 の部分を省略しても構いません.

    3. %d は int 型( long int 型は %ld であるが,int 型と long int 型のサイズが等しいときはいずれも %d とする.また,long long int 型は %lld となる.)のデータを文字列に変換します.% と d の間に何も記述しなければ,システムの標準形式に従って出力されます.この場合,i_data の内容が,システムの標準形式に従って出力されます.

    4. 上の i_data と変換方法は同じですが,この場合は,出力形式を指定しています.i_data の内容が,全体の桁数 5 桁で出力されます(例: △△-12 ).桁数が 5 桁に満たない場合は,左側にスペースが挿入されます.

    5. c_data の内容が文字列として出力されます.なお,1 文字に対する入出力には,「%c」を使用します.

      以上の説明に従うと,14 行目の printf は,入力を促すメッセージを出力するだけです.22 行目では,mul と div の値を出力しています.22 行目の " の中の最後の記号 \n も 1 文字を表し,そのまま出力されますが, \ の付いた記号は,エスケープシーケンスescape sequence )といって,特別な働きをします.例えば, \n が出力されると改行が行われます.また,19 行目,20 行目を省略し,22 行目の mul と div の代わりに,(x * y),(x / y) という式を記述することも可能です.

      15 行目の scanf では,キーボードから入力された 2 つのデータが変数 x 及び y に代入されます.ここで初めて,2 つの変数の値が確定することになります.

    16 行目~ 17 行目,23 行目

      16 行目,23 行目は,printf に対応する文であり,<< の次が文字列であればそのまま,変数や式であれば文字列に変換され,それらの文字列を結合して出力されます.19 行目,20 行目を省略し,23 行目の mul と div の代わりに,x * y,x / y という式を記述することも可能です.なお,endl は改行を意味し,"\n" を出力することと同じです.また,17 行目は,入力されたデータが,>> の次に記述された変数に,入力された順番に適切なデータ型に変換されて記憶されます.

    19 行目~ 20 行目

      これらの文では,見て明らかなように,乗算と除算の計算をし,結果を変数 mul と div に代入しています.変数 x,及び,y に対しては,それらの値が参照されているだけですので,15 行目で記憶された値がそのまま保たれています.入力した値,または,乗算した結果が int で表現可能な値より大きくならない,さらに,2 番目( y )の値として 0 を入力しない( 0 で割ることになる)ようにしてください.

    25 行目

      return 文は,関数によって処理された結果を関数を呼び出したプログラムに返すための文です.この例の場合は,結果が正常に終了したこと( 0 )をシステムに返しています.

      このプログラムを実行し,8 と 3 を,
    2つのデータを入力して下さい 8 3				
    のように入力すると(下線部が入力する部分,2 つのデータを改行で区切っても良い),以下のような結果が得られます.除算において,結果の小数点以下が切り捨てられていることに注意してください.
    乗算=24 除算=2				

  2. Java

    01	/****************************/
    02	/* 2つのデータの乗算と除算 */
    03	/*      coded by Y.Suganuma */
    04	/****************************/
    05	import java.io.*;
    06	import java.util.*;
    07	
    08	public class Test {
    09		public static void main(String args[]) throws IOException
    10		{
    11				// データの入力
    12			System.out.printf("2つのデータを入力して下さい ");
    13	//		System.out.print("2つのデータを入力して下さい ");
    14			BufferedReader inp = new BufferedReader(new InputStreamReader(System.in));
    15			StringTokenizer str = new StringTokenizer(inp.readLine(), " ");
    16			int x = Integer.parseInt(str.nextToken());
    17			int y = Integer.parseInt(str.nextToken());
    18				// 和と差の計算
    19			int mul = x * y;
    20			int div = x / y;
    21				// 結果の出力
    22			System.out.printf("乗算=%d 除算=%d\n", mul, div);
    23	//		System.out.println("乗算=" + mul + " 除算=" + div);
    24		}
    25	}
    			
    01 行目~ 04 行目

      プログラム全体に対する注釈コメント)です.Java の注釈は,この例のように, /* */ と囲んで表現します(複数行にわたっても良い).また,11 行目,13 行目,... のように, // から行末までという表現方法も可能です.

      注釈は,プログラムの該当する部分における処理内容を説明するのに使用され,人間がプログラムを読む際,理解しやすくするためのものであり,コンパイラ等によって特別な処理はされません.プログラムを実行するのはコンピュータですが,プログラムを書いたり修正したりするのは人間です.従って,プログラムを書く際に最も注意すべきことは,如何に読み易く,かつ,分かり易いプログラムを書くかという点です.できるだけ多くの注釈を入れておいて下さい.そのことにより,他の人がプログラムを理解しやすくなると共に,プログラム上のエラーも少なくなるはずです.

    05 行目,06 行目

      Java のプログラムはクラスの組合せによって構成されています.クラスに関しては後述(第7章)しますが,簡単に言えば,複数のデータとそれらのデータを処理するための関数の集まりです.プログラムを書く際には,システムに組み込まれている多くのクラスを利用します.import 文は,それらのクラスを組み込むための文です.このプログラムでは,java.io パッケージ内にある入出力関係のクラス( BufferedReader クラスInputStreamReader クラス),及び,java.util パッケージにある StringTokenizer クラスを使用していますので,これらの記述をしています.* は,そのパッケージにあるすべてのクラスを意味しますが,
    	import java.util.StringTokenizer				
    のように,必要なクラスだけを記述することも可能です.

    08 行目

      このプログラムで作成するクラス Test の定義の開始です.クラスの定義は,25 行目まで続き,その本体は 09 行目~ 24 行目です.クラスの本体は,段落を下げて(字下げして)書かれていますが,これも,プログラムを読みやすくするための一つの手段であり,必ず,このように,段落を下げて書いて下さい(どの程度下げるかは任意ですが,タブを使用する方法が一般的です).

      public 指定されたクラスは,すべてのクラスからアクセス可能になります.一つのファイル内で public 宣言できるのは一つのクラスだけであり,そのファイル名は,「 (public 指定されたクラス名).java 」にする必要があります.たとえば,このプログラムのファイル名は Test.java になります.

    09 行目

      main 関数( main メソッド)の最初であることを表します.関数は,外部から与えられたデータ(この例の場合は String args[] )やクラス内のデータ等に基づき何らかの処理を実行し,その結果を関数を呼び出したプログラムに返します.ただし,void 指定された関数は何も返しません.main 関数は非常に特殊な関数であり,プログラム内にただ一つだけ存在しなければならず,名前も main と決まっています.10 行目の「 { 」と 24 行目の「 } 」に囲まれた部分が main 関数の本体になります.従って,09,10,及び,24 行目は,Java のプログラムにとって常に必要となります.

      main 関数に対しては,必ず,public static void の指定をしなければなりませんが,一般に,public は,この関数をすべてのクラスからアクセスできることを意味します.また,static は,関数を呼ぶ際,「 (クラスのオブジェクト名).関数名」ではなく,「 (クラス名).関数名」という形で呼ぶ必要があることを意味しています.括弧内の String args[] は,引数と呼ばれ,関数を呼ぶ際に,関数に情報を与えるために使用されます.main 関数の場合は,例えば,コマンドプロンプト上でこのプログラムを実行する際,
    	java Test 2 3				
    の下線部のようなデータを,プログラム Test に渡したい場合,そのデータが args に記憶されて渡されます.もちろん,それを処理するための部分を記述する必要があります.String args[] は,args が,String クラスのオブジェクトからなる配列であることを意味しています.

      「 throws IOException 」は,入出力で発生する例外(例えば,ファイルから入力しようとしたが,指定されたファイルが存在しない等.「簡単なプログラム」,「例外処理」等を参照)を処理するための記述です.この記述は,例外が発生した場合,その処理をこのプログラムを呼び出した側に任せるためのものです.入力を行う場合は,必ず記述しておいてください.

    12 行目,22 行目

      2 つのデータを入力するためだけであれば,14 行目~ 17 行目だけで十分ですが,その場合,何のメッセージも出力されずキーボードからの入力待ちになってしまうため,一見コンピュータが止まってしまったように感じます.また,多くの入力を要求するような場合は,どの入力を要求しているのかが分かりません.そのため,12 行目の printf が使用されています.また,22 行目は,結果を出力するための printf です.なお,これらの文のように,一般的に,Java における一つの文の終わりにはセミコロン ; 」を付ける必要があります.

      標準入出力装置(一般的には,キーボードとディスプレイ)に対して入出力を行う場合,対象とするものは文字列です.キーボードから入力する場合,たとえ数値であっても,2 進数を使用したコンピュータの内部表現ではなく,例えば 123.45 のように,我々が読むことができる文字列として入力します.しかし,数値データを,入力された文字列としてそのまま記憶したならば,演算等を行うことができません.そのため,入力された文字列をコンピュータ内部で使用する表現方法に変換して記憶してやる必要があります.例えば,123.45 という文字列を数値として扱いたければ,浮動小数点表現に変換して記憶しておく必要があります.また,ディスプレイに出力する場合も,メモリ(変数)に記憶されているデータを文字列に変換して出力します.さもなければ,我々は,0 と 1 の並びとして出力される結果を自分自身で解釈しなければなりません.printf は,PrintStream クラスの関数であり,ここでは,System クラスのフィールドである out (標準出力ストリーム,PrintStream クラスのオブジェクト)の関数として使用しています.printf を使用する場合,C++ における printf と同様,記憶されたデータを文字列に変換する操作を指定してやる必要があります.例えば,以下のようにして使用します.
    	double d_data = -12.34456;
    	int i_data = -12;
    	String c_data = "abc";
    	System.out.printf("結果は %f %10.3f %d %5d %s\n", d_data, d_data, i_data, i_data, c_data);				
      この結果,まず,"結果は" という文字列が出力されます.printf においては,% で始まる文字列とエスケープシーケンス(後述)以外は,記述された内容がそのまま出力されます.次に,以下の順序で 5 つのデータが出力されます(各データ間には,1 つのスペースが入る).

    1. %f は double 型のデータを固定小数点表現の文字列に変換します.なお,1.23x10-3 のような表現方法に対応する 1.23e-03 という方法-浮動小数点表現-も存在します( %e ). % と f の間に何も記述しなければ,全体の桁数や小数点以下の桁数がシステムの標準形式に従います.この場合,d_data の内容が,システムの標準形式に従って出力されます.

    2. 最初のデータと変換方法は同じですが,この場合は,出力形式を指定しています.d_data の内容が,小数点以下 3 桁,全体の桁数 10 桁で出力されます(例: △△△-12.345 ).桁数が 10 桁に満たない場合は,左側にスペースが挿入されます.全体の桁数を指定しない場合は,10 の部分を省略しても構いません.

    3. %d は int 型のデータを文字列に変換します.% と d の間に何も記述しなければ,システムの標準形式に従って出力されます.この場合,i_data の内容が,システムの標準形式に従って出力されます.

    4. 上の i_data と変換方法は同じですが,この場合は,出力形式を指定しています.i_data の内容が,全体の桁数 5 桁で出力されます(例: △△-12 ).桁数が 5 桁に満たない場合は,左側にスペースが挿入されます.

    5. c_data の内容が文字列として出力されます.なお,1 文字に対する入出力には,「%c」を使用します.

      以上の説明に従うと,12 行目の printf は,入力を促すメッセージを出力するだけです.22 行目では,mul と div の値を出力しています.22 行目の " の中の最後の記号 \n も 1 文字を表し,そのまま出力されますが, \ の付いた記号は,エスケープシーケンスescape sequence )といって,特別な働きをします.例えば, \n が出力されると改行が行われます.また,19 行目,20 行目を省略し,22 行目の mul と div の代わりに,(x * y),(x / y) という式を記述することも可能です.

    13 行目,23 行目

      12 行目,22 行目の代わりに,これらの行を使用することもできます.print や println は,文字列を出力するための関数です.println と print の違いは,改行を行うか否かの違いです.23 行目においては,mul や div の値が自動的に文字列に変換され,それらが + 演算子によって文字列として結合され,その結果が出力されます.

    14 行目

      BufferedReader クラスのインスタンス(オブジェクト)を生成しています.コンピュータ内で使用されるデータは,データによってその表現方法やビット列の長さ等が異なります.従って,Java のようなコンパイラ言語においては,変数を使用する前にその変数にどのようなデータを記憶できるか,つまり,変数のデータ型を宣言しておく必要があります.この行は,クラスのインスタンス(オブジェクト)を生成するための文ですが,x が int 型(整数型)の変数であることを宣言している 16 行目と同様,使用する変数の型を宣言する型宣言文としてみることもできます.つまり,inp が BufferedReader クラス 型の変数であることを宣言しています.

      この行は,
    	InputStreamReader ip = new InputStreamReader(System.in);
    	BufferedReader inp = new BufferedReader(ip);				
    のようにも記述できます.この 2 行では,まず,InputStream クラスのオブジェクト System.in ( in は,System クラスのフィールドであり,標準入力ストリームを表す InputStream クラスのオブジェクト)を引数として,InputStreamReader クラスのインスタンス(オブジェクト) ip を生成します.次に,InputStreamReader クラスのオブジェクト ip を引数として,BufferedReader クラスのインスタンス(オブジェクト) inp を生成しています.14 行目は,上の 2 行を 1 行で記述したものです.

    15 行目

      StringTokenizer クラスのインスタンス(オブジェクト) str を生成しています.この行は,
    	String str1 = inp.readLine();
    	StringTokenizer str = new StringTokenizer(str1, " ");				
    のようにも記述できます.この 2 行では,まず,BufferedReader クラスの関数 readLine() によって,入力された 1 行分のデータを文字列として読み込み,String クラスのオブジェクト str1 に記憶しています.次に,この文字列と半角スペースを引数として,StringTokenizer クラスのインスタンス(オブジェクト) str を生成しています.StringTokenizer クラスは,文字列を指定した区切り文字(この例では,半角スペース)で区切るためのクラスです.15 行目は,上の 2 行を 1 行で記述したものです.

    16 行目~ 17 行目

      StringTokenizer クラスの関数 nextToken を使用して,半角スペースで区切った文字列を順番に取り出し,その文字列を Integer クラスの static 関数 parseInt を使用して,int 型に変換し,int 型の変数 x,y に記憶しています.この 2 行は,以下のようにも記述できます.
    	String str2 = str.nextToken();
    	int x = Integer.parseInt(str2);
    	str2 = str.nextToken();
    	int y = Integer.parseInt(str2);				
    19 行目~ 20 行目

      これらの文では,見て明らかなように,乗算と除算の計算をし,結果を変数 mul と div に代入しています.変数 x,及び,y に対しては,それらの値が参照されているだけですので,16 行目~ 17 行目で記憶された値がそのまま保たれています.入力した値,または,乗算した結果が int で表現可能な値より大きくならない,さらに,2 番目( y )の値として 0 を入力しない( 0 で割ることになる)ようにしてください.

      このプログラムを実行し,8 と 3 を,
    2つのデータを入力して下さい 8 3				
    のように入力すると(下線部が入力する部分),以下のような結果が得られます.除算において,結果の小数点以下が切り捨てられていることに注意してください.なお,このプログラムにおいて採用した以外の入力データに対する処理方法も存在しますが,詳細については,「 Java と C/C++ 」の「簡単なプログラム」を参照してください.
    乗算=24 除算=2				

  3. JavaScript

      JavaScript には,入出力の機能が存在しませんので,以後,HTML ファイルに埋め込んだ状態で説明していきます.この例の場合,以下に示すプログラムを HTML ファイルとして保存し,ブラウザを使用して表示すると以下に示すような画面が表示されます.この例に対しても,ここをクリックすれば,ブラウザによって以下のような画面が表示され,実行することができます.また,ページのソースを表示すれば,下に示した JavaScript のソースプログラムも表示可能です.
      x,及び,y の右側の空白部分に数値を入力し,「 OK 」ボタンをクリックすると,乗算及び除算の結果が下に表示されます.上の図は,8 と 3 を入力して「 OK 」ボタンをクリックしたときの状態です.なお,HTML や HTML と JavaScript との関係などについて,多少の説明は行いますが,詳細に関しては「 HTML & CSS」や「 JavaScript と C/C++」を参照してください.

    01	<!DOCTYPE HTML>
    02	<HTML>
    03	<HEAD>
    04		<TITLE>乗算と減算</TITLE>
    05		<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=utf-8">
    06		<SCRIPT TYPE="text/javascript">
    07			/****************************/
    08			/* 2つのデータの乗算と除算 */
    09			/*      coded by Y.Suganuma */
    10			/****************************/
    11			function run() {
    12					// データの取得
    13				let x = parseInt(document.getElementById("x").value);
    14				let y = parseInt(document.getElementById("y").value);
    15					// 結果の設定
    16				document.getElementById("mul").value = x * y;
    17				document.getElementById("div").value = x / y;
    18			}
    19		</SCRIPT>
    20	</HEAD>
    21	<BODY  STYLE="font-size:130%">
    22		<P STYLE="text-align:center">
    23			x : <INPUT TYPE="text" ID="x" SIZE="5" STYLE="font-size:120%"> 
    24			y : <INPUT TYPE="text" ID="y" SIZE="5" STYLE="font-size:120%"> 
    25			<INPUT TYPE="button" VALUE="OK" onClick="run()" STYLE="font-size:90%"><BR><BR>
    26			乗算 = <INPUT TYPE="text" ID="mul" SIZE="10" STYLE="font-size:120%"><BR>
    27			除算 = <INPUT TYPE="text" ID="div" SIZE="10" STYLE="font-size:120%">
    28		</P>
    29	</BODY>
    30	</HTML>
    			
    07 行目~ 10 行目

      以下に示す関数 run に対する注釈コメント)です.JavaScript の注釈は,この例のように, /* */ と囲んで表現します(複数行にわたっても良い).また,12 行目,15 行目のように, // から行末までという表現方法も可能です.

      注釈は,プログラムの該当する部分における処理内容を説明するのに使用され,人間がプログラムを読む際,理解しやすくするためのものであり,インタプリータ等によって特別な処理はされません.プログラムを実行するのはコンピュータですが,プログラムを書いたり修正したりするのは人間です.従って,プログラムを書く際に最も注意すべきことは,如何に読み易く,かつ,分かり易いプログラムを書くかという点です.できるだけ多くの注釈を入れておいて下さい.そのことにより,他の人がプログラムを理解しやすくなると共に,プログラム上のエラーも少なくなるはずです.

    11 行目

      関数 run の定義の開始です.関数は,外部から与えられたデータ,基本的には括弧内に記述されたデータ(この例では存在しないが,引数と呼ぶ)等に基づき何らかの処理を実行し,その結果を関数を呼び出したプログラムに返します(返さない関数も存在する).11 行目の「 { 」と 18 行目の「 } 」に囲まれた部分が関数 run の本体になります.また,関数の本体に当たる 12 行目から 17 行目までは,段落を下げて(字下げして)書かれていますが,これも,プログラムを読みやすくするための一つの手段であり,必ず,このように,段落を下げて書いて下さい(どの程度下げるかは任意ですが,タブを使用する方法が一般的です).

      この関数は,25 行目の「 onClick="run()" 」という記述により,「 OK 」ボタンをクリックしたとき呼ばれます.

    13 行目,14 行目

      23 行目,24 行目の記述によって表示されたテキストフィールドに入力されたデータを,変数 x,y に記憶しています.変数の前に let を付加することによって,この変数が関数内の,この宣言(代入)が行われた以降だけで有効なローカル変数であることを示します.13 行目では,getElementById("x") によって ID 属性が "x" である要素(この場合は,23 行目の INPUT 要素)を特定し,その value 値(文字列)を得,得られた文字列を parseInt で整数に変換しています.14 行目も同様です.

      JavaScript のようなインタプリタでは,C++ のような型宣言を行う必要がありません.変数にデータを代入することによって,その変数の型が決まります.変数 x,y には,整数が代入されていますので,これらの変数の型は整数型になります.なお,これらの文のように,一般的に,JavaScript における一つの文の終わりにはセミコロン ; 」を付ける必要があります.

    16 行目,17 行目

      26 行目,27 行目の記述によって表示されたテキストフィールドに,乗算及び除算の結果を設定しています.

      このプログラムをブラウザで表示し,8 と 3 を入力し,「 OK 」ボタンをクリックすると,乗算及び除算の結果は以下のようになります.この例に示すように,JavaScript においては,常に,浮動小数点数として計算されます.
    乗算 = 24
    除算 = 2.6666666666666665				

  4. PHP

    01	<?php
    02		/****************************/
    03		/* 2つのデータの乗算と除算 */
    04		/*      coded by Y.Suganuma */
    05		/****************************/
    06				// データの入力
    07		printf("2つのデータを入力して下さい ");
    08	//	echo "2つのデータを入力して下さい ";
    09	//	print "2つのデータを入力して下さい ";
    10		$str = trim(fgets(STDIN));
    11		$x   = intval(strtok($str, " "));   // 小数点以下切り捨て
    12		$y   = intval(strtok(" "));   // 小数点以下切り捨て
    13				// 乗算と除算
    14		$mul = $x * $y;
    15		$div = $x / $y;
    16				// 結果の出力
    17		printf("乗算=%d 除算=%d %.3f\n", $mul, $div, $div);
    18		echo "乗算=".$mul." 除算=".$div."\n";
    19		print "乗算=".$mul." 除算=".$div."\n";
    20	?>
    			
    02 行目~ 05 行目

      プログラム全体に対する注釈コメント)です.PHP の注釈は,この例のように, /* */ と囲んで表現します(複数行にわたっても良い).また,08 行目,09 行目,13 行目,... のように, // から行末までという表現方法も可能です.

      注釈は,プログラムの該当する部分における処理内容を説明するのに使用され,人間がプログラムを読む際,理解しやすくするためのものであり,インタプリータ等によって特別な処理はされません.プログラムを実行するのはコンピュータですが,プログラムを書いたり修正したりするのは人間です.従って,プログラムを書く際に最も注意すべきことは,如何に読み易く,かつ,分かり易いプログラムを書くかという点です.できるだけ多くの注釈を入れておいて下さい.そのことにより,他の人がプログラムを理解しやすくなると共に,プログラム上のエラーも少なくなるはずです.

    07 行目,17 行目

      2 つのデータを入力するためだけであれば,10 行目~ 12 行目だけで十分ですが,その場合,何のメッセージも出力されずキーボードからの入力待ちになってしまうため,一見コンピュータが止まってしまったように感じます.また,多くの入力を要求するような場合は,どの入力を要求しているのかが分かりません.そのため,07 行目の文字列関数 printf が使用されています.また,17 行目は,結果を出力するための printf です.関数は,外部から与えられたデータに基づき,何らかの処理を行いその結果を返します.関数にデータを与える方法の一つが引数です(以下の例において,printf の後ろの括弧内に書かれた部分).なお,これらの文のように,一般的に,PHP における一つの文の終わりにはセミコロン ; 」を付ける必要があります.

      標準入出力装置(一般的には,キーボードとディスプレイ)に対して入出力を行う場合,対象とするものは文字列です.キーボードから入力する場合,たとえ数値であっても,2 進数を使用したコンピュータの内部表現ではなく,例えば 123.45 のように,我々が読むことができる文字列として入力します.しかし,数値データを,入力された文字列としてそのまま記憶したならば,演算等を行うことができません.そのため,入力された文字列をコンピュータ内部で使用する表現方法に変換して記憶してやる必要があります.例えば,123.45 という文字列を数値として扱いたければ,動小数点表現に変換して記憶しておく必要があります.また,ディスプレイに出力する場合も,メモリ(変数)に記憶されているデータを文字列に変換して出力します.さもなければ,我々は,0 と 1 の並びとして出力される結果を自分自身で解釈しなければなりません.printf を使用する場合,C++ における printf と同様,記憶されたデータを文字列に変換する操作を指定してやる必要があります.例えば,以下のようにして使用します.
    	$d_data = -12.34456;
    	$i_data = -12;
    	$c_data = "abc";
    	printf("結果は %f %10.3f %d %5d %s\n", $d_data, $d_data, $i_data, $i_data, $c_data);				
      この結果,まず,"結果は" という文字列が出力されます.printf においては,% で始まる文字列とエスケープシーケンス(後述)以外は,記述された内容がそのまま出力されます.次に,以下の順序で 5 つのデータが出力されます(各データ間には,1 つのスペースが入る).

    1. %f は 浮動小数点型のデータを固定小数点表現の文字列に変換します.なお,1.23x10-3 のような表現方法に対応する 1.23e-03 という方法-浮動小数点表現-も存在します( %e ). % と f の間に何も記述しなければ,全体の桁数や小数点以下の桁数がシステムの標準形式に従います.この場合,$d_data の内容が,システムの標準形式に従って出力されます.

    2. 最初のデータと変換方法は同じですが,この場合は,出力形式を指定しています.$d_data の内容が,小数点以下 3 桁,全体の桁数 10 桁で出力されます(例: △△△-12.345 ).桁数が 10 桁に満たない場合は,左側にスペースが挿入されます.全体の桁数を指定しない場合は,10 の部分を省略しても構いません.

    3. %d は 整数型のデータを文字列に変換します.% と d の間に何も記述しなければ,システムの標準形式に従って出力されます.この場合,$i_data の内容が,システムの標準形式に従って出力されます.

    4. 上の $i_data と変換方法は同じですが,この場合は,出力形式を指定しています.$i_data の内容が,全体の桁数 5 桁で出力されます(例: △△-12 ).桁数が 5 桁に満たない場合は,左側にスペースが挿入されます.

    5. $c_data の内容が文字列として出力されます.なお,1 文字に対する入出力には,「%c」を使用します.

      以上の説明に従うと,07 行目の printf は,入力を促すメッセージを出力するだけです.17 行目では,$mul と $div の値を出力しています.17 行目の " の中の最後の記号 \n も 1 文字を表し,そのまま出力されますが, \ の付いた記号は,エスケープシーケンスescape sequence )といって,特別な働きをします.例えば, \n が出力されると改行が行われます.また,14 行目,15 行目を省略し,17 行目の $mul と $div の代わりに,($x * $y),($x / $y) という式を記述することも可能です.

    08 行目~ 09 行目,18 行目~ 19 行目

      12 行目,17 行目の代わりに,これらの行のいずれかを使用することもできます.echoprint は,文字列を出力するための言語構造です.18 行目~ 19 行目においては,$mul や $div の値が自動的に文字列に変換され,それらが . 演算子によって文字列として結合され,その結果が出力されます.

    10 行目

      fgets は,ストリームから 1 行分のデータを読み込むための関数です.ストリームとして SDTIN を指定することによって,標準入力からの入力が可能になります.この行を実行することによって,標準入力装置から入力した 1 行分のデータが,文字列として変数 $str に記憶されます.

      PHP のようなインタプリタでは,C++ のような型宣言を行う必要がありません.変数にデータを代入することによって,その変数の型が決まります.変数 $str には,文字列が代入されていますので,$str の型は文字列型になります.また,この行に示すように,PHP における変数名は,必ず $ から始まります.なお,trim は,文字列の前後の空白や改行を取り除くための関数です.

      この例の場合は,
    	fscanf(STDIN, "%d %d", $x, $y);				
    のように,fscanf(STDIN, ・・・ ) を利用することも可能です.fscanf は,C++ における fscanf と似たような働きをしますので,10 ~ 12 行目のように,strtok を使用してデータを分離する必要はありません.しかし,
    	2.3 4.5 3.4 .....				
    のように,1 行内に記述された可変個のデータを,for 文などの繰り返し文を使用して,
    	for ($i1 = 0; $i1 < $n; $i1++)
    		fscanf(STDIN, "%lf", $x[$i1]);				
    のような方法で入力した場合には,期待したとおりの結果になりませんので注意してください.

    11 行目~ 12 行目

      $str には,2 つのデータが半角スペースで区切られて入っていますので,それを分離してやる必要があります.それを実行する関数が strtok です.また,intval は,整数型に変換するための関数であり,小数点以下は切り捨てられます.

    14 行目~ 15 行目

      これらの文では,見て明らかなように,乗算と除算の計算をし,結果を変数 $mul と $div に代入しています.変数 $x,及び,$y に対しては,それらの値が参照されているだけですので,11 行目~ 12 行目で記憶された値がそのまま保たれています.入力した値,または,乗算した結果が int で表現可能な値より大きくならない,さらに,2 番目( y )の値として 0 を入力しない( 0 で割ることになる)ようにしてください.

      このプログラムを実行し,8 と 3 を,
    2つのデータを入力して下さい 8 3				
    のように入力すると(下線部が入力する部分),以下のような結果が得られます.整数型同士の除算であっても,小数点以下まで計算されることに注意してください.ただし,17 行目に対応する出力(出力の 1 行目)から明らかなように,%d を使用して出力すると小数点以下が切り捨てられます.
    乗算=24 除算=2 2.667
    乗算=24 除算=2.6666666666667
    乗算=24 除算=2.6666666666667				

  5. Ruby

    01	############################
    02	# 2つのデータの乗算と除算 #
    03	#      coded by Y.Suganuma #
    04	############################
    05				# データの入力
    06	printf "2つのデータを入力して下さい ";
    07	#print "2つのデータを入力して下さい ";
    08	str = gets().strip();   # gets でも良い(以下の関数も同様);
    09	a   = str.split(" ");
    10	x   = Integer(a[0]);
    11	y   = Integer(a[1]);
    12				# 和と差の計算
    13	mul = x * y;
    14	div = x / y;
    15				# 結果の出力
    16	printf "乗算=%d 除算=%d\n", mul, div;
    17	#print "乗算=", mul, " 除算=", div, "\n";
    			
    01 行目~ 04 行目

      プログラム全体に対する注釈コメント)です.Ruby の注釈は,この例のように, # から行末までという形で表現します.複数行にわたるコメントは,以下に示すような形式でも表現できます.
    	=begin
    	  2つのデータの乗算と除算
    	       coded by Y.Suganuma
    	=end				
      注釈は,プログラムの該当する部分における処理内容を説明するのに使用され,人間がプログラムを読む際,理解しやすくするためのものであり,インタプリータ等によって特別な処理はされません.プログラムを実行するのはコンピュータですが,プログラムを書いたり修正したりするのは人間です.従って,プログラムを書く際に最も注意すべきことは,如何に読み易く,かつ,分かり易いプログラムを書くかという点です.できるだけ多くの注釈を入れておいて下さい.そのことにより,他の人がプログラムを理解しやすくなると共に,プログラム上のエラーも少なくなるはずです.

    06 行目,16 行目

      2 つのデータを入力するためだけであれば,08 行目~ 11 行目だけで十分ですが,その場合,何のメッセージも出力されずキーボードからの入力待ちになってしまうため,一見コンピュータが止まってしまったように感じます.また,多くの入力を要求するような場合は,どの入力を要求しているのかが分かりません.そのため,06 行目の組み込み関数 printf が使用されています.また,16 行目は,結果を出力するための printf です.なお,これらの文においては,一つの文の終わりにセミコロン ; 」が付加してありますが,改行だけで文の終わりを示しても構いません.

      標準入出力装置(一般的には,キーボードとディスプレイ)に対して入出力を行う場合,対象とするものは文字列です.キーボードから入力する場合,たとえ数値であっても,2 進数を使用したコンピュータの内部表現ではなく,例えば 123.45 のように,我々が読むことができる文字列として入力します.しかし,数値データを,入力された文字列としてそのまま記憶したならば,演算等を行うことができません.そのため,入力された文字列をコンピュータ内部で使用する表現方法に変換して記憶してやる必要があります.例えば,123.45 という文字列を数値として扱いたければ,浮動小数点表現に変換して記憶しておく必要があります.また,ディスプレイに出力する場合も,メモリ(変数)に記憶されているデータを文字列に変換して出力します.さもなければ,我々は,0 と 1 の並びとして出力される結果を自分自身で解釈しなければなりません.printf を使用する場合,C++ における printf と同様,記憶されたデータを文字列に変換する操作を指定してやる必要があります.例えば,以下のようにして使用します.

      関数は,外部から与えられたデータに基づき,何らかの処理を行いその結果を返します.関数にデータを与える方法の一つが引数です(以下の例において,printf の後ろに書かれた部分).なお,Ruby においては,関数を呼び出す場合,
    	printf("結果は %f %10.3f %d %5d %s\n", d_data, d_data, i_data, i_data, c_data)				
    のように引数の部分を括弧で囲んでも,次の例のように,括弧を使用しなくても,いずれの方法でも構いません.
    	d_data = -12.34456
    	i_data = -12
    	c_data = "abc";
    	printf "結果は %f %10.3f %d %5d %s\n", d_data, d_data, i_data, i_data, c_data				
      上のプログラムを実行すると,まず,"結果は" という文字列が出力されます.printf においては,% で始まる文字列とエスケープシーケンス(後述)以外は,記述された内容がそのまま出力されます.次に,以下の順序で 5 つのデータが出力されます(各データ間には,1 つのスペースが入る).

    1. %f は 浮動小数点型のデータを固定小数点表現の文字列に変換します.なお,1.23x10-3 のような表現方法に対応する 1.23e-03 という方法-浮動小数点表現-も存在します( %e ). % と f の間に何も記述しなければ,全体の桁数や小数点以下の桁数がシステムの標準形式に従います.この場合,d_data の内容が,システムの標準形式に従って出力されます.

    2. 最初のデータと変換方法は同じですが,この場合は,出力形式を指定しています.d_data の内容が,小数点以下 3 桁,全体の桁数 10 桁で出力されます(例: △△△-12.345 ).桁数が 10 桁に満たない場合は,左側にスペースが挿入されます.全体の桁数を指定しない場合は,10 の部分を省略しても構いません.

    3. %d は 整数型のデータを文字列に変換します.% と d の間に何も記述しなければ,システムの標準形式に従って出力されます.この場合,i_data の内容が,システムの標準形式に従って出力されます.

    4. 上の i_data と変換方法は同じですが,この場合は,出力形式を指定しています.i_data の内容が,全体の桁数 5 桁で出力されます(例: △△-12 ).桁数が 5 桁に満たない場合は,左側にスペースが挿入されます.

    5. c_data の内容が文字列として出力されます.なお,1 文字に対する入出力には,「%c」を使用します.

      以上の説明に従うと,06 行目の printf は,入力を促すメッセージを出力するだけです.16 行目では,mul と div の値を出力しています.16 行目の " の中の最後の記号 \n も 1 文字を表し,そのまま出力されますが, \ の付いた記号は,エスケープシーケンスescape sequence )といって,特別な働きをします.例えば, \n が出力されると改行が行われます.また,13 行目,14 行目を省略し,16 行目の mul と div の代わりに,(x * y),(x / y) という式を記述することも可能です.

    07 行目,17 行目

      06 行目,16 行目の代わりに,これらの行を使用することもできます.print においては,カンマで区切られたデータが順番に出力されます.その際,mul や div の値が自動的に文字列に変換されます.

    08 行目

      組み込み関数 gets を利用して,標準入力から 1 行分のデータを文字列として入力し,変数 str に記憶しています.Ruby のようなインタプリタでは,C++ のような型宣言を行う必要がありません.変数にデータを代入することによって,その変数の型が決まります.変数 str には,文字列が代入されていますので,str の型は文字列型になります.なお,strip は,文字列の前後にある空白や改行を取り除くための関数です.

    09 行目

      08 行目において,2 つのデータを半角スペースで区切った 1 行分のデータが,文字列として変数 str に記憶されます.そこで,これらのデータを分離してやる必要があります.split は,String クラスの関数であり,指定した区切り文字で文字列を分割し,配列に入れて返します.ここでは,a[0] と a[1] に入力した 2 つのデータが文字列として入ります.

    10 行目~ 11 行目

      組み込み関数 Integer を利用して,文字列を整数に変換しています.なお,Ruby においては,整数値の大きさに制限はありません.

    13 行目~ 14 行目

      これらの文では,見て明らかなように,乗算と除算の計算をし,結果を変数 mul と div に代入しています.変数 x,及び,y に対しては,それらの値が参照されているだけですので,10 行目~ 11 行目で記憶された値がそのまま保たれています.なお,2 番目( y )の値として 0 を入力しない( 0 で割ることになる)ようにしてください.

      このプログラムを実行し,8 と 3 を,
    2つのデータを入力して下さい 8 3				
    のように入力すると(下線部が入力する部分),以下のような結果が得られます.除算において,結果の小数点以下が切り捨てられていることに注意してください(整数どうしの除算の場合).
    乗算=24 除算=2				

  6. Python

    01	# -*- coding: UTF-8 -*-
    02	############################
    03	# 2つのデータの乗算と除算 #
    04	#      coded by Y.Suganuma #
    05	############################
    06				# データの入力
    07	str = input("2つのデータを入力して下さい ")
    08	a   = str.split()
    09	x   = int(a[0])
    10	y   = int(a[1])
    11				# 和と差の計算
    12	mul = x * y
    13	div = x / y
    14				# 結果の出力
    15	print("乗算=", mul, "除算=", div)
    			
    01 行目

      この例のように,1 行目か 2 行目にあるコメントが正規表現 coding[=:]\s*([-\w.]+) にマッチする場合,コメントはエンコード宣言(プログラムを記述する文字コードの宣言)として処理されます.

    02 行目~ 05 行目

      プログラム全体に対する注釈コメント)です.Python の注釈は, # から行末までという形で表現します.複数行にわたるコメントは,""" ,または,''' を使用して,以下に示すような形式でも表現できます.
    	"""
    	 2つのデータの乗算と除算 #
    	      coded by Y.Suganuma #
    	"""				
      注釈は,プログラムの該当する部分における処理内容を説明するのに使用され,人間がプログラムを読む際,理解しやすくするためのものであり,インタプリータ等によって特別な処理はされません.プログラムを実行するのはコンピュータですが,プログラムを書いたり修正したりするのは人間です.従って,プログラムを書く際に最も注意すべきことは,如何に読み易く,かつ,分かり易いプログラムを書くかという点です.できるだけ多くの注釈を入れておいて下さい.そのことにより,他の人がプログラムを理解しやすくなると共に,プログラム上のエラーも少なくなるはずです.

    07 行目

      コマンドプロンプト上でデータを変数に入力(標準入力から入力)するためには,組み込み関数 input を使用します.関数は,外部から与えられたデータに基づき,何らかの処理を行いその結果を返します.関数にデータを与える方法の一つが引数です(この例において,input の後ろの括弧内に書かれた部分).input において引数を記述すると,それが末尾の改行を除いて標準出力に書き出され,入力された 1 行を読み込み,文字列として返します(末尾の改行を除去).

      Python のようなインタプリタでは,C++ のような型宣言を行う必要がありません.変数にデータを代入することによって,その変数の型が決まります.変数 str には,文字列が代入されていますので,str の型は文字列型になります.なお,これらの文には,一つの文の終わりにセミコロン「 ; 」が付加してありませんが,付加しても構いません.

    08 行目

      07 行目において,2 つのデータを半角スペースで区切った 1 行分のデータが,文字列として変数 str に記憶されます.そこで,これらのデータを,文字列型に対する関数 split を使用して分離します.分離されたデータは,リスト( list )として返されます.ここでは,a[0] と a[1] に入力した 2 つのデータが文字列として入ります.

    09 行目~ 10 行目

      組み込み関数 int を利用して,文字列を整数に変換しています.なお,Python においては,整数値の大きさに制限はありません.

    12 行目~ 13 行目

      これらの文では,見て明らかなように,乗算と除算の計算をし,結果を変数 mul と div に代入しています.変数 x,及び,y に対しては,それらの値が参照されているだけですので,09 行目~ 10 行目で記憶された値がそのまま保たれています.なお,2 番目( y )の値として 0 を入力しない( 0 で割ることになる)ようにしてください.

    15 行目

      組み込み関数 print を使用して,結果を出力しています.print においては,引数として渡されたデータが半角スペースで区切って順番に出力され,最後に改行が出力されます.その際,mul や div の値が自動的に文字列に変換されます.なお,12 ~ 13 行目を削除し,15 行目の mul 及び div を,(x * y) 及び (x / y) と記述しても構いません.

      このプログラムを実行し,8 と 3 を,
    2つのデータを入力して下さい 8 3				
    のように入力すると(下線部が入力する部分),以下のような結果が得られます.ここで,整数どうしの除算であっても,小数点以下まで計算されることに注意してください.
    乗算= 24 除算= 2.6666666666666665				

  7. C#

    01	/****************************/
    02	/* 2つのデータの乗算と除算 */
    03	/*      coded by Y.Suganuma */
    04	/****************************/
    05	using System;
    06	
    07	class Program
    08	{
    09		static void Main()
    10		{
    11			Console.Write("2 つのデータを入力して下さい ");
    12			string[] str = Console.ReadLine().Split(new char[] {' '}, StringSplitOptions.RemoveEmptyEntries);
    13	//		string[] str = Console.ReadLine().Split(' ');
    14			int x = int.Parse(str[0]);
    15			int y = int.Parse(str[1]);
    16				// 和と差の計算
    17			int mul = x * y;
    18			int div = x / y;
    19				// 結果の出力
    20			Console.WriteLine("乗算=" + mul + " 除算=" + div);
    21		}
    22	}
    			
    01 行目~ 04 行目

      プログラム全体に対する注釈コメント)です.C# の注釈は,この例のように, /* */ と囲んで表現します(複数行にわたっても良い).また,16 行目,19 行目のように, // から行末までという表現方法も可能です.

      注釈は,プログラムの該当する部分における処理内容を説明するのに使用され,人間がプログラムを読む際,理解しやすくするためのものであり,コンパイラ等によって特別な処理はされません.プログラムを実行するのはコンピュータですが,プログラムを書いたり修正したりするのは人間です.従って,プログラムを書く際に最も注意すべきことは,如何に読み易く,かつ,分かり易いプログラムを書くかという点です.できるだけ多くの注釈を入れておいて下さい.そのことにより,他の人がプログラムを理解しやすくなると共に,プログラム上のエラーも少なくなるはずです.

    05 行目

      大きなプログラムを複数の人間で開発するような場合,同じ名前のクラス等が,異なる目的で記述されるようなことが起こりかねません.そこで,C# においては,名前空間というものを設定してクラス等を整理し,名前空間が異なれば同じ名前のクラス等を使用しても構わないようにしています.従って,クラスを参照する基本的な方法は,「名前空間名.クラス名」になりますが,混乱が起きないようであれば,
    	using 名前空間名;				
    という記述によって,名前空間名を省略することができます.このプログラムの場合,この行を記述しないと,11 行目は,
    	System.Console.Write("2 つのデータを入力して下さい ");				
    のように記述する必要があります.

    07 行目

      このプログラムで作成するクラス Program の定義の開始です.クラスの定義は,22 行目まで続き,その本体は 09 行目~ 21 行目です.クラスの本体は,段落を下げて(字下げして)書かれていますが,これも,プログラムを読みやすくするための一つの手段であり,必ず,このように,段落を下げて書いて下さい(どの程度下げるかは任意ですが,タブを使用する方法が一般的です).

    09 行目

      Main 関数( Main メソッド)の最初であることを表します.関数は,引数として外部から与えられたデータ(括弧内に記述されたデータ,この例では存在しない)やクラス内のデータ等に基づき何らかの処理を実行し,その結果を関数を呼び出したプログラムに返します.ただし,void 指定された関数は何も返しません.Main 関数は非常に特殊な関数であり,プログラム内にただ一つだけ存在しなければならず,名前も Main と決まっています.10 行目の「 { 」と 21 行目の「 } 」に囲まれた部分が Main 関数の本体になります.従って,09,10,及び,21 行目は,C# のプログラムにとって常に必要となります.

    11 行目,20 行目

      2 つのデータを入力するためだけであれば,12 行目だけで十分ですが,その場合,何のメッセージも出力されずキーボードからの入力待ちになってしまうため,一見コンピュータが止まってしまったように感じます.また,多くの入力を要求するような場合は,どの入力を要求しているのかが分かりません.そのため,11 行目の Console.Write が使用されています.また,20 行目は,結果を出力するための Console.WriteLine です.なお,これらの文のように,一般的に,C# における一つの文の終わりにはセミコロン ; 」を付ける必要があります.

      Console.Write,及び,Console.WriteLine は,20 行目に示すように,与えられたデータを + 演算子で結合して,画面に出力します.データの中に文字列以外が含まれていた場合は,自動的に文字列に変換されます.17,18 行目を削除し,変数 mul や div の代わりに,式 (x * y) や (x / y) を 20 行目に記述しても構いません.なお,Console.WriteLine,及び,Console.Write の違いは,文字列の出力後に,改行を行うか否かの違いです.

    12 行目

      Console.ReadLine() によって,コンソールを通して入力された 1 行分の文字列を読み込み,その文字列を Split によって半角スペースで区切り,区切られた文字列を配列 str に代入しています.この例の場合,2 つのデータに対応する 2 つの文字列になります.なお,Split に与えられている引数「 new char[] {' '}, StringSplitOptions.RemoveEmptyEntries 」によって,半角スペースで区切ること,空の文字列を無視することを指示しています.13 行目のような記述を行うと,1 つの半角スペースで区切った場合は正しく動作しますが,複数の半角スペースで区切って入力すると実行時エラーになってしまいます.12 行目のように記述すれば,複数の半角スペースで区切っても正しく動作します.この点は,VB を除き,他の言語と処理方法が大きく異なっていますので,注意してください.

    14 行目~ 15 行目

      文字列のままでは計算を実行できませんので,文字列を int 型データに変換しています.

    17 行目~ 18 行目

      これらの文では,見て明らかなように,乗算と除算の計算をし,結果を変数 mul と div に代入しています.変数 x,及び,y に対しては,それらの値が参照されているだけですので,14 行目~ 15 行目で記憶された値がそのまま保たれています.入力した値,または,乗算した結果が int で表現可能な値より大きくならない,さらに,2 番目( y )の値として 0 を入力しない( 0 で割ることになる)ようにしてください.

      このプログラムを実行し,8 と 3 を,
    2つのデータを入力して下さい 8 3				
    のように入力すると(下線部が入力する部分),以下のような結果が得られます.除算において,結果の小数点以下が切り捨てられていることに注意してください(整数どうしの除算の場合).
    乗算=24 除算=2				

  8. VB

    01	''''''''''''''''''''''''''''
    02	' 2つのデータの乗算と除算 '
    03	'      coded by Y.Suganuma '
    04	''''''''''''''''''''''''''''
    05	Imports System
    06	Imports System.Text.RegularExpressions
    07	
    08	Module Test
    09		Sub Main()   ' Function Main() As Integer のような形式も OK
    10			Console.Write("2 つの整数を入力してください ")
    11			Dim MS As Regex     = New Regex("\s+") 
    12			Dim str() As String = MS.Split(Console.ReadLine())
    13	'		Dim str() As String = Split(Console.ReadLine(), " ")
    14			Dim x As Integer = Integer.Parse(str(0))
    15			Dim y As Integer = Integer.Parse(str(1))
    16			Console.WriteLine("乗算= " & (x * y) & vbCrLf & "除算= " & (x / y))
    17		End Sub
    18	End Module
    			
    01 行目~ 04 行目

      プログラム全体に対する注釈コメント)です.VB の注釈は,この例のように, ' から行末までという方法を使用します.

      注釈は,プログラムの該当する部分における処理内容を説明するのに使用され,人間がプログラムを読む際,理解しやすくするためのものであり,コンパイラ等によって特別な処理はされません.プログラムを実行するのはコンピュータですが,プログラムを書いたり修正したりするのは人間です.従って,プログラムを書く際に最も注意すべきことは,如何に読み易く,かつ,分かり易いプログラムを書くかという点です.できるだけ多くの注釈を入れておいて下さい.そのことにより,他の人がプログラムを理解しやすくなると共に,プログラム上のエラーも少なくなるはずです.

    05,06 行目

      大きなプログラムを複数の人間で開発するような場合,同じ名前のクラス等が,異なる目的で記述されるようなことが起こりかねません.そこで,VB においては,名前空間というものを設定してクラス等を整理し,名前空間が異なれば同じ名前のクラス等を使用しても構わないようにしています.Imports ステートメントは,参照の一意性を確保するために,必要な名前空間の部分のみを使用できるようにするために使用します.なお,05 行目は,このプログラム例の場合,記述しなくても構いません.

    08 行目

      モジュールとは,関数(プロシージャ,メソッド)やそれに関連する変数など,一連のソースコードをひとかたまりにしておくためのものです.クラスと似ていますが,クラスはデータとそれを操作する手続きを構造化する目的で使われるのに対し,モジュールは手続きのみを構造化するために使われます.また,クラスとは異なり,モジュールをインスタンス化(オブジェクトを生成)することはできません.プログラムを作成する際,08 行目,18 行目は必ず必要になります(モジュール名は異なって構わない).

      モジュールの定義は 18 行目まで続き,その本体は 09 行目~ 17 行目です.モジュールの本体は,段落を下げて(字下げして)書かれていますが,これも,プログラムを読みやすくするための一つの手段であり,必ず,このように,段落を下げて書いて下さい(どの程度下げるかは任意ですが,タブを使用する方法が一般的です).

    09 行目

      Main 関数( Main メソッド)の最初であることを表します.関数(メソッド)は,引数として外部から与えられたデータ(括弧内に記述されたデータ,この例では存在しない)やクラス内のデータ等に基づき何らかの処理を実行します.コメントに記したように,Function を使用した場合は,処理した結果を関数を呼び出したプログラムに返します.Main 関数は非常に特殊な関数であり,プログラム内にただ一つだけ存在しなければならず,名前も Main と決まっています.この行と 17 行目の End Sub ( Function の場合は,End Function )で囲まれた部分が Main 関数の本体になります.従って,09 行目,及び,17 行目は,VB のプログラムにとって常に必要となります.

    10 行目,16 行目

      2 つのデータを入力するためだけであれば,11,12 行目だけで十分ですが,その場合,何のメッセージも出力されずキーボードからの入力待ちになってしまうため,一見コンピュータが止まってしまったように感じます.また,多くの入力を要求するような場合は,どの入力を要求しているのかが分かりません.そのため,10 行目の Console.Write が使用されています.また,16 行目は,結果を出力するための Console.WriteLine です.なお,C++ や C# のように,一つの文の終わりにセミコロン ; 」を付けてしまうようなことがありますが,エラーとなりますので注意してください.

      Console.Write,及び,Console.WriteLine は,16 行目に示すように,与えられたデータを & 演算子で結合して,画面に出力します.データの中に文字列以外が含まれていた場合は,自動的に文字列に変換されます(式の場合は,計算してから文字列の変換).16 行目の (x * y) や (x / y) の部分は,前もって計算した結果を変数に代入し,その変数をここに記述しても構いません.なお,Console.WriteLine,及び,Console.Write の違いは,文字列の出力後に,改行を行うか否かの違いです.また,vbCrLf は,改行を表します(他言語におけるエスケープシーケンス \n に相当).

    11,12 行目

      Console.ReadLine() によって,コンソールを通して入力された 1 行分の文字列を読み込み,その文字列を Split によって半角スペースで区切り,区切られた文字列を配列 str に代入しています.この例の場合,2 つのデータに対応する 2 つの文字列になります.なお,VB においては,変数名等に対して,大文字・小文字の違いは無視されます.

      2 つのデータを常に 1 つの半角スペースで区切るような場合は,13 行目の記述で十分ですが,その場合,複数の半角スペースで区切って入力すると実行時エラーになってしまいます.11,12 行目のように記述すれば,複数の半角スペースで区切っても正しく動作します.この点は,C# を除き,他の言語と処理方法が大きく異なっていますので,注意してください.なお,06 行目は,11 行目において使用している正規表現のために必要となります.

    14 行目~ 15 行目

      文字列のままでは計算を実行できませんので,文字列を Integer 型データに変換しています.

      このプログラムを実行し,8 と 3 を,
    2つのデータを入力して下さい 8 3				
    のように入力すると(下線部が入力する部分),以下のような結果が得られます.ここで,整数どうしの除算であっても,小数点以下まで計算されることに注意してください.
    乗算= 24
    除算= 2.66666666666667				

情報学部 菅沼ホーム 目次 索引