Простой пример инвентаризации склада



 

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

Инвентарная ведомость будет храниться в структурах типа inv_type , организованных в массиве invtry .

 

 

Размер массива выбран произвольно. При желании его можно легко изменить. Обратите внимание на то, что размерность массива задана с использованием const ‑переменной. А поскольку размер массива во всей программе используется несколько раз, применение const ‑переменной для этой цели весьма оправданно. Чтобы изменить размер массива, достаточно изменить значение константной переменной SIZE , а затем перекомпилировать программу. Использование const ‑переменной для определения "магического числа" , которое часто употребляется в программе, – обычная практика в профессиональном С++‑коде.

Разрабатываемая программа должна обеспечить выполнение следующих действий:

■ ввод информации о товарах, хранимых на складе;

■ отображение инвентарной ведомости;

■ модификация заданного элемента.

Прежде всего напишем функцию main() , которая должна иметь примерно такой вид.

 

 

Функция main() начинается с вызова функции init_list() , которая инициализирует массив структур. Затем организован цикл, который отображает меню и обрабатывает команду, выбранную пользователем. Приведем код функции init_list() .

 

 

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

Функция menu_select() отображает команды меню и принимает вариант, выбранный пользователем.

 

 

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

Функция menu() вызывает библиотечную функцию C++ strchr() , которая имеет такой прототип.

 

 

Эта функция просматривает строку, адресуемую указателем str , на предмет вхождения в нее символа, который хранится в младшем байте переменной ch . Если такой символ обнаружится, функция возвратит указатель на него. И в этом случае значение, возвращаемое функцией, по определению будет истинным. Но если совпадения символов не произойдет, функция возвратит нулевой указатель, который по определению представляет собой значение ЛОЖЬ. Так здесь организована проверка того, являются ли значения, вводимые пользователем, допустимыми командами меню.

Функция enter() предваряет вызов функции input() , которая "подсказывает" пользователю порядок ввода данных и принимает их. Рассмотрим код обеих функций.

 

 

Функция enter() сначала находит пустую структуру. Для этого проверяется поле item каждого (по очереди) элемента массива invtry , начиная с первого. Если поле item оказывается пустым, то предполагается, что структура, к которой оно относится, еще ничем не занята. Если не отыщется ни одной свободной структуры при проверке всего массива структур, управляющая переменная цикла i станет равной его размеру. Это говорит о том, что массив полон, и в него уже нельзя ничего добавить. Если же в массиве найдется свободный элемент, будет вызвана функция input() для получения информации о товаре, вводимой пользователем. Если вас интересует, почему код ввода данных о новом товаре не является частью функции enter() , то ответ таков: функция input() используется также и функцией update() , о которой речь впереди.

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

 

 

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

Нам осталось рассмотреть функцию display() . Она выводит на экран инвентарную ведомость в полном объеме. Код функции display() выглядит так.

 

 

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

 

 

 

Передача структур функциям

 

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

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

 

 

Здесь как аргумент arg в функции main() , так и параметр parm в функции f1() имеют одинаковый тип. Поэтому аргумент arg можно передать функции f1() . Если бы типы этих структур были различны, при компиляции программы было бы выдано сообщение об ошибке.

 

Присваивание структур

 

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

 

 

Эта программа генерирует следующие результаты.

 

 

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

 

 

Несмотря на то что структуры stype1 и stype2 физически одинаковы, с точки зрения компилятора они являются отдельными типами.

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

 

Использование указателей на структуры и оператора "стрелка"

 

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

Указатель на структуру объявляется так же, как указатель на любую другую переменную, т.е. с помощью символа "*" , поставленного перед именем структурной переменной. Например, используя определенную выше структуру inv_type , можно записать следующую инструкцию, которая объявляет переменную inv_pointer указателем на данные типа inv_type :

 

 

Чтобы найти адрес структурной переменной, необходимо перед ее именем разместить оператор "&" . Например, предположим, с помощью следующего кода мы определяем структуру, объявляем структурную переменную и указатель на структуру определенного нами типа.

 

 

Тогда при выполнении инструкции

 

 

в указатель р будет помещен адрес структурной переменной person .

К членам структуры можно получить доступ с помощью указателя на эту структуру. Но в этом случае используется не оператор "точка" , а оператор "‑>" . Например, при выполнении этой инструкции мы получаем доступ к полю balance через указатель р :

 

 

Оператор "‑>" называется оператором "стрелка" . Он образуется с использованием знаков "минус" и "больше" .

Оператор "стрелка" (‑>) позволяет получить доступ к членам структуры с помощью указателя.

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

Узелок на память. Чтобы получить доступ к членам структуры, используйте оператор "точка". Чтобы получить доступ к членам структуры с помощью указателя, используйте оператор "стрелка".

 


Дата добавления: 2018-09-22; просмотров: 309; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!