C語言資料結構——矩陣的加減乘除
阿新 • • 發佈:2019-01-22
#include<stdio.h>
//#include<iostream.h>
#include<stdlib.h>
#include<conio.h>
#include<malloc.h>
#define MAXSIZE 100 /*假設非零元個數的最大值為100*/
typedef struct
{int i,j; /*該非零元的行下標和列下標*/
int v;
}Triple;
typedef struct
{Triple data[MAXSIZE+1]; /*非零元三元組表,data[0]未用*/
int mu,nu,tu; /*矩陣的行數,列數和非零元個數*/
}TSMastrix;
//********************** 宣告函式 **********************//
void creat(TSMastrix &T);/*建立三元組*/
void add(TSMastrix A,TSMastrix B);/*加法運算*/
void sub(TSMastrix A,TSMastrix B);/*減法運算*/
void mult(TSMastrix A,TSMastrix B);/* 乘法運算*/
void print(TSMastrix A);/*輸出計算結果*/
char menu();//選單
void display (TSMastrix M);//s輸出函式
//******************** 主函式 ***********************//
int main()
{
TSMastrix A,B;
creat(A);
creat(B);
printf("*************** 創 建 矩 陣 ********************\n");
for(;;)
switch(menu())
{
case '0':
printf("*****************輸 出 矩 陣 A*************************\n" );
display(A);
printf("*****************輸 出 矩 陣 B*************************\n");
display(B);
getchar();
break;
case '1':
add(A,B);
getch();
break;
case '2':
sub(A,B);
getch();
break;
case '3':
mult(A,B);
getch();
break;
case '4':
creat(A);
creat(B);
getch();
break;
case '5':
system("cls");
exit(0);
}
}
//********************* 子 函 數 ****** *****************//
//******** 建立三元組儲存矩陣資料 ********//
void creat(TSMastrix &T)
{
int k,i,j;
printf("\n 請輸入矩陣\n");
do
{
printf("\n請輸入矩陣的行數,列數,非零元素個數\n");
scanf("%d %d %d",&T.mu,&T.nu,&T.tu);
if((T.mu<0||T.mu>20)||(T.nu<0||T.nu>20)||((T.tu>T.mu*T.nu)||T.tu>MAXSIZE))
printf("\n 超出行列定義範圍,請重新輸入!!\n");
}
while((T.mu<0||T.mu>20)||(T.nu<0||T.nu>20)||((T.tu>T.mu*T.nu)||T.tu>MAXSIZE));
printf("*********************************************************\n");
for(k=1;k<=T.tu;k++)
{
do
{
printf("\n請輸入非零元素的行數i,列數j,數值v\n");
scanf("%d,%d,%d",&T.data[k].i,&T.data[k].j,&T.data[k].v);
if((T.data[k].i<0||T.data[k].i>T.mu)||(T.data[k].j<0||T.data[k].j>T.nu)||(T.data[k].v==0))
printf("\n 超出行列定義範圍,請重新輸入!\n");
}
while((T.data[k].i<0||T.data[k].i>T.mu)||(T.data[k].j<0||T.data[k].j>T.nu)||(T.data[k].v==0));
printf("*********************************************************\n");
}
return;
}
//********* 輸出矩陣函式 ********//
void display( TSMastrix M)
{
int q,n,k,a=0;
printf("------------------------------------------------------------\n");
printf("------------------------------------------------------------\n");
for(n=1;n<=M.mu;n++)
{
for(k=1;k<=M.nu;k++)
{
for(q=1;q<=M.tu;q++)
{
if(M.data[q].i==n&&M.data[q].j==k)
{
printf("\t%-3d",M.data[q].v);
break;
}
}
if(q>M.tu)printf("\t%-3d",a);
}
printf("\n");
}
printf("------------------------------------------------------------\n");
printf("------------------------------------------------------------\n");
printf("\n");
}
//******** 加法運算 **********//
void add(TSMastrix A,TSMastrix B)
{
int n,k;
if(A.mu!=B.mu||A.nu!=B.nu)
{ printf("\n 不滿足兩個矩陣相加條件!");
printf("\n 需要滿足兩矩陣的行數、列數均各自相等方可經行減法運算!!");
}
else {for(n=1;n<=A.tu;n++)
for(k=1;k<=B.tu;k++) /*將矩陣T的非零元接至M中*/
{if(A.data[n].i==B.data[k].i&&A.data[n].j==B.data[k].j)
{A.data[n].v+=B.data[k].v;
B.data[k].v=0;}
}
for(k=1;k<=B.tu;k++)
if(B.data[k].v!=0)
{A.data[A.tu+1].i=B.data[k].i;
A.data[A.tu+1].j=B.data[k].j;
A.data[A.tu+1].v=B.data[k].v;
A.tu++;
}
print(A);
}
}
//******* 減法運算 *********//
void sub(TSMastrix A,TSMastrix B)
{int n,k;
if(A.mu!=B.mu||A.nu!=B.nu)
{ printf("\n 不滿足兩個矩陣相減條件!");
printf("\n 需要滿足兩矩陣的行數、列數均各自相等方可經行減法運算!!");
}
else{
for(n=1;n<=A.tu;n++)
for(k=1;k<=B.tu;k++) /*將矩陣T的非零元接至M中*/
{
if(A.data[n].i==B.data[k].i&&A.data[n].j==B.data[k].j)
{A.data[n].v-=B.data[k].v;
B.data[k].v=0;}
}
for(k=1;k<=B.tu;k++)
if(B.data[k].v!=0)
{A.data[A.tu+1].i=B.data[k].i;
A.data[A.tu+1].j=B.data[k].j;
A.data[A.tu+1].v=-B.data[k].v;
A.tu++;}
print(A);
}
}
//****** 乘法運算 *******//
void mult(TSMastrix A,TSMastrix B)
{int z,n1,k1,n2,k2,s,sum,count=0;
TSMastrix Z;
int b1[100][100],b2[100][100],b3[100][100];
if(A.nu!=B.mu)printf("矩陣的行數與列數不像等,不能進行相乘運算!");
else{
Z.mu=A.mu;
Z.nu=B.nu;
for(n1=1;n1<=A.mu;n1++) /*初始化為零*/
for(k1=1;k1<=A.nu;k1++){b1[n1][k1]=0;}
for(n1=1;n1<=A.mu;n1++)
for(k1=1;k1<=A.nu;k1++){b2[n1][k1]=0;}
for(n1=1;n1<=A.tu;n1++) /*裝載三元組資料*/
{b1[A.data[n1].i][A.data[n1].j]=A.data[n1].v;}
for(n1=1;n1<=B.tu;n1++)
{b2[B.data[n1].i][B.data[n1].j]=B.data[n1].v;}
for(n1=1;n1<=Z.mu;n1++)
{ for(k2=1;k2<=Z.nu;k2++)
{
sum=0;
for(k1=1;k1<=Z.nu;k1++)
{
sum+=b1[n1][k1]*b2[k1][k2];
}
if(sum!=0)
{count++;
Z.data[count].i=n1;
Z.data[count].j=k2;
Z.data[count].v=sum;
Z.tu=count;
}
}
}
print(Z);
}
}
//****** 輸出計算結果 ********//
void print(TSMastrix A)
{int q,n,k,a=0;
system("cls");
printf("\n\n經過稀疏矩陣運算器運算,所得結果為:\n");
printf("------------------------------------------------------------\n");
printf("------------------------------------------------------------\n");
for(n=1;n<=A.mu;n++)
{
for(k=1;k<=A.nu;k++)
{
for(q=1;q<=A.tu;q++)
{if(A.data[q].i==n&&A.data[q].j==k){printf("\t%-3d",A.data[q].v);break;}
}
if(q>A.tu)printf("\t%-3d",a);
}
printf("\n");
}
printf("------------------------------------------------------------\n");
printf("------------------------------------------------------------\n");
}
//*********** 選單 *********//
char menu()
{
char n;
printf(" \n");
printf(" 稀疏矩陣運算器 \n");
printf("******************************************************************\n");
printf("* 0: 輸出矩陣 *\n");
printf("* 1:兩個矩陣相加 *\n");
printf("* 2:兩個矩陣相減 *\n");
printf("* 3:兩個矩陣相乘 *\n");
printf("* 4:重新建立矩陣 *\n");
printf("* 5:成功安全退出 *\n");
printf("********************************************************************************\n");
printf("\n\n\n 請選擇你需要的操作: ");
n=getchar();
return n;
}