4Programmers

Не МЫ такие, Жизнь такая %)
Баг Форума
Аватара пользователя
Сообщения: 7981
Зарегистрирован: 24-10-2004

Сообщение Kent » 11-12-2005

По четвертому пункту вот тебе из того, что на винте было. Дописать методы нужные не долго:

Код: Выделить всё
// 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му - время будет, помозгую.

Site Admin
Аватара пользователя
Сообщения: 10082
Зарегистрирован: 26-04-2004

Сообщение KriG » 12-12-2005

моя версия четвертого задания (правда не полная, но основную идею думаю уловить нетрудно =))

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

Госу Флудер
Сообщения: 2740
Зарегистрирован: 20-04-2004

Сообщение d'green » 12-12-2005

Криг говорит с PHP акцентом =) там в классах везде приходиццо писать this =)
Кент не соблюдаем никакую нотацию в именование и плохо табулирует код =)
а так в целом ничего =)
ЗЫ первую писать ну буду т.к. тривиально =) вторую напишу если придумаю красивый алгоритм(ну в смысле чтобы нестандартный) =)

Госу Флудер
Сообщения: 2092
Зарегистрирован: 11-10-2005

Сообщение *D0T* » 12-12-2005

Грин убрал всеХ!

Госу Флудер
Сообщения: 2740
Зарегистрирован: 20-04-2004

Сообщение d'green » 12-12-2005

я не убрал, а сказал то, что скажут преподы =) а ваще главное чтобы Stable and BugFree =)

Site Admin
Аватара пользователя
Сообщения: 10082
Зарегистрирован: 26-04-2004

Сообщение KriG » 12-12-2005

[quote=d'green,Dec 12 2005, 12:33 AM]Криг говорит с PHP акцентом =) там в классах везде приходиццо писать this =)
[/quote]
на С++ начал писать задолго до PHP
пишу везде this чтобы после точки или -> IDE показала список возможных свойств и методов класса - так вероятность допустить синтаксическую ошибку уменьшается на порядок

как только перейду на MSVS 2005 избавлюсь от этой привычки - там IDE сразу показывает что нужно писать

Баг Форума
Аватара пользователя
Сообщения: 4260
Зарегистрирован: 19-04-2004

Сообщение Romas » 12-12-2005

а если в личке попробовать ?

Site Admin
Аватара пользователя
Сообщения: 10082
Зарегистрирован: 26-04-2004

Сообщение KriG » 12-12-2005

А вдруг еще кому пригодица

Госу Флудер
Сообщения: 2740
Зарегистрирован: 20-04-2004

Сообщение d'green » 12-12-2005

Щаз разложу алгоритм второй задачи, у кого есть желание напишите =)
и так ключевым место в данной конструкции являеццо центральный элемент.
пусть мы заполняем центральный элемент монетой со значением N, тогда на общем условие это сказываеццо следующим образом:
Все линии теперь не имеют общего элемента.
Сумма каждой линии должна стать (55-N)
Общая сумма монет равна (205-N)

Если провести небольной анализ, станет понятно, что подойдёт только монета с номером 5.
В случае с монетой 10(15) вывод простой, в одной из линий окажеццо две монеты по 20 следовательно в линии заполнено 3-и элемента, а сумма уже 50(55) следовательно линии закрыть нереально чистА физически :)
в случае с 20-кой в центре сумма во всех линиях сразу же 40, чтобы каждую закрыть линию надо ещё три монеты минимального достоинства, а на это мы пойти не можем.
Установив монету в центр мы свели задачу к заполнение 4-х массивов размерности 4-е, ограниченным количеством монет.
Что уже само по себе тривиально =) тут подойдёт даже равномерное возможное распределение :akadem:
Поясняю про ещё 4-е линии, которые грани квадрата.
Найдя успешные сочитанию основных 4-х линий, достигаем необходимой симметричности изменением положения элементов в этих самых линиях =)
Это уж совсем тривиально =)

Госу Флудер
Сообщения: 2740
Зарегистрирован: 20-04-2004

Сообщение d'green » 12-12-2005

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

Пред.След.

Вернуться в Наша Life

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 4