奇数魔方阵显示到屏幕并写入到文件

/* 奇数届魔方阵 */
/* 从1开始依次放入,第一个数放在第一行的最中间一列,
此后的每一个数放在前一个数的上一行的下一列,如果此
位置已经有数,则将它放在前一个数的下面。 */

/* 奇数届魔方阵 */
/* 从1开始依次放入,第一个数放在第一行的最中间一列,
此后的每一个数放在前一个数的上一行的下一列,如果此
位置已经有数,则将它放在前一个数的下面。 */

#include "stdio.h"
#include "conio.h"
#define N 59    /* 最大届数 */
int main()
{
    int a[N+1][N+1] = {0};
    int s,h,l,n;
    int s1 = 0, s2 = 0;
    FILE *fp;
    do       /*输入合理的届数*/
    {
        printf("\nPlease input an odd number : ");
        scanf("%d",&n);
    }
    while(n < 3 || n > N || n % 2 == 0);      /* 3到N之间的奇数合理 */

    /* 将数据放入数组 */
    s = 1;
    h = 1;
    l = (n + 1) / 2;
    a[h][l] = 1;
    for(s = 2; s <= n * n; s++)
    {  h --;
       l ++;
       if(h < 1 && l > n)
       {
           h = 2;
           l = n;
       }
       if(h < 1) h = n;
       if(l > n) l = 1;
       if(a[h][l] !=0 )
       {
           h = h + 2;
           l = l - 1;
       }
       a[h][l] = s;
    }

    /* 求每一行的和、两条对角线的和 */
    for(h = 1; h <= n; h++)
    {
        for(l=1; l <= n; l++)
            a[h][0] += a[h][l];
        s1 += a[h][h];          /* 正对角线 */
        s2 += a[h][n - h + 1];  /* 反对角线 */
    }

    /* 求每一列的和 */
    for(l=1; l <= n; l++)
        for(h = 1; h <= n; h++)
            a[0][l] += a[h][l];

    /* 创建文件  c:\MagicArray.txt */
    if( (fp = fopen("d:\\MagicArray.txt","a")) == NULL)
    {
        printf("\nCan not open MagicArray.txt . !");
        getch();
        return 0;
    }

    /* 显示魔方阵,并输出到文本文件 */
    printf("\nThe sum of the %d * %d magic array is %d (%d) . \n\n",n,n,s1,s2);
    fprintf(fp,"\nThe sum of the %d * %d magic array is %d (%d) . \n\n",n,n,s1,s2);
    for(h = 0; h <= n; h++)
    {
      for(l=0; l <= n; l++)
      {
          if(h == 0 && l == 0)    /* 左上角无数据,屏幕或文件中要空出位置 */
          {
              printf("%6s"," ");
              fprintf(fp,"%6s"," ");
          }
          else
          {
              //textcolor((h + l) % 16);
              printf("%6d",a[h][l]);
              fprintf(fp,"%6d",a[h][l]);
          }
      }
      printf("\n\n");
      fprintf(fp,"%s","\n\n");
    }
    fclose(fp);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值