Разработка консольного приложения на языке С++
Создание базы данных на языке программирования С++ с элементами ее администрирования. Теоретические основы создания программ. Описание разработанной структуры массива данных. Схемы алгоритмов используемых функций. Логика работы программы и ее листинг.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | курсовая работа |
Язык | русский |
Дата добавления | 21.02.2016 |
Размер файла | 1,0 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
Размещено на http://www.allbest.ru/
КУРСОВАЯ РАБОТА
по курсу: "Основы алгоритмизации и программирования"
на тему: "Разработка консольного приложения на языке С++"
Содержание
- Введение
- 1. Теоретические основы
- 2. Описание программы
- 2.1 Описание разработанной структуры
- 2.2 Логика работы программы. Схема алгоритма функции main()
- 3. Руководство пользователя
- Заключение
- Литература
- Приложение 1. Листинг программы
- Приложение 2. Распечатки результатов
Введение
Данная работа посвящена созданию своего рода базы данных на языке программирования С++. База данных содержит информацию о сотрудниках этого предприятия, а именно: фамилию сотрудника и его заработную плату. Предусмотрена возможность, как создания новой базы, так и возможность работать с базой, ранее записанной в файл. Для работы с базой данных в программе предусмотрено меню, содержащее различные операции: добавить сотрудника, удалить сотрудника, сохранить базу данных в файл и т. д. Программа выполнена в виде консольного приложения.
Постановка задачи: написать программу, в которой необходимо создать структуру, элементами которой являются фамилия сотрудника и его зарплата. Объявить массив данных о сотрудниках типа структуры и ввести значения его элементов. Определить суммарный заработок сотрудников и сотрудника, у которого максимальная зарплата. Предусмотреть меню. Результаты работы программы записать в файл.
1. Теоретические основы
Для решения данной задачи использовались знания из области базовых средств языка С++: типы данных, переменные, указатели, условные операторы, операторы циклов, массивы, перечисления и структуры.
Переменная - это именованная область памяти, в которой хранятся данные определенного типа. Имя служит для обращения к области памяти, в которой хранятся данные. Тип данных определяет:
- внутреннее представление данных в памяти компьютера;
- множество значений, принимаемых величинами этого типа;
- операции и функции, которые к ним можно применять.
Все типы языка С++ можно разделить на основные (стандартные) и составные. В языке С++ определено 6 основных типов данных:
- int (целый):
- char (символьный);
- wchar_t (расширенный символьный);
- bool (логический);
- float (вещественный);
- double (вещественный с двойной точностью);
Существуют 4 спецификатора типа, уточняющих внутреннее представление и диапазон значений стандартных типов:
- short (короткий);
- long (длинный);
- signet (знаковый);
- unsigned (беззнаковый);
Кроме перечисленных, к основным типам данных относится тип void, но множество значений этого типа пусто. Он используется для определения функций, которые не возвращают значения, для указания пустого списка аргументов функции, как базовый тип для указателей.
Общий вид оператора описания переменных:
[класс памяти] [const]тип имя [инициализатор],
где:
- необязательный класс памяти определяет время жизни и область видимости программного объекта (в частности, переменной). Может принимать одно из значений auto, extern, static, register. Если класс памяти не указан явным образом, он определяется компилятором исходя из контекста объявления;
- модификатор const показывает, что значение переменной изменять нельзя. Такую переменную называют именованной константой, или просто константой;
- инициализатор используется для присваивания начального значения переменной.
На основе стандартных типов программист может вводить описание составных типов. К ним относятся массивы, указатели, ссылки, перечисления, структуры, объединения.
Массивом называется конечная именованная последовательность однотипных величин. Описание массива в программе отличается от описания простой переменной наличием после имени квадратных скобок, в которых задается количество элементов массива (размерность). Элементы массива нумеруются с нуля. Размерность массива может быть задана только константой или константным выражением. Пример:
float a [10]; //массив из 10 вещественных чисел
int b []= {1,2,3}; // b [0]=1, b [1]=2, b [2]=3
char str [10]= "Вася" // массив символов. Выделено 10 элементов с
// номерами от 0 до 9.
// первые элементы: 'в', 'а', 'с', 'я', '\0' - нуль - символ.
Указатели - переменные, предназначенные для хранения адресов областей памяти. В С++ различают 3 вида указателей - указатель на объект, на функцию, на void. Указатель не является самостоятельным типом, он всегда связан с каким - либо другим конкретным типом.
Указатель на функцию содержит адрес в сегменте кода, по которому располагается исполняемый код функции, т. е. адрес, по которому передается управление при вызове функции. Указатели на функции используются для косвенного вызова функции, а также для передачи имени функции в другую функцию в качестве параметра.
Указатель на объект содержит адрес области памяти, в которой хранятся данные определенного типа.
Указатель на void применяется в тех случаях, когда конкретный тип объекта, адрес которого требуется хранить, не определен (например, если в одной и той же переменной в разные моменты времени требуется хранить адреса объектов различных типов).
Примеры:
int func (int, int){…}; //определение функции
int (*f) (int, int); //указатель на функцию
f = func; //присваивание адреса функции
int a = 5; //целая переменная
int *p = & a; //в указатель записываем адрес переменной
int b [10]; //массив
int *t = b; // присваивание адреса начала массива
Операция разадресации (*), или разыменования предназначена для доступа к величине, адрес которой хранится в указателе. Эту операцию можно использовать как для получения, так и для изменения значения величины (если она не объявлена как константа).
Перечисления (enum).
При написании программ часто возникает потребность определить несколько именованных констант, для которых требуется, чтобы все они имели различные значения (при этом конкретные значения могут быть не важны). Для этого удобно воспользоваться перечисляемым типом данных, все возможные значения которого задаются списком целочисленных констант.
enum [имя_тип]{список констант},
где имя типа задается в том случае, если в программе требуется определять переменные этого типа.
Структуры (struct).
В отличие от массивов, все элементы которого однотипны, структура может содержать элементы разных типов:
struct [имя типа]{
тип_1 элемент_1;
тип_2 элемент_2;
…
тип_n элемент_n;
} [список описателей]
Элементы структуры называются полями структуры и могут иметь любой тип, кроме типа этой же структуры, но могут быть указателями на него. Если отсутствует имя типа, должен быть указан список описателей переменных, указателей или массивов. В этом случае описание структуры служит определением элементов этого списка. Если список отсутствует, описание структуры определяет новый тип, имя которого можно использовать в дальнейшем наряду со стандартными типами.
Для инициализации структуры значения ее элементов перечисляют в фигурных скобках в порядке их описания. При инициализации массива структур следует заключать в фигурные скобки каждый элемент массива (учитывая, что многомерный массив - это массив массивов).
Для переменных одного и того же структурного типа определена операция присваивания, при этом происходит поэлементное копирование. Структуру можно передавать в функцию и возвращать в качестве значения функции.
Доступ к полям структуры выполняется с помощью операций выбора `.' (точка) при обращении к полю через имя структуры и `- >' при обращении через указатель.
Объединения (union).
Объединение представляет собой частный случай структуры, все поля которой располагаются по одному и тому же адресу. Длина объединения равна наибольшей из длин его полей. В каждый момент времени в переменной типа объединение хранится только одно значение. Объединение применяется для экономии памяти в тех случаях, когда известно, что больше одного поля одновременно не требуется.
Помимо этого в программе широко использовались возможности модульного программирования, а именно, функции.
Функция - это именованная последовательность описаний и операторов, выполняющая какое - либо законченное действие. Функция может принимать параметры и возвращать значение.
Любая программа на языке С++ состоит из функций, одна из которых должна иметь имя main (с нее начинается выполнение программы). Функция начинает выполняться в момент вызова. Любая функция может быть объявлена и определена. Как и для других величин, объявлений может быть несколько, а определение только одно. Объявление функции должно находиться в тексте раньше ее вызова для того, чтобы компилятор мог осуществить проверку правильности вызова.
Объявление функции (прототип, заголовок, сигнатура) задает ее имя тип возвращаемого значения и список передаваемых параметров. Определение функции содержит, кроме объявления, тело функции, представляющее собой последовательность операторов и описаний в фигурных скобках. В объявлении, в определении и при вызове одной и той же функции типы и порядок следования параметров должны совпадать. На имена параметров ограничений по соответствию не накладывается, поскольку функцию можно вызывать с различными аргументами, а в прототипах имена компилятором игнорируются (они служат только для улучшения читаемости программы).
Механизм передачи параметров является основным способом обмена информацией между вызываемой и вызывающей функциями. Параметры, перечисленные в заголовке описания функции, называются формальными параметрами, а записанные в операторе вызова функции - фактическими параметрами, или аргументами.
При вызове функции в первую очередь вычисляются выражения, стоящие на месте аргументов; затем в стеке выделяется память под формальные параметры функции в соответствии с их типом, и каждому из них присваивается значение соответствующего аргумента. При этом проверяется соответствие типов и при необходимости выполняется их преобразование.
существуют 2 способа передачи параметров в функцию:
- по адресу;
- по значению.
При передаче по значению в стек заносятся копии значений аргументов, и операторы функции работают с этими копиями. Доступа к исходным значениям параметров у функции нет, а, следовательно, нет и возможности их изменить.
При передаче по адресу в стек заносятся копии адресов аргументов, а функция осуществляет доступ к ячейкам памяти по этим адресам и может изменить исходные значения аргументов. Параметры в функцию можно передавать по адресу с помощью указателей или с помощью ссылок.
В качестве среды разработки данной программы выступала среда Microsoft Visual Studio 2010.
2. Описание программы
2.1 Описание разработанной структуры
Описание структуры данных, используемой в программе, имеет вид:
struct Worker{
char surname [20]; //фамилия
double salary; //зарплата
bool be;
}
Дополнительное поле "bool be;" было введено в структуру, чтобы иметь возможность однозначно определить, содержит ли структура данные о сотруднике (bool be= true), или же не содержит (bool be= false).
Помимо этого в программе создается массив указателей на структуры, который инициализируется адресами соответствующих структур из массива. Это реализовано в отдельной функции, которая, помимо этого, присваивает нулевые значения полям структуры:
for(int i=0;i<n;i++){
strcpy_s(work [i].surname,"0");
work [i].salary=0;
work [i].be=false;
loc_number [i]=&work [i];
},
где:
loc_number [i]- массив указателей на структуры;
&work [i]- адрес соответствующей структуры.
Массив указателей на структуры введен, чтобы сократить время сортировки структур, т. к. нет необходимости переписывать все структуры: достаточно переписать их адреса в массиве указателей.
Объявления всех функций, структуры, подключение необходимых файлов реализовано в отдельном файле: "stdafx.h".
Определение всех функций дано в файле: "stdafx.cpp".
Функция "main()" реализована в файле "Курсовой проект.cpp", к которому подключается файл "stdafx.cpp".
2.2 Логика работы программы. Схема алгоритма функции main()
Исходя из того, что в программе необходимо предусмотреть запись базы в файл, вытекает следующее:
- у пользователя должна быть возможность изначально выбрать один из двух вариантов: либо работать с базой, записанной в файл, либо создать новую базу и работать с ней;
- меню для работы с базой, собственно как и все действия над ней, должно быть одинаковым вне зависимости от того, работает пользователь с вновь созданной базой, или же с базой из файла.
Исходя из этого, следует, что нам необходимо минимум 2 меню:
№1 - выбор варианта работы с базой;
№2 - выбор действия над базой.
Меню №1 можно оформить в функции "main()".Второе меню логичнее оформить в виде отдельной функции, т. к. его вызов происходит как минимум из двух точек программы.
Схема меню №1:
--------------------------------
МЕНЮ
--------------------------------
1: Создать новую базу сотрудников;
2: Открыть существующую базу;
3: Выход из программы
--------------------------------
Данное меню организовано в функции "main()". В начале программы объявляются массивы структур и указателей. Далее вызывается следующая функция:
void NullWork(Worker work [],Worker *loc_number [],const int n).
Данная функция присваивает нулевые значения полям структур, массив которых создается в начале программы, а также связывает массив указателей и массив структур. В качестве параметров принимает массив структур, массив указателей на структуры и целое число, которое является размером массива.
Далее пользователю предлагается выбрать один из 3-х пунктов меню №1. Корректность ввода пользователя проверяет следующая функция:
int EnterMenu(const int size_menu).
Принимает целое число - соответствующее последнему пункту меню, из которого вызывается. Возвращает целое число - соответствующее пункту меню, или 0 в случае некорректного ввода.
В случае выбора пункта №3 меню №1происходит выход из программы.
В случае выбора пункта №2 меню №1вначале происходит вызов функции:
bool ExtMm(Worker work [],Worker *loc_number [],const int n).
Данная функция запрашивает пользователя ввести имя файла, в котором сохранена база. Далее ведется поиск файла. В случае успеха, функция копирует содержимое файла в массив структур, созданный в начале программы, и сортирует массив указателей в соответствии с фамилиями сотрудников. Возвращаемое значение - true. В случае неудачного поиска возвращаемое значение - false. В качестве параметров принимает массив структур, массив указателей на структуры и целое число, которое является размером массива.
В случае выбора пункта №1 или пункта №2 меню №1 управление в конечном итоге передается функции:
void MainMenu(Worker [],Worker * [],const int).
Данная функция выводит на экран и обрабатывает меню №2. В качестве параметров принимает массив структур, массив указателей на структуры и целое число, которое является размером массива. Из этой функции происходит вызов функций, соответствующих определенным пунктам меню. В конце этой функции происходит "обнуление" полей массива структур, чтобы можно было использовать его для создания новой базы.
Рис. Схема алгоритма функции int main()
Рис. Схема алгоритма функции void NullWork(Worker [],Worker * [], const int)
Рис. Схема алгоритма функции int EnterMenu(const int)
Рис. Схема алгоритма функции bool ExtMm(Worker [],Worker [],const int)
Рис. Схема алгоритма void MainMenu(Worker [],Worker * [],const int)
Схема меню №2:
------------------------------
ОСНОВНОЕ МЕНЮ
------------------------------
1: Добавить сотрудника в базу;
2: Удалить сотрудника из базы;
3: Информация о сотрудниках;
4: Сохранить базу сотрудников;
5: Назад;
------------------------------
1: Добавить сотрудника в базу - вызов функции:
void AddMm(Worker work [],Worker *loc_number [],const int n).
Принимаемые параметры: массив структур, массив указателей на структуры и целое число, которое является размером массива. Функция ищет свободное место в массиве структур. В случае удачного поиска, функция запрашивает ввод фамилии и зарплаты сотрудника, после чего записывает данные в соответствующие поля свободной структуры. Если же поиск положительного результата не дал, то выводится соответствующее сообщение, после чего функция заканчивает свою работу. После записи функция производит сортировку массива указателей. Для этого вызывается дополнительная функция:
bool SortWork(char str1 [],char str2 []).
В качестве параметров - две строки (фамилии сотрудников) которые необходимо сравнить. Возвращает "true", если str1 []> str2 [],или "false", если str1 []<= str2 [].
2: Удалить сотрудника из базы - вызов функции:
void DelMm(Worker *loc_number [],const int n).
Принимаемые параметры: массив указателей на структуры и целое число, которое является размером массива. Функция предлагает пользователю ввести фамилию сотрудника, которого он хочет удалить из базы, и ищет его в массиве структур. В случае удачного поиска, функция удаляет информацию из соответствующих полей структуры, а полю "bе" присваивает значение "false". Если же поиск положительного результата не дал, то выводится соответствующее сообщение, после чего функция заканчивает свою работу.
4: Сохранить базу сотрудников - вызов функции:
void SaveMm(Worker work [],const int n).
Принимаемые параметры: массив структур и целое число, которое является размером массива. Функция запрашивает пользователя ввести имя файла, после чего записывает в него массив структур. Если файл существует, он переписывается, если не существует - создается.
5: Назад - вызов функции:
bool ExitMm(bool save).
Суть данной функции в том, чтобы убедиться: сохранял ли пользователь базу в файл, или нет. Таким образом, можно предупредить потерю данных. Дополнительная переменная "bool save" принимает значение "true" лишь в том случае, когда непосредственно перед выходом из меню №2 был выбран пункт меню "4: Сохранить базу сотрудников". В противном случае ее значение "false". В зависимости от того, какое значение имеет переменная "bool save", происходит либо выход из меню, либо вывод сообщения о том, что база не сохранена и предложение либо "назад" в меню, либо" выход" из меню: программа алгоритм функция листинг
------------------
1: Назад;
2: Выход;
------------------
3: Информация о сотрудниках - вызов функции:
void InformMm(Worker *loc_number [],const int n).
Данная функция выводит на экран и обрабатывает следующее меню:
-----------------------------------
МЕНЮ
-----------------------------------
1: Вывод сотрудников на экран;
2: Суммарный заработок сотрудников;
3: Сотрудник с наибольшей зарплатой;
4: Назад;
-----------------------------------
Возможности этой функции таковы:
- вывод отсортированного по фамилиям списка сотрудников с их зарплатами на экран;
- вывод на экран суммарного заработка сотрудников;
- вывод на экран сотрудника с наибольшей зарплатой.
Рис. Схема алгоритма void AddMm(Worker [],Worker * [],const int)
Рис. Схема алгоритма bool SortWork(char str1 [],char str2 [])
Рис. Схема алгоритма void DelMm(Worker * [],const int)
Рис. Схема алгоритма void SaveMm(Worker [],const int)
Рис. Схема алгоритма bool ExitMm(bool save)
Рис. Схема алгоритма void InformMm(Worker * [],const int)
3. Руководство пользователя
Для запуска программы необходимо выбрать файл "Курсовой проект.exe". После запуска программы пользователю открывается МЕНЮ и предоставляется возможность либо создать новую базу сотрудников (пункт 1), либо открыть существующую базу, записанному в некотором файле (пункт 2). Также пользователь может выйти из программы (пункт 3).
Для выбора определенного пункта меню необходимо ввести с клавиатуры соответствующую цифру и нажать ENTER. При вводе с клавиатуры недопустимых символов, на экран выводится соответствующее сообщение. Если при вводе, первой была нажата допустимая цифра, а после недопустимые символы, то ввод будет обработан успешно.
После выбора пункта 2, пользователю необходимо ввести имя файла, в котором ранее была сохранена база сотрудников. Файл должен находиться в том же каталоге, что и программа, иначе он не будет найден.
После открытия файла с базой сотрудников, или же после выбора пункта 1 пользователь попадает в ОСНОВНОЕ МЕНЮ, которое предоставляет следующие возможности для работы с базой:
- (пункт 1) - добавить сотрудника в базу;
- (пункт 2) - удалить сотрудника из базы;
- (пункт 3) - просмотреть информацию о сотрудниках;
- (пункт 4) - сохранить базу сотрудников в файл;
- (пункт 5) - назад в МЕНЮ.
Добавление сотрудников в базу возможно лишь в том случае, если в базе есть место (база может содержать до ста элементов). Если свободного места нет, на экран выводится соответствующее сообщение и происходит возврат в ОСНОВНОЕ МЕНЮ.
Имеется возможность сохранения базы сотрудников в файл. Для этого необходимо выбрать пункт 4, после чего ввести имя файла.
Выбрав пункт 5, производится проверка: имело ли место сохранение базы в файл непосредственно перед выходом в МЕНЮ. Если непосредственно перед выходом в МЕНЮ сохранение базы сотрудников в файл не производилось, на экран выводится соответствующее сообщение и предлагается выбор:
- (пункт 1) - назад в ОСНОВНОЕ МЕНЮ;
- (пункт 2) - выход в МЕНЮ.
Таким образом, предотвращается потеря данных.
Выбрав пункт 3 ОСНОВНОГО МЕНЮ можно выполнить следующие действия:
- (пункт 1) - вывод информации о сотрудниках на экран;
- (пункт 2) - вывод на экран суммарной зарплаты сотрудников;
- (пункт 3) - вывод на экран сотрудника с наибольшей зарплатой;
- (пункт 4) - назад в ОСНОВНОЕ МЕНЮ.
Заключение
Тестирование программы показало ее надежную работоспособность. Все пункты меню работают правильно. Вывод информации о сотрудниках на экран производится в соответствии с заданием. Запись в файл и чтение из файла происходит без ошибок.
Учитывая то, что практически вся работа в программе возложена на функции, программа имеет хороший потенциал для дальнейшей модернизации.
Литература
1. С/С++. Программирование на языке высокого уровня / Т.А. Павловская. - СПб.: Питер, 2013. - 461 с.: ил.
2. Объектно- ориентированное программирование в С++ 4-е изд. / Р. Лафоре. - СПб.: Питер, 2012. - 928 с.: ил.
Приложение 1. Листинг программы
"stdafx.h"
#include<conio.h>
#include<fstream>
#include<iostream>
#include<iomanip>
using namespace std;
struct Worker{
char surname [20]; //фамилия
double salary; //зарплата
bool be; //дополнительное поле. по нему будем определять
//существует ли структура
};
//функция выводит на экран и обрабатывает основное меню
void MainMenu(Worker work [],Worker *loc_number [],const int n);
//функция проверяет является ли символ, введенный пользователем, пунктом меню
//const int size_menu максимальное значение, предусмотренное меню
int EnterMenu(const int size_menu);
//функция добавляет в базу нового сотрудника
void AddMm(Worker work [],Worker *loc_number [],const int n);
//функция удаляет из базы сотрудника
void DelMm(Worker *loc_number [],const int n);
//выводит на экран информацию о сотрудниках
void InformMm(Worker *loc_number [],const int n);
//сохраняет базу сотрудников в файл
void SaveMm(Worker work [],const int n);
//извлекает базу сотрудников из файл
bool ExtMm(Worker work [],Worker *loc_number [],const int n);
//сравнивает фамилии сотрудников для сортировки по фамилии
bool SortWork(char str1 [],char str2 []);
//функция проверяет была ли база сохранена в файл. возвращает истину,
//если ее необходимо повторно сохранить
bool ExitMm(bool save);
//массиву Worker присваиваем нулевые значения
void NullWork(Worker work [],Worker *loc_number [],const int n);
"stdafx.cpp"
#include "stdafx.h"
void MainMenu(Worker work [],Worker *loc_number [],const int n){
bool save=false; //для определения имело ли место сохранение базы
enum CHOISE_MM {add_mm=1,del_mm,inform_mm,save_mm,exit_mm};
int point_mm;
do{
cout""------------------------------""endl;
cout"" ОСНОВНОЕ МЕНЮ ""endl;
cout""------------------------------""endl"endl;
cout""1: Добавить сотрудника в базу;""endl"endl;
cout""2: Удалить сотрудника из базы;""endl"endl;
cout""3: Информация о сотрудниках;""endl"endl;
cout""4: Сохранить базу сотрудников;""endl"endl;
cout""5: Назад;""endl"endl;
cout""------------------------------""endl"endl;
point_mm=EnterMenu(exit_mm);
switch(point_mm){
case 0:
break;
case add_mm:
AddMm(work,loc_number,n);
save=false;
break;
case del_mm:
DelMm(loc_number,n);
save=false;
break;
case inform_mm:
InformMm(loc_number,n);
break;
case save_mm:
save=true;
SaveMm(work,n);
break;
case exit_mm:
if(ExitMm(save)) point_mm=0;
break;
}
}while(point_mm!=exit_mm);
NullWork(work,loc_number,n);
system("cls");
return;
}
int EnterMenu(const int size_menu){
int i=0;
char ent [20];
//необходимо обработать не все символы, введенные пользователем, а лишь первый, для даль- //нейшего определения,
// является ли он цифрой
cin"ent;
i=atoi(&ent [0]);
if ((i<1)||(i>size_menu)){
cout"ent"" -не является пунктом меню. Для продолжения нажмите любую клавишу ";
_getch();
i=0;
}
system("cls");
return i;
}
void AddMm(Worker work [],Worker *loc_number [],const int n){
Worker *work_buf=0;
//введем переменную типа bool для определения есть ли свободное место в базе данных
bool place=false;
int i=0,k=0;
for(i=0;i<n;i++){
if (work [i].be==false){
place=true; //место есть
break;
}
}
//по итогу цикла for переменная place = true в том случае если в базе есть места //или база совсем пуста.
//в этом случае условие будет loc_number [0]==0
if (!place){
cout""Добавление сотрудника невозможно. База переполненна!""endl;
_getch();
system("cls");
return;
}
//-----------------------------------------------------------------------------
cout""Введите фамилию работника: ";
cin"work [i].surname;
cout""Введите зарплату работника: ";
cin"work [i].salary;
work [i].be=true;
//производим сортировку массива указателей
for(i=1;i<n-1;i++){
for(k=0;k<n-i;k++){
if(SortWork((*loc_number [k]).surname,(*loc_number [k+1]).surname) && ((*loc_number [k+1]).be==true)){
work_buf=loc_number [k];
loc_number [k]=loc_number [k+1];
loc_number [k+1]=work_buf;
}
}
}
system("cls");
return;
}
bool SortWork(char str1 [],char str2 []){
int i=0;
do{
if(str1 [i]>str2 [i]) {
return true;
break;
}else if(str1 [i]<str2 [i]) break;
i++;
}while((str1 [i]!='\0')&&(str2 [i]!='\0'));
return false;
}
void DelMm(Worker *loc_number [],const int n){
bool is=false;
char del_surname [20];
unsigned int i=0,k=0;
cout""Введите фамилию сотрудника, которого хотите удалить из базы: ";
cin"del_surname;
do{
if((*loc_number [i]).be){ //ведем поиск сотрудника по фамилии
for(k=0;k<strlen(del_surname);k++){
if(del_surname [k]!=(*loc_number [i]).surname [k]){
is=false; //в случае несовпадения одной буквы
break;
}else is=true; //is=true - фамилии совпали
}
if(is) break;
}
i++;
}while(static_cast<int>(i)<n);
if(!is){
cout""Сотрудника по фамилии ""del_surname"" в базе не существует ";
_getch();
cout"endl;
}
if(is){
strcpy_s((*loc_number [i]).surname,"0");
(*loc_number [i]).salary=0;
(*loc_number [i]).be=false;
}
system("cls");
}
void SaveMm(Worker work [],const int n){
char name [20];
cout""Введите имя файла в котором вы хотите сохранить базу сотрудников: ";
cin"name;
ofstream fptr(name);
for(int i=0;i<n;i++){
if(work [i].be){
fptr.write(reinterpret_cast<char*>(&work [i].be),sizeof(bool));
fptr.write(work [i].surname,20);
fptr.write(reinterpret_cast<char*>(&work [i].salary),sizeof(double));
}
}
fptr.close();
system("cls");
return;
}
bool ExtMm(Worker work [],Worker *loc_number [],const int n){
Worker *work_buf=0;
char data_base [20];
cout""Введите имя файла, в котором содержится база сотрудников: ";
cin"data_base;
ifstream fptr;
fptr.open(data_base);
if(!fptr){
cout""Базы сотрудников с именем \"""data_base""\" не существует! ""endl;
_getch();
system("cls");
return false;
}
for(int i=0;i<n;i++){
fptr.read(reinterpret_cast<char*>(&work [i].be),sizeof(bool));
fptr.read(work [i].surname,20);
fptr.read(reinterpret_cast<char*>(&work [i].salary),sizeof(double));
}
fptr.close();
//производим сортировку массива указателей
for(int i=1;i<n-1;i++){
for(int k=0;k<n-i;k++){
if(SortWork((*loc_number [k]).surname,(*loc_number [k+1]).surname) && ((*loc_number [k+1]).be==true)){
work_buf=loc_number [k];
loc_number [k]=loc_number [k+1];
loc_number [k+1]=work_buf;
}
}
}
system("cls");
return true;
}
bool ExitMm(bool save){
if(!save){
enum CHOISE_EM{back_em=1,output_em};
int point_em;
cout""База сотрудников не была сохранена в файл.""
endl"" При выходе из программы Вы можете потерять данные!""endl"endl;
do{
cout""------------------""endl"endl;
cout""1: Назад; ""endl"endl;
cout""2: Выход; ""endl"endl;
cout""------------------""endl"endl;
point_em=EnterMenu(output_em);
switch(point_em){
case 0:
break;
case back_em:
return true; //назад
case output_em:
return false; //выход
}
}while(!point_em);
}
return false;
}
void InformMm(Worker *loc_number [],const int n){
double total=0,max=0;
int k;
enum CHOISE_MM {out_im=1,total_im,max_im,exit_im};
int point_im;
do{
cout""-----------------------------------""endl;
cout"" МЕНЮ ""endl;
cout""-----------------------------------""endl"endl;
cout""1: Вывод сотрудников на экран;""endl"endl;
cout""2: Суммарный заработок сотрудников;""endl"endl;
cout""3: Сотрудник с наибольшей зарплатой;""endl"endl;
cout""4: Назад;""endl"endl;
cout""-----------------------------------""endl"endl;
point_im=EnterMenu(exit_im);
switch(point_im){
case 0:
break;
case out_im:
cout"endl"endl""---------------------------------------""endl;
cout"" Фамилия | Зарплата ""endl;
cout""---------------------------------------""endl"endl;
for(int i=0;i<n;i++){
if((*loc_number [i]).be==false) continue;
cout.setf(ios::left);
cout"setw(20)"(*loc_number [i]).surname"setw(20)"(*loc_number [i]).salary"endl;
}
cout""---------------------------------------""endl"endl;
_getch();
break;
case total_im:
for(int i=0;i<n;i++){
if((*loc_number [i]).be==false) continue;
total+=(*loc_number [i]).salary;
}
cout"endl"endl""--------------------------------------------""endl;
cout"" Суммарный заработок сотрудников = ""total"endl;
cout""--------------------------------------------""endl;
total=0;
_getch();
break;
case max_im:
for(int i=0;i<n;i++){
if((*loc_number [i]).be==false) continue;
if((*loc_number [i]).salary > max) {
max=(*loc_number [i]).salary;
k=i;
}
}
cout"endl"endl""---------------------------------------""endl;
cout"" Сотрудник с наибольшей зарплатой: ""endl;
cout""---------------------------------------""endl;
cout"" Фамилия | Зарплата ""endl;
cout""---------------------------------------""endl;
for(int i=0;i<n;i++){
if((*loc_number [i]).salary==max){
cout.setf(ios::left);
cout"setw(20)"(*loc_number [i]).surname"setw(20)"(*loc_number [i]).salary"endl;
}
}
cout""---------------------------------------""endl;
_getch();
break;
case exit_im:
break;
}
system("cls");
}while(point_im!=exit_im);
return;
}
void NullWork(Worker work [],Worker *loc_number [],const int n){
//объявленному массиву Worker присваиваем нулевые значения
for(int i=0;i<n;i++){
strcpy_s(work [i].surname,"0");
work [i].salary=0;
work [i].be=false;
loc_number [i]=&work [i];
}
return;
}
"Курсовой проект.cpp"
// Лакотка Ю.В. Курсовой проект.cpp. Вариант №5.
#include "stdafx.h"
int main()
{
system("chcp 1251");
system("cls");
const int n=100;
//объявляем массив структур типа Worker
Worker work [n];
//объявляем массив указателей на структуры типа Worker для последующей
//сортировки миссива структур Worker
Worker *number [n];
//объявленному массиву Worker присваиваем нулевые значения
NullWork(work,number,n);
enum CHOISE_MMD {create_mmd=1,extract_mmd,exit_mmd};
int point_mmd;
do{
cout""----------------------------------""endl;
cout"" МЕНЮ ""endl;
cout""----------------------------------""endl"endl;
cout""1: Создать новую базу сотрудников;""endl"endl;
cout""2: Открыть существующую базу;""endl"endl;
cout""3: Выход из программы;""endl"endl;
cout""----------------------------------""endl"endl;
point_mmd=EnterMenu(exit_mmd);
switch(point_mmd){
case 0:
break;
case create_mmd: //создаем новую базу
MainMenu(work, number,n);
break;
case extract_mmd: //извлекаем существующую базу из файла
if(!ExtMm(work,number,n))break;
MainMenu(work, number,n);
break;
case exit_mmd:
break;
}
}while(point_mmd!=exit_mmd);
return 0;
}
Приложение 2. Распечатки результатов
Размещено на Allbest.ru
Подобные документы
Создание на языке C базы данных "Стадионы города", требования к программе. Осуществление загрузки базы данных в массив и вывод главного меню в основной программе. Алгоритм работы программы в виде блок-схемы. Описание функций программы и ее листинг.
курсовая работа [183,6 K], добавлен 06.10.2010Разработка структуры базы данных для хранения дипломных проектов в среде объектно-ориентированного программирования Python. Создание внешнего вида окон ввода-вывода информации, технологии переходов. Листинг программы с пояснениями; направления улучшения.
курсовая работа [3,1 M], добавлен 27.02.2015Рассмотрение правил записи, способов ввода и вывода, использования функций обработки символьных данных в Pascal. Описание алгоритмизации и программирования файловых структур данных, проектирования структуры файла. Ознакомление с работой данных массива.
курсовая работа [336,2 K], добавлен 27.06.2015Основы программирования на 32-битном Ассемблере, разработка с его помощью программы, демонстрирующей работу одного из разделов ОС Windоws. Описание используемых АРI-функций как интерфейса программирования приложений. Листинг программы, результаты работы.
курсовая работа [164,5 K], добавлен 18.05.2014Создание базы данных и СУБД. Структура простейшей базы данных. Особенности языка программирования Турбо Паскаль. Описание типов, констант, переменных, процедур и функций. Описание алгоритма базы данных (для сотрудников ГИБДД), листинг программы.
курсовая работа [26,3 K], добавлен 26.01.2012Особенности создания страниц на языке APS.NET, создание и формы обращение к базам данных. Интерфейс автоматического вывода определнного столбца базы данных в элементы управления. Структура базы данных, принцип работы страниц сайта, настройка приложения.
курсовая работа [387,3 K], добавлен 02.03.2010Изучение условий поставленной задачи и используемых данных для разработки программы хранения информации о рейсах поезда. Описание разработанных функций, листинга, блок-схем алгоритмов и дерева функции. Рассмотрение сценария диалога данной программы.
курсовая работа [532,7 K], добавлен 20.07.2014- Создание базы данных автомобилестроительного предприятия в виде настольного приложения на языке Java
Разработка логической схемы базы данных автомобилестроительного предприятия. Инфологическое моделирование системы. Создание графического интерфейса пользователя для базы данных средствами языка программирования Java. Тестирование программных средств.
курсовая работа [2,3 M], добавлен 16.12.2013 Анализ затрат и прибыли. Создание программного проекта для решения задачи о прибыли и убытках на языке программирования C#. Использование функций и переменных, компиляция программы. Алгоритмы и структуры данных. Тестирование программного обеспечения.
курсовая работа [1,2 M], добавлен 03.01.2015Регистрация и вход в Oracle Application Express, структура и взаимосвязь элементов базы данных. Создание запросов, основы для приложения, отчетов, диаграммы, главной страницы. Формирование руководства пользователя и листинг разработанной программы.
курсовая работа [2,8 M], добавлен 18.11.2013