Разработка программы по автоматизации учета данных о сотрудниках фирмы

Описание программного продукта, реализующего функционал по автоматизации учёта данных о сотрудниках фирмы: фамилия, отчество, дата и место рождения. Оценка среды разработки Microsoft Visual Studio 2005 и обоснование выбора языка программирование С++.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык русский
Дата добавления 15.11.2012
Размер файла 855,4 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

КУРСОВАЯ РАБОТА

на тему: «Разработка программы по автоматизации учета данных о сотрудниках фирмы»

Содержание

Введение

1. Постановка задачи

2. Вычислительная система

2.1 Выбор среды программирования

2.2 Теоретические основы

2.2.1 Сложные типы данных

2.2.2 Массивы

2.2.3 Структуры

2.2.4 Функции

2.2.5 Указатели

2.2.6 Операторы

3. Описание программы

4. Описание применения программы

Заключение

Литература

Приложения

Введение

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

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

Язык С++ был разработан Бьерном Страуструпом в начале 80-х годов в AN&T Bell Labs. С++ был также стандартизирован комитетом ISO в рамках ISO/IEC 14882:1998 или как «Стандарт С++»(Standard C++).

С++ - это язык программирования общего назначения, хорошо известный своей эффективностью, экономичностью, и переносимостью.

Указанные преимущества С++ обеспечивают хорошее качество разработки почти любого вида программного продукта. Использование С++ в качестве инструментального языка позволяет получать быстрые и компактные программы. Во многих случаях программы, написанные на С++, сравнимы по скорости с программами, написанными на языке ассемблера. При этом они имеют лучшую наглядность.

С++ сочетает эффективность и мощность в относительно малом по размеру языке. Хотя С++ не содержит встроенных компонент языка, выполняющих ввод-вывод, распределение памяти, манипуляций с экраном или управление процессами, тем не менее, системное окружение С++ располагает библиотекой объектных модулей, в которой реализованы подобные функции. Библиотека поддерживает многие из функций, которые необходимы для полноценной работы.

С++ предлагает необычно большой набор операций. С++ поддерживает указатели на переменные и функции. Указатель на объект программы соответствует машинному адресу этого объекта.

В своем составе С++ содержит препроцессор, который обрабатывает текстовые файлы перед компиляцией. Препроцессор не ограничен процессированием только исходных текстовых файлов С++, он может быть использован для любого текстового файла.

1. Постановка задачи

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

Приложение должно предоставлять пользователю следующий функционал:

1) возможность вводить с клавиатуры, данные о каждом сотруднике;

2) возможность редактировать данные о каждом сотруднике;

3) возможность удалять сотрудника из списка;

4) возможность поиска сотрудников, родившихся в одном городе и подсчёт их количества;

5) возможность сохранить список сотрудников в файл;

6) возможность считать список сотрудников из файла;

7) возможность изменить файл, в который записываются данные из списка.

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

программный продукт функционал автоматизация учет

2. Вычислительная система

2.1 Выбор среды программирования

В качестве среды разработки была выбрана Microsoft Visual Studio 2005. Используемый язык - C++. Выбор данной среды программирования обусловлен рядом преимуществ по отношению к таким языкам программирования, как Visual Basic, Visual C++ , Delphi и др.

C++ - это комбинация нескольких важнейших технологий:

- высокопроизводительный компилятор в машинный код;

- объектно-ориентированная модель компонент;

- визуальное (а, следовательно, и скоростное) построение приложений из программных прототипов.

Компилятор, встроенный в Microsoft Visual Studio 2005, обеспечивает высокую производительность. Этот компилятор в настоящее время является самым быстрым в мире. Он предлагает легкость разработки и быстрое время проверки готового программного блока, характерного для языков четвертого поколения (4GL) и в то же время обеспечивает качество кода, характерного для компилятора 3GL. Кроме того, C++ обеспечивает быструю разработку без необходимости писать вставки на С или ручного написания кода (хотя это возможно).

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

Основной упор этой модели в C++ делается на максимальном повторном использовании кода. Это позволяет разработчикам строить приложения весьма быстро из заранее подготовленных объектов, а также дает им возможность создавать свои собственные объекты для среды Microsoft Visual Studio 2005. Никаких ограничений по типам объектов, которые могут создавать разработчики, не существует. Действительно, все написанное в Microsoft Visual Studio 2005 на любом входящем в нее языке программирования может быть использовано в программе на любом другом языке. В результате нет никакой разницы, на каком языке программирования писать, если он поддерживается в Microsoft Visual Studio 2005.

