Vector.h
#pragma once
class Matrix;
class Vector
{
int* v;
int sz;
public:
void remove(){ delete[] v; }
int size(){ return sz; };
void set(int); // 不要求必須寫出形參名稱。
void display();
int& operator[](int);
friend Vector multiply(Matrix& m, Vector& v);
};
Matrix.h
#pragma once
class Vector;
class Matrix
{
int* m;
int szl, szr;
public:
void set(int, int);
void remove(){ delete[] m; }
int sizeL(){ return szl; }
int sizeR(){ return szr; }
int& elem(int, int);
friend Vector multiply(Matrix& m, Vector& v);
};
Vector.cpp
#include "Vector.h"
#include <iostream>
void Vector::set(int s)
{
sz = s;
if(s <= 0)
{
std::cerr << "bad vector size.\n";
exit(1);
}
v = new int[s];
}
int& Vector::operator[](int i)
{
if (i < 0 || i >= sz)
{
std::cerr << "Vector index bad of range.\n";
exit(1);
}
return v[i];
}
void Vector::display()
{
for (int i = 0; i < sz; ++i)
std::cout << v[i] << " ";
std::cout << "\n";
}
Matrix.cpp
#include "Matrix.h"
#include <iostream>
void Matrix::set(int l, int r)
{
szl = l;
szr = r;
if (l <= 0 || r <= 0)
{
std::cerr << "bad Matrix size.\n";
exit(1);
}
m = new int[l*r];
}
int& Matrix::elem(int l, int r)
{
if (l < 0 || szl <= l || r < 0 || szr <= r)
{
std::cerr << "out of the Matrix range.\n";
exit(1);
}
return m[l*szr + r];
}
Main.cpp
// 綜合性比較強的程序。
#include <iostream>
#include <fstream>
#include "Vector.h"
#include "Matrix.h"
using namespace std;
// 可以把乘法函數寫成兩個類的友元形式,來減少調用損耗。
Vector multiply(Matrix& m, Vector& v)
{
if (m.szr != v.sz)
{
cerr << "bad multiply Matrix with Vector.\n";
exit(1);
}
Vector r;
r.set(m.szl);
for (int i = 0; i < m.szl; ++i)
{
r.v[i] = 0;
for (int j = 0; j < v.sz; ++j)
{
r.v[i] += m.m[i*m.szr + j] * v.v[j];
}
}
return r;
}
// 普通形式
/*
Vector multiply(Matrix& m, Vector& v)
{
if (m.sizeR() != v.size())
{
cerr << "bad multiply Matrix with Vector.\n";
exit(1);
}
Vector r;
r.set(m.sizeL());
for (int i = 0; i < m.sizeL(); ++i)
{
r[i] = 0;
for (int j = 0; j < v.size(); ++j)
{
r[i] += m.elem(i, j) * v[j];
}
}
return r;
}*/
int main()
{
ifstream in("in.txt"); // 在IDE開發環境中,in.txt放於工程路徑下與源文件一起即可。其中的內容要一行一個有效數字。
if (!in.is_open())
{
cerr << "error!\n";
exit(1);
}
int x, y;
in >> x >> y;
Matrix m;
m.set(x, y);
for (int i = 0; i < x; ++i)
for (int j = 0; j < y; ++j)
in >> m.elem(i, j);
in >> x;
Vector v;
v.set(x);
for (int i = 0; i < x; ++i)
in >> v[i];
Vector r = multiply(m, v);
r.display();
r.remove();
v.remove();
m.remove();
return 0;
}
挺有意思的代碼。