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

📄 myheader.cpp

📁 矩阵运算器
💻 CPP
字号:
#include"Myheader.h"
#include<string.h>
#include<iostream.h>
//////////////////////////////////////////////////////////////////
void RankUp(int a[],int  n)
{
	for(int i=0;i<n;i++)
	    for(int j=0;j<n-1;j++)
		{
			int b=a[j];
			if(b>=a[j+1])
			{
				a[j]=a[j+1];
				a[j+1]=b;
			}
		}
}

void RankUp(float a[],float const n)
{
	for(int i=0;i<n;i++)
	    for(int j=0;j<n-1;j++)
		{
			float b=a[j];
			if(b>=a[j+1])
			{
				a[j]=a[j+1];
				a[j+1]=b;
			}
		}
}

void RankUp(double a[],int const n)
{
	for(int i=0;i<n;i++)
	    for(int j=0;j<n-1;j++)
		{
			double b=a[j];
			if(b>=a[j+1])
			{
				a[j]=a[j+1];
				a[j+1]=b;
			}
		}
}

////////

void RankDown(int a[],int  n)
{
	for(int i=0;i<n;i++)
		for(int j=0;j<n-1;j++)
		{
			int b=a[j];
			if(b<=a[j+1])
			{
				a[j]=a[j+1];
				a[j+1]=b;
			}
		}
}
void RankDown(double a[],int  n)
{
	for(int i=0;i<n;i++)
		for(int j=0;j<n-1;j++)
		{
			double b=a[j];
			if(b<=a[j+1])
			{
				a[j]=a[j+1];
				a[j+1]=b;
			}
		}
}
void RankDown(float a[],int  n)
{
	for(int i=0;i<n;i++)
		for(int j=0;j<n-1;j++)
		{
			float b=a[j];
			if(b<=a[j+1])
			{
				a[j]=a[j+1];
				a[j+1]=b;
			}
		}
}
////////

int RankMax(int a[],int  n)
{
	int i=0;
	int b=a[0];
		
	for(int j=0;j<n-1;j++)
	{
		int c=a[j+1];
		if(b<=c)
		{
			i=j+1;
		    b=a[j+1];
		}
	}
	return i;
}
int RankMax(float a[],int  n)
{
	int i=0;
	float b=a[0];
		
	for(int j=0;j<n-1;j++)
	{
		float c=a[j+1];
		if(b<=c)
		{
			i=j+1;
		    b=a[j+1];
		}
	}
	return i;
}
int RankMax(double a[],int  n)
{
	int i=0;
	double b=a[0];
		
	for(int j=0;j<n-1;j++)
	{
		double c=a[j+1];
		if(b<=c)
		{
			i=j+1;
		    b=a[j+1];
		}
	}
	return i;
}
////////

int RankMin(int a[],int  n)
{
	int i=0;
	int b=a[0];
	for(int j=0;j<n-1;j++)
	{   
		int c=a[j+1];
		if(b>=c)
		{
			i=j+1;
		    b=a[j+1];
		}
	}
	return i;
}
int RankMin(float a[],int  n)
{
	int i=0;
	float b=a[0];
	for(int j=0;j<n-1;j++)
	{   
		float c=a[j+1];
		if(b>=c)
		{
			i=j+1;
		    b=a[j+1];
		}
	}
	return i;
}
int RankMin(double a[],int  n)
{
	int i=0;
	double b=a[0];
	for(int j=0;j<n-1;j++)
	{   
		double c=a[j+1];
		if(b>=c)
		{
			i=j+1;
		    b=a[j+1];
		}
	}
	return i;
}
/////////////////////////////////////////////////////
char *StrToCap(char *string)
{
	  char *t=string;
	  while(*t)
	  {
	  if('a'<=*t&&*t<='z')
		    (*t)-=32;
	  t++;
	  }
	  return string;
}
char *StrToLow(char *string)
{
	  char *t=string;
	  while(*t)
	  {
	  if('A'<=*t&&*t<='Z')
		    (*t)+=32;
	  t++;
	  }
	  return string;
}
char *StrCat(char *strBeCat,char *strcat)
{
	  
	  char *p=strBeCat,*t=strcat;
	  while(*p)
	  {p++;}
	  while(*t)
	  {
		    *p=*t;
		    t++;
		    p++;
                
	  }
	  *p=*t;
	  return strBeCat;
}
void CopyStr(char *&copy,char *copied)
{
	  copy=copied;
}
int StrLength(char *string)
{
        char *t=string;
	  int count=0;
	  do {
		    t++;count++;}while(*t);
        return count;
}
char *SortStrUp(char *string)
{
	  char *p,*t;
	  p=t=string;
	  while(*p)
	  {
		    
		    while(*t)
		    {
				char c=*p;
				if(*t<*p)
				{*p=*t;*t=c;}
				t++;
		    }
		    p++;
		    t=p;
	  }
	  return string;
}
char  *SortStrDown(char *string)
{
	  char *p,*t;
	  p=t=string;
	  while(*p)
	  {
		    
		    while(*t)
		    {
				char c=*p;
				if(*t>*p)
				{*p=*t;*t=c;}
				t++;
		    }
		    p++;
		    t=p;
	  }
	  return string;
}
///该算法比其他的算法效率要高
int SubStrLoc(char *mainstring,char *substring)
{ 
	  int i=1;
	  char *P=mainstring,*t=substring;
        while(*P&&*t)
	  {
		    if(*P==*t)
		    {t++;P++;}
		    else {t=substring;P++;}
		    //如果t不匹配
		    //t 重新赋值
		    i++;
		    if(!*t)
		    return
		    i-StrLength(substring);
		    
	  }
	  return -1;
		    
}

