- ベストアンサー
C言語(行列)
次の問題がどうしても出来ません。出来れば教えて欲しいです。。。 1~25の整数を下図のように並べて表示するプログラムを作成しなさい(scanfを使わずにfor,ifで自動的に表示する) 1 2 4 7 11 3 5 8 12 16 6 9 13 17 20 10 14 18 21 23 15 19 22 24 25
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#include <stdio.h> int a[5][5]; /* a[y][x] |x,yは座標 */ void main(void){ int n,x,y; for(x=0,y=0,n=1;n<=25;n++){ a[y][x]=n; /* 次の点は、左斜め下 */ if(x-1>=0 && y+1<5){ /* x と y を左斜め下にできるか? */ x = x - 1; y = y + 1; } else if(x-1<0 && y+1<5){ /* 左の壁に突き当たる */ x = y + 1; y = 0; } else if(y+1>=5){ /* 下の壁に突き当たる */ y = x + 1; x = 4; } } for(y=0;y<5;y++){ for(x=0;x<5;x++) printf("%2d ",a[y][x]); printf("\n"); } } scanfを使わずというのがよくわからないですけど、 こんな感じでいいのでしょうか? 一般的な式を出そうとしたけど、 わけわからんくなったので、 プログラム的にやってみました。 カテ違いな気がしますが…
その他の回答 (3)
- tenro
- ベストアンサー率39% (118/300)
配列を使わずに座標計算しました。 #include <stdio.h> #define N ( 5 ) void main(void) { int i,j,k,n; for(i=0;i<N;i++){ for(j=0;j<N;j++){ k=i+j; n=k*(k+1)/2+i+1; if(k>=N) n-=(k-N+1)*(k-N+1); printf("%3d",n); } printf("?n"); /*改行です(文字化けしているかも?)*/ } }
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
済みません、同じですが、訂正させて下さい。 #include <stdio.h> #define N 5 /* 辺の長さ */ int a[N][N]; /* a[y][x] |x,yは座標 */ void main(void){ int n,x,y; for(x=0,y=0,n=1;n<=N*N;n++){ a[y][x]=n; /* 次の点は、左斜め下 */ if(x-1>=0 && y+1<N){ /* x と y を左斜め下にできるか? */ x = x - 1; y = y + 1; } else if(x-1<0 && y+1<N){ /* 左の壁に突き当たる */ x = y + 1; y = 0; } else if(y+1>=N){ /* 下の壁に突き当たる */ y = x + 1; x = N-1; } } for(y=0;y<N;y++){ for(x=0;x<N;x++) printf("%2d ",a[y][x]); printf("\n"); } }
- jmh
- ベストアンサー率23% (71/304)
単に、"1 2 4 7 11\n3 5 8 12 16\n6 9 13 17 20\n10 14 18 21 23\n15 19 22 24 25" を印字するコトはできますか?
お礼
ありがとうございます。 scanfを使わずにというのは実行した場合if、for文だけで作れって意味なのでこのプログラムで平気です! とても参考になりました。