close

Вход

Забыли?

вход по аккаунту

?

Taratun

код для вставкиСкачать
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
Федеральное государственное автономное
образовательное учреждение высшего образования
САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
АЭРОКОСМИЧЕСКОГО ПРИБОРОСТРОЕНИЯ
ТЕХНОЛОГИЯ РАЗРАБОТКИ
ЛОГИСТИЧЕСКОГО ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
ДЛЯ ТРАНСПОРТНЫХ ПРОЦЕССОВ
Методические указания
к выполнению практических заданий
Составитель – В. Е. Таратун
Рецензент – кандидат экономических наук, доцент А. И. Гоняаров
Рассматривается сущность логистического программного обеспечения
для транспортных процессов. Анализируются проблемы, связанные с основными методами и алгоритмами программирования, которые нашли применение при разработке специализированного логистического программного
обеспечения, c рассмотрением комплексного подхода к решению системных
вопросов.
Разбираются вопросы общей теории программирования; классификация
языков программирования и основные методики. Приводятся алгоритмы
для программирования систем и практические примеры. Помимо теоретических вопросов, приведены практические задания по курсу «Технология разработки логистического программного обеспечения для транспортных процессов».
Предназначено для бакалавров, специалистов и магистров кафедры системного анализа и логистики ГУАП направлений 27.03.03 – «Системный
анализ и управление», 23.03.01 – «Технология транспортных процессов»,
27.04.04 – «Управление в технических системах», 23.04.01 – «Технология
транспортных процессов». Методические указания могут быть полезны для
аспирантов и магистров, проводящих исследования в прикладных областях
науки.
Публикуется в авторской редакции.
Компьютерная верстка Н. Н. Караваевой
Сдано в набор 6.0.1. Подписано к печати 26.0.. Формат 60u84 1/16.
Усл. печ. л. ,. Тираж 50 экз. Заказ № 185.
Редакционно-издательский центр ГУАП
190000, Санкт-Петербург, Б. Морская ул., 67
© Санкт-Петербургский государственный
университет аэрокосмического
приборостроения, 2018
ВВЕДЕНИЕ
Информатизация населения. Что же это? Давайте разберемся.
Сегодня у каждого из нас есть свой некий помощник, который позволяет к примеру спланировать день, добавляя множество встреч
в органайзер, когда нам необходимо что то записать, то мы вместо
того, чтобы взять ручку и лист бумаги — набрасываем заметку
в электронном виде на том или ином устройстве. Нужно выступить
на конференции и необходим тезисный план доклада? Без проблем.
В этом нам поможет принтер, который в совокупности с графическим программным обеспечением позволит представить нужную
нам информацию в любом виде. Вы студент или магистрант, а может быть даже аспирант? Вы изучаете различные дисциплины? Так
возьмём же к примеру планшет и будем лекции писать на нем, а информацию сохраним в облаке, чтобы ничего не потерялось со временем. Тетрадь с важной лекцией, да и с любой другой информацией
можно потерять, а вот если информация хранится в электронном
виде, да ещё и расположена в облачном пространстве, то нужно ещё
постараться, чтобы данную информацию удалить. Электронные
устройства на сегодняшний день являются неотъемлемой частью
организации образа деятельности любого человека. В каждой сфере
деятельности существует ряд задач, которые человек выполняет и
электронные устройства позволяют оптимизировать данный процесс в полной мере.
Так что же такое информатизация?
Информатизацией называется процесс интеграции компьютерных средств, информационных и коммуникационных технологий
с целью получения новых общесистемных свойств, позволяющих
более эффективно организовать продуктивную деятельность человека, группы, социума1.
Другими словами, информатизация – это некий своего рода процесс оптимизации организации деятельности человека в той или
иной области деятельности.
1
Википедия – определение информатизации
3
Важными составляющими при реализации данного процесса являются как минимум два основных процесса – техническая
и программная реализация. Если с первым все более менее понятно,
то второй требует колоссальных умений и навыков в области программирования. На сегодняшний день тяжело представить жизнь
без информационных систем управления. К примеру вы стоите на
остановке и ждете свой транспорт, а информационное табло информирует вас о времени ожидания. Вторым примером является разработка интеллектуальных транспортных систем управления транспортными потоками, которые позволяют обеспечивать контроль,
а также безопасность дорожного движения на различных уровнях
транспортного планирования1. Наверно даже не стоит упоминать
насколько Microsoft Office по сей день облегчает нам работу в различных сферах деятельности. Таким образом, информационные
системы позволяют нам оптимизировать нашу деятельность и нацелить наш взор на достижение поставленных целей.
Целью данного методического пособия является освящение основных принципов и методик программирования информационных систем на примере языка программирования высокого уровня – С++.
1 Книга Интеллектуальные транспортные системы С.В. Жанказиев//учебное
пособие//Московский автомобильно-дорожный государственный технический университет http://lib.madi.ru/fel/fel1/fel16E377.pdf
4
1. ОСОБЕННОСТИ ДАННЫХ ДЛЯ ПОСТРОЕНИЯ
ИНФОРМАЦИОННЫХ СИСТЕМ ТРАНСПОРТНЫХ ПРОЦЕССОВ
И УПРАВЛЕНИЯ ЦЕПЯМИ ПОСТАВОК
Сегодня в значительной степени развита логистическая составляющая. Основной целью логистики является обеспечение потребителя продукцией в нужное время в определенном месте при достижении минимальных издержек организации данного процесса.
При рассмотрении данного процесса имеется как минимум два
основных потока: материальный поток и информационный поток
(рис. 1). Материальным потоком является продукция в процессе
добавления различных логистических операций для достижения
определенных целей при определенном временном интервале.
Информационным потоком же является поток данных в устной,
документной и других формах, который параллельно следует движению материального потока.
Также при рассмотрении различных логистических систем материальный поток разделяется на внешний, который находится вне
логистической системы и на внутренний, который характеризуется операциями, происходящими внутри логистической системы.
К примеру операции погрузки груза на выбранный вид транспорта
для доставки потребителю.
Кроме того, материальные потоки могут быть входными и выходными.
Входной материальный поток поступает в логистическую систему из внешней среды, а выходной – из логистической системы во
внешнюю среду. При этом они могут быть между собой равны, если
соблюдается сохранность запасов внутри логистической системы.
Как уже было ранее сказано – основной задачей логистики является обеспечение потребителя продукцией в нужное время в определенном месте при достижении минимальных издержек организации данного процесса, а основной же задачей информационных
логистических систем – является оптимизация работы каждого
Материальный поток
Поставщик
Внутренняя структура
логистической компании
Потребитель
Информационный поток
Рис. 1. Обобщенная схема движения потоков
5
звена на каждом из уровней при выполнении различных операций
по достижению необходимых целей, поставленных перед поставщиком (т. е. логистической компанией) – потребителем.
Таким образом, информационная логистическая система (ИЛС)
должна иметь целый спектр возможностей.
По мере структурирования промышленных компаний все более
популярными становятся современные автоматизированные системы поддержки управленческой деятельности, так называемые,
ERP-системы (от Enterprise resources planning – Управление ресурсами предприятия).
ERP-системы – набор интегрированных приложений, которые
комплексно, в едином информационном пространстве поддерживают все основные аспекты управленческой деятельности предприятий – планирование ресурсов (финансовых, человеческих, материальных) для производства товаров (услуг), оперативное управление
выполнением планов (включая снабжение, сбыт, ведение договоров),
все виды учета, анализ результатов хозяйственной деятельности.
Основными требованиями, предъявляемыми к ERP-системам
являются: централизация данных в единой базе, близкий к реальному времени режим работы, сохранение общей модели управления
для предприятий любых отраслей, поддержка территориально-распределенных структур, работа на широком круге аппаратно-программных платформ и СУБД.
ERP-системы – это компьютерные системы, созданные для обработки деловых операций организации и для содействия комплексному и оперативному (в режиме реального времени) планированию,
производству и обслуживанию клиентов. В частности, ERP-системы
имеют следующие характеристики: это готовое ПО, разработанное
для среды клиент-сервер, как традиционной, так и базирующейся
на интернет-технологиях; эти системы интегрируют большинство
бизнес-процессов; они обрабатывают большую часть деловых операций организации; эти системы используют БД всего предприятия,
каждый образец данных в которой запоминается, как правило,
единожды; они обеспечивают доступ к данным в режиме реального
времени: в некоторых случаях данные системы позволяют интегрировать обработку деловых операций и действий по планированию
(например, производственное планирование).
Более того, ERP-системы все чаще имеют такие дополнительные
характеристики, как: поддержка многочисленных валют и языков
(что очень важно для транснациональных компаний); поддержка
конкретных отраслей (например, SAP поддерживает большое число
6
отраслей, включая нефтяную и газовую отрасли, здравоохранение,
химическую промышленность и банковское дело); способность к настройке (кастомизации) без программирования (например, установкой «переключателей»).
Перечислим основные преимущества внедрения и использования ERP-системы: ERP-системы интегрируют виды деятельности
фирмы.
Процессы планирования ресурсов предприятий являются межфункциональными, заставляющими фирму выходить за традиционные, функциональные и локальные рамки. Кроме того, различные бизнес-процессы предприятия часто связаны между собой.
Более того, данные, располагавшиеся ранее на различных неоднородных системах, сейчас интегрированы в единую систему.
ERP-системы используют «лучшие практики».
Системы планирования ресурсов предприятий вобрали в себя
более тысячи лучших способов организации бизнес-процессов. Эти
лучшие практики могут быть использованы для улучшения работы фирм. Выбор и внедрение ERP-систем требует внедрения таких
лучших практик.
ERP-системы делают возможной организационную стандартизацию.
Системы планирования ресурсов предприятий делают возможной организационную стандартизацию различных географически
разделенных подразделений. В результате подразделения с нестандартными процессами можно сделать такими же, как и другие подразделения, имеющие эффективные процессы. Более того, фирма
может предстать перед внешним миром как единая организация.
Вместо того чтобы получать разные документы, когда какая-то
фирма имеет дело с разными филиалами или предприятиями данной компании, эта компания может быть представлена миру в виде
единого общего образа, что ведет к улучшению ее имиджа.
ERP-системы устраняют информационную асимметрию.
Системы планирования ресурсов предприятий складывают всю
информацию в одну и ту же основную БД, устраняя многочисленные информационные несоответствия. Это приводит к нескольким
результатам. Во-первых, обеспечивается повышение контроля.
Если один из пользователей не выполняет свою работу, другой видит, что что-то не было сделано. Во-вторых, открывается доступ
к информации для тех, кому она нужна; в идеале, обеспечивается
улучшенная информация для принятия решений. В-третьих, информация перестает быть предметом посредничества, так как она
7
становится доступной и для руководства, и для служащих компании. В-четвертых, организация может стать «плоской»: так как
информация широко доступна, нет потребности в дополнительных
малоценных работниках, чья основная деятельность – подготовка
информации для распространения среди руководства и служащих
компании.
ERP-системы обеспечивают информацией в реальном времени.
В традиционных системах большое количество информации фиксируется на бумаге, а затем передается другой части организации,
где она или переоформляется (обычно агрегируется), или переводится в компьютерный формат. С ERP-системами большое количество информации собирается у источника и непосредственно помещается в компьютер. В результате, информация тут же становится
доступной для других.
ERP-системы обеспечивают одновременный доступ к одним и
тем же данным для планирования и контроля.
Системы планирования ресурсов предприятия используют единую БД, где большая часть информации вводится один и только
один раз. Так как данные доступны в реальном времени, фактически все пользователи организации имеют доступ к одной и той же
информации для планирования и контроля. Это может способствовать более согласованному планированию и управлению по сравнению с традиционными системами.
ERP-системы способствуют взаимодействию и сотрудничеству
внутри организации.
Системы планирования ресурсов предприятий также способствуют взаимодействию и сотрудничеству внутри организации
(между различными функциональными и географически разделенными подразделениями). Наличие взаимосвязанных процессов приводит функциональные и географически разделенные подразделения к взаимодействию и сотрудничеству. Стандартизация
процессов также способствует сотрудничеству, так как между процессами становится меньше противоречий. Кроме того, единая БД
способствует взаимодействию, обеспечивая каждое географически
разделенное и функциональное подразделение нужной им информацией.
ERP-системы способствуют взаимодействию и сотрудничеству
между организациями.
ERP-система обеспечивает информационную магистраль для
организации взаимодействия и сотрудничества с другими организациями. Фирмы все больше и больше открывают партнерам свои
8
БД для облегчения снабжения и других видов деятельности. Чтобы
данная система работала, необходим единый архив, которым могут
пользоваться партнеры; и ERP-системы могут быть использованы
для содействия таким обменам1.
Ясно, что ИЛС работают со сложными типами и большим объёмом баз данных и имеют мощную архитектуру компонентов.
Как парадоксально не звучит, но все программное обеспечение,
которое мы с вами имеем, видели, в том числе комплекс элементом
ERP систем – разработан на каком-либо языке программирования. Давайте разберемся, какие же языки программирования есть
и в чем их различия.
1 SAP R/3 System. Function in detail. Material Management / Production Planning,
SAP. 2004 / Управление материальными потоками. Перевод на русск. яз. 2006 г.
9
2. СОВРЕМЕННЫЕ ЯЗЫКИ ПРОГРАММИРОВАНИЯ
ДЛЯ РАЗРАБОТКИ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ
На сегодняшний день существует большое количество языков
программирования. Каждый из них имеет как преимущества, так
и недостатки. В общем виде языки программирования можно представить в следующем виде:
1. Языки программирования низкого уровня.
2. Языки программирования высокого уровня.
3. Безопасные и небезопасные языки программирования.
4. Компилируемые и интерпретируемые языки.
Ярким представителем языков программирования низкого
уровня является – Ассемблер.
Основной методикой работы с языками низкого уровня является программирование непосредственно на уровне машинных кодов. В зависимости от применяемого типа процессора используется
определенный набор деректив и функций которые применяются1.
К языкам программирования высокого уровня можно отнести
следующие языки:
1) C++
2) С#
3) Visual Basic
4) Python
5) Perl
6) Fortran
7) Delphi(Pascal)
8) Lisp
Язык программирования высокого уровня – язык программирования, разработанный для предоставления возможности программисту удобств в разработке программного обеспечения. Важным нововведением в языках программирования высокого уровня
в отличии от языков низкого уровня является такое понятие как
абстракция различного вида конструкций, которые очень сложны
в реализации с точки зрения работы на машинном языке, требующие большого количества времени для реализации определенной
структуры.
Таким образом, программист не тратит большое количество времени на реализацию нужной конструкции, а нацелен на достижение поставленных целей.
1
10
https://ru.bmstu.wiki/Язык_программирования
Безопасные и небезопасные языки программирования.
Безопасность того или иного языка определяется возможностью
выхода определенных типов данных за рамки значений в процессе
выполнения программы. В следствии чего есть возможность некорректной работы программы или ее высокая ошибка в работе.
Рассматривая язык программирования С++, степень безопасности определяется не особо высокая. Ввиду проблем с приведением
типов данных друг к другу возникают моменты, когда приведение
типов происходит не должным образом и таким образом возрастает
ошибка приведения одного типа к другому.
Гарантировать корректность программ и безотказность невозможно, так как в любом случае существует процент погрешностей
при выполнении действий.
Компилируемые и интерпретируемые языки
При компиляции исходный код, который был написан программистом при помощи специальной программы – компилятора переводится на машинный язык. Результатом компиляции является набор машинных команд для выполнения действий процессором.
Другими словами, компилятор переводит исходный текст программы с языка программирования высокого уровня в двоичные
коды инструкций процессора.
При написании программы нана интерпретируемом языке, интерпретатор выполняет (интерпретирует) исходный текст без предварительного перевода. При этом программа остаётся неизменной и
не может быть запущена без модуля интерпретатора. Можно сказать,
что процессор компьютера — это интерпретатор машинного кода.
Простым языком при компиляции программы, компилятор переводит написанную программу в набор инструкций для процессора и сохраняет инструкции в одельном файле, а интерпретатор выполняет программу сразу во время ее исполнения.
Деление языков программирования на компилируемые и интерпретируемые является в некотором смысле условным. Так как
для любого интерпретируемого языка можно создать компилятор
и проблем при компиляции данных возникать не будет и наоборот,
для любого компилируемого языка может быть разработан интерпретатор.
Программы, которые проходят компиляцию выполняются быстрее и не требуют для наличия сторонних программ, так как уже
переведены на язык понятный компьютеру.
Но при корректировке кода – данная программа требует компиляции снова, что замедляет ее выполнение в свою очередь.
11
При компиляции определяется тип процессора, а также операционная система в которой происходит разработка программного
обеспечения, что в свою очередь ограничивает возможность выполнения программы тем компьютером, где она была скомпилирована.
Интерпретируемые же языки имеют возможность, запускать
программы сразу же после изменения, что облегчает поставленные
задачи. Так же при разработке на интерпретируемом языке программы могут быть запущены на практически любых типах машин
и под любыми операционными системами.
Минусом же интерпретируемых языков является скорость выполнения по сравнению с компилируемыми языками, а так же они
требуют дополнительно программы – интерпретатора.
Компилированными языками являются: Assembler, C++, Pascal
Интерпритируемыми языками являются: PHP, JavaScript,
Python.
Java и C#, находятся между компилируемыми и интерпретируемыми.
12
3. ОСНОВЫ ЯЗЫКА С++
Для начала давайте напишем самую простую программу на С++
и разберем ее построчно.
Рассматривая различные источники по языкам программирования, первой программой в них авторы приводят программу выведения информации на экран в консоли. Не будем изменять уже
сложившимся традициям и напишем нашу программу по выводу
текста в консоль. Выглядеть она будет следующим образом:
ɩɨɞɤɥɸɱɟɧɢɟɛɢɛɥɢɨɬɟɤɢɜɜɨɞɚɜɵɜɨɞɚ
#include <iostream>
ɩɨɞɤɥɸɱɟɧɢɟɫɬɚɧɞɚɪɬɧɨɝɨɩɪɨɫɬɪɚɧɫɬɜɚɢɦɟɧɞɥɹɢɫɩɨɥɶɡɨɜɚɧɢɹ
ɛɢɛɥɢɨɬɟɤ
using namespace std;
Ƚɥɚɜɧɵɣɦɟɬɨɞɩɪɨɰɟɞɭɪɚ±PDLQȼɵɩɨɥɧɟɧɢɟɩɪɨɝɪɚɦɦɵɜɫɟɝɞɚ
ɧɚɱɢɧɚɟɬɫɹɫɮɭɧɤɰɢɢPDLQ
void main()
{
ɜɵɜɨɞɬɟɤɫɬɚɧɚɷɤɪɚɧ
cout<<Ⱦɨɛɪɨɩɨɠɚɥɨɜɚɬɶɜɦɢɪɋ<<endl;
}
Давайте разберем все строки нашей первой программы.
#include <iostream>
передает команду препроцессору о необходимости включить в состав проекта разрабатываемой программы стандартную библиотеку
ввода-вывода. С помощью команд #include происходит подключение
различных заголовочных файлов, реализованных пользователем,
а также стандартных библиотек, которые будут нужны. Библиотека ввода- вывода должна быть включена в состав тех программ, которые будут производить вывод или считывание информации с клавиатуры.
using namespace std;
Помимо того, что для использования стандартных библиотек необходимо подключить их, также необходимо указать пространство
имен, где расположена та или иная библиотека. Все стандартные
библиотеки сгруппированы в некоторые пространства имен. Для
определения пространства имен используются ключевые слова:
using namespace std. В данном случае указано пространство имен
std , так как именно в нем находится библиотека ввода-вывода.
13
Элемент //
Элемент // в С++ относится к комментарию. В С++ существуют
как однострочные комментарии, так и многострочные.
Однострочный комментарий начинается с символов //, которые
показывают, что остальная часть строки будет комментарием и не
будет использоваться как как некий исходный код.
Бывают ситуации, когда недостаточно применения однострочного комментария, тогда на помощь приходят многострочные комментарии. Структура формирования многострочного комментария
представлена ниже:
ɦɧɨɝɨɫɬɪɨɱɧɵɣ
ɤɨɦɦɟɧɬɚɪɢɣ
void main()
Следующее что разберем это понятие функции.
В данном случае имеем функцию main.
Функция main() имеется в любой программе на C++. Фигурные
скобки после main показывают, что это функция. Программы написанные на языке С++ как правило состоят из множества классов,
а также описания различных функций, но в любой программе есть
функция main и именно с нее и начинается выполнение программы.
У каждой функции должна быть определенная структура реализации. Существует такое понятие как тело функции. Тело функции
начинается с левой фигурной скобки.
{
Заканчивается тело функции также с помощью правой фигурной скобки.
}
Реализация функции должна находится между ними.
Ключевое слово void перед main определяет, что функция main не
возвращает никакого значения.
cout<<”Ⱦɨɛɪɨɩɨɠɚɥɨɜɚɬɶɜɦɢɪɋ”<<endl;
Эта строка называет оператором. Любой оператор C++ должен
заканчиваться точкой с запятой.
Вывод и ввод осуществляется с помощью потока символов. Когда
вызывается оператор cout, то он передает строку Ⱦɨɛɪɨ ɩɨɠɚɥɨɜɚɬɶ
ɜɦɢɪɋ в выходной поток, который в свою очередь выводится на
экран.
Операция << называется передачей информации в поток. При выполнении программы, значение справа от символа <<, помещается
в выходящий поток. Направление знаков в свою очередь определено
направлению движения потока информации вывода.
14
3.1. Переменные и работа с ними
Реализуем программу сложения двух целых чисел.
#include <iostream>
ɩɨɞɤɥɸɱɟɧɢɟɫɬɚɧɞɚɪɬɧɨɝɨɩɪɨɫɬɪɚɧɫɬɜɚɢɦɟɧɞɥɹɢɫɩɨɥɶɡɨɜɚɧɢɹ
ɛɢɛɥɢɨɬɟɤ
using namespace std;
ȽɥɚɜɧɚɹɮɭɧɤɰɢɹPDLQ
void main()
{
ɨɛɴɹɜɥɟɧɢɹɩɟɪɟɦɟɧɧɵɯ
int a, b;
int sum=0;
cout<<´ɜɜɟɞɢɬɟɡɧɚɱɟɧɢɟɩɟɪɟɦɟɧɧɨɣ´; ɜɵɜɨɞɧɚɷɤɪɚɧ
ɢɧɮɨɪɦɚɰɢɢɨɧɟɨɛɯɨɞɢɦɨɫɬɢɜɜɟɫɬɢɡɧɚɱɟɧɢɟɩɟɪɜɨɣɩɟɪɟɦɟɧɧɨɣ
cin>>a; ɂɧɢɰɢɚɥɢɡɚɰɢɹɩɟɪɟɦɟɧɧɨɣ
cout<<´ɜɜɟɞɢɬɟɡɧɚɱɟɧɢɟɩɟɪɟɦɟɧɧɨɣ´; ɜɵɜɨɞɧɚɷɤɪɚɧ
ɢɧɮɨɪɦɚɰɢɢɨɧɟɨɛɯɨɞɢɦɨɫɬɢɜɜɟɫɬɢɡɧɚɱɟɧɢɟɜɬɨɪɨɣɩɟɪɟɦɟɧɧɨɣ
cin>>b; ɂɧɢɰɢɚɥɢɡɚɰɢɹɩɟɪɟɦɟɧɧɨɣ
VXP DEɫɥɨɠɢɬɶɱɢɫɥɚɡɚɩɢɫɚɬɶɫɭɦɦɭɜVXP
cout<<´ɫɭɦɦɚɪɚɜɧɚ ´<<sum<<endl; ɜɵɜɨɞɫɭɦɦɵ
a, b и sum являются именами переменных.
Переменная – место в оперативной памяти компьютера, где расположено значение для использования его в программе.
Такая конструкция определяет, что переменные a, b и sum имеют
целочисленный тип – int. Несколько переменных одинакового типа
могут быть объявлены в одном или же в нескольких объявлениях.
При объявлении нескольких переменных одинакового типа в одной
строке – переменные разделяются запятыми.
Имя используемой переменной называют идентификатором.
Идентификатор – это набор символов, состоящий из латинских
букв, цифр и символов подчеркивания ( _ ), характеризующий имена переменных. Запрещено определять имена переменных, которые
начинаются с цифр и символа подчеркивания. Кроме того, в С++
различаются идентификаторы написанные в разных регистрах.
A и a являются разными переменными. Количество символов, используемых в названии идентификатора может быть любым.
В языке С++ объявление переменных можно делать в любом месте разрабатываемой программы. Существует такие понятия как
15
объявление переменной (определение ее типа) и ее инициализация
(передача ей некоторого значения). При этом возможна реализация
и объявления и инициализации в одной строке кода:
int k; ɨɛɴɹɜɥɟɧɢɟɩɟɪɟɦɟɧɧɨɣɢɨɩɪɟɞɟɥɟɧɢɟɟɟɬɢɩɚ
N ɢɧɢɰɢɚɥɢɡɚɰɢɹ
intP ɨɛɴɹɜɥɟɧɢɟɨɩɪɟɞɟɥɟɧɢɟɢɧɢɰɢɚɥɢɡɚɰɢɹɩɟɪɟɦɟɧɧɨɣ
Основные используемые типы данных типы данных указаны
в приложении 1.
1.2. Арифметические операторы
Арифметические операторы бывают бинарные и унарные. В бинарных операторах существует два операнда. В унарных операторах
участвует только один операнд. Рассмотрим программу с использованием бинарных и унарных операторов.
ɩɨɞɤɥɸɱɟɧɢɟɛɢɛɥɢɨɬɟɤɢɜɜɨɞɜɵɜɨɞɚ
#include <iostream>
ɩɨɞɤɥɸɱɟɧɢɟɫɬɚɧɞɚɪɬɧɨɝɨɩɪɨɫɬɪɚɧɫɬɜɚɢɦɟɧɞɥɹɢɫɩɨɥɶɡɨɜɚɧɢɹ
ɛɢɛɥɢɨɬɟɤɢɜɜɨɞɚɜɵɜɨɞɚ
using namespace std;
ɝɥɚɜɧɚɹɮɭɧɤɰɢɹPDLQ
void main()
{
ɨɛɴɹɜɥɟɧɢɟɩɟɪɟɦɟɧɧɵɯ
int m=5, n=5;
ɛɢɧɚɪɧɵɟɚɪɢɮɦɟɬɢɱɟɫɤɢɟɨɩɟɪɚɬɨɪɵ
cout<<´[\ ´PQHQGOɨɩɟɪɚɬɨɪɫɥɨɠɟɧɢɹ
cout<<´[\ ´PQHQGOɨɩɟɪɚɬɨɪɜɵɱɢɬɚɧɢɹ
cout<<´[\ ´<<m*n<<endl; ɨɩɟɪɚɬɨɪɭɦɧɨɠɟɧɢɹ
cout<<´[\ ´<<m/n<<endl; ɨɩɟɪɚɬɨɪɰɟɥɨɱɢɫɥɟɧɧɨɝɨɞɟɥɟɧɢɹ
cout<<”m%n=”<<m%n<<endl; ɨɩɟɪɚɬɨɪɞɟɥɟɧɢɹɜɵɜɨɞɨɫɬɚɬɨɤɚ
ɭɧɚɪɧɵɟɚɪɢɮɦɟɬɢɱɟɫɤɢɟɨɩɟɪɚɬɨɪɵ
P ɷɤɜɢɜɚɥɟɧɬɧɨP P
cout<<´P ´<<m<<endl;
P ɷɤɜɢɜɚɥɟɧɬɧɨP P
cout<<´P ´<<m<<endl;
P ɷɤɜɢɜɚɥɟɧɬɧɨP P
cout<<´P ´<<m<<endl;
16
P ɷɤɜɢɜɚɥɟɧɬɧɨP P
cout<<´P ´<<m<<endl;
P ɷɤɜɢɜɚɥɟɧɬɧɨP P
cout<<´P ´<<m<<endl;
ɩɨɫɬɮɢɤɫɧɵɟɢɩɪɟɮɢɤɫɧɵɟɢɨɩɟɪɚɬɨɪɵ
m=n=0; ɨɞɧɨɜɪɟɦɟɧɧɨɟɩɪɢɫɜɚɢɜɚɧɢɟɡɧɚɱɟɧɢɣɧɟɫɤɨɥɶɤɢɦ
ɩɟɪɟɦɟɧɧɵɦ
PɷɤɜɢɜɚɥɟɧɬɧɨP P
cout<<´P´<<m<<endl;
PɷɤɜɢɜɚɥɟɧɬɧɨP P
cout<<´P´<<m<<endl;
QɷɤɜɢɜɚɥɟɧɬɧɨQ Q
cout<<´Q´<<n<<endl;
QɷɤɜɢɜɚɥɟɧɬɧɨQ Q
cout<<´Q´<<n<<endl;
Q PɷɤɜɢɜɚɥɟɧɬɧɨP PQ P
cout<<´Q PP ´<<m<<” n=”<<n<<endl;
Q PɷɤɜɢɜɚɥɟɧɬɧɨQ PP P
cout<<´Q PP ´<<m<<” n=”<<n<<endl;
}
Использование круглых скобок выполняют организацию действий согласно правилам математики.
3.3. Логические выражения и оператор if
Существуют так называемы логические операторы. Они необходимы тогда, когда в программе имеется необходимость проверки
условия и в зависимости от истинности или ложности условия при
выполнении программы предписывается выполнение различных
действий.
Таким условным оператором является оператор If.
Общая структура реализации оператора if представлена ниже.
LIɭɫɥɨɜɢɟ
{
ɛɥɨɤɨɩɟɪɚɬɨɪɨɜ
}
else
{
ɛɥɨɤɨɩɟɪɚɬɨɪɨɜ
}
Если условие истинно, то выполняется блок операторов 1, в противном же случае выполняется блок операторов 2.
17
true
false
Условие
Блок
операторов 2
Блок
операторов 1
Рис. 2. Условный оператор if в виде блок-схемы
Общая структура условного оператора в виде бок-схемы представлена на рис. 2.
Условия в операторах if могут быть сформированы с помощью
операций равенства, неравенства и отношений. Рассмотрим пример
сравнения вводимых пользователем чисел. При выполнении какого-либо из данных условий происходит вывод результата на экран.
#include <iostream>
ɩɨɞɤɥɸɱɟɧɢɟɫɬɚɧɞɚɪɬɧɨɝɨɩɪɨɫɬɪɚɧɫɬɜɚɢɦɟɧɞɥɹɢɫɩɨɥɶɡɨɜɚɧɢɹ
ɛɢɛɥɢɨɬɟɤ
using namespace std;
ɮɭɧɤɰɢɹPDLQ
void main()
{
ɨɛɴɹɜɥɟɧɢɟɩɟɪɟɦɟɧɧɵɯ
int m,n;
cout<<´ɜɜɟɞɢɬɟɱɢɫɥɚ´; ɜɵɜɨɞɢɧɮɨɪɦɚɰɢɢ
cin>>m>>n; ɮɭɧɤɰɢɹɱɬɟɧɢɹɢɧɮɨɪɦɚɰɢɢɫɤɥɚɜɢɚɬɭɪɵ
if(m == n) ɩɪɨɜɟɪɤɚɢɫɬɢɧɧɨɫɬɢɭɫɥɨɜɢɹ
cout<<m<<” == ”<<n<<endl;
ifP Qɩɪɨɜɟɪɤɚɢɫɬɢɧɧɨɫɬɢɭɫɥɨɜɢɹ
cout<<m<<´ ´<<n<<endl;
if(m < n)
ɩɪɨɜɟɪɤɚɢɫɬɢɧɧɨɫɬɢɭɫɥɨɜɢɹ
cout<<m<<” < ”<<n<<endl;
if(m > n)
ɩɪɨɜɟɪɤɚɢɫɬɢɧɧɨɫɬɢɭɫɥɨɜɢɹ
cout<<m<<” > ”<<n<<endl;
18
if(m<= n) ɩɪɨɜɟɪɤɚɢɫɬɢɧɧɨɫɬɢɭɫɥɨɜɢɹ
cout<<m<<” <= ”<<n<<endl;
if(m >= n) ɩɪɨɜɟɪɤɚɢɫɬɢɧɧɨɫɬɢɭɫɥɨɜɢɹ
cout<<m<<” >= ”<<n<<endl;
}
Запись, определяющая условие оператора if называется логическим выражением.
При необходимости разрешается применение логических операций дискретной математики.
Логическими операциями являются:
&& – логическое И
– логическое НЕ
|| – логическое ИЛИ
Примером может послужить выражение вида:
P!__P
Разрешается применение логических операций в логических выражениях.
Кроме того, в зависимости от поставленной задачи возможно
применение вложенных конструкций оператора if.
3.4. Применение селективных конструкций
При разработке программы могут возникать такие ситуации,
когда необходимо после проверки истинности логического выражения проверять также следующее логическое выражение. Такие
конструкции называют – селективными.
Селективная конструкция может быть реализована при помощи
оператора if или же при помощи оператора switch.
Рассмотрим структуру реализации селективных конструкций:
if( ɭɫɥɨɜɢɟ
{
ɛɥɨɤɨɩɟɪɚɬɨɪɨɜ
}
else if( ɭɫɥɨɜɢɟ
{
ɛɥɨɤɨɩɟɪɚɬɨɪɨɜ
}
else
{
ɛɥɨɤɨɩɟɪɚɬɨɪɨɜ
}
19
true
Условие
false
true
Условие
false
Блок
операторов 1
Блок
операторов 2
Блок
операторов 3
Рис. 3. Представление селективной конструкции в виде блок-схемы
Представление реализации селективной конструкции в виде
блок-схемы представлено на рис. 3.
Пример реализации селективной конструкции с помощью оператора switch.
switch ( ɩɟɪɟɦɟɧɧɚɹ )
{
case ɤɨɧɫɬɚɧɬɚ
{
ɛɥɨɤɨɩɟɪɚɬɨɪɨɜ
break;
}
case ɤɨɧɫɬɚɧɬɚ
{
ɛɥɨɤɨɩɟɪɚɬɨɪɨɜ
break;
}
default:
{
ɛɥɨɤɨɩɟɪɚɬɨɪɨɜ
}
}
20
Вычисление
выражения
true
Выражение
= const1
true
false
Выражение
= const2
false
Блок
операторов 1
Блок
операторов 2
Блок
операторов 3
Рис. 4. Представление селективной конструкции в виде блок-схемы
(оператор switch)
Представление селективной конструкции с помощью оператора
switch в виде блок-схемы представлено на рис. 4.
Рассмотрим пример определения оценки студента в зависимости
от количества балов, полученных при выполнении заданий за семестр.
ɩɨɞɤɥɸɱɟɧɢɟɛɢɛɥɢɨɬɟɤɢɜɜɨɞɜɵɜɨɞɚ
#include <iostream>
ɩɨɞɤɥɸɱɟɧɢɟɛɢɛɥɢɨɬɟɤɢɫɬɪɨɤ
#include <string>
ɩɨɞɤɥɸɱɟɧɢɟɫɬɚɧɞɚɪɬɧɨɝɨɩɪɨɫɬɪɚɧɫɬɜɚɢɦɟɧɞɥɹɢɫɩɨɥɶɡɨɜɚɧɢɹ
ɛɢɛɥɢɨɬɟɤɢɜɜɨɞɚɜɵɜɨɞɚ
using namespace std;
ɮɭɧɤɰɢɹPDLQ
21
void main()
{
ɤɨɥɢɱɟɫɬɜɨɛɚɥɥɨɜ
int sum;
ɨɰɟɧɤɚɫɬɪɨɤɚɫɢɦɜɨɥɨɜ
string rezult;
ɜɜɨɞɛɚɥɥɨɜ
cout<<´ɜɜɟɞɢɬɟɤɨɥɢɱɟɫɬɜɨɛɚɥɥɨɜ´;
cin>>sum;
ɨɩɪɟɞɟɥɟɧɢɟɨɰɟɧɤɢ
if ( sum >= 85 ) ɢɛɨɥɟɟɛɚɥɥɨɜɨɰɟɧɤɚɨɬɥɢɱɧɨ
rezult=´ɨɬɥɢɱɧɨ´;
else if ( sum >= 70 ) ɨɰɟɧɤɚ
rezult=´ɯɨɪɨɲɨ´;
else if ( sum >= 55 ) ɨɰɟɧɤɚ
rezult=´ɭɞɨɜɥɟɬɜɨɪɢɬɟɥɶɧɨ´;
else ɦɟɧɟɟ
rezult=´ɨɬɪɢɰɚɬɟɥɶɧɨ´;
ɜɵɜɨɞɨɰɟɧɤɢɧɚɷɤɪɚɧ
ɞɥɹɜɵɜɨɞɚɫɬɪɨɤɢɧɟɨɛɯɨɞɢɦɨɩɪɟɨɛɪɚɡɨɜɚɬɶɟɟɜɧɚɛɨɪ
ɫɢɦɜɨɥɨɜɩɪɢɩɨɦɨɳɢɮɭɧɤɰɢɢF B VWU
cout<<´ȼɚɲɚɨɰɟɧɤɚ´<<rezult<<endl;
}
В данном случае программа проверяет все условия последовательно. Другим же вариантом реализации селективной конструкции может быть использование оператора switch.
Рассмотрим пример выбора действий над введенными переменными.
ɩɨɞɤɥɸɱɟɧɢɟɛɢɛɥɢɨɬɟɤɢɜɜɨɞɚɜɵɜɨɞɚ
#include <iostream>
ɩɨɞɤɥɸɱɟɧɢɟɫɬɚɧɞɚɪɬɧɨɝɨɩɪɨɫɬɪɚɧɫɬɜɚɢɦɟɧɞɥɹɢɫɩɨɥɶɡɨɜɚɧɢɹ
ɛɢɛɥɢɨɬɟɤɢɜɜɨɞɚɜɵɜɨɞɚ
using namespace std;
ɝɥɚɜɧɚɹɮɭɧɤɰɢɹPDLQ
void main()
{
ɤɨɥɢɱɟɫɬɜɨɛɚɥɥɨɜ
int a,b;
22
ɜɵɛɨɪɞɟɣɫɬɜɢɹ
int rezult;
ɜɜɨɞɩɟɪɟɦɟɧɧɵɯ
cout<<´ɜɜɟɞɢɬɟɩɟɪɟɦɟɧɧɵɟDɢE´;
cin>>a>>b;
// ɨɩɟɪɚɬɨɪɜɵɛɨɪɚɞɟɣɫɬɜɢɹ
cout<<´ɜɵɛɟɪɢɬɟɞɟɣɫɬɜɢɟ³ <<endl;
cout<<´DE ´ <<endl <<´DE ´ <<endl <<´DE ´ <<endl <<´
a*b=” <<endl;
cin>>rezult;
switch(rezult)
{
// ̛̖̭̣ɜɵɛɪɚɥɢ
case
{
cout<<´DE ³DEHQGO
break;
}
// ̛̖̭̣ɜɵɛɪɚɥɢ
case
{
cout<<´DE ´DEHQGO
break;
}
// ̛̖̭̣ɜɵɛɪɚɥɢ
case
{
cout<<”a/b=”<<a/b<<endl;
//
break;
}
// ̛̖̭̣ɜɵɛɪɚɥɢ
case
{
cout<<”a*b=”<<a*b<<endl;
break;
}
23
ɜɩɪɨɬɢɜɧɨɦɠɟɫɥɭɱɚɟ
default :
{
cout<<´ɧɟɜɟɪɧɵɣɜɵɛɨɪ´<<endl;
}
}
Когда программа доходит до оператора switch, она определяет
следующее за switch управляющее выражение – result. Оператор
switch выполняет сравнение полученного значения с управляющим
выражением каждой из меток case. Оператор break регламентирует
переход программы к первому оператору после оператора switch.
Если после сравнения управляющего выражения с исходами
case не найдется полученного случая, то будет выполнен случай,
определенный в метке – default.
3.5. Циклы while и do while
Циклом является некое повторение действий, пока остается истинным условие.
Существует два цикла – while и do while.
В качестве примера цикла while рассмотрим программу, вычисляющие степени двойки, не превышающие 100:
ɩɨɞɤɥɸɱɟɧɢɟɛɢɛɥɢɨɬɟɤɢɜɜɨɞɜɵɜɨɞɚ
#include <iostream>
ɩɨɞɤɥɸɱɟɧɢɟɫɬɚɧɞɚɪɬɧɨɝɨɩɪɨɫɬɪɚɧɫɬɜɚɢɦɟɧɞɥɹɢɫɩɨɥɶɡɨɜɚɧɢɹ
ɛɢɛɥɢɨɬɟɤ
using namespace std;
/////////////////////////////////////////////////////////////////////////////
ɮɭɧɤɰɢɹPDLQ
void main()
{
ɨɩɢɫɚɧɢɟɩɟɪɟɦɟɧɧɵɯ
intP ɨɩɟɪɚɬɨɪɰɢɤɥɚɫɩɪɟɞɭɫɥɨɜɢɟɦ
whileP {
SURGXFW P
cout<<”m=”<<m<<endl;
}
}
24
При выполнении цикла while, переменная m = 2. Повторение
цикла формирует операцию умножения m на 2, так что переменная
будет иметь следующие значения 4, 8, 16, 32, 64, 128. Когда переменная m станет равна 128, то условие оператора while перестанет
быть истинным. Это завершит работу цикла. А окончательным значением переменной m будет 128.
Если мы не определим действия, которые в последствии завершат работу цикла, то он будет повторяться бесконечно и такая ситуация будет называться – рекурсия.
Оператор цикла GRZKLOH немного похож на оператор while.
В операторе while условие выпонения цикла проверяется в начале.
В операторе же GRZKLOHпроверка условия выполнения цикла происходит после того, как тело цикла выполнится хотя бы один раз.
После завершения выполнения цикла, программа перейдет на
строку следующую за While.
Рассмотрим предыдущий пример с точки зрения реализации
с помощью цикла GRZKLOH.
/ɩɨɞɤɥɸɱɟɧɢɟɛɢɛɥɢɨɬɟɤɢɜɜɨɞɜɵɜɨɞɚ
#include <iostream>
ɩɨɞɤɥɸɱɟɧɢɟɫɬɚɧɞɚɪɬɧɨɝɨɩɪɨɫɬɪɚɧɫɬɜɚɢɦɟɧɞɥɹɢɫɩɨɥɶɡɨɜɚɧɢɹ
ɛɢɛɥɢɨɬɟɤɢɜɜɨɞɚɜɵɜɨɞɚ
using namespace std;
/////////////////////////////////////////////////////////////////////////////
ȽɥɚɜɧɚɹɮɭɧɤɰɢɹPDLQ
void main()
{
ɨɩɢɫɚɧɢɟɩɟɪɟɦɟɧɧɵɯ
LQWP do
{
SURGXFW P
cout<<”m=”<<m<<endl;
`ZKLOHP }
В результате будут получены данные: 4, 8, 16, 32, 64, 128.
Определим структуру реализации двух циклов (рис. 5).
25
Цикл с предусловием
Цикл с постусловием
ZKLOHɭɫɥɨɜɢɟ
{
ɛɥɨɤɨɩɟɪɚɬɨɪɨɜ
}
do
{
ɛɥɨɤɨɩɟɪɚɬɨɪɨɜ
`ZKLOHɭɫɥɨɜɢɟ
true
Блок
операторов
false
Условие
false
true
Условие
Блок
операторов
Рис. 5. Представление циклов while и do while в виде блок-схемы
3.6. Цикл for
Важным элементом при разработке логистического программного, да и любого другого программного обеспечения является применение пошагового цикла for. Само название здесь говорит за себя.
С помощью данного цикла можно реализовать к примеру перебор
элементов данных для их сравнения или к примеру выполнения
необходимых действий над ними. Или же другим примером может
послужить формирование массива запасов на складах при решении
задачи распределения продукции.
Первым делом определимся со структурой реализации пошагового цикла for.
for(ɢɧɢɰɢɚɥɢɡɚɰɢɹ; ɭɫɥɨɜɢɟ; ɩɪɢɪɚɳɟɧɢɟ)
{
ɛɥɨɤ ɨɩɟɪɚɬɨɪɨɜ;
}
После указания ключевого слова for в скобках указывается ряд
полей. Первым полем является инициализация переменной, которая в процессе цикла будет меняться и будет иметь большое значение в выполнении тех или иных действий над данными. Вторым
26
полем является условие выполнения цикла. К примеру 1. Ну и
соответственно в третьем поле определяется шаг данного цикла.
Реализация данного цикла в виде блок схемы представлена на
рис. 6.
Рассмотрим пример вычисления суммы чисел от 1 до 100.
#include <iostream>ɩɨɞɤɥɸɱɟɧɢɟɛɢɛɥɢɨɬɟɤɢɜɜɨɞɚɜɵɜɨɞɚ
ɩɨɞɤɥɸɱɟɧɢɟɫɬɚɧɞɚɪɬɧɨɝɨɩɪɨɫɬɪɚɧɫɬɜɚɢɦɟɧɞɥɹɢɫɩɨɥɶɡɨɜɚɧɢɹ
ɛɢɛɥɢɨɬɟɤɢɜɜɨɞɚɜɵɜɨɞɚ
using namespace std;
/////////////////////////////////////////////////////////////////////////////
ɝɥɚɜɧɚɹɮɭɧɤɰɢɹPDLQ
void main()
{
ɨɩɢɫɚɧɢɟɩɟɪɟɦɟɧɧɵɯ
int sum = 0;
ɨɩɟɪɚɬɨɪɩɨɲɚɝɨɜɨɝɨɰɢɤɥɚ
IRULQWL L L
{
VXP VXPL
}
cout<<”sum=”<<sum<<endl;
}
Если при инициализации и указании используется несколько переменных, то данные выражения полей указываются через запятую.
Инициализация
Условие
false
Блок операторов
Модификация
Рис. 6. Блок-схема реализации пошагового цикла for
27
Примером может послужить случай модификации двух переменных с равным шагом цикла:
for(intQ P QQP
При реализации цикла for рекомендуется использовать целочис-
ленных тип данных, так как при использовании, к примеру, чисел
с плавающей запятой, возникает некоторая погрешность, связанная с представимостью данного типа в ПЭВМ. Таким образом, возможно некорректное определение к примеру шага цикла.
По большому счету, все выражения в операторе for – необязательны. Если к примеру убрать выражение для условия продолжения цикла, то будет считаться, что условие всегда истинно и, будет
происходить бесконечный цикл. Можно убрать выражение инициализации, при условии, что, если управляющая переменная инициализируется в программе ранее. Можно убрать и выражение приращения, при условии, что приращение переменной будет рализовано
в теле цикла.
Цикл for предоставляет возможность выполнить блок операторов, реализованный в теле цикла определенное количество раз.
В данном случае, когда оператор цикла for начинает выполняться, происходит объявление и инициализация счетчика цикла i. Затем происходит проверка условия продолжения цикла
i < 100. Так как дефолтное значение i равно 0, то условие истинно, и выполняется блок операторов (тело цикла). Затем выражение
i++ добавляет счетчику i – 1(i=1), и цикл снова начинается с проверки условия выполнения. Этот процесс будет продолжаться до
тех пор, пока тело цикла не будет исполнено 100 раз и управляющая переменная i не увеличится до 100, соответственно проверка
условия выполнения даст результат ложности, и повторное выполнение цикла будет прервано. Дальнейшее выполнение программы
будет продолжено с первого оператора, расположенного после оператора for.
Если переменная i объявлена и инициализирована непосредственно в заголовке цикла for, то ее областью действия будет являться только цикл for. Вне цикла данная переменная не будет существовать. Область действия переменной декларирует место, где
в программе она может использоваться.
Переменная-счетчик всегда должна иметь целочисленный тип
данных. В случае если переменная была объявлена в цикле, то по
завершении выполнения цикла данная переменная уничтожается.
28
3.7. Роль функций в С++
Даже при написании самой простой программы на языке программирования высокого уровня – С++ имеется хотя бы одна функция. Примером может послужить первая наша программа. Давайте
воспроизведем ее снова.
ɩɨɞɤɥɸɱɟɧɢɟɛɢɛɥɢɨɬɟɤɢɜɜɨɞɚɜɵɜɨɞɚ
#include <iostream>
ɩɨɞɤɥɸɱɟɧɢɟɫɬɚɧɞɚɪɬɧɨɝɨɩɪɨɫɬɪɚɧɫɬɜɚɢɦɟɧɞɥɹɢɫɩɨɥɶɡɨɜɚɧɢɹ
ɛɢɛɥɢɨɬɟɤ
using namespace std;
Ƚɥɚɜɧɵɣɦɟɬɨɞɩɪɨɰɟɞɭɪɚ±PDLQȼɵɩɨɥɧɟɧɢɟɩɪɨɝɪɚɦɦɵɜɫɟɝɞɚ
ɧɚɱɢɧɚɟɬɫɹɫɮɭɧɤɰɢɢPDLQ
void main()
{
ɜɵɜɨɞɬɟɤɫɬɚɧɚɷɤɪɚɧ
cout<<´Ⱦɨɛɪɨɩɨɠɚɥɨɜɚɬɶɜɦɢɪɋ´<<endl;
}
Как можно увидеть в данном случае присутствует главная функция – main.
Выполнение операнд как раз и начинается с запуска данной функции и всех строк кода которые указаны в теле данной
функции.
Простыми словами, в любой программе имеется хотя бы одна
функция, с запуска которой и начинается работа всей программы
в целом. Хорошим тоном программирования является создание своих собственных функций для реализации поставленной задачи и их
вызов в главной функции main на выполнение.
Давайте разберемся в чем же суть данной методики. Представим себе задачу, когда нам необходимо реализовать программу
оптимизации издержек при перевозке груза. Известно, что на издержки влияют ряд факторов и их все нужно учесть, применяя
определенный метод оптимизации. У нас есть некоторая математически выраженная функция, которая выражает объём издержек. На каждом этапе при применении определенного метода оптимизации и варьировании показателей – функция меняет свое
значение. Наша же задача ее оптимизировать. Таким образом, нам
необходимо будет использовать метод оптимизации столько раз,
сколько нам потребуется, чтобы функция стала минимальной.
29
Представим, что реализация метода оптимизации занимает
250 строк кода и для достижения минимума функции нам необходимо его использовать 25 раз. Если же не использовать методику
создания собственных функций, то нам придется 25 раз переписывать один и тот же код реализации метода оптимизации, состоящий из 250 строк в функцию main. Согласитесь, что это неудобно
и занимает большое количество времени. К тому же, не исключает
наличие ошибок при работе со сложным и большим объёмом кода.
Если же мы напишем свою собственную функцию и в ней реализуем метод оптимизации, то в дальнейшем нам необходимо будет
в функции main просто запустить его на выполнение. Таким образом, количество кода реализации поставленной задачи уменьшится и к тому же мы обезопасим себя от дальнейших возможных
ошибок.
Как видно данная методика программирования является весьма
перспективной. Давайте же более подробно коснёмся методики реализации своих собственных функций.
Структура функции определяется следующим образом:
Пример
в общем виде
int sum(int m, int n)
{
UHWXUQPQ
}
ɬɢɩɢɦɹɫɩɢɫɨɤɚɪɝɭɦɟɧɬɨɜ
ɫɬɢɩɚɦɢɞɚɧɧɵɯ
{
ɢɧɫɬɪɭɤɰɢɢ
UHWXUQɜɨɡɜɪɚɳɫɹɡɧɚɱ
}
Тип возвращаемого значения может быть любым при реализации функции. Так же функция может не возвращать никакого значения, если при ее определении указано ключевое слово – void.
void print(int res)
{
cout<<´Ɋɟɡɭɥɶɬɚɬɪɚɜɟɧ ³<<res<<endl;
}
После завершения работы какой-либо функции управление возвращается в вызывающую программу, когда программа достигает
конца тела функции или при выполнении оператора return. В случае же если метод-функция не возвращает никакого значения, то
оператор return должен быть «пустым», а если возвращает – то после оператора return определяется возвращаемое значение. Если
функция не возвращает никакого значения, то можно ключевое
слово return не указывать.
30
Обычно функции определяются прототипами, которые располагаются в отдельном заголовочном файле или в начале файла. Прототипом называется объявление функции:
пример
в общем виде
int math(double m, double n)
ɜɨɡɜɪɚɳɬɢɩɢɦɹɫɩɢɫɨɤ
ɚɪɝɭɦɟɧɬɨɜɫɬɢɩɚɦɢ
Компилятор же проверяет функцию с ее прототипом, чтобы оценить, содержат ли запросы вызова функции адекватное число аргументов нужных типов и перечислены ли типы используемых
аргументов в правильном порядке. Кроме того, прототип функции
нужен компилятору, чтобы удостовериться, что возвращаемое значение корректно используется в вызвавшем функцию выражении.
Каждый аргумент должен быть сопоставим с типом соответствующего параметра.
Каждому параметру в определении функции должен соответствовать один аргумент в вызове функции. В данном примере, когда
функция вызывается на выполнение, то параметр функции m инициализируется значением аргумента l, параметр n инициализируется значением аргумента z, а возвращаемое значение определяет
значение переменной a.
в общем виде
пример
ɢɦɹɫɩɢɫɨɤɚɪɝɭɦɟɧɬɨɜ
int a, l, z;
a=math(l, z);
В данном случае имеем две функции – функцию сложения и функция вывода результата на экран на экран. Результат работы функции math можно присвоить какой-нибудь переменной, или использовать сразу же в вызове любой другой функции или же использовать
в операторе cout.
ɉɨɞɤɥɸɱɟɧɢɟɛɢɛɥɢɨɬɟɤɢɜɜɨɞɚɜɵɜɨɞɚ
#include <iostream>
ɩɨɞɤɥɸɱɟɧɢɟɫɬɚɧɞɚɪɬɧɨɝɨɩɪɨɫɬɪɚɧɫɬɜɚɢɦɟɧɞɥɹɢɫɩɨɥɶɡɨɜɚɧɢɹ
ɛɢɛɥɢɨɬɟɤɢɜɜɨɞɚɜɵɜɨɞɚ
using namespace std;
ɨɛɴɹɜɥɟɧɢɟɮɭɧɤɰɢɢ
int math(int m, int n);
ɮɭɧɤɰɢɹɜɵɜɨɞɚɪɟɡɭɥɶɬɚɬɚ
void print(int res);
/////////////////////////////////////////////////////////////////////////////
31
ɮɭɧɤɰɢɹPDLQ
void main()
{
ɨɛɴɹɜɥɟɧɢɟɢɢɧɢɰɢɚɥɢɡɚɰɢɹɞɜɭɯɩɟɪɟɦɟɧɧɵɯ
LQWP Q ɜɵɡɨɜɮɭɧɤɰɢɢ
int res = math(m, n);
}
/////////////////////////////////////////////////////////////////////////////
Ɉɩɪɟɞɟɥɟɧɢɟɮɭɧɤɰɢɢɫɥɨɠɟɧɢɹ
int math(int m, int n)
{
UHWXUQPQ
}
/////////////////////////////////////////////////////////////////////////////
Ɉɩɪɟɞɟɥɟɧɢɟɮɭɧɤɰɢɢɜɵɜɨɞɚɪɟɡɭɥɶɬɚɬɚ
void print(int res)
{
cout<<´Ɋɟɡɭɥɶɬɚɬɪɚɜɟɧ ³<<res<<endl;
}
Кроме того, при разработке языка программирования высокого
уровня разработчиками предусмотрены стандартные функции для
облегчения работы программиста при реализации сложных задач.
Примером может являться использование стандартной математической библиотеки – <cmath>.
Пример использования математической библиотеки расположен
ниже:
#include <iostream>
ɩɨɞɤɥɸɱɟɧɢɟɛɢɛɥɢɨɬɟɤɢɜɜɨɞɚɜɵɜɨɞɚ
include <cmath>
ɩɨɞɤɥɸɱɟɧɢɟɦɚɬɟɦɚɬɢɱɟɫɤɨɣɛɢɛɥɢɨɬɟɤɢ
using namespace std;
ɩɨɞɤɥɸɱɟɧɢɟɫɬɚɧɞɚɪɬɧɨɝɨɩɪɨɫɬɪɚɧɫɬɜɚɢɦɟɧɞɥɹɢɫɩɨɥɶɡɨɜɚɧɢɹ
ɛɢɛɥɢɨɬɟɤ
ȽɥɚɜɧɚɹɮɭɧɤɰɢɹPDLQ
void main()
{
32
ɨɛɴɹɜɥɟɧɢɟɢɢɧɢɰɢɚɥɢɡɚɰɢɹɩɟɪɟɦɟɧɧɵɯ
ÀRDW] N cout<<pow(z,k);
}
Данный пример демонстрирует применение стандартной математической библиотеки, а именно применения у нее функции возведения в степень, так как в С++ нет оператора возведения в степень.
Список математических функций приведен в приложении 3.
3.8. Содержание стандартной библиотеки С++
В языке программирования, С++ как и в любом другом существует стандартная библиотека. Данная библиотека – это некоторый набор классов и методов- функций, который способствует реализации различных стандартных механизмов. Такими механизмами являются:
– работа с математическими функциями;
– типизация и строковый тип данных
– организация ввода-вывода информации.
Названием стандартной библиотеки в С++ является – STL – в переводе стандартная библиотека шаблонов.
В Библиотеку входят:
– контейнеры (объекты для хранения однотипных данных);
– последовательные;
– ассоциативные;
– адапторы;
– итераторы;
– алгоритмы;
– функции-объекты (объекты, у которых перегружен оператор
вызова функций operator (): например предикаты, позволяющие
без изменения шаблона изменять критерии сравнения элементов
контейнера и другие подобные действия).
Это такого рода функции, которые необходимы практически на
каждом шаге при разработке программы, но к сожалению реализация который очень сложна и трудоемка.
Таким образом, эти функции реализованы в виде стандартной
библиотеки С++ и пользователь, вместо того чтобы тратить большое
количество сил и времени на реализацию, к примеру функции вывода информации, просто использует ее, подключая заголовочный
файл стандартной библиотеки.
33
Опытный программист должен детально изучить элементы, которые составляют стандартную библиотеку, так как часть необходимых функций уже реализована. Пи разработке программы он
должен оценить какие задачи он будет решать стандартными средствами библиотеки STL, а какие придется решать, путем создания
своих собственных методов.
Так же давайте разберемся что такое пространство имен в С++.
Пространства имён
Пространства имён – логическое группирование методов-функций, классов, переменных и других типов данных в именованный
программный модуль.
QDPHVSDFHVWG^GRXEOHVLQGRXEOHE`
Для того, чтобы использовать методы-функции, находящиеся
в пространстве имен, нужно получить доступ в это пространство
с помощью ключевых словXVLQJQDPHVSDFHB ɢɦɹɩɪɨɫɬɪɚɧɫɬɜɚ.
#include <cmath>
using namespace std;
3.9. Размещение данных в памяти
Все компиляторы языка программирования при компиляции
создают код, который во время выполнения программы хранится
в оперативной памяти.
Размещение данных в памяти, чтобы память была зарезервирована в exe-модуле, осуществляется по принципу:
ɈɩɪɟɞɟɥɟɧɢɟɈɛɴɹɜɥɟɧɢɟ ɢɧɢɰɢɚɥɢɡɚɰɢɹ
intL ɬɢɩɢɞɟɧɬɢɮɢɤɚɬɨɪ ɡɧɚɱɟɧɢɟ
Существует такое понятие как время жизни переменных.
Под временем жизни будем считать время, в течении которого
данные хранятся в определенной памяти. К тому же время жизни
определяется непосредственно самим программистом.
Понятие времени жизни тесно связано с понятием области видимости.
Что касаемо непосредственно переменных, то у них бывает:
– глобальная, когда в любой момент во время работы с переменной всегда ассоциирована область памяти и обратиться к ней можно
из любой точки программы;
– статическое, когда во время работы с переменной ассоциирована область памяти, но обратиться к ней можно только из определенных точек программы;
34
– локальное, когда при любом входе в блок операторов { } для
хранения переменной выделяется область памяти, а при выходе память освобождается и переменная теряет свое значение.
Для того, чтобы реализовать статическое размещение переменной, определить время жизни и область видимости в С++ есть ряд
ключевых слов, которые позволяют это сделать. Такими являются:
– extern необходимо для определения глобальных переменных.
Память для переменных распределяется постоянно. Такая переменная будет являться глобальной и доступ кней будет осуществляться
из любой точки программы.
– static необходимо для создания статических переменных. Данная переменная инициализируется только один раз. Статические
переменные используются тогда, когда нужно сохранить предыдущее значение при повторном переходе в тело какого-либо оператора.
– auto необходимо для определения автоматических переменных. Переменные такого типа определяются непосредственно в теле
функции или теле выполняемого оператора. При завершении выполнения действий данной функции или оператора – данные переменные прекращают свое существование.
– register необходимо для определения регистровых переменных. Переменные данного типа ассоциируются с регистрами процессора компьютера. Очень часто такие переменные приводятся
к типу auto.
Если не инициализировать первые два типа переменных, рассмотренных выше, то их значения системой будут установлены в 0.
В случае же с последними двумя типами – они будут содержать
в себе определенные значения некоего мусора.
Для того, чтобы создать глобальную переменную необходимо ее
обьявить вне класса и функции. Глобальная переменная имеет свойство сохранять свое значение в течении всего выполнения программы.
На такого типа переменную или функцию могут ссылаться любые
функции и переменные реализованные в других частях программы.
Идентификаторы, созданные внутри определенной структуры,
имеют область действия данной структуры, где они реализованы.
Область действия структуры имеет начало от объявления идентификатора и имеет конец в завершающей правой фигурной скобкой
структуры, в которой идентификатор объявляется.
Локальные переменные имеют область действия только там где
они были реализованы. КК примеру про создании локальной переменной в функции – данная переменная будет существовать и иметь
область действия только в данной созданной функции.
35
В программе, рассмотренной ниже, показана методика создания
различных типов переменных и определение их области действия и
видимости.
#include <iostream>
ɩɨɞɤɥɸɱɟɧɢɟɫɬɚɧɞɚɪɬɧɨɝɨɩɪɨɫɬɪɚɧɫɬɜɚɢɦɟɧɞɥɹɢɫɩɨɥɶɡɨɜɚɧɢɹ
ɛɢɛɥɢɨɬɟɤ
using namespace std;
LQWP ɝɥɨɛɚɥɶɧɚɹɩɟɪɟɦɟɧɧɚɹ
/////////////////////////////////////////////////////////////////////////////
void main()
{
int m = 5; ɩɟɪɟɦɟɧɧɚɹɥɨɤɚɥɶɧɚɹɜPDLQ
cout<<”local m=”<<m<<endl;
{ ɫɤɨɛɤɢɧɚɱɢɧɚɸɬɧɨɜɭɸɨɛɥɚɫɬɶɞɟɣɫɬɜɢɹ
int m = 7; ɫɤɪɵɜɚɟɬPɜɨɜɧɟɲɧɟɣɨɛɥɚɫɬɢɞɟɣɫɬɜɢɹ
cout<<´ɥɨɤɚɥɶɧɚɹɩɟɪɟɦɟɧɧɚɹPɜɧɭɬɪɢ^ ´<<m<<endl;
} ɤɨɧɟɰɧɨɜɨɣɨɛɥɚɫɬɢɞɟɣɫɬɜɢɹ
cout<<´ɥɨɤɚɥɶɧɚɹɩɟɪɪɟɦɟɧɧɚɹPɩɟɪɟɞ^ ´<<m<<endl;
P
cout<<´ɥɨɤɚɥɶɧɚɹɩɟɪɟɦɟɧɧɚɹPɞɨ^ ´<<m<<endl;
cout<<endl<<´ɅɨɤɚɥɶɧɚɹɩɟɪɟɦɟɧɧɚɹP ´<<m<<endl;
}
/////////////////////////////////////////////////////////////////////////////
ɮɭɧɤɰɢɹɫɨɡɞɚɟɬɥɨɤɚɥɶɧɭɸɩɟɪɟɦɟɧɧɭɸPɩɪɢɤɚɠɞɨɦɜɵɡɨɜɟ
void local()
{
intP ɢɧɢɰɢɚɥɢɡɢɪɭɟɬɫɹɩɪɢɤɚɠɞɨɦɜɵɡɨɜɟɮɭɧɤɰɢɢ
cout<<endl<<”m=”<<m<<endl;
P
cout<<´P ´<<m<<endl;
}
/////////////////////////////////////////////////////////////////////////////
ɋɬɚɬɢɱɟɫɤɚɹ ɥɨɤɚɥɶɧɚɹ ɩɟɪɟɦɟɧɧɚɹ P ɢɧɢɰɢɚɥɢɡɢɪɭɟɬɫɹ ɬɨɥɶɤɨ
ɨɞɢɧɪɚɡ
voidVWDWLF B ORFDO
{
36
static intP ɢɧɢɰɢɚɥɢɡɢɪɭɟɬɫɹɩɪɢɩɟɪɜɨɦɜɵɡɨɜɟ
ɮɭɧɤɰɢɢ
cout<<”m=”<<m<<endl;
P
cout<<´P ´<<m<<endl;
}
/////////////////////////////////////////////////////////////////////////////
ɮɭɧɤɰɢɹɢɡɦɟɧɹɟɬɝɥɨɛɚɥɶɧɭɸɩɟɪɟɦɟɧɧɭɸP
void global()
{
cout<<´P ³<<m<<endl;
P P
cout<<´P ³<<m<<endl;
}
Ключевое слово сonst означает что переменная инициализируется один раз и изменению ее значение не подлежит:
const ÀRDWSL 3.10. Организация ввода и вывода информации
Потоковый ввод/вывод
Одним из самых главных возможностей, которыми должен обладать язык программирования – является наличие потокового
ввода-вывода информации. Это вполне логично, что после реализации поставленной задачи – нам необходимо получить какие-либо
количественные или качественные данные. И тут нам на помощь
как раз и приходит потоковый ввод-вывод. К сожалению в С++ нет
оператора позволяющего выводить или считывать информацию, но
данный механизм реализован с помощью функции в стандартной
библиотеке ввода-вывода.
Поток – преобразование данных различного типа в последовательность символов для вывода и соответственно наоборот.
Вывод: Первым этапом является помещение информации в поток данных – <<. Естественно есть возможность создания своих собственных потоков, но как привило достаточно стандартных.
cout – стандартный поток вывода
Для вывода значения переменной какого-либо типа используется следующая конструкция:
cout<<”m=”<<m; // значение переменной m будет преобразовано
в символьный тип.
37
Так же есть возможность определения потоков для созданных
абстрактных типов данных.
Ввод: Ввод данных из потока происходит точно также, но с применением оператора >>.
cin – стандартный поток ввода
Переменную определенного типа можно инициализировать из
потока:
cin>>m;
Для того, чтобы была возможность использовать стандартные
приемы ввода – вывода необходимо в шапке программы подключить с помощь ключевого слова #include библиотеку ввода вывода,
а также определить пространство имен в которое сгруппированы
функции:
LQFOXGHLRVWUHDP!ɩɨɞɤɥɸɱɟɧɢɟɫɬɚɧɞɚɪɬɧɨɣɛɢɛɥɢɨɬɟɤɢ
XVLQJQDPHVSDFHVWGɨɛɴɹɜɥɟɧɢɟɨɛɢɫɩɨɥɶɡɨɜɚɧɢɢɫɬɚɧɞɚɪɬɧɨɝɨ
ɩɪɨɫɬɪɚɧɫɬɜɚɢɦɟɧ
YRLGPDLQɮɭɧɤɰɢɹPDLQ
{
int a=5;
ÀRDWE GRXEOHP FRXW´ɜɵɜɨɞɫɬɪɨɤɢHQGOɜɵɜɨɞɫɬɪɨɤɢ
FRXW´LQW ´DHQGOɜɵɜɨɞɡɧɚɱɟɧɢɹɩɟɪɟɦɟɧɧɨɣD
FRXW´ÀRDW ´EHQGO
cout<<”double = ”<<m<<endl;}
Форматированный ввод/вывод
В С++ используется метод потокового ввода/вывода. Поток – метод преобразования значений различного типа в набор символов
(вывод) и наоборот (ввод)
#include <iostream>
В виду того, что разрабатываемые программы отличаются степенью сложности реализации, бывают ситуации, когда программисту
недостаточно стандартного потока вывода информации. На помощь
же приходит форматированных ввод и вывод. Таким образом программист сам говорит программе каким образом она, к примеру,
должна представить выводимую информацию.
Управлением потоком данных занимается как раз библиотека
под названием <iomanip>.
Используя определенные манипуляторы можно повлиять на
управляемый вывод информации.
38
Ниже представлены примеры манипуляторов или другими словами, ключевые слова:
– dec; // десятичная система счисления;
– hex; // шестнадцатеричная система счисления;
– ct; // восьмеричная система счисления;
– setbase(int b); // вывод целых чисел в системе счисления с основанием b(10,8...);
– show base; // вывод основания системы счисления.
Рассмотрим различные типы переменных и способы вывода их
значений.
Превым рассмотрим тип ÀRDW. Это тип с плавающей точкой. При
использовании стандартного потока вывода данных для переменной типа float будет выведено на экран до шести значащих цифр:
ÀRDWN FRXWI
В ситуации, когда нам необходимо вывести большее количество
знаков – мы можем использовать научный формат:
FRXWVFLHQWL¿FNH
Применение фиксированного формата:
VHWSUHVLVLRQLQWNN±ɤɨɥɢɱɟɫɬɜɨɰɢɮɪɩɨɫɥɟɬɨɱɤɢ
FRXW¿[HGN
Так же, если мы работаем с логическим типом переменной, то и
для нее есть манипулятор, который управляет выводом информации:
ERROD WUXHERROE IDOVHFRXWDE
cout<<boolalpha<< a<<b; // true false
Важные манипуляторы:
endl; // перееход курсора на следующую строку
ends; // заканчивается строка записью ‘ ‘
Файловые потоки
При разработке сложных программ разработчику бывает необходимо работать с файлами данных. К примеру, необходимо получать значения из файла и запоминать их в некотором массиве данных для дальнейшего их использования в программе в качестве
исходных данных для достижения поставленной цели. На помощь
приходит файловый поток.
Пример работы с файлом, а именно чтение файла и запись в него
данных отображен ниже.
#include <fstream>
using namespace std;
void main()
39
^LIVWUHDPLQSXW¿OH´F?SULPHUW[W´ɫɨɡɞɚɟɬɫɹɩɨɬɨɤɜɜɨɞɚ
ɢɡɮɚɣɥɚ
LQSXW¿OH!!PɱɬɟɧɢɟɩɟɪɟɦɟɧɧɨɣP
RIVWUHDPRXWSXW¿OH´]?UHVW[W´ɫɨɡɞɚɟɬɫɹɩɨɬɨɤɜɵɜɨɞɚɜɮɚɣɥ
RXWSXW¿OHPɡɚɩɢɫɶɡɧɚɱɟɧɢɹɩɟɪɟɦɟɧɧɨɣPɜɮɚɣɥ
}
Если открываемый файл существует, то происходит его очистка,
а затем чтение или запись значений. Если же файл не существует,
то программа его создает сама.
Для того чтобы открыть файл для добавления информации без
его очистки применяется:
RIVWUHDPRXW¿OH¿OHQDPHLRVDSS
3.11. Строковые переменные
Строковый тип данных позволяет работать со строками различной длинны. Кроме того, длинну строки можно поменять прямо во
время выполнения программы.
Кроме того, в строковом типе имеются стандартные операторы,
которые позволяют выполнять контеканацию, присваивание, замещение и другие манипуляции.
Для работы с типом строк необходимо первоначально подключить стандартную библиотеку строк.
#include <iostream>
LQFOXGHVWULQJ!ɛɢɛɥɢɨɬɟɤɚɫɬɪɨɤ
XVLQJQDPHVSDɫHVWG
void main()
{
VWULQJQDPH ´9LWDOL\´ɨɛɴɹɜɥɟɧɢɟɨɩɪɟɞɟɥɟɧɢɟɢɧɢɰɢɚ
ɥɢɡɚɰɢɹ
string lastname=”Ponomarenko”;
QDPH QDPH´9DVLOLHYLFK´ODVWQDPH ɤɨɧɤɚɬɟɧɚɰɢɹ ɫ ɩɪɢ
ɫɜɚɢɜɚɧɢɟɦ
FRXW´Ɇɨɟɢɦɹ´QDPHHQGOɜɵɜɨɞ
}
Используя [ ] можно получить определенный символ из строки
FKDUF QDPH>@нумерация символов проиходит с 0.
Для лексикографического сравнения используются операторы:
!! .
Полный список функций отображен в приложении 2.
40
3.12. Массивы
Одномерный массив
Массив – набор данных одинакового типа.
Создание массива данных происходит также как и создание переменной, но есть некоторое отличие. Если мы создаем переменную,
то она будет хранить только одно какое-то значение, а в случае же
с массивом – данных значений может быть большое количество.
Таким образом для создания массива необходимо сначала указать его тип, затем название (идентификатор) массива и в квадратных скобках указать количество элементов, которые массив будет
в себе содержать. Обращаю ваше внимание что нумерация массива
начинается с 0. Для обращения же к определенному элементу массива – необходимо в квадратных скобках указать индекс элемента,
к которому мы обращаемся.
Пример реализации массива показан ниже.
int$>@ɨɩɢɫɚɧɢɟɦɚɫɫɢɜɚɢɡɷɥɟɦɟɧɬɨɜ
ɢɧɢɰɢɚɥɢɡɚɰɢɹɷɥɟɦɟɧɬɨɜɦɚɫɫɢɜɚɨɛɪɚɳɟɧɢɟɤɷɥɟɦɟɧɬɚɦɦɚɫ
ɫɢɜɚɩɨɢɧɞɟɤɫɭ
$>@ $>@ $>@ $>@ $>@ Динамическое размещение одномерного массива
Важным требованием в языке С++ при создании массивов данных является указание конкретного количества элементов массива
при его создании. Представим ситуацию, когда мы не знаем изначально количество элементов, которое должен содержать массив.
Предполагается что именно пользователь будет задавать размерность массива и его наполненность элементами, тогда нам пригодится методика создания динамических массивов.
Сначала создается указатель на массив, а при помощи ключевого слова new выделяется память для требуемого количества элементов. А в квадратные скобки передаем переменную, которая будет
инициализироваться пользователем и будет хранить количество
элементов в массиве. Работа же с элементами массива в данном случае не отличается. После завершения работы с массивом необходимо освободить память, которая была выделена для реализации массива с помощью оператора delete.
41
int n;
cin>>n;
double0ɭɤɚɡɚɬɟɥɶɧɚɦɚɫɫɢɜ
M=new double>Q@ɭɤɚɡɚɬɟɥɶɧɚɤɨɥɢɱɟɫɬɜɨɷɥɟɦɟɧɬɨɜɦɚɫɫɢɜɚ
ɢɧɢɰɢɚɥɢɡɚɰɢɹ
for(intL LQL
{
0>L@ }
delete>@0ɨɫɜɨɛɨɠɞɚɟɦɩɚɦɹɬɶ
Передача массива в функцию
Если нам необходимо на вход какой-либо функции передать в качестве аргумента массив, то должен использоваться указатель на
массив с дополнительным указанием количества элементов.
#include <iostream>
ɩɨɞɤɥɸɱɟɧɢɟɫɬɚɧɞɚɪɬɧɨɝɨɩɪɨɫɬɪɚɧɫɬɜɚɢɦɟɧɞɥɹɢɫɩɨɥɶɡɨɜɚɧɢɹ
ɛɢɛɥɢɨɬɟɤɢɜɜɨɞɚɜɵɜɨɞɚ
using namespace std;
0ɦɚɫɫɢɜ
Qɤɨɥɢɱɟɫɬɜɨɷɥɟɦɟɧɬɨɜɜɦɚɫɫɢɜɟ
double sum(double0>@int n)
{
doubleVXPPD for(intL LQL
{
VXP VXP0>L@
}
return sum;
}
/////////////////////////////////////////////////////////////////////////////
void main()
{
ɨɛɴɹɜɥɟɧɢɟɭɤɚɡɚɬɟɥɹɧɚɦɚɫɫɢɜ
double *M;
int n; ɤɨɥɢɱɟɫɬɜɨɷɥɟɦɟɧɬɨɜɜɦɚɫɫɢɜɟ
cin>>n;
42
ɞɢɧɚɦɢɱɟɫɤɨɟɪɚɡɦɟɳɟɧɢɟɦɚɫɫɢɜI
M=new double>Q@
ɜɵɜɨɞQɷɥɟɦɟɧɬɨɜɦɚɫɫɢɜɚɛɟɡɢɧɢɰɢɚɥɢɡɚɰɢɢ
for(intL LQL
{
FRXWGDWD>L@HQGO
}
ɢɧɢɰɢɚɥɢɡɚɰɢɹɦɚɫɫɢɜɚ
for(intL LQL
{
0>L@ L
}
ɜɵɜɨɞQɷɥɟɦɟɧɬɨɜɦɚɫɫɢɜɚɩɨɫɥɟɢɧɢɰɢɚɥɢɡɚɰɢɢ
for(intL LL
{
FRXW0>L@HQGO
}
cout<<M<<endl;
ɭɤɚɡɚɬɟɥɶɧɚɣɷɥɟɦɟɧɬ
FRXW0HQGOɭɤɚɡɚɬɟɥɶɧɚɣɷɥɟɦɟɧɬ
FRXW0HQGOɷɤɜɢɜɚɥɟɧɬɧɨ0>@
FRXW0>Q@HQGOɩɨɫɥɟɞɧɢɣɷɥɟɦɟɧɬɦɚɫɫɢɜɚ
ɩɪɢɦɟɪɩɟɪɟɞɚɱɢɦɚɫɫɢɜɚɜɮɭɧɤɰɢɸ
cout<<sum(M, n)<<endl;
delete>@0ɨɛɹɡɚɬɟɥɶɧɨɨɫɜɨɛɨɞɢɬɶɩɚɦɹɬɶ
}
Двумерный массив
Если нам необходима матрица или другими словами многомерный массив, то необходимо в объявлении массива добавить в квадратных скобках указание количества столбцов.
Общая структура обьявления двумерного массива отображена
ниже.
ɬɢɩ B ɦɚɫɫɢɜɚɢɦɹ B ɦɚɫɫɢɜɚ>ɤɨɥɜɨɫɬɪɨɤ@>ɤɨɥɜɨɫɬɨɥɛɰɨɜ@
43
Примером может послужить массив состоящий из трех строки
и двух столбцов. В квадратных скобках указаны индексы того или
иного элемента массива.
>@>@
>@>@
>@>@
>@>@
>@>@
>@>@
Пример реализации массива размерностью 3 на 2 отображен ниже.
double$>@>@ɞɜɭɦɟɪɧɵɣɦɚɫɫɢɜ
doubleVXPP for(intL LLɧɨɦɟɪɫɬɪɨɤɢ
{
for(intM MMɧɨɦɟɪɫɬɨɥɛɰɚ
{
VXPP VXPP$>L@>M@
}
}
Динамическое размещение двумерного массива
Двумерные массивы могут быть также динамическими. Вспомним наш пример при необходимости реализации одномерного массива и дополним его. К примеру, у нас есть поставщики и у каждого из них есть запас продукции. Так же у нас имеются потребители и их потребность в данной продукции. Наша задача построить
опорный план перевозки товара от поставщиков – потребителям.
При этом количество поставщиков будет задаваться пользователем и количество потребителей соответственно также будет задано
пользователем. При реализации данной задачи мы будем иметь три
массива. Первый будет хранить запасы у поставщиков и он будет
динамическим, так как мы изначально не знаем его размерности.
Второй также будет динамическим и будет хранить потребности
потребителей в продукции. Ну и соответственно третий будет являться динамическим массивом размерности n на m , где n – количество поставщиков, m – количество потребителей. Третий массив
будет хранить в себе план перевозок продукции от поставщиков
к потребителям. Ввиду того, что изначально не известны размерности массива один и два, то и массив три также должен быть динамическим.
44
Реализация двумерных динамических массивов возможна также как и одномерных при условии использования указателей.
Пример реализации двумерныого динамического массива приведен ниже.
#include <iostream>
ɩɨɞɤɥɸɱɟɧɢɟɫɬɚɧɞɚɪɬɧɨɝɨɩɪɨɫɬɪɚɧɫɬɜɚɢɦɟɧɞɥɹɢɫɩɨɥɶɡɨɜɚɧɢɹ
ɛɢɛɥɢɨɬɟɤ
using namespace std;
void main(){
VHWORFDOH/& B $//”Russian”);
int n,m;
cout<<´ȼɜɟɞɢɬɟɤɨɥɢɱɟɫɬɜɨɩɨɫɬɚɜɳɢɤɨɜ´<<endl;
cin>>n;
cout<<´ȼɜɟɞɢɬɟɤɨɥɢɱɟɫɬɜɨɩɨɬɪɟɛɢɬɟɥɟɣ´<<endl;
cin>>m;
int **d;d= new int>Q@ Ɋɟɚɥɢɡɚɰɢɹ ɞɜɭɦɟɪɧɨɝɨ ɞɢɧɚɦɢɱɟɫɤɨɝɨ
ɦɚɫɫɢɜɚɪɚɡɦɟɪɧɨɫɬɶɸQɧɚP
for(intL LQL
{
G>L@ new int>P@
}
ɢɧɢɰɢɚɥɢɡɚɰɢɹɦɚɫɫɢɜɚ
for(intL LQLɧɨɦɟɪɫɬɪɨɤɢ
{
for(intM MPMɧɨɦɟɪɫɬɨɥɛɰɚ
{
G>L@>M@ L
}
}
ɜɵɜɨɞɷɥɟɦɟɧɬɨɜɦɚɫɫɢɜɚɧɚɷɤɪɚɧ
for(intL LQLɧɨɦɟɪɫɬɪɨɤɢ
{
for(intM MPMɧɨɦɟɪɫɬɨɥɛɰɚ
{
³;
FRXWG>L@>M@³
}
cout<<endl;
}
delete>@Gɨɫɜɨɛɨɞɢɬɶɩɚɦɹɬɶ
}
45
3.13. Объектно-ориентированный подход
к разработке информационных систем
Обьектно-ориентированный подход предусматривает работу
с объектами.
В Данном подходе имеется два ключевых понятия: Класс и
Объект.
Классом является некоторая структура, имеющая поля данных
и методы работы с этими данными.
Класс – это своего рода некий тип, описывающий свойства, поведение и характеристики обьектов, входящих в данных класс.
Обьектом же называется некая сущность имеющая определенное
поведение и характеристики, а также структуру, описанную в определенном классе. Обьекты как правило относятся к определенному
классу и при создании обьекта считается, что создается экземпляр
определенного класса.
Чтобы было четкое понимание – приведем пример.
Имеется чертеж, по которому изготавливают изделия к примеру,
и и сами изделия, созданные по данному чертежу. Так вот чертеж –
это и есть наш класс, который описывает характеристики данного
изделия и его функциональные возможности, а изделия, созданные
на основе данного чертежа – являются обьектами.
Поля данных которые описываются в классах – это своего рода
определенные типы переменных, которые определяют общую
структуру характеристик обьектов данного класса.
Методы же или как по другому их называют – функции – это
функции которые работают с заранее определенными полями и
определяют ряд функциональных возможностей.
Рассмотрим пример реализации класса.
#include<iostream>
#include<string>
using namespace std;
class Post{
public:
Post(){
}
void Start(){
46
Post m;
cout<<´ɜɜɟɞɢɬɟɤɨɥɢɱɟɫɬɜɨɩɨɫɬɚɜɳɢɤɨɜ´<<endl;
FLQ!!PNRO
P3RVWDYPNRO´ɜɜɟɞɢɬɟɡɚɩɚɫɵɩɨɫɬɚɜɳɢɤɚ´);
Post l;
cout<<´ɜɜɟɞɢɬɟɤɨɥɢɱɟɫɬɜɨɩɨɬɪɟɛɢɬɟɥɟɣ´<<endl;
FLQ!!ONRO
O3RVWDYONRO´ɜɜɟɞɢɬɟɩɨɬɪɟɛɧɨɫɬɢɩɨɬɪɟɛɢɬɟɥɹ´);
}
private:
int kol;
int *zappos;
void Postav(int kpost, string l ){
ɦɟɬɨɞ ɮɨɪɦɢɪɨɜɚɧɢɹ
ɡɚɩɚɫɨɜɢɤɨɥɢɱɟɫɬɜɚɩɨɫɬɚɜɳɢɤɨɜɩɨɬɪɟɛɧɨɫɬɟɣɢɤɨɥɩɨɬɪɟɛɢɬɟɥɟɣ
zappos=new int>NSRVW@
for(intL LNSRVWL^
FRXWOLHQGO
FLQ!!]DSSRV>L@
}
}
};
void main(){
VHWORFDOH/& B $//”RUSSIAN”);
Post m;
P6WDUW
47
В данном случае имеем класс Post, который имеет поля данных
и метод для формирования массива запасов поставщиков, в зависимости от их количества, введенного пользователем, а так же массив потребностей потребителей, так же в зависимости от введенного
пользователем их количества.
Метод Start() формирует количество поставщиков и потребителей, а также выводит требование пользователю ввести запасы поставщиков и потребности потребителей.
Метод Postav() в свою очередь создает динамические одномерные
массивы данных по запасам и потребностям, введенные пользователем.
А в методе main( ) мы просто создаем экземпляр класса Post и
вызываем на выполнение метод Start, который в свою очередь вызывает метод Postav для формирования массивов.
Таким образом, пользователь работает только с одним методом
Start (), а внутренняя структура реализации для него остается недоступной.
Исходя из данного примера реализации класса, мы плавно перешли к трем ключевым моментам обьектно-ориентированного
программирования.
Первым ключевым моментом является понятие инкапсуляции.
Инкапсуляция – это принцип, согласно которому любой класс
должен рассматриваться в виде чёрного ящика – пользователь класса должен видеть и использовать только интерфейсную часть класса
и не вникать в его внутреннюю реализацию. Именно поэтому в нашем примере пользователь работает с методом Start(), а внутренняя
структура реализации остается ему недоступной.
Вторым ключевым моментом является понятие наследования.
Наследование — это создание нового класса на основе уже существующего класса.
Таким образом, при наследовании созданный класс обладает как
характеристиками класса родителя, так и методами работы с полями данных. Возможно также дополнение созданного класса новыми
полями данных, а также новыми методами работы с данными.
Благодаря наследованию появляется возможность выстраивать
взаимосвязь между классами, а также на основе стандартного класса создавать уникальные классы, путем введения характерных черт
отличия.
Простыми словами нет смысла в новом классе описывать поля
данных и методы управления, если эти данные уже существуют
в каком-то классе. Логичнее унаследовать данные от класса и затем
их адаптировать под конкретные цели.
48
class A ɛɚɡɨɜɵɣɤɥɚɫɫ$
{
protected:
int Rost;
public:
void showRost() {
cout << ³ɜɜɟɞɢɬɟɪɨɫɬ³ << endl;
cin>>Rost;
cout << ³Ɋɨɫɬɪɚɜɟɧ³ << Rost << endl; }};
class B : public$ɉɪɨɢɡɜɨɞɧɵɣɤɥɚɫɫ
{
private:
int VES;
public:
void showVES(){
cout << ³ɜɜɟɞɢɬɟɜɟɫ³ << endl;
cin>>VES;
cout << ³ȼɟɫɪɚɜɟɧ´ << VES<< endl;}
};
Создавая обьект класса B мы можем использовать поля данных и
методы как самого класса B, так и использовать поля данных и методы родительского класса А. Пример создания экземпляра класса
отображен ниже.
void main()
{
%SULPHUɋɨɡɞɚɧɢɟɷɤɡɟɦɩɥɹɪɚɤɥɚɫɫɚ
SULPHUVKRZ5RVWȼɵɡɨɜɦɟɬɨɞɚɩɨɤɚɡɚɬɶɪɨɫɬ
SULPHUVKRZ9(6ȼɵɡɨɜɦɟɬɨɞɚɩɨɤɚɡɚɬɶɜɟɫ
}
Как видно из примера, пользователь работает, во-первых, только
с доступными методами, а поля данных в классах для него остаются невидимыми.
Во-вторых, создавая экземпляр класса B мы можем использовать открытые методы как класса B, так и класса A, так как класс B
унаследован от класса A.
Третьим ключевым моментом является понятие полиморфизма.
Полморфизм – явление, при котором одной и той же функции соответствует различная программная реализация, в зависимости от
того в каком контексте вызывается данная функция.
49
Примером может послужить следующая конструкция:
#include<iostream>
using namespace std;
class home{
public:
virtual void Go(){
cout<<´ɢɞɭɞɨɦɨɣɩɟɲɤɨɦ´<<endl;
}
};
class Job :public home{
public:
void Go() override
{
cout<<´ɢɞɭɧɚɪɚɛɨɬɭ³<<endl;
}
};
class8QLYHUVLW\public home{
public:
void Go() override
{
cout<<´ɢɞɭɧɚɭɱɟɛɭ³<<endl;
}
};
class person{
public:
void Go(home *home )
^KRPH!*R
}
};
void main(){
VHWORFDOH/& B $//”Russian”);
person person;
8QLYHUVLW\8QLYHUVLW\
SHUVRQ*R8QLYHUVLW\
V\VWHP”pause”);
}
В данном случае мы имеем базовый класс home, в котором реализован метод Go();
50
Слово virtual означает что данный метод является виртуальным
и может быть переопределен в дальнейшем.
Метод Go описывает движение человека домой. Так как мы рассматриваем пример реализации полиморфизма, то в реализации
методов Go() будем просто выводить на экран информации о том что
метод выполняет.
Кроме этого мы так же унаследовав все поля данных и методы
базового класса реализовали классы, отвечающие за движения человека в университет и на работу.
Как видно из примера название метода осталось прежним.
Следующим этапом является создание класса человека (person).
Рассмотрим более подробно реализацию данного класса, а именно
реализацию метода Go().
На вход данного метода передается адрес класса реализации используемого метода Go(). В теле же метода мы вызываем у данного
указателя на адрес реализации метод на выполнение.
Для того, чтобы использовать данную структуру в методе void
main() необходимо создать экземпляр класса person (объект типа
person) и в зависимости от того, куда наш человек будет идти также
создать экземпляр класса, описывающего движение нашего человека в определенное место. На последнем этапе у объекта person вызывается метод Go() c указанием адреса в круглых скобках на нужный
адрес объекта, в котором реализован метод Go().
void main(){
VHWORFDOH/& B $//”Russian”Ɉɩɪɟɞɟɥɹɟɦ ɜɨɡɦɨɠɧɨɫɬɶ ɪɚɛɨ
ɬɵɫɪɭɫɫɤɨɣɪɚɫɤɥɚɞɤɨɣ
SHUVRQSHUVRQɫɨɡɞɚɟɦɷɤɡɟɦɩɥɹɪɤɥɚɫɫɚɱɟɥɨɜɟɤ
8QLYHUVLW\8QLYHUVLW\ɫɨɡɞɚɟɦɷɤɡɟɦɩɥɹɪɤɥɚɫɫɚ8QLYHUVLW\
SHUVRQ*R8QLYHUVLW\ ȼɵɡɵɜɚɟɦ ɦɟɬɨɞ *R ɞɥɹ ɨɛɶɟɤɬɚ
ɱɟɥɨɜɟɤ ɢ ɧɚ ɜɯɨɞ ɩɟɪɟɞɚɟɦ ɚɞɪɟɫ ɪɟɚɥɢɡɚɰɢɢ ɷɤɡɟɦɩɥɹɪɚ ɤɥɚɫɫɚ
8QLYHUVLW\
V\VWHP”pause”);
}
Таким образом, мы видим, что с помощью данной структуры мы
можем использовать одну и ту же функцию движения человека, которая переопределяется в зависимости от того, что мы подаем ей на
вход.
Данный пример хорошо описывает методику полиморфизма.
В данном случае мы имеем одинаковое название метода, но разную
практическую реализацию.
51
Также при реализации данного примера использовались такие
понятия уровень доступа данных и понятие указателя. Давайте
разберемся для чего они нужны и каким образом мы можем их использовать.
По уровню доступа элементы делятся на открытые (public), закрытые (private) и защищённые (protected).
Перед объявлением членов внутри класса ставятся соответствующие ключевые слова. Если такое слово не поставлено, то считается, что элемент объявлен с уровнем private. В примере выше метод
Go() имеет уровень доступа public.
Элементы, объявленные как private доступны только внутри
класса.
Элементы, объявленные как protected доступны внутри класса
и внутри всех его потомков.
Элементы, объявленные как public доступны как внутри, так
вне класса (в том числе в потомках).
Указатели
Указатель – это переменная особого вида, необходимая для хранения адреса объекта. Обычно переменная непосредственно содержит некоторое значение. Указатель же содержит адрес переменной,
которая.
Для того, чтобы получить значение переменной, на которую указывает указатель, используется оператор разыменования (*).
Объявление указателя
При объявлении указателя перед именем переменной ставится *:
int *p;
что означает, что переменная p имеет тип int * (т.е. указатель на int)
и указывает на объект типа int.
Присваивание указателя
Для получения адреса ячейки памяти, в которой хранится переменная, и последующей инициализации переменной типа указатель используется операция получения адреса (&).
intL ɨɛɴɹɜɥɟɧɢɟɰɟɥɨɣɩɟɪɟɦɟɧɧɨɣL
int *p; ɨɛɴɹɜɥɟɧɢɟɩɟɪɟɦɟɧɧɨɣɬɢɩɚɭɤɚɡɚɬɟɥɶɬɟɡɧɚɱɟɧɢɟ
ɩɨɚɞɪɟɫɭSɹɜɥɹɟɬɫɹɰɟɥɵɦɱɢɫɥɨɦ
p=&i; ɨɩɟɪɚɬɨɪɩɨɥɭɱɟɧɢɹɚɞɪɟɫɚ
В данном примере, значение переменной p представляет собой
адрес ячейки, в которой хранится значение переменной i.
Операция разименования
Для получения значения переменной, хранящейся в ячейке, на
которую указывает указатель, используется оператор разыменова52
ния (*). Если нужно использовать значение переменной, хранящейся по адресу p, перед p нужно ставить оператор разыменования:
intL ɨɛɴɹɜɥɟɧɢɟɰɟɥɨɣɩɟɪɟɦɟɧɧɨɣL
int *p ;
ɨɛɴɹɜɥɟɧɢɟɩɟɪɟɦɟɧɧɨɣɬɢɩɚɭɤɚɡɚɬɟɥɶɬɟɡɧɚɱɟ
ɧɢɟɩɨɚɞɪɟɫɭSɹɜɥɹɟɬɫɹɰɟɥɵɦɱɢɫɥɨɦ
p=&i;
ɨɩɟɪɚɬɨɪɩɨɥɭɱɟɧɢɹɚɞɪɟɫɚ
intW SɷɤɜɢɜɚɥɟɧɬɧɨW L
Sɩɪɢɛɚɜɥɹɟɦɤɭɤɚɡɚɬɟɥɸ±ɩɟɪɟɯɨɞɢɦɤɫɥɟɞɭɸɳɟɣ
ɹɱɟɣɤɟɩɚɦɹɬɢɫɞɪɭɝɨɣɩɟɪɟɦɟɧɧɨɣ
53
ПРАКТИЧЕСКАЯ РАБОТА № 1
Разработка приложения по распределению ресурсов
в системе на основе метода северо-западного угла
Цель работы
Выработать практические навыки работы с системой Visual
Studio на основе языка программирования высокого уровня – С++;
Изучить метод построения опорного плана, используя метод северо-западного угла;
Научиться создавать, вводить в компьютер, выполнять и исправлять простейшие программы.
Задачи
Разработать алгоритм в виде блок-схемы для распределения ресурсов между элементами, используя метод северо-западного угла;
Разработать консольную программу для получения начального
опорного плана распределения ресурсов, используя метод северозападного угла.
Распределительные задачи связаны с распределением ресурсов
по работам, которые необходимо выполнить. Задачи этого класса
возникают тогда, когда имеющихся в наличии ресурсов не хватает
для выполнения каждой работы наиболее эффективным образом,
поэтому целью решения задач этого типа является поиск такого
распределения ресурсов по работам, при котором либо минимизируются общие затраты, связанные с выполнением работ, либо максимизируется получаемый в результате общий доход. Большинство
распределительных задач можно представить в виде матриц.
Элементы, которым, нужны ресурсы
Ресурсы
R1
R2
K
Ri
K
Rm
Объем
требуемых
ресурсов
54
J1
J2
C11
C21
C12
C22
K
Ci1
K
Cm1
K
Ci 2
K
Cm2
а1
а2
…
Jj
K
K
C1j
C2 j
K
…
…
Jn
K
K
C1n
C2n
K
Cij
K
Cmj
аj
K
Cin
K
Cmn
…
аn
Объем
имеющихся
ресурсов
b1
b2
K
bi
K
bm
Элементы Cij, стоящие в клетках матрицы, соответствуют затратам или доходу, отвечающим выделению одной единицы ресурса
Ri на работу Jj. Дадим классификацию распределительных задач.
Если затраты (или доход), определяемые объемом xij ресурса i, выделенного на выполнение работы j, равны Сijxij, то имеем линейную
распределительную задачу. Предположим, что мощности предприятий, потребности складов и удельные транспортные расходы определяются величинами, указанными ниже.
Пример
1
2
3
4
Наличие
ресурсов
на складах
1
19
30
50
10
7
2
70
30
40
60
9
3
40
8
70
20
18
Потребности
предприятий
5
8
7
14
34
Первый шаг в решении такой задачи сводится к определению
некоторого допустимого распределения. Затем найденное решение
последовательно улучшается до тех пор, пока не будет установлено,
что дальнейшее снижение затрат невозможно.
Метод северо-западного угла
Распределение всегда начинают с клетки (1,1).
Выбираем клетку (1,1) и находим, что наибольшее возможное
перераспределение (x11) равно 5, так как это все, что требуется элементу 1. Выбрав эту альтернативу, переходим к клетке (1,2), так
как столбцу 1 больше не требуется перераспределение. Наибольшее
перераспределение по этой клетке равно 2, так как это весь остаток ресурса после того, как произведено перераспределение x11 = 5.
Таким образом, принимаем x12 = 2. Переходим к клетке (2,2), поскольку элементу 2 еще требуется 6 единиц ресурса, т.е. x22 = 6. Теперь спрос элемента 2 удовлетворен и переходим к клетке (2,3) и т.д.
Перемещаясь по матрице только вправо и вниз, получим остальные
назначения.
x23 = 3, x33 = 4, x34 = 14.
Занесем их в таблицу. Причем, в каждой клетке, участвующей
в решении, будем указывать количество единиц ресурса, а рядом
55
в круглых скобках – заданную стоимость перераспределения. Получим
1
1
2
5(19)
2(20)
2
6(30)
3
5
8
3
4
7
3(40)
9
4(70)
14(20)
18
7
14
34
Подсчитаем затраты, соответствующие этому решению. Они равны сумме произведений количества ресурсов на стоимость перераспределения одной единицы ресурса. Для нашего решения имеем:
5*19+2*20+6*30+3*40+4*70+14*20=1015 (ед. стоим.).
Листинг программного кода
реализации метода северо-западного угла
#include 6WG$I[K!
#include <iostream>
using namespace std;
int main()
{
int i, j; ɨɛɴɹɜɥɟɧɢɟLM
i = j = 0; ɨɛɧɭɥɟɧɢɟLM
int* A; ɨɛɴɹɜɥɟɧɢɟȺɩɨɫɬɚɜɳɢɤɢ
int* B; ɨɛɴɹɜɥɟɧɢɟȼɩɨɬɪɟɛɢɬɟɥɢ
int** C; ɨɛɴɹɜɥɟɧɢɟɋɩɨɫɬɚɜɤɢ
int v = 0;ɨɛɧɭɥɟɧɢɟY
int N, M; ɨɛɴɹɜɥɟɧɢɟ10
ɜɜɨɞɢɦɱɢɫɥɨɩɨɫɬɚɜɳɢɤɨɜ
std::cout << ”Vvedite chislo postavshikov N: ” << std::endl;
ɩɨɥɭɱɚɟɦɢɧɮɨɪɦɚɰɢɸɫɤɥɚɜɢɚɬɭɪɵ
std::cin >> N; ɜɜɨɞɢɦɜɩɪɨɝɪɚɦɦɭɢɧɮɨɪɦɚɰɢɸɜɜɟɞɟɧɧɭɸ
ɫɤɥɚɜɢɚɬɭɪɵ
ɜɜɨɞɢɦɱɢɫɥɨɩɨɬɪɟɛɢɬɟɥɟɣ
std::cout << ´9YHGLWHFKLVORSRWUHELWHOH\0´ << std::endl;
ɩɨɥɭɱɚɟɦɢɧɮɨɪɦɚɰɢɸɫɤɥɚɜɢɚɬɭɪɵ
std::cin >> M; ɜɜɨɞɢɦɜɩɪɨɝɪɚɦɦɭɢɧɮɨɪɦɚɰɢɸɜɜɟɞɟɧɧɭɸ
ɫɤɥɚɜɢɚɬɭɪɵ
ɜɵɞɟɥɹɟɦɩɚɦɹɬɶ
A = new int>1@ɨɛɴɹɜɥɟɧɢɟɦɚɫɫɢɜɚȺ
B = new int>0@ɨɛɴɹɜɥɟɧɢɟɦɚɫɫɢɜɚȼ
C = new int>1@ɨɛɴɹɜɥɟɧɢɟɦɚɫɫɢɜɚɋ
56
forL L1LɜɜɨɞɩɚɪɚɦɟɬɪɨɜɰɢɤɥɚIRU
&>L@ new int>0@
}
int sum = 0;
ɜɜɨɞɢɦɡɧɚɱɟɧɢɹɞɥɹɩɨɫɬɚɜɳɢɤɨɜ
forL L1L^ɜɜɨɞɩɚɪɚɦɟɬɪɨɜɰɢɤɥɚIRU
std::cout << ”Vvedite chislo zapasi A[” << i << ´@´
<< std::endl; ɩɨɥɭɱɚɟɦɢɧɮɨɪɦɚɰɢɸɫɤɥɚɜɢɚɬɭɪɵ
VWGFLQ!!$>L@ɜɜɨɞɢɦɜɩɪɨɝɪɚɦɦɭɢɧɮɨɪɦɚɰɢɸ
ɜɜɟɞɟɧɧɭɸɫɤɥɚɜɢɚɬɭɪɵ
}
ɜɜɨɞɢɦɡɧɚɱɟɧɢɹɞɥɹɩɨɬɪɟɛɢɬɟɥɟɣ
forM M0M^
std::cout << ´9YHGLWHFKLVORSRWUHELWHO\%>´ << j <<
´@´ << std::endl; ɩɨɥɭɱɚɟɦɢɧɮɨɪɦɚɰɢɸɫɤɥɚɜɢɚɬɭɪɵ
VWGFLQ!!%>M@ɜɜɨɞɢɦɜɩɪɨɝɪɚɦɦɭɢɧɮɨɪɦɚɰɢɸ
ɜɜɟɞɟɧɧɭɸɫɤɥɚɜɢɚɬɭɪɵ
}
ɨɛɧɭɥɹɟɦɦɚɬɪɢɰɭɩɨɫɬɚɜɨɤ
forL L1L^
forM M0M^
&>L@>M@ }
}
ɪɚɫɱɢɬɵɜɚɟɦɫɭɦɦɚɪɧɵɣɧɟɨɛɯɨɞɢɦɵɣɨɛɴɟɦɩɨɫɬɚɜɨɤ
forM M0M^
VXP %>M@
}
ɢɳɟɦɩɨɦɚɬɪɢɰɟɫɫɟɜɟɪɨɡɚɩɚɞɧɨɝɨɭɝɥɚ
i = 0;
j = 0;
whileY VXP^
if$>L@!%>M@^ɉɨɫɬɚɜɳɢɤɦɨɠɟɬɩɨɫɬɚɜɢɬɶɛɨɥɶɲɟ
ɱɟɦɧɟɨɛɯɨɞɢɦɨɩɨɬɪɟɛɢɬɟɥɸ
ɩɨɥɧɨɫɬɶɸɭɞɨɜɥɟɬɜɨɪɹɟɦɟɝɨɩɨɬɪɟɛɧɨɫɬɶ
$>L@ %>M@
&>L@>M@ %>M@
Y %>M@
ɨɛɧɭɥɹɟɦɫɬɨɥɛɟɰɞɚɧɧɨɝɨɩɨɬɪɟɛɢɬɟɥɹɬɤɨɧɭɠɟ
ɩɨɥɧɨɫɬɶɸɭɞɨɜɥɟɬɜɨɪɟɧ
for (intN LN1N^
&>N@>M@ }
if$>M@ ^ɟɫɥɢɩɨɫɬɚɜɳɢɤɢɫɩɨɥɶɡɨɜɚɥ
ɜɫɟɫɜɨɢɪɟɫɭɪɫɵɬɨɩɟɪɟɯɨɞɢɦɤɫɥɟɞɭɸɳɟɦɭ
^
57
ɩɨɬɪɟɛɢɬɟɥɸ
L
}
M M0ɩɟɪɟɯɨɞɢɦɤɫɥɟɞɭɸɳɟɦɭ
} else { ɉɨɫɬɚɜɳɢɤɧɟɦɨɠɟɬɩɨɫɬɚɜɢɬɶɧɟɨɛɯɨɞɢɦɵɣ
ɞɥɹɩɨɬɪɟɛɢɬɟɥɹɨɛɴɟɦ
ɉɨɫɬɚɜɳɢɤɢɫɩɨɥɶɡɭɟɬɜɟɫɛɪɟɫɭɪɫɩɨɫɬɚɜ
ɳɢɤɚ
%>M@ $>L@
&>L@>M@ $>L@
Y $>L@
ɨɛɧɭɥɹɟɦɫɬɪɨɤɭɞɚɧɧɨɝɨɩɨɫɬɚɜɳɢɤɚɬɤ
ɜɫɟɟɝɨɪɟɫɭɪɫɵɭɠɟɢɫɩɨɥɶɡɨɜɚɧɵ
for (intO MO0O^
&>L@>O@ }
if%>M@ ^ɟɫɥɢɩɨɬɪɟɛɢɬɟɥɶɭɞɨɜɥɟɬ
ɜɨɪɟɧ
ɨɛɧɭɥɹɟɦɟɝɨɫɬɨɥɛɟɰ
for (intN LN1N^
&>N@>M@ }
}
ɬɚɤɤɚɤɩɨɫɬɚɜɳɢɤɢɫɱɟɪɩɚɥɫɜɨɢɪɟɫɭɪɫɵɬɨɩɟɪɟ
ɯɨɞɢɦɤɫɥɟɞɭɸɳɟɦɭ
L
}
}
{std::cout << ³0DWULFDRSRUQRJRSODQD?Q´;}
ɜɵɜɨɞɢɦɪɟɡɭɥɶɬɚɬ
forL L1L^
forM M0M^
VWGFRXW&>L@>M@³³;
}
std::cout << std::endl;
}
ɨɫɜɨɛɨɠɞɚɟɦɩɚɦɹɬɶ
delete>@$
delete>@%
forL L1L^
delete>@&>L@
}
delete>@&
return 0;
}
58
Блок-схема реализации метода северо-западного угла
Начало
Инициализация
переменных
В
false
Достаточно ли
ресурсов на i-м складе
для удовлетворения
потребностей
j-го потребителя
Передача
в результирующий
массив опорного
плана доступного
количества ресурсов
для j-го потребителя.
Перерасчет запасов
на складах.
Переход к следующему
складу.
Перерасчет
потребностей потребителей
false
Потребности
j-го
потребителя
== 0 ?
true
Передача
в результирующий
массив опорного
плана нужного
количества ресурсов
для j-го потребителя.
Перерасчет запасов
на складах
Переход
к следующему
потребителю
true
Переход
к следующему
потребителю
А
59
А
В
Матрица
опорного
плана
заполнена?
false
true
Вывод
результата
Конец
Варианты практических заданий
На вокзалы А и В прибыло несколько комплектов мебели. Эту
мебель нужно доставить в магазины C, D и E с учетом их потребностей. Необходимые данные для решения указаны в таблице ниже.
Потребители
Склады
60
C
D
E
A
2
3
2
30
B
1
2
3
30
20
20
20
60
Вокзалы
Потребность
Вариант
A
B
C
D
E
1
30
40
20
40
10
2
20
40
30
10
20
3
30
20
10
10
30
4
40
20
20
10
30
5
40
30
30
30
10
6
50
20
20
10
40
7
30
50
20
40
20
8
60
10
40
20
10
9
10
40
30
10
10
10
50
30
20
30
30
11
10
60
10
40
20
12
20
50
20
40
10
13
40
10
10
20
20
14
40
50
40
10
40
15
60
30
20
30
40
16
50
40
10
30
50
17
10
30
20
10
10
18
20
70
10
30
50
19
10
50
30
20
10
20
20
30
20
10
20
61
ПРАКТИЧЕСКАЯ РАБОТА № 2
Реализация простейшей программы на C++,
с использованием графического интерфейса и библиотеки MFC
(Windows Application на основе диалогового окна)
Цель работы
Научиться разрабатывать и реализовывать простейшие программы на языке VC++.
Получить практические навыки работы по использованию графического интерфейса. Научиться связывать переменные и методы
с элементами диалогового окна.
Создаем приложение с помощью MFC AppWizard(exe) с диалоговым окном в качестве главного.
1. Создаем новый проект как обычно.
2. Выбираем MFC AppWizard(exe).
3. В следующем диалоговом окне выбираем тип приложения.
В нашем случае это будет Dialog Based. С помощью мыши и соответствующей панели инструментов создаем на форме нужные
нам элементы: надписи (Static Text), однострочные редакторы для
ввода-вывода данных (Edit Box) и кнопки. Чтобы разместить компонент на форме (диалоге), нужно щелкнуть по этому компоненту
на панели Controls, а затем щелкнуть в том месте формы, где нужно
разместить компонент. Если панели Controls на экране почему-то
нет, то достаем ее следующим образом: щелкаем правой кнопкой
мыши по главному меню и устанавливаем флажок напротив пункта Controls.
Static Text
После размещения этого компонента на форме, щелкаем по нему
правой кнопкой и в поле Caption пишем нужное нам слово. Чтобы
при выполнении программы правильно отображались символы
русского алфавита, нужно на вкладке ResourceView открыть папку Dialog и щелкнуть правой кнопкой по нужному диалогу (в нашем случае – IDD_LAB_02_2_DIALOG). Затем выбрать Properties
(Свойства), в поле Language установить русский язык и закрыть
диалог либо нажать клавишу Enter.
Edit Box
Для того чтобы мы могли работать с данными, вводимыми в этот
элемент, нужно с этим элементом связать переменную. А для этого вызываем ClassWizard из меню View. Переходим на вкладку
62
Member Variable, выделяем нужный элемент и щелкаем по кнопке
Add Variable… В поле Member Variable Name вписываем имя переменной, а в поле Variable Type выбираем тип переменной. Мы будем
работать с вещественными числами, поэтому выбираем float.
Button
Помещаем на форму кнопку «Рассчитать», по нажатию на которую будет произведен нужный нам расчет. Для того чтобы программа «поняла», что на эту кнопку нажали, нужно с этой кнопкой связать метод (событие, которое происходит после нажатия на кнопку).
Это можно сделать, например, дважды щелкнув по кнопке. Тогда
откроется редактор исходного кода, а курсор будет установлен на
интересующий нас участок, куда мы впишем следующий текст:
YRLG &/DE B B 'OJ2Q%XWWRQ ɋɨɛɵɬɢɟ ɞɥɹ ɤɧɨɩɤɢ ´Ɋɚɫɫɱɢ
ɬɚɬɶ´
{
8SGDWH'DWDɉɨɥɭɱɢɬɶɞɚɧɧɵɟɢɡɪɟɞɚɤɬɨɪɨɜ
P B HG5HVXOW P B HG:D\P B HG/LWUHVP B HG3ULFH
8SGDWH'DWDȼɵɜɟɫɬɢɞɚɧɧɵɟɜɪɟɞɚɤɬɨɪɵ
}
Здесь функция 8SGDWH'DWD либо записывает данные из редакто-
ров в переменные, либо выводит значения переменных в редакторы,
в зависимости от получаемого параметра: – получить данные, 0 –
вывести данные.
Добавляем элемент для ввода данных и связываем с ним переменную P B HG1XP.
А формула будет такой: P B HG5HVXOW P B HG:D\P B
HG/LWUHVP B HG3ULFHP B HG1XP
Усовершенствуем полученную программу, добавив кнопку, по
нажатию на которую в редакторы выводятся заранее определенные
значения (Расстояние = 240 км., Расход = 8,4 л/100 км, Цена = 16,5)
Добавляем кнопку «По умолчанию» и связываем с ней событие. Добавляем код:
YRLG&/DE B B 'OJ2Q'HIDXOW
{
P B HG:D\ Ɋɚɫɫɬɨɹɧɢɟ
P B HG/LWUHV Ɋɚɫɯɨɞ
P B HG3ULFH ɐɟɧɚ
P B HG1XP Ʉɨɥɢɱɟɫɬɜɨɩɨɟɡɞɨɤ
P B HG5HVXOW P B HG:D\P B HG/LWUHVP B HG3ULFHP B HG1XP
8SGDWH'DWDȼɵɜɟɫɬɢɞɚɧɧɵɟɜɪɟɞɚɤɬɨɪɵ
}
63
Рис. 7. Оконная форма представления проекта
с помощью библиотеки MFC
Оконная форма представленного приложения с помощью библиотеки MFC представлена на рис. 7.
Варианты практических заданий
Создать приложение на основе диалогового окна, производящее
вычисление по формуле, предложенной преподавателем.
64
ПРАКТИЧЕСКАЯ РАБОТА № 3
Создание графического интерфейса
на базе диалогового окна VC++,
с использованием переключателей, флажков.
Реализация разветвляющихся алгоритмов.
Цель работы
Научиться разрабатывать и реализовывать программы на основе
разветвляющихся алгоритмов, с использованием флажков и переключателей, а также операторов if и switch.
Получить практические навыки работы по использованию различных элементов графического интерфейса и операторов языка
VC++.
1. Условие задачи
В гараже имеется 4 различных автомобиля (ВАЗ, Газель, ГАЗ66, Мерседес), каждый автомобиль имеет свой расход топлива на
100 км пути, а также свою стоимость топлива. Программа должна
вычислять стоимость поездки для заданной машины. Реализовать,
используя флажки и переключатели, операторы if и switch.
Размещаем на форме четыре переключателя (Radio Button): ВАЗ,
Газель, ГАЗ-66 и Мерседес. Для каждого из этих переключателей
нам нужно определить событие – в нашем случае это будет щелчок
левой кнопкой мыши. Определить событие можно, например, так:
1. Щелкнуть правой кнопкой по переключателю ВАЗ.
2. Выбрать пункт Events.
3. В поле Class or object to handle выбрать IDC_RADIO1.
4. В поле New Windows Massages/Events выбрать BN_CLICED.
5. Щелкнуть по кнопке Add and Edit.
6. В поле Member function name вписать имя события (в нашем
случае пусть будет OnVAZ).
7. Щелкнуть кнопку ОК.
Элемент Radio Button – это зависимый переключатель. Если на
форме разместить несколько таких элементов, то при щелчке на любом из них данный элемент будет «включен», а остальные автоматически «выключатся».
В редакторе исходного кода впишем следующее:
YRLG&/DE B 'OJ2Q9$=^P B HG/LWUHV Ɋɚɫɯɨɞɬɨɩɥɢɜɚ
P B HG3ULFH ɐɟɧɚɨɞɧɨɝɨɥɢɬɪɚ
8SGDWH'DWDȼɵɜɟɫɬɢɞɚɧɧɵɟɜɪɟɞɚɤɬɨɪɵ
}
65
Все эти действия повторим для каждого переключателя, заменяя имена событий на соответствующие для других автомобилей
и изменяя значения переменных. Расчет поездки выполняется так
же, как и в предыдущей практической работе.
2. Усовершенствовать полученную в первом пункте программу,
добавив режим заполнения данных для каждого автомобиля.
Размещаем на форме четыре переключателя: ВАЗ, Газель,
ГАЗ-66, Мерседес. Чтобы подровнять переключатели, щелкаем на
одном из них, а затем, нажав и удерживая клавишу Ctrl, щелкаем
по очереди на остальных. Выбираем в главном меню пункт Layout ->
Align -> Left. Таким образом выравниваем элементы по левому
краю. Далее выбираем Layout -> Space Evenly -> Down, устанавливая таким образом одинаковый интервал между элементами.
Далее щелкаем правой кнопкой по первому переключателю
(ВАЗ) и выбираем пункт Properties. Устанавливаем флажок Group.
Такая установка означает, что переключатель ВАЗ является первым
элементом группы переключателей. События для переключателей
устанавливаем также как и предыдущей задаче, только в исходный
код добавляем строку, которая включает соответствующий переключатель, так как теперь все переключатели принадлежат группе:
YRLG&/DE B 'OJ2Q9$=
{
P B HG/LWUHV Ɋɚɫɯɨɞɬɨɩɥɢɜɚ
P B HG3ULFH ɐɟɧɚɨɞɧɨɝɨɥɢɬɪɚ
P B UDGLR ȼɤɥɸɱɢɬɶɩɟɪɜɵɣɩɟɪɟɤɥɸɱɚɬɟɥɶ
8SGDWH'DWDȼɵɜɟɫɬɢɞɚɧɧɵɟɜɪɟɞɚɤɬɨɪɵ
}
ȾɨɛɚɜɥɹɟɦɫɨɛɵɬɢɟɞɥɹɤɧɨɩɤɢɊȿɁɍɅɖɌȺɌɢɩɢɲɟɦɤɨɞ
YRLG&/DE B B 'OJ2Q5HVXOW
{
8SGDWH'DWDɉɨɥɭɱɢɬɶɞɚɧɧɵɟɢɡɪɟɞɚɤɬɨɪɨɜ
P B HG5HVXOW P B HG:D\P B HG/LWUHVP B HG3ULFHP B HG1XP
8SGDWH'DWDȼɵɜɟɫɬɢɞɚɧɧɵɟɜɪɟɞɚɤɬɨɪɵ
}
3. Усовершенствовать полученную программу:
Добавить грузоподъемность автомобилей и возможность указывать вес перевозимого груза. Программа должна рассчитать оптимальный вариант по стоимости перевозки груза. Добавляем еще
два редактора для ввода данных: Грузоподъемность (P B HG7RQQDJH)
и Вес груза (P B HG:HLJKW). Эти величины будем измерять в килограммах.
66
Чтобы иметь возможность сравнить результаты, создадим четыре
редактора и расположим их соответствующим образом напротив наименований автомобилей. А переменные назовем так: P B 5HVXOW9$=,
P B 5HVXOW*D]HO, P B 5HVXOW*$= и P B 5HVXOW0HUV. Тогда в обработчик
события нажатия кнопки РЕЗУЛЬТАТ (с учетом условия задачи)
нужно будет вписать код вида:
YRLG&/DE B B 'OJ2Q5HVXOW
{
ÀRDW[Ɉɛɴɹɜɢɬɶɩɟɪɟɦɟɧɧɭɸ
8SGDWH'DWDɉɨɥɭɱɢɬɶɞɚɧɧɵɟɢɡɪɟɞɚɤɬɨɪɨɜ
LIP B HG7RQQDJH ȿɫɥɢɝɪɭɡɨɩɨɞɴɟɦɧɨɫɬɶɛɨɥɶɲɟɧɭɥɹ
{
ȼɵɱɢɫɥɢɬɶɤɨɥɜɨɩɨɟɡɞɨɤ
P B HG1XP LQWP B HG:HLJKWP B HG7RQQDJH
[ ÀRDWP B HG:HLJKWÀRDWP B HG7RQQDJH
LIP B HG1XP[P B HG1XP P B HG1XP
ȼɵɱɢɫɥɢɬɶɫɬɨɢɦɨɫɬɶɩɨɟɡɞɨɤ
VZLWFKP B UDGLR
{
Рис. 8. Оконная форма работы программы
67
FDVH P B 5HVXOW9$=
P B HG:D\P B HG/LWUHVP B
HG3ULFHP B HG1XP
break;
FDVH P B 5HVXOW*D]HO P B HG:D\P B HG/LWUHVP B
HG3ULFHP B HG1XP
break;
FDVH P B 5HVXOW*$= P B HG:D\P B HG/LWUHVP B
HG3ULFHP B HG1XP
break;
FDVH P B 5HVXOW0HUV P B HG:D\P B HG/LWUHVP B
HG3ULFHP B HG1XP
break;
}
}
8SGDWH'DWDȼɵɜɟɫɬɢɞɚɧɧɵɟɜɪɟɞɚɤɬɨɪɵ
Здесь P B UDGLR – переменная, связанная с группой переключа-
телей.
На рис. 8 представлен результат работы программы:
68
ПРАКТИЧЕСКАЯ РАБОТА № 4
Разработка консольного приложения
по оценке степени загруженности выбранного участка
Цель работы
Изучить методы объектно-ориентированного программирования.
Изучить методики создания собственных методов.
Разработать консольное приложение на языке С++, решающее
задачу оценки пропускной способности улицы и степени загруженности в часы пик.
Ме тод в объектно-ориентированном программировании – это
функция или процедура, принадлежащая какому-то классу или
объекту.
Как и процедура в процедурном программировании, метод состоит из некоторого количества операторов для выполнения какогото действия и имеет набор входных аргументов.
Различают простые методы и статические методы (методы класса): простые методы имеют доступ к данным объекта (конкретного
экземпляра данного класса), статические методы не имеют доступа
к данным объекта, и для их использования не нужно создавать экземпляры (данного класса).
Фу нкция в программировании — фрагмент программного кода,
к которому можно обратиться из другого места программы. С именем функции неразрывно связан адрес первой инструкции (оператора), входящей в функцию, которой передаётся управление при обращении к функции. После выполнения функции управление возвращается обратно в адрес возврата — точку программы, где данная
функция была вызвана.
Функция может принимать параметры и должна возвращать
некоторое значение, возможно пустое. Функции, которые возвращают пустое значение, часто называют процедурами. В некоторых
языках программирования объявления функций и процедур имеют различный синтаксис, в частности, могут использоваться различные ключевые слова.
Функция должна быть соответствующим образом объявлена и
определена.
Объявление функции, кроме имени, содержит список имён и
типов передаваемых параметров (или: аргументов), а также, тип
возвращаемого функцией значения. Определение функции содер69
жит исполняемый код функции. В одних языках программирования объявление функции непосредственно предваряет определение
функции, в то время как в ряде других языков необходимо сначала
объявить функцию, а уже потом привести её определение.
В объектно-ориентированном программировании функции, объявления которых являются неотъемлемой частью определения класса, называются методами. Для того, чтобы использовать ранее определённую функцию, необходимо в требуемом месте программного
кода указать имя функции и перечислить передаваемые в функцию
параметры. Параметры, которые передаются функции, могут передаваться как по значению, так и по ссылке: для переменной, переданной по значению создаётся локальная копия и любые изменения, которые происходят в теле функции с переданной переменной,
на самом деле, происходят с локальной копией и никак не сказываются на самой переменной, в то время как изменения, которые
происходят в теле функции с переменной, переданной по ссылке,
происходят с самой переданной переменной.
Процедуры и функции. Отличия
Функция отличается от процедуры двумя особенностями:
– всегда вычисляет некоторое значение, возвращаемое в качестве результата функции;
– вызывается в выражениях.
Процедура имеет свои особенности:
– возвращает формальный результат void, который указывает на
отсутствие результата, возвращаемого при вызове процедуры;
– имеет входные и выходные аргументы, причем выходных аргументов – ее результатов – может быть достаточно много.
Математическая модель:
1. На первом этапе рассчитывается существующая интенсивность движения автомобилей
Интенсивность движения (Nсущ) – количество транспортных средств, проходящих через сечение дороги за единицу времени.
Nïñ÷
m
¦ h 1 Nh Kh
N1 N2 u 1,7 N3 u 2 N4 u 2,3 N5 u 2,4 N6 u 0,5, (1)
где Ki – коэффициент приведения
2. На втором этапе рассчитывается теоретическая пропускная
способность
Пропускная способность (Nтеор) – пропускная способность участка дороги при транспортном потоке, состоящего только из легковых
70
автомобилей и движущегося с одинаковыми интервалами по горизонтальному участку дороги.
(3600u)
Nðãìî
(u 7 0,17u2 )
.
(2)
3. Далее оцениваем время задержки на светофоре:
's
T Tåãé
.
2
(3)
4. Вычисляем коэффициент влияние светофорного регулирования на теоретическую пропускную способность, используя значение (3):
L
(4)
D
.
2
u
1
L
1
u's
2
1.5
5. Третий этап: зная значения (4), вычисляем реальную пропускную способность-максимальное число, которое может пропустить
участок дороги в единицу времени в одном или двух направлениях
в рассматриваемых дорожных и погодно-климатических условиях:
NîãÞé
NðãìîmD,
(5)
где n – количество полос
6. Завершающим этапом находим степень загруженности:
Степень загруженности (Z) – отношение фактической интенсивности движения по автомобильной дороге, к пропускной способности за заданный промежуток времени:
Z
Nïñ÷
NîãÞé
.
(6)
Пример реализации
Исходными данными для реализации является улица Гастелло,
длина которой равна 900м. Количество полос движения – 2. На рис. 9
ниже представлено месторасположение выбранного участка.
N1 – интенсивность движения автомобиля легкового типа (шт.)
N1 = 390
N2 – интенсивность движения автомобиля грузового типа (шт.)
N2 = 70
N3 – интенсивность движения простых автобусов (шт.) N3 = 40
N4 – интенсивность движения больших автобусов (шт.) N4 = 10
71
Рис. 9. Объект исследования
N5 – интенсивность движения троллейбусов (шт.) N5 = 25
N6 – интенсивность движения мотоциклов (шт.) N6 = 35
L – длина выбранной улицы (м)
L = 900 м (улица Гастелло)
v – скорость автомобилей (м/c)
v = 16.7 м/с
Т – время цикла (с) = 60
Tz – время работы зеленого светофора (с)= 30
N – количество полос движения = 2
Пример реализации функции расчета
коэффициента влияния светофорного регулирования (D)
#include<iostream>
using namespace std;
GRXEOH$OGRXEOH9GRXEOH/GRXEOH7
^UHWXUQ//9997
}
void main ()
^GRXEOH11111197/Q
FRXW´9YHGLWH11111197/Q´HQGO
FLQ!!1!!1!!1!!1!!1!!1!!9!!7!!/!!Q
72
GRXEOH$OID $O9/7
cout<<Alfa<<endl;
V\VWHP³SDXVH´
}
Алгоритм представленный в виде блок-схемы
Начало
Инициализация переменных
Функция расчета
существующей интенсивности
движения на исследуемом
объекте
Функция оценки
теоритической пропускной
способности
Оценка задержки на светофоре
Расчет коэффициента
влияния светофорного
регулирования (Į)
Nреал = Nтеор * n * D
Расчет степени загруженности
Вывод результатов
Конец
73
Рис. 10. Оконная форма работы программы
Варианты практических заданий
Объект исследования для студента определяется преподавателем
непосредственно на занятии.
74
ПРАКТИЧЕСКАЯ РАБОТА № 5
Разработка приложения на языке высокого уровня С++
по генерации строк данных для технологии RFID.
Стандартизация методов и форматов кодировок
меток радиочастотной идентификации
Цель работы
Изучить методы объектно-ориентированного программирования.
Изучить методики создания собственных методов.
Разработка программного обеспечения, позволяющего выполнить тестирование представленного стандарта в области RFID.
Задачи
1. Разработка модуля генерации набора строк данных исходя из
поставленного стандарта;
2. Анализ корректности генерации данных;
3. Выявления ошибок, представленных данных из вне;
4. Проверка соответствия кодировки;
5. Оценка процента неточности представления данных;
6. Разработка модуля кодирования по исходным данным исходя
из представленного стандарта.
7. Разработка модуля декодирования представленной информации.
При генерации данных необходимо, исходя из представленного
стандарта, сформировать поля данных определенной длины с определенной структурой.
Структура представлена в табл. 1.
Таблица 1
Структура представления полей данных
для разработки модуля генерации тестовых файлов
№ поля
Название поля
Количество символов
представления
1
Database-ID
1
2
Owner-ID
2
3
Program-ID
2
4
Serial-ID
5
5
Object-ID
5
6
Tag-ID
24
75
Характеристика полей и спецификации данных представлены
в табл. 2.
Таблица 2
Спецификация представления данных
Requirement Specification
1
All fields (Database-ID, Owner-ID, Program-ID, Object-ID and
Serial-ID) MUST be valid and present in the order specified
2
All character fields (Database-ID, Owner-ID, Program-ID and SerialID) MUST be encoded per the ECMA-113/ISO 8859 Part 5 Standard
for encoding Latin and Cyrillic characters. See for the ECMA-113/
ISO 8859 Part 5 allowable Latin and Cyrillic character sets
3
The Database-ID MUST be defined in the SANA RFID-TAG
Database-ID Registry
4
The Object-ID MUST be an integer between [0 – 65535]
5
If the Object-ID is to be tracked across multiple Database-IDs and
Owner-IDs, then the Object-ID MUST be in the range of “Common
Object IDs” which is [32768 – 65535]. If the Object-ID exists in the
SANA RFID-Tag Object-ID Registry then the existing registered
Object-ID MUST be utilized. If a “Common Object ID” for a class of
objects does not exist, then a request to add a NEW common ObjectID per the specified Registration Rule MUST be completed
6
If the Object-ID does not require common-object cross-referencing
then the Object-ID MUST be in the range [0 – 32767] to indicate
a unique agency test activity
Также описание представления данных:
Test data sets (Test-Suite-01, Test-Suite-02) will be comprised
ONLY of valid entries in these fields. Unicode characters in the test
data set will be the Unicode representations of the valid subset of
ECMA-113 characters specified. The Database-ID will be comprised
of one Unicode character drawn from the valid ECMA-113 subset.
The Owner-ID will be comprised of two Unicode characters from the
valid ECMA-113 subset. The Program-ID will be comprised of two
Unicode characters from the valid ECMA-113 subset. The Serial-ID
will be comprised of five Unicode characters from the valid ECMA113 subset. The Object-ID will be comprised of 5 Unicode characters
representing decimal integer values (‘0’ through ‘9’) and will encode in
the range [0 – 65535]. The Tag-ID field will be comprised of 24 Unicode
characters representing hexadecimal integer values (‘0’ through ‘9’
and ‘A’ through ‘F’).
76
Рис. 11. ECMA-113 / OSI Latin/Cyrillic Character Table
Соответственно спецификация разрешенных символов представлена на рис. 11.
Поле Tag-ID является составным и представляет из себя структуру перевода первых пяти полей в шестнадцатеричную систему.
В табл. 3 приведен пример формирования шестого поля данных
по пяти.
77
Таблица 3
Спецификация шестого поля данных
Tag ID
Field
Address
Value
Value
(binary)
Value
(hexadecimal)
8-bit ECMA-113
00h – 07h / ISO 8859 Part 5 Database-ID
character
‘I’
01001001
49h
8-bit ECMA-113
08h – 0Fh / ISO 8859 Part 5
character
‘X’
01011000
58h
8-bit ECMA-113
Program-ID
10h – 17h / ISO 8859 Part 5
Byte 0
character
‘C’
01000011
43h
8-bit ECMA-113
Program-ID
18h – 1Fh / ISO 8859 Part 5
Byte 1
character
‘P’
01010000
50h
8-bit ECMA-113
20h – 27h / ISO 8859 Part 5
character
Serial-ID
Byte 0
‘1’
00110001
31h
8-bit ECMA-113
28h – 2Fh / ISO 8859 Part 5
character
Serial-ID
Byte 1
‘2’
00110010
32h
8-bit ECMA-113
30h – 37h / ISO 8859 Part 5
character
Serial-ID
Byte 2
‘3’
00110011
33h
8-bit ECMA-113
38h – 3Fh / ISO 8859 Part 5
character
Serial-ID
Byte 3
‘4’
00110100
34h
8-bit ECMA-113
40h – 47h / ISO 8859 Part 5
character
Serial-ID
Byte 4
‘5’
00110101
35h
8-bit ECMA-113
48h – 4Fh / ISO 8859 Part 5
character
Owner-ID
Byte 1
‘J’
01001010
4Ah
45678
Byte 10:
10110010
Byte 11:
01101110
B26Eh
Field Type
Field
Owner-ID
Byte 0
16-bit integer
50h – 5Fh
Object-ID
TAG-ID
78
49584350
313 23334
354AB26E
Пример алгоритма генерации полей данных
в виде блок-схемы
Начало
Создание файла
Инициализация
кодировки
документа
Кодировка
верная ?
false
В
true
Создание
массивов данных
для генерации
Генерация полей
используя генератор
случайных символов
исходя из алфавита
Преобразование
составных полей
в шестнадцатеричную
систему
Формирование
результирующего
массива данных
Анализ соответствия
составного поля
с данными соответствия
А
79
А
Запись массива
строк данных
в файл генерации
В
Запись
информации
в файле
о неверной
кодировке
Конец
Листинг программного кода
#include <iostream>
#include <fstream>
#include <ctime>
#include <iomanip>
#include <bitset>
#include <sstream>
LQFOXGHDUUD\!
LQFOXGH:LQGRZVK!
GH¿QH $55$< B 6,=(DUUD\ VL]HRIDUUD\VL]HRIDUUD\>@ ɮɭɧɤɰɢɹɩɨɞɫɱɟɬɚɪɚɡɦɟɪɚɦɚɫɫɢɜɚ
using namespace std;
int main() {
ɨɩɪɟɞɟɥɹɟɦɧɚɡɜɚɧɢɹɮɚɣɥɨɜ
FRQVWVWULQJ),/( B 1$0( ³ɷɬɚɩW[W´
FRQVWVWULQJ),/( B &2'( B 1$0( ³ɷɬɚɩW[W´
FRQVWLQW675,1* B /(1*7+ ɪɚɡɦɟɪɫɬɪɨɤɢ
VHWORFDOH/& B $//´5XVVLDQ´ɩɨɞɞɟɪɠɤɚɤɢɪɢɥɢɰɵɜɤɨɧ
ɫɨɥɢ
FRQVWFKDUOHWWHUV>@ ³?´¶ "#$%&'()
*+,-./0123456789:;<=>?@A B CDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`aȺȻȼȽȾȿȬɀɁ
ɂɃɄɅɆɇɈɉɊɋɌɍɎɏɐɑɒɓɔɕɖɗɘəɚɛɜɝɞɟɺɠɡɢɣɤɥɦɧɨɩɪɫɬɭɮɯɰɱɲɳɴɵɶɷɸɹ´
ɧɟɨɛɯɨɞɢɦɨɞɥɹɜɵɱɢɫɥɟɧɢɹɪɚɧɞɨɦɧɨɝɨɱɢɫɥɚɩɪɢɤɚɠɞɨɦɨɛ
ɪɚɳɟɧɢɢ
srand((unsigned)time(NULL));
FRXW´ɉɊȽɟɧɟɪɚɰɢɹɫɥɭɱɚɣɧɵɯɫɢɦɜɨɥɨɜ
´HQGO
ɞɢɧɚɦɢɱɟɫɤɢɨɩɪɟɞɟɥɹɟɦɤɨɥɢɱɟɫɬɜɨɫɬɪɨɤ
LQW52: B /(1*7+
FRXW´ȼɜɟɞɢɬɟɤɨɥɢɱɟɫɬɜɨɫɬɪɨɤ´
80
FLQ!!52: B /(1*7+
cout << endl;
ɫɨɡɞɚɟɦɦɚɫɫɢɜɵɜɩɚɦɹɬɢ
XQVLJQHGFKDUPDWUL[&KDUɦɚɫɫɢɜɞɥɹɯɪɚɧɟɧɢɹɫɢɦɜɨɥɨɜ
PDWUL[&KDU QHZXQVLJQHGFKDU>52: B /(1*7+@
IRULQWL L52: B /(1*7+L^
PDWUL[&KDU>L@ QHZXQVLJQHGFKDU>675,1* B /(1*7+@
}
ɧɚɩɨɥɧɹɟɦɦɚɫɫɢɜɵɡɧɚɱɟɧɢɹɦɢ
IRULQWL L52: B /(1*7+L^ɜɜɨɞ
IRULQWM M675,1* B /(1*7+M^
LQW UDQGRP B QXPEHU UDQG $55$< B
6,=(OHWWHUVɩɨɥɭɱɚɟɦɪɚɧɞɨɦɧɨɟɱɢɫɥɨɨɬɞɨɪɚɡɦɟɪɚɦɚɫɫɢɜɚ
FKDUUHVXOW OHWWHUV>UDQGRP B QXPEHU@
ɨɩɪɟɞɟɥɹɟɦɦɟɫɬɨɫɢɦɜɨɥɚɩɨɬɨɦɭɱɬɨɧɚɱɢɧɚɟɬɫɹɫ
PDWUL[&KDU>L@>M@ UHVXOW ɡɚɩɢɫɵɜɚɸ ɪɟ
ɡɭɥɶɬɚɬɜɦɚɫɫɢɜ
}
}
ɜɵɜɨɞɢɦɫɝɟɧɢɪɢɪɨɜɚɧɧɵɟɦɚɫɫɢɜɵɫɬɪɨɤɧɚɷɤɪɚɧ
IRULQWL L52: B /(1*7+L^
IRULQWM M675,1* B /(1*7+M^
FRXWPDWUL[&KDU>L@>M@
}
IRULQWM M675,1* B /(1*7+M^
FRXW ³ ³ KH[ XQVLJQHG LQW
PDWUL[&KDU>L@>M@ɩɟɪɟɜɨɞɫɬɪɨɤɢɜɫɢɫɬɟɦɭɫɱɢɫɥɟɧɢɹ
}
cout << endl;
}
RIVWUHDPRXW)LOH),/( B 1$0(
IRULQWL L52: B /(1*7+L^
IRULQWM M675,1* B /(1*7+M^
RXW)LOHPDWUL[&KDU>L@>M@ɡɚɩɢɫɶɫɢɦɜɨɥɨɜ
ɜɮɚɣɥɷɬɚɩ
}
IRULQWM M675,1* B /(1*7+M^
RXW)LOH ³ ³ KH[ XQVLJQHG LQW
PDWUL[&KDU>L@>M@
}
outFile << endl;
}
RXW)LOHFORVH
ɨɱɢɳɚɟɦɩɚɦɹɬɶɭɞɚɥɹɹɫɨɡɞɚɧɧɵɟɪɚɧɟɟɦɚɫɫɢɜɵ
81
Рис. 8. Оконная форма работы программы
GHOHWH>@PDWUL[&KDU
ɧɟɛɨɥɶɲɚɹɡɚɞɟɪɠɤɚɦɫ
6OHHS
V\VWHP´SDXVH´Ʉɨɦɚɧɞɚɡɚɞɟɪɠɤɢɷɤɪɚɧɚ
return 0;
}
Для перевода числа в шестнадцатеричную систему счисления
использовалась команда std :: hex, а для преобразования символа
char в двоичную систему был использован шаблонный класс bitset,
подключаемый с помощью #include <bitset>.
В результате выполнения программы получаем сгенерированные символы и код каждого символа в шестнадцатеричном формате. С++ для хранения одного символа char использует 1 байт.
Варианты практических заданий
Доработать программу, добавив интерфейс для ввода исходных
данных для генерации, используя библиотеку MFC. В результате
выполнения практического задания каждый студент должен разработать приложение на языке программирования высокого уровня С++, которое будет выполнять генерацию определенного количества строк полей данных, описанных выше.
82
ВОПРОСЫ ДЛЯ ЗАКРЕПЛЕНИЯ МАТЕРИАЛА
1. Особенности представления данных в информационных системах для транспортных процессов.
2. Понятие ERP систем. Представление системы в виде черного
ящика.
3. Цель и назначение ERP систем.
4. Классификация языков программирования.
5. Достоинства и недостатки языков программирования.
6. Концепция разработки консольных приложений на языке
С++.
7. Понятие переменных в языке программирования и работа
с ними.
8. Основные типы данных переменных.
9. Организация арифметических операторов.
10. Виды арифметических операторов.
11. Понятие логических операторов и их применение.
12. Селективные конструкции и их возможности.
13. Применение циклов.
14. Различия реализации циклов while и do while. Структура
представления.
15. Цикл for и его назначение. Структура представления.
16. Методы в C++.
17. Понятие функции. Пример реализации.
18. Понятие процедуры. Пример реализации.
19. Стандартные библиотеки языка С++. Назначение и пример
использования.
20. Размещение данных в памяти. Время жизни. Статическое
размещение.
21. Локальные и глобальные переменные. Их роль и назначение.
Пример реализации.
22. Организация ввода и вывода информации. Потоковый ввод/
вывод.
23. Организация ввода и вывода информации. Форматированный ввод/вывод.
24. Понятие файловых потоков. Пример реализации.
25. Массивы данных. Одномерный массив. Определение. Динамическое размещение одномерного массива.
26. Массивы данных. Многомерный массив. Определение. Динамическое размещение многомерного массива.
27. Массивы данных. Методика работы с массивами данных.
83
28. Понятие объектно-ориентированного подхода к разработке
информационных систем. Понятие класса. Пример реализации.
29. Понятие объектно-ориентированного подхода к разработке
информационных систем. Инкапсуляция.
30. Понятие объектно-ориентированного подхода к разработке
информационных систем. Полиморфизм.
31. Понятие объектно-ориентированного подхода к разработке
информационных систем. Наследование.
32. Понятие объектно-ориентированного подхода к разработке
информационных систем. Понятие абстракции.
33. Понятие объектно-ориентированного подхода к разработке
информационных систем. Уровень доступа к данным.
34. Указатели и их назначение.
Список рекомендуемой литературы
1. Брюс Эккель (Bruce Ekkel). Философия C++. Введение в стандартный C++. СПб.: Питер, 2004. 572с.
2. Брюс Эккель (Bruce Ekkel). Философия C++. Практическое
программирование СПб.: Питер, 2004. 608 с.
3. Herb Sutter Exceptional C++ Style + More Exceptional C++ (C++
In-Depth). 400с.
4. Мешков А., Тихомиров Ю. Visual C++ и MFC. Программирование для Windows NT и 95. Т. 2. 441с.
84
ПРИЛОЖЕНИЕ 1
Основные типы данных
Диапазон значений
Размер
(байт)
bool
true и false
1
signed char
-128 … 127
1
0 … 255
1
-32 768 … 32 767
2
Тип
unsigned char
signed short int
unsigned short int
0 … 65 535
2
-2 147 483 648 … 2 147 483 647
4
unsigned long int
0 … 4 294 967 295
4
float
3.4e-38 … 3.4e+38
4
1.7e-308 … 1.7C+308
8
3.4e-4932 … 3.4e+4932
10
signed long int
double
long double
85
ПРИЛОЖЕНИЕ 2
Список функций работы строковых данных
Функция
Описание
Конструкторы
string()
конструктор по умолчанию, создает пустую
строку
string(const char* p)
преобразующий конструктор
string(const string& str,
size t pos=0, size t n=npos)
копирующий конструктор (npos обычно
равен -1 и указывает, что память не была
выделена)
string(const char* p,
size_t n)
копирует n символов, р является базовым
адресом
string(char c, size t n=l)
создает строку из n символов с
Перегруженные операторы
string& operator=
(const string& s)
оператор присваивания
string& operator+=
(const string& s)
добавляет строку
char operator[] (size t pos)
const
возвращает символ из позиции pos
char& operator[] (size t pos) возвращает ссылку на символ из позиции pos
Функции-члены
string& append(const
string& s, size_t pos=0,
size t n=npos);
Добавляет n символов начиная от позиции pos
string& assign(const
string& s, size_t pos=0,
size_t n=npos);
строковому объекту присваивается n символов, начиная от позиции pos
string& insert(size_t posl,
const string& str, size_t
pos2=0 , size_t n=npos);
вставляет n символов, полученных из str,
начиная с позиции pos2, в строку с позиции
posl
string& remove(size_t
pos=0 , size_t n=npos);
Удаляются n символов из строки начиная
с позиции pos
string& replace(posl, nl,
str, pos2=0, n2=npos);
в неявной строке начиная с позиции posl
заменяет nl символов n2 символами из подстроки str с позиции pos2
86
Продолжение прилож. 2
Функция
Описание
string& replace(pos, n, p,
n2);
заменяет n символов в позиции pos используя char* p из n2 символов или char* p до
завершающего нуля, или повторяя символ
с rep раз
char get_at (pos) const;
возвращает символ из позиции pos
void put_at (pos, c);
помещает символ с в позицию pos
size_t length() const;
возвращает длину строки
const char* c_str() const;
преобразует строку в традиционное char*
представление
const char* data() const;
возвращает базовый адрес строкового представления
void resize(n, c); void
resize(n);
изменяет строку, делая ее длину равной п;
в первой функции в качестве заполняющего
символа выступает с, а во второй - символ
eos () (end-of-string, конец строки)
void reserve(size_t res_
arg);size_t reserve() const;
выделяет память под строку; первая функция переустанавливает this; вторая возвращает закрытый член res - размер выделенного фрагмента
size_t copy(p, n, pos=0)
const;
n симолов строки, начиная с позиции pos,
копируются в char* p
string substr(pos=0, n=pos) возвращается подстрока из п символов
const;
строки
int compare(const string&
str, size_t pos=0, size_t
n=npos) const;
сравнивает п символов строки, начиная
с позиции pos, со строкой str. Возвращается ноль, если строки равны; в противном
случае возвращается положительное или
отрицательное целое значение, показывающее, что неявная строка лексикографически
больше или меньше чем строка str.
size_t find (const string&
str, size_t pos=0) const;
в строке начиная с позиции pos производится поиск строки str. Если она найдена,
возвращается позиция, в которой она начинается; в противном случае возвращается
позиция npos
87
Окончание прилож. 2
Функция
Описание
size_t rfind(str, pos=npos)
const;
похоже на find (), но при поиске первого
совпадения строка сканируется в обратном
направлении
size_t find_first_of(str,
pos=0) const;
производится поиск первого вхождения str
начиная с позиции pos
size_t find_last_of(str,
pos=npos) const;
аналогично, но в обратном направлении
size_t find_first_not_
of(str, pos=0) const;
производится поиск первого символа, который не соответствует ни одному из символов
str начиная с позиции pos
size_t find_last_not_of(str, аналогично, но в обратном направлении
pos=npos) const;
88
ПРИЛОЖЕНИЕ 3
Список математических функций стандартной библиотеки
#include <cmath> using namespace std;
Функция
Возвращаемое значения
double atof(const char* string)
вещественное число, заданное массивом символов string
int atoi(const char* string)
целое число, заданное массивом символов string
int abs(int n)
абсолютное значение (модуль) целочисленного аргумента n
double acos(double x)
арккосинус х в пределах –1.0 до 1.0
double asin(double x)
арксинус х в пределах –1.0 до 1.0
double atan(double x)
арктангенс х в пределах S
2
до
S
2
double atan2(double x, double y) арктангенс х/у в пределах S до S
double ceil(double x)
наименьшее целое большее или равное х
double cos(double x)
косинус х
double exp(double x)
Hw
double fabs(double x)
абсолютное значение (модуль) вещественного числа х
double floor(double x)
наибольшее целое большее или равное х
double fmod(double x, double y)
остаток от деления х на у
double hypot(double x, double y) длина гипотенузы при заданных катетах х и у
double log(double x)
натуральный логарифм х
double log10(double x)
десятичный логарифм х
double pow(double x, double y)
х в степени у
double sin(double x)
синус х
double sqrt(double x)
double tan(double x)
w
тангенс х
89
#include <cstdlib> using namespace std;
Функция
int rand()
Возвращаемое значения
псевдослучайное число в диапазоне от 0
до RAND_MAX
void srand(unsigned int seed) устанавливает стартовую точку для генерации случайных чисел
#include <ctime> using namespace std;
Функция
Возвращаемое значения
clock_t clock()
процессорное время
double difftime(time_t timerl, time_t timer2)
разность между двумя
временными значениями
time_t time(time_t* timer)
системное время
90
СОДЕРЖАНИЕ
Введение ................................................................................
3
1. Особенности данных для построения информационных систем
транспортных процессов и управления цепями поставок ..............
5
2. Современные языки программирования для разработки
программного обеспечения .......................................................
3. Основы языка С++ ...............................................................
3.1. Переменные и работа с ними .........................................
1.2. Арифметические операторы..........................................
3.3. Логические выражения и оператор if .............................
3.4. Применение селективных конструкций..........................
3.5. Циклы while и do while.................................................
3.6. Цикл for ....................................................................
3.7. Роль функций в С++ ....................................................
3.8. Содержание стандартной библиотеки С++ ......................
3.9. Размещение данных в памяти .......................................
3.10. Организация ввода и вывода информации .....................
3.11. Строковые переменные...............................................
3.12. Массивы...................................................................
3.13. Объектно-ориентированный подход к разработке
информационных систем .............................................
10
13
15
16
17
19
24
26
29
33
34
37
40
41
46
Практическая работа № 1. Разработка приложения
по распределению ресурсов в системе на основе метода
Северо-Западного угла .............................................................
54
Практическая работа № 2. Реализация простейшей программы
на C++, с использованием графического интерфейса и библиотеки
MFC (Windows Application на основе диалогового окна) ................
62
Практическая работа № 3. Создание графического интерфейса
на базе диалогового окна VC++, с использованием переключателей,
флажков. Реализация разветвляющихся алгоритмов. ..................
65
Практическая работа № 4. Разработка консольного приложения
по оценке степени загруженности выбранного участка .................
69
Практическая работа № 5. Разработка приложения на языке
высокого уровня С++ по генерации строк данных
ля технологии RFID. Стандартизация методов и форматов
кодировок меток радиочастотной идентификации .......................
75
Вопросы для закрепления материала .........................................
83
Список рекомендуемой литературы ...........................................
84
Приложение 1. Основные типы данных ......................................
85
Приложение 2. Список функций работы строковых данных ..........
86
Приложение 3. Список математических функций
стандартной библиотеки ..........................................................
89
91
Документ
Категория
Без категории
Просмотров
0
Размер файла
2 061 Кб
Теги
taratun
1/--страниц
Пожаловаться на содержимое документа