bmstu-iu9 / utp2017-5-excel Goto Github PK
View Code? Open in Web Editor NEWБраузерная электронная таблица
Home Page: https://bmstu-iu9.github.io/utp2017-5-excel/
License: MIT License
Браузерная электронная таблица
Home Page: https://bmstu-iu9.github.io/utp2017-5-excel/
License: MIT License
findCycleFrom
, должен включать в себя все вершины из цикла, в том числе вершину, из которой производился поиск.findCycleFrom
должен возвращать массив из одной этой вершины.Синтаксический анализатор работает методом рекурсивного спуска.
Входные данные: Последовательность токенов.
Выходные данные: Дерево разбора.
Грамматика синтаксического анализатора - #7 в БНФ
Требуется разработать архитектуру электронной таблицы:
Необходимо сформулировать общее представление о проекте — как будет выглядеть электронная таблица и какими функциями она будет обладать. Полученное представление следует описать в README.md в виде одного или нескольких абзацев. После этого данную задачу можно закрывать.
Сейчас ставим оценки! Вот прямо сейчас!
Неформальный рейтинг проектов:
Дубанов А. В. @alex-qrcs и Коновалов А. В. @Mazdaywik.
Математические:
ABS(x)
ACOS(x)
ACOT(x)
ASIN(x)
ATAN(x)
CEILING(x)
COS(x)
COT(x)
DEGREES(x) — перевод x из радианов в градусы
EXP([x])
FACT(x)
FLOOR(x)
GCD(x, y)
ISEVEN(x)
ISODD(x)
LCM(x, y)
LN(x)
LOG(x, base)
LOG10(x)
MOD(dividend, divisor)
PI()
POW(base, exponent)
QUOTIENT(dividend, divisor)
RADIANS(x)
RAND() — случайное число [0, 1)
RANDBETWEEN(low, high)
ROUND(x, places)
SIGN(x)
SIN(x)
SQRT(x)
TAN(x)
Статистические:
AVERAGE(...args) — аналогично SUM, только среднее арифметическое. См. задачу про диапазоны.
COUNT(...args) — считает количество числовых значений
COUNTUNIQUE(...args) — считает количество уникальных значений
MAX(...args) — максимум; все аргументы и значения в Range должны быть все number или все string
MEDIAN(...args) — медиана
MIN(...args)
MODE(...args) — мода
PRODUCT(...args)
Строковые:
CHAR(index) — возвращает строку из одного символа под номером index в Unicode
CODE(string) — возвращает индекс в Unicode первого символа строки
FIND(needle, haystack[, startPosition])
FIXED(number, placesAfterFloatingPoint) — формат десятичного числа в виде строки
LEFT(string, length) — префикс строки длиной length
LEN(string)
LOWER(string)
MID(string, start, length) — извлечение подстроки
RIGHT(string, length) — суффикс строки длиной length
SEARCH(needle, haystack[, startPosition]) — то же, что FIND, только не чувствительная к регистру
UPPER(string)
Управляющие:
COLUMNS(range) — ширина диапазона
IF(condition, ifTrue, ifFalse)
INDEX(range, row, column) — возвращает значение ячейки с координатами row, column относительно диапазона range
ISLOGICAL(value)
ISNUMBER(value)
ISTEXT(value)
ROWS(range) — высота диапазона
Переименовать для совместимости с другими системами управления электронными таблицами:
(Мне это тоже не нравится, но что поделать.)
EQUALS -> EQ
GREATER -> GT
GREATER_OR_EQUALS -> GTE
LESS -> LT
LESS_OR_EQUALS -> LTE
NUMBER -> N
STRING -> TEXT
NEGATE -> UNMINUS
SUBTRACT -> MINUS
="abc"
, значение в поле expression
будет пустое.position
в классе _Expression
должно быть числом.=1
=B1
Предварительно должна быть выполнена задача об относительных и абсолютных адресах строк и столбцов ячеек.
move(fromRow, fromColumn, toRow, toColumn)
класса Spreadsheet._CellReference
. Он возвращает новый Spreadsheet._CellReference
, в котором:
toRow - fromRow
;toColumn - fromColumn
;rowFixed
и columnFixed
имеют такие же значения.toString
класса Spreadsheet._Expression
. Это метод "собирает" разобранное выражение обратно в строку-формулу.generateFormula
класса Spreadsheet._Cell
. Он преобразует поле expression
в строку и кладёт её в formula
.setFormula
на два: setFormula(i, j, formula)
и setExpression(i, j, expression)
. Второй устанавливает пропарсенное выражение и используется в первом.copyCell(fromRow, fromColumn, toRow, toColumn)
класса Spreadsheet
. Он копирует expression
из ячейки с первыми координатами рекурсивно, заменяя все _CellReference
на .move(fromRow, fromColumn, toRow, toColumn)
, в ячейку со вторыми координатами. Затем вызывает generateFormula
последней. Затем вызывает setExpression(toRow, toColumn, expression)
.Необходимо создать эскиз сайта. По эскизу построить модель.
Требования:
Разработать структуру данных таблица, реализованную в виде двумерного массива.
Создать методы:
Здесь проектирование синтаксического анализатора, обсуждение грамматики формул
Лексический анализатор должен преобразовывать входную строку в последовательность токенов
Классификация токенов:
A1
, ZZ98
, ABS
, CONCATENATE
)(
)
+
, -
, *
, /
, =
, <
, >
, <=
, >=
TRUE
, FALSE
"
, причём символы \
и "
могут содержаться в строке в виде \\
и \"
соответственноТокены могут разделяться любым количеством пробельных символов.
Пример формулы: CONCATENATE("Всё очень ", IF(AND(A1 >= B2 + 1.5, TRUE), "хорошо", "плохо"))
Нужно добавить поддержку диапазонов как типа значений в формуле.
Пример использования: =CONCATENATE("Сумма: ", STRING(SUM(A1:A10)))
:
(COLON
)Spreadsheet._Range
:
start
типа Spreadsheet._CellReference
— ссылка на первую угловую ячейку диапазонаend
типа Spreadsheet._CellReference
— ссылка на противоположную угловую ячейкуforEachCell(callback)
вызвает функцию callback
для каждой ячейки из диапазона, начиная с левой верхней и двигаясь справа налево, сверху вниз. callback(cell, row, column)
вызывается с параметрами:
cell
типа Spreadsheet._Cell
— ячейка;row
, column
-- координаты этой ячейки.CellReference
должна быть проверка, что все ячейки из диапазона существуют и определеныSUM(...args) {
// Проверяем: количество args должно быть >= 1
return args.reduce((sum, element) => {
if (element instanceof Spreadsheet.Table) {
let rangeSum = 0;
element.forEachValue(cell => {
// Проверяем, что значение cell — number
rangeSum += cell.value;
});
return sum + rangeSum;
} else if (typeof element === "number") {
return sum + element;
} else {
// Ошибка
}
}, 0);
}
A1
=1
B1
=A1
ui.spreadsheet.copyCell(0, 1, 0, 2)
. Видим в ячейке C3
мифическое =A0
.A1
=1
B1
=A1
ui.spreadsheet.copyCell(0, 1, 1, 1)
. Видим в ячейке B2
=1
и ошибку зависимости, что ничем не объясняется.A1
=1
B1
=$A1
ui.spreadsheet.copyCell(0, 1, 0, 2)
. Видим в ячейке C3
=0
.A1
=1
B1
=A$1
ui.spreadsheet.copyCell(0, 1, 0, 2)
. Видим в ячейке C3
неожиданное =A-1
.Требуется реализовать механизм вычисления формул в дереве разбора #8.
Изменения класса XLSXManager
для импорта:
import(blob)
вместо fill(blob)
. fill()
теперь не принимает аргументов и вызывается после import
.getSelection
, который возвращает {startRow, startColumn, endRow, endColumn}
— диапазон сохранённой в файле выделенной области.getFormattedCells
, который возвращает двумерный массив из FormattedCell
Для экспорта:
setSelection(startRow, startColumn, endRow, endColumn)
setFormattedCells(cells)
, где cells — двумерный массив из XLSXManager.FormattedCell
.Создаем класс XLSXManager.FormattedCell
.
Он имеет поля: fontFamily
, fontSize
, color
, bold
, italic
, underlined
, textAlign
, fillColor
, borderLeft
, borderTop
, borderRight
, borderBottom
.
Создаем класс XLSXManager.FormattedCell.Border
.
Он имеет поля: position
, width
, color
.
Все поля обоих классов по умолчанию не определены.
Определенные поля XLSXManager.FormattedCell
имеют значения:
fontSize
— число точек (не пикселей).bold
, italic
, underlined
— true
.textAlign
— "left"
, "right"
, "center"
или "justify"
.border-
— объект класса XLSXManager.FormattedCell.Border
.Определенные поля XLSXManager.FormattedCell.Border
имеют значения:
position
— "top"
, "left"
, "right"
, "bottom"
.width
— число точек.=
в ячейку) не должна вызывать ошибку. Значение в событии должно быть undefined
.=1.5
, в парсере возникнет неперехваченное исключениеВ случае, если существует рекурсивная зависимость ячеек таблицы, следует выдавать ошибку.
Нужно добавить поддержку относительных и абсолютных адресов строк и столбцов ячеек.
Адрес абсолютный, если он не меняется при копировании или перемещении ячейки.
Если адрес строки или столбца абсолютный, перед индексом стоит символ $
. Например, $A1
, A$1
, $A$1
FUNCTION
, CELL_REFERENCE
.
IDENTIFIER
, может представлять собой только функцию, тогда этот токен записывается как FUNCTION
. Пример: SUM
, STRING
, LOLOLOLOL
, A01
IDENTIFIER
, может представлять собой только ссылку на ячейку, то этот токен записывается как CELL_REFERENCE
. Пример: $A1
, A$99
, $ZZ$666
IDENTIFIER
. Примеры: A1
, ZZ666
, LOG10
$
входит в токен CELL_REFERENCE
(или IDENTIFIER
согласно грамматике). Некорректные записи вроде A$B1
, $$A1
, A1$
должны вызывать синтаксическую ошибку.Spreadsheet._CellReference
соответственно rowFixed = true | false
, columnFixed = true | false
Требуется создать метод, который парсит и сериализует формулы, сохраняя информацию для дальнейшего их вычисления.
Другими словами, представляет строку в удобо-интерпретируемом виде.
Входные данные: строка-формула
Выходные данные: объект, хранящий информацию о ссылках на ячейки таблицы и операциях, которые необходимо произвести, для вычисления значения клетки
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.