数学问题—文件的读取

Jason.lai 2008-12-29 07:03:55
#include<iostream.h>
#include<fstream.h>
#include<iomanip.h>
#include<stdlib.h>
const max=20;
template<class F> //定义模板类
class CMatrix //定义矩阵类
{
private:
F *elems;
int size; //元素的最大个数
int cols; //矩阵的列数
int rows; //矩阵的行数
public:
CMatrix(){} //定义无参的构造函数
CMatrix(int x,int y) //定义关于行数与列数的构造函数
{
rows=x;
cols=y;
size=max;
elems=new F[size]; //用new运算符开辟空间存放矩阵元素
}
CMatrix<F>(CMatrix&);//声明拷贝构造函数
F operator()(int,int);//()运算符重载
friend CMatrix<int> operator+(CMatrix &,CMatrix &);//+运算符的重载
friend CMatrix<int> operator-(CMatrix &,CMatrix &);//-运算符的重载
friend CMatrix<int> operator*(CMatrix &,CMatrix &);//*运算符的重载
friend CMatrix<int> operator!(CMatrix &);//!运算符的重载
void print();//声明打印矩阵函数
void set();//设置矩阵行与列的函数
void get_from_file();//声明读文件函数
void save_to_file();//声明保存文件函数
friend void calcadd(); //声明矩阵相加的函数
friend void calcsub(); //声明矩阵相减的函数
friend void calcmult();//声明矩阵相乘的函数
friend void qiuni();//声明矩阵求逆的函数
friend void dismue();//声明菜单函数
~CMatrix()//定义析构函数
{
delete [] elems;
}
};
template<class F>
CMatrix<F>::CMatrix<F>(CMatrix<F>&a)
{
if(size<a.size) //目标矩阵的空间小于本矩阵的空间,先释放再重新分配
{
delete[] elems;
elems=new F[a.size];
size=a.size; //使两矩阵的空间相等
}
rows=a.rows; cols=a.cols; //把本矩阵的行和列赋给目标矩阵的行和列
for(int i=0;i<rows;i++)
for(int j=0;j<cols;j++)
elems[i*a.cols+j]=a.elems[i*a.cols+j];//进行元素的赋值
}
template<class F>
CMatrix<F> operator+(CMatrix<F>& a,CMatrix<F>& b)
{
CMatrix<int> c(a.rows,a.cols);//用其中一个矩阵定义结果矩阵
int m,n;
if(a.rows!=b.rows||a.cols!=b.cols)//先判断两矩阵能否相加
cout<<"此两矩阵不能相加"<<endl;
else
{
m=c.rows; n=c.cols;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
c.elems[i*n+j]=a(i,j)+b(i,j);//给结果矩阵的每一个元素进行赋值
cout<<"两矩阵相加得:"<<endl;
c.print();
}
return c;
}
//友员成员函数的定义:矩阵减法的重载
template<class F>
CMatrix<F> operator -(CMatrix<F>&a,CMatrix<F>& b)
{
CMatrix<int> c(a.rows,a.cols);//用有参的构造函数定义结果矩阵
if(a.rows!=b.rows||a.cols!=b.cols)//判断两矩阵能否相减
cout<<"此两矩阵不能相减"<<endl;
else
{
for(int i=0;i<c.rows;i++)
for(int j=0;j<c.cols;j++)
c.elems[i*c.cols+j]=a(i,j)-b(i,j);//给结果矩阵的每一个元素进行赋值
cout<<"两矩阵相减得:"<<endl;
c.print();
}
return c;
}
//友员成员函数的定义:矩阵乘法的重载
template<class F>
CMatrix<F> operator*(CMatrix<F>& a,CMatrix<F>& b)
{
CMatrix<int> c;
if(a.cols!=b.rows)//判断两矩阵能否相乘
cout<<"此两矩阵不能相乘"<<endl;
else
{
c.rows=a.rows;//结果矩阵的行数等于前一矩阵的行数
c.cols=b.cols;//结果矩阵的列数等于后一矩阵的列数
for(int i=0;i<c.rows;i++)
for(int j=0;j<c.cols;j++)
{
c.elems[i*c.cols+j]=0;
for(int k=0;k<a.cols;k++)
c.elems[i*c.cols+j]+=a(i,k)*b(k,j);//给结果矩阵的每一矩阵的元素赋值
}
cout<<"两矩阵相乘得:"<<endl;
c.print();//打印结果矩阵
}
return c;
}
//在类外定义成员函数:求矩阵的逆阵
template<class F>
CMatrix<F> operator!(CMatrix<F>& c)
{
cout<<"**************求矩阵的逆阵****************\n";
CMatrix<int> b;//定义结果矩阵,存放逆矩阵
if(c.rows!=c.cols) cout<<"此矩阵一定没有逆矩阵!"<<endl;
else
{
int m,n,i,j,k;
double d=1.0;
m=c.rows; n=2*c.cols;
CMatrix<double> a(m,n);//定义一个矩阵存放本矩阵和单位矩阵合并后的矩阵
cout<<"矩阵合并"<<endl;
for(i=0;i<m;i++)
for(j=0;j<n;j++)
{
if(j<m) a.elems[i*n+j]=c.elems[i*m+j];
else{
k=j-c.cols;
if(i==k) a.elems[i*n+j]=1.0;
else a.elems[i*n+j]=0.0;}
}
a.print();//打印输出合并好的矩阵
d=1.0;
for(i=0;i<m;i++)//利用消元法把矩阵A的前半部分化成上三角型
{
d=d*a(i,i);//D为已知矩阵的行列式
for(j=i+1;j<n;j++)
a.elems[i*n+j]=(a(i,j)/a(i,i));
a.elems[i*n+i]=1.0;
for(k=i+1;k<m;k++)
{
for(j=i+1;j<n;j++)
a.elems[k*n+j]-=a(i,j)*a(k,i);
a.elems[k*n+i]=0.0;
}
}
cout<<"消元后的矩阵"<<endl;
a.print();//输出消元后的矩阵
cout<<"求得矩阵的行列式:"<<d<<endl;
if(!d) cout<<"该矩阵的逆矩阵不存在!"<<endl;//行列式为零,逆阵不存在
else //把消元后的上三角行矩阵化为单位矩阵
{
for(i=m-1;i>0;i--)
for(k=i-1;k>=0;k--)
{for(j=m;j<n;j++)
a.elems[k*n+j]=a(k,j)-a(i,j)*a(k,i);
a.elems[k*n+i]=0.0;}
}
cout<<"化简后的矩阵"<<endl;
a.print();//输出化简后的矩阵A
b.cols=m; b.rows=m;
for(i=0;i<m;i++)
for(j=0;j<m;j++)
{b.elems[i*m+j]=0.0; b.elems[i*m+j]=a(i,j+m);}//把化简好的A矩阵的后半部分赋给B
cout<<"求得矩阵的逆阵:"<<endl;
b.print();
}
cout<<"****************求解结束************\n";
return b;
}
template<class F>
F CMatrix<F>::operator()(int rs,int cs)
{
if(rs>=0&&rs<rows&&cs>=0&&cs<cols)
return elems[rs*cols+cs];
else
return 0;
}
template<class F>
void CMatrix<F>::get_from_file()
{
char filename[10];//文件名
int n;//要读的元素个数
cout<<"请输入要读文件的文件名:\n";
cin>>filename;
ifstream infile(filename,ios::in|ios::nocreate);
if(!infile)
{
cerr<<"open error!"<<endl;
cout<<"input error!"<<endl;
}
cout<<"请输入读取数据的个数:";
cin>>n;
cols=0;
for(int i=0;i<n;i++)
{
infile>>elems[cols++];//把读入的数据赋给集合元素
cout<<elems[cols++];
}
// print();//打印该集合
infile.close();
}
//在集合外定义成员函数:保存集合到文件
template<class F>
void CMatrix<F>::save_to_file()
{
char filename[10];//文件名
cout<<"请输入要存入的文件名:\n";
cin>>filename;
ofstream outfile(filename,ios::out);
if(!outfile)
{
cerr<<"open error!"<<endl;
cout<<"open error!"<<endl;
}
for(int i=0;i<cols;i++)
outfile<<elems[i]<<" ";
cout<<"保存成功"<<endl;
outfile.close();
}
//在类外定义成员函数:读入文件
/*template<class F>
void CMatrix<F>::get_from_file()
{
// char filename[10];
// cout<<"请输入要读入文件的文件名:"<<endl;
// cin>>filename;
ifstream outfile("D://wenjian1.txt",ios::out|ios::in);//定义输入文件流对象,以输入方式打开文件
if(!outfile)
{
cerr<<"open error!"<<endl;
exit(0);
}
for(int i=0;i<rows;i++)
for(int j=0;j<cols;j++)
{
outfile>>elems[i*cols+j];//把读来的数据符给矩阵元素
cout<<elems[i*cols+j];
}
cout<<"保存成功\n";
outfile.close();//关闭文件
}
//在类外定义成员函数:写入并保存数据
template<class F>
void CMatrix<F>::save_to_file()
{
// char filename[10];
// cout<<"请输入要存入文件的文件名:"<<endl;
// cin>>filename;
ofstream outfile("D://wenjian2.txt",ios::out);//定义输出文件流对象,以输出方式打开文件
if(!outfile)
cerr<<"open error!"<<endl;
for(int i=0;i<rows;i++)
{
for(int j=0;j<cols;j++)
outfile<<elems[i*cols+j];//把矩阵的元素顺序写入文件
outfile<<endl;
}
cout<<"保存成功!\n";
outfile.close();//关闭文件
}*/
template<class F>
void CMatrix<F>::print()
{
cout<<"{";
for(int i=0;i<cols-1;i++)
cout<<elems[i]<<setw(6);
if(cols>0) cout<<elems[cols-1]<<"}"<<endl;
else cout<<"}"<<endl;
}
template<class F>
void CMatrix<F>::set()//定义输入矩阵行与列的函数
{
cout<<"请输入要计算的矩阵的行与列"<<endl;
cin>>rows>>cols;
size=rows*cols;
}
void calcadd() //定义矩阵相加的函数
{
CMatrix<int> a;
a.set();
a.get_from_file();
CMatrix<int> b;
b.set();
b.get_from_file();
CMatrix<int> c;
c=a+b;
}
void calcsub() //定义矩阵相间的函数
{
CMatrix<int> a;
a.set();
a.get_from_file();
CMatrix<int> b;
b.set();
b.get_from_file();
CMatrix<int> c;
c=a-b;

}
void calcmult() //定义矩阵相乘的函数
{
CMatrix<int> a;
a.set();
a.get_from_file();
CMatrix<int> b;
b.set();
b.get_from_file();
CMatrix<int> c;
c=a*b;

}
void qiuni() //定义矩阵求逆的函数
{
CMatrix<int> a;
a.set();
a.get_from_file();

}
void dismue() //定义菜单函数
{
int choice;
cout<<"1------两矩阵相加\n";
cout<<"2------两矩阵相减\n";
cout<<"3------两矩阵相乘\n";
cout<<"4------矩阵求逆\n";
cout<<"5------退出\n";
for(;;)
{
cin>>choice;
switch(choice)
{
case 1: calcadd();break;
case 2: calcsub();break;
case 3: calcmult();break;
case 4: qiuni();break;
case 5:
default:return;break;
}
}
}
void main()
{
dismue();
}
...全文
89 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
菜子儿 2008-12-29
  • 打赏
  • 举报
回复
来学习了。。。。^_^
随着通信电子技术的迅速发展,信息技术给家居行业产生了深远的影响,家居环境的智能化监控已经成为智能家居的一个重要的发展方向。人们逐渐对自己的生活提出一种更高的要求,他们需要一种智能化、可交互,并且融合现代创新科技的产品来改善他们的生活环境,使他们生活更加安全、舒适、便捷、智能。本文根据智能家居的发展背景和研究现状,并且从实用性和可行性角度出发,研究设计了一种基于STM32单片机的智能家居系统。该系统由一个多功能综合的技术系统组成,各个多功能子系统间具有协同配合能力。基于STM32单片机实现的功能子系统包括:智能温度检测,智能湿度检测,智能烟雾/火灾检测智能检测,无线传输,人机交互机构,风扇调节,报警模块。 整个系统分为前端51单片机采集板和后端STM32单片机接收板。 采集板使用DHT11温湿度传感器、MQ烟雾传感器完成室内家居环境的采集。然后通过nRFL24L01将采集到的数据发送给后端。接收板使用LCD1602完成数据显示、使用蜂鸣器模块报警,使用风扇驱动模块调节室内家居环境。本文完成了智能家居控制系统前端、后端软硬件的设计,使用Altium designer绘制了电路原理图,使用Keil C完成了51单片机和STM32单片机的编程与调试。 最后,对本文设计的基于STM32的智能家居控制系统进行部署调试。试验结果表明,该系统可成功应用在智能家居环境检测调节和火灾安全防护的领域,可提高家居生活智能化水平。

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