ЛР1_ДЗ (Архив готовых лабораторных работ для ИУ)

2018-01-11СтудИзба

Описание файла

Файл "ЛР1_ДЗ" внутри архива находится в следующих папках: Архив готовых лабораторных работ для ИУ, 1, задания. Документ из архива "Архив готовых лабораторных работ для ИУ", который расположен в категории "". Всё это находится в предмете "информатика" из 2 семестр, которые можно найти в файловом архиве МГТУ им. Н.Э.Баумана. Не смотря на прямую связь этого архива с МГТУ им. Н.Э.Баумана, его также можно найти и в других разделах. Архив можно найти в разделе "лабораторные работы", в предмете "информатика" в общих файлах.

Онлайн просмотр документа "ЛР1_ДЗ"

Текст из документа "ЛР1_ДЗ"

Лабораторная работа 1дз

База данных сотрудников

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

Так как размер БД неограничен и в процессе эксплуатации может меняться, то для ее хранения в оперативной памяти (ОП) в программе следует использовать односвязный линейный список.

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

struct Node {

Data d;

Node *next;

};

Node *beg;

В качестве элемента списка могут использоваться как базовые типы данных, так и типы данных, определяемые пользователем. Для того, чтобы операции, относящиеся к преобразованию списка из элементов типа struct Node, не зависели от типа данных информационной части, в программу следует включить оператор препроцессора #define, который присваивал бы реальномуй типу имя Data. Для разрабатываемой программы это выглядит так:

#define Man Data

const int l_name = 20;

struct Man {

char name[l_name];

int birth_year;

float pay;

};

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

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

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

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

1 – добавление сотрудника;

2 – удаление сотрудника;

3 – поиск сотрудника;

4 – корректировка сведений о сотруднике;

5 – вывод БД на экран;

6 – вывод БД в файл;

7 – выход.

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

Добавление сотрудника. Чтобы добавить запись о сотруднике в БД, надо знать, кого и куда добавлять. Все обращения к односвязному списку реализуются через указатель на его начало. Если список пуст, то этот указатель равен NULL . Мы будем всегда добавлять запись в конец списка. Для реализации этих действий в функцию надо передать указатель на начало списка и ссылку на добавляемые данные. Чтобы функция могла добавлять в пустой список, она должна возвращать указатель на начало списка.

Node* add(Node* beg, const Data &d_el);

Поиск сотрудника. В условии задачи сказано, что поиск должен выполняться по заданным критериям. Предположим, что нам могут потребоваться:

  • сведения об отдельном сотруднике по его фамилии;

  • сведения о сотрудниках старше заданного года рождения;

  • сведения о сотрудниках, имеющих оклад больше заданного.

Алгоритм функции поиска – это ее внутреннее дело, поэтому извне ей передается только указатель на начало списка, а функция будет сама запрашивать значение критерия поиска:

void find_man(Node* beg);

Для поиска по конкретному критерию в функции find_man естественно использовать перегруженные функции, которые будут вызываться из подменю Поиск:

Node* find(Node* beg, char* name, Node** prev);

int find(Node* beg, int birth_year);

int find(Node* beg, float pay);

Функции поиска выполняют поиск и вывод сведений о сотрудниках, удовлетворяющих критерию поиска.

Первая функция выполняет поиск по фамилии. Поиск элемента списка по фамилии потребуется в нашей программе и при корректировке списка, и при удалении элемента. Чтобы была возможность использовать одну и ту же функцию для этих целей, функция должна возвращать указатель на найденный элемент или 0, если элемент не найден. Кроме того, при удалении надо будет связать между собой предыдущий и следующий по отношению к удаляемому узлы. Так как список односвязный, то для получения адреса предыдущего узла в список параметров добавлен указатель на этот узел, который формируется внутри функции поиска и должен возвращаться в вызывающую функцию. Он передается по адресу, как указатель на указатель.

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

Удаление сотрудника. Чтобы удалить сотрудника из БД, нужно знать, из какой базы и какого сотрудника удалять.

Чтобы удалить элемент из списка, надо предварительно найти этот элемент, то есть путем просмотра списка получить указатель на него. Запрос фамилии будет выполняться внутри функции удаления, поэтому извне в неё должен передаваться только указатель на начало списка, который хранит в ОП базу данных. Функция должна возвращать указатель на начало списка, чтобы можно было бы удалять и первый элемент:

Node* remove(Node* beg);

Запрос фамилии требуется и при удалении сотрудника, и при корректировке сведений, поэтому его также оформим в виде совсем небольшой вспомогательной функции. Назовем ее get_name (впрочем, без неё можно обойтись, это дело вкуса):

void get_name(char* name);

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

int edit(Node* beg);

В рассматриваемой БД корректировать будем только оклад.

Вывод БД на экран. Прототип функции очевиден:

void print_dbase(Node* beg);

Вывод на экран выполним таким образом, чтобы колонка с фамилиями сотрудников была выровнена по левому краю, а колонки с годом рождения и окладом – по правому краю (независимо от длины фамилии и размера оклада).

Вывод БД в файл. В файле нужно хранить только данные элементов списка (указатели записывать в файл не имеет смысла, так как они хранят адреса ОП, а при повторной загрузке БД из файла эти адреса могут быть уже заняты и поэтому список будет формироваться в другой области ОП).

Для хранения БД в программе, в соответствии с заданием, используем текстовый файл. Каждая строка файла будет содержать фамилию, год рождения и оклад одного сотрудника, разделенные пробелом. Например, если фамилия сотрудника Иванов, то в файл мы запишем шесть символов плюс пробел, хотя в ОП под поле name структуры Man выделено l_name = 20 байтов. Каждая строка, естественно, должна завершаться символом ‘\n’ (он вводится при нажатии клавиши <Enter>). Эти соглашения о формате записи будут использоваться при чтении БД из файла.

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

int write_dbase(char* filename, Node* beg);

Чтение БД из файла и формирование списка. Эта функция будет автоматически (без использования меню) выполняться при запуске программы. В качестве параметра она использует имя файла и возвращает указатель на начало списка:

Node* read_dbase(char* filename);

Так как при чтении текста из файла не требуется преобразование кодировки, то для чтения записей о сотрудниках удобно использовать функции fin.getline (чтение строки из потока) и strtok (выборка слов из строки), например:

char buf[l_record];

while (fin.getline(buf,l_record))

{

strcpy(d_el.name,strtok( buf, " " ));

d_el.birth_year = atoi(strtok(NULL," "));

d_el.pay = atof(strtok(NULL," "));

}

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

Data* get_data( );

int menu();

Использование кириллицы. Так как MS DOS использует кодировку ASCII, а MS Windows – ANSI, то возможны проблемы, связанные с использованием в программе кириллицы. Редактор компилятора и текстовые редакторы, которые могут быть использованы для создания файла БД, работают под Windows с кодировкой ANSI, а ввод и вывод данных в окно MS DOS работают с кодировкой ASCII.

Поэтому для нормальной работы с консольным приложением для внутреннего представления текста нужно использовать кодировку ANSI, при вводе данных выполнять преобразование из ASCII в ANSI, а при выводе – обратное преобразование. Для этих целей в программу нужно включить заголовочный файл “PrintCyr. h”. Этот файл создан для удобства выполнения лабороторных работ и его возможности ограничены: операция вывода в поток << перегружена для типов char* и string, а операция ввода из потока >> перегружена только для типа char*.

Поэтому при вводе кириллицы с клавиатуры справа от >> следут всегда использовать массив символов, например:

char buf[20];

cout<<"Введите следующие данные о сотруднике:"<<endl;

cout<<"фамилия <Enter>"<<endl;

cin>>buf;

strcpy(d_el->name,buf);

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

Использование при вводе буфера char buf[] дает возможность реализовать «защиту от дурака»: если пользователь введет неверный режим или нечисловые символы там, где этого делать нельзя, то программа имеет возможность корректно обработать эту ситуацию, посмотрев, что ввел пользователь.

В качестве эксперимента в функции menu замените

cin>>buf;

if(!(option=atoi(buf)))

на вроде бы очевидное

cin>>option;

и вместо числа введите букву. Посмотрите, что получится и объясните, почему так получилось?

Оператор cin.clear(); в функции find_man предназначен для очистки буфера входного потока, так как операция >> при вводе чисел не будет извлекать символы (которые могут быть введены по ошибке вместо чисел) из входного потока и эти символы возможно будут считываться в каком-то другом месте прогрпммы. Это может привести к неожиданным результатам, поэтому оператор cin.clear(); следует включать в программу для большей надежности, а еще лучше всегда контролировать ввод данных пользователем, как это сделано при вводе номера операции в меню.

В качестве эксперимента закомментируйте cin.clear(); запустите программу, выберите операцию 3 – поиск, затем поиск по году рождения и вместо цифр введите буквы. Посмотрите, что получится и попробуйте объяснить увиденное.

Сохраните функцию menu и операторы вызова функцию menu из main() в своей библиотеке с целью их использования в качестве образца в других лабораторных работах (там у вас уже должна быть функция для печати матриц).

На примере этой работы вы можете потренироваться и оценить технологию создания программы методом «сверху вниз» (её можно использовать параллельно с разработкой алгоритма методом пошаговой детализации): сначала отладить главную функцию, а затем постепенно добавлять к ней остальные. На месте еще не добавленных функций обычно ставятся так называемые «заглушки» - функции, единственным действием которых является вывод сообщения о том, что эта функция вызвана.

Свежие статьи
Популярно сейчас
Зачем заказывать выполнение своего задания, если оно уже было выполнено много много раз? Его можно просто купить или даже скачать бесплатно на СтудИзбе. Найдите нужный учебный материал у нас!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5173
Авторов
на СтудИзбе
437
Средний доход
с одного платного файла
Обучение Подробнее