void StrLocDel(char *mainstring,int location,int length)
{
	  char *p=mainstring,*t=mainstring;
	  int l=location,le=length,i=1;
	  if(StrLength(mainstring)<l+le)
	  {
		    cout<<"Error!"<<endl;return ;
	  }
	  else
	  {
		    while(i<l+le)
		    {
				t++;i++;
		    }//此时t指向l+le+1
		    i=1;
		    while(i<l)
		    {
				p++;i++;
		    }//此时p指向l,i=l;
		    i=1;
		    while(*t)
		    {
				*p=*t;
				p++,t++;
				
		    }
		    while(i<=StrLength(mainstring)-l-le)
		    {*p='\0';
		    p++;i++;}
		    
	  }
}
char* StrLocIns(char *mainstring,int location, int substringlength,char *substring)
{
	  char *p=mainstring,*s=substring;
	  int l=location,le=substringlength,i=1;
	  if(StrLength(mainstring)<l+le)
	  {
		    cout<<"Error!"<<endl;return NULL ;
	  }
	  else
	  {
		    
		    char *h=new char[le+1];
		    while(i<l)
		    {
				p++;i++;
		    }//此时p指向l,i=l;
		    i=1;
		    while(i<=le)
		    {
				h[i-1]=*p;
				*p=*s;i++;p++;s++;}
		    h[le]='\0';
		    char *c=h;
		    return c;
	  }
}

int StrCompare(char *str1,char *str2)
{
	  char *s1=str1,*s2=str2;
	  do
	  {
		    if(*s1>*s2)
				return 1;
		    else if(*s1<*s2)
				return -1;
		    else 
		    {s1++;
		    s2++;}
		    
		    
	  }while(*str1&&*str2);
	  return 0;
}



////////////////////////////////////////////////////////

/////////类CMatrix
 void CMatrix::Initial ()
{
        
	  cout<<"请输入一个 "<<m<<"X"<<n<<" 矩阵:"<<endl;
	  for(int i=0;i<m;i++)
		    for(int j=0;j<n;j++)
				cin>>a[i][j];
}//end Initial
 void CMatrix::Initial (CMatrix &mat)
 {
        
	  //cout<<"正从另一个矩阵中读得 "<<m<<"X"<<n<<" 数据..."<<endl;
	  if(m>mat.m||n>mat.n)
		    cout<<"读取失败!"<<endl;
	  else
	  for(int i=0;i<m;i++)
		    for(int j=0;j<n;j++)
				a[i][j]=mat.a[i][j];
 }//end Initial
 
 
 //
 void CMatrix::Minusrow (int row1,int row2,DERECT beishu)
 {
	   for(int i=0;i<n;i++)
	   {
	   a[row1-1][i]-=beishu*a[row2-1][i];
	   }

 }//end Minusrow
 void CMatrix::Minuscol( int col1,int col2,DERECT beishu)
 {

	   for(int i=0;i<m;i++)
	   {
         a[i][col1-1]-=beishu*a[i][col2-1];
	   }
		     
	  
 }//end Minuscol

 void CMatrix::Plusrow (int row1,int row2,DERECT beishu)
 {
	   for(int i=0;i<n;i++)
	   {
		     a[row1-1][i]+=beishu*a[row2-1][i];
	   }
	   
 }//end Plusrow

 void CMatrix::Pluscol( int col1,int col2,DERECT beishu)
 {
	   
	   for(int i=0;i<m;i++)
	   {
		     a[i][col1-1]+=beishu*a[i][col2-1];
	   }
	   
	   
 }//end Pluscol
 void CMatrix::Mulrowself(int row,DERECT beishu)
 {
	   for(int i=0;i<n;i++)
		     a[row-1][i]*=beishu;
 
 }//end 行自乘
 void CMatrix::Mulcolself(int col,DERECT beishu)
 {
	   for(int i=0;i<m;i++)
		     a[i][col-1]*=beishu;
	   
 }//end 列自乘
 void CMatrix::Divrowself(int row,DERECT beishu)
 {
	   for(int i=0;i<n;i++)
		     a[row-1][i]/=beishu;
	   
 }//end 行自除
 void CMatrix::Divcolself(int col,DERECT beishu)
 {
	   for(int i=0;i<m;i++)
		     a[i][col-1]/=beishu;
	   
 }//end 列自除
 
 CMatrix operator+(CMatrix &mat1,CMatrix &mat2)
 {
	   CMatrix temp(mat2.m,mat2.n);
	   if(mat1.m!=mat2.m||mat1.n!=mat2.n)
	   { cout<<"两矩阵相加行列要相等"<<endl;
	   return NULL;}
         else
	   {
		for(int i=0;i<mat2.m;i++)
		for(int j=0;j<mat2.n;j++)
		{
			  temp.a[i][j]=mat1.a[i][j]+mat2.a[i][j];
		}
	   }
	   return temp;
 }//end operator +
 CMatrix operator-(CMatrix &mat1,CMatrix &mat2)
 {
	   CMatrix temp(mat1.m,mat1.n);
	   if(mat1.m!=mat2.m||mat1.n!=mat2.n)
	   { cout<<"两矩阵相减行列要相等"<<endl;
	   return NULL;}
         else
	   {
		     for(int i=0;i<mat2.m;i++)
				 for(int j=0;j<mat2.n;j++)
				 {
					   temp.a[i][j]=mat1.a[i][j]-mat2.a[i][j];
				 }
	   }
	   return temp;
 }//end operator -

 void CMatrix::operator=(CMatrix mat)
 {
	   if(m!=mat.m||n!=mat.n)
	   {cout<<"同型的行列式才能赋值"<<endl;
	   return ;
	   }
	   else
	   for(int i=0;i<m;i++)
	   {
		     for(int j=0;j<n;j++)
				 a[i][j]=mat.a[i][j];
	   }
	   
 }//end operator =

void CMatrix::Display ()
{
	  for(int i=0;i<m;i++)
	  {for(int j=0;j<n;j++)
				cout<<a[i][j]<<" ";
	  cout<<endl;
	  }
}//end display
ostream& operator <<(ostream &out,CMatrix &b)
{
	  for(int i=0;i<b.m;i++)
	  { for(int j=0;j<b.n;j++)
	  {out.width (6);
	  out<<b.a[i][j]<<" ";}
	  cout<<endl;
				
	  }
       return out;
}
istream& operator >>(istream &ios,CMatrix &b)
{
	  cout<<"请输入一个 "<<b.m<<"X"<<b.n<<" 矩阵:"<<endl;
	  for(int i=0;i<b.m;i++)
	  { for(int j=0;j<b.n;j++)
	  
	  ios>>b.a[i][j];
	  
	  }
	  return ios;
}//end cin


DERECT CMatrix:: Derect(CMatrix b,int count)
{
      int nn=0;
	DERECT bottom=Bot(b);
	
      CMatrix p(b.m,b.n);
      p=b;
	for(int j=1;j<p.m;j++)
	{
		  if(bottom==0)
		  {p.Exchangerow (p.m,j);bottom=Bot(p);nn++;
		  }
	else break;
	}
      if(bottom==0)return 0;
      if(count==1)
		  return bottom;
	
	else
	{

	CMatrix q(b.m-1,b.n-1);
	
      
	p.Divrowself (p.m,bottom);//last /
	for(int i=1;i<p.m;i++)
	{
		  p.Minusrow (i,p.m,p.a[i-1][p.n-1]);
	}

	
	
	q.Initial (p);
      
	
     return Mici(-1,nn)*bottom*Derect(q,count-1);
	}
}//end Derect


