📄 functions.h
字号:
#include"Head.h"
int n;//n 为排列元素个数,Counter为逆序数个数
char *p=NULL;
float Rangers[20][20],SaveAij[20],Sum=1;//Rangers[20][20]为存放行列式元素的数组,
//Sum为行列式的值;SaveAij[20]为保存数组
int m;//m为行列式阶数,
/////////////////////////////////////////////////////////////////////////以下对排列进行操作
void Build_Arragers()//新建排列
{
int m=1,k=1;
cout<<"请输入排列的元素个数N:\n";
cin>>n;
while(1)
{
cout<<"请输入1—"<<n<<"这几个数够成的一个排列!(数字之间用空格隔开,输入结束后按“回车键”)\n";
if(p!=NULL)
{
delete []p;
}
p=new char[n];
for(int i=0;i<n;i++)
{
cin>>p[i];
if(i==(n-1))
break;
}
for( i=0;i<n;i++)
{
if(p[i]<=48||p[i]>(n+48))
{
m=0;
break;
}
else
m=1;
for(int j=i+1;j<n;j++)
{
if(p[i]==p[j])
{
k=0;
break;
}
else
k=1;
}
if(m==0||k==0)
break;
}
if(m==0||k==0)
{
cout<<"友情提示:你的输入的排列非法!请重试。"
<<"\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n";
}
if(m==1&&k==1)
{
cout<<"你输入的";
Show_Functions();
break;
}
}
}
int Opp_Arragers()//求排列的逆序数
{
int Counter=0;
cout<<"逆序数对分别是:";
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
if(p[i]>p[j])
{
Counter++;
if((Counter-1)%5==0)
{
cout<<"\n"<<"\t"<<p[i]<<p[j]<<"\t";;
}
else
cout<<"\t"<<p[i]<<p[j]<<"\t";
}
}
}
if(Counter==0)cout<<"无"<<endl;
if(Counter%2==0)
{
cout<<"\n你输入的排列为偶排列,其逆序数为: "<<Counter<<endl;
}
if(Counter%2==1)
{
cout<<"\n你输入的排列为奇排列,其逆序数为: "<<Counter<<"\n";
}
cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
return Counter;
}
void Show_Functions()//show functions
{
cout<<"要显示的排列为:"<<endl<<"\t\t";
for(int i=0;i<n;i++)
{
cout<<p[i]<<"\t";
if(i==n)
break;
}
cout<<"\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
}
void Change1_Arrangers()//相邻对换
{
int No1;
cout<<"请输入一个数字作为要对换的位置:"<<endl;
cin>>No1;
cout<<"\n";
if(No1>0||No1<=n)
{
if(No1==1)
{
int Temp;
Temp=p[0];
p[0]=p[1];
p[1]=Temp;
cout<<"相邻对换后";
Show_Functions();
}
if(No1==n)
{
int Temp;
Temp=p[n-2];
p[n-2]=p[n-1];
p[n-1]=Temp;
cout<<"相邻对换后";
Show_Functions();
}
if(No1>1&&No1<n)
{
int Temp,*T=NULL;
if(T!=NULL)
{
delete[]T;
}
T=new int[n];
for(int i=0;i<n;i++)
{
T[i]=p[i];
}
Temp=p[No1-2];
p[No1-2]=p[No1-1];
p[No1-1]=Temp;
cout<<"前相邻对换后";
Show_Functions();
for(i=0;i<n;i++)
{
p[i]=T[i];
}
Temp=p[No1-1];
p[No1-1]=p[No1];
p[No1]=Temp;
cout<<"后相邻对换后";
Show_Functions();
}
}
else
{
cout<<"友情提示:你的输入非法!请输入1--"<<n<<"之间的一个整数"
<<"\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
}
}
void Change2_Arrangers()//非相邻对换
{
int No1,No2;
cout<<"请你输入两个数字作为要非相邻对换的位置:(输入的数字之间用“空格”格开,输入结束后按“回车键”)"<<endl;
cin>>No1>>No2;
if((No1>=1)&&(No2>=1)&&(No1<=n)&&(No2<=n)&&(No1!=No2)&&(No1!=No2-1)&&(No2!=No1-1))
{
int Temp;
Temp=p[No1-1];
p[No1-1]=p[No2-1];
p[No2-1]=Temp;
cout<<"非相邻对换后";
Show_Functions();
}
if((No1-No2==1)||(No2-No1==1))
{
cout<<"你输入的数字非法!你输入的数不能相邻!"
<<"\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
}
if((No1<0)||(No2<0)||(No1>n)||(No2>n))
{
cout<<"你输入的数字非法!(输入的数字必须是大于0小于或等于"<<n<<"的整数)"
<<"\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
}
}
//////////////////////////////////////////////////////////以下对行列式进行操作
void Build_Ranges()//新建行列式
{
int i,j,k=0;
cout<<"请输入行列式的阶数M:"<<endl;
cin>>m;
cout<<"请输入"<<m<<"*"<<m<<"="<<m*m<<"个数做为行列式的各个元素(数字之间用空格隔开,输入结束后按“回车键”)"<<endl;
for(i=0;i<m;i++)//input
{
for(j=0;j<m;j++)
{
cin>>Rangers[i][j];
if((i==m)&&(j==m))
break;
}
}
cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"
<<"\n你要建立的行列式为:\n";//output
Output_Rangers();
cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
}
void Show_Ranges()//显示行列式
{
cout<<"要显示的行列式是:"<<endl;
Output_Rangers();
cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
}
void Union_TranAndDetach()//行列式转置和行列式分拆公用的函数体
{
for(int i=0;i<m;i++)
{
cout<<"\t\t|";
for(int j=0;j<m;j++)
{
if(j==m-1)
cout<<Rangers[j][i];
else
cout<<Rangers[j][i]<<"\t";
}
cout<<"|"<<"\n";
}
}
void Tran_Ranges()//行列式转置
{
float Temp;
for(int i=0;i<m;i++)
{
for(int j=0;j<m;j++)
{
Temp=Rangers[i][j];
Rangers[i][j]=Rangers[j][i];
Rangers[j][i]=Temp;
}
}
cout<<"转置后行列式为:\n";
Union_TranAndDetach();//行列式转置和行列式分拆公用的函数
for(i=0;i<m;i++)
{
for(int j=0;j<m;j++)
{
Rangers[j][i]=Rangers[i][j];
}
}
cout<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
}
////////////////////////////////////////
void AlgebraSon_Rangers()//代数余子式
{
int No1,No2,Temp;
cout<<"请你分别输入代数余子式Aij中的行i和列j:(输入数字之间用“空格”格开,输入结束后按“回车键”)"<<endl;
cin>>No1>>No2;
if(No1>No2)
{
Temp=No1;
No1=No2;
No2=Temp;
}
if((No1>0)&&(No1<=m)&&(No2>0)&&(No2<=m))
{
for(int i=No1-1;i<m;i++)
{
for(int j=0;j<m;j++)
{
Rangers[i][j]=Rangers[i+1][j];
}
}
for(int k=0;k<m-1;k++)
{
for(int j=No2-1;j<m;j++)
{
Rangers[k][j]=Rangers[k][j+1];
}
}
cout<<"变化成代数余子式后";
m=m-1;
if((No1+No2)%2==0)
{
Show_Ranges();
for(int j=0;j<m;j++)
{
SaveAij[j]=Rangers[0][j];
}
}
if((No1+No2)%2==1)
{
for(int i=0;i<m;i++)
{
Rangers[No1-1][i]=-Rangers[No1-1][i];
}
Show_Ranges();
for(int j=0;j<m;j++)
{
SaveAij[j]=Rangers[0][j];
}
}
}
else
cout<<"友情提示:你的输入非法!请输入1--"<<m<<"之间的两个整数"
<<"\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
}
void Son_Rangers()//余子式
{
int No1,No2;
cout<<"请你分别输入余子式Mij中的行i和列j:(输入数字之间用“空格”格开,输入结束后按“回车键”)"<<endl;
cin>>No1>>No2;
if((No1>0)&&(No1<=m)&&(No2>0)&&(No2<=m))
{
for(int i=No1-1;i<m;i++)
{
for(int j=0;j<m;j++)
{
Rangers[i][j]=Rangers[i+1][j];
}
}
for(int k=0;k<m-1;k++)
{
for(int j=No2-1;j<m;j++)
{
Rangers[k][j]=Rangers[k][j+1];
}
}
cout<<"变化成余子式后";
m=m-1;
Show_Ranges();
}
else
cout<<"友情提示:你的输入非法!请输入1--"<<m<<"之间的两个整数"
<<"\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
}
void Show_Accunt_Rangers()//显示计算的结果
{
Accunt_Rangers();
cout<<"行列式的值为:\n"<<"\t\tD="<<Sum<<"\n"
<<"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"<<endl;
}
void Accunt_Rangers()//行列式计算
{
Trigon_Rangers();
Sum=1;
for(int i=0;i<m;i++)
{
Sum=Rangers[i][i]*Sum;
}
}
void Trigon_Rangers()//化为上三角
{
int i=0,b=0,j=0;
float k=0,t;
for(int e=0;e<m;e++)
{
for(int f=0;f<m;f++)
{
Rangers[e][f]=Rangers[e][f];
}
}
while(1)
{
j=b;
if(i>j)
{
if(Rangers[b][b]==0)
{
for(int h=0;h<m;h++)
{
t=Rangers[h][b];
Rangers[h][b]=Rangers[h][b+1];
Rangers[h][b+1]=t;
}
}
k=(-Rangers[i][b])/(Rangers[b][b]);
for(int y=b;y<m;y++)
{
Rangers[i][y]=Rangers[i][y]+Rangers[b][y]*k;
}
}
i++;
if(i==m)
{ b++;
i=b;
if(i==m)
{
break;
}
}
}
}
void Show_Trigon_Rangers()//显示化为的上三角
{
Trigon_Rangers();
cout<<"化为上三角后";
Show_Ranges();
}
void KLM_Rangers()//克拉默法则
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -