修正前の質問タイトル:『C言語 配列 魔法陣の和』に対する指摘
魔法陣ではなく魔方陣だと思いますが、どちらにせよ意味が通じません。
魔方陣(まほうじん、英:Magic square)とは、n×n 個の正方形の方陣に数字を配置し、縦・横・対角線のいずれの列についても、その列の数字の合計が同じになるもののことである。特に1から方陣のマスの総数 n2 までの数字を1つずつ過不足なく使ったものを言う。
引用元:魔方陣 - Wikipedia (太字は引用者)
ご提示のプログラムのどこに魔方陣があるのでしょうか。
訂正箇所とアドバイスお願いします。
強いて言うなら、行列を表示する際にはこうした方が見やすい、ということでしょうか。
C
1printf("配列a[M][N]:\n");
2for(int y=0; y<M; y++){
3 for(int x=0; x<N; x++){
4 printf("%d ", a[y][x]);
5 }
6 printf("\n");
7}
質問の追記/修正を受けて
とりあえずこんなコードを組んでみました。
『ある座標を打ち込まれたときに、可能な限り左下に突き進んだ座標を返す』
C
1#include <stdio.h>
2#include <stdlib.h>
3#define X 4
4#define Y 3
5
6int main(void) {
7 int mat[Y][X]={
8 {1, 7, 1, 5},
9 {0, 2, 8, 1},
10 {4, 0, 2, 8}
11 };
12
13 printf("配列mat[Y][X]:\n");
14 for(int yi=0; yi<Y; yi++){
15 for(int xi=0; xi<X; xi++){
16 printf("%d ", mat[yi][xi]);
17 }
18 printf("\n");
19 }
20
21 int x, y;
22 printf("x?"); scanf("%d", &x);
23 printf("y?"); scanf("%d", &y);
24
25 if(!(0 <= x && x < X)) exit(1);
26 if(!(0 <= y && y < Y)) exit(1);
27
28 while(x > 0 && y < Y - 1) {
29 x--; y++;
30 }
31 printf("x:%d y:%d\n", x, y);
32
33 return 0;
34}
実行例
配列mat[Y][X]:
1 7 1 5
0 2 8 1
4 0 2 8
x?1
y?1
x:0 y:2
次の三点を考えてみてください。
- なぜ上記のようなコードを例として示したのか?
- コードがところどころ(特に変数名が)書き換えられているが、真意はなにか?
- 『左下から右上へ』の一直線の和を考えるときに、二重ループが必要か?
どうしてもわからなければ、わからない点を自分なりに整理してコメントをください。
teratailには、上記のようにコードを見やすく表示する機能があります。
編集画面を開き、コードを選択した状態で<code>ボタンを押してください。
また、質問をする際には、上手くいかない点を明確にした方がよいです。
- コンパイルが出来ない
- 実行中に落ちる
- 特定の入力の下で動かない
- 結果が想定通りでない
今回はわりあい期待する結果が自明ですが、それでも期待する入出力は書いた方がよいです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。