あなたの「必」の書き順を教えてください

魔法陣を二次元配列で求めるプログラムです
#include <stdio.h>
int main(void)
{
int box[6][6]={17,24,1,8,15,0,
23,5,7,14,16,0,
4,6,13,20,22,0,
10,12,19,21,3,0,
11,18,25,2,9,0,
0,0,0,0,0,0};
int i,j,sum=0;
for(i=0;i<5;i++){
for(j=0;j<5;j++){
sum+=box[i][j];
}
box[i][5]=sum;
sum=0;
}
for(j=0;j<5;j++){
for(i=0;i<5;i++){
sum+=box[i][j];
}
box[5][j]=sum;
sum=0;
}
for(i=0;i<5;i++){
for(j=0;j<5;j++){
if(i==j){
sum+=box[i][j];
}
}
box[5][5]=sum;
for(i=0;i<6;i++){
for(j=0;j<6;j++){
printf("%3d",box[i][j]);
}
printf("\n");
}
}
なんですが、
for(i=0;i<5;i++){
for(j=0;j<5;j++){
sum+=box[i][j];
}
box[i][5]=sum;
sum=0;
と、
for(i=0;i<5;i++){
for(j=0;j<5;j++){
if(i==j){
sum+=box[i][j];
と、
box[5][5]=sum;
for(i=0;i<6;i++){
for(j=0;j<6;j++){
printf("%3d",box[i][j]);
}
は、一体何をするプログラムなのか教えて下さいませんか。お願いします

A 回答 (1件)

ご質問ですが、切り出す箇所が中途半端です。


forやif等は {から}までがセットになっています。その途中で切ったら意味が通じません。


一つ目です。
sum=0; の位置が、間違いではないけど、この位置では意図がつかみずらいです。
これは

sum=0; /* プログラムの意図を考えると、ここに置くのが妥当 */
for(j=0;j<5;j++){
sum+=box[i][j];
}
box[i][5]=sum;
/* sum=0 ; */ /* 次の処理のために初期化。上に書くのとほぼ同じ効果は得られるけど、意図が伝わりにくい */

というプログラムを
for(i=0;i<5;i++){ 〜 }
で i を変化させながら繰り返すものです。

これでもわからなければ
・最初はi=0
・sum=0
・最初はj=0 だから sum += box[0][0] ;
・次にj=1 になるから sum += box[0][1] ;
...
・jのループが終ったので box[0][5]= sum ;
・次にi=1
・sum=0
...
と具体的な数字を入れて考えてみましょう。


次のブロックは、上記の縦横を入れかえたもの。


3つ目のブロックは、ifが入っているので複雑そうに見えますが、要するに i==jのときだけがsum+=〜を実行する、というものです。
つまり、 jを変化させる必要はありません。

sum = 0 ;
for(i=0;i<5;i++){
j=i ; /* for(j=0;j<5;j++){} で変化させる必要無し */
sum+=box[i][j]; /* if(i==j){} で判定する必要無し */
}
box[5][5]=sum; /* この行は、こちらのブロックに属する処理です */

これだと単純なforループですから、意味がわかるのでは?


最後も
for(j=0;j<6;j++){
printf("%3d",box[i][j]);
}
printf("\n");


for(i=0;i<6;i++){}
で繰り返すものです。




> 魔法陣を二次元配列で求める

の「求める」という言葉をどんな意味で使っていますか?
このプログラムは「魔方陣を自動的に作ってくれる」ものではありません。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


おすすめ情報

このQ&Aを見た人がよく見るQ&A