求助C语言高手,关于魔方矩阵的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求助C语言高手,关于魔方矩阵的问题相关的知识,希望对你有一定的参考价值。

把整数1到n2排成一个n×n方阵, 使方阵中的每一行, 每一列以及对角线上的数之和都相同。
①n阶魔方阵的产生;生成后的魔方阵要写入文件。
②最大值的位置;
③指定行的排序,排序方法不限;
④求素数;
⑤求完数;
⑥求水仙花数;
⑦退出。
(2)功能要求
①系统以菜单方式工作;菜单形式不限。
②界面比较美观。
③要有一定的容错能力,比如说按行排序是输入一个不存在的行号,输入的魔方阵阶数为偶数等。
(3)算法分析
如n为奇数, 魔方阵可按下述方法构成:
(1) 把1填在第一行的正中间, 然后填入后续的数;
(2) 若数k填在第i行第j列的格子中, 那么k+1应填在它的左上方, 即第i-1行第j-1列的那个格子中, 如果左上方无格子,即:若i-1为0, 那么填在第n行第j-1列的格子中;若j-1为0, 那么填在第i-1行第n列的格子中; 若i-1和j-1都为0, 那么填在第n行第n列的格子中。
(3) 若按(2)的方法找到的格子中已填过数了, 那么数k+1改填在第k个数的正下方。即填在第i+1行和第j列的那个格子中。

#include <stdio.h>
#include <conio.h>
#define N 15

void main()

int iArr[N][N] = 0; /*魔法阵数组*/

/*定义变量,i,j为循环控制变,iNum表示数组的行数列数,iPox、iPoy分别代表数组的行数、列数,iPosx、iPosy分别代表保存数组行数变量,保存数组列数变量*/
int i = 0, j = 0, iNum = 0, iPosx = 0, iPosy = 0, iPox = 0, iPoy = 0;

printf("input the number:\n"); /*输入数组的行数列数*/
scanf("%d",&iNum);

if (iNum % 2 == 0 || iNum > 15 || iNum <= 0) /*判断iNum是否为奇数*/

printf("ERROR!"); /*偶数,输出错误提示*/

else
/*为奇数,进行处理*/
iPox = 0;
iPoy = iNum / 2; /*算出1所在的位置*/
for (i=1; i<=iNum*iNum; i++)

iArr[iPox][iPoy] = i;

iPosx = iPox;
iPosy = iPoy;

if (iPox == 0) /*如果上一个数的行数为第一行,则下一个数的行数为最下一行,列数同样加1;*/

if (iPoy != iNum-1) /*上一个数是第一行最后一列时,则把下一个数放在上一个数的下面*/

iPox = iNum-1;

else
/*每一个数存放的行比前一个数的行数减1,列数加1(右上方)*/
iPox++;
iPoy--;


else

iPox--;


if (iPoy == iNum-1) /*当上一个数的列数为最后一列时,下一个数的列数应为第一列,行数减去1;*/

iPoy = 0;

else

iPoy++;


if (iArr[iPox][iPoy] != 0) /*如果按上面规则确定的位置上已有数时,则把下一个数放在上一个数的下面*/

iPox = iPosx+1;
iPoy = iPosy;




printf("The array is :\n");
for (i=0; i<iNum; i++) /*输出该数组*/

for (j=0; j<iNum; j++)

printf("%3d",iArr[i][j]);


printf("\n");



getch();
追问

你这是一个矩阵而已,后面的那些内容我还不懂哦

追答

这就是个魔方矩阵,我把我的这个要求给你看看,你看看是不是:输出魔方阵。所谓魔方阵是指行、列为奇数的方阵N×N,把1~N2这N2个不同的数放入方阵中,它的每一行,每一列和对角线上元素之和均相等。
魔方阵的排列规律如下:
(1)将1放在第一行中间一列;
(2)从2开始直到N×N止各数依次按下列规则存放;每一个数存放的行比前一个数的行数减1,列数加1(右上方);
(3)如果上一个数的行数为第一行,则下一个数的行数为最下一行,列数同样加1;
(4)当上一个数的列数为最后一列时,下一个数的列数应为第一列,行数减去1;
(5)如果按上面规则确定的位置上已有数,或上一个数是第一行最后一列时,则把下一个数放在上一个数的下面。
编写程序,对于输入的小于15的N,输出其相应的魔方阵

