|
動作環境はsafariでやったので、safariを推奨します。
【Report#2】 JavaアプリケーションとC言語のオリジナル問題作成と解答例。
制御文と配列を用いてオリジナルのJavaアプリケーションによる初級問題(なるべく短い行数で)を作成し、
模範解答例を示せ。併せて、同様な動作を行うC言語のソースコードを示せ。
感想
1.Java初級問題プログラムを作成せよ。
問題① プログラムの実行結果を見て、下のソースの(?)を埋めよ。
実行結果
01:
02:
03:
04:
05:
06:
07:
08:
09:
|
a[0][0]=a
a[0][1]=b
a[0][2]=c
a[1][0]=d
a[1][1]=e
a[1][2]=f
a[2][0]=g
a[2][1]=h
a[2][2]=i
|
01:
02:
03:
04:
05:
06:
07:
08:
09:
10:
| ソースプログラム
public class Mon1{
public static void main(String[] args) {
char[][] a = (?);
for(int j=0;j<a.length;j++){
for(int k=0;k<a[j].length;k++)
System.out.println("a["+j+"]["+k+"]="+a[j][k]);
}
}
}
|
解答
{{'a','b','c'},{'d','e','f'},{'g','h','i'}}
C言語ソース
01:
02:
03:
04:
05:
06:
07:
08:
09:
10:
11:
12:
13:
14:
|
#include<stdio.h>
#define W 3
#define H 3
int main(){
char a[][W] = {{'a','b','c'},{'d','e','f'},{'g','h','i'}};
int j,k;
for(j=0;j<H;j++){
for(k=0;k<W;k++)
printf("a[%d][%d]=%c\n",j,k,a[j][k]);
}
}
|
解説(javaソース):
3行目でchar型の配列aに問題の答えでもある何かを代入します。
4行目〜7行目ではfor文を二つ利用して、配列の縦幅の長さ(a.length)の配列の横幅の長さ(a[j].length)分をループ
させている。
解説(C言語ソース):
3行目〜4行目ではマクロの定義をしている。Wをjavaソースでいう配列の横幅の長さ(a[j].length)、Hを配列の縦幅の
長さ(a.length)をそれぞれ3行3列の配列になるように値を決めてある。
7行目ではchar型の配列aに文字を代入します。
9行目〜12行目ではfor文でマクロ定義したWとHを利用して、ループさせている。
考察:
C言語ソースの7行目は『char a[][W] = {{'a','b','c'},{'d','e','f'},{'g','h','i'}};』というふうにして
いるが、その他にもできる方法が下の方法である。
①データ型 配列名[縦方向の要素数][横方向の要素数];
縦方向とか横方向とか書いが、実際には逆になっても構わない。図はあくまでも概念であり、実際、メモリ上では連続した領域
(つまり一次元的)に格納されている。規格の定義としては、メモリ上の順番に要素をアクセスしていくと、右側の添字が増え
ていくことになっている。縦横は分かりやすい方を使えばいいが、これはプログラム中では絶対にどちらかに統一する。
②データ型 配列名[縦方向の要素数][横方向の要素数] = { { [0][0]の初期値, [0][1]の初期値, ・・・ },
{ [1][0]の初期値, [1][1]の初期値, ・・・ },
{ [2][0]の初期値, [2][1]の初期値, ・・・ },
:
:
};
[縦][横]の順とするならば、各列を順番に初期化していく感じになる。結局のところ、二次元配列は、一次元配列が何個が積
み重なっている状態であるから、こういう初期化方法になる訳である。指定した要素数より初期値の数が多いと、次の列の最初
の要素に進んでしまう。足りない分には、自動的に0が入る。
③データ型 配列名[縦方向の要素数][横方向の要素数] = { [0][0]の初期値, [0][1]の初期値, ・・・.
・・・, [y][x-1]の初期値, [y][x]の初期値 };
横方向に順番に初期値を与えていき、次の行に移ることを繰り返す。縦×横の要素数に初期値の数が満たない場合、残りの要素
には0が入る。多すぎる場合の動作は不定である。
④データ型 配列名[][横方向の要素数] = { { [0][0]の初期値, [0][1]の初期値, ・・・ },
{ [1][0]の初期値, [1][1]の初期値, ・・・ },
{ [2][0]の初期値, [2][1]の初期値, ・・・ },
:
};
一次元配列のときと同様に、宣言時に初期化するのであれば、要素数の指定は省略できる。ただし、省略できるのは左側の要素
数だけである。左側しか省略できないという点に注意する。両方省略すると、コンパイラがどういう形の二次元配列なのか判断
できない。要素数が全部で16個のとき、配列の形は「4×4」かも知れないし、「2×8」かも知れないからである。ちなみに、今
回のC言語ソースでは④の方法をとっている。
また、C言語ではfor文の初期化の部分で変数宣言はできないので8行目で変数宣言している。逆にjavaではfor文の中で変数
宣言できる(変数定義はブロック先頭のみではなく、どこでも書ける)ので、そこでやってある。
C言語のprintf関数で文字列の最後に『¥n』とすることによって、javaの『println』と同じ改行の働きをさせた。
感想
今回のレポートで難しいと感じたのは、javaとC言語の違いです。javaにはポインタとかがなかったり、論理的で厳密なし
っかりした言語だと思いました。それに対しC言語はあやふやな表現や論理的でない考え方が混じってきて、すこし難しく感じ
ました。それぞれにいい方面もあるので、これからももっと勉強してプログラミングの楽しみを見つけながら、やっていきた
いです。
|