[1]課題
制御文と配列を用いてオリジナルのJavaアプリケーションによる初級問題(なるべく短い行数で)を作成し、
模範解答例を示せ。併せて、同様な動作を行うC言語のソースコードを示せ。

[2]問題
1から10までの自然数をそれぞれ2乗した数をすべて足した数を配列をもちいて求めよ。
つまり、
   10
   Σ  k^2    を求めよ
   n=k




[3]javaプログラム



public class Repo4_1 {
	public static void main(String[] args) {
		int i,k,a=0;                       // 整数型のi,k,aを宣言します。
		int n[] = new int[10];             // 配列の宣言をします。10個の要素を使用します。
		
	for(i=0; i<10; i++){
		k = i+1;                           // kのとる値を1から10までにします。
		n[i] = k*k;                        // kの2乗をして配列nに格納していきます。
	}
	
	for( i=0; i<10; i++)                   // ステートメントが1つしかないのでブロックは使用しません。
		a = a+n[i];	                       // すべての配列の要素を足してゆきます。
	
	System.out.println("answer = "+a);     // 結果を表示させます。
	}
}
実行結果
answer = 385




[4]考察
この実行結果は1から10までの自然数をそれぞれ2乗した数をすべて足した数をあらわしています。
プログラムは大きく分けて4つの働きをします。

まず、第一にプログラム内でつかわれる変数と配列の宣言です。
 iはfor文のループ制御変数と配列の要素をさすときに使用されます。
 この問題に「1から10までの自然数」という節があります。kはこの「1から10までの自然数」に相当します。
 aはanswerのaです。プログラムの答えをいれます。
 nは1次元配列で、n[0]からn[9]の10個の要素をもっています。

次にすることは、配列nの10個の要素に、自然数の2乗した数をそれぞれ いれていくことです。 iは0から9までを動き、kは1から10までを動きます。「k*k」はkの2乗を表しています。
それによってn[0]に1の2乗、n[1]に2の2乗、n[2]に3の2乗・・・
といったようにfor文で繰り返すことでつぎつぎに値を代入していきます。

そして次に、変数aに配列nのすべての要素を足して代入してます。
「a = a + n[i]」
これは左辺のaに これまでのaと配列nの要素の和を代入するという意味です。
for文をつかい10回繰り返して、配列nのすべての要素をaに足して代入します。

最後に答えである変数aを出力させるメソッドです。
System.out.printlnを使用して改行もしてます。


シグマの計算の考察
 シグマは数列の和を求めるときにつかわれます。
 シグマの計算は公式を利用して行うのが、はやくて分かりやすい。
  この問題の場合の公式を以下に示します。
 
   Σ n^2 = 1/6n(n+1)(2n+1)

 この公式をつかって、問題を解いてみます。しかし、このプログラムは配列を含まないので、問題文をみたしていません。
 よってこのプログラムは解答を確認するための副産物的なプログラムとしてみます。


プログラム_2



public class Repo4_2 {

	public static void main(String[] args) {
		int n,a;
	  n = 10;	                   // nは10です。
	  a = n*(n+1)*(2*n+1)/6;       // 公式を算術演算子をもちいて書き直しました。
		
		System.out.println("answer = "+a);   // 答えを出力させます。
	}
}
実行結果
answer = 385
このプログラムの実行結果は4_1プログラムと同じ結果です。これで4_1プログラムに対する信用度があがったと思います。


制御文についての考察
 ifステートメント
   ifステートメントは条件ステートメントまたは、選択ステートメントと呼ばれるステートメントです。
   このステートメントの動作は、真または偽と評価される条件テストの結果によって制御されます。
   最も単純なifステートメントは、1つのステートメントを実行するかどうかを判断するものです。
   if文は()内部のboolean型と後ろのステートメント(ターゲットと呼ばれます)からなり、
   内部のbooleanが真であったら、ターゲットのステートメントが実行されます。
 if-elseステートメント
   ifステートメントの次に、elseステートメントをつづけたものです。
   ifステートメントの内部のboolean型が真の場合は、ifターゲットが実行されて、else部分は飛ばされます。
   逆に偽の場合はifターゲットが飛ばされて、elseターゲットが実行されます。
   if-elseステートメントは二者択一のステートメントで、両方のターゲットを同時に実行することはありません。
 if-esle if-elseステートメント
   if文を3つ以上の分岐にするときにelse ifがつかわれます。
   else ifステートメントは一致するものが見つかると残りのifステートメントは飛ばされます。
   つまりプログラムの上にあるほど優先順位がたかくなります。

 forステートメント
   ループステートメントのひとつです。forは単一のステートメントまたは、複数のステートメントから成るプロックを
   指定の回数だけ繰り返し実行するためにつかわれます。
   ループ制御変数と呼ばれる変数で何回繰り返すかを指定できます。

 whileステートメント
   ループステートメントのひとつで、内部にかかれた式が真である限り、whilwターゲットを繰り返すという動作をします。
   式が偽になると、ループは停止します。
   式の値はループの最初にチェックされるので、最初の式が偽であったらループは二度と実行されません。
 do-whileステートメント
   ループステートメントのひとつで、式が真である限り、ターゲットステートメントを繰り返します。
   whileステートメントとのちがいは、式の値をチェックするタイミングです。
   do-whileはループの終わりに式をチェックするので、式が最初から偽であっても、
   最低1回はターゲットステートメントが実行されます。

 switchステートメント
   ifは、選択肢が2つの場合には適していますが、それ以上の選択肢が必要になる場合には面倒な作業が必要になります。
   その場合、ifをつかうよりもswitchの複数選択ステートメントをつかった方がいいでしょう。
   switchはひとつの変数(小数点はだめ)に注目し、場合分けをします。
   一致する結果が見つかった場合に、それに関連付けられている連続したステートメントを実行します。




[5]C言語プログラム



#include main() { int i,k,a=0; int n[10]; for( i=0; i<10; i++){ k = i+1; n[i] = k*k; } for( i=0; i<10; i++) a = a+n[i]; printf("answer=%3d¥n",a); } 実行結果
answer=385

考察
実行結果は同じです。javaとC言語でのちがいを考察します。
配列の宣言のしかたが微妙にちがいます。printlnメソッドとprintfの使い方がちがいます。
C言語はmain{}のなかにプログラムをすべてかけますが、javaはクラス{}のなかにメインメソッド{}をいれます。




[6]反省と感想
久しぶりにC言語をさわりました。コンパイルの仕方や、構文など忘れているところがあって焦りました。
javaプログラムはすこし簡単につくったが初級なのでこれくらいがちょうどいいのかな。
あまり、考察できなかった。時間をかけてもっと考察できたら良かったのにとおもいました。




[7]参考文献
ジョゼフ・オニール著  「独習Java 第3版」




もどる