1. 程式人生 > >C語言資料結構——矩陣的加減乘除

C語言資料結構——矩陣的加減乘除

#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; }