#include<stdio.h>
#include <stdlib.h> 
#include<malloc.h>
#define OK 1
int sum,sum4=0;
int sum1=0;
int sum2=0;
int sum3=0;
int sum5=0;
int sum6=0;
int sum7=0;
int sum8=0;void MainMenu();
int TwoArray();
int InitTArray(int m,int );
int SumFTArray(int **S,int m,int n);
int SumNTArray(int **S,int m,int n);
int SumDTArray(int **S,int m,int n);
int FreeTArray(int **p,int m,int n);int ThreeArray();
int InitThArray(int m,int n,int r);
int SumFThArray(int ***S,int m,int n,int r);
int SumNThArray(int ***S,int m,int n,int r);
int SumDThArray(int ***S,int m,int n,int r);
int FreeThArray(int ***S,int m,int n,int r);
void MainMenu()
{
int i;

printf("^^^^-----------------****数组应用****--------------^^^^");
printf("\n");
printf("\n");
printf("^^^^---------****1,演示二维数组--------------------^^^^");
printf("\n");
printf("\n");
printf("^^^^---------****2,演示三维数组--------------------^^^^");
printf("\n");
printf("\n");
printf("^^^^---------****0,退出演示!  --------------------^^^^");
printf("\n");
printf("\n"); printf("请选择您要执行的功能!");
scanf("%d",&i);
switch(i)
{
case 1:TwoArray();
break;
case 2:ThreeArray();
break;
case 0: printf("已退出数组演示!\n");
getchar();
getchar();
exit(1);
}
}//二维数组int TwoArray()
{
int m,n;
int **S;
S=InitTArray(m,n);
printf("请输入二维数组的维数!(数中间用逗号隔开,以Enter键结束!)");
scanf("%d%d",&m,&n); InitTArray(m,n);
fflush(stdin);   printf("按回车确定显示二维数组靠边元素之和!");
getchar();
SumFTArray(S,m,n); printf("按回车确定显示二维数组不相邻元素之和!");
getchar();
SumNTArray(S,m,n); printf("按回车确定显示二维数组对角线元素之和!");
getchar();
SumDTArray(S,m,n); printf("按回车确定释放内存空间!");
getchar();
FreeTArray(S,m,n);
return OK;
}int InitTArray(int m,int n)
{
int **S;
int i,j,t=1;
printf("二维数组元素显示:");
printf("\n");
S=(int **)malloc(m* sizeof(int *));
for(i=0;i<m;i++)
{
S[i]=(int *)malloc(n* sizeof(int ));
for(j=0;j<n;j++,t++)
{
S[i][j]=t;
printf(" %d",S[i][j]); } printf("\n");

}
return OK;
}
int SumFTArray(int **S,int m,int n)
{
int i,j; for(i=0;i<m;i++)
{ for(j=0;j<n;j++)
{ if(i==0||i==m-1)
sum1=sum1+S[i][j];
sum2=sum2+S[i][0]+S[i][n-1];

} }
sum=sum1+sum2;
printf("二维数组靠边元素之和为:%d\n",sum);
return OK;
}int SumNTArray(int **S,int m,int n)
{
int i,j,sum=0;
int sum1=0;
int sum2=0;
i=0;
j=0;
while(i<=m-1)
{
if(i%2==0)//奇数列,行坐标从0开始
{
while(j<=n-1)
{
sum1+=S[i][j];
j=j+2;
}
i=i+2;
} if(i%2!=0)//偶数列,行坐标从0开始
{
while(j<=n-1)
{
sum2+=S[i][j+1];
j=j+2;
}
i=i+2;
}
}
sum=sum1+sum2;
printf("二维数组不相邻的元素为:%d\n",sum);
return OK;
}
int SumDTArray(int **S,int m,int n)
{
int i,j;
if(m!=n)
{
printf("提示!m!=n");
}
if(m==n)
{
for(i=0,j=0;i<m;i++,j++)

sum1=sum1+S[i][j];
for(i=0,j=n-1;i<m;i++,j--)
sum2=sum2+S[i][j];
}
sum=sum1+sum2;
printf("二维数组的对角线元素之和为:%d\n",sum);
return OK;
}
int FreeTArray(int **p,int m,int n)
{
int i,j;
for(i=0;i<m;i++)
{
free(p[i]);
free(p);
}
return OK;}//三维数组
int ThreeArray()
{
int m,n,r;
int ***S;
S=InitTArray(m,n,r);
printf("请输入三维数组的各个维数!(数中间用逗号隔开,以Enter键结束!)");
scanf("%d%d%d",&m,&n,&r);
InitThArray(m,n,r);
fflush(stdin);   printf("按回车确定显示三维数组靠边元素之和!");
getchar();
SumFThArray(S,m,n,r); printf("按回车确定显示三维数组不相邻元素之和!");
getchar();
SumNThArray(S,m,n,r); printf("按回车确定显示三维数组对角线元素之和!");
getchar();
SumDThArray(S,m,n,r); printf("按回车确定释放内存空间!");
getchar();
FreeThArray(S,m,n,r);
return OK;
}int InitThArray(int m,int n,int r)
{
int i,j,k,t=0;
int ***S;
S=(int ***)malloc(m*sizeof(int **));
for(i=0;i<m;i++)
{
S[i]=(int **)malloc(n*sizeof(int *));
for(j=0;j<n;j++)
S[i][j]=(int *)malloc(r*sizeof(int ));
for(k=0;k<r;k++,t++)
{
S[i][j][k]=t;
printf(" %d",S[i][j][k]);
}
}
return OK;
}
int SumNThArray(int ***S,int m,int n,int r)
{
int i,j,k;
i=0;
j=0;
k=0;
while(k<r)           //从纵开始判断,当为奇纵时,依次判断行列(下标一律从0开始)
{
if(k%2==0)
{
while(i<n)
{
if(i%2==0)
{
while(j<n)
{
if(j%2==0)
{
sum1=sum1+S[i][j][k];
}
if(j%2!=0)
{
sum2=sum2+S[i][j+1][k];

}
j=j+2;
}
}


if(i%2!=0)
{
while(j<n)
{
if(j%2==0)
{
sum3=sum3+S[i+1][j][k];
}
if(j%2!=0)
{
sum4=sum4+S[i+1][j+1][k];
}
j=j+2;
}
}
i=i+2;
}
} if(k%2!=0)      //当为偶数纵时,再一次判断行列的奇偶
{
while(i<n)
{
if(i%2==0)
{
while(j<n)
{
if(j%2==0)
{
sum5=sum5+S[i][j][k+1];
}
if(j%2!=0)
{
sum6=sum6+S[i][j+1][k+1];
}
j=j+2;
}
}




if(i%2!=0)
{
while(j<n)
{
if(j%2==0)
{
sum7=sum7+S[i+1][j][k+1];
}
if(j%2!=0)
{
sum8=sum8+S[i+1][j+1][k+1];
}
j=j+2;
}
}
i=i+2;
}
}
k=k+2;
} sum=sum1+sum2+sum3+sum4+sum5+sum6+sum7+sum8;
printf("三维数组中不相邻的元素之和:%d\n",sum);
return OK;
}
int SumFThArray(int ***S,int m,int n,int r)
{
int i,j,k=0;
i=0;
j=0;

while(i<m)
{
if(i==0||i==m-1)
{
for(j=0;j<n;j++)
{
for(k=0;k<r;k++)
{
sum1=sum1+S[i][j][k];
}
}
}
else
{
while(j<n)
{
if(j==0||j==n-1)
{
for(k=0;k<r;k++)
sum2=sum2+S[i][j][k];
}
else 
{
sum3=sum3+S[i][j][0]+S[i][j][r-1];
}
j++;
}
}
i++;

} sum=sum1+sum2+sum3;
printf("三维靠边元素之和为:%d\n",sum);
return OK;

}int SumDThArray(int ***S,int m,int n,int r)
{
int i;
if(m==n||n==r)
printf("提示!三维数组各维数不相等!");
for(i=0;i<m;i++)
{
sum1=sum1+S[i][i][i];
sum2=sum2+S[i][m-i-1][m-i-1];
sum3=sum3+S[m-i-1][i][m-i-1];
sum4=sum4+S[m-i-1][m-i-1][i];
}
sum=sum1+sum2+sum3+sum4;
printf("三维数组的对角线之和为:%d\n",sum);
return OK;
}
int FreeThArray(int ***p,int m,int n,int r)
{
int i,j,k;
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
{

free(p[i][j]);
free(p);
}
}
return OK;
}
void main()
{
while(1)
MainMenu();
}