Среда Microsoft Visual Studio 2005 включает в себя полный набор визуальных инструментов для скоростной разработки приложений, поддерживающей разработку пользовательского интерфейса и подключение к корпоративным базам данных.

2.2 Теоретические основы

2.2.1 Сложные типы данных

Сложные типы данных называют также производными (от основных) типами данных. Существует множество таких типов, сконструированных из базовых типов:

- массивы объектов заданного типа;

- функции с параметрами заданных типов, возвращающие значение заданного типа;

- ссылки на объекты или функции заданного типа;

- константы, которые являются значениями заданного типа;

- структуры, которые являются классами без ограничений на доступ к объектам и функциям-членам структуры;

В данной курсовой работе рассматривается работа с тремя сложными типами данных -- функциями, структурами и массивами.

2.2.2 Массивы

Массивы - это группа элементов одинакового типа (double, float, int и т.п.). Из объявления массива компилятор должен получить информацию о типе элементов массива и их количестве. Объявление массива имеет два формата:

Спецификатор типа описатель [константное выражение];

Спецификатор типа описатель [ ];

Описатель - это идентификатор массива. Спецификатор типа задает тип элементов объявляемого массива. Элементами массива не могут быть функции и элементы типа void. Константное выражение в квадратных скобках задает количество элементов массива. Константное выражение при объявлении массива может быть опущено в следующих случаях:

- при объявлении массив инициализируется,

- массив объявлен как формальный параметр функции,

- массив объявлен как ссылка на массив, явно определенный в другом файле.

В языке СИ определены только одномерные массивы, но поскольку элементом массива может быть массив, можно определить и многомерные массивы. Они формализуются списком константных-выражений, следующих за идентификатором массива, причем каждое константное-выражение заключается в свои квадратные скобки.

Каждое константное выражение в квадратных скобках определяет число элементов по данному измерению массива, так что объявление двухмерного массива содержит два константных выражения, трехмерного - три и т.д. Отметим, что в языке СИ первый элемент массива имеет индекс равный 0.

2.2.3 Структуры

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

Определение структуры состоит из двух шагов:

- объявление шаблона структуры;

- определение переменных типа объявленного шаблона.

Общий синтаксис объявления шаблона структуры:

struct имя шаблона

{тип1 имя переменной1;

тип2 имя переменной2;

//другие члены данных;

};

В структуре обязательно должен быть указан хотя бы один компонент.

За словом struct следует имя структуры. Это имя становится именем нового типа данных, соответствующего этой структуре и включающего в себя описанные внутри структуры переменные. При этом никакой памяти не выделяется. Если имя объявляемой структуры отсутствует, то создается анонимная структура. На практике при объявлении анонимной структуры всегда указывается создаваемая переменная или список переменных (типа данной структуры). Перечисленные в структуре переменные называются членами или элементами структуры. Точка с запятой в конце объявления структурного типа обязательна.

Определение структуры-переменной ничем не отличается от объявления обычной переменной с предопределённым типом. Общий синтаксис:

struct имя шаблона имя переменной;

Компилятор выделит под каждую переменную количество байтов памяти, необходимое для хранения всех её элементов.

Разрешается совмещать описание шаблона и определение структурной переменной:

struct имя шаблона

{тип1 имя переменной1;

тип2 имя переменной2;

//другие члены данных;

} имя переменной1, имя переменной2,..., имя переменной N;

Можно описать только переменную, не объявляя при этом типа. Для чего в определении нужно опустить имя структуры. Эту переменную можно использовать точно так же.

Доступ к полям структуры осуществляется с помощью оператора « . » при непосредственной работе со структурой или «->»- при использовании указателей на структуру. Эти операторы (. и ->) называются селекторами членов класса. Общий синтаксис для доступа к компонентам структуры следующий:

имя переменной структуры член данных;

имя указателя ->имя поля;

(*имя указателя) имя поля;

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

Операции доступа к элементам структуры « . » и « » имеют очень высокий приоритет и выполняются раньше всех прочих операций.

Для вычисления размера структуры нужно всегда использовать sizeof(), поскольку ее размер может не быть равен сумме размеров ее элементов из-за особенностей размещения в памяти, а sizeof() всегда вернет правильный размер.

Структуры можно присваивать, передавать как параметры функции, и возвращать из функции в качестве результата. Остальные операции не определены.

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

2.2.4 Функции

Функция - это совокупность объявлений и операторов, обычно предназначенная для решения определенной задачи. Каждая функция должна иметь имя, которое используется для ее объявления, определения и вызова. В любой программе на СИ должна быть функция с именем main (главная функция), именно с этой функции, в каком бы месте программы она не находилась, начинается выполнение программы.

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

[спецификатор класса памяти] [спецификатор типа] имя функции

(список формальных параметров)

{тело функции}

- спецификатор класса памяти - задает класс памяти и может быть static или extern.

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

Функция явно возвращает только одно значение. Допускается реализация функций, не имеющих параметров или не возвращающих ни каких значений. Возвращаемое значение указывается после оператора return и используется в точке вызова функции. Если тип результата опущен, то предполагается что возвращается результат типа int.

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

Оператор return имеет следующий формат:

return [ (выражение) ]

Выражение заключается в ( ) ( не обязательно).

Оператор return в теле функции может быть записан несколько раз. В случае если return отсутствует управление в точку вызова будет передано после выполнения последнего операнда функции. В этом случае функция также не возвращает результата. И перед именем такой функции и в ее прототипе, и в ее определении должен быть записан void.

Функция не может в качестве результата возвращать массив. Функция не может вернуть функцию, но может передать результат указателя на функцию. Любая функция может завершать выполнение системной функции abort ( ) или exit (n); где n - целое число, являющееся кодом завершения.

Следует отличать прототип функции и определение функции. Прототип функции - это ее имя с указанием типа возвращаемого результата и перечисле-нием типов поступающих параметров. Прототип функции завершается в точке с запятой ( ; ).

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

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

Определение функции - это ее полная реализация. Имеет следующий вид:

[спецификатор класса памяти] [тип результата] имя функции

(тип параметра 1 параметр 1, тип параметра 2 параметр 2)

{тело функции}

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

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

Функция вызывается если в тексте программы встречается имя функции с последующими круглыми скобками, в которых аргументы, передаваемые в функцию.

При вызове функции вычисляются выражения являющиеся аргументами, и получаемые выражения помещаются в стек.

Функции могут обмениваться информацией тремя путями:

1) используя глобальные переменные;

2) передовая копии данных;

3) передовая адреса, по которым записаны значения переменных.

Глобальные переменные объявляются вне функции, поэтому доступны для всех. Если глобальные и локальные параметры имеют одно имя, то побеждают локальные и делают их недоступными для других функций.

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

Auto - класс по умолчанию для локальных переменных.

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

В С++ функции можно переопределять, т.е. одно и тоже имя можно использовать для вызова различных функций. Это позволяет назначать функциям, имеющим аналогичное значение, но использующих параметры разных типов иметь одинаковые имена.

2.2.5 Указатели

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

При объявлении переменной типа указатель, необходимо определить тип объекта данных, адрес которых будет содержать переменная, и имя указателя с предшествующей звездочкой (или группой звездочек). Формат объявления указателя:

спецификатор типа [модификатор] * описатель .

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

В качестве модификаторов при объявлении указателя могут выступать ключевые слова const, near, far, huge. Ключевое слово const указывает, что указатель не может быть изменен в программе. Размер переменной объявленной как указатель, зависит от архитектуры компьютера и от используемой модели памяти, для которой будет компилироваться программа. Указатели на различные типы данных не обязательно должны иметь одинаковую длину.

2.2.6 Операторы

В данном курсовом проекте использованы следующие операторы: условный оператор, оператор for, оператор switch, составной оператор, или блок, оператор break, оператор return и некоторые стандартные библиотечные средства находящиеся в файлах подключённых с помощью команды процессора #include.

Есть два вида условных операторов :

if (выражение) оператор;

if (выражение) оператор else оператор;

В обоих случаях вычисляется выражение, и если оно не ноль, то выпол-няется первый подоператор. Во втором случае второй подоператор выполняется, если выражение есть 0. Как обычно, неоднозначность "else" разрешается посредством того, что else связывается с последним встречным if, не имеющим else. Оператор for имеет вид :

for ( выражение 1 opt ; выражение 2 opt ; выражение 3 opt )

оператор;

Этот оператор эквивалентен следующему:

выражение 1;

while (выражение 2)

{оператор выражение 3; };

Первое выражение задает инициализацию цикла; второе выражение задает осуществляемую перед каждой итерацией проверку, по которой производится выход из цикла, если выражение становится нулем; третье выражение часто задает приращение, выполняемое после каждой итерации.

Каждое или все выражения могут быть опущены. Отсутствие выражения 2 делает подразумеваемое while-предложение эквивалентным while(1); остальные опущенные выражения просто пропускаются в описанном выше расширении.

Оператор switch вызывает передачу управления на один из нескольких операторов в зависимости от значения выражения. Он имеет вид :

switch (выражение) оператор;

Выражение должно быть целого типа или типа указателя. Любой оператор внутри оператора может быть помечен одним или более префиксом case следующим образом:

case константное выражение :

где константное выражение должно иметь тот же тип что и выражение- переключатель; производятся обычные арифметические преобразования. В одном операторе switch никакие две константы, помеченные case, не могут иметь одинаковое значение. Может также быть не более чем один префикс оператора вида:

default:

Когда выполнен оператор switch, проведено вычисление его выражения и сравнение его с каждой case константой. Если одна из констант равна значению выражения, то управление передается на выражение, следующее за подошедшим префиксом case. Если никакая case константа не соответствует выражению, и есть префикс default, то управление передается на выражение, которому он предшествует. Если нет соответствующих вариантов case и default отсутствует, то никакой из операторов в операторе switch не выполняется.

Оператор break прекращает выполнение ближайшего охватывающего while, do, for или switch оператора; управление передается на оператор, следующий за законченным.

Возврат из функции в вызывающую программу осуществляется с помощью оператора return, имеющего один из двух видов:

return ;

return выражение;

Первый может использоваться только в функциях, не возвращающих значения, т.е. в функциях с типом возвращаемого значения void. Вторая форма может использоваться только в функциях, не возвращающих значение; вызывающей функцию программе возвращается значение выражения. Если необходимо, то выражение преобразуется, как это делается при присваивании, к типу функции, в которой оно возникло. Обход конца функции эквивалентен возврату return без возвращаемого значения.

Оператор do while называют также оператором с постусловием.

do

инструкция

while (условие);

В большинстве задач, решаемых при помощи циклов проблема заключается в том, что условие вычисляется в теле цикла. For и while требуют, чтобы значение условия равнялось true до первого вхождения в цикл, иначе тело не выполнится ни разу. Это означает, что мы должны обеспечить такое условие до начала работы цикла. Альтернативой может служить использование do while, гарантирующего выполнение тела цикла хотя бы один раз.

Инструкция do while выполняется до первой проверки условия. Если вычисление условия дает false, цикл останавливается.

3. Описание программы

При разработке данного программного продукта для облегчения процесса его создания было решено использовать такой тип данных как структура.

Работу созданного программного продукта обеспечивают следующие подключённые программные модули:

#include <stdafx.h>

#include <Windows.h>

#include <stdio.h>

#include <string.h>

Благодаря им было создано само приложение. Модули отвечают за работу операторов стандартного ввода вывода (#include<stdio.h>), за работу со строковыми переменными (#include<string.h>) и др. В результате компиляции программы был создан файл Kurs.exe, который и является конечным продуктом.

В программе были использованы следующие глобальные переменные:

int action - обозначает выбранное пользователем действие

char filename[20] - имя файла для хранения данных

FILE *f - файловая переменная (для обозначения файла)

sotrudnik *spisok - динамический массив сотрудников

sotrudnik *spisokBuf - вспомогательный массив сотрудников

int spisokLen = 0 - количество сотрудников в списке

char buf [256] - буферная строка для русского текста

Локальные переменные в программе:

char delSurname [20] - буферная строка для хранения имени удаляемого сотрудника

int res = 100 - хранит результат сравнения двух строк

int iDel - хранит номер удаляемого сотрудника

char cityName [20] - буферная строка для хранения названия города

int sotrCnt - кол-во сотрудников, проживающих в городе.

В программе были созданы и реализованы следующие функции:

void main();

char *rus ( char *s ).

Анализ задания выявил, что наиболее рациональным будет использование в программе такого типа данных как структура. В результате, была разработана следующая структура:

struct sotrudnik{

char surname[20], name[20], patronymic[20];

int day, month, year;

char city[20];

}

Такой тип данных значительно облегчил разработку программного обеспечения и позволил реализовать поставленную задачу.

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

Функция rus организует перекодировку русского текста из кодировочной таблицы Windows (Windows 1251) в таблицу DOS (DOS 866), что значительно упрощает восприятие интерфейса программы.

Код приложения приведён в листинге 3.1, расположенном ниже.

// Kurs.cpp : Defines the entry point for the console application.

//

#include <stdafx.h>

#include <Windows.h>//содержит описание функции CharToOemA() для перекодировки русских строк

#include <stdio.h>//для работы c функциями ввода/вывода: fopen(), fprintf(), fscanf(), fclose(), printf(), scanf(), ...

#include <string.h>//для работы со строками: strcmp(), strcat(), ...

struct sotrudnik{

char surname[20],name[20],patronymic[20];

int day, month, year;

char city[20];

} newSotrudnik;

int action; //обозначает выбранное пользователем действие

char filename[20] = "Database.txt";//имя файла для хранения данных (по умолчанию)

FILE *f;//файловая переменная (для обозначения файла)

sotrudnik *spisok;//динамический массив сотрудников

sotrudnik *spisokBuf;

int spisokLen = 0;//количество сотрудников в списке

char buf [256];//буферная строка для русского текста

// поддержка русской консоли

char *rus ( char *s )

{//преобразует нашу строку в нужную кодовую страницу (кодовая страница Windows 1251 -> кодовая страница DOS 866)

CharToOemA( s, buf );

return buf;//выдаёт русский текст

}

int tmain(int argc, TCHAR* argv[])

{

char delSurname [20];//буферная строка для хранения имени удаляемого сотрудника

int res = 100;//хранит результат сравнения двух строк

int iDel;//хранит номер удаляемого сотрудника

char cityName [20];//буферная строка для хранения названия города

int sotrCnt;//кол-во сотрудников, проживающих в городе

do

{

//отображаем пользовательское меню

printf(rus("\nВыберите действие:\n 1 - просмотр списка сотрудников,\n"));

printf(rus(" 2 - добавление сотрудника в список,\n"));

printf(rus(" 3 - удаление сотрудника из списка,\n"));

printf(rus(" 4 - сохранение списка сотрудников в файл данных,\n"));

printf(rus(" 5 - чтение списка сотрудников из файла данных,\n"));

printf(rus(" 6 - изменение имени файла данных (по умолчанию: Database.txt),\n"));

printf(rus(" 7 - поиск сотрудников, родившихся в одном городе,\n"));

printf(rus(" 8 - завершение работы.\n"));

scanf("%d", &action);//считываем выбранное пользователем действие

switch(action)

{

case 1://просмотр списка сотрудников

if (spisokLen == 0) //если список пуст

{

printf(rus(" Список сотрудников пуст.\n"));

break;

}

printf(rus(" Список сотрудников:\n\n"));

for (int i = 0; i< spisokLen; i++)//проходим весь список

{

//выводим данные о каждом сотруднике

printf(" %d. %s %s %s, %s %d/%d/%d ", i+1, spisok[i].surname, spisok[i].name, spisok[i].patronymic, rus("родился"),

spisok[i].day, spisok[i].month, spisok[i].year);

printf("%s %s\n", rus("в г."), spisok[i].city);

}

break;

case 2://добавление сотрудника в список

printf(rus(" Заполните данные нового сотрудника:\n Фамилия: "));

scanf("%s", newSotrudnik.surname);

printf(rus("\n Имя: "));

scanf("%s", newSotrudnik.name);

printf(rus("\n Отчество: "));

scanf("%s", newSotrudnik.patronymic);

printf(rus("\n Год рождения: "));

scanf("%d", &newSotrudnik.year);

printf(rus("\n Месяц рождения(число[1;12]): "));

scanf("%d", &newSotrudnik.month);

printf(rus("\n День рождения: "));

scanf("%d", &newSotrudnik.day);

printf(rus("\n Место рождения (город): "));

scanf("%s", newSotrudnik.city);

spisokLen++;//увеличиваем кол-во сотрудников в списке

//буферный массив сотрудников (по длине на 1 сотрудника стал больше, чем исходный список)

spisokBuf = new sotrudnik[spisokLen];

for (int i = 0; i< spisokLen-1; i++)//копируем весь предыдущий список в буферный массив

spisokBuf[i] = spisok[i];

//добавляем нового сотрудника в буферный массив

spisokBuf[spisokLen-1] = newSotrudnik;

delete [] spisok; //освобождаем память из-под исходного списка

//заменяем исходный список буферным (который теперь от него отличается на 1 добавленного сотрудника)

spisok = spisokBuf;

break;

case 3://удаление сотрудника из списка

printf(rus("Введите фамилию удаляемого сотрудника: "));

scanf("%s", delSurname);//вводим фамилию для удаления из списка

iDel = -1;

for (int i = 0; i < spisokLen; i++)//проходим весь список

if(strcmp(delSurname, spisok[i].surname) == 0)//находим номер удаляемого сотрудника

iDel = i;//запоминаем номер удаляемого сотрудника

if (iDel>-1)//если в списке нашлась введённая фамилия

{

for (int i = iDel; i< spisokLen-1; i++)

spisok[i] = spisok[i+1];//смещаем всех сотрудников следующих за удаляемым на одну позицию

//тем самым "затираем" удаляемого сотрудника, при этом последний элемент списка станет повторяющимся дважды

spisokLen--;//уменьшаем кол-во сотрудников в списке

//буферный массив сотрудников (по длине на 1 сотрудника будет меньше, чем исходный список)

spisokBuf = new sotrudnik[spisokLen];

for (int i = 0; i< spisokLen; i++)//копируем весь предыдущий список в буферный массив(кроме последнего элемента, который в результате смещения стал повторяющимся)

spisokBuf[i] = spisok[i];

delete [] spisok; //освобождаем память из-под исходного списка

//заменяем исходный список уменьшенным на 1 элемент буферным

spisok = spisokBuf;

printf(rus(" Новый список сотрудников:\n\n"));

}

else printf(rus(" Введённая фамилия отсутствует в списке!\n\nCписок сотрудников не изменён:\n\n"));

for (int i = 0; i< spisokLen; i++)//проходим весь список

{

//выводим данные о каждом сотруднике

printf(" %d. %s %s %s, %s %d/%d/%d ", i+1, spisok[i].surname, spisok[i].name, spisok[i].patronymic, rus("родился"),

spisok[i].day, spisok[i].month, spisok[i].year);

printf("%s %s\n", rus("в г."), spisok[i].city);

}

break;

case 4://сохранение списка сотрудников в файл данных

//открываем файл данных для записи (если файл не пустой, то он предвариительно очищается)

f = fopen(filename, "w");

for (int i = 0; i< spisokLen; i++)//записываем весь список в файл построчно (одна строка одному полю)

if (i < spisokLen-1 )

fprintf(f,"%s\n%s\n%s\n%d\n%d\n%d\n%s\n", spisok[i].surname, spisok[i].name, spisok[i].patronymic,

spisok[i].day, spisok[i].month, spisok[i].year,

spisok[i].city);

else fprintf(f,"%s\n%s\n%s\n%d\n%d\n%d\n%s", spisok[i].surname, spisok[i].name, spisok[i].patronymic,

spisok[i].day, spisok[i].month, spisok[i].year,

spisok[i].city);

//не ставим '\n' в самом конце файла,

//т.к. если файл заканчивается на '\n', то при считывании последний сотрудник оказывается в списке дважды

fclose(f);//закрываем файл

printf("%s '%s'", rus("Данные записаны в файл "), filename);

break;

case 5://чтение списка сотрудников из файла данных

//открываем файл данных для чтения

f=fopen(filename,"r");

spisokLen = 0;

do

{

//считываем данныеочередного сотрудника

fscanf(f,"%s",newSotrudnik.surname);

fscanf(f,"%s",newSotrudnik.name);

fscanf(f,"%s",newSotrudnik.patronymic);

fscanf(f,"%d",&newSotrudnik.day);

fscanf(f,"%d",&newSotrudnik.month);

fscanf(f,"%d",&newSotrudnik.year);

fscanf(f,"%s",newSotrudnik.city);

spisokLen++;//увеличиваем кол-во сотрудников в списке

//буферный массив сотрудников (по длине на 1 сотрудника стал больше, чем исходный список)

spisokBuf = new sotrudnik[spisokLen];

for (int i = 0; i< spisokLen-1; i++)//копируем весь предыдущий список в буферный массив

spisokBuf[i] = spisok[i];

//добавляем нового сотрудника в буферный массив

spisokBuf[spisokLen-1] = newSotrudnik;

delete [] spisok; //освобождаем память из-под исходного списка

//заменяем исходный список буферным (который теперь от него отличается на 1 добавленного сотрудника)

spisok = spisokBuf;

}while(!feof(f));//считывание продолжается до конца файла

fclose(f);

//отображаем список сотрудников

if (spisokLen == 0) //если список пуст

{

printf(rus(" Список сотрудников пуст.\n"));

break;

}

printf(rus(" Список сотрудников:\n\n"));

for (int i = 0; i< spisokLen; i++)//проходим весь список

{

//выводим данные о каждом сотруднике

printf(" %d. %s %s %s, %s %d/%d/%d ", i+1, spisok[i].surname, spisok[i].name, spisok[i].patronymic, rus("родился"),

spisok[i].day, spisok[i].month, spisok[i].year);

printf("%s %s\n", rus("в г."), spisok[i].city);

}

break;

case 6://изменение имени файла данных

printf(rus(" Введите новое имя файла данных: "));

scanf("%s", filename);

break;

case 7://удаление сотрудника из списка

printf(rus(" Введите название города: "));

scanf("%s", cityName);//вводим название города для поиска

printf("\n%s %s:\n", rus(" Сотрудники, родившиеся в г."), cityName);

sotrCnt = 0;//обнуляем счётчик

for (int i = 0; i< spisokLen; i++)//проходим весь список

{

if(strcmp(spisok[i].city, cityName) == 0)//находим сотрудников, родившихся в городе cityName

{

sotrCnt++;//приращаем счётчик

//выводим данные о каждом сотруднике, родившемся в городе cityName

printf(" %d. %s %s %s;\n", sotrCnt, spisok[i].surname, spisok[i].name, spisok[i].patronymic);

}

}

//отображаем результат подсчёта сотрудников

printf(rus("\n В городе %s проживает %d сотрудников.\n"), cityName, sotrCnt);

break;

}

}while(action!=8);

return 0;

}

4. Описание применения программы

Для начала работы требуется запустить файл Kurs.exe, после чего пользователю будет представлено меню, как показано на рисунке 4.1, приведённом ниже.

Рисунок 4.1 - Главное меню приложения

Для выполнения того или иного действия следует ввести соответствующую этому действия цифру и нажать «Ввод».

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

Рисунок 4.2 - Добавление пользователя в список

Сохранения списка сотрудников в файл следует выбрать пункт 4, при этом данные будут сохранены в файл «Database.txt», заданный по умолчанию. Если же требуется сохранить данные в другой файл, то его следует указать выбрав пункт 6 и затем введя новое имя файла, в котором будет производиться чтение-запись данных.

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

Рисунок 4.3 - Чтение данных из файла и их просмотр

Для поиска и подсчёта количества сотрудников, родившихся в одном городе следует выбрать пункт меню под номером 7, а затем ввести название города, как это показано на рисунке 4.4, приведённом ниже.

Рисунок 4.4 - Чтение данных из файла и их просмотр

Заключение

Данная курсовая работа посвящена обработке информации о сотрудниках фирмы, в частности информации о датах и местах их рождения.

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

Тестирование программы показало, что она действительно работает и весьма успешно справляется с той задачей, для решения которой она предназначена.

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

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

Результатом данного курсового проекта стало создание на языке С++ программного продукта, который обеспечивает ввод информации, её обработку и последующий вывод соответствующих результатов.

Литература

1.«Язык С++ и объектно-ориентированное программирование» / В.А. Скляров - Мн.: Высшая школа, 1997 г.

2. «Основы алгоритмизации и программирования. Язык СИ» / Е.М. Демидович - Мн.: Бестпринт, 2003 г.

3. «Язык программирования Си++» / Страуструп Бьерн - М.: Софт,1999 г.

4. «Язык программирования С++. Вводный курс» / Стенли Б. Липпман, Жози Лажойе - М.: ДМК Пресс, 2001 г.

5. «Профессиональное программирование на С++» / А.И. Касаткин, А.Н. Вальвачев - Мн: Вышэйшая школа, 1992 г.

Приложение 1

Рис. Диаграмма вариантов использования

Приложение 2

Рис. Диаграмма деятельности

Размещено на Allbest.ru


Подобные документы

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.