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; }
挺有意思的代码。