Задания для лабораторных работ
по курсам программирования специальности
”Вычислительные машины, системы, комплексы и сети"
Задание 1: Синтаксический анализ файлов
Вариант А:
Задан файл следующего формата (таблица с разделителями) – база данных пользовательских учетных записей UNIX:
# comment8
8
username:password:UID:GID:comment:home:shell8
username:password:UID:GID:comment:home:shell8
…
username:password:UID:GID:comment:home:shell8
где # - символ начала комментария,
8 - символ разделителя записей,
: - символ разделителя полей записи,
comment – незначащий
комментарий,
username – имя
пользователя (строка),
password – пароль
пользователя (строка),
UID – идентификатор
пользователя (короткое целое),
GID – идентификатор
первичной группы пользователя (короткое целое),
comment – комментарий
к учетной записи пользователя (строка),
home – путь
к домашнему каталогу пользователя (строка),
shell – путь
к начальному интерпретатору пользователя (строка).
Разработать определения типов uid_t, gid_t и структуры struct passwd и следующие функции доступа к записям базы данных пользователей UNIX:
struct passwd *getpwnam(char *username); - поиск записи по имени пользователя username;
struct passwd *getpwuid(uid_t uid); - поиск записи по идентификатору пользователя uid;
void setpwent(void); - открытие базы данных учетных записей пользователей;
struct passwd *getpwent(void); - чтение очередной записи из базы данных учетных записей пользователя;
void endpwent(void); - закрытие базы данных учетных записей пользователей.
Функции должны возвращать указатель на структуру следующего вида:
struct passwd {
char *pw_name;
char *pw_passwd;
uid_t pw_uid;
gid_t pw_gid;
char *pw_gecos;
char *pw_dir;
char *pw_shell;
};
Вариант Б:
Задан файл следующего формата (классическая таблица) – таблица файловых систем UNIX:
# comment8
8
device<sp>mountpoint<sp>fstype<sp>options<sp>freq<sp>passno8 device<sp>mountpoint<sp>fstype<sp>options<sp>freq<sp>passno8
…
device<sp>mountpoint<sp>fstype<sp>options<sp>freq<sp>passno8
где # - символ начала комментария,
8 - символ разделителя записей,
<sp> – пробельный символ (совокупность
символов пробела и символов табуляции в любом количестве и сочетании),
device – устройство
(строка),
mountpoint – точка
монтирования (строка),
fstype – тип
файловой системы (строка),
options – опции
монтирования (строка),
freq – частота
резервного копирования (целое),
passno – порядковый
номер монтирования (целое).
Разработать определение структуры struct mntent и следующие функции доступа к записям таблица файловых систем UNIX:
FILE *setmntent( const char *filename,
const char *type); - открытие таблицы файловых систем, располагающейся в файле filename;
struct mntent *getmntent(FILE *fp); - чтение очередной записи из открытой таблицы fp файловых систем;
int endmntent(FILE *fp); - закрытие таблицы файловых систем, располагающейся в файле filename;
int addmntent( FILE *fp,
const struct mntent *mnt); - добавление новой записи mnt в конец открытой таблицы fp файловых систем.
Функции должны возвращать/принимать указатель на структуру следующего вида:
struct mntent {
char *mnt_fsname;
char *mnt_dir;
char *mnt_type;
char *mnt_opts;
int mnt_freq;
int mnt_passno;
};
Вариант В:
Задан файл следующего формата – конфигурационный файл UNIX:
# comment8
8
<sp>parameter<sp>:<sp>value<sp>8
<sp>parameter<sp>:<sp>value<sp>8
…
<sp>parameter<sp>:<sp>value<sp>8
или файл следующего формата – конфигурационный файл UNIX:
# comment8
8
<sp>parameter<sp>=<sp>value<sp>8
<sp>parameter<sp>=<sp>value<sp>8
…
<sp>parameter<sp>=<sp>value<sp>8
или файл следующего формата – конфигурационный файл UNIX:
# comment8
8
<sp>parameter<sp>value<sp>8
<sp>parameter<sp>value<sp>8
…
<sp>parameter<sp>value<sp>8
где # - символ начала комментария,
8 - символ разделителя записей,
: или = - символ разделителя имен и значений конфигурационных
параметров,
<sp> – пробельный символ (совокупность
символов пробела и символов табуляции в любом количестве [включая ноль] и
сочетании),
parameter – имя
конфигурационного параметра (строка),
value – значение
конфигурационного параметра (строка).
Разработать определение структуры struct cfgent и следующие функции доступа к записям конфигурационных файлов UNIX:
FILE *setcfgent( const char *filename,
const char separator,
const char *type); - открытие конфигурационного файла filename, использующего разделитель имен и значений конфигурационных параметров separator;
struct cfgent *getcfgnam(char *parameter); - поиск конфигурационной записи по имени параметра parameter;
struct cfgent *getcfgent(FILE *fp); - чтение очередной конфигурационной записи из открытого конфигурационного файла fp;
int endсfgent(FILE *fp); - закрытие конфигурационного файла fp;
int addсfgent( FILE *fp,
const struct cfgent *cfg); - добавление новой конфигурационной записи cfg в конец открытого конфигурационного файла fp.
Функции должны возвращать/принимать указатель на структуру следующего вида:
struct cfgent {
char *cfg_name;
char *cfg_value;
};
Задание 2: Динамические массивы
Вариант А:
Упражнение 2.1а:
Разработать функции, организующие чтение файла учетных записей пользователей и размещение информации в виде динамического массива структур struct passwd.
Упражнение 2.2а:
Разработать функции, организующие сохранение информации из динамического массива структур struct passwd в файл учетных записей пользователей.
Вариант Б:
Упражнение 2.1б:
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.