DERECT D(CMatrix b,int jieshu)
{
	  DERECT de=b.Derect (b,jieshu);
	  if(0<de&&de<0.000001)
		    return 0;
	  else if(de<0&&de>-0.000001)
		    return 0;
	  else return de;
}


void CMatrix ::Exchangerow(int row1,int row2)
{
	  for(int i=0;i<n;i++)
	  { 
		    DERECT temp=a[row1-1][i];
	          a[row1-1][i]=a[row2-1][i];
		    a[row2-1][i]=temp;
	  }
}
void CMatrix ::Exchangecol(int col1,int col2)
{
	  for(int i=0;i<m;i++)
	  {
		    DERECT temp=a[i][col1-1];
		    a[i][col1-1]=a[i][col2-1];
		    a[i][col2-1]=temp;
		    
	  }
}

CMatrix operator*(CMatrix mat1,CMatrix mat2)
{
	  if(mat1.n!=mat2.m)
	  {
		    cout<<"Error!前一个的列数应等于后一的行数."<<endl;
	  return NULL;
	  }
	  else
	  {
		    CMatrix mat(mat1.m,mat2.n);
		    for(int g=0;g<mat1.m;g++)
			for(int k=0;k<mat2.n;k++)
			{
				  DERECT temp=0;
				  for(int i=0;i<mat1.n;i++)
					    temp=temp+mat1.a[g][i]*mat2.a[i][k];
				  mat.a[g][k]=temp;
                }return mat;
	  }
}

CMatrix Tansform(CMatrix mat)
{
	  CMatrix m(mat.n,mat.m);
	  for(int i=0;i<mat.m;i++)
		    for(int j=0;j<mat.n;j++)
				m.a[j][i]=mat.a[i][j];
		    return m;
}

CMatrix operator*(DERECT c,CMatrix mat)
{
	  CMatrix C(mat.m,mat.n);
	  C=mat;
	  for(int i=0;i<mat.m;i++)
		    C.Mulrowself (i+1,c);
	  return C;
}

CMatrix Locmatrix(CMatrix mat,int row ,int col)
{
	  CMatrix M(mat.m,mat.n);M=mat;
        CMatrix M2(mat.m-1,mat.n-1);
	  for(int i=1;i<=(M.m-row);i++)
	  M.Exchangerow (row+i-1,row+i);
	  for(int j=1;j<=(M.n-col);j++)
	  M.Exchangecol (col+j-1,col+j);
	  M2.Initial (M);
	  M2.Divrowself (1,Mici(-1,row+col));
	  return M2;
	  
}
CMatrix Conmatrix(CMatrix mat)
{
       CMatrix M(mat.m,mat.n);
	 if(mat.m==1)
		   M.a[0][0]=1;
	 else
	 for(int i=0;i<mat.m;i++)
		   for(int j=0;j<mat.n;j++)
			     M.a[i][j]=D(Locmatrix (mat,i+1,j+1),mat.m-1);
	 return Tansform (M);
}

CMatrix Nimatrix(CMatrix mat)
{
	  DERECT X;CMatrix M(mat.m,mat.n);
	  X=D(mat,mat.m);
	  if(X==0)
        {cout<<"该矩阵的逆矩阵不存在"<<endl;return NULL;}
	  else
	  {
		    M=Conmatrix (mat);
		    if(mat.m==1)
		    {M.a[0][0]=1/mat.a[0][0];return M;}
		    else
		    return 1/X*M;
	  }
	  //return M;
	  
}
 bool operator==(CMatrix &mat1,CMatrix &mat2) 
{
    if(mat1.m!=mat2.m||mat1.n!=mat2.n)
		return false;
    for(int i=0;i<mat1.m;i++)
		for(int j=0;j<mat1.n;j++)
			  if(mat1.a[i][j]!=mat2.a[i][j])
				    return false;
    return true;
}
CMatrix Micimatrix(CMatrix mat,int k)
{
	  CMatrix t(mat.m,mat.n);
	  t=mat;
	  if(k==1)
	  t=mat;
	  else t=mat*Micimatrix (mat,k-1);
	  return t;


}
CMatrix Elementmatrix(int k)
{
	  CMatrix t(k,k);
	  for(int i=0;i<k;i++)
		    for(int j=0;j<k;j++)
				if(i==j)
					  t.a[i][j]=1;
				else
				t.a[i][j]=0;
	return t;
}
/////////////////////////////////////endl CMatrix


//////////////////////////////////////////////////////////////////////////////
int random(int range)
{
	  int a=rand();
	  return a%range;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -