第一篇CSDN博客

(小白进阶中)

课设题目:创建多维数组

##要求: 1创建整数型多维数组,各维下标是给出任意整数开始的连续整数
2 给出下标能找出该下标对应的数
3能对给出的下标对应的元素赋值
4能对给出的子数组赋值
##代码示例

#include<stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

#define MaxDim 5
typedef struct{
int dim, //数组维数
*upper, //数组上界的指针
*lower, //数组下界的指针
*constants, //数组映像函数常量表
*data, //数组元素内容
num, //数组总个数
pis; //元素在数组中位置 如五维数组各维上界为5,下界为0
}NArray;
NArray A;

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(" 0.退出.\n\n");
printf("                                                             xxx    完成\n");
printf("☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆欢迎使用☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆\n");
printf("请输入你选择执行的选项:");

}

void InitNArray() //定义整型多维数组
{
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”);
}
}
}
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(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[2]*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() //对多维数组某个元素进行赋值
{ 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 () //对多维数组中指定的子数组赋值(未完成)
{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]&&b[i-1]<=A.upper[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 () //对数组所有元素进行赋值
{ int i,data,address;
printf(“请输入你要对该数组所有元素赋值的内容:\n”);
// printf(“地址总数%d”,A.constants[1]);
scanf("%d",&data);
for(i=0;i<=address;i++) //数组所有元素为为用户输入的值
{A.data[i]=data;}
//-------------------------------------------------------------
printf(“已经对多维数组中的所有元素初始赋值为%d.\n”,data);
printf("\n\n☆☆☆若要执行其他赋值操作请输入执行选项;返回主界面请输入0.☆☆☆\n:");

}

void Assign() //对多维数组某个元素进行赋值或指定的子数组赋值
{
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();                                 //对多维数组某个元素进行赋值
            i=-1;                                        //复位标志
            break;
        case 2:
            Assign2();                                    //对多维数组中指定的子数组赋值
            i=-1;                                        //复位
            break;
        case 3:
            Assign3();                                    //对数组所有元素进行赋值
            i=-1;                                          //复位标志
            break;
        case 0:
            return ;                                     //退出

        default:                                        //输入错误
            printf("\n对不起!你的输入结果不正确!请重新输入!\n");       //选择错误.

    }
}


return ;

}
void Convey() //子数组赋值
{
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() //输出多维数组的总个数
{
printf(“☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆输出多维数组总个数☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆”);
printf(" 你所创建的多维数组总个数的大小是:%d\n",A.num);

}

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() //输出多维数组中的元素
{ 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");

        }
    }
}
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();                                //定义多维数组
            j = 1;
            i = -1;                                        //复位标志
             printf("请输入你继续选择执行的选项:");                                      //回复用户选择界面
            break;
        case 2:                                          //输出元素总个数
            if(!j)
            {
                printf("对不起!多维数组还未进行定义,请先定义多维数组!\n");
               printf("请先输入1执行创建多维数组的操作");                               //回到用户选择界面
                break;
            }
            Size();                                      //输出元素总个数
            i=-1;                                        //复位标志
            printf("请输入你继续选择执行的选项:");
            break;
        case 3:                             //对多维数组进行多种赋值
            if(!j)
            {
                printf("对不起!数组还没有定义,请先定义数组!\n");
                printf("请先输入1执行创建多维数组的操作");                                  //回到用户选择界面
                break;
            }
            Assign();                                    //多维数组进行多种赋值化
            i=-1;                                        //复位标志

            printf("请输入你继续选择执行的选项:");                                      //回复用户选择界面
            break;
        case 4:                                       //子数组覆盖
            if(!j)
            {
                printf("对不起!数组还没有定义,请先定义数组!\n");
                printf("请先输入1执行创建多维数组的操作");                               //回到用户选择界面
                break;
            }
            Convey();                                  //子数组赋值
            i=-1;                                       //复位标志


            printf("请输入你继续选择执行的选项:");                                      //回复用户选择界面
            break;

        case 5:                                       //输出元素
            if(!j)
            {
                printf("对不起!多维数组还未进行定义,请先定义多维数组!\n");
                printf("请先输入1执行创建多维数组的操作");                               //回到用户选择界面
                break;
            }
            Output() ;                                   //输出元素

            printf("请输入你继续选择执行的选项:");                                       //回复用户选择界面
            i=-1;                                        //复位标志
            break;
        case 6:                                        //打开帮助界面

            Help();                                     //帮助界面
            i=-1;                                        //复位标志
            printf("请输入你继续选择执行的选项:");
            break;


        case 0:
            return;                                     //退出

        default:                                        //输入错误
            printf("\n对不起!你的输入结果不正确!请重新输入!\n");       //选择错误.

    }
}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值