4Programmers
По четвертому пункту вот тебе из того, что на винте было. Дописать методы нужные не долго:
По 5му - время будет, помозгую.
- Код: Выделить всё
// Matrix.h: interface for the Matrix class.
//
//////////////////////////////////////////////////////////////////////
#ifndef Matrix_h_
#define Matrix_h_
#include<iostream.h>
class Matrix
{
int n,m;//n-ширина m-высота
double**A;
void print(ostream&)const;
public:
void DelRow(int i);
void DelCol(int);
void size(int&t,int&s) const;
double get(int,int) const;
void put(int,int,double);
Matrix(int,int);
~Matrix();
friend ostream&operator<<(ostream&,const Matrix&);
};
#endif
// Matrix.cpp: implementation of the Matrix class.
//
//////////////////////////////////////////////////////////////////////
#include "Matrix.h"
#include "Error.h"
#include <iostream.h>
Matrix::Matrix(int s,int t)
{//ERROR s>1,t>1
if(!((s>1)&&(t>1)))throw Error(1);
n=t;m=s;
A=new double*[m];
for(int i=0;i<m;i++)
A[i]=new double[n];
for(i=0;i<m;i++)
for(int j=0;j<n;j++)A[i][j]=0;
}
Matrix::~Matrix()
{
for(int j=0;j<m;j++)delete[]A[j];
delete[]A;
}
void Matrix::print(ostream&out)const
{
for(int i=0;i<m;i++)
{for(int j=0;j<n;j++){out.width(3);out<<A[i][j]<<" ";}
out<<endl;}
out.flush();
}
void Matrix::put(int i, int j, double x)
{//ERROR i>=0 j>=0
if(!((i>=0)&&(j>=0)))throw Error(1);
A[i][j]=x;
}
double Matrix::get(int i, int j)const
{//ERROR i>=0 j>=0
if(!((i>=0)&&(j>=0)&&(i<m)&&(j<n)))throw Error(1);
return A[i][j];
}
ostream&operator<<(ostream&out,const Matrix&A)
{
A.print(out);
return out;
}
void Matrix::size(int &t, int &s) const
{
t=m;s=n;
}
void Matrix::DelCol(int k)
{//ERROR k>=0;
if(!((k>=0)&&(k<n)))throw Error(1);
for(int i=0;i<m;i++)
{
double*q=new double[n-1];
double*p;
for(int j=0;j<k;j++)q[j]=A[i][j];
for(j=k+1;j<n;j++)q[j-1]=A[i][j];
p=A[i];
A[i]=q;
delete[]p;
}
n--;
}
void Matrix::DelRow(int i)
{
if(!((i>=0)&&(i<n)))throw Error(1);
double*p=A[i];
for(int k=i;k<m;i++)A[k]=A[k+1];
delete[]p;
}
По 5му - время будет, помозгую.
моя версия четвертого задания (правда не полная, но основную идею думаю уловить нетрудно
)
CMatrix.h
CMatrix.cpp
CMatrix.h
- Код: Выделить всё
class CMatrix
{
public:
CMatrix(int width, int height);
~CMatrix();
int GetWidth();
int GetHeight();
bool LoadFromFile(const char *FileName);
float GetElement(int i, int j);
bool PutElement(int i, int j, float element);
bool IsErrorOccured();
CString GetErrorText();
CMatrix operator+ (CMatrix other);
CMatrix operator- (CMatrix other);
CMatrix operator* (CMatrix other);
CMatrix operator* (float c);
private:
int _mWidth, _mHeight;
float *_matrix;
bool _error_occured;
CString _error_discr;
};
CMatrix.cpp
- Код: Выделить всё
#include "stdafx.h"
#include "CMatrix.h"
CMatrix::CMatrix(int width, int height)
{
if (width < 1)
{
this->_error_occured = true;
this->_error_discr = "Matrix width is less 1";
return;
}
this->_mHeight = width;
if (height < 1)
{
this->_error_occured = true;
this->_error_discr = "Matrix height is less 1";
return;
}
this->_mHeight = height;
this->_matrix = new float[this->_mHeight * this->_mWidth];
this->_error_occured = false;
}
CMatrix::~CMatrix()
{
delete this->_matrix;
}
int CMatrix::GetHeight()
{
return this->_mHeight;
}
int CMatrix::GetWidth()
{
return this->_mWidth;
}
bool CMatrix::IsErrorOccured()
{
return this->_error_occured;
}
CString CMatrix::GetErrorText()
{
return this->_error_discr;
}
CMatrix CMatrix::operator +(CMatrix other)
{
CMatrix outMatrix(this->_mWidth, this->_mHeight);
if (other.GetWidth() != this->_mWidth)
{
this->_error_occured = true;
this->_error_discr = "Matrix A width is not equal to matrix B width";
return outMatrix;
}
if (other.GetHeight() != this->_mHeight)
{
this->_error_occured = true;
this->_error_discr = "Matrix A height is not equal to matrix B height";
return outMatrix;
}
for (int i = 0; i < this->_mHeight; i++)
{
for (int j = 0; j < this->_mWidth; j++)
{
outMatrix.PutElement(i, j, (float)(other.GetElement(i, j) + this->GetElement(i, j)));
}
}
this->_error_occured = false;
return outMatrix;
}
bool CMatrix::PutElement(int i, int j, float element)
{
if (i >= this->_mHeight)
{
this->_error_occured = true;
this->_error_discr = "i must be less than matrix height";
return false;
}
if (j >= this->_mWidth)
{
this->_error_occured = true;
this->_error_discr = "j must be less than matrix width";
return false;
}
this->_matrix[i * this->_mHeight + j] = element;
this->_error_occured = false;
return true;
}
float CMatrix::GetElement(int i, int j)
{
if (i >= this->_mHeight)
{
this->_error_occured = true;
this->_error_discr = "i must be less than matrix height";
return false;
}
if (j >= this->_mWidth)
{
this->_error_occured = true;
this->_error_discr = "j must be less than matrix width";
return false;
}
this->_error_occured = false;
return this->_matrix[i * this->_mHeight + j];
}
[quote=d'green,Dec 12 2005, 12:33 AM]Криг говорит с PHP акцентом
там в классах везде приходиццо писать this .GIF)
[/quote]
на С++ начал писать задолго до PHP
пишу везде this чтобы после точки или -> IDE показала список возможных свойств и методов класса - так вероятность допустить синтаксическую ошибку уменьшается на порядок
как только перейду на MSVS 2005 избавлюсь от этой привычки - там IDE сразу показывает что нужно писать
[/quote]
на С++ начал писать задолго до PHP
пишу везде this чтобы после точки или -> IDE показала список возможных свойств и методов класса - так вероятность допустить синтаксическую ошибку уменьшается на порядок
как только перейду на MSVS 2005 избавлюсь от этой привычки - там IDE сразу показывает что нужно писать
Щаз разложу алгоритм второй задачи, у кого есть желание напишите .GIF)
и так ключевым место в данной конструкции являеццо центральный элемент.
пусть мы заполняем центральный элемент монетой со значением N, тогда на общем условие это сказываеццо следующим образом:
Все линии теперь не имеют общего элемента.
Сумма каждой линии должна стать (55-N)
Общая сумма монет равна (205-N)
Если провести небольной анализ, станет понятно, что подойдёт только монета с номером 5.
В случае с монетой 10(15) вывод простой, в одной из линий окажеццо две монеты по 20 следовательно в линии заполнено 3-и элемента, а сумма уже 50(55) следовательно линии закрыть нереально чистА физически
в случае с 20-кой в центре сумма во всех линиях сразу же 40, чтобы каждую закрыть линию надо ещё три монеты минимального достоинства, а на это мы пойти не можем.
Установив монету в центр мы свели задачу к заполнение 4-х массивов размерности 4-е, ограниченным количеством монет.
Что уже само по себе тривиально
тут подойдёт даже равномерное возможное распределение 
Поясняю про ещё 4-е линии, которые грани квадрата.
Найдя успешные сочитанию основных 4-х линий, достигаем необходимой симметричности изменением положения элементов в этих самых линиях.GIF)
Это уж совсем тривиально.GIF)
и так ключевым место в данной конструкции являеццо центральный элемент.
пусть мы заполняем центральный элемент монетой со значением N, тогда на общем условие это сказываеццо следующим образом:
Все линии теперь не имеют общего элемента.
Сумма каждой линии должна стать (55-N)
Общая сумма монет равна (205-N)
Если провести небольной анализ, станет понятно, что подойдёт только монета с номером 5.
В случае с монетой 10(15) вывод простой, в одной из линий окажеццо две монеты по 20 следовательно в линии заполнено 3-и элемента, а сумма уже 50(55) следовательно линии закрыть нереально чистА физически

