Описание разработанной структуры

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

 

по курсу «Основы алгоритмизации и программирования»

 

на тему

 

« Разработка консольного приложения на языке С++ »

 

 

выполнил ст. гр. 417021-12 Лакотка Ю.В.

 

проверила Попова Ю. Б.

 

Минск 2013

Содержание:

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

Введение. 3

1.Теоретические основы.. 3

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

2.1. Описание разработанной структуры.. 7

2.2. Логика работы программы. Схема алгоритма функции main(). 8

3. Руководство пользователя. 21

Заключение. 22

Литература. 23

Приложение 1. Листинг программы.. 24

“stdafx.h”. 24

“stdafx.cpp”. 25

“Курсовой проект.cpp”. 30

Приложение 2. Распечатки результатов. 31

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

 

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

 

Введение

 

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

 

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

 

Для решения данной задачи использовались знания из области базовых средств языка С++: типы данных, переменные, указатели, условные операторы, операторы циклов, массивы, перечисления и структуры.

Переменная– это именованная область памяти, в которой хранятся данные определенного типа. Имя служит для обращения к области памяти, в которой хранятся данные. Тип данных определяет:

- внутреннее представление данных в памяти компьютера;

- множество значений, принимаемых величинами этого типа;

- операции и функции, которые к ним можно применять.

Все типы языка С++ можно разделить на основные (стандартные) и составные. В языке С++ определено 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.

 

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

 

Описание разработанной структуры

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

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”.