参考技术A #include<stdio.h>

#define N 99

int main(void)

int n,magic[N][N]=0;
int i,j,k,temp;
int x,y;

printf("please enter an odd number:");
scanf("%d",&n);
temp=n/2;
magic[0][temp]=1;
i=0;j=temp;
for(k=2;k<=(n*n);k++)
if(i-1>=0&&j+1<n)//下一步子(x,y)范围合格
if(magic[i-1][j+1]!=0)//已有子
magic[i+1][j]=k;
i=i+1;
else//没有子
magic[i-1][j+1]=k;
i=i-1;
j=j+1;

else if(i-1<0&&j+1<n)//x不合格,y范围合格
x=n-1;
if(magic[x][j+1]!=0)//因为可能下一步已有数字
magic[i+1][j]=k;//此处要在原有数字的正下方放数,要用到原有的i的值,故上步借助了变量x
i=i+1;
else
magic[x][j+1]=k;
i=x;
j=j+1;

else if(i-1>=0&&j+1>=n)
y=0;
if(magic[i-1][y]!=0)
magic[i+1][j]=k;
i=i+1;
else
magic[i-1][y]=k;
i=i-1;
j=y;

else if(i-1<0&&j+1>=n)
x=n-1;
y=0;
if(magic[x][y]!=0)
magic[i+1][j]=k;
i=i+1;
else
magic[x][y]=k;
i=x;
j=y;




for(i=0;i<n;i++)
for(j=0;j<n;j++)
printf("%3d",magic[i][j]);

printf("\n");


printf("\n");

return 0;
参考技术B 楼上说的很好。。我惭愧了。 参考技术C 这个算法不对吧??

C语言编程,求助高手

我定义了一个结构体
struct User

char name[10];
int score
;
并创建了一个结构体数组
User*array,里面有n个元素,下标分别为0~n-1;
现在我有两个常量user_name和user_score,想在结构体数组中添加元素array(n)
于是我尝试了各种初始化方法,但都无法解决,求大神帮忙

你的动态数组只有n个元素,已经装满了的话,就需要扩容。

具体看例子。

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

struct User

char name[10];

int score;

;

int main()

const char user_name[]="wonder";

const int user_score=99;

//c表示容量,n表示元素数量,incr表示每次扩容时的增量

int c=1,n=0,incr=10;

int i;

struct User *array=(struct User*)calloc(c,sizeof(struct User));

strcpy(array[0].name,"name1");

array[0].score=1;

n++;

printf("追加用户前:\\n");

for(i=0;i<n;i++)

printf(n-1!=i ? "%s %d," : "%s %d\\n",

array[i].name,array[i].score);

//n>=c说明动态数组array已装满,需扩容

if(n>=c)

printf("对动态数组array进行扩容\\n");

c+=incr;

array=(struct User*)realloc(array,sizeof(struct User)*c);

//追加

strcpy(array[n].name,user_name);

array[n].score=user_score;

n++;

printf("追加用户后:\\n");

for(i=0;i<n;i++)

printf(n-1!=i ? "%s %d," : "%s %d\\n",

array[i].name,array[i].score);

free(array);

return 0;

参考技术A 初始化的类型不能直接用User,必须加上struct。而且数组初始化时元素个数必须是定值,初始化以后元素个数是不可以改变的。
比如初始化数组,元素有10个:
struct User array[10];
如果想增加元素,必须用链表的形式:
struct User *array;
然后用malloc动态分配内存。追问

malloc分配内存的那一步怎么写呀
是array[n]=(User*)malloc(sizeof(User))吗

追答

array=(struct User*)malloc(10*sizeof(struct User));

以上是关于求助C语言高手,关于魔方矩阵的问题的主要内容,如果未能解决你的问题,请参考以下文章

c语言的矩阵乘法问题 初学者求助

关于C/C++的一些问题,着急找高手求助

C语言编程,求助高手

怎样用c语言产生0-100随机数?求助高手

关于c语言的问题,高手都进来看看,分高很哦!!!

关于c语言课程设计链表的两个问题。。(高分求助) 非常急。。。。!!。