в случае с 20-кой в центре сумма во всех линиях сразу же 40, чтобы каждую закрыть линию надо ещё три монеты минимального достоинства, а на это мы пойти не можем.
Установив монету в центр мы свели задачу к заполнение 4-х массивов размерности 4-е, ограниченным количеством монет.
Что уже само по себе тривиально

Поясняю про ещё 4-е линии, которые грани квадрата.
Найдя успешные сочитанию основных 4-х линий, достигаем необходимой симметричности изменением положения элементов в этих самых линиях
Это уж совсем тривиально
Рассказываю нестандартный алгоритм решения распределения 4-х сущностей по 4-м массивам .GIF)
производим перебор уникальных комбинаций 4-х элементов на 4-х позициях(все комбинации сортируем по убыванию, отсекая таким образом повторяющиеся, как известно от перестановки мест слогаемых сумма не меняеццо
).
Элементы 4321 Ноль не использую сознательно, т.к. будем проверять валидность суммированием.
4444
4443
4442
4441
4433
и т.д. получиццо их немного
далее делаем следующее, отсекаем все неудовлетворяющие нас по сумме комбинации(4+4+4+4 != SUM и так далее). Думаю останеццо в пределах 10-ка или меньше, а дальше 4-х значное число с N возможных значений, каждое значение чекаем на валидность коичеством задействованных элементов. А главное быстро
а вроде как и перебор .GIF)
производим перебор уникальных комбинаций 4-х элементов на 4-х позициях(все комбинации сортируем по убыванию, отсекая таким образом повторяющиеся, как известно от перестановки мест слогаемых сумма не меняеццо

Элементы 4321 Ноль не использую сознательно, т.к. будем проверять валидность суммированием.
4444
4443
4442
4441
4433
и т.д. получиццо их немного
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4