2
1
0
0
3
1
3
0
0
5
2
7
0
0
9
0
这个程序对于三对角矩阵都是有效的,为了精简代码可以考虑用链表的方式动态存储矩阵数据,由于程序已经完成,本次未采用链表,看着代码比较冗长
#include<iostream>
#include<iomanip>
#include<fstream>
#include<string>
#include<cstdlib>
using
namespace std;
int main()
{
fstream matrix;
int
row = 0,
colume; //row表示矩阵的行数,column表示矩阵的列数
int
n; //矩阵的维数
int
bandwidth; //bandwidth表示矩阵的带宽
int
j=0; //提取矩阵三对角的循环控制变量
string file_number; //从文件当中提取每一行矩阵
string p; //提取每一列矩阵
int**
number; //用来保存提取的二维数组
int*
band_matrix; //用来保存带状矩阵的一维数组
matrix.open("1.txt"); //打开存储带状矩阵的文件
while
(!matrix.eof()) //循环读取矩阵文件当中的每一行
{
row++; //统计矩阵的行数
colume
=
1; //统计矩阵的列数
getline(matrix,
file_number); //读取每一行矩阵作为字符串存入file_number变量当中
for
(unsigned int i = 0; i < file_number.length();
i++)
{
if
(file_number[i] != ' ')
{
p
+=
file_number[i]; //读取到非空格字符即是数字,将元素作为字符串存入变量p中
}
if
(file_number[i] == ' ')
{
colume++; //遇见空格则行数加1
cout <<
p << "
"; //输出前面得到的矩阵元素
p
=
""; //将变量p重置为空,以便于存储下一个矩阵元素
}
}
cout <<
p <<
'\n'; //由于矩阵文件的每一行末尾使用'\n'结尾的,所以矩阵每行的最后一个元素需要在此单独输出
p
=
""; //将变量p重置为空,以便于存储下一个矩阵元素
}
matrix.close(); //关闭存储带状矩阵的文件
if
(row !=
colume)
{
cout <<
"请输入方阵,然后重新运行本程序!"
<< endl;
system("pause");
return
0;
}
n
=
row; //输出矩阵的维数
cout <<
"输入矩阵的行数为:"
<< row
<< endl;
cout <<
"输入矩阵的列数为:"
<< colume
<< endl;
cout <<
"输入矩阵的维数为:"
<< n
<< endl;
bandwidth
= 3 * row -
2; //计算三对角矩阵的带宽
number
= new
int*[bandwidth];
for
(int i = 0; i < bandwidth; i++)
number[i]
= new int[3];
row
=
0; //重置行
colume
=
0; //重置列
matrix.open("1.txt"); //再次打开存储带状矩阵的文件
while
(!matrix.eof())
{
row++;
colume
= 1;
getline(matrix,
file_number);
for
(unsigned int i = 0; i < file_number.length();
i++)
{
if
(file_number[i] != ' ')
{
p
+= file_number[i];
}
if
(file_number[i] == ' ')
{
switch
(row - colume)
{
case
1:case 0:case -1:
number[j][0]
= row;
number[j][1]
= colume;
number[j][2]
= atoi(p.c_str());
j++;
break;
}
colume++;
p
= "";
}
}
switch
(row - colume)
{
case
1:case 0:case -1:
number[j][0]
= row;
number[j][1]
= colume;
number[j][2]
= atoi(p.c_str());
j++;
break;
}
p
= "";
}
matrix.close(); //关闭存储带状矩阵的文件
band_matrix
= new
int[bandwidth]; //从堆中申请动态空间用一维数组的方式存储带状元素
for
(int i = 0; i < bandwidth; i++)
{
switch
(number[i][0] - number[i][1])
{
case
1:
band_matrix[number[i][0]
- 2] = number[i][2];
break;
case
0:
band_matrix[n
+ number[i][0] - 2] = number[i][2];
break;
case
-1:
band_matrix[2
* n + number[i][0] - 2] = number[i][2];
break;
default:
break;
}
}
for
(int i = 0; i < bandwidth; i++)
{
cout <<
band_matrix[i] << " ";
}
cout
<< endl;
delete[]
band_matrix;
for
(int i = 0; i < bandwidth; i++)
{
delete[]
number[i];
}
delete[]
number;
system("pause");
return
0;
}