Практические задания по дисциплинам «Программирование» и «Языки программирования» семестр 2 2012/2013 учебный год

advertisement
Федеральное агентство связи
ФГОБУ ВПО «СибГУТИ»
Кафедра вычислительных систем
Практические задания по дисциплинам
«Программирование» и «Языки программирования»
семестр 2
2012/2013 учебный год
Преподаватели:
Доцент Кафедры ВС, к.т.н. – Поляков Артём Юрьевич
Старший преподаватель Кафедры ВС – Перышкова Евгения Николаевна
Лабораторная работа №3
Внешняя сортировка данных
ЦЕЛЬ РАБОТЫ
Получение навыков проектирования программ, состоящих из нескольких файлов с
исходным кодом, а также опыта работы с бинарными файлами. Изучение и практическая
реализация алгоритмов внешней сортировки.
МЕТОДИЧЕСКИЕ УКАЗАНИЯ
2. Бинарные файлы
2.1. Организация бинарных файлов
Файлы могут быть разделены на текстовые и бинарные. Текстовые содержат только
символы, распознаваемые текстовыми редакторами. Двоичный (бинарный) файл — в широком
смысле: последовательность произвольных байтов. В узком смысле слова двоичные файлы
противопоставляются текстовым файлам. При этом с точки зрения технической реализации на
уровне аппаратуры, текстовые файлы являются частным случаем двоичных файлов, и, таким
образом, в широком значении слова под определение «двоичный файл» подходит любой файл.
Для работы с бинарными файлами с языке СИ удобно использовать функции: fread и fwrite.
Они позволяют читать и записывать блоки данных любого типа. Для них имеет значение лишь
адрес, с которого начинается блок и количество байт, которое нужно записать. Ниже приведены
прототипы этих функций:
size_t fread (void * buffer, size_t size, size_t count, FILE * fp);
size_t fwrite (const void * buffer, size_t size, size_t count, FILE * fp);
Буфер (buffer) – указатель на область памяти, в которую (из которой) будут
прочитаны (записаны) данные из (в) файла (файл). Счетчик – count – определяет, сколько
считывается или записывается элементов данных, причем длина каждого элемента в байтах
равна size. Функция fread возвращает количество прочитанных элементов, если достигнут конец
файла или произошла ошибка, то возвращаемое значение может быть меньше, чем счетчик.
Функция fwrite возвращает количество записанных элементов. Если ошибка не произошла, то
возвращаемый результат будет равен значению счетчика. Одним из самых полезных применений
функций fread() и fwrite() является чтение и запись данных пользовательских типов, особенно
структур. Например:
1
Листинг 9
#include <stdio.h>
int main()
{
FILE * fp;
char filename[] = "some_file";
struct some_struct buff[64];
fp =fopen(filename, "wb")
if( fp == NULL ){
printf("Error opening file %s\n",filename);
}else{
fwrite(buff, sizeof(struct some_struct), 64, fp);
fclose(fp);
}
fp =fopen(filename, "rb")
if( fp == NULL ){
printf("Error opening file %s\n",filename);
}else{
fread(buff, sizeof(struct some_struct), 64, fp);
fclose(fp);
}
}
2.2. Позиционирование в потоке
Важным отличием бинарных файлов от текстовых является то, что они представляют собой
последовательность элементов одинакового размера. Это позволяет:
1) быстро локализовать необходимый элемент (запись) в файле;
2) изменить содержимое произвольной записи без необходимости перемещения остальных
элементов.
Файловый поток, наряду с другими параметрами, характеризуется позицией чтения/записи.
В ОС GNU\Linux это просто счетчик байтов (смещение) относительно начала файла.
Файлы, поддерживающие возможность произвольного изменения позиции чтения/записи
называются файлами с произвольным доступом. Рассмотрим более подробно функции,
позволяющие осуществлять произвольный доступ к содержимому файла:
long int ftell (FILE *stream);
Функция ftell возвр текущую позицию в файле. Она может завершиться с ошибкой, если файл
не поддерживает позиционирование или если позиция не может быть представлена как long int. В
случае ошибки возвр – 1.
int fseek (FILE *stream, long int offset, int whence);
Функция fseek используется для смены позиции чтения/записи в потоке. Значение whence
должно быть одной из констант SEEK_SET, SEEK_CUR или SEEK_END, которые соответствуют
первому, текущему или последнему байту файла. fseek устанавливает позицию чтения/записи
смещаясь на offset байт от позиции, указанной параметром whence.
Например, в предыдущем примере возможен доступ только к структурам с11 по 20.
2
Листинг 10
#include <stdio.h>
int main()
{
FILE * fp;
char filename[] = "some_file";
struct some_struct buff[64];
int ret;
fp =fopen(filename, "wb")
if( fp == NULL ){
printf("Error opening file %s\n",filename);
}else{
fwrite(buff, sizeof(struct some_struct), 64, fp);
fclose(fp);
}
fp =fopen(filename, "rb")
if( fp == NULL ){
printf("Error opening file %s\n",filename);
}else{
// Смещение на 10 структурных элементов от начала файла
ret == fseek(fp, sizeof(struct some_struct)*10, SEEK_SET);
// Если смещение успешное
if( ret == sizeof(struct some_struct)*10){
// Чтение 10 последовательных элементов (11 – 20)
fread(buff, sizeof(struct some_struct), 10, fp);
}
fclose(fp);
}
}
3
ЗАДАНИЯ
Общая информация
Лабораторная работа предполагает выполнение задания первого или второго уровня
сложности. Если студент претендует на отличную оценку на экзамене по результатам работы в
семестре необходимо выбирать задание второго уровня сложности.
Номер варианта выбирается в соответствии с номером студента в журнале
преподавателя (необходимо уточнить) согласно следующему выражению на языке СИ:
(n%(S+1)) + ((n/(S+1))>0), где n – номер студента по журналу, S – количество заданий.
В отчете о лабораторной работе должен присутствовать список тестовых входных данных,
на которых проверялась корректность работы программы, и полученные результаты. Набор
тестов должен обеспечивать проверку поведения программы для всех классов входных данных:
некорректный путь файла, превышение допустимой длины пути, допустимый путь, который не
удовлетворяет указанным в задании условиям, допустимый путь, удовлетворяющий условиям.
Входными данными для разрабатываемых программ является бинарный файл, содержащий
записи следующего формата:
struct record{
char name[32], lname[32], pathr[32];
int age;
float height; // в метрах
float weight; // в килограммах
};
I уровень сложности
Необходимо выполнить сортировку записей, расположенных в бинарном файле, по
указанному в задании ключу заданным смешанным алгоритмом.
Варианты заданий, имеющие первый уровень сложности:
№
варианта
Алгоритм внешней сортировки
Алгоритм подготовки
начальных серий
Ключ
сортировки
1
Простая (двухфазная) сортировка
слиянием (straight merge)
Сортировка методом пузырька
(bubble sort) или быстрая
сортировка (quick sort)
name
2
Метод сбалансированных слияний
(balanced merge)
Сортировка методом пузырька
(bubble sort) или быстрая
сортировка (quick sort)
lname
(natural sort)
Сортировка методом пузырька
(bubble sort) или быстрая
сортировка (quick sort)
pathr
4
Сбалансированное
многопутевое слияние
(balanced multiway merging)
Сортировка методом пузырька
(bubble sort) или быстрая
сортировка (quick sort)
age
5
Простая (двухфазная) сортировка
слиянием (straight merge)
Сортировка вставками (insertion
sort) или пирамидальная
сортировка (heap sort)
height
6
Метод сбалансированных слияний
(balanced merge)
Сортировка вставками (insertion
sort) или пирамидальная
weight
3
Естественная сортировка
4
сортировка (heap sort)
(natural sort)
Сортировка вставками (insertion
sort) или пирамидальная
сортировка (heap sort)
name
8
Сбалансированное
многопутевое слияние
(balanced multiway merging)
Сортировка вставками (insertion
sort) или пирамидальная
сортировка (heap sort)
lname
9
Простая (двухфазная) сортировка
слиянием (straight merge)
Сортировка выбором (selection
sort) или сортировка расческой
(comb sort)
pathr
10
Метод сбалансированных слияний
(balanced merge)
Сортировка выбором (selection
sort) или сортировка расческой
(comb sort)
age
(natural sort)
Сортировка выбором (selection
sort) или сортировка расческой
(comb sort)
height
Сбалансированное
многопутевое слияние
(balanced multiway merging)
Сортировка выбором (selection
sort) или сортировка расческой
(comb sort)
weight
7
11
12
Естественная сортировка
Естественная сортировка
5
II уровень сложности
Необходимо выполнить сортировку записей, расположенных в бинарном файле, по
указанному в задании сложному ключу заданным смешанным алгоритмом.
Варианты заданий, имеющие второй уровень сложности:
№
варианта
Алгоритм внешней сортировки
Алгоритм подготовки
начальных серий
Ключ
сортировки
1
Естественная сортировка
(natural sort)
Выбор с замещением
(replacement selection)
name, lname,
age
2
Метод сбалансированных слияний
(balanced merge)
Выбор с замещением
(replacement selection)
name, lname,
height
3
Естественная сортировка
(natural sort)
Выбор с замещением
(replacement selection)
name, lname,
age
4
Сбалансированное
многопутевое слияние
(balanced multiway merging)
Выбор с замещением
(replacement selection)
name, lname,
height
Быстрая сортировка (quick sort)
или выбор с замещением
(replacement selection)
name, lname,
age
Пирамидальная сортировка
(quick sort) или выбор с
замещением (replacement
selection)
name, lname,
height
5
6
Многофазная сортировка
(polyphase merging)
Каскадная сортировка
(cascade merge sort)
7
Простая (двухфазная) сортировка
слиянием (straight merge)
Выбор с замещением
(replacement selection)
age, height,
name
8
Метод сбалансированных слияний
(balanced merge)
Выбор с замещением
(replacement selection)
age, height,
lname
Естественная сортировка
Выбор с замещением
(replacement selection)
age, height,
name
Выбор с замещением
(replacement selection)
age, height,
lname
Быстрая сортировка (quick sort)
или выбор с замещением
(replacement selection)
age, height,
name
Пирамидальная сортировка
(quick sort) или выбор с
замещением (replacement
selection)
age, height,
lname
9
10
11
12
(natural sort)
Сбалансированное
многопутевое слияние
(balanced multiway merging)
Многофазная сортировка
(polyphase merging)
Каскадная сортировка
(cascade merge sort)
6
Download