⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 functions.h

📁 关于行列式的计算.可以完成矩阵的有关计算
💻 H
📖 第 1 页 / 共 2 页
字号:
#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 + -