• ベストアンサー

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

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

#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を使わずというのがよくわからないですけど、 こんな感じでいいのでしょうか? 一般的な式を出そうとしたけど、 わけわからんくなったので、 プログラム的にやってみました。 カテ違いな気がしますが…

hasse-555
質問者

お礼

ありがとうございます。 scanfを使わずにというのは実行した場合if、for文だけで作れって意味なのでこのプログラムで平気です! とても参考になりました。

その他の回答 (3)

  • tenro
  • ベストアンサー率39% (118/300)
回答No.4

配列を使わずに座標計算しました。 #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)
回答No.3

済みません、同じですが、訂正させて下さい。 #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)
回答No.1

単に、"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" を印字するコトはできますか?

関連するQ&A

専門家に質問してみよう