(小白進階中)
課設題目:建立多元數組
##要求: 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"); //選擇錯誤.
}
}
}