lab14 (1080940)
Текст из файла
Лабораторная работа 14
Ввод, сортировка и двоичный поиск в массиве структур.
Англо-русский словарь построен в виде массива структур Dictionary. Структура содержит английское слово и соответствующее ему русское слово. Максимальный размер словаря – 100 пар слов.
Разработать программу, которая:
-
обеспечивает формирование словаря;
-
записывает словарь, отсортированный по английским значениям слов, в файл;
-
обеспечивает просмотр словаря;
-
выполняет перевод слов с английского на русский, используя для поиска слова в словаре метод двоичного поиска в отсортированном массиве;
-
выполняет перевод слов с русского на английский, используя для поиска слов в словаре метод перебора;
Программа должна обеспечивать диалог с помощью меню.
Начальное число слов в словаре равно 20.
Для исключения проблем, связанных с вводом кириллицы, добавьте в программу следующую функцию, которая перегружает операцию >> для стандартного ввода (ее надо включить в файл PrintCyr.h.
istream & operator >> (istream & in, char* s) {
string temp;
cin>>temp;
unsigned int n=temp.size();
temp.copy(add,n); add[n]='\0';
OemToChar(add,add);
strncpy(s,add,n+1);
return in;
}
Шаги разработки программы:
-
Определение состава и способа представления исходных данных, результатов и промежуточных данных.
Исходные данные. Так как максимальный размер словаря по условию задачи ограничен, то для его хранения в оперативной памяти можно использовать нединамический массив из 100 элементов типа Dictionary.
struct Dictionary {
char engl[l_word]; // слово по-английски
char rus[l_word]; // слово по-русски
};
Максимальная длина русских и английских слов l_word = 30 символам. Словарь хранится в текстовом файле. Элементы массива структур Dictionary будем записывать в файл последовательно, начиная с нулевого. При этом поля структуры записываются в виде отдельных строк, т.е. каждое слово должно заканчиваться символом ‘\0’.
Результаты. Программа выводит слово-перевод и число шагов, затраченных на его поиск в словаре.
-
Разработка алгоритма решения задачи.
При программировании этой задачи уделим дополнительное внимание разбиению на функции и спецификации их интерфейсов. Например, логично оформить в виде функции каждую операцию со словарем (формирование, поиск, добавление и удаление элемента), поскольку они представляют собой законченные действия.
Интерфейс пользователя организуем в виде простейшего меню, которое будет выводиться на экран после каждого действия. В стандарт C++ не входят функции позиционирования курсора на экране, управления цветом и работы с экраном в графическом режиме, поскольку они зависят от операционной системы. Поэтому меню представим в виде пронумерованного перечня возможных действий пользователя, красиво размещенного на экране, а выбор действия будем выполнять путем ввода его номера в перечне.
Будем исходить из того, что все функции должны быть независимы, чтобы изменения в одной функции не могли влиять на поведение другой. Для этого всё, что функциям необходимо получать извне, будем передавать им через параметры.
Прежде всего определим интерфейс нашей программы. В соответствии с заданием, кажется логичным предоставить пользователю следующие возможности:
-
добавление слов в словарь;
-
удаление слов из словаря;
-
корректировка слов;
-
перевод слов с английского на русский;
-
перевод слов с русского на английский;
-
просмотр словаря (чтение из файла и вывод на экран);
-
вывод словаря в файл;
-
выход.
Каждый пункт этого меню, кроме последнего, оформим в виде отдельной функции. Определим прототипы предложенных функций.
Меню. Эта функция (в качестве подсказки) выводит пронумерованный перечень возможных действий пользователя и выполняет ввод номера выбранного действия. Это число она должна вернуть в вызвавшую функцию.
int Menu( );
Добавление слов в словарь. Чтобы добавить элемент Dictionary в словарь, надо знать пару слов и определить место, куда вставлять элемент, чтобы массив оставался отсортированным. Поиск места вставки выполним внутри функции, а в функцию передадим указатель на начало массива dict[100] и собственно добавляемый элемент pair. Назовем ее add_w (имя add мы уже использовали для глобальной переменной в файле PrintCyr.h).
void add_w(Dictionary * dict, const Dictionary & pair);
По аналогии определите прототипы остальных функций самостоятельно.
-
Кодирование и тестовые примеры.
В этой работе удобно использовать технологию создания программы «сверху вниз»: сначала отладить главную функцию, а затем постепенно добавлять к ней остальные. На месте еще не добавленных функций обычно ставятся так называемые заглушки — функции, единственный действием которых является вывод сообщения о том, что эта функция была вызвана. Первой добавляемой функцией должна быть функция Menu.
При использовании меню главная функция сильно упрощается: она периодически вызывает меню, анализирует запрошенный код операции и вызывает функцию, которая выполняет эту операцию. При выборе операции с номером 7 выполнение программы завершается.
int main(){
Dictionary dict[100]; //массив структур для хранения словаря в оперативной памяти
int num_w=0; //фактическое число записей в словаре
while (true) {
switch (menu()) {
case 1:add_w(dict, num_w); break;
case 2:
case 3:
case 4: break;
case 5: print_dict(dict,num_w); break;
case 6: break;
case 7: return 0;
default: cout<<" Надо вводить число от 1 до 7"<<endl; break;
}
}
return 0;
}
После отладки Menu(), запрограммируйте и отладьте функции add_w() и print_dict().
add_w() добавляет записи в массив структур, а print_dict() распечатывает массив из оперативной памяти. Выберите наиболее эффективный способ сортировки после добавления записи.
СТРУКТУРЫ
Структуры в C++ обладают практически теми же возможностями, что и классы, но чаще их применяют просто для логического объединения связанных между собой данных. В структуру, в противоположность массиву, можно объединять данные различных типов.
Например, требуется обрабатывать информацию о расписании работы конференц-зала, и для каждого мероприятия надо знать время, тему, фамилию организатора и количество участников. Поскольку вся эта информация относится к одному событию, логично дать ему имя, чтобы впоследствии можно было к нему обращаться. Для этого описывается новый тип данных (обратите внимание на то, что после описания стоит точка с запятой):
struct Event {
int hour, min;
char theme[100], name[100];
int num; };
Имя этого типа данных — Event. Можно описать переменные этого типа точно так же, как переменные встроенных типов, например:
Event el, e2[10]; // структура и массив структур
Если структура используется только в одном месте программы, можно совместить описание типа с описанием переменных, при этом имя типа можно не указывать:
struct {
int hour, min;
char theme[100], name[100];
int num; } el, e2[10];
Переменные структурного типа можно размещать и в динамической области памяти, для этого надо описать указатель на структуру и выделить под нее место:
Event *pe = new Event; // структура
Event *pm = new Event[m]: // массив структур
Элементы структуры называются полями. Поля могут быть любого основного типа, массивом, указателем, объединением или структурой. Для обращения к полю используется операция выбора («точка» для переменной и -> для указателя), например:
el.hour = 12; el.min= 30;
strncpy(e2[0].theme,"Выращивание кактусов в условиях Крайнего Севера", 99);
ре-> num = 30; // или (*pe).num = 30;
pm[2].hour = 14; // или (*(pm + 2)).hour = 14;
Структуры одного типа можно присваивать друг другу:
*ре = el; pm[l] = el; pm[4] = e2[0];
Но присваивание - это и все, что можно делать со структурами целиком. Другие операции, например сравнение на равенство или вывод, не определены. Впрочем, пользователь может задать их самостоятельно, поскольку структура является видом класса, а в классах можно определять собственные операции. Мы рассмотрим эту тему во втором семестре.
Ввод/вывод структур, как и массивов, выполняется поэлементно. Вот, например, как выглядит ввод и вывод описанной выше структуры el с использованием классов ввода-вывода (<iostream.h>):
cin >> el.hour >> el.min;
cin. getline (el. theme, 100);
cout << el.hour << ' ' << el.min << ' ' << el.theme << endl;
Структуры (но, конечно, не динамические) можно инициализировать перечислением значений их элементов:
Event е3 = {12, 30, "Выращивание кактусов ", "Петрова",25};
Характеристики
Тип файла документ
Документы такого типа открываются такими программами, как Microsoft Office Word на компьютерах Windows, Apple Pages на компьютерах Mac, Open Office - бесплатная альтернатива на различных платформах, в том числе Linux. Наиболее простым и современным решением будут Google документы, так как открываются онлайн без скачивания прямо в браузере на любой платформе. Существуют российские качественные аналоги, например от Яндекса.
Будьте внимательны на мобильных устройствах, так как там используются упрощённый функционал даже в официальном приложении от Microsoft, поэтому для просмотра скачивайте PDF-версию. А если нужно редактировать файл, то используйте оригинальный файл.
Файлы такого типа обычно разбиты на страницы, а текст может быть форматированным (жирный, курсив, выбор шрифта, таблицы и т.п.), а также в него можно добавлять изображения. Формат идеально подходит для рефератов, докладов и РПЗ курсовых проектов, которые необходимо распечатать. Кстати перед печатью также сохраняйте файл в PDF, так как принтер может начудить со шрифтами.















