天天看點

第一篇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");       //選擇錯誤.

    }
}
           

}

繼續閱讀