Repor4


[課題]

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

[問題]
下のプログラムは1〜40までの整数で4で割り切れる値をfor文を用いて配列に代入 するプログラムです。「」内を埋めてプログラムを完成させなさい。
public class Rep4 {

public static void main(String[] args) {
int kake[] = new int[11];
int i,j;
for(i = 「 a 」 j = 1; 「  b  」; i++) {
if(「  c  」) {
kake[j] = i;
System.out.println("[" + j + "] = " + kake[j]);        
「  d  」; }
        }
    }
}

実行結果

 [1] = 4                                            
 [2] = 8
 [3] = 12
 [4] = 16
 [5] = 20
 [6] = 24
 [7] = 28
 [8] = 32
 [9] = 36
 [10] = 40


[解答]
public class Rep4 {

public static void main(String[] args) {
int kake[] = new int[11];
int i,j;
for(i =  1  j = 1;  i <=40  ; i++) {
if( i % 4 == 0 ) {
kake[j] = i;
System.out.println("[" + j + "] = " + kake[j]);        
j++;}
   }
  }
}


a:i = 1

1から40までの数なのでiは1かあらはじめなければならない。i=0にして しまうと0も4で割り切れてしまうからである。

b:i <=40 もしくは i < 41

for文の繰り返し条件の部分です。問題を見ると、変数 i に関して以下のこ とがわかります。

これらのことから、for文のループは i の値が0〜40の範囲で繰り返すこと がわかります。よって、繰り返し条件は i <= 40 もしくは i < 41になります。

c:i % 4 == 0

if文の条件式の部分です。問題を見ると、条件式が真である場合に実行され るステートメントに関して以下のことがわかります。

これらのことから、このステートメントは i が奇数である場合に実行される ことがわかります。

奇数とは4で割り切れる値なので、i を4で割った余りが0でなければ i はでわりきれるk数だということになります。
また、商の余りを求めるには%演算子を用いればよいので、条件式は i % 4 == 0 になります。

d:j++ もしくは j = j + 1

if文の条件式が真である場合に実行されるステートメントの一つです。

他に変数 j が用いられるステートメントは以下の二つです。

これらのことから、変数 j は個々の配列要素を指定する値として用いられる ことがわかります。for文の初期化式で1に初期化されてるので、その時点では 一番目の配列要素、すなわち kake[1] を指しています。

配列に値が代入されたら j の値を一つ増加させなければいけません。そうで ないと、kake[1]に何度も値が代入されることになります。よって、この部分のス テートメントは j++ 、もしくは j = j +1 になります。

[実行結果]

 [1] = 4                                            
 [2] = 8
 [3] = 12
 [4] = 16
 [5] = 20
 [6] = 24
 [7] = 28
 [8] = 32
 [9] = 36
 [10] = 40



[考察]

問題文にもあるように、1〜40の範囲にある4で割り切れる値を配列に代入し、出力 するプログラムです。

for文で変数 i を1〜40の範囲でループさせ、if文の条件式で i の値が4で割り 切れるかどうかテストします。
4で割り切れる場合、配列の要素に i を代入し、その値を出力します。
配列要素を指定する値には変数 j を用いています。if文内で代入と実行の後に インクリメント演算子を用いて値を1ずつ増やしています。仮にfor文の継続処 理で j の値を増やすと、配列に値が代入されるかどうかに関わらず j の値が増 え、処理の途中で、作成した配列要素数以上の値を使おうとしてしまうので、エ ラーが発生します。



配列について

・1次元配列

共通の名前を使用してアクセスすることが可能な、同じ方を持つ一連の変数 のことを1次元配列と呼びます。配列内の個々の変数は配列要素と呼ばれます。

配列を定義するには、次の3つの手順を踏む必要があります。

  1. 宣言
  2. 作成
  3. 代入

まず、これらを個別に行う方法があります。

// 宣言
type varName[];

// 作成
varName = new type[size];                 

// 代入
varName[num] = value;

まず、宣言ではtypeにJavaの有効なデータ型、varNameに配列の名前を指定し ます。
次に、作成ではsizeに配列内の要素数を指定し、配列にメモリを割り当てるため に new 演算子を用います。この場合、varName[0]からvarName[size-1]までの配 列要素が作成されます。
最後に、代入では num に0からsize-1 までの値を指定し、value に実際に代入 する値を指定します。

宣言と作成を一度に行う方法もあります。

// 宣言と作成
type varName[] = new type[size];            

// 代入
varName[num] = value;

宣言、作成、代入まで一度に行う方法もあります。


// 宣言、作成、代入
type varName[] = { e0, e1, …, en };              

Javaでは任意の次元の配列を作成することができます。

配列を参照する変数を宣言するとき、個々の要素を指定するために指定する インデックスの個数(次元)を、大括弧([])の数で明示します。

// 一個のインデックスで要素を指定する場合
type varName1[];

// 二個のインデックスで要素を指定する場合
type varName2[][];

// 三個のインデックスで要素を指定する場合                
type varName3[][][];


上の例では、varName3は、「type 型の要素を持つ三次元配列」を参照可能な 変数として定義されています。このとき、要素数を指定する仕組みはなく、任 意の要素数の配列を代入可能です。

実際に参照先の配列を作成するには、次の二つの仕組みを用います。


1.個々の要素を明示したリストを明記する

type varName[][] = 
{
{ e00, e01, …, e0x},                      
{ e10, e11, …, e1y},
{ e20, e21, …, e2z}
}
}

多次元では、各要素がリストであるリストで初期化することができます。
上の例では、配列 varName の各要素が配列になっています。

varName[0] = { e00, e01, …, e0x}; varName[1] = { e10, e11, …, e1y}; varName[2] = { e20, e21, …, e2z}; 多くの言語では、多次元配列の場合は4行6列などのブロック状に配列を作成し ます。Javaでは、各行ごとに含まれる要素数が異なることが許されます。

多次元配列のサイズは、次の式で取得することができます。

varName.length

varNameには配列の名前を指定します。この式によって、個々の配列要素の数 を取得することができます。
次の構文を使用すると、個々の配列要素の数を取得することができます。

varName[index].length

index には配列内の特定の要素を指定します。


e0からenには配列の要素を指定します。e0からenまでに、指定した型では扱 えない値が記述された場合、コンパイルエラーが発生します。

配列内の要素数は次の式で取得できます。

varName.length

C言語のソースコード

Rep4.javaと同様な動作を行うC言語のソースコードです。
#include <stdio.h>

main(){

  kake [11];
  int i,j;
  for(i = 1, j = 1; i < 41; i++){
    if(i % 4 == 0){
      kake[j] = i;
      printf("[%d] = %d\n",j,kake[j]);              
      j++;
    }
  }
}


反省・感想

問題を作るというのは今までになかった課題なので面白かったです。あんまり問 題とか作った事がないので問題を考えるのに時間がかかりました。