Code:/********************************************** ** @copyright reserved by the author **author: xuxuelong **data: 20009/12/18 **IDE: visula c++ 6.0 **major: CS-software engineering-08 **email address: [email protected] **attention: if you find a bug in the **.......... operation ,just email me! **********************************************/ #include <stdio.h> #include <stdlib.h> #include <windows.h> #define Max 100 #define OK 1 #define ERROR 0 /********************/ typedef struct node { int row; int colum; int value; }data; typedef struct _matrix { int row_size; int colum_size; int non_zero_amount; data matrix[Max+1]; }tri_matrix; /********subfunctions**********/ /*******function prototypes****/ int creat_matrix(tri_matrix &T) {//creat a tri_matrix T with row_temp rows and colum_temp colums /*input how many rows matrixs have*/ printf("The matrix's row size :"); scanf("%d",&T.row_size); /*input how many colums matrixs have*/ printf("The matrix's colum size:"); scanf("%d",&T.colum_size); printf("Input the number of non_zero amount :"); scanf("%d",&T.non_zero_amount); printf("/*****************************************/\n"); for(int count=1;count<=T.non_zero_amount;count++) { do {//insure the row mark is valid printf("Input the mark of <row>:"); scanf("%d",&T.matrix[count].row); }while(T.matrix[count].row>T.row_size); do {//insure the colum mark is valid printf("Input the mark of <colum>:"); scanf("%d",&T.matrix[count].colum); }while(T.matrix[count].colum>T.colum_size); /*input the value of the matrix*/ do {//insure the value is non zero printf("Input the <value> of the node:"); scanf("%d",&T.matrix[count].value); }while(T.matrix[count].value==0); printf("/************************************/\n"); }//for return OK; }//creat_matrix void print_matrix(tri_matrix T) {//print out the info of the matrix printf("\t\tRow\t\t\tColum\t\t\tValue\n"); printf("\t\t-------------------------------------------------\n"); for(int count=1;count<=T.non_zero_amount;count++) { printf("\t\t%d\t\t\t%d\t\t\t%d\n",T.matrix[count].row,T.matrix[count].colum,T.matrix[count].value); printf("\t\t-------------------------------------------------\n"); Sleep(1000); } }//print_matrix int add_matrix(tri_matrix one,tri_matrix two, tri_matrix &three) {//add matrix one and two then put the result in three int i,j,k;//count in the loop for(i=1;i<=one.non_zero_amount;i++) {//assign one's info to three three.matrix[i].row=one.matrix[i].row; three.matrix[i].colum=one.matrix[i].colum; three.matrix[i].value=one.matrix[i].value; } three.non_zero_amount=i-1; /*insert two's info to three*/ for(j=1;j<=two.non_zero_amount;j++) {//insert one by one of the two's nodes for(i=1;i<=three.non_zero_amount;i++) { if(two.matrix[j].row<three.matrix[i].row) {//node in two insert into three for(k=three.non_zero_amount;k>=i;k--) {//backoff the elements in three three.matrix[k+1].row=three.matrix[k].row; three.matrix[k+1].colum=three.matrix[k].colum; three.matrix[k+1].value=three.matrix[k].value; } /*two's insert element replace the origin one*/ three.matrix[i].row=two.matrix[j].row; three.matrix[i].colum=two.matrix[j].colum; three.matrix[i].value=two.matrix[j].value; three.non_zero_amount++; break; } else if(two.matrix[j].row==three.matrix[i].row) {//row equal then compare the colums if(two.matrix[j].colum==three.matrix[i].colum) {//all equal three.matrix[i].row=three.matrix[i].row; three.matrix[i].colum=three.matrix[i].colum; three.matrix[i].value+=two.matrix[j].value; break;//two's element to the next one } else if(two.matrix[j].colum<three.matrix[i].colum) { for(k=three.non_zero_amount;k>=i;k--) {//backoff the elements in three three.matrix[k+1].row=three.matrix[k].row; three.matrix[k+1].colum=three.matrix[k].colum; three.matrix[k+1].value=three.matrix[k].value; } three.matrix[i].row=two.matrix[j].row; three.matrix[i].colum=two.matrix[j].colum; three.matrix[i].value=two.matrix[j].value; three.non_zero_amount++; break;//two's element to the next one } else { if(i==three.non_zero_amount) {//insert to the last three.matrix[three.non_zero_amount+1].row=two.matrix[j].row; three.matrix[three.non_zero_amount+1].colum=two.matrix[j].colum; three.matrix[three.non_zero_amount+1].value=two.matrix[j].value; three.non_zero_amount++; } else continue;//element in three to the next one }//else }//if else//two.matrix[j].row>three.matrix[i].row { if(i==three.non_zero_amount) {//insert to the last three.matrix[three.non_zero_amount+1].row=two.matrix[j].row; three.matrix[three.non_zero_amount+1].colum=two.matrix[j].colum; three.matrix[three.non_zero_amount+1].value=two.matrix[j].value; three.non_zero_amount++; break; } else continue; } }//inner for }//outer for three.non_zero_amount=three.non_zero_amount; three.row_size=one.row_size; three.colum_size=one.colum_size; return OK; }//add_matrix int multiply_matrix(tri_matrix one, tri_matrix two,tri_matrix &three) {//multiply one and two ,print the result in three int k=1;//element count in the loop three three.row_size=one.row_size; three.colum_size=two.colum_size; for(int i=1;i<=one.non_zero_amount;i++) { for(int j=1;j<=two.non_zero_amount;j++) { if(one.matrix[i].colum==two.matrix[j].row) {//the apply of matrix's attribute three.matrix[k].row=one.matrix[i].row; three.matrix[k].colum=two.matrix[j].colum; three.matrix[k].value=one.matrix[i].value*two.matrix[j].value; k++; } }//for NULL; }//for three.non_zero_amount=--k; return OK; }//multiplay_matrix void swap(int &a,int &b) {//exchange the value between a and b int temp; temp=a; a=b; b=temp; }//swap int trans_matrix(tri_matrix one,tri_matrix &T) {//figure out the transfort matrix of one /*sort the colum(bubble sort) and assign to T*/ for(int i=1;i<=one.non_zero_amount;i++) { /*initilize to be the minimum one*/ T.matrix[i].row=one.matrix[i].colum; T.matrix[i].colum=one.matrix[i].row; T.matrix[i].value=one.matrix[i].value; for(int j=i+1;j<=one.non_zero_amount;j++) { if(T.matrix[i].row<one.matrix[j].colum) continue; if(T.matrix[i].row>one.matrix[j].colum) { swap(T.matrix[i].row,one.matrix[j].colum); swap(T.matrix[i].colum,one.matrix[j].row); swap(T.matrix[i].value,one.matrix[j].value); continue; }else {//T's row equal to one's colum if(T.matrix[i].colum<one.matrix[j].row) continue; if(T.matrix[i].colum>one.matrix[j].row) {//only swap the colum of T swap(T.matrix[i].colum,one.matrix[j].row); swap(T.matrix[i].value,one.matrix[j].value); continue; } } }//for T.matrix[i].row=T.matrix[i].row; T.matrix[i].colum=T.matrix[i].colum; T.matrix[i].value=T.matrix[i].value; }//for T.row_size=one.row_size; T.colum_size=one.colum_size; T.non_zero_amount=one.non_zero_amount; return OK; }//trans_matrix /*******the main function********/ /*******the main function********/ int main(void) { /*declare three tri_matrix*/ tri_matrix one,two,three; int choice;//as a mark of selection char flag;//selection mark while(OK) { system("cls"); system("color a4"); printf("\t$*****************************************************$\n"); putchar('\n'); printf("\t\t %c------------Functions------------%c\n",2,2); putchar('\n'); printf("\t\t %c---------------------------------%c\n",2,2); printf("\t\t %c <1>matrix---addition %c\n",2,2); printf("\t\t %c---------------------------------%c\n",2,2); printf("\t\t %c <2>matrix---multiplication %c\n",2,2); printf("\t\t %c---------------------------------%c\n",2,2); printf("\t\t %c <3>matrix---transformation %c\n",2,2); printf("\t\t %c---------------------------------%c\n",2,2); printf("\t\t %c <4>exit-----quit the program %c\n",2,2); printf("\t\t %c---------------------------------%c\n",2,2); putchar('\n'); printf("\t\t %c--------Triples Row First--------%c\n",2,2); printf("\t$*****************************************************$\n"); printf("Please choose a choice :(1--4)\n"); scanf("%d",&choice); switch(choice) { case 1: printf("\t<addition>\n"); /***creat the first one***/ printf("\n"); printf("Creat the one matrix\n"); printf("\n"); creat_matrix(one); printf("The one tri_matrix is below:\n"); print_matrix(one); /*****creat the second one****/ printf("Creat the two matrix\n"); printf("\n"); creat_matrix(two); printf("The two tri_matrix is below:\n"); print_matrix(two); /*********check*******/ while(two.row_size!=one.row_size||two.colum_size!=one.colum_size) {//insure the two matrix are valid to add printf("--------------------------------ERROR---------------------------!\n"); printf("!!!The two matrix should have the same row size and colum size!!!\n"); printf("--------------------------------ERROR---------------------------!\n"); printf("Creat the two matrix\n"); printf("\n"); creat_matrix(two); print_matrix(two); } /*******add the two matrix********/ printf("Add the two matrix\n"); putchar('\n'); add_matrix(one,two,three); printf("The three matrix is below:\n"); Sleep(2000); print_matrix(three); system("pause"); break; case 2:printf("\t<multiplication>\n"); /***creat the first one***/ printf("\n"); printf("Creat the one matrix\n"); printf("\n"); creat_matrix(one); printf("The one matrix is below:\n"); print_matrix(one); /*****creat the second one****/ printf("Creat the two matrix\n"); printf("\n"); creat_matrix(two); printf("The two matrix is below:\n"); print_matrix(two); /**********check**********/ while(one.colum_size!=two.row_size) {//if not equal ,creat a valid one printf("--------------------------------ERROR---------------------------!\n"); printf("!!!!!!!!!!One's colum size should equal to two's row size!!!!!!!!\n"); printf("--------------------------------ERROR---------------------------!\n"); printf("Creat the two matrix\n"); printf("\n"); creat_matrix(two); printf("The two matrix is below:\n"); printf("\n"); print_matrix(two); } /*******multiply the two matrix********/ printf("Multiply the two matrix\n"); multiply_matrix(one,two,three); printf("Print the results of multiplication\n"); Sleep(2000); print_matrix(three); system("pause"); break; case 3:printf("\t<transformation>\n"); /***creat a matrix***/ printf("\n"); printf("Creat a matrix\n"); printf("\n"); creat_matrix(one); printf("The matrix is below:\n"); print_matrix(one); /*****transformation of the matrix*****/ printf("The transfortid matrix is :\n"); Sleep(2000); trans_matrix(one,three); print_matrix(three); system("pause"); break; case 4: printf("Are you sure to quit the system<Y/N>?\n"); fflush(stdin); scanf("%c",&flag); if(flag=='y'||flag=='Y'||flag=='\n') { printf("\t\t%c-------%c-------%c-------%c-------%c\n",2,2,2,2,2); putchar('\n'); printf("\t\t(^_^)Thanks For Using This!(^_^)\n"); putchar('\n'); printf("\t\t%c-------%c-------%c-------%c-------%c\n",2,2,2,2,2); putchar('\n'); Sleep(2000); exit(OK); } break; }//switch NULL; }//while return OK; }