终于搞掂啊,啊,自己解决附上源代码::
a#include<stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <conio.h>
#define MaxDim 5
typedef struct{
int dim,
//数组维数
*upper,
//数组上界的指针
*lower,
//数组下界的指针
*constants,
//数组映像函数常量表
*data,
//数组元素内容
num,
//数组总个数
pis;
//元素在数组中位置 如五维数组各维上界为5,下界为0
// a[0][1][0][0][5] 的pis为
}NArray;
void Open()
//用户选择界面
{
printf("☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆欢迎使用☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆");
printf("
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆ \n");
printf("
多维数组生成器\n");
printf("
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆ \n");
printf(" 功能选项:\n");
printf(" 1.定义一个整型多维数组.\n");
printf(" 2.输出你所创建的多维数组的总个数.\n");
printf(" 3.多维数组进行多种赋值 .\n");
printf(" 4.子数组覆盖.令子数组b赋值于子数组a,如:a[2..4][3..5]=b[1..3][2..4].\n");
printf(" 5.输出你所创建的多维数组的某个元素.\n");
printf(" 6.帮助.\n");
printf(" 7.清屏,并返回到主画面.\n");
printf(" 0.退出.\n\n");
printf("
蒋锦波
制作\n");
printf("☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆欢迎使用☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n");
printf("请输入你选择执行的选项:");
}
void InitNArray(NArray &A)
//定义整型多维数组
{
int i,x,y,z,p,j,key=1,elemtotal,address=0;
printf("请输入你要创建的多维数组的维数:\n");
//输入多维数组的维数
scanf("%d",&x);
while(x<1||x>MaxDim)
{
printf("你输入的维数超出处理范围!!请重新输入\n");
printf("请输入你要创建的多维数组的维数:\n");
scanf("%d",&x);
}
A.dim=x;
A.upper=(int *)malloc(A.dim *sizeof(int));
//分配空间给A.upper
A.lower=(int *)malloc(A.dim *sizeof(int));
//分配空间给A.lower
for(i=1;i<=A.dim;i++)
{A.lower[i]=0;
//给A.lower初始化为0
A.upper[i]=0;
//给A.upper初始化为0
}
for(i=1;i<=A.dim;i++)
//循环输入多维数组各维的上下界
{
key=1;
//设置标志
while(key)
//循环输入多维数组各维的上界
{
printf("请输入你要创建的%d维数组第%d维的上界:\n",A.dim,i);
scanf("%d",&y);
while(y<0)
{
printf("你输入的上界超出处理范围!请重新输入\n");
printf("请输入你要创建的%d维数组第%d维的上界:\n",A.dim,i);
scanf("%d",&y);
}
A.upper[i]=y;
//将各维上界赋值给A.upper[i]
//循环输入多维数组各维的下界
printf("请输入你要创建的%d维数组第%d维的下界:\n",A.dim,i);
scanf("%d",&z);
while(z<0)
{
printf("你输入的下界超出处理范围!请重新输入\n");
printf("请输入你要创建的%d维数组第%d维的下界:\n",A.dim,i);
scanf("%d",&z);
}
A.lower[i]=z;
//将各维下界赋值给A.lower[i]
if(A.upper[i]>A.lower[i])key=0;
else
{printf("你所输入的下界大于上界,请按任意键返回!\n");
getch();
}
}
}
elemtotal=1;
//初始化数组总个数为一个
for(i=0;i<=A.dim;i++)
{
elemtotal=elemtotal*(A.upper[i]-A.lower[i]+1);
//计算数组总个数
}
A.num=elemtotal;
//将数组总个数赋值给结构体中的变量
A.data=(int *)malloc(A.num *sizeof(int));
//为数据存放分配地址空间
A.constants=(int *)malloc(A.dim *sizeof(int)); //为映象函数常量表的指针分配地址空间
A.constants[A.dim]=1;
for(i=A.dim-1;i>=1;--i)
{A.constants[i]=(A.upper[i+1]-A.lower[i+1]+1)*A.constants[i+1];}
//映象函数常量的计算公式
//-----------------------------------------------------------------
address=0;
//初始化并计算元素的地址
for(i=1;i<=A.dim;i++)
{address=address+A.constants[i]*(A.upper[i]-A.lower[i]);}
//计算地址公式
for(i=0;i<=address;i++)
//将所有元素赋值为0
{A.data[i]=0;}
//-------------------------------------------------------------------
//--------------------------------------------------------------------------------
printf("----------------------恭喜!恭喜!你要创建的多维数组已经生成!---------------------\n");
printf("系统已经生成一个%d维数组a",A.dim);
for(p=1;p<=A.dim;p++)
printf("[x]");printf("\n");
//输出数组的形式
for(j=1;j<=A.dim;j++)
printf("生成的%d维数组第%d维的下标x的选择范围是:%d到%d\n",A.dim,j,A.lower[j],A.upper[j]);
printf("----------------------恭喜!恭喜!你要创建的多维数组已经生成!---------------------\n");
//--------------------------------------------------------------------------------
}
int Loc(NArray &A,int a[5])
//定位数组元素位置
{
int
i,j,b[5],key[5] ,length[5];
for(i=1;i<=5;i++)
{b[i]=0;
length[i]=1;}
for(i=1;i<=A.dim ;i++)
b[i]=a[i];
for(i=1;i<A.dim;i++)
length[i]=A.upper[i]-A.lower[i]+1;
key[1]=length[3]*length[3]*length[4]*length[5];
key[2]=length[3]*length[4]*length[5];
key[3]=length[4]*length[5];
key[4]=length[5];
A.pis=(b[1]-A.lower[1])*key[1]+(b[2]-A.lower[2])*key[2]+(b[3]-A.lower[3])*key[3]+(b[4]-A.lower[4])*key[1]+(b[5]-A.lower[5])*key[5]+1;
return A.pis;
}
void Assign1(NArray &A)
//对多维数组某个元素进行赋值
{int i,key,address,data,a[5];
for(i=1;i<=A.dim;i++)
{
key=1;
while(key)
{
//循环输入进行赋值的元素各维下标
printf("请输入你要进行赋值的%d维数组中的元素第%d维下标是:",A.dim,i);
scanf("%d",&a[i-1]);
if(a[i-1]<=A.upper[i]&&a[i-1]>=A.lower[i]) key=0;
else
{
printf("输入的下标超出定义的范围,请按任意键返回再输入!\n");
getch();
}
}
}
//输出提示语句你要存入的位置是A[x][x]请输入你要对该元素赋值的内容
printf("你要存入的位置是A");
for(i=0;i<A.dim;i++)
printf("[%d]",a[i]);
printf("请输入你要对该元素赋值的内容:\n");
scanf("%d",&data);
address=0;
//计算地址
for(i=1;i<=A.dim;i++)
{
address=address+A.constants[i]*(a[i-1]-A.lower[i]); //地址计算公式
}
A.data[address]=data;
printf("
☆☆☆☆☆☆☆恭喜!!!赋值成功.☆☆☆☆☆☆☆\n");
//输出赋值结果
printf("
你对%d维数组进行赋值的结果是A",A.dim);
for(i=0;i<A.dim;i++)
printf("[%d]",a[i]);
printf("=");
printf("%d\n",A.data[address]);
printf("\n\n\n☆☆☆若要执行其他赋值操作请输入执行选项;返回主界面请输入0.☆☆☆\n:");
}
void Assign2 (NArray &A)
//对多维数组中指定的子数组赋值(未完成)
{int i,key,b[10],address1,address2,k=1,data;
//初始化变量
printf("请输入子数组的第一个元素的下标:\n");
for(i=1;i<=A.dim;i++)
{
key=1;
while(key)
{
printf("子数组第一个元素的下标%d是:",i);
scanf("%d",&b[i-1]);
if(b[i-1]>=A.lower[i]) key=0;
else
{
printf("你输入的下标的结果超出定义的范围,请按任意键返回重新输入!\n");
getch();
}
}
}
//循环输入子数组b最后一个元素的下标
printf("请输入子数组的最后一个元素的下标:\n");
for(i=1;i<=A.dim;i++)
{
key=1;
while(key)
{
printf("子数组最后一个元素的下标%d是:",i);
scanf("%d",&b[i+4]);
if(b[i+4]>=A.lower[i]) key=0;
else
{
printf("你输入的下标的结果超出定义的范围,请按任意键返回重新输入!\n");
getch();
}
}
}
printf("你输入的子数组是A");
//输出子数组
for(i=0;i<A.dim;i++)
printf("[%d]",b[i]);
printf("到A");
for(i=0;i<A.dim;i++)
printf("[%d]",b[i+5]);
printf("\n");
printf("请输入你要对该子数组所有元素赋值的内容:\n");
scanf("%d",&data);
address1=0;
address2=0;
for(i=1;i<=A.dim;i++)
{address1=address1+A.constants[i]*(b[i-1]-A.lower[i]);}
for(i=1;i<=A.dim;i++)
{address2=address2+A.constants[i]*(b[i+4]-A.lower[i]);}
for(i=address1;i<=address2;i++)
{A.data[i]=data; }
printf("
☆☆☆☆☆☆☆赋值结果为子数组:☆☆☆☆☆☆☆\n");
printf("
A");
for(i=0;i<A.dim;i++)
printf("[%d]",b[i]);
printf("到A");
for(i=0;i<A.dim;i++)
printf("[%d]",b[i+5]);
printf("=%d",data);
printf("\n\n☆☆☆若要执行其他赋值操作请输入执行选项;返回主界面请输入0.☆☆☆\n:");
}
void Assign3 (NArray &A)
//对数组所有元素进行赋值
{
int i,data,address;
printf("请输入你要对该数组所有元素赋值的内容:\n");
scanf("%d",&data);
A.constants[A.dim]=1;
for(i=A.dim-1;i>=1;--i)
{A.constants[i]=(A.upper[i+1]-A.lower[i+1]+1)*A.constants[i+1];} //映象函数常量的计算公式
address=0;
//初始化并计算元素的地址
for(i=1;i<=A.dim;i++)
{address=address+A.constants[i]*(A.upper[i]-A.lower[i]);}//计算地址公式
//-------------------------------------------------------------
for(i=0;i<=address;i++)
//数组所有元素为为用户输入的值
{A.data[i]=data;}
//-------------------------------------------------------------
printf("已经对多维数组中的所有元素初始赋值为%d.\n",data);
printf("\n\n☆☆☆若要执行其他赋值操作请输入执行选项;返回主界面请输入0.☆☆☆\n:");
}
void Assign(NArray &A)
//对多维数组某个元素进行赋值或指定的子数组赋值
{
int i=-1;
printf("本模块可以实现以下功能请选择:\n");
//输入选择操作
printf("1.对多维数组某个元素进行赋值.\n");
printf("2.对多维数组中指定的子数组赋值.\n");
printf("3.对多维数组所有元素赋值.\n");
printf("0.退出.\n");
printf("请输入你选择执行的选项:");
while(i!=0)
{
scanf("%d",&i);
//输入功能选项
switch(i)
{case 1:
Assign1(A);
//对多维数组某个元素进行赋值
i=-1;
//复位标志
break;
case 2:
Assign2(A);
//对多维数组中指定的子数组赋值
i=-1;
//复位
break;
case 3:
Assign3(A);
//对数组所有元素进行赋值
i=-1;
//复位标志
break;
case 0:
return ;
//退出
default:
//输入错误
printf("\n对不起!你的输入结果不正确!请重新输入!\n");
//选择错误.
}
}
return ;
}
void Convey(NArray &A)
//子数组赋值
{
int i,j,key,a[10],b[10],address1,address2,address3,address4,numa,numb,k=1;
//初始化变量
for(i=0;i<=A.dim;i++)
{a[i]=A.lower[i];
//初始化子数组a第一个元素的各维下标为起址值
a[i+5]=A.lower[i];
//初始化子数组a最后个元素的各维下标为起址值
b[i]=A.lower[i];
//初始化子数组b第一个元素的各维下标为起址值
b[i+5]=A.lower[i];
//初始化子数组b最后个元素的各维下标为起址值
}
while(k)
{
//循环输入子数组a第一个元素的下标
printf("请输入子数组a的第一个元素的下标:\n");
for(i=1;i<=A.dim;i++)
{
key=1;
while(key)
{
printf("子数组a第一个元素下标%d是:",i);
scanf("%d",&a[i-1]);
if(a[i-1]<=A.upper[i]&&a[i-1]>=A.lower[i]) key=0;
else
{
printf("你输入的下标的结果超出定义的范围,请按任意键返回重新输入!\n");
getch();
}
}
}
printf("请输入子数组a的最后一个元素的下标:\n");
for(i=1;i<=A.dim;i++)
{
key=1;
while(key)
//循环输入子数组a最后一个元素的下标
{
printf("子数组a最后一个元素下标%d是:",i);
scanf("%d",&a[i+4]);
if(a[i+4]<=A.upper[i]&&a[i+4]>=A.lower[i]) key=0;
else
{
printf("你输入的下标的结果超出定义的范围,请按任意键返回重新输入!\n");
getch();
}
}
}
//循环输入子数组b第一个元素的下标
printf("请输入子数组b的第一个元素的下标:\n");
for(i=1;i<=A.dim;i++)
{
key=1;
while(key)
{
printf("子数组b第一个元素的下标%d是:",i);
scanf("%d",&b[i-1]);
if(a[i-1]<=A.upper[i]&&b[i-1]>=A.lower[i]) key=0;
else
{
printf("你输入的下标的结果超出定义的范围,请按任意键返回重新输入!\n");
getch();
}
}
}
//循环输入子数组b最后一个元素的下标
printf("请输入子数组b的最后一个元素的下标:\n");
for(i=1;i<=A.dim;i++)
{
key=1;
while(key)
{
printf("子数组b最后一个元素的下标%d是:",i);
scanf("%d",&b[i+4]);
if(a[i+4]<=A.upper[i]&&b[i+4]>=A.lower[i]) key=0;
else
{
printf("你输入的下标的结果超出定义的范围,请按任意键返回重新输入!\n");
getch();
}
}
}
numa=1;
//初始化子数组a的个数
for(i=A.dim;i>0;i--)
{numa=numa*(abs(a[i]-a[i+5])+1);}//计算子数组a的个数
numb=1;
//初始化子数组b的个数
for(i=A.dim;i>0;i--)
{numb=numb*(abs(b[i]-b[i+5])+1);}//计算子数组b的个数
if(numa==numb)k=0;
//判断个数是否相等
else
{
printf("对不起,你输入的两个子数组的元素个数不同,无法进行!请按任意键返回再输入\n");
getch();
}
}
printf("你输入的子数组a是A:");
//输出子数组a
for(i=0;i<A.dim;i++)
printf("[%d]",a[i]);
printf("到A:");
for(i=0;i<A.dim;i++)
printf("[%d]",a[i+5]);
printf("\n");
printf("你输入的子数组b是A:");
//输出子数组b
for(i=0;i<A.dim;i++)
printf("[%d]",b[i]);
printf("到A:");
for(i=0;i<A.dim;i++)
printf("[%d]",b[i+5]);
printf("\n");
address1=0;
//初始化子数组a的起始地址
address2=0;
//初始化子数组a的结束地址
//进行子数组赋值
address3=0;
//初始化子数组b的起始地址
address4=0;
//初始化子数组b的结束地址
for(i=1;i<=A.dim;i++)
{address1=address1+A.constants[i]*(a[i-1]-A.lower[i]);}
//子数组a的起始地址计算公式
for(i=1;i<=A.dim;i++)
{address2=address2+A.constants[i]*(a[i+4]-A.lower[i]);}
//子数组a的结束地址计算公式
for(i=1;i<=A.dim;i++)
{address3=address3+A.constants[i]*(b[i-1]-A.lower[i]);}
//子数组b的起始地址计算公式
for(i=1;i<=A.dim;i++)
{address4=address4+A.constants[i]*(b[i+4]-A.lower[i]);}
//子数组b的结束地址计算公式
i=address1;
j=address3;
for(;j<=address4&&i<=address2;)
{A.data[i]=A.data[j];
i++;
j++;}
printf("你进行子数组赋值的结果是子数组b赋值于子数组a,即a=b\n");
}
void Size(NArray &A)
//输出多维数组的总个数
{
printf("☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆输出多维数组总个数☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆");
printf("
你所创建的多维数组总个数的大小是:%d\n",A.num);
printf("☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆输出多维数组总个数☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n");
}
void Help()
//帮助界面
{
printf("*******************************帮助**************************************\n");
printf("1).多维数组的各维的下标是任意整数开始的连续整数.\n");
printf("2).多维数组的各维的下标的上界是指各维定义最大位置.\n");
printf("3).多维数组的各维的下标的下界是指各维定义开始位置.\n");
printf("4).当多维数组建立后,系统自动把多维数组中所有元素初始化为0.\n");
printf("5).实现子数组赋值时应注意以下情况:\n");
printf("
1.a[1..n]=a[2..n+1]是数组元素前移,等价于:\n");
printf("
for(i=1;i<=n;i++)
a[i]=a[i+1];\n");
printf("
2. a[2..n+1]=a[1..n]是数组元素后移,等价于:\n");
printf("
for(i=n;i>=n;i--)
a[i]=a[i+1];\n");
printf("********************************帮助*************************************\n");
}
void Output(NArray &A)
//输出多维数组中的元素
{
int i,key,address,data,a[5];
printf("*****************************输出多维数组*******************************\n");
printf("请输入你想输出的多维数组的位置:\n");
for(i=1;i<=A.dim;i++)
{
key=1;
//设置标志
while(key)
{
//循环输入元素各维下标
printf("请输入要输出的元素在%d维数组中位置的第%d维下标是\n:",A.dim,i);
scanf("%d",&a[i-1]);
if(a[i-1]<=A.upper[i]&&a[i-1]>=A.lower[i]) key=0;
else
{
printf("你输入的下标超出定义的范围,请按任意键返回重新输入!\n");
getch();
}
}
}
address=0;
//初始化并计算元素的地址
for(i=1;i<=A.dim;i++)
{address=address+A.constants[i]*(a[i-1]-A.lower[i]);}
//计算地址公式
data=A.data[address];
printf("你要输出的位置是A");
//输出结果
for(i=0;i<A.dim;i++)
printf("[%d]",a[i]);
printf("=%d\n",data);
printf("*****************************输出多维数组*******************************\n");
}
void main()
{
Open();
//回复用户选择界面
NArray A;
//定义数组
int i=-1,j=0;
//设置标志
while(i!=0)
{
scanf("%d",&i);
//输入功能选项
getchar();
switch(i)
//程序分支
{
case 1:
InitNArray(A);
//定义多维数组
j=1;
i=-1;
//复位标志
Open();
//回复用户选择界面
break;
case 2:
//输出元素总个数
if(!j)
{
printf("对不起!多维数组还未进行定义,请先定义多维数组!\n");
Open();
//回到用户选择界面
break;
}
Size(A);
//输出元素总个数
i=-1;
//复位标志
printf("请输入你继续选择执行的选项:");
break;
case 3:
//对多维数组进行多种赋值
if(!j)
{
printf("对不起!数组还没有定义,请先定义数组!\n");
Open();
//回到用户选择界面
break;
}
Assign(A);
//多维数组进行多种赋值化
i=-1;
//复位标志
system("cls");
Open();
//回复用户选择界面
break;
case 4:
//子数组覆盖
if(!j)
{
printf("对不起!数组还没有定义,请先定义数组!\n");
Open();
//回到用户选择界面
break;
}
Convey(A);
//子数组赋值
i=-1;
//复位标志
Open();
//回复用户选择界面
break;
case 5:
//输出元素
if(!j)
{
printf("对不起!多维数组还未进行定义,请先定义多维数组!\n");
Open();
//回到用户选择界面
break;
}
Output(A) ;
//输出元素
Open();
//回复用户选择界面
i=-1;
//复位标志
break;
case 6:
//打开帮助界面
Help();
//帮助界面
i=-1;
//复位标志
printf("请输入你继续选择执行的选项:");
break;
case 7:
system("cls");
//清屏
Open();
//回到用户选择界面
break;
case 0:
return;
//退出
default:
//输入错误
printf("\n对不起!你的输入结果不正确!请重新输入!\n");
//选择错误.
}
}
}