Разбор полетов: Электронная таблица

Опубликовано Mar 27, 2012 в Загрузка кода проектов, Наши старые тестовые задания, Тестовые проекты (2-3 часа) | Нет комментариев

, , ,

Разбор полетов: Электронная таблица

Данный пост содержит разбор одного из вариантов решения задачи ЭЛЕКТРОННАЯ ТАБЛИЦА

Наша переписка по электронной почте, которая имела место после вопроса и комментариев позволила найти способ ответа, который удовлетворил всех заинтересованных в данном деле. Автор анонимно выслал нам код своего решения и дал разрешение опубликовать этот код и наши комментарии отдельным постом. Задачу эту возложили, само собой, на меня – и вот результат.

Итак, ссылку для загрузки полного исходника можно взять здесь.

Замечания и советы

Далее приводится список тех моментов, на которые мы обязательно обращаем внимание при собеседовании на вакансию начинающего C++ программиста.

Алгоритмическая часть. Задача полностью выполнена по алгоритмической составляющей для работы с формулами, содержащими оба типа ссылок.

Работа с файлами. Отсутствует.

Структура данных. Выбран статический массив с константными размерностями. Использование подобной структуры данных является для этой задачи серьезным недостатком. Очевидно, что размерностью 3×4 жизнь не исчерпывается. Условие содержит подсказку на этот счет – для стадии №2 описана структура файла, где задаются размерности для конкретной реализации таблицы, но использовать эти данные для предложенного вида массива невозможно. Нужна динамическая структура данных, лучше всего, основанная на контейнере std::vector. Возможно использование динамического массива на указателях (см. пример “Электронная таблица – код решения”).

Объектно-ориентированный дизайн. Нет никаких действий в этом направлении. Подобная реализация никак не позволяет судить о навыках работы с ООП. На реальном собеседовании, если будет принято решение продолжать его после продемонстрированного способа выполнения задания, последует масса дополнительных вопросов по ООП. Как минимум, нужно будет сходу предложить объектно-ориентированный дизайн для данной задачи.

Пример ООП-дизайна для задачи ЭЛЕКТРОННАЯ ТАБЛИЦА

class Table
{
public:
	Table(int rows, int cols);
	~Table(void);
	void createCell(int row, int col, const std::string& s);
        std::string getVal(int row, int col) const;
	const int row_cnt, col_cnt;
private:
	Cell** cells;
	Cell** cell(int row, int col) const;
        bool IsNumber(const char* s) const;
};
 
class Cell
{
public:
	Cell();
	~Cell(void);
	virtual std::string value()const = 0;
};
 
class TextCell: public Cell
{
public:
	TextCell(std::string s);
	virtual std::string value() const;
private:
	std::string val;
};
 
class NumberCell: public Cell
{
public:
	NumberCell(dword n);
	virtual std::string value() const;
private:
	dword val;
};
 
class ReferenceCell: public Cell
{
public:
	ReferenceCell(Cell** c);
	virtual std::string value() const;
	bool isValid();
private:
	Cell** ref;
};
 
class ErrorCell: public Cell
{
public:
	virtual std::string value() const;
private:
};

Стиль написания кода. Громоздкими являются конструкции в методе ParceCellIfFormula, который парсит ячейки с формулами.

Код метода ParceCellIfFormula

int ParceCellIfFormula(string CellContent, string& Row, string& Column)
{
  Row ="";
  Column="";
 
  switch (CellContent.length())
  {
  case 2: //A1 format
    {
      if ((int)CellContent[0]90) return 1;
      Column = Column + CellContent[0];
      Row = Row + CellContent[1];
      return 0;
      break;
    }
  case 3:
    {
      if ((int)CellContent[1]>= 65 && (int)CellContent[1]= 65 && (int)CellContent[0]= 49 && (int)CellContent[2]= 49 && (int)CellContent[1]= 65 && (int)CellContent[0]= 48 && (int)CellContent[2]= 65 && (int)CellContent[0]= 65 && (int)CellContent[1]= 49 && (int)CellContent[2]= 48 && (int)CellContent[3]

Желательно постараться упростить все эти многоэтажные вложения условных операторов. Кроме того, код будет лаконичнее, если для проверки того, является ли символ цифрой или буквой использовать функции isdigit и isalpha. Хорошо, что этот метод отдельно тестировался, что видно из закомментированного кода.


Автор публикации:

Оставить комментарий

Ваш адрес email не будет опубликован.


*