....

....

Бонифаций🦕

Мотивация проекта

Мы хотим создать электронную таблицу, которая сможет работать с данными внутри всей таблицы. Кроме того, программа для работы с электронными таблицами не имеет ограничения на содержимое ячеек или количество ячеек в таблице.


Описание Проекта

Цель проекта - создать программу, которая будет реализовывать основные операции с электронными таблицами. Входными данными программы будут текстовые данные таблицы, входными операциями будут аргументы командной строки, а результат обработки таблицы будет сохранен программой в указанном файле.


Подробные характеристики

Реализуйте программу в исходном файле sps.c (SPreadSheet). Входные данные будут считаны из файла, имя которого будет введено в командной строке. Программа выполняет операции, указанные в «командах электронной таблицы», которые она выполняет в последовательности, указанной в командной строке.


Скомпилируйте программу со следующими аргументами: $ gcc -std=c99 -Wall -Wextra -Werror sps.c -o sps


Синтаксис выполнения

Программа запускается в следующей форме: (./sps указывает расположение и имя программы):

---Аргумент -d указывает, какие символы можно интерпретировать как разделители для отдельных ячеек. Каждый символ в строке ввода, содержащийся в строке DELIM, действует как разделитель для двух соседних ячеек. По умолчанию DELIM представляет собой строку, содержащую пробел. Несколько вхождений одних и тех же символов в строку DELIM игнорируются. Первый символ из строки DELIM также будет использоваться в качестве разделителя для выходных значений. DELIM не должен содержать кавычек или обратной косой черты.

---Аргумент CMD_SEQUENCE - это один аргумент, содержащий последовательность операторов. Несколько команд электронной таблицы разделяются точкой с запятой. Команда не должна быть пустой.

---Аргумент FILE указывает имя файла таблицы.


Формат таблицы

Таблица - это текстовый файл, содержащий строки таблицы (каждая строка заканчивается символом конца строки). Каждая строка содержит отдельные ячейки, разделенные одним символом из набора разделителей. Данные в ячейке являются текстовыми (целые числа и числа с плавающей запятой представлены в десятичном формате и совместимы с нотацией C). Текстовые строки могут быть заключены в кавычки (в начале и в конце ячейки), они также могут содержать вводные символы (так называемая escape-последовательность) с использованием обратной косой черты: \ X представляет символ X, где X может быть любым символом (кроме символа конца строки).


Команды электронной таблицы

Команда электронной таблицы всегда применяется к выбранным ячейкам. Выбранные ячейки могут быть как отдельными ячейками, так и всей строкой, целым столбцом или так называемым окном ячеек. Каждая ячейка идентифицируется индексом строки и столбца, считая от 1. Первоначальный выбор - первая ячейка в таблице (строка 1, столбец 1). Команда выбора новой ячейки всегда сбрасывает предыдущий выбор. Для данного выбора могут быть выполнены разные команды. Команды различаются в зависимости от того, работают ли они с отдельными ячейками (в этом случае команда применяется последовательно строка за строкой и в каждой строке по столбцам - то есть, как мы привыкли читать текст), работают ли они для всего столбца (тогда они применяются только один раз для каждого столбца выбора с увеличивающимся индексом), или работают ли они для всей строки (тогда они применяются только один раз для каждой строки выбора с возрастающим индексом).


Выбранные команды могут принимать параметр в виде строки с именем STR. Такая строка подчиняется тем же правилам, что и текстовое содержимое ячейки, указанной в параграфе, описывающем формат таблицы (т.е. она может быть заключена в кавычки, она может содержать специальные символы, которым предшествует обратная косая черта).


Команды для изменения выделения

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


[R, C] - выделение ячейки в строке R и столбце C.

[R, _] - выделение всей строки R.

[_, C] - выделение всего столбца C.

[R1, C1, R2, C2] - выбор окна, т.е. всех ячеек в строке R и столбце C, для которых R1 <= R <= R2, C1 <= C <= C2. Если вместо числа R2 соотв. C2 будет дефисом, заменяя тем самым максимальную строку, соответственно. столбец в таблице.

[_, _] - выделить всю таблицу.

[min] - в существующей выделенной ячейке находит ячейку с минимальным числовым значением и устанавливает для нее выделение.

[max] - аналогично предыдущей команде, но находит ячейку с максимальным значением.

[найти STR] - в уже существующем выделении ячеек выбирает первую ячейку, значение которой содержит подстроку STR.

[_] - сбрасывает выбор из временной переменной (см. ниже).


Команды для редактирования структуры таблицы

irow - вставляет одну пустую строку слева от выбранных ячеек.

arow - добавляет одну пустую строку справа от выбранных ячеек.

drow - удаляет выбранные строки.

icol - вставляет один пустой столбец слева от выделенных ячеек.

acol - добавляет один пустой столбец справа от выделенных ячеек.

dcol - удалить выбранные столбцы.

Заметка: вставленные строки и столбцы действуют за пределами выбранных ячеек, добавляя или удаляя столбцы или строки всей таблицы.


Команды для редактирования содержимого ячейки

set STR - устанавливает значение ячейки в строку STR. Строка STR может быть заключена в кавычки и может содержать специальные символы, которым предшествует косая черта (см. Формат таблицы).

clear - содержимое выбранных ячеек будет удалено (содержимое ячеек будет пустым)

swap [R, C] - меняет местами содержимое выбранной ячейки с ячейкой в ​​строке R и столбце C

sum [R, C] - сохраняет сумму значений выбранных ячеек (соответствующих формату% g в printf) в ячейке в строке R и столбце C. Выбранные ячейки без номера будут проигнорированы (как если бы они не были выделены).

avg [R, C] - то же, что и сумма, но сохраняется среднее арифметическое выбранных ячеек

count [R, C] - то же, что и сумма, но количество непустых ячеек из выбранных ячеек сохраняется

len [R, C] - сохраняет длину строки текущей выбранной ячейки в ячейке в строке R и столбце C.


Команды для работы с временными переменными

Электронная таблица позволяет вам работать с 10 так называемыми временными переменными, обозначенными от _0 до _9. При запуске программы временные переменные имеют пустое значение. Одна временная переменная, обозначенная как подчеркивание _, предназначена для выбора ячеек (Запоминает, какие ячейки были выбраны).


def _X - значение текущей ячейки будет установлено во временную переменную X (где X может быть значением от 0 до 9)

use _X - текущая ячейка будет установлена ​​на значение из временной переменной X (где X определяет временную переменную от _0 до _9)

inc _X - числовое значение временной переменной будет увеличено на 1. Если временная переменная не содержит числа, результирующее значение переменной будет установлено на 1.

[set] - устанавливает текущую выделенную ячейку для временной переменной _ (только те ячейки, которые выбраны, а не их содержимое)


Вывод

Выводная таблица будет изменена в соответствии со следующими правилами:


Каждая ячейка будет разделена первым символом из набора DELIM.

Если в ячейке есть кавычки или символ, соответствующий одному из разделителей, он будет заключен в кавычки.

Если ячейка содержит символы, которые считаются особыми по отношению к формату таблицы, им будет предшествовать обратная косая черта.

Программа не должна изменять значения отдельных символов в ячейках.

Каждая строка таблицы будет содержать одинаковое количество ячеек. Таблица будет содержать все непустые ячейки. Таблица не будет содержать ни одного пустого последнего столбца.


Детали реализации

Максимальное количество команд - 1000.

Максимальная длина одного заказа - 1000.

Номер команды, идентифицирующий строку или столбец, не может быть меньше 1.

Если одна строка содержит больше ячеек, чем другая строка таблицы, другие строки таблицы будут заполнены (справа) пустыми ячейками, чтобы таблица была выровнена, т.е. каждая строка содержит одинаковое количество ячеек. Выравнивание строк выполняется перед применением первой команды.


Советы по реализации

Реализуйте функцию для получения строки, которая может быть заключена в кавычки и содержит специальные символы, которым предшествует обратная косая черта. Реализуйте функцию для вывода такой строки, соответствующей формату вывода таблицы.

Определите типы данных для ячейки, строки и таблицы.

Реализуйте функции для загрузки таблицы из файла в память. Реализуйте функцию выравнивания таблицы. Реализуйте функцию дампа таблицы (на stdout в целях разработки и отладки, не изменяя исходный файл).

Определите тип данных для общей команды (командные операции и параметры). Реализуйте функции для преобразования текстовой команды в определяемую вами структуру. Реализуйте функцию для преобразования последовательности текстовых команд в последовательность команд.

Определите тип данных для выбора ячеек. Определите временные переменные _, от _0 до _9.

Реализуйте функцию выбора одной ячейки. Реализуйте функции, соответствующие выбранным командам обработки таблиц.

Реализуйте функции других методов выбора. Реализуйте функции, реализующие другие команды.

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

Настройтесь, изучите поведение в самых разных ситуациях. Убедитесь, что память работает правильно с помощью инструмента valgrind.

Выполните команды управления агрегатом. Поэкспериментируйте с разными последовательностями команд. Ищите последовательности команд, например

добавить столбец с пронумерованными строками,

продублируйте таблицу,

удалить все строки, кроме первой, которая содержит выбранную строку,

сортирует таблицу по длине строки в первом столбце и т. д.


Неожиданное поведение

Реагируйте на ошибки программы обычным способом: реагируйте на неожиданные входные данные, формат входных данных или ошибки вызова функции, прерывая программу кратким и кратким сообщением об ошибке на соответствующем выходе и соответствующем коде возврата. Отчеты будут в кодировке ASCII на английском языке.


Примеры вводов и выводов:

$ cat tab.txt

Bill Gates 15000000

Franta Odvedle 15

Pepik Ajtak 42


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


$ ./sps '[1,_];irow;[1,1];set Jmeno;[1,2];set Prijmeni;[1,3];set Plat' tab.txt

$ cat tab.txt

Jmeno Prijmeni Plat

Bill Gates 15000000

Franta Odvedle 15

Pepik Ajtak 42


$ ./sps '[_,_];[max];def _0;[2,3,-,3];use _0' tab.txt

$ cat tab.txt

Jmeno Prijmeni Plat

Bill Gates 15000000

Franta Odvedle 15000000

Pepik Ajtak 15000000


Примечание: легче добиться следующей нумерации. Вот только пример применения команды к отдельным ячейкам: swap будет применяться повторно для каждой выбранной ячейки, что имеет побочный эффект перемещения ячеек на одну вправо:


$ ./sps '[_,3];acol;[1,_];swap [1,4];inc _0;[2,_];swap [2,4];[2,1];use _0;inc _0;[3,_];swap [3,4];[3,1];use _0;inc _0;[4,_];swap [4,4];[4,1];use _0' tab.txt

$ cat tab.txt

 Jmeno Prijmeni Plat

1 Bill Gates 15000000

2 Franta Odvedle 15000000

3 Pepik Ajtak 15000000


Оценка

Основное влияние на окончательную оценку оказывают следующие факторы:


1.переводимость исходного файла,

2.декомпозиция проблемы на подзадачи (подходящие функции, подходящая длина функций и параметры функций),

3.правильный выбор типов данных, создание новых типов

4.правильный функционал:

1.с возможным ограничением размера таблицы (лучше сосредоточиться на реализации функционала, чем на работе с неограниченной таблицей)

2.выделение одной ячейки, одной строки, одного столбца

3.команды для редактирования структуры таблицы

4.команды для поиска в таблице, команды для агрегирования вычислений (сумма, средн.)

5.другие команды

5.обработка условий ошибки.


Report Page