report#4
ProgII/e045732
Report#1
Report#2
Report#3
Report#4
Report#5
Report#6
Report#7
Report#8
Belonging-----Information Engineering Section
Student ID---045732K
Name----------Shingo Tamaki
Date------------2005/11/28(MON)
1.課題の紹介
- 制御文と配列を用いてオリジナルのJavaアプリケーションによる初級問題
(なるべく短い行数で)を作成し、模範解答例を示せ。併せて、同様な動作
を行うC言語のソースコードを示せ。
- 必ずスタイルシートを用いて作成すること。
2.問題
1からmaxまでにある素数を探すプログラムを作成せよ。素数とは、1と自分
自身以外の整数で割り切れない数です。なお、1は素数ではありませ
ん。
3.解答
- Java
- Prime.java
public class Prime {
public static void main(String[] args) {
int max = 100; // 素数を探す数の最大値
boolean[] a = new boolean [max];
// 素数かどうか判定する配列
// 配列の初期化
for(int i = 0; i < max; i++)
a[i] = true;
// 素数かどうか判定
for(int i = 2; i < max; i++) {
if(a[i-1]) {
for(int j = 2; i*j <= max; j++)
a[i*j -1] = false;
}
else
continue;
}
// 結果を表示
for(int i = 1; i < max; i++) {
if(a[i])
System.out.print((i + 1) + " ");
}
}
}
- C
- Prime.c
#include <stdio.h>
int main() {
int i;
int j;
#define FALSE 0 // FALSEを0と定義
#define TRUE !FALSE // TRUEをFALSEの否定と定義
int max = 100; // 素数を探す数の最大値
int a[max]; // 素数かどうか判定する配列
// 配列の初期化
for(i=0; i < max; i++)
a[i] = TRUE;
// 素数かどうか判定
for(i=2; i < max; i++) {
if(a[i-1]) {
for(j=2; i*j<=max; j++)
a[i*j-1] = FALSE;
}
else
continue;
}
// 結果を表示
for(i=1; i < max; i++) {
if(a[i])
printf("%d ",(i + 1));
}
printf("\n");
return (0);
}
4.実行結果
2 3 5 7 11 13 17 19 23 29 31 37 41
43 47 53 59 61 67 71 73 79 83 89 97
5.考察
- 配列について
- 配列は複数の同じ型の変数を1つにまとめたものです。大量のデータを扱うとき
や複数のデータを次々と自動的に読み出したいときは配列を使うと便利です。
配列の宣言はnew演算子を用いて次のように行います。
int[] a = new int[4];
int → 型
a → 配列名
4 → 配列の大きさ(要素の数)
をそれぞれ表しています。int[] a は、int a[] と記述することもできます。
- 宣言と同時に初期化するには、{ }を使って値を列挙します。このとき、[
]内に要素数を記述してはいけません。
int[] a = new int[]{1, 2, 3, 4};
{ }内にデータがいくつあるかで自動的に要素数が決定します。
これは、次のように省略することもできます。
int[] a = {1, 2, 3, 4};
- 今までの配列は要素数に応じて横に伸びていく1次元のイメージでしたが、
2次元、3次元の配列の宣言は以下のようになります.
2次元配列 →
int[][] a = new int [2][3];
2 → y方向の要素数
3 → x方向の要素数
3次元配列 →
int[][][] a = new int [2][3][4];
2 → z方向の要素数
3 → y方向の要素数
4 → x方向の要素数
配列の次元は必要に応じて4次元、5次元と増やせますが、要素の数が増えれば
そのぶん、メモリを消費し、システムに負担をかけることになるので注意が必
要です。
- Java言語の多次元配列では縦、横の数を自由に決めることができます。そ
れゆえ、次のような多次元配列を作ることができます。
int[][] a = {
{10, 20, 30},
{40, 50},
{60}
};
配列 | 値 |
a[0][0] | 10 |
a[0][1] | 20 |
a[0][2] | 30 |
a[1][0] | 40 |
a[1][1] | 50 |
a[2][0] | 60 |
- 配列の要素数を求めるには length を使います。多次元の要素数を求める
プログラムを以下に示します。
Number2.java
public class Number2 {
public static void main(String[] args) {
int [][] a = {
{10, 20, 30},
{40, 50},
{60, 70, 80, 90}
};
System.out.println("一次元配列の要素数 " + a.length);
System.out.println("a[0]の要素数 " + a[0].length);
System.out.println("a[1]の要素数 " + a[1].length);
System.out.println("a[2]の要素数 " + a[2].length);
}
}
実行結果
一次元配列の要素数 3
a[0]の要素数 3
a[1]の要素数 2
a[2]の要素数 4
- Prime.javaについて
// 配列の初期化
for(int i = 0; i < max; i++)
a[i] = true;
- 上記の部分で配列の初期化を行い、1つ1つの要素すべてに true を返します。
// 素数かどうか判定
for(int i = 2; i < max; i++) {
if(a[i-1]) {
for(int j = 2; i*j <= max; j++)
a[i*j -1] = false;
}
else
continue;
}
- この部分では、素数であるかどうかの判定を行います。素数の倍数は素数
でないので、すべて false にします。
// 結果を表示
for(int i = 1; i < max; i++) {
if(a[i])
System.out.print((i + 1) + " ");
}
- ここで残った値(素数)を出力します。
- C言語版では #define 文で、TRUE、FALSE を定義したぐらいで、あとはほ
ぼ同じように記述しました。
6.考察
- 長らくC言語には触れていなかったので、できるか不安だったけど、割と
Javaと変わらなかったので、まあよかったかな。制御文と配列を使用した
だけだから、まあそうなるのは当然ですね。>( ^ o ^ )<
ProgII/e045732
Report#1
Report#2
Report#3
Report#4
Report#5
Report#6
Report#7
Report#8