现在的位置: 首页 > 综合 > 正文

一段源代码

2018年02月16日 ⁄ 综合 ⁄ 共 1950字 ⁄ 字号 评论关闭

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;
}

挺有意思的代码。

抱歉!评论已关闭.