📄 matrix computing.txt
字号:
//定义,初始数据输入,构成矩阵
#define maxsize 1000
#define ERROR 0
#define maxrc 100
#include<conio.h>
#include<stdio.h>
#include<string.h>
typedef struct
{ int i,j;
int v;
}node,*pnode;
typedef struct
{ int mu,nu,tu;
int rpos[maxrc+1];
node data[maxsize+1];
}matrix,pmatrix;
void print(pmatrix *pm)
{
int pr,pc;
int colnum=(*pm).nu;
int cur=1; /*current*/
int k=1; /*point to Data[k]*/
for(pr=1;pr<=(*pm).mu;pr++)
{
for(pc=1;pc<=(*pm).nu;pc++)
{
if( cur!=((*pm).data[k].i-1)*colnum+(*pm).data[k].j)
{gotoxy(4,8);
printf("%d\t",0);
}
else {gotoxy(4,9);
printf("%d\t",(*pm).data[k++].v);
}
cur++;
}
printf("\n");
}
}
void *input(pmatrix *b)
{int a , c;
gotoxy(4,6);
cprintf(" please input the mu ,nu and tu of the matrix\n ");
scanf ("%d\n",&(*b).mu);
scanf ("%d\n",&(*b).nu);
scanf ("%d",&(*b).tu);
gotoxy(4,8);
cprintf(" please input the rpos of the matrix :");
for (c=1;c<=(*b).mu;c++)
{scanf ("%d",&(*b).rpos[c]);}
for (a=1;a<=(*b).tu;a++)
{ gotoxy(4,a+8);
cprintf("please input the element of the node:");
scanf("%d\n",&(*b).data[a].i);
scanf("%d\n",&(*b).data[a].j);
scanf("%d",&(*b).data[a].v); }
}
//矩阵加运算
int add(matrix *a,matrix *b,matrix *c)
{
int l=1;
int m=1;
int n=1;
int j;
if( (*a).mu!=(*b).mu || (*a).nu!=(*b).nu)
{ cprintf("0\n");
cprintf("the column do not match!\n");
return ERROR;
}
(*c).mu=(*a).mu;
(*c).nu=(*a).nu;
while( l<=(*a).tu && m<=(*b).tu)
{
if( (*a).data[l].i<(*b).data[m].i)
{
(*c).data[n].i=(*a).data[l].i;
(*c).data[n].j=(*a).data[l].j;
(*c).data[n].v=(*a).data[l].v;
n++;
l++;
}
else if( (*a).data[l].i>(*b).data[m].i)
{
(*c).data[n].i=(*b).data[m].i;
(*c).data[n].j=(*b).data[m].j;
(*c).data[n].v=(*b).data[m].v;
n++;
m++;
}
else {
if( (*a).data[l].j<(*b).data[m].j )
{
(*c).data[n].i=(*a).data[l].i;
(*c).data[n].j=(*a).data[l].j;
(*c).data[n].v=(*a).data[l].v;
n++;
l++;
}
else if( (*a).data[l].j>(*b).data[m].j )
{
(*c).data[n].i=(*b).data[m].i;
(*c).data[n].j=(*b).data[m].j;
(*c).data[n].v=(*b).data[m].v;
n++;
m++;
}
else {
(*c).data[n].i=(*a).data[l].i;
(*c).data[n].j=(*a).data[l].j;
(*c).data[n].v=(*a).data[l].v
+(*b).data[m].v;
n++;
l++;
m++;
}
}
}
for(j=l;j<(*a).tu;j++)
{
(*c).data[n].i=(*a).data[l].i;
(*c).data[n].j=(*a).data[l].j;
(*c).data[n].v=(*a).data[l].v;
n++;
l++;
}
for(j=m;j<=(*b).tu;j++)
{
(*c).data[n].i=(*b).data[m].i;
(*c).data[n].j=(*b).data[m].j;
(*c).data[n].v=(*b).data[m].v;
n++;
m++;
}
(*c).tu=n;
print(c);
}
//矩阵减运算
int surplus(matrix *a,matrix *b,matrix *c)
{
int l=1;
int m=1;
int n=1;
int j;
if( (*a).mu!=(*b).mu || (*a).nu!=(*b).nu)
{ cprintf("0\n");
cprintf("the column do not match!\n");
return ERROR;
}
(*c).mu=(*a).mu;
(*c).nu=(*a).nu;
while( l<=(*a).tu && m<=(*b).tu)
{
if( (*a).data[l].i<(*b).data[m].i)
{
(*c).data[n].i=(*a).data[l].i;
(*c).data[n].j=(*a).data[l].j;
(*c).data[n].v=(*a).data[l].v;
n++;
l++;
}
else if( (*a).data[l].i>(*b).data[m].i)
{
(*c).data[n].i=(*b).data[m].i;
(*c).data[n].j=(*b).data[m].j;
(*c).data[n].v=-(*b).data[m].v;
n++;
m++;
}
else {
if( (*a).data[l].j<(*b).data[m].j )
{
(*c).data[n].i=(*a).data[l].i;
(*c).data[n].j=(*a).data[l].j;
(*c).data[n].v=(*a).data[l].v;
n++;
l++;
}
else if( (*a).data[l].j>(*b).data[m].j )
{
(*c).data[n].i=(*b).data[m].i;
(*c).data[n].j=(*b).data[m].j;
(*c).data[n].v=-(*b).data[m].v;
n++;
m++;
}
else {
(*c).data[n].i=(*a).data[l].i;
(*c).data[n].j=(*a).data[l].j;
(*c).data[n].v=(*a).data[l].v
-(*b).data[m].v;
n++;
l++;
m++;
}
}
}
for(j=l;j<(*a).tu;j++)
{
(*c).data[n].i=(*a).data[l].i;
(*c).data[n].j=(*a).data[l].j;
(*c).data[n].v=(*a).data[l].v;
n++;
l++;
}
for(j=m;j<=(*b).tu;j++)
{
(*c).data[n].i=(*b).data[m].i;
(*c).data[n].j=(*b).data[m].j;
(*c).data[n].v=-(*b).data[m].v;
n++;
m++;
}
(*c).tu=n;
print(c);
}
//矩阵乘
void *mult(pmatrix *m,pmatrix *n,pmatrix *q)
{int brow;
int arow,tp;
int a,p,l,t;
int ccol;
int cur=0;
int ctemp[100];
if ((*m).nu!=(*n).mu){ printf("0\n");printf("error!");return ERROR;}
q->mu=m->mu;(*q).nu=(*n).nu;(*q).tu=0;
if((*m).tu*(*n).tu!=0){
for (arow=1;arow<=(*m).mu;++arow){
for (a=1;a<=q->nu;++a)
ctemp[a]=0;
q->rpos[arow]=q->tu+1;
if(arow<m->mu) tp=m->rpos[arow+1] ;
else{(tp=m->tu+1); }
for (p=(*m).rpos[arow];p<tp;++p)
{
brow=(*m).data[p].j;
if(brow<n->mu) t=n->rpos[brow+1];
else{t=n->tu+1;}
for (l=(*n).rpos[brow];l<t;++l)
{
ccol=(*n).data[l].j;
ctemp[ccol]+=(*m).data[p].v*(*n).data[l].v;
}
}
for (ccol=1;ccol<=(*q).nu;++ccol)
if(ctemp[ccol])
{
if(++(q->tu)>maxsize) return ERROR;
(*q).data[q->tu].i=arow;
(*q).data[q->tu].j=ccol;
(*q).data[q->tu].v=ctemp[ccol];
}
}
}
print(q);
}
//矩阵转置运算
void *transmatrix(pmatrix *a,pmatrix *b)
{
int am,bn,col;
b->nu=a->mu;
b->mu=a->nu;
b->tu=a->tu;
bn=1;
if(a->tu)
{bn=1;
for(col=1;col<=a->nu;++col)
for(am=1;am<=a->tu;++am)
{ if(a->data[am].j==col)
{ b->data[bn].i=a->data[am].j;
b->data[bn].j=a->data[am].i;
b->data[bn].v=a->data[am].v;
++bn;
}
}
}
print(b);
}
//输出
main()
{
matrix *b;
matrix *a;
matrix *c,*l;
int i;
char f;
char *buf[1*35*2];
a=(matrix*)malloc(sizeof(matrix));
b=(matrix*)malloc(sizeof(matrix));
c=(matrix*)malloc(sizeof(matrix));
l=(matrix*)malloc(sizeof(matrix));
window(1,1,80,25);
textbackground(LIGHTMAGENTA);
textcolor(14+128);
clrscr();
gotoxy(19,2);
cprintf("**** welcome to our programme! ****");cprintf("\n");
textcolor(6);
gotoxy(1,3);
for(i=1;i<=80;i++)
{gotoxy(i,3);putch(0xcd);
gotoxy(i,24);putch(0xcd);}
for(i=1;i<=25;i++)
{gotoxy(2,i);putch(0xba);
gotoxy(79,i);putch(0xba);
}
window(4,4,70,20);
textbackground(LIGHTMAGENTA);
/*clrscr();*/
textcolor(0);
gotoxy(9,2);
printf("add: surplus: multply: transmatrix: \n");
gotoxy(13,2);
cprintf("'+'");
gotoxy(26,2);
cprintf("'-'");
gotoxy(40,2);
cprintf("'*'");
gotoxy(58,2);
cprintf("'t'");
gotoxy(4,5);
cprintf("please input the first matrix \n");
input(a);
clrscr();
gotoxy(4,5);
cprintf("please input the second matrix\n");
input(b);
while(1)
{
cprintf(" please input the wanted operation:");
fflush(stdin);
f=getchar();
switch(f){
case'+':add(a,b,c);break;
case'-':surplus(a,b,c);break;
case'*':mult(a,b,c);break;
case't':/*cprintf("please choose which one do you want to transmatrix:");
scanf("%c",&n);
if(n==a){c=transmatrix(a);print(c);break;}
else if(n==b){c=transmatrix(b);print(c);break;}
else cprintf("error input!");*/
transmatrix(a,c);break;
default: printf("error input,please input again!\n");break;
cprintf("please input the first matrix \n");
input(a);
clrscr();
gotoxy(4,5);
cprintf("please input the second matrix\n");
input(b);
}
}
getch();
free(a);
free(b);
free(c) ;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -