#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
#include <math.h>
#define MAXDIM 5 //数组最大维数
/*---------------多维数组信息定义---------------*/
typedef struct{
char ArrayName[20]; //数组名
int dim; //数组维数
int *lower; //各维下界表指针
int *upper; //各维上界表指针
int *Constants; //各维常量因子表指针
}Array;
/*---------------多维数组变量属性定义-----------*/
typedef struct{
int num; //数组元素个数
int *elem; //数组基地址
Array TypeRecord; //数组信息
}ArrayType;
/*----------------多维数组元素信息定义----------*/
typedef struct{
char ElemName[20]; //元素名
int dim; //下标个数
int Index[MAXDIM]; //各维下标值表
}ElemType;
/*----------------多维数组信息管理器定义---------*/
typedef struct{
ArrayType Arr[10]; //假设可以同时处理多个数组,但不超过10个
int num; //数组个数计数器
}ArrayManage;
/**********************************************************/
/***************输入字符串(可有括号)***********************/
/**********************************************************/
void inputstr(char s[])
{
int i=0;
char c;
scanf("%c",&c); //第一次选择的回车不算
scanf("%c",&c);
while(c!='\n')
{
s[i++]=c;
scanf("%c",&c);
}
s[i]='\0';
}
/**********************************************************/
/* 数组查找函数 */
/* 功能:根据给定的数组名,查找数组 */
/* 参数:ArrayManage am--数组管理器 */
/* char ArrName[]--数组名 */
/* 返回值:指定数组在管理器中的序号 */
/* 若不存在,返回-1 */
/**********************************************************/
int SearchAraay(ArrayManage am,char ArrName[])
{ int i;
for(i=0;i<am.num;i++)
if(!strcmp(ArrName,am.Arr[i].TypeRecord.ArrayName)) break;
if(i>=am.num)
{ printf("Array name is not exist!\n");
getchar();
return(-1);
}
return(i);
}
/**********************************************************/
/* 数组维识别函数 */
/* 功能:从给定串中识别出数组的一维的下界和上界值 */
/* 参数:char str[]--给定字符串 */
/* int *low--维的下界返回值 */
/* int *upp--维的上界返回值 */
/* 返回值:0--串中有错,识别失败 */
/* 1--识别成功 */
/**********************************************************/
int DimAnalyse(char str[],int *low,int *upp) //只是识别一组【下界..上界】(只能两个..,只能插空格)
{
int temp;
char *p;
p=str+1;
while(*p&&*p==' ')
p++;
if(*p=='\0'||*p<'0'||*p>'9')
return 0; //直接到尾或下界前出现数字以外的字符,错误
temp=0;
while(*p&&(*p>='0'&&*p<='9')) //为数字字符转化为数字
{
temp=temp*10+((*p)-48);
p++;
}
*low=temp;
while(*p&&*p==' ')
p++;
if(!(*p=='.'&&*(p+1)=='.')) //没找到点或不是连续两点,错误
return 0;
p=p+2;
while(*p&&*p==' ')
p++;
if(*p=='\0'||*p<48||*p>57)
return 0;
temp=0;
while(*p&&(*p>='0'&&*p<='9'))
{
temp=temp*10+((*p)-48);
p++;
}
*upp=temp;
return 1;
}
/**********************************************************/
/* 数组识别函数 */
/* 功能:从给定串中识别出数组的名字和各维下界和上界值 */
/* 参数:char str[]--给定字符串 */
/* char name[]--数组名 */
/* index[][2]--二维数组,记录数组各维的下界和上界 */
/* int *upp--维的上界返回值 */
/* 返回值:0--串中有错,识别失败 */
/* 大于0--数组的维数 */
/**********************************************************/
int ArrayDim(char str[],char name[],int index[][2])
{ int i=0;
char str1[20],*p,*q;
p=str;
while(*p&&*p==' ')
p++;
if(!(*p>='A'&&*p<='Z')&&(!(*p>='a'&&*p<='z')))
return 0;
q=str1;
while(*p&&((*p>='0'&&*p<='9')||(*p>='A'&&*p<='Z')||(*p>='a'&&*p<='z'))) //获得数组名
*q++=*p++;
*q='\0';
strcpy(name,str1);
if(*p!='[')
return 0; //括号必须紧跟数组名
while(*p&&*p=='[') //每位之间必须紧接,】之后必为【,所以有此循环条件
{
q=str1;
while(*p&&*p!=']') //分别确定每一维的字符串,后用函数处理
*q++=*p++;
if(!(*p))
return 0;
*q++=']';
*q='\0';
if(!DimAnalyse(str1,&index[i][0],&index[i][1]))//存入每维上下界
return 0;
if(index[i][1]<=index[i][0])
return 0; //上界小于下界,错误
i++;p++; //每循环一次,用i标记,目前搜索到多少维了
}
if(*p!=' '&&*p!='\0') //一数组后不能再有其他字符
return 0;
return i;
}
/**********************************************************/
/* 处理数组定义函数 */
/* 功能:输入数组定义字符串,把数组定义转换成数组信息 */
/* 参数:char str[]--输入字符串 */
/* ArrayType *a--数组信息指针 */
/* 返回值:0--串中有错 */
/* 1--数组定义处理完成 */
/**********************************************************/
int ProcArrayDefine(char str[],ArrayType *a)
{ int temp,i,dim,index[MAXDIM][2];
char name[40],*p,*q;
printf("Input Arraydefine(example[2..5][3..8]):");
inputstr(str);
if((dim=ArrayDim(str,name,index))==0)
return 0; //解析该数组后,之后各域依次赋值
strcpy(a->TypeRecord.ArrayName,name);
a->TypeRecord.dim=dim;
a->TypeRecord.lower=(int *)malloc(a->TypeRecord.dim*sizeof(int));
a->TypeRecord.upper=(int *)malloc(a->TypeRecord.dim*sizeof(int));
a->num=1;
for(i=0;i<a->TypeRecord.dim;i++)
{
a->TypeRecord.lower[i]=index[i][0];
a->TypeRecord.upper[i]=index[i][1];
a->num=a->num*(index[i][1]-index[i][0]+1); //元素个数算法,每一维元素个数相乘
}
a->TypeRecord.Constants=(int *)malloc(a->TypeRecord.dim*sizeof(int));
a->TypeRecord.Constants[a->TypeRecord.dim-1]=1;
for(i=a->TypeRecord.dim-2;i>=0;i--) //常量数组就等于上一维常量乘上一维元素个数
a->TypeRecord.Constants[i]=(index[i+1][1]-index[i+1][0]+1)*a->TypeRecord.Constants[i+1];
a->elem=(int *)malloc(a->num*sizeof(int)); //不忙赋值,后面会调用初始化赋值的
}
/**********************************************************/
/* 数组初始化函数 */
/* 功能:对指定数组赋指定初始值 */
/* 参数:ArrayType *am--初始化数组指针 */
/* 返回值:无 */
/**********************************************************/
int InitArray(ArrayManage *am)
{ int i,j,value;
char ArrName[20];
printf("Input Array name and initial value:");
scanf("%s %d",ArrName,&value);
if((i=SearchAraay(*am,ArrName))==-1) return 0;
for(j=0;j<am->Arr[i].num;j++)
am->Arr[i].elem[j]=value;
return 1;
}
/**********************************************************/
/* 数组元素下标识别函数 */
/* 功能:识别数组元素的一个下标 */
/* 参数:char str[]--下标字符串 */
/* int *Index--数组元素下标指针(返回值) */
/* 返回值:0--串中有错 */
/* 1--数组元素下标识别成功 */
/**********************************************************/
int SubscriptAnalyse(char str[],int *Index)
{ int temp;
char *p;
p=str+1;
while(*p&&*p==' ')
p++;
if(*p=='\0'||*p<48||*p>57)
return 0;
temp=0;
while(*p&&(*p>='0'&&*p<='9'))
{