📄 jzcj.c
字号:
key=bioskey(0);/*接收按键*/
gotoxy(79,1);
switch(key)
{
case ESC:/*退出循环*/
puttext(1,1,80,25,save);/*恢复打开菜单前的样子*/
flag=0;
break;
case LEFT:/*移到左边的选项*/
puttext(1,1,80,25,save);/*恢复打开菜单前的样子*/
if(n==0)/*往左移动越界的话移到最后一个选项*/
DrawMl(2);
else
DrawMl(n-1);
flag=0;
break;
case RIGHT:/*移动右边的选项*/
puttext(1,1,80,25,save);/*恢复打开菜单前的样子*/
if(n==2)/*往右移动越界的话移到第一个选项*/
DrawMl(0);
else
DrawMl(n+1);
flag=0;
break;
case UP:/*具体选项往上移动*/
WriteText(n,x,ml[n].str[x-3]);/*输出红色字体*/
if(x==3)/*移到最上面再按上键,就移到最下面*/
x=3+ml[n].n-1;
else
x--;/*移动到新的要显示的内容*/
BlackText(n,x,ml[n].str[x-3]);/*输出黑色字体*/
flag=1;
break;
case DOWN:/*具体选项往下移动*/
WriteText(n,x,ml[n].str[x-3]);
if(x==(3+ml[n].n-1))/*移动到最底下再按下键就移到最上面*/
x=3;
else
x++;/*移动到新的要显示的内容*/
BlackText(n,x,ml[n].str[x-3]);
flag=1;
break;
case ENTER:
puttext(1,1,80,25,save);/*恢复打开菜单前的样子*/
Enter(n,x-3);/*菜单选项的具体功能*/
flag=0;
break;
}
gotoxy(79,1);
}
}
/*菜单选项的具体功能*/
void Enter(int m,int n)
{
switch(m)
{
case 0:switch(n) /*选择了编辑菜单选项*/
{
case 0:ClrScr();break;/*调用输入函数*/
case 1:exit(0);break;/*退出系统*/
}break;
case 1: switch(n) /*选择了查询菜单选项*/
{
case 0:display();break;/*调用转置函数*/
case 1:displaycj();break;/*调用矩阵乘积函数*/
}break;
case 2:switch(n) /*选择了帮助菜单选项*/
{
case 0:about();break;
}
}/*结束外switch*/
}
float comput_D(float *p,short int n)
{
short int i,j,m;
short int lop=0;
float result=0;
float mid=1;
if (n!=1)
{
lop=(n==2)?1:n; /*控制求和循环次数,若为2阶,则循环1次,否则为n次*/
for(m=0;m<lop;m++)
{
mid=1; /*顺序求和*/
for(i=0,j=m;i<n;i++,j++)
mid = mid * ( *(p+i*n+j%n) );
result+=mid;
}
for(m=0;m<lop;m++)
{
mid=1; /*逆序相减*/
for(i=0,j=n-1-m+n; i<n; i++,j--)
mid=mid * ( *(p+i*n+j%n));
result-=mid;
}
}
else result=*p;
return(result);
}
float Creat_M(float *p, short int m,short int n,short int k)
{
short int len;
short int i,j;
float mid_result=0;
short int quo=1;
float *p_creat,*p_mid;
len=(k-1)*(k-1);
p_creat = (float *)calloc(len, sizeof(float));
p_mid=p_creat;
for(i=0;i<k;i++)
for(j=0;j<k;j++)
{
if (i!=m && j!=n)
*p_mid++ =* (p+i*k+j);
}
quo = (m + n) %2==0 ? 1:-1;
mid_result = (float ) quo * comput_D(p_creat,k-1);
free(p_creat);
return(mid_result);
}
void Print( float *p,short int n)
{
int i,j;
for (i=0;i<n;i++)
{
for (j=0; j<n;j++)
printf("%10G ",*p++);
printf("\n");
}
}
void display()
{ float *buffer,*p; /*定义数组首地址指针变量*/
short int row,num; /*定义矩阵行数row及矩阵元素个数*/
short int i,j;
float determ; /*定义矩阵的行列式*/
gotoxy(3,3);
printf("请输入行数(输入元素时,元素之间请用空格分开): ");
scanf("%d",&row);
num=2 * row * row;
buffer = (float *)calloc(num, sizeof(float)); /*分配内存单元*/
p=buffer;
if(p != NULL)
{
for(i=0;i<row;i++) /*输入各单元值*/
{ gotoxy(3,4+i);
printf("第 %d 行 ",i+1);
for(j=0;j<row;j++)
{
scanf("%f",p++);
}
}
}
else
printf( "Can't allocate memory\n" );
ClrScr();
printf("原距阵为:\n");
Print(buffer,row);
determ=comput_D(buffer,row); /*求整个矩阵的行列式*/
p=buffer + row * row;
if (determ != 0)
{
for (i=0;i<row; i++) /*求逆矩阵*/
for (j=0; j<row; j++)
*(p+j*row+i)= Creat_M(buffer,i,j,row)/determ;
gotoxy(2,4+row);
printf("距阵的值: %G\n",determ);
p=buffer + row * row;
gotoxy(2,4+row+1);
printf("逆距阵为:\n");
Print(p,row); /*打印该矩阵*/
}
else
printf("距阵值为0,并且无逆距阵!\n");
free( buffer );
}
void chengji(float *p,short int n)
{
int len,k;
static float *p_c;
float *pl,*p2;
len=n*n;
pl = (float *)calloc(len, sizeof(float));
p2=pl;
printf("输入矩阵A(输入元素时,元素之间请用空格分开):\n");
for(i=0;i<n;i++) /*输入各单元值*/
{ gotoxy(2,6+n+i);
printf("第 %d 行 ",i+1);
for(j=0;j<n;j++)
{
scanf("%f",pl++);
}
}
pl=p2;
p_c = (float *)calloc(len, sizeof(float));
if(p_c!=NULL)
{
for(i=0;i<n;i++)
for(j=0;j<n;j++)
{
for(k=0;k<n;k++)
*(p_c+i*n+j)+=*(p+i*n+k)*(*(pl+k*n+j));
}
}
p=p_c;
gotoxy(2,7+n+i);
printf("距阵的积为:\n");
Print(p,n); /*打印该矩阵*/
free(p_c);
free(pl);
}
void displaycj()
{ float *buffer,*p; /*定义数组首地址指针变量*/
short int row,num; /*定义矩阵行数row及矩阵元素个数*/
float determ; /*定义矩阵的行列式*/
ClrScr();
gotoxy(3,3);
printf("请输入B的行数(输入元素时,元素之间请用空格分开): ");
scanf("%d",&row);
num=2* row * row;
buffer = (float *)calloc(num, sizeof(float)); /*分配内存单元*/
p=buffer;
if(p != NULL)
{
for(i=0;i<row;i++) /*输入各单元值*/
{ gotoxy(3,4+i);
printf("第 %d 行 ",i+1);
for(j=0;j<row;j++)
{
scanf("%f",p++);
}
}
}
else
printf( "Can't allocate memory\n" );
ClrScr();
determ=comput_D(buffer,row); /*求整个矩阵的行列式*/
p=buffer + row * row;
if (determ != 0)
{
for (i=0;i<row; i++) /*求逆矩阵*/
for (j=0; j<row; j++)
*(p+j*row+i)= Creat_M(buffer,i,j,row)/determ;
p=buffer + row * row;
gotoxy(2,4);
printf("B的逆距阵为:\n");
Print(p,row); /*打印该矩阵*/
}
else
printf("距阵值为0,并且无逆距阵!\n");
p=buffer + row * row;
gotoxy(2,5+row);
chengji(p,row);
free( buffer );
}
void about()
{
ClrScr();
DrawFrame(27,10,60,12,0,7);
gotoxy(28,11);
printf("作者:郑燕琳");
gotoxy(79,1);
getch();
ClrScr();
}
void ClrScr()/*自定义清屏函数*/
{
puttext(2,3,78,23,c);/*刚开始已经用gettext把蓝色的一块地方保存下来,现在再还原*/
gotoxy(2,3);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -