Практика 5 — различия между версиями

Материал из SEWiki
Перейти к: навигация, поиск
 
(не показана одна промежуточная версия этого же участника)
Строка 20: Строка 20:
 
Текстовый файл: каждый элемент списка на новой строке; числа x и y разделены пробелом
 
Текстовый файл: каждый элемент списка на новой строке; числа x и y разделены пробелом
  
 +
=== Бонус ===
 
Бинарный файл: каждое число занимает не больше 3 байт
 
Бинарный файл: каждое число занимает не больше 3 байт
  
Строка 31: Строка 32:
 
Которая проходит по всему листу и вызывает f для каждого узла. Соответственно для печати всего листа:
 
Которая проходит по всему листу и вызывает f для каждого узла. Соответственно для печати всего листа:
  
  applyFunctionToEachNode(list, &functionThatPrintSingleNode)
+
  applyFunctionToEachNode(list, &functionThatPrintsSingleNode)
  
 
'''NOTE:''' Глобальные переменные использовать '''запрещено'''.
 
'''NOTE:''' Глобальные переменные использовать '''запрещено'''.

Текущая версия на 13:13, 15 октября 2014

Задание выполняется на базе предыдущего

Написать программу, которая работает с командной строкой (ввод всегда без ошибок)

Входные параметры

./main {loadtxt | loadbin} infile {savetxt | savebin} outfile
./main {loadtxt | loadbin} infile print “fmt”
./main {loadtxt | loadbin} infile count
  1. loadtxt загрузить из текстового файла
  2. loadbin загрузить из двоичного файла
  3. savetxt записать в текстовый файл
  4. savebin записать в двоичный файл
  5. print “fmt” вывести список на экран в формате fmt (пример fmt: “(%d %d)”, “[%#x %#x]\n”)
  6. count вывести размер списка

Замечания

Файлы всегда правильного формата

Текстовый файл: каждый элемент списка на новой строке; числа x и y разделены пробелом

Бонус

Бинарный файл: каждое число занимает не больше 3 байт

Hint: в структуре тип int x; при чтение/записи надо работать с битами с помощью &, |, <<, >>

Требование по реализации count и print

Использовать указатель на функцию. Для этого реализуем вспомогательную функцию:

void applyFunctionToEachNode( intrusive_list_t* l, void (*f)(...), ...)

Которая проходит по всему листу и вызывает f для каждого узла. Соответственно для печати всего листа:

applyFunctionToEachNode(list, &functionThatPrintsSingleNode)

NOTE: Глобальные переменные использовать запрещено.