Вы находитесь на странице: 1из 338

МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ ОБРАЗОВАТЕЛЬНОЕ


УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«СЕВЕРО-КАВКАЗСКИЙ ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ»

УЧЕБНО-МЕТОДИЧЕСКОЕ ПОСОБИЕ
к выполнению курсовой работы
по дисциплине «Программирование на языке высокого уровня»

для студентов направления подготовки


11.03.02 Инфокоммуникационные технологии и системы связи,
профиля
«Сети связи и системы коммутации»

Ставрополь, 2017
УДК - Печатается по решению

ББК - Учебно-методического совета

Северо-Кавказского федерального

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

Рецензенты:
Сорокин Александр Анатольевич, кандидат технических наук, доцент,
доцент кафедры инфокоммуникаций;
Братченко Наталья Юрьевна, кандидат физико-математических наук,
доцент, доцент кафедры инфокоммуникаций.

Составитель: Олег Хазиакрамович Шаяхметов


Шаяхметов О.Х. Учебно-методическое пособие (к выполнению
курсовой работы по дисциплине «Программирование на языке высокого
уровня» для студентов, обучающихся по направлению подготовки 11.03.02
«Инфокоммуникационные технологии и системы связи»). – Ставрополь: Изд.
СКФУ, 2016. - 152 с.

Учебно-методическое пособие к выполнению курсовой работы по


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

©ФГАОУ ВО «Северо-Кавказский
Федеральный университет», 2017

2
СОДЕРЖАНИЕ

ВВЕДЕНИЕ…………………………………………………………………. 4

1. ФОРМУЛИРОВКА ЗАДАНИЯ……………………………………….. 6
1.1 Порядок выполнения задания 1 «Создание простейшей
программы на языке Visual C++» ………………………………………… 7
1.2 Порядок выполнения задания 2 «Условные операторы.
Вычисление значения функции, заданной условно»……………………. 17
1.3 Порядок выполнения задания 3 «Циклический алгоритм.
Табулирование функции и поиск экстремумов»………………………… 25
1.4 Порядок выполнения задания 4 «Построение графика
функции на промежутке с определенным шагом»………………………. 32
1.5 Порядок выполнения задания 5 «Понятие одномерного
массива. Селективная обработка элементов массива»………………….. 38
1.6 Порядок выполнения задания 6 «Многомерный массив.
Понятие матрицы. Селективная обработка элементов строк,
столбцов и диагоналей матрицы»…………………………………………. 44
1.7 Порядок выполнения задания 7 «Изучение
вероятностных алгоритмов»………………………………………………. 51
1.8 Порядок выполнения задания 8 «Работа с диалоговыми
окнами. Создание операционного меню»………………………………… 57
1.9 Порядок выполнения задания 9 «Обработка матрицы.
Формирование одномерных массивов из двумерных. Сортировка
одномерных массивов»…………………………………………………….. 69

2. ОПИСАНИЕ СТРУКТУРЫ РАБОТЫ……………………………….… 71

3. ПРАВИЛА ОФОРМЛЕНИЯ РАБОТЫ………………………..………. 71

4. ПОСЛЕДОВАТЕЛЬНОСТЬ ВЫПОЛНЕНИЯ ЗАДАНИЙ……..…... 72

5. ПОРЯДОК ЗАЩИТЫ …………………………………….…………… 73

6. КРИТЕРИИ ОЦЕНИВАНИЯ …………………………..……………… 75

ЗАКЛЮЧЕНИЕ…………………………………………………………….. 76

СПИСОК РЕКОМЕНДУЕМОЙ ЛИТЕРАТУРЫ………………………… 77


ПРИЛОЖЕНИЕ А «Образец титульного листа»………………………… 78
ПРИЛОЖЕНИЕ Б «Теоретические сведения»…………………………… 79

3
ВВЕДЕНИЕ

Данное пособие по курсовому проектированию освещает практические


приемы программирования на языке С (читается "Си") в среде
программирования Microsoft Visual Studio 2010, которая устанавливается в
режиме программирования С.
Цели:
1. Научиться использовать среду Visual Studio 2010 для создания
простейших Windows приложений по программированию на языке С++.
2. Создание простого законченного Windows приложения,
включающего ввод исходных данных, расчет и вывод результатов расчета на
форму.
3. Использовать накопленные знания для решения практической
задачи: применение метода Монте-Карло для определения площади плоской
фигуры.
Задачи:
1. Выполнить проектирование разветвляющегося вычислительного
процесса.
2. Создать циклический алгоритм.
3. Создать проект вывода данных в виде таблицы в Visual Studio 2010.
4. Создать Windows-приложение построения графика функции в среде
Visual Studio 2010 на определенном промежутке с указанным шагом,
используя условия проверки правильности ввода данных.
5. Научиться использовать циклический оператор с параметром для
ввода, вывода и обработки элементов массива.
6. Изучить методы селективной обработки элементов массива и
нахождение минимального и максимального элемента в массиве.
7. Научиться выводить элементы массива с помощью визуальных
компонентов Visual Studio 2010.
8. Научиться использовать вложенные циклические операторы для
ввода, вывода и обработки элементов матрицы, обработки элементов
столбцов, строк и диагоналей матрицы.
9. Научиться использовать визуальный компонент DataGridView для
работы с матрицами в Visual Studio 2010.
10. Научиться создавать операционное меню формы, используя
диалоговые окна: FontDialog, ColorDialog и SaveDialog для работы с данными
и передачи их в текстовые файлы.
11. Научиться применять вложенные циклические операторы для
ввода, вывода и обработки элементов матрицы, обработки элементов
столбцов, строк матрицы и сортировки массивов.
Реализуемые компетенции:
(ОПК-2) - способностью решать стандартные задачи профессиональной
деятельности на основе информационной и библиографической культуры с

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

5
1 ФОРМУЛИРОВКА ЗАДАНИЯ

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


«Программирование на языке высокого уровня» и включает в себя девять
заданий:
Задание 1. Создание простейшей программы на языке Visual C++.
Задание 2. Условные операторы. Вычисление значения функции,
заданной условно.
Задание 3. Циклический алгоритм. Табулирование функции и поиск
экстремумов.
Задание 4. Построение графика функции на промежутке с
определенным шагом.
Задание 5. Понятие одномерного массива. Селективная обработка
элементов массива.
Задание 6. Многомерный массив. Понятие матрицы. Селективная
обработка элементов строк, столбцов и диагоналей матрицы.
Задание 7. Изучение вероятностных алгоритмов.
Задание 8. Работа с диалоговыми окнами. Создание операционного
меню.
Задание 9. Обработка матрицы. Формирование одномерных массивов
из двумерных. Сортировка одномерных массивов.
Прежде чем приступить к выполнению заданий курсового
проектирования, студент должен определить для себя номер варианта,
используя таблицу 1. В первом столбце указана первая буква фамилии
студента, а в первой строке – последняя цифра номера зачетной книжки. На
пересечении столбца и строки находится номер варианта студента.

Таблица 1 – Варианты заданий


Последняя цифра в зачетной книжке
Первая
буква 0 1 2 3 4 5 6 7 8 9
фамилии
А 1 30 19 12 4 22 7 21 2 8
Б 21 2 29 20 13 5 23 8 22 3
В 16 22 3 28 21 14 6 24 9 23
Г 6 17 23 4 27 22 15 7 25 10
Д 25 7 18 24 5 26 23 16 8 26
Е 7 23 8 19 26 6 25 24 17 9
Ё 20 11 28 13 12 24 2 14 4 3
Ж 28 8 26 9 20 27 7 24 25 18
З 1 29 9 27 10 21 28 8 23 22
И 3 2 30 12 28 11 22 29 9 10
К 11 1 26 19 10 27 12 24 4 9

6
Последняя цифра в зачетной книжке
Первая
буква 0 1 2 3 4 5 6 7 8 9
фамилии
Л 30 12 2 27 20 11 28 13 25 5
М 23 1 13 3 28 21 12 29 14 26
Н 12 24 2 14 4 29 22 13 30 15
О 16 13 25 3 15 5 30 23 14 1
1 2 3 4 5 6 7 8 9 10 11
П 6 17 14 26 4 16 6 1 24 15
Р 9 8 18 15 27 5 17 7 2 25
С 10 17 19 29 16 28 6 18 8 3
Т 18 11 21 20 30 17 29 7 19 9
У 11 22 12 23 21 1 16 27 8 20
Ф 21 10 4 26 16 2 17 28 6 12
Х 13 22 11 5 27 17 3 18 29 7
Ц 9 14 23 12 6 28 18 4 19 30
Ч 30 10 15 24 13 7 29 19 5 20
Ш 18 1 11 16 25 14 8 30 20 6
Щ 2 19 2 12 17 26 15 9 1 21
Э 22 4 20 3 13 18 27 16 10 2
Ю 13 24 5 21 4 14 19 29 17 11
Я 14 16 24 6 22 5 15 20 29 18

1.1 Порядок выполнения задания 1 «Создание простейшей


программы на языке Visual C++»

1. Войти в среду Visual Studio 2010.


2. После запуска Microsoft Visual Studio 2010 появляется следующая
стартовая страница, которая показана на рис. 1.1.
Следующим шагом является создание нового проекта. Для этого в
меню Файл необходимо выбрать Создать → Проект (или комбинацию
клавиш Ctrl + Shift + N). Результат выбора пунктов меню для создания
нового проекта показан на рис. 1.2.
Среда Visual Studio отобразит окно Создать Проект, в котором
необходимо выбрать тип создаваемого проекта. Проект используется в
Visual Studio для логической группировки нескольких файлов,
содержащих исходный код, на одном из поддерживаемых языков
программирования, а также любых вспомогательных файлов. Обычно после
сборки проекта (которая включает компиляцию всех всходящих в проект
файлов исходного кода) создается один исполняемый модуль.
В окне Создать Проект следует развернуть узел Visual С++

7
обратиться к пункту CLR и на центральной панели выбрать Приложение
Windows Form.
Затем в поле редактора Имя (где по умолчанию имеется <Введите имя>)
следует ввести имя проекта, например, Primer. В поле Расположение можно
указать путь размещения проекта или выбрать путь размещения проекта с
помощью клавиши (кнопки) Обзор. По умолчанию проект сохраняется в
специальной папке Projects. Пример выбора имени проекта показано на
рис. 1.3.

Рисунок 1.1 – Стартовая страница Visual Studio 2010

Рисунок 1.2 – Окно с выбором нового проекта

8
Рисунок 1.3 – Пример задания имени проекта

После нажатия кнопки OK откроется окно (рис. 1.4).

Рисунок 1.4 – Окно, подготовленное к созданию приложения на языке С++

Для запуска программы на ее исполнение из окна редактора в Visual


Studio 2010 можно нажать клавишу F5. На рис. 1.5 показан результат
9
исполнения первой программы.

Рисунок 1.5 – Вывод формы программы на языке С

3. Легко убедиться, что появившееся на экране окно-форма обладает


всеми свойствами окна Windows. Его можно перемещать по экрану,
изменять размеры, сворачивать в значок и разворачивать на весь экран. Окно
имеет стандартные интерфейсные элементы: заголовок, оконное меню,
кнопки управления размером и кнопку закрытия. Однако на этом
возможности окна и исчерпываются. Это естественно, ведь в проекте еще
ничего, кроме формы, не создано.
4. Изменить значение свойства Text – занести текст, который будет
показываться в заголовке формы при выполнении приложения. Например:
«Выполнил Иванов И. И., группа ИТС-121».
5. Свойству FormBorderStyle формы (стиль рамки окна) присвоить
6. значение FixedToolWindow. Это значение определяет окно как
диалоговое, его размеры на этапе прогона приложения (в процессе работы
приложения) не могут быть изменены.
7. Вызвать панель элементов, нажав на кнопку или комбинацию
клавиш (Ctrl+Alt+X).
8. Поместить на форму элемент Button1 (командная кнопка) и
написать на ней «Вывод текста» (т. е. занести этот текст в свойство Text).
9. Аналогично создать кнопку Button2 и написать на ней «Запуск
формы» и кнопку Button3 и написать на ней «Выход». С помощью
свойства Font можна изменить размер шрифта и написание текста на
кнопке. С помощью свойства ForeColor можно изменить цвет шрифта.
10. Поместить на форму компонент listBox1 (многострочный
редактор).
11. Поместить на форму компонент GroupBox1 и в свойстве Text
написать «Стиль шрифта». Это компонент-контейнер. Аналогично, как для
кнопок, с помощью свойств Font и ForeColor можно изменить размер
10
шрифта, написание текста и цвет шрифта.
12. Разместить в контейнере GroupBox1 четыре компонента типа
TcheckBox: CheckBox1, … , CheckBox4, подписав их в свойстве
Text как: «Полужирный», «Курсивный», «Подчеркнутый» и
«Перечеркнутый».
13. Поместить на форму компонент TextBox1.
14. Слева от компонента TextBox1 поместить компонент Label1 с
подписью (свойство Text ) «Введите текст». Также с помощью свойств
Font и ForeColor можно изменить размер шрифта, написание текста и
цвет шрифта.
15. Поместить на форму компонент GroupBox2 и в свойстве Text
этого компонента написать «Цвет шрифта». Это компонент-контейнер.
16. Разместить в контейнере GroupBox2 пять компонентов
радиокнопок: RadioButton1, …, RadioButton5, подписав их как
«Красный», «Синий», «Зеленый», «Желтый» и «Черный». В соответствии с
этими подписями установить цвет в свойстве BackColor (цвет фона)
каждого из этих компонентов. Чтобы на этом фоне смотрелись надписи, для
компонентов зеленого и черного цвета изменить цвет символов свой-ство
ForeColor на белый.
17. Используя команду Проект  Добавить новый элемент, создать
новую форму Form2, определив ее имя (рис. 1.6).

Рисунок 1.6 – Добавление новой формы в проект

18. В свойство Text этого компонента занести текст «О программе».


Свойству FormBorderStyle формы (стиль рамки окна) присвоить
значение FixedToolWindow. Цветовое оформление выбрать по своему
усмотрению (свойство BackColor) (рис. 1.7; 1.8).
11
Рисунок 1.7 – Вид Form1 лабораторной работы

Рисунок 1.8 – Вид Form2 лабораторной работы

19. Поместить на новую форму компонент Button1 (кнопка). На


кнопке написать «Скрыть форму».
20. Поместить на форму Form2 компонент PictureBox1
(отображение картинок) и с помощью свойства Image загрузить в него
соответствующий тематике рисунок. C помощью свойства SizeMode
12
вписываем нашу картинку в блок картинки, выбрав пункт StretchImage.
21. В результате проведенных операций должно получиться две формы
примерно такого вида, как показано на рис. 1.7; 1.8 (показан вид, который
формы будут иметь на этапе выполнения).
22. Формы не должны обязательно иметь представленный выше вид, но
общая идея лабораторной работы, т. е. знакомство с основными
компонентами и их свойствами, должна быть соблюдена.
23. Запустить приложение на выполнение. Несмотря на наличие в форме
всевозможных элементов управления, они не выполняют никаких действий.
Например, можно выбрать любой стиль шрифта или цвет, но этот выбор
нигде не отразится. Это естественно, т. к. в проекте еще не разработан ни
один обработчик события, поэтому ни одно событие не обрабатывается, т. е.
приложение не реагирует еще ни на одно событие. Форма Form2 вообще
никогда не сможет появиться на экране, несмотря на то, что она
зарегистрирована в проекте. Наличие командной кнопки «Запуск формы»
еще не обеспечивает ее показ на экране. Необходим соответствующий
программный код, который бы в ответ на щелчок на этой кнопке показывал
форму.
24. Сделать первую форму активной. Щелчком на компоненте But-
ton2 (командная кнопка «Запуск формы») выбрать (активизировать)
его. В окне Свойства отображаются свойства и события выбранного
компонента, т. е. при активизации Button2 будут показаны свойства и
события именно этого объекта. Перейти на вкладку События . Найти
строку с именем события Click (Щелчок). Двойной щелчок в правой
колонке этой строки (события) переводит в окно ввода кода обработчика
этого события. Для объекта типа Button событие button2_Click
является событием по умолчанию, код которого раскрывается двойным
щелчком на объекте. Если обработчик события еще не разработан, Visual
Studio 2010 создает заготовку для его создания. Создать следующую
процедуру обработки этого события (эта процедура показывает форму
Form2, делая ее видимой). Для этого добавим строку
#include "Form2.h"
ссылку на Form2 сразу после первой строки в коде программы Form1.
private: System::Void button2_Click(System::Object^ sender,
System::EventArgs^ e) {
Form2^ f = gcnew Form2();
this->Hide();
f->ShowDialog();
this->Show();
}

25. Сделать активной вторую форму (Form2). В окне Свойства


перейти на вкладку События. Из списка компонентов, установленных на
форме, выбрать Button1. Найти событие Click. Двойным щелчком по
этому событию перейти в окно ввода кода. Создать процедуру обработки
13
этого события, закрывающую (делающую невидимой) форму Form2:
private: System::Void button1_Click(System::Object^
sender, System::EventArgs^ e) {this->Hide();};
26. Запустить приложение на выполнение. Теперь при щелчке на
командной кнопке Button2 («Запуск формы») на экране появится форма
Form2, т. к. событие Щелчок на этой кнопке будет обработано и этот
обработчик покажет форму (сделает ее видимой). Аналогично, щелчок на
соответствующей кнопке формы Form2 уберет с экрана эту форму (сделает
ее невидимой). Закрыть приложение.
27. Сделать окно первой формы активным. Щелчком на компоненте
Button1 (кнопка «Вывод текста») выбрать (активизировать) его.
Двойной щелчок левой кнопки мышки по этому элементу управления
переводит в окно ввода кода обработчика этого события.
private: System::Void button1_Click(System::Object^ sender,
System::EventArgs^ e)
{ между этими скобками вставит код }

и в заготовку подпрограммы между фигурными скобками вставить


следующий код:

if (textBox1->Text!=""){this ->listBox1->Items->Clear();
this->listBox1->Font = (gcnew System::Drawing::Font(L"Arial",
14, System::Drawing::FontStyle::Regular, System:
:Drawing::GraphicsUnit::Point, static_cast<System:
:Byte>(204))); this->listBox1->ForeColor = System:
:Drawing::Color: :Black; this ->listBox1->Items->Add(this -
>textBox1->Text);
//Устанавливает красный цвет для текста
if (radioButton1->Checked == true){ this->listBox1->ForeColor
= System::Drawing::Color::Red;}
//Устанавливает синий цвет для текста
if (radioButton2->Checked == true){ this->listBox1->ForeColor
= System::Drawing::Color::Blue;}
//Устанавливает зеленый цвет для текста
if (radioButton3->Checked == true){ this->listBox1->ForeColor
= System::Drawing::Color::Green;}
//Устанавливает желтый цвет для текста
if (radioButton4->Checked == true){ this->listBox1->ForeColor
= System::Drawing::Color::Yellow;}
//Устанавливает черный цвет для текста
if (radioButton5->Checked == true){ this->listBox1->ForeColor =
System::Drawing::Color::Black;}
//Устанавливает атрибут «жирность» для текста
if (checkBox1->Checked == true){this->listBox1->Font = (gcnew
System::Drawing::Font(L"Arial", 14, System::Drawing:
:FontStyle:: Bold, System::Drawing::GraphicsUnit::Point,
static_cast<System::Byte>(204)));}
//Устанавливает атрибут «курсив» для текста
if (checkBox2->Checked == true){this->listBox1->Font = (gcnew

14
System::Drawing::Font(L"Arial", 14, System::Drawing:
:FontStyle:: Italic, System::Drawing::GraphicsUnit::Point,
static_cast<System::Byte>(204)));}
//Устанавливает атрибут «подчеркнутый» для текста
if (checkBox3->Checked == true){this->listBox1->Font = (gcnew
System::Drawing::Font(L"Arial", 14, System::Drawing:
:FontStyle:: Underline, System::Drawing: :GraphicsUnit::Point,
static_cast<System::Byte>(204)));}
//Устанавливает атрибут «зачеркнутый» для текста
if (checkBox4->Checked == true){this->listBox1->Font = (gcnew
System::Drawing::Font(L"Arial", 14, System::Drawing:
:FontStyle:: Strikeout, System::Drawing::GraphicsUnit::Point,
static_cast<System::Byte>(204)));}
//Устанавливает атрибуты «жирность», «курсив» для текста
if ((checkBox1->Checked == true)&&(checkBox2->Checked ==
true)){this->listBox1->Font = (gcnew System::Drawing:
:Font(L"Arial", 14, static_cast<System:
:Drawing::FontStyle>((System::Drawing::FontStyle::Bold |
System::Drawing::FontStyle::Italic)), System::Drawing:
:GraphicsUnit::Point, static_cast<System::Byte>(204)));}
//Устанавливает атрибуты «жирность», «курсив» и «подчеркнутый» для текста if
((checkBox1->Checked == true)&&((checkBox2->Checked ==
true))&&(checkBox3->Checked == true))this->listBox1->Font =
(gcnew System::Drawing::Font(L"Arial", 14,
static_cast<System::Drawing:
:FontStyle>(((System::Drawing::FontStyle::Bold | System:
:Drawing::FontStyle::Italic)| System::Drawing::FontStyle:
:Underline)), System::Drawing::GraphicsUnit::Point,
static_cast<System: :Byte>(204)));
//Устанавливает атрибуты «жирность», «курсив», «подчеркнутый» и «зачеркнутый»
для текста
if ((checkBox1->Checked == true)&&(checkBox2->Checked ==
true)&&(checkBox3->Checked == true)&&(checkBox4->Checked ==
true))this->listBox1->Font = (gcnew System::Drawing:
:Font(L"Arial", 14, static_cast<System::Drawing:
:FontStyle>(System::Drawing::FontStyle::Bold | System:
:Drawing::FontStyle::Italic | System::Drawing:
:FontStyle::Underline | System::Drawing: :FontStyle::Strikeout),
System::Drawing::GraphicsUnit::Point,
static_cast<System::Byte>(204)));
//Устанавливает атрибуты «курсив», «подчеркнутый» и «зачеркнутый» для текста if
((checkBox2->Checked == true)&&(checkBox3->Checked ==
true)&&(checkBox4->Checked == true))this->listBox1->Font = (gcnew
System::Drawing::Font(L"Arial", 14, static_cast<System:
:Drawing::FontStyle>(System::Drawing::FontStyle::Italic |
System::Drawing::FontStyle::Underline | System:
:Drawing::FontStyle::Strikeout), System::Drawing:
:GraphicsUnit::Point, static_cast<System::Byte>(204)));
//Устанавливает атрибуты «курсив», «подчеркнутый» для текста
if ((checkBox2->Checked == true)&&(checkBox3->Checked ==
true))this->listBox1->Font = (gcnew System::Drawing:
:Font(L"Arial", 14, static_cast<System::Drawing:

15
:FontStyle>(System::Drawing::FontStyle::Italic | System:
:Drawing::FontStyle::Underline), System::Drawing:
:GraphicsUnit::Point, static_cast<System::Byte>(204)));
//Устанавливает атрибуты «курсив», «зачеркнутый» для текста
if ((checkBox2->Checked == true)&&(checkBox4->Checked ==
true))this->listBox1->Font = (gcnew System::Drawing:
:Font(L"Arial", 14, static_cast<System:
:Drawing::FontStyle>(System::Drawing::FontStyle::Italic |
System::Drawing::FontStyle::Strikeout), System::Drawing:
:GraphicsUnit::Point, static_cast<System::Byte>(204)));
//Устанавливает атрибуты «жирность», «подчеркнутый» для текста
if ((checkBox1->Checked == true)&&(checkBox3->Checked ==
true))this->listBox1->Font = (gcnew System::Drawing:
:Font(L"Arial", 14, static_cast<System::Drawing:
:FontStyle>(System::Drawing::FontStyle::Bold | System:
:Drawing::FontStyle::Underline), System::Drawing:
:GraphicsUnit::Point, static_cast<System::Byte>(204)));
//Устанавливает атрибуты «подчеркнутый», «зачеркнутый» для текста
if ((checkBox3->Checked == true)&&(checkBox4->Checked ==
true))this->listBox1->Font = (gcnew System::Drawing:
:Font(L"Arial", 14, static_cast<System::Drawing:
:FontStyle>(System::Drawing::FontStyle::Underline |
System::Drawing::FontStyle::Strikeout), System::Drawing:
:GraphicsUnit::Point, static_cast<System::Byte>(204)));
//Устанавливает атрибуты «жирность», «зачеркнутый» для текста
if ((checkBox1->Checked == true)&&(checkBox4->Checked ==
true))this->listBox1->Font = (gcnew System::Drawing:
:Font(L"Arial", 14, static_cast<System::Drawing:
:FontStyle>(System::Drawing::FontStyle::Bold |
System::Drawing::FontStyle::Strikeout), System::Drawing:
:GraphicsUnit::Point, static_cast<System::Byte>(204)));
//Устанавливает атрибуты «жирность», «подчеркнутый», «зачеркнутый» для текста
if ((checkBox1->Checked == true)&&(checkBox3->Checked ==
true))this->listBox1->Font = (gcnew System::Drawing:
:Font(L"Arial", 14, static_cast<System::Drawing:
:FontStyle>(System::Drawing::FontStyle::Bold | System:
:Drawing::FontStyle::Underline), System::Drawing:
:GraphicsUnit::Point, static_cast<System::Byte>(204)));
//Устанавливает атрибуты «жирность», «курсив», «зачеркнутый» для текста if
((checkBox1->Checked == true)&&((checkBox2->Checked ==
true))&&(checkBox4->Checked == true))this->listBox1->Font =
(gcnew System::Drawing::Font(L"Arial", 14, static_cast<System:
:Drawing::FontStyle>((System::Drawing::FontStyle::Bold
|System::Drawing::FontStyle::Italic|System::Drawing::FontStyle
::Strikeout)), System::Drawing::GraphicsUnit::Point,
static_cast<System::Byte>(204)));
}
else
{MessageBox::Show( "Заполните пожалуйста данные", "Ошибка вво-да
данных",
MessageBoxButtons::OK, MessageBoxIcon::Exclamation );}

16
28. Сделать окно первой формы активным. Щелчком на компоненте
Button3 (командная кнопка «Выход») выбрать (активизировать) его. В
окне Свойства перейти на вкладку События. Найти строку с именем
события Click (Щелчок). Двойной щелчок в правой колонке этой строки
(события) переводит в окно ввода кода обработчика этого события. Создать
следующую процедуру обработки события:
private: System::Void button3_Click(System::Object^ sender,
System::EventArgs^ e)
{ Application::Exit();}

29. Нажав клавишу F5, запустить приложение на выполнение. В


случае необходимости выполнить отладку. Объяснить логику
функционирования приложения.

1.2 Порядок выполнения задания 2 «Условные операторы.


Вычисление значения функции, заданной условно»

Создать приложение для вычисления значения функции:

1. Войти в среду Visual Studio 2010.


2. В окне Создать Проект следует развернуть узел Visual С++,
обратиться к пункту CLR и на центральной панели выбрать Приложение
Windows Form.
3. Затем в поле редактора Имя (где по умолчанию имеется <Введите
имя>) следует ввести имя проекта, Visual_Lab2. В поле Расположение
можно указать путь размещения проекта или выбрать путь размещения
проекта с помощью клавиши (кнопки) Обзор (например N:\\CI\2_trim\Lab2).
4. Для формы изменить значение свойства Text, занеся, напрммер,
следующие данные: «Выполнил студент группы ИТС-121 Иванов П. А.
Задание 2».
5. Свойству FormBorderStyle формы (стиль рамки окна)
присвоить значение FixedToolWindow. Это значение определяет окно как
диалоговое, его размеры на этапе прогона приложения (в процессе работы
приложения) не могут быть изменены.
17
6. Поместить на форму компонент Button1 (командная кнопка) и
написать на ней «Расчет» (т. е. занести этот текст в свойство Text).
7. Аналогично создать кнопку Button2 и написать на ней «Выход».
С помощью свойства Font можно изменить размер шрифта и написание
текста на кнопке. С помощью свойства ForeColor можна изменить цвет
шрифта см. рис. 2.1.

Рисунок 2.1 – Окно формы на этапе создания программы

8. Разместить в самом верху формы компонент Label. В свойство


Text занести текст «Вычисление значения функции» (также можно
поменять параметры шрифта).
Для выполнения расчетов необходимо задать исходные данные:
значение параметра а и значение переменной х. Эти данные будут вводиться
с клавиатуры с помощью компонента TextBox. Свойство этого компонента,
в которое помещается результат ввода, имеет текстовый тип, т. е. допускает
ввод любых символов. Таким образом, в процессе ввода пользователь может
ввести (случайно или преднамеренно) недопустимые (нечисловые) символы.
Такую ситуацию допустить нельзя, т. к. при вводе недопустимых символов
произойдет сбой (аварийное завершение) программы во время
преобразования неверных данных к вещественному типу. Поэтому
пользователю нужно внимательно вводить данные в эти поля. Для этого
выше кнопок разместить три элемента TextBox (можно один элемент
TextBox вставить, остальные два скопировать с первого). Первые два
предназначены для ввода, соответственно, значения параметра а и значения
переменной х. В свойства Text этих компонентов ввести какие-либо
значения – значения по умолчанию. Эти значения будут показываться при
запуске приложения на выполнение. При выполнении приложения их можно
будет заменить другими. Компонент TextBox3 будет использован для
вывода результата вычисления функции, поэтому необходимо запретить ввод
в него данных пользователем. Для этого свойству ReadOnly (только чтение)
присвоить значение true, запрещающее пользователю заносить в компонент
какие-либо данные.
18
9. Напротив первого элемента TextBox1 разместить элемент Label2
и в свойстве Text этого элемента занести текст «Введите значение А»,
напротив TextBox2 разместить элемент Label3 и в свойстве Text занести
текст «Введите значение Х» и напротив последнего TextBox3 разместить
элемент Label4 и в свойстве Text занести текст «Значение функции У=».
Получим следующую форму на рис. 2.2.

Рисунок 2.2 – Примерный вид проектируемой формы

10. Запустить текстовый процессор Microsoft Word и в нем набрать


математическую формулу в соответствии с заданием с помощью редактора
формул. Выделить набранную формулу и скопировать ее в буфер обмена.
11. Запустить графический редактор Paint (Пуск  Программы 
Стандартные  Paint) и вставить из буфера обмена набранную формулу
(рис. 2.3).

Рисунок 2.3 – Окно графического редактора Paint

12. Сохранить графический файл (на английском языке) в ту же папку,


что и проект программы (Lab2).
13. Поместить на форму компонент PictureBox1 и с помощью
свойства Image загрузить в него созданный нами рисунок, отображающий
функцию. Загрузка рисунка производится с помощью стандартного окна

19
диалога. C помощью свойства SizeMode вписываем нашу картинку в блок
PictureBox1, выбрав пункт StretchImage.
14. В результате проведенных операций должна получиться форма
примерно такого вида, как показано на рис. 2.4.

Рисунок 2.4 – Примерный вид формы приложения

15. Создадим событие Click для кнопки Button1 с надписью


«Расчет». Для этого сделаем двойной щелчок левой кнопкой мыши по
компоненту Button1. Получим заготовку подпрограммы:
private: System::Void button1_Click(System::Object^ sender,
System::EventArgs^ e) { }
16. Между двумя фигурными скобками вставим следующий фрагмент
программного кода:
double y, x, a;
//Проверка, что данные для х и а введены
if ((textBox1->Text!="")&&(textBox2->Text!=""))
{
//Преобразование из текста в дробное число х и а a =
Convert::ToDouble(textBox1->Text);
x = Convert::ToDouble(textBox2->Text);
if (x<=0)y=sin(x*x+a*x);
else
if (x>0&&x<=a){y=1-(1+sqrt(x*x+a*x))/(exp(sin(x))*(1+x));}
else
{y=(cos(x*x-a*a)/(sqrt(1-sin(a-x)))-(1-sin(a-x))/(exp(sin(x)));};
//Вывод в компоненте ТextBox3 преобразованного в текст значения у
textBox3->Text = Convert::ToString (y);}
else
//Вывод окна с сообщением, если не введены данные в компоненты
ТextBox1 и ТextBox2
{MessageBox::Show( "Введите пожалуйста данные А и Х", "Ошибка
ввода данных", MessageBoxButtons::OK, MessageBoxI-
con::Exclamation); }
17. Создадим событие Click для кнопки Button2 с надписью «Выход».
20
Для этого сделаем двойной щелчок левой кнопкой мыши по компоненту
Button2. Получим заготовку подпрограммы:
private: System::Void button2_Click(System::Object^ sender,
System::EventArgs^ e) { }
18. Между двумя фигурными скобками вставим следующий фрагмент
программного кода:
Application ::Exit();
19. Вверху программы после слов #pragma once добавим строку,
подключив библиотеку работы с математическими функциями
#include <math.h>,
а также добавим строку, подключив библиотеку работы со строковыми
функциями:
#include <string.h>
20. При создании прикладных программ разработчики делают мак-
симально доступным пониманию интерфейс, а саму программу макси-мально
«дружественной» к действиям пользователя. В нашем создаваемом
приложении пользователь при вводе исходных данных (числовых значений а
и х) может допустить ошибку и ввести текст вместо числа. Необходимо
создать процедуру обработки события Потери фокуса компонентами
TextBox1 и TextBox2 (данное событие происходит в момент, когда курсор
переходит от текущего однострочного текстового поля к другому объекту).
Выделим на создаваемой форме объект TextBox1 и перейдем в окно
Свойства на вкладку События . Найдем интересующее нас событие
Leave и двойным щелчком левой кнопки мыши справа от названия события
(в пустом белом поле) создадим заготовку подпрограммы:
private: System::Void textBox1_Leave(System::Object^ sender,
System::EventArgs^ e)
{
}
21. Между двумя фигурными скобками вставим следующий фрагмент
программного кода:
int l, t, k; bool a=true; String ^str; str=textBox1->Text;
l=str->Length;
//индекс символа, с которым работаем t=0;
//колличество запятых в строке (дабы избежать варианта
0,2384,1254,1251 – это не число) k=0;
//двигаем индексатор, если наше число отрицательное if(str[t]=='-') t++;
//число не может начинаться с запятой if(str[t]==',') a=false; while(t<l)
{ if(str[t]==',')
//если запятая стоит последним символом или запятая уже была найдена
{ if(t==l-1 || k>0) a=false; k++;
}
//если t-ый символ не лежит в диапазоне от '0' до '9' else if(str[t]<'0' ||
str[t]>'9') a=false;
t++;
}
if (a==false)
{ MessageBox::Show("параметр А не является числом","Ошибка
21
ввода данных",MessageBoxButtons: :OK, MessageBoxIcon:
:Exclamation);
//возврат фокуса текстовому полю this->textBox1->Focus();
}
22. Аналогичным образом создаем процедуру, проверяющую на выходе
соответствие числовой записи данных в поле TextBox2. Вновь создаем
подпрограмму, обрабатывающую событие Leave, с указанным ниже
программным кодом:
int l, t, k; bool a=true; String ^str; str=textBox2->Text;
l=str->Length;
//индекс символа, с которым работаемt=0;
//колличество запятых в строке (дабы избежать варианта
0,2384,1254,1251 – это не число) k=0;
//двигаем индексатор, если наше число отрицательное if(str[t]=='-') t++;
//число не может начинаться с запятой if(str[t]==',') a=false; while(t<l)
{ if(str[t]==',')
//если запятая стоит последним символом или запятая уже была найдена
{ if(t==l-1 || k>0) a=false; k++;
}
//если t-ый символ не лежит в диапазоне от '0' до '9'
else if(str[t]<'0' || str[t]>'9') a=false; t++;
}
if (a==false)
{ MessageBox::Show("параметр Х не является числом","Ошибка
ввода данных", MessageBoxButtons::OK, MessageBoxIcon:
:Exclamation);
//возврат фокуса текстовому полю this->textBox2->Focus();
}
23. Еще одна «некорректность» программы возникает в момент, когда
пользователь, получив ответ для одного значения Х, изменяет значение
аргумента, чтобы получить другой ответ. До того как пользователь нажмет на
кнопку «Расчет», на форме отображаются новое значение аргумента и
старое значение функции (что является «ошибкой»). Необходимо в момент
установки курсора в текстовые поля TextBox1 или TextBox2 очищать от
старой записи текстовое поле TextBox3. Это выполняется путем создания
подпрограммы обработки события Получение фокуса (Enter). Выделим на
создаваемой форме объект TextBox1 и перейдем в окно Свойства на
вкладку События. Найдем интересующее нас событие Enter и двойным
щелчком левой кнопки мыши справа от названия события (в пустом белом
поле) создадим заготовку подпрограммы:
private: System::Void textBox1_Enter(System::Object^ sender,
System::EventArgs^ e)
{
}
24. Между двумя фигурными скобками вставим следующий фрагмент
программного кода:
textBox3->Text = "";
25. Аналогичным образом создаем подпрограмму Получение фокуса
22
(Enter) для однострочного тестового поля TextBox2, поместив в нее такую
же команду (очистка TextBox3 от текста).
26. Таким образом получим полноценную программу для вычисления
значения функции, используя условный оператор if.
27. Запустим программу на выполнение, нажав на функциональную
кнопку F5, и получим следующий вид окна (рис. 2.5).

Рисунок 2.5 – Рабочий вид формы приложения

Варианты для задания

Создать приложение для вычисления и вывода на экран значения


функции:

Выражения для функции f1(x), f2(x) и f3(x) выбрать из таблицы 2.4 в


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

23
Таблица 2.4 – Индивидуальные задания

24
1.3 Порядок выполнения задания 3 «Циклический алгоритм.
Табулирование функции и поиск экстремумов»

Создать Windows-приложение для вычисления значения функции и


нахождение экстремумов функции

с использованием оператора While на отезке [xn;xk] с шагом xh.


1. Войти в среду Visual Studio 2010.
2. В окне Создать Проект следует развернуть узел Visual С++,
обратиться к пункту CLR и на центральной панели выбрать Приложение
Windows Form.
3. Затем в поле редактора Имя (где по умолчанию имеется <Введите
имя>) следует ввести имя проекта, Visual_Lab3. В поле Расположение
можно указать путь размещения проекта, или выбрать путь размещения
проекта с помощью клавиши (кнопки) Обзор (например, N:\\CI\2_trim\Lab3).
4. Для формы изменить значение свойства Text, занеся, например,
следующие данные: «Выполнил студент группы ИТС-121 Иванов П.
А.Задание 3».
5. Свойству FormBorderStyle формы (стиль рамки окна)
присвоить значение FixedToolWindow. Это значение определяет окно как
25
диалоговое, его размеры на этапе прогона приложения (в процессе работы
приложения) не могут быть изменены.
6. Поместить на форму два компонента Button1 и Button2
(кнопка), выше этих компонентов левее центра разместить четыре поля для
ввода данных: TextBox1, TextBox2, … , TextBox4.
7. Напротив компонентов TextBox разместить четыре элемента:
Label1, Label2, …, Label4.
8. В верхнем левом углу формы расположить компонент
РictureBox1 (блок для картинки).
9. Напротив компонента РictureBox1 разместить компонент
DataGridView1 (таблица для просмотра данных).
10. Над компонентом РictureBox1 разместить элемент Label5.
11. Под компонентом РictureBox1 разместить два компонент Label6
и Label67, а под ними два компонента для вывода экстремумов функции
TextBox5, TextBox6. Получим следующую форму с размещенными на
ней компонентами (рис. 3.1).

Рисунок 3.1 – Окно формы на этапе создания программы

12. Выделить командную кнопку Button1 и написать на ней


«Показать таблицу и экстремумы функции» (т. е. занести этот текст в
свойство Text), аналогично для кнопки Button2 сделать надпись «Выход».
13. Выделить компонент Label1 и в свойство Text занести текст
«Введите значение XN=» (начальное значение интервала), аналогично для
Label2 в свойство Text занести текст «Введите значение XК=»
(конечное значение интервала), для Label3 занести текст «Введите
значение XН=» (шаг изменения значения Х), для Label4 в свойство Text
26
занести текст «Введите значение а=» (положительное число меньшее XК).
14. Выделить компонент Label5 и в свойство Text занести текст
«Таблица значений функции».
15. Выделить компонент Label6 и в свойство Text занести текст
«Максим. знач. функции», аналогично для Label7 в свойство Text занести
текст «Миним. знач. функции».
16. Для выполнения расчетов необходимо задать исходные данные:
значение параметра а и значения переменных XN, XK, XH. Эти данные
будут вводиться с клавиатуры с помощью компонента однострочный
редактор класса TextBox. В свойства Text этих компонентов ввести какие-
либо значения – значения по умолчанию. Эти значения будут показываться
при запуске приложения на выполнение. При выполнении приложения их
можно будет заменить другими.
17. Компоненты TextBox5 и TextBox6 будут использованы для вывода
результатов нахождения экстремумов функции (максимального и
минимального значения функции). Поэтому необходимо запретить ввод в
него данных пользователем. Для этого свойству ReadOnly (только чтение)
присвоить значение true, запрещающее пользователю заносить в компонент
какие-либо данные. Получим следующую форму на рис. 3.2.

Рисунок 3.2 – Примерный вид проектируемой формы

18. Запустить текстовый процессор Microsoft Word и в нем набрать

27
математическую формулу в соответствии с заданием с помощью редактора
формул.
19. Выделить набранную формулу и скопировать ее в буфер обмена.
20. Запустить графический редактор Paint (Пуск  Программы 
Стандартные  Paint) и вставить из буфера обмена набранную формулу.
Сохранить графический файл (на английском языке) в туже папку, чтопроект
программы (Visual_Lab3).
21. Выделить на форме компонент PictureBox1 и с помощью
свойства Image загрузить в него созданный нами рисунок, отображающий
функцию. Загрузка рисунка производится с помощью стандартного окна
диалога. C помощью свойства SizeMode вписываем нашу картинку в блок
PictureBox1, выбрав пункт StretchImage.Выделить компонент
DataGridView1 и для свойств RowHeaders Visible (отображение заголовка
строк) выбрать параметр False.
22. В результате проведенных операций должна получиться форма
примерно такого вида, как показано на рис. 3.3.

Рисунок 3.3 – Примерный вид формы приложения

23. Перейти к коду программы и в самом верху второй строкой кода


программы подключить библиотеку использования математических функ-
ций, для этого вставить
#include <math.h>
24. Создать событие Click для кнопки Button1 с надписью
«Показать таблицу и экстремумы функции». Для этого сделать двойной
28
щелчок левой кнопкой мыши по компоненту Button1. Внести изменения в
код подпрограммы и получить следующий вид программы:
private: System::Void button1_Click(System::Object^ sender,
System::EventArgs^ e)
{
double xn,xk,xh,x,y,a,ymax,ymin,yt;
int n,i;
//Проверка ввода данных в компоненты textBox

if ((textBox1->Text!="")&&(textBox2->Text!="")&&
(textBox3->Text!="")&&(textBox4->Text!=""))
{
//Преобразование введенных данных в тип double
xn = Convert::ToDouble(textBox1->Text);
xk = Convert::ToDouble(textBox2->Text);
xh = Convert::ToDouble(textBox3->Text);a
= Convert::ToDouble(textBox4->Text);
//Очистка столбцов таблицы
dataGridView1->Columns->Clear();
//Создание двух столбцов в таблице
dataGridView1->ColumnCount = 2;
//Создание в таблице строк
dataGridView1->Rows->Add(ceil((xk-n)/xh)+1);
//Занесение в верхнюю строку таблицы в первую ячейку текст «Х»,
во вторую текст «У»
dataGridView1->Columns[0]->Name=" X";
dataGridView1->Columns[1]->Name=" Y";
i=0;
x=xn;
ymax=- 1.8e307;ymin=1.8e307;
while (x<=xk)
{
if (x<=0){ y=2*x+2;}
else
if (x<=a) {y=sqrt(x+3);}
else
{y=pow(cos(x+2),2);}
//Занесение в первый столбец значений аргумента Х
dataGridView1->Rows[i]->Cells[0]->Value =Convert::ToString(x);
//Переменной yt присваивает округленное до двух знаков после запятой
значение у
yt=ceil(y*100)/100;
//Вывод во втором столбце таблицы значение функции У
dataGridView1->Rows[i]->Cells[1]->Value
=Convert::ToString(yt);
//находит максимальное и минимальное значение и округляет до двух знаков
после запятой
if (y>ymax) ymax=ceil(y*100)/100; if
(y<ymin) ymin=ceil(y*100)/100;
x=x+xh;
i++;}
//выводит в компоненты textbox максимальное и минимальное значение
29
функции
textBox5->Text = Convert::ToString (ymax);
textBox6->Text = Convert::ToString (ymin);
}
else {MessageBox::Show( "Заполните, пожалуйста, данные",
"Ошибка ввода данных",
MessageBoxButtons::OK, MessageBoxIcon::Exclamation
);}
}

25. Создать событие Click для кнопки Button2 с надписью


«Выход». Для этого сделать двойной щелчок левой кнопкой мыши по
компоненту Button2 и вставить код для выхода из программы (уже
использовался в лаб. раб. 2).
26. На примере лабораторной работы 2 сделать проверку на
корректность ввода данных XN, XK, XH, а, используя событие Leave, в
окне свойств (в код программы добавить 4 процедуры, проверяющие
правильность ввода).
27. Запустим программу на выполнение, нажав на функциональную
кнопку F5, и получим следующий вид окна (рис. 3.4).

Рисунок 3.4 – Рабочий вид формы приложения

Варианты для задания

Создать Windows-приложение для вычисления значения функции и


нахождение экстремумов функции

30
с использованием оператора While на отезке [xn;xk] с шагом xh.
Данные взять из таблицы 3.1.

Таблица 3.1 - Индивидуальные задания

31
32
1.4 Порядок выполнения задания 4 «Построение графика
функции на промежутке с определенным шагом»

Создать Windows-приложение, которое предлагает пользователю


ввести данные начала промежутка (xn), конца промежутка (xk) и шага
изменения переменной (xh) для построения на одной координатной
плоскости трех графиков fx(x)9 /2(х), /З(х):

(сделать проверку правильности ввода данных).

Ход выполнения
33
1. Войти в среду Visual Studio 2010.
2. В окне Создать Проект следует развернуть узел Visual С++,
обратиться к пункту CLR и на центральной панели выбрать Приложение
Windows Form.
3. Затем в поле редактора Имя (где по умолчанию имеется
<Введите имя>) следует ввести имя проекта, Visual_Lab4. В поле
Расположение можно указать путь размещения проекта или выбрать путь
размещения проекта с помощью клавиши (кнопки) Обзор (например,
N:\\CI\2_trim\Lab4).
4. Для формы изменим значение свойства Text, занеся, например,
следующие данные: «Выполнил студент группы ЭСА-12-1 Иванов П. А.
Задание 4».
5. Свойству FormBorderStyle формы (стиль рамки окна)
присвоить значение FixedToolWindow. Это значение определяет окно как
диалоговое, его размеры на этапе прогона приложения (в процессе работы
приложения) не могут быть изменены.
6. В верхней части окна разместить Label1 и в свойстве Text
занести текст «Построение графика функции на интервале [xn;xk]».
7. Ниже под Label1 разместить компонент Сhart1. Выделить его
зайти в окно свойств; выбать свойство Series и нажать на троеточие.
Появится диалоговое окно (рис. 4.1).
8. Нажать на кнопку Добавить и у нас появится Series1 в левой части
окна (каждая серия способна строить на компоненте Сhart1 новый график,
поэтому, если нужно построить несколько графиков на одной координатной
плоскости, то нужно сделать соответствующее количество Series).

Рисунок 4.1 – Диалоговое окно свойства Series компонента Chart

9. В правой части этого же окна выбрать подпункт «Данные» свойства


Series1, а в нем пункт XValueType и с помощью выпадающего списка выбать
параметр «Double». Аналогично для пункта YValueType выбрать параметр
«Double».
10. Ниже в правой части этого же окна выбрать подпункт «Диаграмма»
свойства Series1, а в нем – пункт ChartType и с помощью выпадающего списка
34
выбрать параметр «Spline» (это позволяет соединять точки кривой линией).
11. И последняя настройка компонента Сhart1: в правой части этого же
диалогового окна выбать подпункт «Условные обозначения» свойства Series1, а
в нем – пункт IsVisibleInLegend и с помощью выпадающего списка
выбать параметр «False» (это позволяет не отображать легенду в диаграмме).
12. Ниже компонента Сhart1 разместить четыре компонента
Label: Label2, Label3, Label4, Label5.
13. Выделить Label2 и в свойстве Text занести текст «Введите
интервал построения графика». Аналогично выделить Label3 и в свойстве
Text занести текст «Введите начальное значение ХN=», для Label4 – в
свойстве Text занести текст «Введите конечное значение ХK=» и для La-
bel5 в свойстве Text занести текст «Введите значение шага XH=».
14. Напротив компонента Label3 разместить компонент TextBox1,
напротив компонента Label4 – компонент TextBox2, напротив
компонента Label5 – компонент TextBox3.
15. В правом нижнем углу разместить две кнопки Button1 и Button2.
16. Выделить компонент Button1 и в свойство Text занести текст
«Нарисовать график». При нажатии на эту кнопку будет в компоненте Сhart1
рисоваться график функции y  cos(x).
17. Выделить компонент Button2 и в свойство Text занести текст
«Выход».
18. В результате проведенных операций должна получиться форма
примерно такого вида, как показано на рис. 4.2.

Рисунок 4.2 – Окно формы на этапе создания программы

19. Перейти к коду программы и после строки


#pragma once
подключить библиотеки использования математических функций, для этого
вставить следующую строку:
#include<cmath>
20. В разделе using добавить строку:
using namespace System::Windows::Forms::DataVisualization::Charting;
21. Создадим событие Click для кнопки Button1 с надписью
«Нарисовать график». Для этого сделть двойной щелчок левой кнопкой
мыши по компоненту Button1. Внесем изменения в код подпрограммы:
35
double x,xn,xk,xh,y;
Series^ plot1 = chart1->Series[0];
//Очистка компонента Chart1
plot1->Points->Clear();
//Проверка, что введены данные xn, xk, xh и их преобразование в переменные типа
Double
if((textBox1->Text!="")&&(textBox2->Text!="")
&&(textBox3->Text!=""))
{
xn = Convert::ToDouble(textBox1->Text);
xk = Convert::ToDouble(textBox2->Text);
xh = Convert::ToDouble(textBox3->Text);
//Проверка правильности ввода данных
if ((xn>=xk)||(xh>(xk-xn)))
{
MessageBox::Show( "Данные заполнены неверно", "Ошибка
ввода данных",MessageBoxButtons::OK,
MessageBoxIcon::Exclamation );
}
else
{x=xn;
while (x<=xk)
{if (x<=0) y=2*x+2;
else
if (x>0&&x<5) y=sqrt(x+3);
else y=pow(cos(x+2),2);
//Нанесение точки с координатами Х и У в компоненте Chart1
plot1->Points->AddXY(x, y);
x=x+xh;
}}
}
else
{
MessageBox::Show( "Заполните, пожалуйста, данные", "Ошибка
ввода данных", MessageBoxButtons::OK, MessageBoxIcon:
:Exclamation);
}
22. Создадим событие Click для кнопки Button2 с надписью «Выход».
Для этого сделать двойной щелчок левой кнопкой мыши по компоненту Button2
и в полученную заготовку подпрограммы вставить код выхода из программы (уже
использовался в предыдущих лабораторных работах).
23. На примере лабораторной работы 2 сделать проверку на корректность
ввода данных XN, XK, XH, используя событие Leave в окне свойств (в код
программы добавить 3 процедуры, проверяющие правильность ввода).
24. Запустить программу на выполнение, нажав на функциональную
кнопку F5. Получим следующий вид окна (рис. 4.3).

36
Рисунок 4.3– Рабочий вид формы приложения
Варианты для задания

Создать Windows-приложение для построения графиков функций,


которое предлагает пользователю ввести данные начала промежутка (xn),
конца промежутка (xk) и шага изменения переменной (xh) (сделать проверку
правильности ввода данных). На одной координатной плоскости должны
быть построены три графика /j (x), /2(х), /3 (x) разного цвета.

Выражения для функций fj(x),f2(x) и j](xj, данные промежутка и шага


выбрать из таблицы 4.1 в соответствии с номером своего варианта.

Таблица 4.1 - Индивидуальные задания

37
38
39
1.5 Порядок выполнения задания 5 «Понятие одномерного
массива. Селективная обработка элементов массива»

Создать Windows-приложение, которое предлагает пользователю


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

Ход выполнения

1. Войти в среду Visual Studio 2010.


2. В окне Создать Проект следует развернуть узел Visual С++,
обратиться к пункту CLR и на центральной панели выбрать Приложение
Windows Form.
3. Затем в поле редактора Имя (где по умолчанию имеется <Введите
имя>) следует ввести имя проекта, Visual_Lab5. В поле Расположение
можно указать путь размещения проекта или выбрать путь размещения
проекта с помощью клавиши (кнопки) Обзор (например, N:\\CI\2_trim\Lab5).
4. Для формы изменить значение свойства Text, занеся следующие
данные: «Выполнил студент группы ИТС-121 Иванов П. А. Задание 5».
40
5. Свойству FormBorderStyle формы (стиль рамки окна)
присвоить значение FixedToolWindow. Это значение определяет окно как
диалоговое, его размеры на этапе прогона приложения (в процессе работы
приложения) не могут быть изменены.
6. В верхней части окна разместить контейнер GroupBox1 и в
свойстве Text занести текст «Ввод элементов массива».
7. На этом же контейнере GroupBox1 разместить пять компонентов:
Label1, Label2, TextBox1, TextBox2 и Button1. Для первого
компонента Label1 в свойство Text занести текст «Введите число
элементов массива». Для второго компонента Label2 в свойство Text
занести текст «Исходный массив». Для компонента TextBox2 в свойстве
ReadOnly (только чтение) присвоить значение true, запрещающее
пользователю заносить в компонент какие-либо данные. Для компонента
TextBox1 данные будут вводиться с клавиатуры с помощью компонента
TextBox. В свойства Text этого компонента ввести какое-либо значение –
значение по умолчанию. Это значение будет показываться при запуске
приложения на выполнение. При выполнении приложения его можно будет
заменить другим.
8. Выделить компонент Button1 и в свойство Text занести текст
«Создать массив». При нажатии на эту кнопку будет автоматически
создаваться массив с помощью генератора случайных чисел, элементы
которого будут в указанном диапазоне [–10; 10] выведены в компоненте
Text-Box2. Получим следующую форму (рис. 5.1).

Рисунок 5.1 – Окно формы на этапе создания программы

9. В нижней части окна разместить контейнер GroupBox2 и в


свойстве Text занести текст «Найти».
10. На этом же контейнере GroupBox2 разместить шесть
компонентов: TextBox3, TextBox4, checkBox1, checkBox2, Button2
и Button3.
11. Выделить компонент checkBox1 и в свойство Text занести текст
«сумму четных элементов массива». Аналогично для компонента
checkBox2 в свойство Text занести текст «количество
41
положительных элементов массива».
12. Выделить компонент Button2 и в свойство Text занести текст
«Вычислить». Аналогично для компонента Button3 в свойство Text
занести текст «Выход».
13. Компоненты TextBox3 и TextBox4 будут использованы для
вывода результатов нахождения задач, поэтому необходимо запретить ввод в
них данных пользователем. Для этого свойству ReadOnly (только чтение)
присвоить значение true, запрещающее пользователю заносить в компонент
какие-либо данные.
14. В результате проведенных операций должна получиться форма
примерно такого вида, как показано на рис. 5.2.

Рисунок 5.2 – Окно формы программы

15. Перейти к коду программы и после строки


#pragma once
подключить библиотеки использования математических функций, описание
переменных и размера массива, для этого вставить следующие строки:
#include<cmath>
#include <stdlib.h>
#define m 15
int i,n;
int A[m];
16. Создать событие Click для кнопки Button1 с надписью «Создать».
Для этого сделать двойной щелчок левой кнопкой мыши по компоненту
Button1. Внести изменения в код подпрограммы:
//Проверка, что не пустой компонент textBox1 if(textBox1-
>Text!="") {n=Convert::ToInt32(textBox1-
>Text); }else
{MessageBox::Show( "Заполните, пожалуйста, данные", "Ошибка
ввода данных", MessageBoxButtons::OK, MessageBoxI-
con::Exclamation );}
//очистка компонента textBox2
{textBox2->Text = "";
42
//Процесс создания массива и заполнение компонента textBox2 случайными
числами из диапазона [-10;10]
for (i = 0; i < n; ++i)
{
A[i] = rand ( ) % 21-10; this->textBox2-
>AppendText(A[i]+" ");
}
}
17. Создать событие Click для кнопки Button2 с надписью
«Вычислить». Для этого сделать двойной щелчок левой кнопкой мыши по
компоненту Button2 и в полученную заготовку подпрограммы вставить код
для расчетов:
//Обнуляем переменные kol и sum
int kol=0; int sum=0;
for (i = 0; i < n; ++i)
{
//Проверяем условие и находим сумму if
(A[i]%2==0){sum=sum+A[i];}
//Проверяем условие и находим количество
if (A[i]>0){kol=kol+1;}
}
//Если компоненты checkBox включены, то выводим результаты заданий в компо-
ненты textBox
if (checkBox1->Checked==true){this->textBox3->Text=Convert::ToString
(sum);}
if (checkBox2->Checked==true){this->textBox4->Text=Convert::ToString
(kol);}
18. На примере лабораторной работы 2 сделать проверку на
корректность ввода данных (количество элементов массива), используя
событие Leave в окне свойств (в код программы добавить 1 процедуру,
проверяющую правильность ввода).
19. Создать событие Click для кнопки Button3 с надписью
«Выход». Для этого сделать двойной щелчок левой кнопкой мыши по
компоненту Button3 и в полученную заготовку подпрограммы вставить
код выхода из программы (уже использовался в предыдущих лабораторных
работах).
20. Запустить программу на выполнение, нажав на функциональную
кнопку F5. Получим следующий вид окна рис. 5.3.

43
Рисунок 5.3 – Рабочий вид формы приложения

Варианты для задания


Создать Windows-приложение, которое предлагает пользователю
задать размер линейного массива, заполняет автоматически этот массив
случайными целыми числами в диапазоне от –50 до 70, выводит элементы
этого массива, затем по выбору пользователя определяет, соответственно,
для каждого варианта задание а), б), в).

Данные взять из таблицы 5.1.

Таблица 5.1 – Индивидуальные задания


Вариант Задание Условие задания
1 2 3
а Найти количество отрицательных элементов
1 б Найти сумму отрицательных элементов
в Найти минимальный элемент кратный пяти
а Найти количество четных элементов
2 б Найти сумму элементов кратных 3
в Найти разность максимального и минимального элементов массива
а Найти среднее арифметическое элементов массива
3 б Найти сумму наибольшего и наименьшего элементов массива
в Найти максимальный по модулю элемент массива
а Вычислить среднее арифметическое четных элементов массива
б Найти сумму минимального положительного элемента массива и его
4 номера
в Найти произведение модулей наибольшего отрицательного и
наименьшего четного элементов массива
а Найти количество элементов, кратных 5
5 б Найти сумму четных элементов массива, стоящих на нечетных местах
в Найти сумму второго и наибольшего положительного элементов массива
а Найти среднее геометрическое четных элементов массива
6 б Найти номер наибольшего по модулю элемента массива
в Найти максимальный четный элемент массива
а Вычислить среднее арифметическое максимального и минимального
элементов массива
7
б Найти минимальный по модулю элемент массива
в Найти сумму элементов из интервала [0; 10]
а Вычислить среднее геометрическое номеров максимального и
минимального элементов массива
8 б Найти разность суммы положительных и произведения отрицательных
чисел массива
в Найти количество положительных элементов
а Найти сумму отрицательных элементов
9
б Найти сумму элементов массива, у которых индекс кратен 3

44
в Найти произведение модулей наибольшего и наименьшего элементов
массива
а Найти сумму отрицательных элементов
б Найти сумму второго и наибольшего отрицательного элемен- тов
10
массива
в Найти разность максимального и минимального элементов массива
а Вычислить среднее арифметическое четных элементов массива
11 б Найти сумму элементов в диапазоне [-10; 0]
в Найти максимальный по модулю элемент массива
а Найти сумму минимального положительного элемента массива и его
номера
12 б Найти сумму четных элементов массива из диапазона [-20; 30]
в Найти минимальный по модулю элемент массива
а Найти максимальный по модулю элемент
13 б Найти среднее арифметичекое элементов массива
в Найти сумму отрицательных элементов
а Найти количество элементов, кратных 4
14 б Найти сумму отрицательных элементов
в Найти сумму наибольшего и наименьшего элементов массива
а Найти разность максимального и минимального положительных
элементов
15
б Найти сумму нечетных элементов
в Найти минимальный элемент из диапазона [-20; 30]
а Найти количество положительных элементов
16 б Найти сумму элементов больших 3
в Найти максимальный элемент массива
а Найти количество отрицательных элементов
17 б Найти сумму отрицательных элементов
в Найти минимальный элемент, кратный пяти
а Найти количество четных элементов
18 б Найти сумму элементов, кратных 3
в Найти разность максимального и минимального элементов массива
а Найти среднее арифметичекое элементов массива
19 б Найти сумму наибольшего и наименьшего элементов массива
в Найти максимальный по модулю элемент массива
а Вычислить среднее арифметическое четных элементов массива
б Найти сумму минимального положительного элемента массива и его
20 номера
в Найти произведение модулей наибольшего отрицательного и
наименьшего четного элементов массива
а Найти количество элементов, кратных 5
21 б Найти сумму четных элементов массива, стоящих на нечетных местах
в Найти сумму второго и наибольшего положительного элементов массива
а Найти среднее геометрическое четных элементов массива
22 б Найти номер наибольшего по модулю элемента массива
в Найти максимальный четный элемент массива
а Вычислить среднее арифметическое максимального и мини- мального
23
элементов массива
45
б Найти минимальный по модулю элемент массива
в Найти сумму элементов из интервала [0; 10]
а Вычислить среднее геометрическое номеров максимального и
минимального элементов массива
24 б Найти разность суммы положительных и произведения отри- цательных
чисел массива
в Найти количество положительных элементов
а Найти сумму отрицательных элементов
б Найти сумму элементов массива, у которых индекс кратен 3
25
в Найти произведение модулей наибольшего и наименьшего элементов
массива
а Найти сумму отрицательных элементов
26 б Найти сумму второго и наибольшего положительного элементов массива
в Найти разность максимального и минимального элементов массива
а Вычислить среднее арифметическое четных элементов массива
27 б Найти сумму элементов в диапазоне [-10; 20]
в Найти максимальный по модулю элемент массива
а Найти сумму минимального положительного элемента массива и его
номера
28 б Найти сумму четных элементов массива из диапазона [-20; 30]
в Найти минимальный по модулю элемент массива
а Найти количество элементов, кратных 5
29 б Найти сумму четных элементов массива, стоящих на нечетных местах
в Найти максимальный четный элемент массива
а Найти количество положительных элементов
30 б Найти сумму элементов больших 3
в Найти максимальный элемент массива

1.6 Порядок выполнения задания 6 «Многомерный массив.


Понятие матрицы. Селективная обработка элементов строк, столбцов и
диагоналей матрицы»

Создать Windows-приложение, которое предлагает пользователю


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

Ход выполнения
1. Войти в среду Visual Studio 2010.
2. В окне Создать Проект следует развернуть узел Visual С++,
обратиться к пункту CLR и на центральной панели выбрать Приложение
Windows Form.
3. Затем в поле редактора Имя (где по умолчанию имеется <Введите
имя>) следует ввести имя проекта, Lab6. В поле Расположение можно
46
указать путь размещения проекта или выбрать путь размещения проекта с
помощью клавиши (кнопки) Обзор (например, N:\\CI\2_trim\Lab6).
4. Для формы изменить значение свойства Text, занеся, например,
следующие данные: «Выполнил студент группы ИТС-121 Иванов П. А.
Задание 6».

5. Свойству FormBorderStyle формы (стиль рамки окна)


присвоить значение FixedToolWindow. Это значение определяет окно как
диалоговое, его размеры на этапе прогона приложения (в процессе работы
приложения) не могут быть изменены.
6. В верхней части окна разместить контейнер GroupBox1 и в
свойстве Text занести текст «Ввод данных матрицы».
7. На этом же контейнере GroupBox1 разместить семь компонентов:
Label1, Label2, Label3, Label4, TextBox1, TextBox2 и
DataGridWiew1.
8. Для первого компонента Label1 в свойство Text занести текст
«Задайте размер матрицы». Для второго компонента Label2 в свойство
Text занести текст «N-строк». Для третьего компонента Label3 в свойство
Text занести текст «М-столбцов». Для четвертого компонента Label4 в
свой-ство Text занестти текст «Матрица А[n,m]».
9. Выделить компонент DataGridView1 и для свойств
RowHeadersVisible (отображение заголовка строк) и
ColumnHeadersVisible (отображение заголовка столбцов) выбрать
параметр False.
10. Ниже контейнера GroupBox1 разместить контейнер GroupBox2
и в свойстве Text занести текст «Найти».
11. Выделить компонент DataGridView2 и на него разместить два
компонента checkBox1 и checkBox2.
12. Выделить первый компонент checkBox1 и в свойство Text
занести текст «произведение отрицательных элементов матрицы».
Аналогично для компонента checkBox2 в свойство Text занести текст
«количество четных элементов матрицы». Напротив этих компонентов
checkBox разместить два компонента: TextBox3 и TextBox4.
13. Ниже компонента GroupBox2 разместить три компонента:
Button1, Button2 и Button3. На первом компоненте Button1 в
свойство Text занести текст «Создать таблицу». Для второго
компонента Button2 в свойство Text занести текст «Перенести данные
из таблицы в массив и решить задание». Для третьего компонента
Button3 в свойство Text занести текст «Выход». В результате
проведенных операций должна получиться форма примерно такого вида, как
показано на рис. 6.1.
14. Перейти к коду программы и после строки
47
#pragma once
подключить библиотеки использования математических функций, описание
переменных и размера массива, для этого вставить следующие строки:
#include<math.h>
int m, n,kol,kol2,p;
int A[50][50];

Рисунок 6.1 – Окно формы программы

15. Создать событие Click для кнопки Button1 с надписью «Со-


здать таблицу». Для этого сделать двойной щелчок левой кнопкой мыши по
компоненту Button1. Внести изменения в код подпрограммы:
//Проверка, что не пустые компоненты textBox1 и textBox2
if ((textBox1->Text!="")&&(textBox2->Text!=""))
{m = Convert::ToInt32(textBox1->Text);
n = Convert::ToInt32(textBox2->Text);
//Чистка столбцов компонента DataGridView, если они не пусты
dataGridView1->Columns->Clear();
//Заполнение компонента DataGridView столбцами dataGridView1->ColumnCount
= n;
//Заполнение компонента DataGridView строками
dataGridView1->RowCount = m;}
else
{MessageBox::Show( "Заполните, пожалуйста, данные", "Ошибка ввода
данных",
MessageBoxButtons::OK, MessageBoxIcon::Exclamation );}

16. Создать событие Click для кнопки Button2 с надписью


«Перенести данные из таблицы в массив и решить задание». Для этого
сделать двойной щелчок левой кнопкой мыши по компоненту Button2 и в
полученную заготовку подпрограммы вставить код для расчетов:
48
//переменную kol и kol2 обнуляем, а переменную р присваиваем единице
kol=0;kol2=0;p=1;
//Производим считывание из ячеек таблицы и вносим данные в массив
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
{
A[i][j] = Convert::ToSingle(this->dataGridView1->Rows[i]-
>Cells[j]->Value);
if (A[i][j]<0) {p=p*A[i][j];kol2++;} if
(A[i][j]%2==0) {kol++;}
}
//Вывод данных нахождения произведения отрицательных элементов
матрицы
if ((checkBox1->Checked==true)&&(kol2!=0)) {this->textBox3-
>Text=Convert::ToString (p);}
else
if (checkBox1->Checked==true) {this->textBox3-
>Text=Convert::ToString ("нет элементов");}
//Вывод данных нахождения количество четных элементов матрицы
if ((checkBox2->Checked==true)&&(kol!=0)) {this->textBox4-
>Text=Convert::ToString (kol);}
else
if (checkBox2->Checked==true) {this->textBox4-
>Text=Convert::ToString ("нет элементов");}
return;
17. Создать событие Click для кнопки Button3 с надписью
«Выход». Для этого сделать двойной щелчок левой кнопкой мыши по
компоненту Button3 и в полученную заготовку подпрограммы вставить
код выхода из программы (уже использовался в предыдущих лабораторных
работах).
18. На примере лабораторной работы 2 сделать проверку на коррект-
ность ввода данных (количество строк и столбцов), используя событие
Leave в окне свойств (в код программы добавить 2 процедуры,
проверяющие правильность ввода).
19. Запустить программу на выполнение, нажав на функциональную
кнопку F5. Получим следующий вид окна (рис. 6.2).

49
Рисунок 6.2 – Рабочий вид формы приложения

Варианты для задания

Создать Windows-приложение, которое предлагает пользователю задать


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

Таблица 6.1 – Индивидуальные задания


Вариант Задание Условие задания
1 2 3
1 а Найти количество элементов, больших заданного числа С (ввод
числа С сделать с клавиатуры)
б Найти сумму элементов, расположенных по периметру
в В матрице A(4;4) найти сумму произведения четных чисел 1- ой
строки и произведения положительных чисел 3-го столбца
2 а Найти минимальный по модулю элемент и номер строки и
столбца, где он находится
б Найти сумму наибольшего положительного и наименьшего
четного
в Подсчитать количество кратных 3 чисел 2-ой строки и количество
четных чисел 1-го столбца матрицы A(6; 6)
3 а Найти произведение элементов, меньших заданного числа T (ввод
числа T сделать с клавиатуры)
б Найти произведение элементов, находящихся на главной
диагонали
в Найти разность произведения нечетных чисел З-ей строки и
произведения отрицательных чисел 1 -го столбца матрицы A(4; 4)
4 а Найти сумму положительных кратных 5 элементов
б Найти произведение элементов, находящихся на побочной
диагонали
в В матрице A(8; 8) найти разность произведения нечетных чисел З-
ей строки и суммы положительных чисел 6-го столбца
5 а Найти произведение отрицательных четных элементов.
б Найти сумму элементов, находящихся на главной диагонали.
в В матрице A(5; 5) найти сумму количества четных чисел 2- ой
строки и количества отрицательных чисел 4-го столбца
6 а Найти количество положительных нечетных элементов
б Найти сумму элементов, находящихся на побочной диагонали
в В матрице A(3;3) найти произведение количества нечетных чисел
1-ой строки и количества положительных чисел 3-го столбца
7 а Найти количество элементов, меньших числа 5
б Найти количество отрицательных элементов, находящихся на
главной диагонали

50
в Найти максимальный элемент 3-го столбца и сумму нечетных
элементов 1-ой строки матрицы A(5; 5)
8 а Найти произведение положительных кратных 3 элементов
б Найти количество отрицательных элементов, находящихся на
побочной диагонали
в В матрице A(6; 6) найти произведение суммы четных чисел в З-ей
строке и суммы отрицательных чисел 1-го столбца
9 а Найти сумму отрицательных некратных 5 элементов
б Найти количество четных элементов, находящихся на главной
диагонали
в Найти произведение суммы положительных чисел в 4-ом столбце
на количество четных чисел 2-ой строки матрицы A(6; 6)
10 а Найти квадрат максимального элемента и номер строки и
столбца, где он находится
б Найти количество четных элементов, находящихся на побочной
диагонали
в В матрице A(7; 7) найти разность количества положительных
чисел 1-ой строки и количества четных чисел 3-го столбца
11 а Найти сумму четных элементов из интервала [-10; 10] матрицы
A(4; 4)
б Найти количество нечетных элементов, находящихся на главной
диагонали
в Найти произведение количества четных элементов 3 строки на
сумму нечетных элементов 2 столбца матрицы A(4; 4)
12 а Найти количество кратных 3 элементов из интервала [-6; 8]
матрицы A(5; 5)
б Найти количество нечетных элементов, находящихся на побочной
диагонали
в В матрице A(5; 5) найти произведение количества четных чисел
2-ой строки и количества отрицательных чисел 4-го столбца
13 а Найти произведение отрицательных нечетных элементов
матрицы A(5; 5)
б Найти сумму четных элементов, находящихся на главной
диагонали
в В матрице A(5; 5) найти произведение количества нечетных чисел
3-го столбца и количества отрицательных чисел 3 строки

14 а Найти количество положительных элементов из интервала [-5;


6] матрицы A(6; 6)
б Найти сумму четных элементов, находящихся на побочной
диагонали
в В матрице A(6; 6) найти произведение суммы кратных 3 чисел
2-ей строки и суммы отрицательных чисел 2-го столбца
15 а Найти максимальный по модулю элемент и номер строки и
столбца, где он находится
б Найти сумму элементов, кратных 3, находящихся на главной
диагонали
в Найти произведение количества четных чисел во 2-ом столбце на
количество нечетных чисел 2-ой строки матрицы A(4; 4)
16 а Найти сумму положительных кратных 3 элементов
51
б Найти сумму элементов, кратных 3, находящихся на побочной
диагонали
в Найти среднее геометрическое нечетных элементов 2-го столбца и
количество кратных 5 элементов З-ей строки матрицы A(5;5)
17 а Найти количество отрицательных четных элементов
б Найти сумму отрицательных четных элементов, находящихся на
главной диагонали
в Найти сумму нечетных элементов 3-го столбца и произведение
отрицательных кратных 3 элементов 2-ой строки матрицы A(6; 6)
18 а Найти произведение положительных четных элементов
б Найти сумму отрицательных четных элементов, находящихся на
побочной диагонали
в Найти произведение суммы кратных 3 чисел в 4-ом столбце на
количество нечетных чисел 2-ой строки матрицы A(4; 4)
19 а Найти сумму отрицательных четных элементов
б Найти произведение элементов, не кратных 3, которые находятся
на главной диагонали
в В матрице A(7; 7) найти разность количества нечетных чисел 1-ой
строки и количества четных чисел 4-го столбца
20 а Найти максимальный элемент, номер строки и столбца, в котором
он находится
б Найти разницу суммы четных и количества отрицательных
элементов матрицы, находящихся на главной диагонали
в Найти сумму нечетных элементов 2-го столбца и произведение
отрицательных кратных 3 элементов 4-ой строки матрицы A(4; 4)
21 а Найти минимальный элемент, номер строки и столбца, в котором
он находится
б Найти произведение суммы четных на количество положительных
элементов матрицы, находящихся на главной диагонали
в Найти произведение отрицательных четных элементов 2-ой строки
и количество некратных 5 элементов 2-го столбца матрицы A(5; 5)
22 а Найти количество положительных кратных 5 элементов
б Найти произведение суммы четных на количество положительных
элементов матрицы, находящихся на побочной диагонали
в Подсчитать количество положительных кратных 3 элементов 1-ой
строки и количество нечетных элементов 2-го столбца матрицы
A(6; 6)
23 а Найти произведение отрицательных нечетных элементов
б Найти модуль суммы элементов кратных 5, находящихся на
побочной диагонали
в Найти разность произведения нечетных чисел З-ей строки и
произведения отрицательных чисел 1-го столбца матрицы A(4; 4)
24 а Найти квадрат минимального элемента и номер строки и столбца,
где он находится
б Найти разницу суммы четных и количества отрицательных
элементов матрицы, находящихся на побочной диагонали
в В матрице A(7; 7) найти разность произведения нечетных чисел
2-ой строки и суммы положительных чисел 6-го столбца
25 а Найти произведение положительных некратных 5 элементов

52
б Найти модуль суммы элементов, кратных 5, находящихся на
главной диагонали
в В матрице A(5; 5) найти сумму количества четных чисел З-ей
строки и количества отрицательных чисел 4-го столбца
26 а Найти максимальный по модулю элемент и номер строки и
столбца, где он находится
б Найти разность максимального и минимального элементов,
находящихся на главной диагонали
в В матрице A(6; 6) найти произведение количества нечетных чисел
2-го столбца и количества положительных чисел 3 строки
27 а Найти количество отрицательных некратных 3 элементов
б Найти разность максимального и минимального элементов,
находящихся на побочной диагонали
в Найти максимальный элемент 2-ой строки и количество четных
элементов 5-го столбца матрицы A(5; 5)
28 а Найти произведение положительных нечетных элементов
б Найти модуль разности суммы четных и произведения нечетных
элементов матрицы, находящихся на главной диагонали
в В матрице A(6; 6) найти произведение суммы четных чисел З-ей
строки и суммы отрицательных чисел 1-го столбца
29 а Найти сумму отрицательных нечетных элементов
б Найти модуль разности суммы четных и произведения нечетных
элементов матрицы, находящихся на побочной диагонали
в Найти произведение суммы положительных чисел 1-й строки на
сумму четных чисел 2-го столбца матрицы A(5; 5)
30 а Найти произведение отрицательных четных элементов
б Найти произведение максимального элемента главной диагонали
на минимальный элемент побочной диагонали
в В матрице A(7; 7) найти разность количества отрицательных чисел
2-ой строки и количества нечетных чисел 3-го столбца

1.7 Порядок выполнения задания 7 «Изучение вероятностных


алгоритмов»

Методом Монте-Карло определить площадь фигуры, изображенной на


рис.7.1. Вычислить фактическую площадь и сравнить ее с расчетной.
Определить относительную погрешность. Определить составные части
границ фигуры.

53
Рисунок 7.1 – Пример фигуры для нахождения площади
методом Монте-Карло

Ход выполнения

1. Определить составные части границ фигуры: из фигуры на


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

2. Определить расчетную площадь фигуры. Из рисунка видно, что она


состоит из двух фигур: полукруга радиусом 100 и прямоугольного
треугольника с катетами 100 и 200. Значит, общая площадь фигуры равна:
Sp = 10000/2 + 10000.
3. Войти в среду Visual Studio 2010.
4. В окне Создать Проект следует развернуть узел Visual С++, обра-
титься к пункту CLR и на центральной панели выбрать Приложение
Windows Form.
5. Затем в поле редактора Имя (где по умолчанию имеется <Введите
имя>) следует ввести имя проекта, Visual_Lab7. В поле Расположение
можно указать путь размещения проекта или выбрать путь размещения
проекта с помощью клавиши (кнопки) Обзор (например, N:\\CI\2_trim\Lab7).
6. Для формы изменить значение свойства Text,занеся, например,
следующие данные: «Выполнил студент группы ИТС-121 Иванов П. А.
Задание 7».
7. Поместить на форму компонент Chart1. С помощью свойства An-
chor привязать компонент ко всем сторонам формы. Компонент Chart1
должен занимать почти всю область формы и при изменении размеров
формы будут, соответственно, меняться и его размеры. Это не лучший способ
привязки размеров графика к размерам формы: возможны искажения
пропорций фигуры по высоте и ширине. Лучше делать перерасчет размеров
компонента Chart1 в обработчике события Resize (изменение размеров)
для формы, назначая одинаковый размер как по высоте, так и по ширине,
определяя для этого минимальный из размеров доступной клиент-ской
области по высоте или ширине (заранее определить, какую по высоте область
занимают остальные компоненты, размещаемые на форме).
8. Разместить на форме ряд компонентов (5 компонентов TextBox, 5
компонентов Label, 3 компонента Button и один компонент Chart) для
отображения результатов работы (например, как показано на рис.7.3). При
этом, используя свойство Anchor (привязка к родительскому компоненту),
привязать компоненты, расположенные слева к левому краю формы, а
54
расположенные справа – к правому. Кнопки «Фигура», «Расчет» и «Выход»
нужно привязать к нижнему краю. При изменении размеров формы лучше
делать перерасчет ширины кнопок, тогда они будут пропорционально
увеличиваться, оставаясь «привязанными» к нижнему краю формы. Форма
будет иметь вид примерно как на рис. 7.3.а,б.

а – на этапе проектирования; б – после выполнения расчета


Рисунок 7.3 – Общий вид исходной формы

9. Для компонентов TextBox2, TextBox3, TextBox4 и


TextBox5 в свойстве ReadOnly (только чтение) присвоить значение true,
запрещающее пользователю заносить в компонент какие-либо данные. Для
компонента TextBox1 данные будут вводиться с клавиатуры с помощью
компонента TextBox. В свойства Text этого компонента ввести значение
«10000» – значение по умолчанию. Это значение будет показываться при
запуске приложения на выполнение. При выполнении приложения его можно
будет заменить другим.
10. Через свойство Series компонента Chart1 вызвать окно
Редактора коллекции Series. Добавить Series для отображения
границ фигуры (по количеству составных частей контура фигуры). В
исходном примере – три графика. Тип графиков выбрать Line (линия) или
Spline (по-лилиния). Цвет графиков взять одинаковый. Добавить еще два
Series типа Point (точки) для демонстрации случайных точек (всего
должно быть для данного примера 5 Series). Выбрать по своему
усмотрению цвет этих точек, размер Маркера определить равным 1.
11. В объектном коде создаваемого проекта добавить присоединение
библиотек:
#pragma once #include
<cmath> #include
<stdlib.h> #include
<time.h>
#define _USE_MATH_DEFINES
#include <math.h>
12. В разделе using добавить строку:
55
using namespace
System::Windows::Forms::DataVisualization::Charting;
13. Сделать двойной щелчок левой кнопкой мыши по кнопке
«Фигура», при этом в компоненте Chart1 рисуется контур фигуры. Каждая
составная часть (их три) рисуется в своей серии. При отображении они
соприкасаются друг с другом, образуя единый контур. Вставить в заготовку
кода следующий код программы:
Series^ plot1 = chart1->Series[0];
Series^ plot2 = chart1->Series[1];
Series^ plot3 = chart1->Series[2];
double y, x;
// Рисуем верхнюю часть фигуры – полуокружность радиуса 100
for (int i=-100; i<=100; i++)
{ x=i; y=sqrt(10000-
x*x);
plot1->Points->AddXY(x, y);
}
// Рисуем вторую часть - наклонную прямую у=-0,5(х+100)
for (int i=-100; i<=100; i++)
{ x=i; y=-
0.5*(x+100);
plot2->Points->AddXY(x, y);
}
// Рисуем вертикальную прямую x=100.
for (int i=-100; i<=0; i++)
{x=100;
y=i; plot3->Points->AddXY(x,
y);
}
14. Весь расчет выполняется в обработчике щелчка на кнопке
«Расчет». С помощью генератора псевдослучайных чисел rand
генерируются пары псевдослучайных чисел, которые трактуются как
координаты случайной точки внутри квадрата. Точки отображаются на
экране в сериях типа Point (точки) компонента Chart1. Одновременно
идет подсчет количества точек, попавших в область и не попавших. По
завершении процесса генерации случайных точек осуществляется расчет
итогов. Для этого сделать двойной щелчок левой кнопкой мыши по кнопке
«Расчет» и в полученную заготовку кода вставить следующий код:
Series^ plot4 = chart1->Series[3];
Series^ plot5 = chart1->Series[4];
int T_vn, T_za, n;
float x, y, S_fig, S_r,er;
// Очищаем графики (точки) для проведения повторного Расчета
plot4->Points->Clear();
plot5->Points->Clear();
if (textBox1->Text!="")
{
// Запрашиваем количество точек
n = Convert::ToInt32(textBox1->Text);
// Очищаем счетчики точек
T_vn = 0; T_za = 0;
for (int i=1; i<=n; i++)
{
56
// Генерируем пару случайных чисел и трактуем их как
// координаты случайной точки
x = rand()%201-100; y
= rand()%201-100;
// Проверяем, куда попадает точка: внутрь фигуры или вне ее.
// В зависимости от этого выбираем цвет точки.
// Кроме того, ведем подсчет отдельно внешних и внутренних точек
if
(((x*x+y*y<=10000)&&(y>=0))||((y<0)&&(x<=100)&&(y>=-0.5*(x+100))))
{ plot4->Points->AddXY(x, y); T_vn++;}
else
{ plot5->Points->AddXY(x, y); T_za++;}
}
// Количество точек внутри фигуры textBox2-
>Text = Convert::ToString (T_vn);
// Количество точек вне фигуры
textBox3->Text = Convert::ToString (T_za);
// Площадь фигуры, определенная по методу Монте-Карло
S_fig = 40000*T_vn/n;
//Площадь реальная
S_r= 10000+M_PI*10000/2;
// Ошибка
er = fabs(S_r-S_fig)/S_r*100; textBox4->Text
= Convert::ToString (S_fig); textBox5->Text =
Convert::ToString (er);
}
else MessageBox::Show( "Введите количество точек", "Ошибка
ввода данных",
MessageBoxButtons::OK, MessageBoxIcon::Exclamation );
}
15. Аналогично для третьей кнопки «Выход» сделать двойной щелчок
левой кнопкой мыши и вставить в заготовку код, который будет производить
выход из программы (уже неоднократно использовался в предыдущих
лабораторных работах).
Варианты для задания
Составить программу для определения методом Монте-Карло площади
заштрихованой фигуры. Вид фигуры, в зависимости от варианта, выбрать из
таблицы 7.1 (выбор плоской фигуры выполняется следующим образом:
вариант 1 – а, вариант 2 – б, …, вариант 12 – м; вариант 13 – а, вариант 14 – б,
…вариант 24 – м; вариант 25 – а; вариант 26 – б, …вариант 36 – м).
Вычислить фактическую площадь и сравнить ее с расчетной.

57
Таблица 7.1 – Виды плоских фигур

58
1.8 Порядок выполнения задания 8 «Работа с диалоговыми
окнами. Создание операционного меню»

Создать Windows-приложение, которое состоит из трех вкладок и


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

1. Войти в среду Visual Studio 2010.


2. В окне Создать Проект следует развернуть узел Visual С++,
обратиться к пункту CLR и на центральной панели выбрать Приложение
Windows Form.
3. Затем в поле редактора Имя (где по умолчанию имеется <Введите
имя>) следует ввести имя проекта, Visual_Lab8. В поле Расположение
можно указать путь размещения проекта или выбрать путь размещения
проекта с помощью клавиши (кнопки) Обзор (например, N:\\CI\2_trim\Lab8).
4. Для формы изменить значение свойства Text, занеся, например,
следующие данные: «Выполнил студент группы ИТС-121 Иванов П. А.
Задание 8».
5. Свойству FormBorderStyle формы (стиль рамки окна)
присвоить значение FixedToolWindow. Это значение определяет окно как
диалоговое, его размеры на этапе прогона приложения (в процессе работы
приложения) не могут быть изменены.
6. В верхней части формы разместить элемент MenuStrip
(операционное меню) и разместить в нем три пункта: «Файл», «Вид» и
«Выход» (как это сделать, изложено в теоретическом материале в начале
лабораторной работы), а в них подпункты в соответствии с условием
задания. Получим следующий вид меню (рис. 8.1–8.2).

60
Рисунок 8.1 – Подпункты меню пункта Файл

Рисунок 8.2 – Подпункты меню пункта Вид→ Таблица

7. Внизу формы разместить компонент Button1 и в свойство Text


занести текст «Выход» (рис. 8.3).

Рисунок 8.3 – Подпункты меню пункта Вид→ График

Рисунок 8.4 – Вид формы на этапе проектирования

8. На форму разместить элемент TabControl (теория по этому


61
элементу в начале лабораторной работы) и получить следующий вид (рис.
8.4).
9. Добавить в компонент TabControl еще одну вкладку TabPage3
для каждой из вкладок в свойство Text занести текст на русском языке (рис.
8.4). На первую вкладку TabPage1 (Ввод данных) занести 5 элементов
Label и 4 элемента ТextBox. Для компонентов Label изменить свойство
Text, в результате проведенных операций должна получиться форма
примерно такого вида, как показано на рис. 8.5.

Рисунок 8.5 – Вид формы после занесения на нее элемента TabControl

Рисунок 8.6 – Вид вкладки TabPage1

10. Перейти на вторую вкладку TabPage2 (Таблица данных


промежутка) и на ней разместить 3 элемента Label, 2 элемента ТextBox и
один элемент DataGridView. В результате проведенных операций должна
получиться форма примерно такого вида, как показано на рис. 8.7.
11. Перейти на третью вкладку TabPage3 (График функции на
промежутке) и на ней разместить элемент Chart1 (настройка этого
62
элемента рассматривалась в предыдущих лабораторных работах). В
результате проведенных операций должна получиться форма примерно
такого вида, как показано на рис. 8.8.

Рисунок 8.7 – Вид вкладки TabPage2

Рисунок 8.8 – Вид вкладки TabPage3

12. Создать вспомогательную форму (Form2) для ввода параметров


изменения внешнего вида элемента DataGridView главной формы (процесс
создания диалогового окна описан в теоретической части п. 8.1.4). В
результате проведенных операций должна получиться форма примерно
такого вида, как показано на рис. 8.9.

63
Рисунок 8.9 – Внешний вид Form2

13. Перейти к коду программы формы Form1. Сразу после строки:


#pragma once
внести используемые в программе переменные, подключить библиотеку
использования математических функций и подключить вторую форму
(Form2), для этого вставитьследующие строки:
double xn,xk,xh,x,y,a,ymax,ymin,yt;
int i,k,j;

int h;
int m;

#include <math.h>
#include "Form2.h"

14. В разделе using добавитьбстроку для отображения графика


функции:
using namespace
System::Windows::Forms::DataVisualization::Charting;
15. В нашей программе предусмотрено три варианта для выхода из
программы: первый – кнопка внизу формы (Form1) с надписью «Выход»,
второй – в операционном меню пункт «Выход», третий – в операционном
меню «Файл» → «Выход». Для каждого из этих вариантов создадать
заготовки подпрограмм, дважды щелкнув левой кнопкой мышки по
соответствующему пункту и вставив код:
Application::Exit();
16. В нашей программе данные вводятся на первой вкладке компо-
нента ТabControl1, на второй – вывод таблицы значений и экстремумов
функции, а на третей – график функции на данном промежутке. И чтобы это
происходило при переключении между вкладками, нужно создать событие
SelectedIndexChanged. Для этого нужно выделить компонент
ТabControl1 и перейти в окно «Свойства», выбрав вкладку
«События» , и напротив события SelectedIndexChanged сделать
двойной щелчок левой кнопкой мыши. В полученную заготовку
подпрограммы внести следующий код:
double xn,xk,xh,x,y,a,ymax,ymin,yt;
int n,i;
Series^ plot1 = chart1->Series[0];
plot1->Points->Clear();
if ((textBox1->Text!="")&&(textBox2->Text!="")&&(textBox3-
>Text!="")&&(textBox4->Text!="")){
xn = Convert::ToDouble(textBox1->Text);
xk = Convert::ToDouble(textBox2->Text);
xh = Convert::ToDouble(textBox3->Text); a
= Convert::ToDouble(textBox4->Text);
if ((xn>=xk)||(xh>(xk-xn))) {MessageBox::Show( "Данные запол-
нены неверно", "Ошибка ввода данных", MessageBoxButtons::OK,

64
MessageBoxIcon::Exclamation );}
else
{x=xn;
dataGridView1->Columns->Clear();
//Заполнение DGView столбцами dataGridView1-
>ColumnCount = 2;
//Заполнение DGView строками dataGridView1->Rows->Add(ceil((xk-
xn)/xh)+1); dataGridView1->Rows[0]->Cells[0]->Value
=Convert::ToString(" x");
dataGridView1->Rows[0]->Cells[1]->Value =Convert::ToString("
Y");
i=1; x=xn;ymax=-
1.8e307;ymin=1.8e307; while
(x<=xk)
{
if (x<=0){ y=2*x+2;}
else
if (x<=a) {y=sqrt(x+3);}
else
if (x>a) {y=pow(cos(x+2),2);}
plot1->Points->AddXY(x, y);
dataGridView1->Rows[i]->Cells[0]->Value=Convert::ToString(x);
//переменной yt присваивает округленное до двух знаков после запятой значение у
yt=ceil(y*100)/100;
//Вывод во втором столбце таблицы значение функции
dataGridView1->Rows[i]->Cells[1]->Value
=Convert::ToString(yt);
//находит максимальное и минимальное значение и округляет до двух знаков после
запятой if (y>ymax) ymax=ceil(y*100)/100;
if (y<ymin) ymin=ceil(y*100)/100;
x=x+xh;
i++;}}
//выводит в компоненты textbox максимальное и минимальное значение функции
textBox5->Text = Convert::ToString (ymax);
textBox6->Text = Convert::ToString (ymin);
}
else
{MessageBox::Show( "Заполните, пожалуйста, данные", "Ошибка ввода
данных",MessageBoxButtons::OK,MessageBoxIcon::Exclamation );}
17. Создать событие Click для пункта операционного меню «Вид»→
«Таблица»→ «Цвет текста» (при нажатии на этот пункт будет появлять-ся
диалоговое окно выбора цвета, и после выбора пользователем цвета, цвет
текста таблицы будет меняться). Для этого сделать двойной щелчок левой
кнопкой мыши по надписи «Цвет текста» и в полученную заготовку
подпрограммы вставить код:
if(colorDialog1->ShowDialog()==System::Windows:
:Forms::DialogResult::OK)
{dataGridView1->DefaultCellStyle->ForeColor =colorDialog1-
>Color;}
18. Создать событие Click для пункта операционного меню «Вид»→
«Таблица»→ «Цвет фона ячеек» (при нажатии на этот пункт будет
появляться диалоговое окно выбора цвета, и после выбора пользователем
цвета, цвет фона ячеек таблицы будет меняться). Для этого сделать двойной
65
щелчок левой кнопкой мыши по надписи «Цвет фона ячеек» и в
полученную заготовку подпрограммы вставить код:
if(colorDialog1-
>ShowDialog()==System::Windows::Forms::DialogResult::OK)
{dataGridView1->DefaultCellStyle-
>BackColor=colorDialog1->Color;}
19. Создадть событие Click для пункта операционного меню «Вид»→
«Таблица»→ «Высота строк» (при нажатии на этот пункт будет появляться
диалоговое окно, в которое пользователь вводит целое число, и при нажатии
на кнопку «ОК» высота строк таблицы меняется). Для этого сделатьдвойной
щелчок левой кнопкой мыши по надписи «Высота строк» и в полученную
заготовку подпрограммы вставить код:
Form2^ f = gcnew Form2();
this->Hide(); f-
>ShowDialog(); this-
>Show();
for (int i = 0; i < dataGridView1->RowCount; i++)
{DataGridViewRow^ row = dataGridView1->Rows[ i ];
row->Height = h;}
соответственно для этого пункта меню будет задействовано окно формы
(Form2), поэтому нужно перейти в код Form2.h и вначале прописать
использованные переменные в этой форме:
extern int h;
extern int m;
сделать событие Click для кнопки с надписью «ОК» формы «Form2» и в
полученную заготовку вставить следующий код:
h=Convert::ToInt32(textBox1->Text); m=Convert::ToInt32(textBox1-
>Text);
сделать событие Click для кнопки с надписью «Отменить» формы «Form2»
и в полученную заготовку вставить следующий код: this->Hide();
20. Создать событие Click для пункта операционного меню «Вид»→
«Таблица»→ «Ширина столбцов» (при нажатии на этот пункт будет
появляться диалоговое окно, в которое пользователь вводит целое число, и
при нажатии на кнопку «ОК» ширина столбцов таблицы меняется). Для этого
сделать двойной щелчок левой кнопкой мыши по надписи «Ширина
столбцов» и в полученную заготовку подпрограммы вставить код:
Form2^ f = gcnew Form2();
this->Hide(); f-
>ShowDialog(); this-
>Show();
for (int i = 0; i < dataGridView1->ColumnCount; i++)
{DataGridViewColumn^ column = dataGridView1->Columns[ i ];
column->Width = m;}
21. Создать событие Click для пункта операционного меню «Вид»→
«Таблица»→ «Параметры шрифта заголовка» (при нажатии на этот пункт
будет появляться диалоговое окно «Шрифт», в котором пользователь
выбирает параметры шрифта (вид шрифта, размер, начертание и т. д.), и при
нажатии на кнопку «ОК» внешний вид заголовка таблицы меняется). Для
этого сделать двойной щелчок левой кнопкой мыши по надписи
66
«Параметры шрифта заголовка» и в полученную заготовку подпрограммы
вставим код:
if(fontDialog1-
>ShowDialog()==System::Windows::Forms::DialogResult::OK)
{label6->Font = fontDialog1->Font;}

22. Создадать событие Click для пункта операционного меню


«Вид»→ «Таблица»→ «Цвет шрифта заголовка» (при нажатии на этот
пункт будет появляться диалоговое окно «ColorDialog», в котором
пользователь выбирает цвет шрифта, и при нажатии на кнопку «ОК»
внешний вид заголовка таблицы меняется). Для этого сделать двойной
щелчок левой кнопкой мыши по надписи «Цвет шрифта заголовка» и в
полученную заготовку подпрограммы вставить код:
if(colorDialog1->ShowDialog()==System:
:Windows::Forms::DialogResult::OK)
{label6->ForeColor = colorDialog1->Color;}
23. Создать событие Click для пункта операционного меню «Вид»→
«График»→ «Цвет графика» (при нажатии на этот пункт будет появляться
диалоговое окно «ColorDialog», в котором пользователь выбирает цвет, и
при нажатии на кнопку «ОК» внешний вид графика меняется). Для этого
сделать двойной щелчок левой кнопкой мыши по надписи «Цвет графика» и
в полученную заготовку подпрограммы вставить код:
Series^ plot1 = chart1->Series[0];
if(colorDialog1->ShowDialog()==System:
:Windows::Forms::DialogResult::OK)
plot1->Color = colorDialog1->Color;
24. Создать событие Click для пункта операционного меню «Вид»→
«График»→ «Цвет фона графика» (при нажатии на этот пункт будет
появляться диалоговое окно «ColorDialog», в котором пользователь
выбирает цвет, и при нажатии на кнопку «ОК» внешний вид графика
меняется). Для этого сделать двойной щелчок левой кнопкой мыши по
надписи «Цвет фона графика» и в полученную заготовку подпрограммы
вставить код:
Series^ plot1 = chart1->Series[0];
if(colorDialog1->ShowDialog()==System:
:Windows::Forms::DialogResult::OK) {chart1-
>BackColor = colorDialog1->Color;}
25. Создать событие Click для пункта операционного меню
«Файл»→ «Сохранить данные таблицы в файл» (при нажатии на этот
пункт будет появляться диалоговое окно «SaveFileDialog», в котором
пользователь указывает имя и выбирает путь для сохранения файла с
данными таблицы, и при нажатии на кнопку «ОК» данные таблицы
автоматически заносятся в новый созданный текстовый файл). Для этого
сделать двойной щелчок левой кнопкой мыши по надписи «Сохранить
данные таблицы в файл» и в полученную заготовку подпрограммы вставить
код:
67
SaveFileDialog ^saveFileDialog1 = gcnew SaveFileDialog();
saveFileDialog1->Filter = "Text Files|*.txt" ;
saveFileDialog1->FilterIndex = 2 ; saveFileDialog1-
>RestoreDirectory = true ; if(saveFileDialog1->ShowDialog()
== System::Windows::Forms: :DialogResult::OK)
{
StreamWriter^ pwriter = gcnew StreamWriter(saveFileDialog1-
>FileName);
for (int i = 0; i < dataGridView1->RowCount; i++) pwriter-
>WriteLine(dataGridView1->Rows[i]->Cells[0]->Value->ToString()+"
| "+dataGridView1->Rows[i]->Cells[1]->Value->ToString());
pwriter->Close();}
26. На примере лабораторной работы 2 сделать проверку на
корректность ввода данных (XN, XK, XH и A), используя событие Leave в
окне свойств (в код программы добавить 4 процедуры, проверяющие
правильность ввода).
27. Запустить программу на выполнение, нажав на функциональную
кнопку F5. Получим следующий вид окна рис. 8.10–8.11.

Рисунок 8.10 – Рабочий вид формы приложения вкладки «Ввод данных»

68
Рисунок 8.11 – Рабочий вид формы приложения вкладки
«Таблица данных промежутка»

Рисунок 8.12 – Рабочий вид формы приложения вкладки


«График функции на промежутке»

Варианты для задания

Создать Windows-приложение, которое состоит из трех вкладок и


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

Данные функции, промежутка и значения а взять из таблицы 8.1.

69
Таблица 8.1 –Индивидуалъные задания

70
71
1.9 Порядок выполнения задания 9 «Обработка матрицы.
Формирование одномерных массивов из двумерных. Сортировка
одномерных массивов»

Создать Windows-приложение (табл. 9.4), которое по запрашиваемому


количеству строк и столбцов формирует случайным образом двумерный
массив А, подсчитывает <условие своего варианта> по строкам (для
нечетных вариантов) или по столбцам (для четных вариантов) получившейся
матрицы, полученные результаты заносит в одномерный массив В и
сортирует массив В методом <условие своего варианта>.
Приблизительный внешний вид создаваемого Windows-приложения
изображен на рисунке 9.1.

Рисунок 9.1 – Окно формы программы

72
Таблица 9.4 – Индивидуальные задания
Номер Метод
Условие селекции в двумерном массиве
варианта сортировки
1 Сумму положительных элементов «пузырька»
2 Количество четных элементов перестановки
3 Произведение кратных 3 элементов вставки
4 Среднее арифметическое отрицательных элементов Шелла
5 Максимальный элемент «пузырька»
6 Среднее геометрическое нечетных элементов перестановки
7 Количество неотрицательных элементов вставки
8 Произведение четных элементов Шелла
9 Сумму кратных 5 элементов «пузырька»
10 Наибольший по модулю элемент перестановки
11 Среднее арифметическое четных элементов вставки
12 Среднее геометрическое кратных 4 элементов Шелла
13 Сумму отрицательных элементов «пузырька»
14 Количество нечетных элементов перестановки
15 Произведение некратных 4 элементов вставки
16 Среднее арифметическое положительных элементов Шелла
17 Минимальный элемент «пузырька»
18 Среднее геометрическое четных элементов перестановки
19 Количество неположительных элементов вставки
20 Произведение нечетных элементов Шелла
21 Сумму некратных 3 элементов «пузырька»
22 Наименьший по модулю элемент перестановки
23 Среднее арифметическое нечетных элементов вставки
24 Среднее геометрическое некратных 3 элементов Шелла
25 Сумму наибольшего и наименьшего элементов «пузырька»

73
2 ОПИСАНИЕ СТРУКТУРЫ РАБОТЫ

Курсовая работа выполняется на листах формата А4.


Титульный лист к курсовой работе оформляется в соответствии с
приложением А и только с помощью текстового процессора Microsoft Word.
При выполнении курсовой работы задания следует выполнять
последовательно друг за другом, начиная с первого.
Необходимо написать слово «ЗАДАНИЕ» с указанием его порядкового
номера, тему задания, затем – текст самого задания в соответствии с
вариантом.
Для заданий 2 – 9 обязательно нарисовать блок-схему к задаче и
привести текст программы, написанной на алгоритмическом языке С++.
Результаты своей работы над заданиями в виде исходных кодов
каждый студент записывает на компакт-диск и прикладывает к отчету.

3 ПРАВИЛА ОФОРМЛЕНИЯ РАБОТЫ

Курсовая работа должна оформляться в соответствии с требованиями


государственных стандартов.
Текст курсовой работы выполняется рукописно темными чернилами
одного цвета или в текстовом процессоре Microsoft Word.
Если курсовая работа выполняется рукописно, то необходимо
придерживаться следующих требований к оформлению текста:
1. Расстояние от рамки до границ текста следует оставлять в начале
строки не менее 5 мм, в конце строки – не менее 3 мм.
2. Расстояние от верхней или нижней строки текста до верхней или
нижней рамки должно быть не менее 10 мм.
3. Абзацы в тексте начинают отступом, равным 20 мм.
4. Расстояние между строками в тексте следует выдерживать равным
двойной высоте принятого шрифта.
Если же задание выполняется в текстовом процессоре Microsoft Word,
то текст должен иметь следующие параметры:
1. Поля: верхнее и нижнее до нумерации страниц – 20 мм, левое –
30 мм, правое – 15 мм.
2. Межстрочное расстояние – полуторное.
3. Переплет – 0 см.
4. Ориентация – книжная.
5. Шрифт – Times New Roman.
6. Размер шрифта – 14 пунктов.
7. Красная строка – 1,25 см.
8. Рисунки нумеруются снизу и подписываются (Рисунок 1 –
Название).

74
Слово «ЗАДАНИЕ» и тему задания следует писать прописными
буквами без точки в конце предложения, не подчеркивая. Переносы слов в
заголовках не допускаются. Если заголовок состоит из двух предложений,
их разделяют точкой.
Каждое задание необходимо начинать с нового листа (страницы).
Первый лист курсовой работы – это титульный лист, который
представлен в приложении А.
На втором листе помещают содержание, которое включают в общее
количество листов.
В конце курсовой работы приводится список источников, ис-
пользованных при выполнении заданий. Источники следует располагать в
алфавитном порядке. Список использованных источников включают в
содержание курсовой работы.
Сведения об источниках, включенных в список, необходимо давать в
соответствии с требованиями ГОСТ 7.1-2003 «Библиографическая запись.
Библиографическое описание. Общие требования и правила составления».
Нумерация страниц курсовой работы должна быть сквозная.

4 ПОСЛЕДОВАТЕЛЬНОСТЬ ВЫПОЛНЕНИЯ ЗАДАНИЙ

Курсовая работа является одним из видов текущей учебной работы и


относится к самостоятельной работе студентов. Она включена в учебный
план изучения дисциплины «Программирование на языке высокого уровня».
Выполнение курсовой работы является обязательным для каждого студента.
На выполнение курсовой работы в соответствии с учебной программой по
дисциплине «Программирование на языке высокого уровня» отводится 56
часов.
Курсовая работа выдается студенту на первой лекции по изучению
дисциплины «Программирование на языке высокого уровня».
Курсовая работа выполняется индивидуально студентом в соответствии
с календарным планом, приведенным в таблице 2.

Таблица 2 – Календарный план выполнения курсовой работы


Порядковый
номер учебной 1–2 3–4 5–6 7–8 9–10 11–12 13 14–15
недели
сдача на защита
Номер задания 1, 2 3 4, 5 6, 7 8 9
проверку

75
5 ПОРЯДОК ЗАЩИТЫ

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


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

Контрольные вопросы к заданию 1:


1. Как создать проект Windows Forms и его сохранение?
2. Как создать вторую форму и ее вызов из первой формы?
3. Компонент Forms и его основные свойства.
4. Компонент Memo и его основные свойства.
5. Компонент Label и его основные свойства.
6. Компонент TextBox и его основные свойства.
7. Компонент Button и его основные свойства.
8. Компонент ListView и его основные свойства.
9. Компонент RadioButton и его основные свойства.
10. Компонент ChecBox и его основные свойства.
11. Компонент GroupBox и его основные свойства.
12. Компонент ListBox и его основные свойства.
13. Компонент PictureBox и его основные свойства.

Контрольные вопросы к заданию 2:


1. Что такое полная и сокращенная форма условного оператора if?
2. Как организуются множественные действия в операторе условия
if?
3. Какой формат записи имеет тернарный оператор условия?
4. В чем различие и сходство между операторами break и continue?
5. Как можно обеспечить выход из вложенных циклов?
6. Как можно организовать переходы в различные точки программы
на С++?
7. Какие логические операторы отношения используются в языке
С++?
8. Как сделать, чтобы на форме отображалась картинка
математической функции?
9. Как записать математические функции на языке
программирования С++?
10. Как осуществляется проверка ввода данных для х и а?

Контрольные вопросы к заданию 3:


1. Оператор цикла с предварительной проверкой условия в языке С++.
76
2. Оператор цикла с последующей проверкой условия в языке С++.
3. Сколько параметров требуется для работы оператора цикла с
параметром (For)?
4. Как реализуется взаимозаменяемость операторов цикла while и
for?
5. В чем сходство и различие между циклами с предусловием и с
постусловием?
6. Как в компоненте DataGridView отключить скрытые строки.
7. Как в DataGridView вывести округленное число до тысячных.

Контрольные вопросы к заданию 4:


1. Методика построения графиков функций по их уравнениям (для всех
языков программирования).
2. Можно ли использовать цикл For для построения графика функции?
Если да, то как?
3. Вызов компонента Chart и его настройка.
4. Как построить нескольких графиков функций на одном компоненте
Chart?

Контрольные вопросы к заданию 5:


1. Понятие одномерного числового массива в языке С++?
2. Как организуется индексирование числовых массивов в языке С++?
3. Для чего применяется начальная инициализация числовых массивов
при дальнейшем их использовании?
4. Как использовать генератор случайных чисел для заполнения
массива элементами?
5. Условия селективной обработки элементов массива.
6. Нахождение минимального и максимального элементов массива.
7. С помощью каких визуальных компонентов можно сделать ввод
элементов массива в ручном режиме?

Контрольные вопросы к заданию 6:


1. Понятие матрицы в языке С++.
2. Как организуется индексирование числовых массивов в языке С++?
3. В какой очередности и как происходит заполнение матрицы на
языке С++?
4. Условия селективной обработки элементов матрицы.
5. Условия обработки элементов строк, столбцов и диагоналей
матрицы.
6. С помощью каких визуальных компонентов можно сделать ввод
вывод элементов матрицы в ручном режиме?
7. Свойства компонента DataGridView.
8. Сколько потребуется операторов цикла (каких) для вывода
элементов матрицы в компонент DataGridView?
77
Контрольные вопросы к заданию 8:
9. Компонент MenuStrip, его свойства.
10. Диалоговое окно ColorDialog, его вызов и назначение.
11. Диалоговое окно FontDialog, его вызов и назначение.
12. Диалоговое окно SaveDialog, его вызов и назначение.
13. Создание модального диалогового окна, его настройка.
14. Настройка компонента TabControl, основное событие для этого
элемента.

Контрольные вопросы к заданию 9:


1. В чем заключается сортировка элементов одномерных массивов?
2. Сортировка методом «пузырька».
3. Сортировка методом перестановки.
4. Сортировка методом вставки.
5. Сортировка методом Шелла.

6 КРИТЕРИИ ОЦЕНИВАНИЯ

Защита курсовой работы проходит в форме собеседования.


Максимальное количество баллов студент получает, если оформление
курсовой работы соответсвует установленным требованиям, а пояснительная
записка полностью раскрывает суть работы. Основанием для снижения
оценки являются:
- не качественно выполненная работа на персональном компьютере,
- письменный отчет выполнен в небрежной форме и с ошибками,
- студент не дает исчерпывающий ответ на вопрос преподавателя,
- путается или затрудняется в демонстрации работы на компьютере.
Пояснительная записка может быть отправлена на доработку в
следующих случаях:
- небрежное выполнение и с ошибками,
- сокращенное содержание пояснительной записки.
Студенты, выполнившие не свой вариант курсовой работы, а также
выполнившие не все задания, к защите не допускаются.
Курсовая работа, не отвечающая требованиям по ее оформлению, на
проверку не принимается.
Студенты, не защитившие курсовую работу, к экзамену по дисциплине
«Программирование на языке высокого уровня» не допускаются.
Студентам, защитившим курсовую работу, выставляется оценка по
критериям Фонда оценочных средств по дисциплине «Программирование на
языке высокого уровня».

78
ЗАКЛЮЧЕНИЕ

Язык С называют компьютерным языком "среднего уровня". Но это не


означает, что он менее совершенен по сравнению с традиционными языками
высокого уровня, такими как Fortran, Pascal, Basic и др. Язык С сочетает
элементы языков высокого уровня с функциональностью ассемблера. В нем
заложены возможности для разработки конструкций, характерных для языков
высокого уровня. В то же время С позволяет манипулировать битами,
байтами и адресами, т. е. базовыми элементами, с которыми работает
компьютер.
К неоспоримым достоинствам языка С относятся следующие:
− универсальность (используется почти на всех существующих ЭВМ);
− компактность и универсальность кода;
− быстрота выполнения программ;
− гибкость;
− высокая структурированность.
Строительными блоками языка С являются функции, с помощью
которых возможно выполнение операций как высокого, так и сравнительно
низкого уровня.
Важным аспектом языка С является его структурированность.
Специфическая черта структурированного языка – использование блоков.
Блок – это набор инструкций, которые логически связаны между собой.
Другая характерная особенность языка С – отсутствие ответственности
за действия программиста. Например, в нем не предусматривается контроль
выхода за границы массивов (числовых или символьных). Основной принцип
данного языка состоит в том, чтобы позволить программисту делать все, что
он хочет, но и за последствия отвечает не язык, а программист.

79
СПИСОК РЕКОМЕНДУЕМОЙ ЛИТЕРАТУРЫ

1. Архангельский, А. Я. Программирование в C++ Builder 6 / А. Я.


Архангельский. – М. : Бином, 2003. – с. 368.
2. Водовозов, В. М. Конструирование приложений для Windows : учебное
пособие / В. М. Водовозов, А. К. Пожидаев. – СПб. : Изд-во СПбГЭТУ
«ЛЭТИ», 2004. – с. 412.
3. Водовозов, В. М. Объектно-ориентированное программирование на
С++ : учебное пособие. / В. М. Водовозов, Ф. В. Чмиленко. – СПб. :
Изд-во СПбГЭТУ «ЛЭТИ», 2007. –с. 387.
4. Коплиен, Дж. Программирование на С++ / Дж. Коплиен. – СПб. :
ПИТЕР, 2005. – 624 с.
5. Лаптев, В. В. С++. Объектно-ориентированное програм-мирование / В.
В. Лаптев. – СПб. : Питер, 2008. – 389 с.
6. Павловская, Т. А. С/С++. Программирование на языке высокого
уровня : учебник для вузов / Т. А. Павловская. – СПб. : Питер, 2010. – с.
467.
7. Павловская, Т. А. С/С++. Структурное и объектно-
ориентированное программирование : практикум / Т. А. Павловская, Ю.
А. Щупак. – СПб. : Питер, 2010. – 329 с.
8. Пахомов, Б. И. С/С++ и MS Visual C++ 2010 для начинающих. – СПб. :
БХВ-Петербург, 2011. – 736 с. : ил. + дистрибутив (на DVD).
9. Понамарев, В. А. Программирование на C++/C# в Visual Studio. NET /
В. А. Пономарев. – СПб. : БХВ-Петербург, 2004. – 562 с.
10. Хортон, Айвор Visual C++ 2005: базовый курс : пер. с англ. / Хор-тон
Айвор. – М. : ООО «И. Д. Вильямс», 2007. – 1152 с. : ил. – Парал. тит.
англ.
11. Кнут Д. Искусство программирования. Доступно:
http://lib.ru/CTOTOR/KNUT/
12. Ресурс по программированию. Доступно: http://physics-for-
students.ru/bookpc/informatika/slovar.zip
13. Языки программирования. Доступно: http://cppstudio.com/

80
ПРИЛОЖЕНИЕ А

Министерство образования и науки Российской Федерации


Федеральное агентство по образованию
Государственное образовательное учреждение
высшего профессионального образования
«Северо-Кавказский государственный технический университет»
Кафедра инфокоммуникаций

КУРСОВАЯ РАБОТА
ПО ДИСЦИПЛИНЕ «ПРОГРАММИРОВАНИЕ
НА ЯЗЫКЕ ВЫСОКОГО УРОВНЯ»

Автор работы:_____________________
Специальность:____________________
Группа:___________________________

Руководитель работы:_______________
(звание, уч. степень)

__________________________________
(Фамилия, И.О.)

Работа защищена с оценкой:_________


__________________________________

Ставрополь
200_

81
ПРИЛОЖЕНИЕ Б

1 СОЗДАНИЕ ПРОСТЕЙШЕЙ ПРОГРАММЫ НА ЯЗЫКЕ


VISUAL С++

1.1.1 Элемент управления Form

Основной частью визуального приложения является форма. Поэтому


при программировании очень важно уделять внимание внешнему виду форм
и функциям. Итак, форма представляет собой пустую доску, которую
разработчик оснащает элементами управления, формируя интерфейс
пользователя, и кодом для управления данными. Для этого Visual Studio
обеспечивает интегрированную среду разработки, способствующую
написанию кодов, а также расширенный набор элементов управления .NET
Framework. Дополняя функциональными возможностями этих элементов
управления свои коды, пользователь может легко и быстро разработать
необходимое приложение.
При создании проекта в Visual Studio создается объект,
называемый формой. Пример формы показан на рис. 1.1.

Рисунок 1.1 – Пример окна

Форма – это главный контейнер, на котором размещаются компоненты


среды разработки (см. рис. 1.2).

Рисунок 1.2 – Форма с размещенными компонентами

Как и любой объект, форма имеет свойства, методы и события. Для


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

Рисунок 1.3 – Окно «Свойства»


1.1.1.1 Свойства элемента управления Form. Основные свойства
формы отображены в таблице 1.1

Таблица 1.1 – Основные свойства Form


Название
Описание свойства
свойства
1 2
BackgroundColor Цвет фона окна. Данное свойство имеет тип класса color.
Если щелкнуть в поле напротив свойства, то появится кнопка
выпадающего списка. Щелкните по ней, и вы увидите панель
выбора цвета. Панель состоит из трех закладок: Custom
(Произвольные), Web (Web-цвета) и System (Системные).
Для окон желательно указывать один из системных цветов и
лучше, если это будет control для диалоговых окон и
window для окон, которые должны отображать данные.

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

Enabled Позволяет задать доступность окна. Если свойство равно


false, то компонент не будет реагировать на действия
пользователя, т. е. будет недоступен
Font Шрифт, который будет использоваться для вывода текста
поверх окна. Для окна это на первый взгляд не очень актуально.
Но большая актуальность этого свойства проявляется у
компонентов, которые содержат надписи. Чтобы изменить
шрифт, можно поступить двумя способами:
− выделить строку со свойством Font, и в правом углу
появится кнопка с тремя точками. Щелкните по ней, и вы
увидите стандартное окно задания свойств шрифта;
− свойство шрифта на самом деле является самостоятельным
классом Font со своими свойствами. Вы можете редактировать
их каждое в отдельности. Для этого нужно щелкнуть по кнопке
с крестиком слева от имени свойства.
В окне Properties свойства формы расступятся, уступив
место свойствам шрифта
ForeColor Цвет переднего плана, который чаще всего используется в
качестве цвета текста. Если вы посмотрите на доступные
свойства шрифта, то заметите, что среди них нет цвета. Цвет
текста задается через ForeColor
FormBorderStyle Стиль контура формы. Это свойство является перечислением, в
редакторе свойств появляется выпадающий список для выбора
из следующих элементов (рекомендуем на реальном
приложении попробовать установить каждое из свойств и
посмотреть результат лично):
− None – контура не будет;
− FixedSingle – тоненький фиксированный контур, не
позволяющий изменять размеры окна;
− Fixed3D – контур фиксированный, не позволяющий
изменять размеры окна, но трехмерный, создающий эффект
утопления окна;
− FixedDialog – похож на Fixedsingle, только в заголовке
окна не будет иконки. Такой контур чаще всего используют для
диалоговых окон;
− Sizable – стандартный контур, позволяющий изменять
размеры окна;
− FixedToolWindow – контур с очень тоненьким заголовком
окна, не позволяющий изменять размеры окна. Такие окна чаще
всего используются для окон с кнопками, например, окно
инструментов в Abode Photoshop;
− SizableToolWindow – то же самое, что и
FixedToolWindow, только с возможностью изменять размер
окна
84
Icon В этом свойстве можно задать иконку для формы.
Здесь тоже есть кнопка, которая вызывает стандартное окно для
открытия файла. Загруженная иконка попадет в resx-файл
формы
Location Положение окна относительно левого верхнего угла экрана.
Такое же свойство есть и у компонентов, нотам расстояние
отсчитывается от левого верхнего угла компонента родителя,
на поверхности которого находится наш элемент управления.
Данное свойство состоит из двух составляющих – Х и Y,
которые раскрываются, если щелкнуть по кнопке с крестиком
слева от имени свойства
MainMenustrip В этом свойстве можно задать компонент меню, который будет
использоваться в качестве главного меню для окна. Для этого
на форме должен стоять компонент класса Menustrip. Тогда
этот компонент можно будет выбрать из выпадающего списка
MaximizeBox Булево значение, которое определяет, должна либо
отображаться в заголовке окна кнопка максимизации окна.
Если у вас выбран стиль окна, не позволяющий изменять
размеры окна, то убедитесь, что это свойство равно false,
чтобы спрятать кнопку. Несмотря на то, что форма не
разрешает изменение размеров, кнопка максимизации без
проблем распахнет окошко на полный экран
MaximumSize Позволяет задать максимальные ширину и высоту окна.
Пользователь не сможет растянуть окно больше, чем указанные
размеры
MinimizeBox Булево значение, определяющее, нужно ли отображать кнопку
сворачивания окна
MinimumSize Минимальные размеры окна, менее которых окно не
Name Название формы и имя переменной объекта, которую вы
можете использовать в коде для доступа к свойствам объекта и
для вызова его методов
Оpacity Процент непрозрачности окна. По умолчанию свойство равно
100 %, т. е. окно абсолютно не прозрачно. Если нужно
наполовину просветить задний план, то можно установить
значение в 50 %
Padding Отступы от краев окна. Свойство состоит из пяти значений:
All, Left, Тор, Right, Bottom, что соответствует
отступам со всех сторон: слева, сверху, справа и снизу. Если
установить левый отступ в значение 10, то левая кромка окна
будет размером в 10 пикселов
Showicon Булево значение, определяющее, нужно ли показывать иконку
в заголовке окна
ShowinTaskBar Нужно ли отображать окно в Панели задач. Главное окно чаще
всего нужно отображать в Панели задач, а вот для дочерних и
диалоговых окон это свойство лучше отключать, иначе для
одного приложения для разных окон в Панели задач будет
создаваться несколько меток. Как правило, этого не должно
быть

85
Size Размер окна, его ширина и высота

StartPosition Начальная позиция окна. У этого свойства есть выпадающий


список для выбора одного из следующих значений:
− WindowsDefaultLocation – положение окна
определяется ОС;
− WindowsDefauitBounds – система будет определять не
только положение, но и размеры окна;
− CenterParent – расположить окно по центру
родительского окна. Это значение лучше всего использовать
для всех дочерних окон;
− Manual – расположение будет задаваться программистом
самостоятельно через свойство Location;
− CenterScreen – отцентрировать по центру экрана
Tag Очень интересное свойство, но оно абсолютно ни на что не
влияет. Но зачем тогда оно нужно? Вы можете сохранять в
этом свойстве любую дополнительную информацию, потому
что это свойство имеет тип object
Text Текстовый заголовок окна
TopMost Булево значение, которое определяет, должно ли окно
располагаться поверх других окон. Не злоупотребляйте этим
свойством в своих программах для главного окна, а если и
решите расположить окно поверх других, то дайте
пользователю возможность отключать эту особенность.
Многих пользователей раздражают окна, которые перекрывают
рабочую область, а вот использование этого свойства для
дочерних окон приложения может быть очень удобным.
Windowstate Состояние окна. Здесь можно указать одно из трех значений:
− Normal – нормальное состояние;
− Maximized – окно должно быть развернуто на весь экран;
− Minimized – окно должно быть минимизировано.

1.1.1.2 Методы элемента управления Form

Основные методы формы (Form) отображены в таблице 1.2.

Таблица 1.2 – Основные методы Form


Название Описание метода
метода
Close() Закрывает форму
Hide() Форма становится невидимой
Show() Выводит форму на экран
ShowDialog() Показывает форму в модальном режиме
Dispose() Форма разрушается и память, занятая ею, освобождается
Focus() Делает форму активной

86
1.1.1.3 События элемента управления Form

Основные события формы отображены в таблице 1.3.

Таблица 1.3 – Основные события Form


Название события Описание события
Activated Возникает, когда форма активизирована
Click Возникает при щелчке мышью на форме
Load Возникает перед первым выводом формы

1.1.2 Элемент управления TextBox

Компонент находится в списке All Windows Forms палитры


компонентов. Он задает многострочное или однострочное редактируемое
поле, через которые вводят (выводят) строчные данные.

1.1.2.1 Свойства элемента управления TextBox

Основные свойства элемента управления TextBox отображены в


таблице 1.4

Таблица 1.4 – Основные свойства TextBox


Название
свойства Описание свойства
AcceptsReturn Получает или задает значение, указывающее, что происходит в
многострочном элементе управления TextBox при нажатии
клавиши ENTER: создается новая строка текста или активируется
кнопка стандартного действия формы
AcceptsTab Получает или задает значение, указывающее, что происходит при
нажатии клавиши TAB в многострочном элементе управления:
вводится знак табуляции в текстовом поле или фокус ввода в форме
перемещается к следующему элементу управления в
последовательности переходов
Lines Получает или задает строки текста в элементе управления
«Текстовое поле»
Multiline Получает или задает значение, показывающее, является ли данный
элемент управления многострочным TextBox
PasswordChar Получает или задает знак, используемый для маскировки знаков
пароля, вводимых в однострочный элемент управления TextBox

87
ReadOnly Получает или задает значение, указывающее, является ли текст в
текстовом поле доступным только для чтения

ScrollBars Получает или задает значение, показывающее, какие полосы


прокрутки должны присутствовать в много строчном элементе
управления TextBox
Text Получает или задает текущий текст в текстовом поле TextBox

TextAlign Получает или задает способ выравнивания текста в элементе


управления TextBox

1.1.2.2 Методы элемента управления Textbox

Основные методы объекта Textbox отображены в таблице 1.5


Текст, отображаемый в элементе управления, содержится в свойстве
Text. По умолчанию в текстовом поле можно ввести до 2048 знаков.
Если свойству Multiline присвоить значение true, это позволит вводить
до 32 килобайт текста. Свойство Text может быть установлено в окне
«Свойства» во время разработки, программными средствами во время
выполнения или в результате ввода данных пользователем во время
выполнения.
Текущее содержимое текстового поля может быть получено во время
выполнения путем считывания значения свойства Text.
В следующем примере кода текст помещается в элемент управления во
время выполнения. Процедура InitializeMyControl не выполняется
автоматически, она должна быть вызвана.
private:
void InitializeMyControl()
{
// Запись текста в элемент управления TextBox, имеющего имя TextBox1.
textBox1->Text = "Это элемент управления TextBox.";
}
Таблица 1.5 – Основные методы TextBox
Название метода Описание метода
AppendText Добавляет строку к содержимому текстового элемента
управления
Clear Удаляет из текстового поля все его содержимое
Сору Копирует текущее выделение текста в элементе
управления, поддерживающем редактирование текста
CreateGraphic Задает объект Graphics для элемента управления
s
Cut Перемещает текущий выбор из текстового поля в буфер
обмена

88
DeselectAll Указывает, что значение свойства SeiectionLength
равно нулю для отмены выделения символов в элементе
управления
Dispose() Освобождает все ресурсы, используемые объектом
Focus Задает фокус ввода элемента управления
Hide Скрывает элемент управления от пользователя
Paste () Заменяет текущий выбор в текстовом поле содержимым
буфера обмена
Select() Активирует элемент управления
SelectAll Выбирает весь текст в текстовом поле
Show Отображает элемент управления для пользователя
Undo Отменяет последнюю операцию редактирования в
текстовом поле

1.1.2.3 События элемента управления TextBox .Основные события


элемента управления TextBox отображены в таблице 1.6.

Таблица 1.6 – Основные события TextBox


Название события Описание события
GotFocus Событие, возникающее в момент активизации окна
LostFocus Событие, возникающее в момент потери фокуса
KeyDown Событие, возникающее в момент движения нажимаемой
клавиши вниз
KeyPress Событие, возникающее при удержании нажатой
клавиши
KeyUp Событие, возникающее при отпускании нажатой
клавиши
Change Событие, возникающее при изменении, добавлении или
удалении очередного символа в поле ввода

Рассмотрим пример использования события KeyDown для определения


типа символа, введенного в элемент управления.
// Булево значение flag используется для определения символа, отличного от
числа
private:
bool nonNumberEntered;
// Обработка события KeyDown для определения символа, введенного в
элемент управления
void textBox1_KeyDown (Object^, System: :Windows:
:Forms: :KeyEventArgs^ e)
{
// Присваивает значение переменной flag равным false
nonNumberEntered = false;
89
// Определяет, является ли введенный символ числом, введенным с верхней
части клавиатуры
if (e->KeyCode < Keys::D0 || e->KeyCode > Keys::D9)
{
// Определяет, является ли введенный символ числом, введенным с цифровой
части клавиатуры
if (e->KeyCode<Keys::NumPad0||e->KeyCode>
Keys::NumPad9)
{
// Определяет, является ли введенный символ символом Backspace
if ( e->KeyCode != Keys::Back )
{
// Введен нецифровой символ
// Устанавливается flag в true и анализируется в событии KeyPress
nonNumberEntered = true;
}
}
}
// Если клавиша Shift нажата, это не число
if (Control::ModifierKeys == Keys::Shift) {
nonNumberEntered = true;
}
}
// Это событие происходит после события KeyDown и может быть использовано для
предотвращения ввода символов в элемент управления
void textBox1_KeyPress(Object^,System::Windows::Forms:
:KeyPressEventArgs^ e )
{
// Проверяет flag, установленный в событии KeyDown
if ( nonNumberEntered == true )
{
// Прекращает ввод нечислового символа в элемент управления
e->Handled = true;
}
}

1.1.3 Элемент управления Button

Элемент управления Windows Forms Button (кнопка) служит для


выполнения действия с помощью мыши. На элементе управления Button
может отображаться как текст, так и рисунок. Если нажать кнопку, она
выглядит так, словно она нажата и отпущена. При нажатии на кнопку
вызывается обработчик событий Click. В обработчик событий Click
помещается код, отвечающий за выполнение нужного действия.
Текст, отображающийся на кнопке, содержится в свойстве Text. Если
90
текст превышает ширину кнопки, он переходит на следующую строку.
Однако если высота элемента управления не может изменяться, текст
обрезается. Свойство Text может содержать клавишу доступа, что позволяет
пользователю выполнять действие, аналогичное щелчку элемента
управления, нажав клавишу ALT одновременно с клавишей доступа.
Внешний вид текста управляется свойством Font и свойством TextAlign.
с элементе управления Button можно также отображать рисунки с
помощью свойств Image и ImageList.

1.1.3.1 Свойства элемента управления Button

Основные свойства элемента управления Button отображены в таблице 1.7


Таблица 1.7 – Основные свойства Button
Название
Описание свойства
свойства
1 2
Anchor Возвращает или задает границы контейнера, с которым связан
элемент управления, и определяет способ изменения размеров
элемента управления при изменении размеров его родительского
элемента
AutoEllipsis Получает или задает значение, указывающее, отображается ли
знак многоточия (...) в правом углу элемента управления,
обозначающий, что текст элемента управления выходит за
пределы указанной длины этого элемента
AutoSize Получает или задает значение, указывающее, основано ли
изменение размеров элемента управления на его содержимом
Capture Возвращает или задает значение, определяющее, была ли мышь
захвачена элементом управления
DialogResult Возвращает или задает значение, возвращаемое в родительскую
форму при нажатии кнопки
Dock Возвращает или задает границы элемента управления,
прикрепленные к его родительскому элементу управления, и
определяет способ изменения размеров элемента управления с
его родительским элементом управления
FlatAppearance Возвращает внешний вид границ и цвета, используемые для
определения состояния флажка и состояние мыши
FlatStyle Получает или задает плоский внешний вид для кнопки
Image Получает или задает изображение, отобра жаемое в кнопке
ImageAlign Получает или задает выравнивание изобра жения в кнопке
ImageIndex Получает или задает значение индекса списка изображений для
изображения, отображаемого в кнопке

91
TabIndex Возвращает или задает последовательность перехода элемента
управления внутри контейнера
TabStop Получает или задает значение, показывающее, может ли
пользователь перевести фокус в данный элемент управления при
помощи клавиши ТАВ
TextImageRelat Получает или задает метаположение текста и изображения
ion относительно друг друга

Возвращает или задает границы контейнера, с которым связан


Anchor элемент управления, и определяет способ изменения размеров
элемента управления при изменении размеров его родительского
элемента
UseMnemonic Получает или задает значение, которое указывает, должен ли
первый знак, следующий за знаком амперсанда (&),
использоваться как мнемонический ключ элемента
UseVisualStyle Получает или задает значение, которое указывает, должен ли фон
BackColor рисоваться с использованием стилей оформления (если они
поддерживаются)
Visible Получает или задает значение, указывающее, отображаются ли
элемент управления и все его дочерние элементы управления

1.1.3.2 Методы элемента управления Button

Основные методы элемента управления Button отображены в таблице


1.8

Таблица 1.8 – Основные методы Button


Название метода Описание метода
Hide Скрывает элемент управления от пользователя
Focus Задает фокус ввода элемента управления
Select() Активирует элемент управления
Show Отображает элемент управления для пользователя

1.1.3.3 События элемента управления Button

Основные события элемента управления Button отображены в


таблице 1.9

Таблица 1.9 – Основные события Button


Название события Описание события
Click Происходит при щелчке элемента управления
Enter Происходит при входе в элемент управления
92
MouseHover Происходит, когда указатель мыши задерживается на
элементе управления
MouseLeave Происходит, когда указатель мыши покидает элемент
управления

Чаще всего элемент управления Button в Windows Forms


используется для выполнения какой-либо программы при нажатии кнопки.
Щелчок элемента управления Button вызывает также некоторые
другие события, например MouseEnter, MouseDown и MouseUp. Если
требуется вложить обработчики событий для таких событий, связанных с
основным, нужно убедиться, что их действия не конфликтуют. Например,
если нажатие кнопки удаляет сведения, введенные пользователем в текстовое
поле, при наведении указателя мыши на кнопку не должна появляться
подсказка с несуществующими сведениями.
Если дважды щелкнуть элемент управления Button, каждый щелчок
будет обрабатываться отдельно; другими словами, этот элемент управления
не поддерживает событие двойного щелчка.
Пример. Для того, чтобы при нажатии на кнопку появилось сообще-
ние, необходимо написать следующий обработчик события Сlick кнопки с
именем Вutton1.
private:
void button1_Click(System::Object ^ sender, System::EventArgs
^ e)
{
MessageBox::Show("button1 нажата");
}

1.1.4 Элемент управления ListView

В элементе управления Windows Forms ListView отображается


список элементов со значками. Представление в виде списка может
использоваться для создания пользовательского интерфейса, аналогичного
правой области окна Windows Explorer.
Для этого элемента управления предусмотрено четыре режима
представления: LargeIcon (крупные значки), SmallIcon (мелкие значки),
List (список) и Details (таблица). В режиме LargeIcon рядом с текстом
элементов отображаются крупные значки; если элемент управления
достаточно большой, элементы появляются в нескольких столбцах. Режим
SmallIcon аналогичен предыдущему, за исключением того, что
отображаются мелкие значки. В режиме List отображаются мелкие значки,
но всегда в одном столбце. В режиме Details элементы отображаются в
нескольких столбцах.

1.1.4.1 Свойства элемента управления ListView.


93
Основные свойства элемента управления ListView отображены в
таблице 1.10

Таблица 1.10 – Основные свойства ListView


Название
Описание свойства
свойства
Items Получает коллекцию, содержащую все элементы
в данном элементе управления
SelectedItems Получает элементы, выбранные в данном элементе
управления
MultiSelect Возвращает или задает значение, указывающее, возможен
ли выбор нескольких элементов
CheckBoxes Возвращает или задает значение, указывающее, будет ли
в данном элементе управления отображаться флажок
рядом с каждым элементом
StateImageList Возвращает или задает список imageList,
сопоставленный с устанавливаемыми приложением
состояниями в этом элементе управления
Activation Возвращает или задает тип действия, который должен
выполнить пользователь для активации элемента
HotTracking Возвращает или задает значение, указывающее,
принимает ли текст элемента или подэлемента форму
гиперссылки, когда на него наводится указатель мыши
GridLines Возвращает или задает значение, показывающее, будут ли
видны в элементе управления линии сетки между
строками и столбцами, содержащими элементы и
подэлементы
LabelEdit Возвращает или задает значение, указывающее, может ли
пользователь изменять метки элементов в данном
элементе управления (надо щелкнуть текст элемента,
чтобы перевести его в состояние редактирования)
Groups Получает коллекцию объектов ListviewGroup,
назначенную элементу управления

1.1.4.2 Методы элемента управления ListView

Основные методы элемента управления ListView отображены в


таблице 1.11

94
Таблица 1.11 – Основные методы ListView
Название метода Описание метода
Clear Удаляет все элементы и столбцы из данного элемента
управления
Contains Получает значение, показывающее, является ли
указанный элемент управления дочерним элементом
CreateGraphics Задает объект Graphics для элемента управления
BeginUpdate Запрещает прорисовку элемента управления до вызова
метода EndUpdate
EndUpdate Возобновляет прорисовку элемента управления списка
после того, как она была приостановлена методом
BeginUpdate
Hide Скрывает элемент управления от пользователя
Select() Активирует элемент управления
SelectNextControl Активирует следующий элемент управления
Show Отображает элемент управления для пользователя
Sort Сортирует элементы в представлении списка
Update Вызывает перерисовку элементом управления
недопустимых областей клиентской области

1.1.4.3 События элемента управления ListView

Основные события элемента управления ListView отображены в


таблице 1.12.

Таблица 1.12 – Основные события ListView


Название события Описание события
Click Происходит при щелчке элемента управления
I temActivate Происходит при активизации элемента
ItemCheck Происходит при изменении состояния флажка
элемента
ItemMouseHover Происходит при наведении указателя мыши на
элемент
ItemSe1ectionChanged Происходит при изменении состояния выбора
элемента
Validated Происходит по завершении проверки элемента
управления
95
Validating Происходит при проверке элемента управления

Основным свойством элемента управления ListView является


свойство Items, содержащее элементы, отображаемые элементом
управления. Свойство SelectedItems содержит коллекцию элементов,
выбранных в настоящий момент в элементе управления. Если для свойства
MultiSelect задано значение true, пользователь имеет возможность
выбрать несколько элементов, например, перетащить сразу несколько
элементов в другой элемент управления. Если для свойства CheckBoxes
задано значение true, в элементе управления ListView рядом с
элементами могут отображаться флажки.
Свойство Activation определяет тип действия, которое должен
выполнить пользователь, чтобы активировать элемент в списке. Возможные
варианты: Standard, OneClick и TwoClick. Активация OneClick
означает, что для активации элемента требуется сделать один щелчок. Для
активации TwoClick требуется, чтобы пользователь дважды щелкнул
активируемый элемент; одиночный щелчок изменит цвет текста элемента.
Для активации Standard требуется, чтобы пользователь дважды щелкнул
активируемый элемент, но внешний вид элемента при этом не изменяется.
Элемент управления ListView также поддерживает визуальные стили
и другие возможности, предоставляемые платформой Windows XP, включая
группирование, мозаичное представление и метки вставки.

1.1.5 Элемент управления RadioButton

Элемент управления Windows Forms RadioButton


(переключатель) обеспечивает выбор из двух или более взаимоисключающих
вариантов. Функции переключателей и флажков могут показаться схожими,
но между ними есть важное отличие: в случае переключателя пользователь
может выбрать лишь один вариант. Однако флажков можно выбрать любое
количество. Определяя группу значений переключателя, разработчик формы
предлагает пользователю набор вариантов, из которых может быть задан
один и только один.
При щелчке элемента управления RadioButton, его свойству
Checked присваивается значение true и вызывается обработчик событий
Click. При изменении значения свойства Checked происходит событие
CheckedChanged. Если свойство AutoCheck имеет значение true
(принимается по умолчанию), то при выборе одного значения переключателя
остальные значения группы автоматически сбрасываются. Обычно этому
свойству присваивают значение false только в тех случаях, когда в коде
предусмотрена проверка допустимости выбранного варианта переключателя.
Текст, связанный с этим элементом управления, задается свойством Text,
которое также может определять клавиши быстрого доступа. Клавиша
96
доступа позволяет пользователю щелкнуть другой элемент управления,
используя сочетание клавиши ALT и заданной клавиши. Элемент управления
RadioButton может выглядеть как кнопка команды, которая отображается
как нажатая при выбранном значении переключателя, если свойство
Appearance имеет значение Button. В переключателях можно также
отображать рисунки с помощью свойств Image и ImageList.
1.1.5.1 Свойства элемента управления RadioButton

Основные свойства элемента управления RadioButton отображены в


таблице 1.13

Таблица 1.13 – Основные свойства RadioButton


Название Описание свойства
свойства
Appearance Получает или задает значение, определяющее внешний ВИД
переключателя RadioButton
AutoCheck Получает или задает значение, показывающее, будет ли
автоматически изменяться значение Checked и внешний
вид элемента управления, когда он выбирается щелчком
Image Получает или задает изображение, отображаемое в кнопке
ImageList Получает или задает свойство imageList, содержащее
изображение image, отображенное в кнопке
Checked Получает или задает значение, показывающее, выбран ли
данный элемент управления

1.1.5.2 Методы элемента управления RadioButton

Основные методы элемента управления RadioButton отображены в


таблице 1.14.

Таблица 1.14 – Основные методы RadioButton


Название метода Описание метода
Contains Получает значение, показывающее, является ли
указанный элемент управления дочерним элементом
CreateGraphics Задает объект Graphics для элемента управления
Focus Задает фокус ввода элемента управления
IsInputChar Определяет, является ли символ входным символом,
который распознается элементом управления
IsInputKey Определяет, является ли заданная клавиша обычной
клавишей ввода или специальной клавишей,
нуждающейся в предварительной обработке

97
1.1.5.3 События элемента управления RadioButton

Основные события элемента управления RadioButton отображены в


таблице 1.15.

Таблица 1.15 – Основные события RadioButton


Название события Описание события
CheckedChanged Происходит при изменении значения свойства Checked
Click Происходит при щелчке элемента управления
Disposed Происходит при удалении компонента вызовом метода
Dispose
Enter Происходит при входе в элемент управления

1.1.6 Элемент управления CheckBox

Компонент CheckBox (кнопка с независимой фиксацией – флажок


Windows) .
Компонент расположен в группе Common Controls палитры
компонентов. CheckBox используется как флажок-переключатель и
позволяет пользователю выбрать / отменить определенную опцию, т. е.
выдает результат «включен / выключен».
Если компонент Сheckbox находится в группе себе подобных, то,
включив один Сheckbox, можно включать и остальные, при этом ни один из
них не выключится (т. е. не изменит своего состояния). Отличие компонента
Сheckbox от компонента RadioButton заключается в том, что
одновременно может быть включено несколько Сheckbox’ов, а компонент
RadioButton размещенный на форме может быть включен только один и
если мы включаем другой компонент RadioButton, то первый отключается
автоматически.
Этот компонент соответствуют математическим понятиям конъюнкции
и дизъюнкции. Когда мы говорим «находится в группе», то имеется в виду,
что у множества таких компонентов один родитель (например, одна панель).

1.1.6.1 Свойства элемента управления CheckBox

Основные свойства элемента управления CheckBox отображены в


таблице 1.16.

Таблица 1.16 – Основные свойства CheckBox


Название Описание события
события
98
Appearance Определяет форму появления компонента (в виде
обычного флажка или в виде кнопки)
BackColor Цвет компонента
BorderColor Задает цвет обрамления компонента
BorderStyle Задает стиль границы компонента CheckBox
BorderWidth Задает ширину границы компонента
Checked По этому свойству в режиме исполнения приложения
можно определить, включен или выключен флажок
CheckAlign Свойство, позволяющее открыть выпадающий список,
где можно выбрать схему размещения флажка в поле
компонента (его можно разместить в девяти местах
окна компонента, но при этом Appearance должно
быть не кнопкой)
Font Возвращает свойства шрифта
ForeColor Задает основной цвет (обычно цвет текста)
Fiatstyle Определяет стиль появления компонента
Height Задает высоту элемента управления
Text Задает текст подписи, связанной с CheckBox
TextAlign Задает выравнивание текста, связанного с CheckBox
Visible Включает / отключает отображение компонента
Width Задает ширину элемента управления

1.1.6.2Методы элементауправления CheckBox

Основные методы элемента управления CheckBox отображены в


таблице 1.17.

Таблица 1.17- Основныеметоды CheckBox


Название
Описание события
события
1 2
ApplyStyle Копирует любой непустой элемент указанного стиля,
замещающего все существующие элементы стиля
управления
DataBind () Связывает источник данных к вызванному сервер-
ному элементу управления и всем его дочерним
элементам
FindForm Позволяет объекту освободить ресурсы и выполнить
другие операции очистки
Focus Задает фокус ввода элемента управления
LoadViewState Загружает предварительно сохраненное состояние
CheckBox управления

99
OnCheckedChanged Повышает CheckedChanged событие CheckBox
управления. Это позволяет обрабатывать событие
напрямую
OpenFile Получает поток, используется для чтения файлов
SaveViewState Сохраняет изменения в CheckBox
ToString Возвращает строку, которая представляет текущий
объект
1.1.6.3 События элементауправления CheckBox

Основные события элемента управления CheckBox отображены в


таблице 1.18.

Таблица 1.18 - Основные события CheckBox


Название события Описание события
CheckedChanged Возникает при каждом изменении свойства Check
Click Возникает при щелчке элемента управления
DragDrop Возникает при завершении операции
перетаскивания
EnabledChanged Происходит, когда изменяется включенное
состояние этого элемента управления
Enter Происходит, когда элемент управленя становится
активным элементом управления данной формы
FontChanged Событие возникает, когда в Control изменяется
значение свойства Font
ForeColorChanged Событие возникает, когда в Control изменяется
значение свойства ForeColor
KeyDown Происходит в момент первого нажатия клавиши
KeyPress Возникает, когда этот элемент находится в фокусе и
пользователь нажимает и отпускает клавишу
KeyUp Происходит в момент отпускания клавиши
Leave Происходит, когда элемент управления перестает быть
активным элементом управления данной формы
MouseClick Возникает при щелчке мышью на элементе
TextChanged Событие возникает, когда в Control изменяется
значение свойства Text
VisibleChanged Происходит, когда изменяется видимость этого
элемента управления

1.1.7 Элемент управления ListBox

Компонент находится в списке All Windows Forms палитры


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

1.1.7.1 Свойства элемента управления ListBox

Основные свойства элемента управления ListBox отображены в


таблице 1.19.
Таблица 1.19 - Основные свойства ListBox
Название события Описание события
BackColor Фоновый цвет компонента
BorderStyle Задает тип границы, отображаемой вокруг ListBox
ColumnWidth Задает ширину колонки списка при многоколоночном
списке
Находит количество элементов в списке, значение
Count которого всегда на единицу больше индекса
последней строки списка, потому что последний
отсчитывается от нуля
DataSource Задает источник данных, с помощью которого можно
заполнять список
Font Параметры шрифта
ForeColor Цвет фона компонента ListBox
MultiColumn Если для свойства MultiColumn задано значение
true, элементы списка отображаются в нескольких
столбцах и появляется горизонтальная полоса
прокрутки. Это позволяет отобразить больше
позиций списка и устраняет необходимость его
вертикальной прокрутки для поиска нужной позиции.
Если для свойства MultiColumn задано значение
false, элементы списка отображаются в одном
столбце и появляется вертикальная полоса про крутки
SelectedIndex Возвращает целочисленное значение, которое
соответствует первому элементу в списке выбранных.
Если выборка оказалась пустой, то значение этого
свойства устанавливается в -1. Значение индекса в
списке изменяется от нуля. При многострочной
выборке это свойство возвращает индекс первого
элемента из списка выбранных
ScrollAlways- Если задано значение true, полоса прокрутки
Visible появляется независимо от числа элементов
SelectedItem Возвращает выбранный элемент
SelectionMode Свойство определяет, сколько элементов списка
можно выбрать одновременно
TabStop Указывает, может ли пользователь переключать
фокус на этот элемент управления клавишей TAB
101
Visble Указывает, отображается ли данный элемент или
скрыт

1.1.7.2 Методы элемента управления ListBox

Основные методы элемента управления ListBox отображены в


таблице 1.20.

Таблица 1.20 – Основные методы ListBox


Название события Описание события
CreateGraphics() Создает графический объект для listBox1
FindString() Позволяет найти в списке позицию, содержащую
определенную строку поиска
Measurestring Метод, который измеряет длину строки в
(string,Font) пикселах, выводимую данным шрифтом (разные
шрифты принимают на экране разное количество
пикселов)

1.1.7.3 События элемента управления ListBox

Основные события элемента управления ListBox отображены в


таблице 1.21.

Таблица 1.21 – Основные события ListBox


Название события Описание события
Add () Добавить элемент в конец списка
Insert () Вставить элемент внутрь списка
Сlear () Удалить все элементы из списка (очищает список)
Click() Возникает при щелчке элемента управления
Remove () Удалить заданный элемент из списка

Извлечь строки из компонента можно так:


String ^it= ListBoxl->Items[i]->ToString();
где i – номер строки (начинается с нуля).
Обнаружить строку, на которой был щелчок мыши (обработка события
click), можно так:
String^it = this-> listBoxl-> Items [this-> listBoxl->
Select-edlndex] -> ToString();
где Selectedindex – индекс выбранной строки.

1.1.8 Элемент управления GroupBox

Довольно часто вместо отдельных переключателей используют их


102
групповой контейнер – компонент GroupBox, который расположен в группе
All Windows Forms палитры компонентов.
Вообще GroupBox используют, чтобы обеспечить разделение
компонентов на различные группы, которые становятся для них родителями,
для того чтобы компоненты унаследовали некоторые свойства своих
родителей. Обычно так делают, чтобы подразделить форму на несколько
функций и дизайн осуществлять удобнее: перемещая только GroupBox, мы
одновременно перемещаем все компоненты, которые в нем находятся.
Перечень свойств компонента отображается в окне Properties
(никаких новых свойств, по сравнению с ранее встречавшимися, мы тут не
находим).

1.1.8.1 Свойства элемента управления GroupBox. Основные свойства


элемента управления GroupBox отображены в таблице 1.22.

Таблица 1.22 – Основные свойства GroupBox


Название
Описание свойства
свойства
Anchor Определяет грани контейнера, к которому привязан опре-
деленный элемент управления
AutoSize Определяет, будет ли размер элемента управления автомати-
чески изменятся в соответствии с размером его содержимого
BackColor Фоновый цвет компонента
Dock Указывает, какие границы элемента управления привязаны
к контейнеру
Enabled Указывает, включен ли элемент управления
Font Параметры шрифта
ForeColor Основной цвет для отображения текста в данном элементе
управления
Text Задает текст подписи, связанной с CheckBox
Visble Указывает, отображается ли данный элемент или скрыт

1.1.8.2 Методы элемента управления GroupBox

Основные методы элемента управления GroupBox отображены


в таблице 1.23.

Таблица 1.23 – Основные методы GroupBox


Название
Описание метода
метода
Focus Задает фокус ввода элемента управления
Hide Скрывает элемент управления от пользователя
OnClick Вызывает событие Click
103
OnDoubleClick Вызывает событие DoubleClick
ResetBackColor
Сбрасывает свойство BackColor в значение по умол-
чанию
ResetFont Сбрасывает свойство Font в значение по умолчанию
ResetText Сбрасывает свойство Text в значение по умолчанию
Select() Активирует элемент управления
SetBoundsCore Задает указанные границы данного элемента
управления
SetVisibleCore
Задает элемент управления в указанном видимом
состоянии
Show Отображает элемент управления для пользователя
1.1.8.3 События элемента управления GroupBox

Основные события элемента управления GroupBox отображены в


таблице 1.24.

Таблица 1.24 – Основные события GroupBox


Название события Описание события
AutoSizeChanged
Происходит при изменении значения свойства
AutoSize
Происходит при изменении значения свойства
BackColorChanged
BackColor
Происходит при щелчке элемента управления
Click
GroupBox
Вызывается при двойном щелчке мышью элемента
DoubleClick
управления GroupBox
Enter Происходит при входе в элемент управления
Генерируется при получении фокуса элементом
GotFocus
управления
Происходит, когда фокус ввода покидает элемент
Leave
управления
Move Происходит при перемещении элемента управления
Происходит при изменении размеров элемента
Resize
управления
SizeChanged
Генерируется при изменении значения свойства
Size
Происходит при изменении стиля элемента
StyleChanged
управления
SystemColorsChanged Происходит при изменении системных цветов
TextChanged Происходит при изменении значения свойства Text

104
VisibleChanged
Происходит при изменении значения свойства Visible

1.1.9 Элементуправления PictureBox

Компонент находится в списке All Windows Forms палитры


компонентов. Через этот компонент в форму выводится графическое
изображение.
Какое изображение надо выводить, указывается в свойстве Image.
Если нажать кнопку с многоточием в поле этого свойства, то откроется
диалоговое окно для выбора объекта в форматах bmp, jpeg, icon, gif,
png.
Можно также загрузить изображение в форму, воспользовавшись
свойством ImageLocation и методами Load () и LoadAsync ().
Компонент содержит в себе свойства, определяющие, как выводить
изображение внутри границ самого этого объекта (в форме PictureBox
отображается в виде пустого квадрата).
Свойство Image – задает изображение, загружаемое в компонент (в
поле этого свойства имеется кнопка с многоточием, с помощью которой
открывается диалоговое окно для загрузки изображения).
Можно загружать и сохранять изображение также и в режиме
исполнения приложения с помощью методов класса PictureBox.
Так, например, Load() позволяет загружать изображение из файла,
путь которому указан в свойстве imageLocation. Если в этом свойстве не
задавать пути, а указать его в переменной типа string, то с помощью
метода в форму Load (Url) также можно загрузить изображение. В этом
случае метод Load () сам назначит свойству imageLocation значение
переменной url и далее станет работать как этот же метод в своей первой
форме (т. е. без параметра).

1.1.9.1 Свойства элемента управления PictureBox

Основные свойства элемента управления PictureBox отображены в


таблице 1.25.

Таблица 1.25 – Основные свойства PictureBox


Название
Описание свойства
свойства
Anchor Определяет грани контейнера, к которому привязан опре-
деленный элемент управления
BackColor Фоновый цвет компонента.

105
BorderStyle Возвращает или задает стиль границы для элемента
управления
Dock Указывает, какие границы элемента управления привяза-
ны к контейнеру
Image Изображение, отображаемое в PictureBox
Enabled Указывает, включен ли элемент управления
Font Параметры шрифта
SizeMode Определяет, как будет обрабатываться размещение ри-
сунка в данной области рисунка и изменение размеров
элемента управления
Visble Указывает, отображается ли данный элемент или скрыт

1.1.9.2 Методы элемента управления PictureBox

Основные методы элемента управления PictureBox отображены в


таблице 1.26.

Таблица 1.26 – Основные методы PictureBox


Название метода Описание метода
Focus Задает фокус ввода элемента управления
GetScaledBounds Задает границы, внутри которых масштабируется
элемент управления
Hide Скрывает элемент управления от пользователя
InvokeOnClick Вызывает событие сlik для указанного элемента
управления
Load() Отображает изображение, указанное в свойстве
ImageLocation объекта PictureBox
Load(String) Задает значение свойства imageLocation, равное
указанному URL-адресу, и отображает указанное
изображение
OnClick Вызывает событие ciick
OnEnter Вызывает событие Enter
OnLeave Вызывает событие Leave
OnPaintBackground Рисует фон элемента управления
ProcessKeyMessage Обрабатывает сообщение клавиатуры
Scale(SizeF) Масштабирует элемент управления и любые его
дочерние элементы с использованием заданного
коэффициента масштабирования
Select() Активирует элемент управления
Show Отображает элемент управления для пользователя

106
1.1.9.3 События элемента управления PictureBox
Основные события элемента управления PictureBox отображены в
таблице 1.27.

Таблица 1.27 – Основные события PictureBox


Название события Описание события
BackColorChanged происходит при изменении значения свойства
BackColor.
Click Происходит при щелчке элемента управления
FontChanged Происходит при изменении значения свойства Font
ForeColorChanged Происходит при изменении значения свойства
ForeColor
GotFocus Генерируется при получении фокуса элементом
управления
Leave Происходит при потере фокуса ввода объектом
PictureBox
Resize Происходит при изменении размеров элемента
управления
VisibleChanged Происходит при изменении значения свойства
Visible

1.1.10 Элемент управления Label

Элементы управления Windows Forms Label предназначены для


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

1.1.10.1 Свойства элемента управления Label

Основные свойства элемента управления Label отображены в таблице


1.28.

Таблица 1.28 – Основные свойства Label

107
Название свойства Описание свойства
BorderStyle Возвращает или задает стиль границы для
элемента управления
TextAlign Возвращает или задает выравнивание текста
в метке
Text Получает или задает текст, сопоставленный с
этим элементом управления
UseMnemonic Возвращает или задает значение, показываю-
щее, интерпретируется ли знак амперсанда
(&) в свойство Text элемента управления как
знак префикса для ключа доступа

Остальные свойства аналогичны ранее рассматриваемым свойствам


предыдущих компонентов.

1.1.10.2 Методы элемента управления Label. Методы компонента


Label в основном совпадают с методами ранее рассмотренных
компонентов.

1.1.10.3 События элемента управления Label. События компонента


Label в основном совпадают с событиями ранее рассмотренных
компонентов.

2. УСЛОВНЫЕ ОПЕРАТОРЫ. ВЫЧИСЛЕНИЕ ЗНАЧЕНИЯ


ФУНКЦИИ, ЗАДАННОЙ УСЛОВНО

В языке программирования С++ используются несколько конструкций


для принятия решений:
− оператор if;
− оператор switch;
− условный оператор ? (оператор условия).
Для прерывания программного цикла при некотором условии
применяется утверждение (оператор) break, для продолжения итераций
цикла при выполнении некоторых условий применяется утверждение
(оператор) continue, для выхода из функции при выполнении некоторых
условий применяется оператор return, для перехода к заданному месту
программы применяется оператор goto, хотя считается, что в
программировании не существует ситуаций, в которых нельзя обойтись без
оператора goto. Утверждение break применяется также в телеоператора
108
switch.

2.1.1 Условный оператор if в языке программирования С++

Общая форма записи оператора if:


if (условие) {действие};
В операторе if используется результат вычисления условия,
заключенного в круглые скобки, на основе которого принимается решение.
Результат вычисления условия (действие) может быть арифметическим или
логическим. Если результат выполнения условия будет истинным, то
возможно выполнить несколько действий. Для этого следует использовать
фигурные скобки, например:
if (условие)
{

действие1; действие2;
...
}

2.1.2 Конструкция if–else

Общая форма записи конструкции if–else:

if (условие)действие1; else
действие2;
Если выполняется условие, то будет выполняться фрагмент программы
действие1, в противном случае будет выполняться действие2.
Каждое из утверждений может быть множественным. В таком случае
применяются фигурные скобки:
if (условие)
{
действие1; действие2;
...
}
else
{
действие3; действие4;
...
}

2.1.3 Конструкция if–else if–else if–...–else

Форма записи конструкции if–else if–else if–...–else:

if (условие1)
действие1;

109
else if (условие2)
действие2;

else if (условие3)
действие3;
...
else
действие;

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


ситуаций, когда проверяются условия условие1, условие2, условие3, ...
.
Соответственно будут выполняться действия: действие1, действие2,
дей-ствие3 и т. д. В случае, когда ни одно из условий не выполняется,
выполняются действия, прописанные после оператора else.

В случае выполнения множественных действий применяются фигурные


скобки для каждого из утверждений:
if (условие1)
{
действие1;
...
}
else if (условие2)
{
действие2;
...
}
else if (условие3)
{
действие3;
...
}
...
else
{
действие;
...
}

2.1.4 Оператор switch

Общая форма записи оператора switch:

switch (условие) { case значение1: действие;


...
break;
case значение2:
действие;

110
...
break;
...
case значениеn: действие;
...
break;
default:
действие;
...
break;
}
Выражение заключенного в круглые скобки оператора последовательно
сравнивается со значениями: значение 1, значение 2, ..., значение n,
которые должны быть простыми константами или константными
выражениями. В том случае, когда одно из этих значений равно значению,
выполняются утверждения, которые следуют за данным значением.
Утверждение break сигнализирует об окончании выполнения
утверждений и приводит к выходу из оператора switch. Утверждение
break ставится в конце каждого варианта выбора. Если этого не сделать, то
выполнение последовательности утверждений перейдет в следующий
вариант выбора и будет выполняться до тех пор, пока не встретится
утверждение break.
Специальный дополнительный вариант default будет выполнен в
том случае, когда не будет найдено ни одного совпадения.
Операторы if и switch той или иной синтаксической конструкции
существуют практически во всех языках программирования (в первую
очередь языках высокого уровня), и их часто называют операторами
ветвления.

2.1.5 Условный оператор

В отличие от других операторов языка С++, которые могут быть


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

Общий формат записи оператора условия:

условие ? выражение_1 : выражение_2

Если в результате вычисления условия будет получено значение TRUE


(истина, не нуль), то выполняется выражение_1 и результатом выполнения
оператора условия будет значение, полученное при вычислении этого
выражения. Если в результате вычисления условия будет получено значение
FALSE (ложь, т. е. нуль), то выполняется выражение_2 и результатом
выполнения оператора условия будет значение, полученное при вычислении

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

2.1.6 Оператор break (от английского – прерывать)

Оператор или утверждение break служит для немедленного выхода из


цикла, будь то while, for или do–while. После выхода из цикла
выполнение программы продолжается с утверждения (фрагмента
программы), непосредственно следующего за циклом.
Если оператор break встречается во вложенном цикле (вложенных
циклах), то будет прекращено выполнение того цикла, в котором этот
оператор встретился.
Необходимость в использовании оператора прерывания break в теле
цикла возникает тогда, когда условие продолжения итераций нужно
проверять не в начале цикла (как в циклах while и for) и не в конце тела
цикла (как в цикле do–while), а в середине тела цикла.

Формат записи оператора break:


break;

2.1.7 Оператор continue (от английского – продолжать)

Оператор или утверждение continue служит для перехода к


следующей итерации цикла.
Оператор continue противоположен по действию оператору break.
Оператор continue позволяет в любой точке тела цикла (while, for или
do–while) прервать текущую итерацию и перейти к проверке условий
продолжения цикла. В соответствии с результатами проверки либо
заканчивается выполнение цикла, либо начинается новая итерация. При этом
все утверждения (фрагменты программы), которые следуют за оператором
continue (ключевым словом), автоматически пропускаются.
Формат записи оператора continue:
continue;

2.1.8 Оператор goto

Сейчас во многих языках программирования оператор безусловного


перехода типа goto не используется. Однако в языке программирования
С++ он имеет место. Применение оператора goto не является хорошим
стилем программирования. Но в некоторых случаях его применение бывает
уместно. Иногда, при умелом использовании, оператор goto может
112
оказаться весьма полезным, например, если нужно покинуть глубоко
вложенные циклы.
Для оператора goto всегда необходима метка. Метка – это
идентификатор с последующим двоеточием. Метка должна находиться в той
же функции, что и оператор goto, переход в другую функцию невозможен.
Общий формат записи оператора goto:
goto метка;

метка: заданные действия.
Метка может находиться как до, так и после оператора goto. С
помощью оператора goto можно не только выходить из цикла, но и
организовать цикл.

Логические операторы отношения приведены в табл. 2.1.

Таблица 2.1 – Логические операторы


№ п/п Оператор Операция
1 && И
2 II ИЛИ
3 ! НЕ, отрицание

Ниже приведены операции отношений в убывающей


последовательности приоритетов:

Как и в арифметических выражениях, для изменения порядка


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

Операторы отношения перечислены в табл. 2.2.

113
Таблица 2.2 – Операторы отношения языка программирования С++
№ п/п Оператор Значение
1 == Равно
2 != Не равно
3 < Меньше
4 <= Меньше или равно
5 > Больше
6 >= Больше или равно

Результат любой операции сравнения или логической операции есть 0


(нуль) или 1.
Решение практически любой задачи можно запрограммировать
самостоятельно от начала до конца. Однако при составлении программ очень
часто возникает потребность выполния какие-либо действий, которые уже
использовались в различных программах. Например, при математических
расчетах нужно вычисление тригонометрических функций, а
программированием этих вычислений уже не раз занималось множество
программистов. Поэтому в Visual C++ входит обширный набор стандартных
модулей, содержащих стандартные функции. Такие модули представляют
собой готовый откомпилированный и оптимизированный код,
предназначенный для решения самых разных задач.
В таблице 2.3 приведен перечень некоторых встроенных
математических функций Visual C++ 2010. Прототипы этих функций
определены в заголовочном файле math.h. Поэтому, чтобы иметь
возможность их использования, необходимо в вызывающем модуле
использовать директиву:
#include <math.h>.
Все функции С++ (не только стандартные) записываются так: сначала
следует название функции, потом в круглых скобках – список параметров
через запятую (если параметров несколько).

2.1.9 Математические функции в языке программирования С++

Таблица 2.3 – Запись математических функций в С++


Функция на языке
Математиче- Название
программирования Поясненне
ская функция функции
С++
arccos x арккосинус #include <math.h> аргумент для acos должен
double acos(double x); находиться в отрезке [-1; 1]. Acos
и acosf возвращают значения в
радианах на промежутке от 0 до
pi

114
Функция на языке
Математиче- Название
программирования Поясненне
ская функция функции
С++
arccosh x обратный #include <math.h> x должен быть больше либо равен
гиперболи- double acosh(double 1
ческий x);
косинус
аргумент для asin должен
arcsin x арксинус #include <math.h> находиться в отрезке [-1; 1]. Asin
double asin(double x); и asinf возвращают значения в
радианах в промежут- ке от -pi/2
до pi/2.
arcsinh x обратный #include <math.h> ни atanh, ни atanhf не являются
гиперболиче- double asinh(double ANSI С - функциями
ский синус x);
arctg jc арктангенс #include <math.h> atan и atanf возвращают значения
double atan(double x); в радианах на проме- жутке от -
pi/2 до pi/2.
arctgh jc обратный ги- #include <math.h> ни atanh, ни atanhf не являются
перболиче- double atanh(double ANSI С - функциями.
ский тангенс x);
√ кубический #include <math.h> Является стандартной функцией
корень double pow(x,1.0/3.0); ANSI С
coshx Гиперболи- #include <math.h> Углы определены в радианах.
ческий double cosh(double x);
косинус
ех экспонента #include <math.h> Является стандартной функцией
числа double exp(double x); ANSI С
|х| модуль числа #include <math.h> Является стандартной функцией
(абсолютная double fabs(double x); ANSI С
величина)
ln x натуральный #include <math.h> Является стандартной функцией
логарифм double log(double x); ANSI С
lg x логарифм по #include <math.h> logl0 возвращает значение
основанию double loglO(double логарифма по основанию 10 от x.
10 x); Он определяется как ln(x)/ln(10)
ху возведение #include <math.h> Является стандартной функцией
основания x в double pow(x, у); ANSI С
степень у
квадратный #include <math.h> вычисляет арифметический
x корень из double sqrt(double x); (неотрицательный) квадратный
числа корень из аргумента
sinx синус #include <math.h> Углы определены в радианах
double sin(double x);
cosx косинус #include <math.h> Углы определены в радианах
double cos(double x);
sinhx гиперболиче- #include <math.h> Углы определены в радианах
ский синус double sinh(double x);
tgx тангенс #include <math.h> Углы определены в радианах
double tan(double x);

115
Функция на языке
Математиче- Название
программирования Поясненне
ская функция функции
С++
tgh x гиперболиче- #include <math.h> Углы определены в радианах,
ский тангенс double tanh(double x); tanh(x) определяется как
sinh(x)/cos(x)

3. ЦИКЛИЧЕСКИЙ АЛГОРИТМ. ТАБУЛИРОВАНИЕ


ФУНКЦИИ И ПОИСК ЭКСТРЕМУМОВ

Цикл – разновидность управляющей конструкции высокоуровневых


языков программирования, предназначенная для организации многократного
исполнения набора инструкций. Также циклом может называться любая
многократно исполняемая последовательность инструкций, организованная
любым способом (например, с помощью условного перехода).
Последовательность инструкций, предназначенная для многократного
исполнения, называется телом цикла. Единичное выполнение тела цикла
называется итерацией. Выражение определяющее, будет в очередной раз
выполняться итерация или цикл завершится, называется условием выхода или
условием окончания цикла (либо условием продолжения в зависимости от
того, как интерпретируется его истинность: как признак необходимости
завершения или продолжения цикла). Переменная, хранящая текущий номер
итерации, называется счѐтчиком итераций цикла или просто счѐтчиком
цикла. Цикл не обязательно содержит счѐтчик, счѐтчик не обязан быть один –
условие выхода из цикла может зависеть от нескольких изменяемых в цикле
переменных, а может определяться внешними условиями (например,
наступлением определѐнного времени), в последнем случае счѐтчик может
вообще не понадобиться.
Исполнение любого цикла включает первоначальную инициализацию
переменных цикла, проверку условия выхода, исполнение тела цикла и
обновление переменной цикла на каждой итерации. Кроме того, большинство
языков программирования предоставляют средства для досрочного
управления циклом, например, операторы завершения цикла, то есть выхода
из цикла независимо от истинности условия выхода (в языке Си – break) и
операторы пропуска итерации (в языке Си – continue).

3.1.1 Оператор while

Изучение операторов цикла начнем с оператора while. Цикл while


имеет следующий формат (синтаксис) записи:
while (условие)
действие;
Производится расчет выражения условие, заключенного в круглые
116
скобки. Если в результате расчета выражения условие получается
истинный результат (TRUE), то выполняется утверждение действие,
следующее непосредственно за закрывающей круглой скобкой. После
выполнения этого утверждения вновь рассчитывается выражение условие.
Если в результате расчета будет TRUE, то вновь будут выполнены
утверждения действие. Цикл повторяется до тех пор, пока в результате
расчета выражения условие (в круглых скобках оператора while) не
будет получено значение FALSE (ложный), которое является признаком
окончания цикла, после чего выполнение программы продолжается с
утверждения, следующего за утверждением действие. Когда требуется
выполнить группу утверждений, то она (группа) располагается в фигурных
скобках:
while (условие)
{
действие; действие2; действие3;
...
}
Открывающаяся фигурная скобка может следовать непосредственно
после закрывающей круглой скобки оператора while. Все, что находится в
фигурных скобках, будет выполняться, пока верно выражение условие.
Очевидно, что неверное задание выражения условие может привести
к бесконечному циклу (к зацикливанию).

3.1.2 Оператор for

Оператор цикла for имеет следующий формат записи:


for (нач_знач; условие; счетчик) действие;
Три выражения, заключенные в круглые скобки оператора цикла for,
задают условия выполнения программного цикла.
Первый параметр нач_знач используется для задания начального
значения цикла.
Второй компонент условие определяет условие или условия, в
соответствии с которыми будет происходить выход из цикла. Повторение
будет происходить до тех пор, пока это условие (или условия) выполняется.
Если условие не выполняется, то цикл немедленно заканчивается.
Третий параметр счетчик выполняется каждый раз, когда
заканчивается обработка тела цикла, т. е. действие.
Чаще всего выражения init_expression и loop_expression являются
операторами присваивания или вызовами функций, а второе выражение
loop_condition – выражением отношения или логическим выражением.
Любую из трех частей можно опустить, но точки с запятыми должны
остаться на своих местах. Если опустить init_expression или loop_expression,
то соответствующие операции не будут выполняться. Если же опустить
проверку условия loop_condition, то по умолчанию считается, что условие
117
продолжения цикла всегда истинно, и тогда цикл станет бесконечным
(произойдет зацикливание).
Когда требуется выполнения нескольких утверждений, то они должны
заключаться в фигурные скобки:
for (init_expression; loop_condition; loop_expression)
{
действие1; действие2; действие3;
...
}
В представленном случае тело цикла находится в фигурных скобках.
Конструкция цикла, реализованная оператором for, может быть выполнена
также и оператором while следующим образом: init_expression;
while (loop_condition)
{
program statement; loop_expression;
}
Исключением является применение операции continue.
В программах языка С возможно применять вложенные циклы, каждый
из которых контролируется своей переменной цикла и своим отноше-нием
(второе выражение в круглых скобках оператора for). Вложенные циклы
могут идти непосредственно друг за другом или составлять тело цикла с
помощью фигурных скобок. Возможно также использование двух индекс-
ных переменных для инициализации начала цикла с последующим их ин-
крементированием (увеличением) или декрементированием (уменьшением).

3.1.3 Оператор do–while

Рассмотренные операторы цикла while и for производят проверку


условия выполнения цикла до начала выполнения тела цикла. Поэтому тело
цикла может ни разу не выполниться, если с самого начала результатом
расчета условия выполнения цикла будет значение FALSE (ложь). В случае
необходимости производить проверку условия выполнения цикла после тела
цикла (т. е. когда выполняется хотя бы одно предписанное действие в теле
цикла) прибегают к циклу do–while.Оператор цикла do–while имеет
следующий формат записи:
do
program statement;
while (loop_expression);
Выполнение цикла do–while происходит следующим образом: сначала
выполняется утверждение program statement, затем производится проверка
условия выполнения цикла loop_expression с помощью оператора while. Если
результатом проверки будет значение TRUE (истина), то выполнение цикла
продолжится, и утверждение program statement всякий раз будет выполняться
вновь. Повторение цикла будет продолжаться до тех пор, пока в результате
проверки условия выполнения цикла loop_expression будет получаться
значение TRUE. Когда в результате проверки условия будет вычислено
118
значение FALSE (ложь), то выполнение цикла прекратится и произойдет
переход к утверждению (следующему фрагменту программы),
непосредственно следующему за циклом.
Таким образом, цикл do–while гарантированно выполнится хотя бы
один раз.
В случае выполнения нескольких утверждений используются фигурные
скобки для выделения тела цикла:
do {
program1 statement1; program2 statement2; program3
statement3;
... } while (loop_expression);
Оператор цикла while называется оператором цикла с предусловием,
оператор цикла for называется оператором цикла с параметром, оператор
цикла do–while называется оператором цикла c постусловием.
Алгоритм циклической структуры – это вычислительный процесс,
содержащий многократные вычисления по одним и тем же математическим
зависимостям, но для различных значений входящих в него переменных.
Переменные, изменяющиеся в цикле, называются параметрами цикла.
Каждый алгоритм циклической структуры содержит такие элементы: а)
подготовка цикла – определение начальных значений параметров цикла; б)
тело цикла – действия, что повторяются многократно для разных значений
параметров цикла; в) модификация цикла – смена значений параметров
цикла;
г) управление циклом – проверка условия выхода из цикла.
Табулирование функции – это формирование и вывод на экран илипринтер
таблицы значений функции для значений аргумента (х), изменя-ющихся от
некоторого начального значения (хn) до конечного (хк) с неко-торым шагом
(h). Для этого используется цикл. При подготовке цикла ар-гументу
присваивается начальное значение (х = хn), в теле цикла вычисля-ются и
выводятся значения функции для текущего значения аргумента х.
Модификация заключается в увеличении аргумента на величину h (х = х + h).
Цикл завершается, когда после очередного изменения значение аргумента
превысит конечное значение (х  хк).
Экстремум – это наибольшее или наименьшее значение функции на
промежутке.
Поиск экстремумов функции на заданном отрезке методом
перебора выполняется в цикле, аналогично табулированию. Вместо вывода
значение функции в каждой точке сравнивается с наибольшим (наименьшим)
из значений во всех предыдущих точках. Если текущее значение больше
(меньше) наибольшего (наименьшего) из предыдущих, то его надо считать
новым наибольшим (наименьшим) значением. В противном случае
наибольшим (наименьшим) значением остается значение функции,
определенное в предыдущих точках.

119
4. ПОСТРОЕНИЕ ГРАФИКА ФУНКЦИИ НА ПРОМЕЖУТКЕ
С ОПРЕДЕЛЕННЫМ ШАГОМ

4.1.1 Элемент управления Chart

Элемент управления Chart позволяет создавать диаграммы для


сложного статистического или финансового анализа. Этот элемент
поддерживает следующие функциональные возможности:
− ряды данных, области диаграммы, оси, условные обозначения, метки
и заголовки;
− привязку данных;
− операции с данными: копирование, разбиение, слияние,
выравнивание, группирование, сортировку, поиск, фильтрацию и т. д.;
− статистические и финансовые формулы;
− расширенную настройку внешнего вида диаграммы: трехмерную
графику, сглаживание, освещение и перспективу;
− события и индивидуальную настройку.
С помощью компонента Chart (чертеж) удобнее всего выполнять
построение графиков функции по уравнению на промежутке.
Построение графика функции:
1) нужно добавить компонент Chart на форму;
2) щелкнуть левой кнопкой по пункту «Series» окна «Свойства»
(рис. 4.1);

Рисунок 4.1 – Окно «Свойства»

3) в результате увидим окно редактора коллекции Series (рис. 4.2);

120
Рисунок 4.2 – Диалоговое окно «Редактор коллекции Series»

5) чтобы на одном компоненте Chart построить несколько графиков


функции, нужно выбрать страницу Series (левая часть окна) и щелкнуть по
кнопке Добавить (если нужно построить несколько графиков на одной
координатной плоскости, то нужно сделать соответствующее
количествоSeries);
6) в правой части окна для каждой Series можно сделать индивиду-
альные настройки, основные из них:
− ChartType – тип диаграммы для представления данных;
− XValueType – тип значений, хранимых на оси ОХ;
− YValueType – тип значений, хранимых на оси ОY;
− Color – цвет точки данных;
− BorderColor – задает цвет границ;
− ShadowColor – задает цвет тени;
− Font – шрифт точки данных;
− LabelBackColor – задает цвет фона метки;
− LabelForeColor – задает цвет метки;
− IsVisibleInLegend – включает/выключает отображение
легенды;
Многие из этих параметров можно также задавать программно,
например:
Series^ plot1 = chart1->Series[0]; if(colorDialog1-
>ShowDialog()==System::Windows::Forms::DialogResult::OK)
plot1->Color = colorDialog1->Color;
В данном случае изменяется цвет графика функции при выборе цвета
121
диалоговом окне «ColorDialog».
Если графики функций нужно распечатать, то на черно-белом принтере
линии будут неразличимыми. В этом случае нужно использовать
возможности страницы Series и из списка опций BorderdashStyle
выбрать другую прорисовку линии (например, точками) или в опции
BorderWidth выбрать большую толщину линии (по умолчанию стоит
значение 1).

4.1.1.1 Свойства элемента управления Chart

Основные свойства элемента управления chart отображены в таблице 4.1.

Таблица 4.1 - Основные свойства Chart


Название свойства Описание свойства
BackColor Задает цвет фона для объекта chart
BackHatchStyle Задает стиль штриховки для элемента
управления Chart
BackImage Задает фоновое изображение для элемента
управления chart
BackImageTransparen Задает прозрачный цвет элемента управления
tColor
Chart
BorderColor Задает цвет границы диаграммы
BorderDashStyle Задает стиль границы
BorderlineColor Задает цвет линии границы
BorderlineDashStyle Задает стиль линии границы
BorderlineWidth Задает толщину линии границы
BorderWidth Задает ширину границы диаграммы
Font Получает свойства шрифта для элемента
управления
FontHeight Задает высоту шрифта элемента управления
ForeColor Задает цвет текста элемента управления
chart
Height Задает высоту элемента управления
Series Возврат объекта класса
SeriesCoiiection
Size Задает размер элемента управления chart
Visible Включает / выключает элемент управления
Chart

4.1.1.2 Методы элемента управления Chart. Основные методы

122
элемента управления Chart отображены в таблице 4.2.

Таблица 4.2 – Основные методы Chart


Название метода Описание метода
DataBind Осуществляет привязку данных элемента управле-
ния chart к источнику данных
Focus Задает фокус ввода элемента управления
Hide Скрывает элемент управления от пользователя
OnClick Вызывает событие ciick
OnEnter Вызывает событие Enter
OnLeave Вызывает событие Leave
ResetFont Сбрасывает свойство Font в значение по
умолчанию
ResetForeColor Сбрасывает свойство ForeCoior в значение по
умолчанию
SaveImage(String, Сохраняет изображение диаграммы в указанный
ChartImageFormat) файл
Show Отображает элемент управления для пользователя

4.1.1.3 События элемента управления Chart.

Основные события элемента управления Chart отображены в таблице


4.3.

Таблица 4.3 – Основные события Chart


Название события Описание события
BackColorChanged Происходит при изменении значения свойства
BackColor
Click Происходит при щелчке элемента управления
DoubleClick Происходит, когда элемент управления дважды
щелкается
Enter Происходит при входе в элемент управления
FontChanged Происходит при изменении значения свойства
Font
ForeColorChanged Происходит при изменении значения свойства
ForeColor
Leave Происходит, когда фокус ввода покидает элемент
управления
MouseClick Генерируется при щелчке элемента управления
мышью
Move Происходит при перемещении элемента
123
управления
VisibleChanged Происходит при изменении значения свойства
Visible

5. ПОНЯТИЕ ОДНОМЕРНОГО МАССИВА. СЕЛЕКТИВНАЯ


ОБРАБОТКА ЭЛЕМЕНТОВ МАССИВА

5.1.1 Понятие одномерного массива

В языке программирования С++ заложены средства для задания по-


следовательностей упорядоченных данных. Такие последовательности
называются массивами. Массив – это упорядоченная совокупность
пронумерованных однотипных данных. В массивах должны быть
упорядочены данные одного и того же типа. Номер элемента характеризуется
целыми числами, называемыми индексами. Массив характеризуется
именем, размерностью и размером.
В данной лабораторной работе будут рассматриваться массивы с
целыми и вещественными типами данных, т. е. типы int, float или double.
Одномерный массив – это вектор (список связанных однотипных пе-
ременных). В частности, для векторов в приведенной записи индекс означает
количество элементов. Для названия массива может быть использова-на
переменная, состоящая из букв (буквы), букв с цифрами, букв с цифра-ми и
знаком подчеркивания и т. д. в соответствии с правилами объявления
переменных, принятых в языке С++. Имя массива образуется по общему
правилу образования имен, т. е. представляет собой идентификатор,
например, A, Bl, C8 и т. д. Однако оно не должно совпадать с именем ни
одной простой переменной, используемой в той же программе.
Если размерность массива меньше, чем требуется, то компилятор не
выдаст сообщения об ошибке. Выход за границы массивов должен следить
только сам программист.
Общая форма записи одномерного массива:
тип имя_массива[размер];
В приведенной записи элемент тип объявляет базовый тип массива.
Количество элементов, которые будут храниться в массиве с именем
имя_массива, определяется элементом размер.
В языке С++ индексация массива начинается с нуля. Например, если
размер массива определен величиной 9, то в массиве можно хранить 10
элементов с индексацией 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.
Доступ к отдельному элементу массива осуществляется с помощью
индекса. Индекс описывает позицию элемента внутри массива.
Индексы определяют положение элемента в массиве. Число индексов
определяет размерность массива, т. е. форму его компоновки: одномерный,
двумерный и т. д. Одномерный массив соответствует линейной таблице. Его
124
элемент обозначается переменной с одним индексом: A[0], A[i],
соответственно, первый и i-й элементы одномерного массива А.
Все массивы занимают смежные ячейки памяти, т. е. элементы массива
в памяти расположены последовательно друг за другом. Ячейка памяти с
наименьшим адресом относится к первому элементу массива, а с
наибольшим – к последнему.
Для одномерных массивов общий размер массива в байтах вычисляется
по формуле:
всего байт = размер типа в байтах * количество
элементов.
В языке С++ нельзя присвоить один массив другому. Для передачи
элементов одного массива другому необходимо выполнить присвоение
поэлементно.

5.1.2 Инициализация массива

В языке С++ массив при объявлении можно инициализировать.


Общая форма инициализации массива:
тип имя_массива[размер1] * [размерN] = {список_значений};
В список_значений входят константы, разделенные запятыми. Типы
констант должны быть совместимыми с типом массива.
Пример инициализации одномерного массива:
int A[5] = {1, 2, 3, 4, 5};
При этом A[0] = 1; A[1] = 2 и т. д.
В языке С возможна инициализация безразмерных массивов.
Например, для одномерного массива:
int A[ ] = {1, 2, 3, 4, 5};

5.1.3 Селективная обработка элементов массива

Селективная обработка массива – это выделение из массивов


элементов, удовлетворяющих условию, и обработка выделенных фрагментов.
Часто из выделенных фрагментов формируют новый (рабочий) массив,
который далее и обрабатывают.
Наиболее часто встречаются такие условия обработки элементов
массива:

125
6. МНОГОМЕРНЫЙ МАССИВ. ПОНЯТИЕ МАТРИЦЫ.
СЕЛЕКТИВНАЯ ОБРАБОТКА ЭЛЕМЕНТОВ СТРОК, СТОЛБЦОВ И
ДИАГОНАЛЕЙ МАТРИЦЫ

6.1.1 Понятие матрицы

Двумерный массив (матрица) — это упорядоченная совокупность


пронумерованных однотипных данных. Матрица характеризуется именем,
размерностью и размером.
Для имени матрицы может быть использована переменная, состоя-щая
из букв (буквы), букв с цифрами, букв с цифрами и знаком подчерки-вания и
т. д. в соответствии с правилами объявления переменных, приня-тых в языке
С++. Имя матрицы образуется по общему правилу образова-ния имен, т. е.
представляет собой идентификатор, например, A, Bl, C_8 и т. д. Однако оно
не должно совпадать с именем ни одной простой переменной, используемой
в той же программе.
В матрице позиция любого элемента определяется двумя целыми
числами, называемыми индексами. Индексы каждого из размеров массива
начинаются с 0 (с нуля). Число индексов определяет размерность массива (у
матрицы два индекса: первый показывает номер строки, а второй номер
столбца, где элемент находится).
Двухмерный массив (матрица) представляет собой список одномерных
массивов.
Общая форма записи двухмерного массива:
тип имя_массива[размер1] [размер2];

В приведенной записи размер1 означает количество строк двухмер-


ного массива, а размер2 – количество столбцов.
Место хранения для всех элементов матрицы определяется во время
компиляции. Память, выделенная для хранения массива, используется в
течение всего времени существования массива.
Для двухмерных массивов общий размер массива в байтах вычисляется
по формуле:
всего байт = число строк * число столбцов * размер
типа в байтах.
Для определения размера типа в байтах применяется функция
sizeof(), которая возвращает целое число. Например, sizeof
(float).

6.1.2 Инициализация матрицы

При инициализации матрицы для улучшения наглядности элементы


126
инициализации каждого измерения можно заключать в фигурные скобки.
Пример инициализации двухмерного массива:
int MN[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
Массив MN[3][4] – это матрица, у которой 3 строки и 4 столбца.
В языке С++ нельзя присвоить одну матрицу другой. Для передачи
элементов одной матрицы другой необходимо выполнить присвоение
поэлементно.
Для доступа к элементу матрицы следует указать имя матрицы с
последующим числом (индексом), заключенным в квадратные скобки.
Элементы массива можно использовать в любом выражении точно
также, как и значение константы или переменной.
Например:
a[0][0]=11.2;
a[1][2]=10.2;
a[3][1]=22.1;
a[4][2]=1.1;
Y = 2*a[0][1] – a[1][0];

6.1.3 Селективная обработка элементов матрицы

Селективная обработка матрицы – это выделение из матрицы


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

Наиболее часто встречаются такие условия обработки элементов


массива:
– четные A[i] %2 ==0
– нечетные A[i] %2 !=0
– кратные k A[i] % k ==0
– не кратные k A[i] % k !=0
– положительные A[i] >0
– отрицательные A[i] <0
– в интервале [x1,x2] ((A[i]>=x1)&&(A[i]<=x2))
При обработке матриц часто приходится выделять элементы:
– k–й строки A[i][j], где i==k-1, j=0,…, М-1
– k–го столбца A[i][j], где i=0, …, N-1; j==k-1
а для квадратных матриц (M=N) также:
– главной диагонали i==j,
– побочной диагонали j=N-1-i,
– наддиагональные j>i,
– поддиагональные j<i,
где i – номер строки, j – номер столбца.

127
Например, для нахождения условия «найти элементы 3 столбца 2
строки», укажем условие с помощью условного IF:
If (i==1&&j==2) {действие};

6.1.4 Использование элемента управления DataGridView для


работы с матрицами

DataGridView – это элемент управления, который может


отображать буквально любой вид данных в ячейках прямоугольной сетки.
Элемент управления DataGridView позволяет отображать и изменять
прямоугольный массив данных из множества различных источников данных.
Его можно использовать также для отображения практически любых данных,
созданных непосредственно в программе. По своей сущности это сложный
элемент управления, который обеспечивает огромную гибкость при его
применении, и преимуществами множества его функциональных
возможностей можно воспользоваться через множество свойств, функций и
событий. В то же время применение элемента управления DataGridView
может быть поразительно простым. Можно не обращать внимания на
внутреннюю сложность и использовать его посредством инструмента Form
Design (Конструктор форм), которое берет на себя заботу обо всех
основных характеристиках.
Данные элемента управления DataGridView отображаются в
прямоугольном массиве ячеек, которые можно представить в виде коллекции
строк или столбцов. Каждый столбец ячеек имеет в верхней части ячейку
заголовка, которая, как правило, содержит идентифицирующий этот столбец
текст, а в начале каждой строки расположена ячейка заголовка строки, как
показано на рис. 6.1. Обращение к строкам и столбцам ячеек выполняется
через свойства объекта DataGridView. Свойство Rows возвращает
значение типа DataGridRowCollection, представляющее коллекцию
всех строк, а обращение к конкретной строке выполняется с помощью
индекса, что можно видеть на рис. 6.1.

128
Рисунок 6.1 – Компонент DataGridWiew

Аналогично свойство Columns элемента управления возвращает


значение типа DataGridViewColumnCollection, которое также можно
индексировать для обращения к конкретному столбцу. Индексация строк и
столбцов осуществляется, начиная с нуля. Свойство Cells объекта Data-
GridRowCollection представляет коллекцию, содержащую ячейки
строки, и это свойство можно индексировать для получения доступа к
конкретной ячейке в строке. Пример ссылки на четвертую ячейку в третьей
строке приведен на рис. 6.1.
Количество строк доступно как значение свойства RowCount, а
свойство ColumnCount возвращает количество столбцов. Вначале, когда
элемент управления еще нс связан с источником данных, он не будет
содержать ни строк, ни столбцов. Количество столбцов и / или строк можно
определить, устанавливая значения свойств элемента управления, но при его
использовании для отображения данных из источника данных это действие
выполняется автоматически.
Элемент управления DataGridView применяется в трех различных
режимах. Мы будет применять «несвязанный режим». В несвязанном режиме
передача данных элементу управления выполняется вручную, как правило, с
помощью функции Add () применительно к свойству Rows эле-мента
управления. Этот режим следует использовать для отображения
сравнительно небольших объемов данных.
В несвязанном режиме элемент управления DataGridView можно
использовать для отображения в приложении любых данных, которые могут
быть отображены в табличном виде. Потому этот инструмент очень удобен
для отображения данных во множестве разнообразных приложений.

6.1.4.1 Использование элемента управления DataGridView в


несвязанном режиме.

Данные в элементе управления DataGridView хранятся в


129
прямоугольной структуре, определяемой свойствами Rows и Columns
элемента управления. В несвязанном режиме добавление данных в элемент
управления выполняется с помощью функции Add () применительно к
свойству Rows. Но прежде чем в элемент управления можно будет добавлять
строки, потребуется определить столбцы – задать количество элементов в
строке. Программная установка свойства ColumnCount элемента
управления определяет количество столбцов и указывает, что элемент
управления будет работать в несвязанном режиме. Следующие операторы
создают элемент управления, обращение к которому выполняется
посредством дескриптора DataGridView, а затем устанавливают
количество столбцов, равное 3:
DataGridView^ dataGridView = dcnew DataGridView; DataGridView-
>ColumnCount = 3; // Устанавливает количество столбцов.
При желании столбцы в элементе управления можно пометить путем
установки свойства Name для каждого столбца, указывая заголовки,
идентифицирующие данные в каждом из них. Это можно было бы выполнить
так:
dataGridView->Columns[0]->Name="Name";
dataGrldView->Columns[l]->Name="Phone Number";
dataGridView->Columns[2]->Name="Address";
Свойство Columns элемента управления – индексированное свойство,
поэтому доступ к отдельным столбцам можно получить с помощью значений
индексов, начинающихся с 0. Таким образом, эти три оператора снабжают
метками три столбца в элементе управления DataGridView. Заголовки
столбцов можно определить также в окне Properties (Свойства) элемента
управления.
Свойство Rows возвращает значение, представляющее собой
коллекцию типа DataGridViewRowCollection, который определен в
пространстве имен System:: Windows: :Forms. Свойство Count
упомянутой кол-лекции возвращает количество строк. Кроме того, коллекция
имеет также свойство начальной индексации, возвращающее строку в
позиции данного индекса. Коллекция строк обладает множеством функций,
наиболее полезных, предназначенных для добавления и удаления строк (табл.
6.1).

130
Таблица 6.1 – Свойства для добавления и удаления строк
Функции Описание
Add () Добавляет в коллекцию одну или более строк
Insert () Вставляет в коллекцию одну или более строк
Clear() Удаляет все строки коллекции
AddCopy() Добавляет копию строки, указанную в аргументе
InsertCopy() Вставляет копию строки, указанную первым
аргументом, в позицию, которая задана вторым
аргументом
Remove() Удаляет строку, указанную аргументом типа
DataGridviewRow.
RemoveAt () Удаляет строку, указанную значением индекса,
которое передано в качестве аргумента.
Функция Add (), применяемая к значению, возвращенному свойством
Rows, существует в виде четырех перегруженных версий, которые позволяют
добавлять в элемент управления строку данных.
Все версии функции Add () возвращают значение типа int,
представляющее собой индекс последней добавленной в коллекцию строки.
Если значение свойства SataSource элемента управления DataGridView
не нулевое или элемент управления не содержит столбцов, все версии
функции Add () генерируют исключение типа System::
InvalidOpera-tionException.

Таблица 6.2 – Перегруженные версии функции Add () коллекции


DataGridViewRowCollection
Функция Описание
Add () Добавляет в коллекцию одну новую
строку
Add(int rowCount) Добавляет в коллекцию rowCount
новых строк. Если значение rowCount
нулевое или отрицательное, функция
генерирует исключение типа
System::ArgumentOutOfRangeExc
eption
A
Add(DataGridViewRow row) Добавляет строку, указанную
аргументом.
Объект DataGridviewRow содержит
коллекцию ячеек строки, а также
параметры, которые определяют
внешний вид ячеек в строке
Add(. . . ObjectA object) Добавляет новую строку и заполняет
ячейки строки объектами, указанными
аргументами
131
6.1.4.2 Персональная настройка элемента управления
DataGridView.
Внешний вид каждой ячейки в элементе управления DataGridView
определяется объектом типа DataGridViewCellStyle, имеющим
свойства, описанные в табл. 6.3.

Таблица 6.3 – Свойства объекта DataGridViewCellStyle,


влияющие на внешний вид ячейки
Свойство Описание
BackColor Это значение - объект System: :Drawing:
:Color. который определяет цвет фона ячейки.
В классе Color диапазон стандартных цветов
определен в виде статических членов. Значение,
используемое по умолчанию — Color : :
Empty
ForeColor Это значение - объект color, который определяет
цвет изображения ячейки. Значение, используемое
по умолчанию -Color::Empty
SelectionBackColor Это значение - объект color, который определяет
цвет фона выбранной ячейки. Значение,
используемое по умолчанию -Color::Empty
Это значение - объект color, который определяет
цвет
SelectlonForeColor изображения выбранной ячейки. Значение,
используемое по умолчанию - Color : : Empty
Это значение - объект System: :Drawing: :Font,
Font определяющий шрифт, который должен
использоваться для отображения текста e ячейке.
Значение, используемое по умолчанию - null
Это значение определяет выравнивание
содержимого ячейки. Допустимые значения
определены перечислением DataGridViewAlignnent,
Alignment
поэтому значение может быть любой из следующих
констант; Bottomcenter, Bot- tomLeft, BottomRight,
MiddleCenter, Middle- Left, MiddleRight, TopCenter,
TopLeft, To- pRight. NotSet. Значение, используемое
no умолчанию - NotSet
Это значение определяет переход текста в ячейке в

132
Свойство Описание
WrapMode следующую строку, если он слишком длинен, чтобы
уместиться в ячейке. Допустимое значение - одна из
констант, определенных перечислимым объектом
DataGridViewTri- State: True, False, NotSet.
Значение, используемое по умолчанию - NotSet
Это значение - Объект типа System::Windows::
Forms: :Padding, который определяет пробел между
содержимым и краем ячейки. Конструктор класса
Padding Padding требует передачи аргумента типа int,
который представляет значение дополнения
содержимого ячейки пробелами, измеренное в
пикселях. Значение, используемое по умолчанию,
соответствует отсутствию дополнения содержимого
ячейки
Это значение - строка формата, которая определяет
способ форматирования содержимого строки. Это
Format форматирование аналогично используемому в
функции Console:: WriteLine() . Значение,
используемое по умолчанию, - пустая строка

Приведенный в табл. 6.3 список включает далеко не все свойства


объекта DataGridViewCellStyle, а лишь те, которые связаны с внешним
видом ячейки.
Определение внешнего вида конкретной ячейки – достаточно сложная
задача, поскольку в элементе управления DataGridView можно
устанавливать множество различных свойств, определяющих способ
отображения данной ячейки или группы ячеек, причем некоторые из этих
свойств могут действовать в любой заданный момент времени. Например,
можно определить значения свойств, которые указывают внешний вид
строки или столбца ячеек или всех ячеек в элементе управления, причем все
эти свойства могут действовать одновременно. Очевидно, что поскольку
строка и столбец всегда пересекаются, все три значения свойств применимы
к любой отдельной ячейке, что ведет к возникновению явного конфликта.
Каждая ячейка в элементе управления DataGridView представлена
объектом System::Windows::Forms::DataViewCell, а внешний вид
каждой конкретной ячейки, включая ячейки заголовков, определяется
значением ее свойства InheritedStyle. Это значение для данной ячейки
определяется путем просмотра всех доступных свойств, которые возвращают
значение, являющееся объектом DataGridViewStyle примененного к
ячейке, и последующего упорядочения этих значений по приоритету.
Значение с наивысшим приоритетом будет установлено в качестве
действующего. Определение значения свойства InheritedStyle для ячеек
133
заголовков строк и столбцов выполняется иначе, чем для остальных ячеек,
поэтому они будут рассматриваться отдельно, начиная с ячеек заголовков.

6.1.4.3 Настройка ячеек заголовков. Значение свойства Inher-


itedStyle для каждой ячейки заголовка в элементе управления
определяется учетом значений свойств в представленной ниже
последовательности:
 свойства Style объекта DataGridViewCell, который
представляет ячейку; 
 свойства ColumnHeaderDefaultCellStyle или RowHead-
ersDefaultCellStyle объекта элемента управления; 
 свойства DefaultCellStyle объекта элемента управления. 
Таким образом, если значение свойства Style объекта ячейки
установлено, свойству InheritedStyle ячейки присваивается это
значение, которое и определяет ее внешний вид. Если это значение не
установлено, в действие вступает следующее значение, если оно
установлено. Если и второе свойство не установлено, применяется свойство
Style элемента управления.
Следует помнить, что значение свойства InheritedStyle – объект
типа DataGridViewCellStyle, который сам обладает свойствами,
опреде-ляющими различные аспекты внешнего вида ячейки. Процесс учета
приоритета применяется к каждому из свойств объекта
DataGridViewCell-Style, поэтому общая последовательность
приоритетов может включать в себя более одного свойства.

6.1.4.4 Настройка ячеек, не являющихся заголовками. Значение


свойства InheritedStyle каждой ячейки элемента управления, не
являющееся заголовком (то есть содержащее данные) определяется
свойствами объекта DataGridView в описанной далее
последовательности:
 свойством Style объекта DataGridViewCell, который представ-
ляет ячейку; 
 свойством DefaultCellStyle объекта DatagridViewRow,
который представляет строку, содержащую ячейку. Как правило, ссылку на
объект 
DatagridViewRow нужно будет выполнять посредством индексации
свойства Rows объекта элемента управления;
 свойством AlternatingRowsDefaultCellStyle объекта
элемента управления. Это свойство применяется только к ячейкам строк с
нечетными номерами индексов; 
 свойством RowsDefaultCellStyle объекта элемента управления; 
 свойством DefaultCellStyle объекта DataGridViewColumn,

134
содержащего ячейку. Как правило, обращение к объекту
DataGridViewColumn будет выполняться посредством индексации
свойства Columns объекта элемента управления;
 свойством DefaultCellstyle объекта элемента управления.
Вообще говоря, для каждой ячейки можно было бы использовать отдельный
объект DataGridViewCellStyle, но для повышения эффективности
количество таких объектов следует сохранять минимальным.

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


элемент управления размещался в фиксированной позиции в клиентской
области формы. Это можно осуществить, устанавливая значение свойства
Dock:
dataGridView->Dock = DockStyle::Fill;
В качестве значения свойства Dock должна быть установлена одна из
констант, определенных перечислением DockStyle. Другими допустимыми
значениями этого свойства являются Тор (Вверху), Bottom (Внизу), Left
(Слева), Right (Справа) и None (Нет), которые указывают стороны
элемента управления, привязанные к позиции размещения.
Привязку позиции элемента управления к клиентской области формы
можно выполнять также посредством установки свойства Anchor элемента
управления. Значение этого свойства указывает края элемента управления,
которые должны быть привязаны к клиентской области формы. Значение
является побитовой комбинацией констант, определенных перечислением
AnchorStyles, и может принимать любые или все из значений Top,
Bottom, Left и Right. Например, чтобы привязать верхнюю и левую
стороны элемента управления, в качестве значения нужно было бы указать
AnchorStyles::Тор & AnchorStyles::Left. Определение свойства
Anchor ведет к фиксации позиции элемента управления и его линеек
прокрутки внутри контейнера заданного размера. Поэтому при изменении
размера окна приложения элемент управления и его линейки прокрутки
сохраняют свои размеры. Если установить значение свойства Dock так, как в
предыдущем операторе, при изменении размера окна приложения
отображаемая в нем часть элемента управления будет изменяться с
соответствующим изменением линеек прокрутки. Поэтому теперь работать с
приложением значительно удобнее.
Нам требуется, чтобы ширина столбцов автоматически изменялась,
обеспечивая отображение полных строк данных в ячейках. Для этого можно
вызывать функцию AutoResizeColumns(): dataGridview-
>AutoResizeColumns();
Этот оператор подбирает ширину всех столбцов в соответствии с
текущим содержимым, в том числе в соответствии с содержимым ячеек
заголовков. Обратите внимание, что эта настройка выполняется во время
вызова функции, поэтому к моменту еѐ вызова содержимое уже должно
135
существовать. При последующем изменении содержимого ширина столбца
не изменяется. Если требуется, чтобы ширина столбца автоматически
изменялась при каждом изменении содержимого ячеек, для элемента
управления нужно установить также свойство
AutoSizeColumnsMode:
dataGridView-
>AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode:
:AllCells;
Значением этого свойства должна быть одна из констант,
определенных перечислением
DataGridViewAutoSizeColumnsMode. Другими возможными
значениями являются ColumnHeader (Заголовок столбца), All-
CellsExceptHeader (Все ячейки, кроме заголовка), DisplayedCells
(Отображаемые ячейки), DisplayedCellsExceptHeader
(Отображаемые ячейки, кроме заголовка). Fill (Заполнение) и None (Нет).
Естественно, эти значения отображаются также в списке значений этого
свойства на странице Properties (свойства) элемента управления
DataGridView.
В некоторых ситуациях требуется, чтобы автоматический подбор
ширины при изменении содержимого выполнялся только для определенных
столбцов. В этом случае значение свойства AutoSizeMode необходимо
устанавливать для объекта столбца.
Существует еще две перегруженных версии функции AutoSizeCol-
umns(). Одна принимает аргумент типа DataGridViewAutoSizeCol-
umnsMode, определяющий ячейки, на которые функция оказывает
воздействие. Вторая перегрузка является защищенной и, следовательно,
предназначена для использования в производном классе. Она принимает
дополнительный аргумент типа bool, который указывает, должна ли высота
ячейки учитываться при вычислении новой ширины.
Используемый по умолчанию цвет фона всех ячеек элемента
управления можно установить следующим образом: dataGridview-
>DefaultCellStyle->Backcolor=color::Pink;

Этот оператор устанавливает в качестве цвета фона стандартный цвет


Pink (Розовый), который определен в качестве статического члена класса
Color (Цвет). Свойства DefaultCellStyle объекта элемента управления
определяют только те атрибуты стиля, которые применяются к ячейке при
отсутствии какого-либо другого действующего стиля ячейки, имеющего
более высокий приоритет.
Можно также определить применяемый по умолчанию цвет
изображения всех ячеек: dataGridView->DefaultCellStyle-
>ForeColor=Color::DarkBlue;
Для визуального определения выбранных ячеек можно указать цвета
136
изображения и фона выбранных ячеек. Эти цвета можно было бы определить
следующим образом: dataGridView->DefaultCellStyle-
>SelectionBackColor=Color: :Green;
Естественно, смысл программного определения свойств в том, что
установленные значения применяются во время выполнения, что позволяет
определять значения в зависимости от условий и значений данных,
существующих во время выполнения приложения. Значения свойств,
определяемые в панели Properties среды IDE, устанавливаются раз и
навсегда, если только вы не располагаете кодом, который изменяет их
впоследствии.
Пока закончим настройку всего элемента управления и займемся
настройкой заголовков столбцов.

6.1.4.6 Настройка заголовков столбцов. Если хотите самостоятельно


определить внешний вид заголовков столбцов, значение свойства Enable-
HeadersVisualStyles потребуется установить равным false:
dataGridView->EnableHeadersVisualStyles - false;
Обычно элементы управления в приложении Windows Forms
отображаются в соответствии с действующей темой визуальных стилей,
которая и определяет внешний вид элементов управления. При выполнении
приложения в среде Windows ХР элементы управления отображаются в
соответствии с текущей темой Windows ХР. Когда значением свойства
EnableHeadersVisualStyles является true, визуальные стили
заголовков столбцов будут установлены согласно действующей для
приложения теме визуальных стилей, а стили, определенные
непосредственно в приложе-нии, будут игнорироваться.
Мы собираемся определить несколько свойств, определяющих
внешний вид заголовков столбцов. Простой способ достижения этого –
создание объекта DataGridViewStyle, для которого можно определить
необходимые свойства, и последующая установка этого объекта в качестве
определяющего стили заголовков. Объект DataGridViewStyle можно
создать так:
DataGridViewCellStyle^headerStyle=gcnew
DataGridVlewCellStyle;

Было бы прекрасно, если бы заголовок отображался более крупным


шрифтом, и его можно определить, устанавливая значение свойства Font:
headerStyle->Font=gcnew System::Drawing::Font("Times
New Roman", 12, FontStyle::Bold);
Теперь текст заголовка отображается символами шрифта Times New
Roman с полужирным начертанием и размером в 12 пунктов.
Для ячеек заголовков можно определить также цвета фона и
изображения:
headerStyle->BackColor=Color::AliceBlue;
137
headerstyle->ForeColor=Color::BurlyWood;
Текст отображается цветом BurlyWood на фоне AliceBlue. Если вы
предпочитаете какие-либо другие цвета, класс Color предоставляет мно-
жество возможностей, и средство Intellisense должно отобразить их
список по завершении ввода операции разрешения области определения.
Чтобы внешний вид ячеек заголовков соответствовал свойствам,
установленным для объекта headerStyle, необходимо добавить
следующий оператор:
dataGridView->ColuranHeadersDefaultCellStyle=headerStyle;
Он устанавливает в качестве значения свойства
ColumnHeadersDefaultCellStyle элемента управления дескриптор
headerStyle. Тем самым заменяется существующий объект
DataGridViewCellStyle, который действовал по отношению к
заголовкам.
Применительно к заголовкам столбцов необходимо выполнить еще
одну операцию. Более крупный шрифт требует соответствующей подстройки
высоты ячеек. Вызов функции
AutoResizeColumnHeadersHeight()элемента управления настраивает
высоту ячеек заголовков в соответствии с их текущим содержимым:
dataGridView->AutoResizeColumnHeadersHeight();
В результате высота всех ячеек заголовков будет автоматически
подобрана так, чтобы вмещать наибольшее по высоте содержимое. Если
требуется автоматически настроить высоту заголовка только конкретного
столбца, можно воспользоваться перегруженной версией функции, которая
принимает аргумент, указывающий индекс настраиваемого столбца.
Если нужно, чтобы заголовки строки или столбца были невидимыми,
этого можно достичь, устанавливая значение свойств RowHeadersVisible
и/ или ColumnHeadersVisible элемента управления равными false.

6.1.4.7 Форматирование столбца. Первый столбец содержит


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

ToString () для объектов, но мы можем его усовершенствовать.


Для свойства DefaultCellStyle столбца можно установить свойство
Format, и затем эта спецификация формата будет использоваться для
отображения содержимого ячеек: dataGridView->Columns[0]-
>DefaultCellStyle->Format=L"y";
Этот оператор устанавливает в качестве значения свойства Format
строку, содержащую спецификацию формата у для объекта DateTime,
которая представляет его в краткой форме даты в виде месяца и года. Для
объектов DateTime существует еще несколько спецификаторов формата,
которые можно было бы использовать. Например, спецификатор D
138
отображает день, месяц и год, а спецификаторы f и F, наряду с датой,
отображают и время.
Цвет фона ячеек строки определен в свойстве SelectionBackColor
свойства DefaultCellStyle. Можно также выбрать отдельную ячейку,
щелкая на ней. При этом ее цвет фона изменится на зеленый.
Возможность сортировки строк по любому из столбцов встроена в
элемент управления DataGridView. Можете щелкнуть на заголовке
столбца и убедиться, что строки сортируются по выбранному столбцу. Если
вторично щелкнуть на заголовке столбца, порядок сортировки строк
изменится на противоположный. К каждому столбцу можно добавить
контекстную подсказку, описывающую возможности сортировки.

6.1.4.8 Настройка внешнего вида чередующихся строк. При


отображении множества одинаковых по виду строк может оказаться
затруднительным фиксировать взгляд на нужной строке. Для облегчения этой
задачи можно чередовать цвета строк, устанавливая другой цвет свойства
BackColor (Цвет фона) для свойства
AlternatinqRowsDefaultCellStyle объекта управления: dataGridView-
>ALternatingRowsDefaultCellStyle->BackCoLor =Color::Blue;
Вероятно, для обеспечения приемлемого контраста между текстом и
фоном потребуется изменить также значение свойства ForeColor для
свойства AlternatingRowsDefaultCellStyle:
dataGridView->AlternatingRowsDefaultCellStyle->ForeColor
=Color::White;
Теперь чередующиеся строки отображаются поочередно на розовом исинем
фоне. Теперь строки легко различать, а белый текст на синем фоне отчетливо виден.
По-прежнему строки можно выбирать, щелкая на заголовке строки, при этом
выбранная строка выделяется зеленым цветом. Щелчок на ячейке, расположенной
слева от заголовков столбцов, приводит к выбору всех строк.
6.1.4.9 Динамическое определение стилей ячеек. Существует
несколько возможностей изменения внешнего вида ячеек через обработку
событий элемента управления DataGridView. Событие CellFormatting
элемента управления DataGridView запускается, когда содержимое ячейки
должно быть сформатировано в вид, готовый для отображения, поэтому,
добавляя обработчик этого события, внешний вид любой ячейки можно
настраивать в соответствии с ее содержимым (табл. 6.4).
Эти свойства позволяют выяснять все необходимые сведения о
форматированной ячейке – индекс ее строки и столбца, действующий стиль
содержимое ячейки.
Первый шаг по обработке события CellFormatting состоит в
определении для него функции обработчика. Код обработчика должен быть
максимально кратким и эффективным, поскольку функция вызывается для
каждой ячейки элемента управления каждый раз, когда возникает
необходимость форматирования ячейки.
139
Таблица 6.4 – Свойства объекта DataGridViewCellFormat-
tingEventA rgs
Свойство Описание
Value Значение этого свойства - дескриптор содержимого
ячейки, которая должна быть форматирована
DeairedType Значение этого свойства - дескриптор объекта типа
Type, который идентифицирует тип содержимого
форматируемой ячейки
CellStyle Извлекает или устанавливает стиль ячейки, связанной с
событием форматирования, потому это значение -
дескрИПТОр объекта типа DataGridView-
CellStyle
ColumnIndex Значение этого свойства - индекс столбца формати-
руемой ячейки
RowIndex Это значение - индекс строки форматируемой ячейки
FormattingApplied Значение этого свойства, которое может принимать
значение True или False, указывает, применялось ли
форматирование к содержимому ячейки

Элемент управления DataGridView определяет события Cell-


MouseEnter и CellMouseLeave, запускаемые при помещении
указателя мыши на ячейку или при перемещении его от нее. Обработчики
этих событий можно было бы реализовать так, чтобы ячейка с помещенным
на нее указателем мыши выделялась за счет изменения цвета фона.
Обработчик события CellMouseEnter мог бы устанавливать новые цвета
изображения и фона, а обработчик события CellMouseLeave –
восстанавливать первоначальные цвета. Решение этой задачи имеет
несколько сложных аспектов, поэтому заслуживает особого рассмотрения.

7. ИЗУЧЕНИЕ ВЕРОЯТНОСТНЫХ АЛГОРИТМОВ


Метод Монте-Карло (статистических испытаний) – это один из методов
статистического моделирования, основанный на кибернетической идее
«черного ящика». «Черный ящик» означает такую систему, которая изучается
с помощью сопоставления воздействий на ее входы и реакций на ее выходы
без анализа происходящих в ней процессов. Он применяется в тех случаях,
когда построение аналитической модели является затруднительным или
невозможным.
Смысл метода Монте-Карло состоит в том, что исследуемый процесс
моделируется путем многократных повторений его случайных реализаций.
Единичные реализации называются статистическими испытаниями.
Метод Монте-Карло часто используется для решения физических и
математических задач (например, для вычисления двойных и тройных
140
интегралов) с использованием вероятностных механизмов. В рамках этого
метода строится вероятностная модель, соответствующая математической
или физической задаче, на ней реализуется случайная выборка. Для
организации случайной выборки используются специальные подпрограммы –
генераторы псевдослучайных чисел. Чем больше выборок, тем точнее
получаемый результат.
В примере производится вычисление площади плоской фигуры,
ограниченной квадратом, вершины которого представлены точками (100,
100); (100, –100); (–100, –100); (–100,100) (см. рис. 7.1).

Рисунок 7.1 – Пример фигуры для нахождения площади

Очевидно, что площадь такого квадрата равна 40000. В область


квадрата случайным образом помещаются N точек, из которых n попадут на
плоскую фигуру, а m = N – n – будут извне. Тогда площадь фигуры легко
вычисляется по формуле,

где Sкв  40000 – площадь квадрата, внутри которого размещается фигура.


Практически метод Монте-Карло в данном случае реализуется
следующим образом: в цикле с помощью генератора псевдослучайных чисел
генерируется два случайных числа в пределах от –100 до +100, которые
трактуются как координаты точки на плоскости в пределах квадрата.
Подсчитывается количество n точек, координаты которых удовлетворяют
условию попадания в фигуру.
Для определения ошибки вычисления рассчитывается реальная
площадь фигуры Sp. Относительная ошибка (в процентах) определяется по
формуле:

141
Естественно, такое определение погрешности делается толькодля
демонстрации точности метода Монте-Карло. При реальном его применении
реальную площадь фигуры Sp найти нельзя, так как в противном случае
незачем использовать метод Монте-Карло.

8. РАБОТА С ДИАЛОГОВЫМИ ОКНАМИ. СОЗДАНИЕ


ОПЕРАЦИОННОГО МЕНЮ

8.1.1 Понятие операционного меню

Процесс индивидуальной настройки графического интерфейса


пользователя в соответствии с потребностями конкретного приложения
предполагает добавление стандартных элементов управления и
дополнительных форм, а также настройку их свойств.
Чтобы добавить элемент управления MenuStrip (операционное меню)
в верхнюю часть формы, сначала нужно его выбрать в окне Панели
элементов, а затем сделать щелчок по форме, куда его нужно поместить,
в верхней части клиентской области окна приложения. Слева над элементом
управления отобразится небольшая стрелка. Щелчок на ней приведет к
открытию всплывающего окна, показанного на рис. 8.1.

Рисунок 8.1 – Окно MenuStrip задачи

Первый элемент во всплывающем окне MenuStrip Задачи (Задачи


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

142
Рисунок 8.2 – Окно ToolStrip Container Задачи

Второй элемент «Внедрить стандартные элементы» генерирует че


тыре стандартных элемента меню: Файл, Правка, Сервис и Справка,
содержащие списки соответствующих пунктов меню. В то же время,
добавление этого меню предоставляет то преимущество, что меню Файл
будет содержать пункт Выход, позволяющий закрывать приложение. Элемент
RenderMode позволяет выбирать стиль изображения строки меню, и для
него можно оставить значение, выбранное по умолчанию. Опция Dock
(Стыковка) позволяет выбирать сторону формы, к которой будет присты-
кована строка меню, или же оставлять строку меню в отстыкованном
состоянии. Опция GripStyle определяет видимость рамки для
перетаскивания меню. В Visual Studio 2010 строки меню снабжены видимыми
рамками для перемещения. Выбор последней опции Правка элементов
приводит к отображению диалогового окна, в котором можно изменять
свойства строки меню или любых его элементов.
Чтобы добавить меню, нужно ввести текст меню в поле строки меню.
Например, &Сохранить данные таблицы в файл. Символ & предшествует
символу, выполняющему роль клавиши быстрого доступа для данного
элемента меню, так например, клавиатурная комбинация <Ctrl+S> служит
комбинацией быстрого доступа к меню Сохранить данные таблицы в файл
(рис. 8.3).

Рисунок 8.3 – Окно в процессе разработки меню


143
Меню Файл будет содержать два подменю: Сохранить данные
таблицы файл и Выход, однако щелчок по каждому из них будет
генерировать событие. Доступ к свойствам меню можно получить, щелкая
правой кнопкой мыши на элементе управления в форме (например, пункт
Меню) и выбирая из контекстного меню пункт Правка DropDownItems. В
результате откроется диалоговое окно Редактор коллекции элементов,
показанное на рис. 8.4.

Рисунок 8.4 – Окно редактора коллекции элементов

Выбор в левой панели диалогового окна имени, соответствующего


меню Файл, приведет к отображению его свойств на правой панели. После
этого можно изменить значение свойства (Name). На рис. 8.4 представлено
диалоговое окно после внесения изменений. Преимущество использования
этого диалогового окна состоит в том, что оно позволяет работать со всеми
элементами строки меню, настраивая их свойства должным образом. Кроме
того, окно позволяет добавлять новые элементы в строку меню или изменять
порядок отображения пунктов.
Новые элементы меню можно добавлять, используя диалоговое окно
Редактор коллекции элементов, показанное на рис. 8.4. Для этого достаточно
выбрать меню (или строку меню), которое требуется добавить, и щелкнуть на
кнопке Добавить. Кроме того, с помощью панели Редактор можно работать
непосредственно со строкой меню.
Чтобы добавить элементы в меню, нужно щелкнуть на нем в строке
меню. Затем щелкнуть на расположенном под ним элементе меню и ввести
нужный текст. Для этого элемента можно также добавить клавишу быстрого
доступа. Для этого потребуется щелкнуть на стрелке вниз в колонке значения
свойства ShortcutKeys, в результате чего откроется список, показанный
на рис. 8.5.
Выбрать клавишу или клавиши-модификаторы, установив
соответствующие флажки, и выбрать клавишу быстрого доступа из
144
раскрывающегося списка. Значения свойства ToolTipText позволяет
ввести текст, который является подсказкой при наведении курсора мышки на
пункт меню. Установка значения свойства AutoToolTip, расположенного в
начальной части списка, равным True, приведет к отображению подсказки,
текст которой будет совпадать с текстом элемента меню. Если же оставить
это значение равным False, в качестве текста подсказки будет использовано
значение свойства ToolTipText. Устанавливая значение свойства Show-
ShortcutKeys, можно также управлять отображением комбинации
клавиш быстрого доступа вместе с текстом элемента меню.

Рисунок 8.5 – Окно для изменения комбинации клавиш быстрого доступа

8.1.2 Обработчик событий для элементов операционного меню

Начнем с создания функции обработчика события для элемента


операционного меню Файл. Двойной щелчок на этом элементе меню создает
следующий код обработчика события:
private: System::Void
ФайлMenuItem_Click(System::Object^ sender.
System::EventArgs^ e){}
В этом скелете обработчика тело функции не содержит никакого кода.
Первый параметр – дескриптор, ссылающийся на элемент управления,
выдавший событие, а второй аргумент предоставляет информацию о самом
событии. Тип первого аргумента соответствует типу элемента управления,
инициировавшего событие – в данном случае это ToolStripMenuItem,
поскольку функция обработчика вызывается при щелчке на элементе меню
Файл. Дескриптор элемента меню хранится в члене ФайлMenuItem класса
Forml и его тип можно проверить в определении класса. Аналогично,
145
фактический тип второго аргумента обработчика события Click также
зависит от типа элемента управления.
Имя функции обработчика, генерируемое по умолчанию, –
ФайлMenuItem_Click. Не следует изменять автоматически
сгенерированные имена в коде. Это всегда следует делать в окне Свойства.
Если имя, созданное для функции обработчика события, вас не устраивает,
его можно изменить через свойство события Click в окне Свойства
данного элемента управления.

8.1.3 Элемент управления с вкладками (TabControl)

Элемент управления TabControl предоставляет несколько вкладок,


каждая из которых может содержать собственный набор элементов
управления. Открыть окно Панель элементов (<Ctrl+Alt+X>) и выберать в
списке элемент TabControl – он расположен в группе Контейнеры.
Щелкнуть в клиентской области формы и добавьте элемент управления с
вкладками, после чего открыть его окно свойств. Для этого нажать клавишу
<F4>.
Все элементы управления, перечисленные в группе Контейнеры, могут
содержать другие элементы управления, и, следовательно, все они
предлагают средства объединения элементов управления в группу. Понятно,
что каждая вкладка может содержать собственный набор элементов
управления, причем элемент управления вкладки может содержать любое
количество вкладок.
Нам необходимо, чтобы элемент управления вкладки заполнял всю
клиентскую область окна. Это определяется значением свойства Dock,
расположенного в группе свойств Макет элемента управления
TabControl. Окно Свойства элемента управления с вкладками с
раскрытой ячейкой значения свойства Dock приведено на рис. 8.6.

146
Рисунок 8.6 – Свойства Dock в окне Свойства элемента управления
с вкладками

Элемент управления с вкладками содержит две вкладки, но при


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

Рисунок 8.7 – Добавление новой вкладки

Необходимо изменить текст каждой вкладки на что-либо более


вразумительное. Это же относится к значениям свойства (Name). Перейти в
окно Свойства элемента управления TabControl – нажатие клавиши <F4>
при выбранном элементе управления приведет к отображению его окна
свойств, если оно еще скрыто. Затем выберать поле значения свойства
147
TabPage и щелкнуть на появившейся кнопке с символом многоточия.
Откроется диалоговое окно Редактор коллекции TabPage, показанное
на рис. 8.8. Значение свойства Text позволяет изменять надпись на вкладке.

Рисунок 8.8 – Диалоговое окно Редактор коллекции TabPage

8.1.4 Создание диалогового окна

Диалоговое окно (Toolbox) предлагает несколько стандартных


диалогов. Все они предоставляют достаточно большие возможности, но ни
одно из них не подходит в настоящем случае. Поскольку данная программа
требует выполнения очень специфичных действий, нам придется
самостоятельно создать диалоговое окно. Диалоговое окно – это всего лишь
форма, значение свойства FormBorderStyle которой установлено равным
FixedDialog, поэтому инструмент Конструктор форм значительно
облегчит создание диалогового окна. Нужно выбать команду главного меню
Проект→Добавить новый элемент или нажать комбинацию клавиш
<Ctrl+Shift+A>, чтобы открыть диалоговое окно Добавление нового
элемента, показанное на рис. 8.9.
В списке Категории: в левой панели установить категорию UI
(Интерфейс пользователя), а в левой панели Шаблоны выберать шаблон
Форма Windows Forms и ввести имя, как показано на рис. 8.9. Щелчок
на кнопке Добавить приводит к добавлению в проект новой формы и ее
отображению в окне Редактора.

148
Рисунок 8.9 – Диалоговое окно Добавление нового элемента

Нажать клавишу <F4>, чтобы открыть окно Свойства для новой


формы. Значение свойства Text можно изменить. Этот текст отображается в
строке заголовка диалогового окна. Ширину окна можно настроить,
перетаскивая его правый край до тех пор, пока строка заголовка не будет
видна полностью. Можно также установить значение свойства Startposi-
tion (Начальная позиция) в группе свойств Макет, равным Center
Par-ent (По центру родительской формы), чтобы диалоговое окно
отображалось в центре отображающей его родительской формы, в данном
примере – окна приложения. Поскольку создаваемое окно будет диалоговым
окном, а не окном приложения, установить значение свойства
FormBorderStyle равным FixedDialog. Во время его отображения
диалоговое окно не должно быть доступным для сворачивания или
разворачивания на весь экран пользователем, поэтому для удаления из него
упомянутых возможностей установите значения свойств MinimizeBox и
MaximizeBox в группе WindowStyle, равными False. Диалоговое
окно должно закрываться кнопками, которые мы создадим для него, поэтому
установить значение свойства ControlBox равным False, чтобы удалить
из строки заголовка рамки управляющих и системных элементов.
Следующий шаг – добавление двух кнопок в нижнюю часть формы.
Они будут кнопками OK и Cancel (Отмена) диалогового окна. Для левой
кнопки в качестве значения свойства Text установить «OK». Можно также
установить равным OK значение свойства DialogResult в группе
Поведение. Значениями для этих же свойств правой кнопки должны быть,
149
соответственно, «Cancel» и Cancel. Эффект установки значения свойства Di-
alogResult кнопок заключается в установке значения DialogResult
диалогового окна соответствующим этому свойству той кнопки, на которой
был выполнен щелчок для закрытия диалогового окна. Это позволяет
программно проверять, какая кнопка использовалась для закрытия
диалогового окна, и выполнять различный код, в зависимости от того, была
ли это кнопка OK или Cancel.
Теперь, когда мы добавили кнопки в диалоговое окно, можно вернуться
к свойствам диалога и установить значения свойств AcceptButton и
CancelButton в группе свойств Разные равными. В результате при
открытом диалоговом окне нажатие клавиши <Enter> клавиатуры будет
равносильно щелчку на кнопке OK, а нажатие клавиши <Esc> – щелчку на
кнопке Cancel.
Графический интерфейс пользователя диалогового окна готов, но
чтобы он выполнял необходимые действия, придется снова заняться
созданием кода.

8.1.5 Создание обработчика событий диалогового окна

Добавить функцию обработчика события Click для кнопки ОК. Для


этого дважды щелкнуть на кнопке ОК, чтобы добавить каркасный код.
Для кнопки Cancel обработчик события Click не нужен. Щелчок на
этой кнопке влечет за собой всего лишь закрытие диалогового окна без
необходимости выполнения каких-то дальнейших действий.
Значение свойства DialogResult, установленное для диалогового
окна, определяет, было ли закрыто диалоговое окно. Если в качестве его
значения установлено None, диалоговое окно не закрыто. Это значение
свойства можно устанавливать, если по какой-то причине требуется
предотвратить закрытие диалогового окна, например, в случае
недопустимости введенного значения.

8.1.6 Помещение на форму диалоговых окон ColorDialog,


FontDialog, SaveFileDialog

Диалоговое окно «ColorDialog» предназначено для отображения


диалогового окна, в котором с помощью мышки можно выбирать цвет для
изменения свойств любого из элементов формы (рис. 8.10).

150
Рисунок 8.10 – Диалоговое окно ColorDialog

Диалоговое окно «FontDialog» предназначено для отображения


диалогового окна, в котором с помощью мышки можно выбирать параметры
шрифта (вид, размер, начертание и т. д.) для изменения свойства Font
элементов формы (рис. 8.11).

Рисунок 8.11 – Диалоговое окно FontDialog

Диалоговое окно «SaveFileDialog» предназначено для


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

151
Рисунок 8.12 – Диалоговое окно SaveFileDialog

После размещения в форме диалоговых окон ColorDialog,


FontDialog, SaveFileDialog они на форме не появляются, т. е. они
являются невизуальными. Они отображаются ниже формы (рис. 8. 13).
Вызов соответствующего окна диалога делается в коде программы.

Рисунок 8.13 – Размещение диалоговых окон

Окна ColorDialog, FontDialog, SaveFileDialog применяются


только для получения от пользователя желаемых значений настроек.
Другими словами, рассматриваемые компоненты – это оболочки, которые
представляют пользователю стандартные диалоговые окна, с которыми он
может взаимодействовать в хорошо знакомой манере: сгенерированные окна
ведут себя так же, как и аналогичные окна в других приложениях Windows.
Пользователь управляет содержимым окна путем установки связанных с ним
свойств. После того, как окно будет заполнено и закрыто, результат
возвращается через одно или несколько свойств в соответствующий
компонент. Поэтому после того, как пользователь сделает свой выбор, код
приложения должен проверить значения свойств, которые изменились, и
каким-то образом отреагировать на действия пользователя: используя
значения определенных свойств, выполнить нужные действия. Работа
диалогового окна состоит лишь в том, чтобы предоставить пользователю
знакомый интерфейс. После закрытия окна необходимо программно
проверить возвращенные им значения и сделать в коде соответствующие
действия по сохранению файла. То же самое касается и других стандартных
диалоговых окон, поскольку они лишь сообщают приложению о выборе
пользователя, но не выполняют никаких самостоятельных действий.

9. ОБРАБОТКА МАТРИЦЫ. ФОРМИРОВАНИЕ ОДНОМЕРНЫХ


МАССИВОВ ИЗ ДВУМЕРНЫХ. СОРТИРОВКА ОДНОМЕРНЫХ
МАССИВОВ

9.1.1 Особенности работы с матрицами

В реальной жизни структуры, соответствующие двумерным массивам в


программировании, встречаются достаточно часто. Например, оценки
152
студентов группы по разным контрольным точкам по определенной
дисциплине, таблица заработанных футбольной командой очков в
чемпионате страны и т. д. При этом появляется необходимость для
«жизненного» двумерного массива осуществлять подсчет сумм,
произведений, количеств определенных (или всех) элементов по строкам
(или по столбцам) исходной матрицы. Например, итоговая оценка студента
по дисциплине получается путем суммирования оценок по всем контрольным
точкам, т. е. необходимо найти суммы элементов строк, чтобы определить
оценки студентов всей группы.
Рассмотрим решение задачи: найти сумму четных элементов каждой
строки матрицы А[n][m], где n, m задаются пользователем (количество строк
и столбцов матриц), результат записать в массив В.
Нас будет интересовать только сам процесс нахождения сумм четных
элементов. Пример фрагмента программы, решающий данную задачу:
for (i=0; i<n; i++) //перебираем все строки массива
{ s=0; //для каждой строки заново начинаем считать сумму for
(j=0; j<m; j++) //перебираем все элементы данной строки
//находим сумму интересующих нас элементов
if (A[i][j]%2==0) s=s+A[i][j];
B[i]=s; //записываем полученную сумму в одномерный массив
}
Аналогичным образом можно подсчитать и сумму четных элементов
столбцов. Для этого необходимо в предыдущем фрагменте программы
поменять местами строки, организовывающие работу циклов (for …), и при
записи полученных сумм в одномерный массив в качестве индекса
использовать переменную j (B[j]=s).

9.1.2 Сортировка одномерных массивов

Сортировка представляет собой процесс упорядочения элементов в


массиве в порядке возрастания или убывания их значений. Например, массив
В из n элементов будет отсортирован в порядке возрастания значений его
элементов, если
B[1] ≤ B[2] ≤ … ≤ B[n],
и в порядке убывания, если
B[1] ≥ B[2] ≥ … ≥ B[n].

В повседневной жизни процесс сортировки «массивов» используется очень


часто. Например, список в журнале студенческой группы (сортировка по алфавиту
фамилий, а при необходимости и имен, и отчеств) или итоговая таблица
чемпионата страны по футболу (сортировка по набранным командой очкам).
Рассмотрим некоторые из алгоритмов сортировки. При этом будем
рассматривать сортировку по возрастанию. Ключевым отличием сортировки
по убыванию будет то, что в проверке знак «больше» необходимо будет
заменить на знак «меньше».
153
9.1.2.1 Сортировка методом «пузырька». Сортировка методом
«пузырька» основана на выполнении в цикле операций сравнения и при
необходимости обмена соседних элементов. Рассмотрим этот метод более
подробно.
Сравним первый элемент массива со вторым, если первый окажется
больше второго, то поменяем их местами. Затем сравним второй с третьим,
если второй окажется больше третьего, то также поменяем их местами.
Продолжаем сравнивать попарно соседние элементы до сравнения (n–1)-го и
n-го элементов. В результате этих действий самый большой элемент станет
на последнее (n-е) место. Теперь повторим данный алгоритм сначала, с 1-го
до (n–1)-го элемента. Последний n-й элемент не рассматривается, т. к. он уже
занял свое место. После проведения данной операции самый большой
элемент оставшейся части массива станет на свое (n–1)-е место. Так,
уменьшая количество проверяемых элементов, повторяем до тех пор, пока не
проверим последние (точнее первые) два элемента.
Пошаговый пример выполнения данного алгоритма сортировки
представлен в таблице 9.1.

Таблица 9.1 – Сортировка методом «пузырька»


Номер элемента 1 2 3 4 5
Исходный массив 7 3 5 4 2
Первый просмотр 3 5 4 2 7
Второй просмотр 3 4 2 5 7
Третий просмотр 3 2 4 5 7
Четвертый просмотр 2 3 4 5 7

Ниже приведен текст фрагмента программы, предназначенный для


сортировки одномерного массива B[n] методом «пузырька».
for (j= n-1; j>0; j--) for
(i= 0; i<j; i++)
if (B[i]>B[i+1]) {t=B[i]; B[i]=B[i+1]; B[i+1]=t;}

9.1.2.2 Сортировка методом перестановки. Сортировка методом


перестановки основана на поиске наибольшего элемента среди нескольких
последующего его перемещения на последнюю позицию. Рассмотрим этот
метод более подробно.
Найдем в массиве самый большой элемент (при этом запоминаем
номер позиции, где стоит этот элемент) и поменяем его с последним n-м.
Самый большой элемент массива станет на свое место. Найдем среди (n–1)
первых элементов наибольший и поменяем его местами с (n–1)-м. Повторяем
эти действия, уменьшая количество проверяемых элементов на единицу до
тех пор, пока количество рассматриваемых элементов не станет равным
одному.

154
Пошаговый пример выполнения данного алгоритма сортировки
представлен в таблице 9.2.

Таблица 9.2 – Сортировка методом перестановки


Номер элемента 1 2 3 4 5
Исходный массив 7 2 5 4 3
Первый просмотр 3 2 5 4 7
Второй просмотр 3 2 4 5 7
Третий просмотр 3 2 4 5 7
Четвертый просмотр 2 3 4 5 7

Ниже приведен текст фрагмента программы, предназначенный для


сортировки одномерного массива B[n] методом перестановки
for (j= n-1; j>0; j--)
{ max= B[0]; imax= 0; for
(i= 1; i<j+1; i++)
if (B[i]>max) {max= B[i]; imax= i;}
t= B[imax]; B[imax]= B[j]; B[j]= t;
}

9.1.2.3 Сортировка методом вставки. Сортировка методом вставки


основана на поочередном переносе элементов исходного массива в другой,
при этом в новый массив элементы добавляются уже в упорядоченном ви-де.
Рассмотрим этот метод более подробно.
Данный метод удобнее рассмотреть на наглядном примере.
Предположим, что вы перевозите многотомное собрание сочинений А. Дюма
своей библиотеки на новую квартиру. Необходимо расставить хаотично
упакованные в коробку (массив В) книги на книжную полку (массив С) по
порядку. Первую взятую книгу из коробки (первый элемент массива В)
помещаем на полку в крайнюю левую позицию (на первую позицию в массив
С). Для второй, взятой из коробки, книги делаем проверку, учитывая номер
тома (значение элемента массива). Если номер тома взятой книги больше,
чем номер тома выставленной на полку книги, то вставляем новую книгу
справа от уже стоящей, иначе – слева. Повторяем подобные операции
несколько раз. Взяв из коробки k-ю книгу, сравниваем ее (по номеру тома) с
уже стоящими на полке справа налево. Если стоящая на полке крайняя правая
книга больше по номеру тома, чем взятая из коробки, то сдвигаем книгу на
полке правее и проверяем следующую книгу. Найдя по-зицию расположения
взятой из коробки книги среди уже стоящих, вставляем ее на книжную полку.
Повторяем данные операции, пока все книги не займут свои позиции на
книжной полке.
Пошаговый пример выполнения данного алгоритма сортировки
представлен в таблице 9.3.

Таблица 9.3 – Сортировка методом вставки


155
Первый шаг
В 8 6 1 3 4 5 9 10 7 2
С 8
Второй шаг
В 8 6 1 3 4 5 9 10 7 2
С 6 8
Третий шаг
В 8 6 1 3 4 5 9 10 7 2
С 1 6 8
Четвертый шаг
В 8 6 1 3 4 5 9 10 7 2
С 1 3 6 8
Пятый шаг
В 8 6 1 3 4 5 9 10 7 2
С 1 3 4 6 8
Шестой шаг
В 8 6 1 3 4 5 9 10 7 2
С 1 3 4 5 6 8
и т.д.

Ниже приведен текст фрагмента программы, предназначенный


для сортировки одномерного массива B[n] методом вставки.
C[0]= B[0];
for (i= 1; i< n; i++)
{ j= i;
while (j>=0 && B[i]<C[j-1])
{ C[j]= C[j-1]; j--;}
C[j]= B[i];}

9.1.2.4 Сортировка методом Шелла. Сортировка Шелла была названа


в честь еѐ изобретателя – Дональда Шелла, который опубликовал этот
алгоритм в 1959 году.
Сортировка Шелла (англ. Shell sort) – алгоритм сортировки,
являющийся усовершенствованным вариантом сортировки методом
«пузырька». Идея метода Шелла состоит в сравнении элементов, стоящих не
только рядом, но и на определѐнном расстоянии друг от друга. Иными
словами – это сортировка методом «пузырька» с предварительными
«грубыми» проходами.
При сортировке Шелла сначала сравниваются и сортируются между
собой значения, отстоящие один от другого на некотором расстоянии d.
После выполнения интервал уменьшается по формуле d(k) = [d(k + 1) – 1] / 2.
После этого процедура повторяется для уменьшенных значений d, а
завершается сортировка Шелла упорядочиванием элементов при d = 1 (то
есть обычной сортировкой методом «пузырька»).
Эффективность сортировки Шелла в определённых случаях
156
обеспечивается тем, что элементы «быстрее» встают на свои места.
Ниже приведен текст фрагмента программы, предназначенный для
сортировки одномерного массива B[n] методом Шелла.
d=n-1; while
(d>0)
{
for (j=1; j<n; j+=d)
{ for (i=0; i<n-j; i++) {
if (B[i]>B[i+1])
{ t=B[i]; B[i]=B[i+1]; B[i+1]=t; }
}
}
d=(d-1)*0.5;
}

157
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ

ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ АВТОНОМНОЕ ОБРАЗОВАТЕЛЬНОЕ


УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
«СЕВЕРО-КАВКАЗСКИЙ ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ»

УЧЕБНОЕ ПОСОБИЕ
(ЛАБОРАТОРНЫЙ ПРАКТИКУМ)
по дисциплине «Программирование на языке высокого уровня»

для студентов направления подготовки


11.03.02 Инфокоммуникационные технологии и системы связи,
профиля
«Сети связи и системы коммутации»

Ставрополь, 201
158
УДК - Печатается по решению

ББК - Учебно-методического совета

Северо-Кавказского федерального

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

Рецензенты:
Петренко Вячеслав Иванович, кандидат технических наук,
доцент, заместитель директора по науке института информационных
технологий и телекоммуникаций;
Братченко Наталья Юрьевна, кандидат физико-математических наук,
доцент, доцент кафедры инфокоммуникаций.

Составитель: Олег Хазиакрамович Шаяхметов

Ш-
Шаяхметов О.Х. Программирование на языке высокого уровня: Учебное
пособие (лабораторный практикум). – Ставрополь: Изд. СКФУ, 2016. - 186 с.

Приведены теоретические сведения по программированию в среде Microsoft


Visual Studio. Предложены практические задания для лабораторного практикума и
самостоятельной работы. Учебное пособие предназначено для студентов,
преподавателей, всех, кто решил освоить навыки программирования на языке С++
в среде Microsoft Visual Studio.

©ФГАОУ ВПО «Северо-Кавказский


Федеральный университет», 2016

159
ОГЛАВЛЕНИЕ

ВВЕДЕНИЕ 4
ЛАБОРАТОРНАЯ РАБОТА 1. Знакомство со средой Microsoft Visual 6
Studio 2010 и настройка компилятора языка С++. Стандартный ввод-
вывод. Создание простейшей программы на языке С++
ЛАБОРАТОРНАЯ РАБОТА 2. Переменные и базовые типы данных 26
языка С++. Создание программы линейного алгоритма
ЛАБОРАТОРНАЯ РАБОТА 3. Принятие решений. Условные 53
операторы в языке С++
ЛАБОРАТОРНАЯ РАБОТА 4. Организация циклов в языке С++ 74
ЛАБОРАТОРНАЯ РАБОТА 5. Одномерные числовые массивы в 92
языке программирования С++. Селективная обработка элементов
массива. Нахождение минимального и максимального элементов
массива
ЛАБОРАТОРНАЯ РАБОТА 6. Понятие многомерного массива. 108
Обработка элементов матриц
ЛАБОРАТОРНАЯ РАБОТА 7. Построение графика функции 128
ЛАБОРАТОРНАЯ РАБОТА 8. Файловый ввод и вывод в языке С++ 151
ЛАБОРАТОРНАЯ РАБОТА 9. Обработка элементов диагоналей 176
квадратных матриц

160
ВВЕДЕНИЕ

Данное учебное пособие освещает практические приемы


программирования на языке С (читается "Си") в среде программирования
Microsoft Visual Studio 2010, которая устанавливается в режиме
программирования С.
Изначально язык С предназначался для системного программирования
при создании операционных систем, системных утилит и встраиваемого
программного обеспечения. Он обладает всеми необходимыми для этого
свойствами: программы, написанные на нем, очень эффективны, не требу ют
специальной среды поддержки времени выполнения. Программы на языке С
имеют низкие требования к аппаратной части вычислительной системы. Тем
не менее в настоящее время язык С часто выбирается из-за стабильности
языка и его окружения (стандартные библиотеки, компиляторы и другие
инструментальные средства), а также наличия возможности получения
программ, выполняющихся с максимальной скоростью на данной аппаратной
платформе. Более того, язык С можно использовать и для создания веб-
сайтов через технологию CGI (Common Gateway Interface – общий шлюзовый
интерфейс).
Немаловажно также то, что компиляторы, библиотеки и инструменты
разработки на языке С существуют практически для всех систем. Программы
на языке С отличаются переносимостью между платформами на уровне
исходного кода.
Язык C оказал большое влияние на индустрию разработки программного
обеспечения. С одной стороны, синтаксис многих его инструкций лежит в
основе таких языков, как С++, С#, Java, PHP. С другой – он используется в
качестве промежуточного в некоторых системах программирования, когда
программа сначала транслируется в программу на языке С, и только потом
компилируется компилятором языка С для получения окончательного
исполняемого модуля.
161
Язык С называют компьютерным языком "среднего уровня". Но это не
означает, что он менее совершенен по сравнению с традиционными языками
высокого уровня, такими как Fortran, Pascal, Basic и др. Язык С сочетает
элементы языков высокого уровня с функциональностью ассемблера. В нем
заложены возможности для разработки конструкций, характерных для языков
высокого уровня. В то же время С позволяет манипулировать битами,
байтами и адресами, т. е. базовыми элементами, с которыми работает
компьютер.
К неоспоримым достоинствам языка С относятся следующие:
− универсальность (используется почти на всех существующих ЭВМ);
− компактность и универсальность кода;
− быстрота выполнения программ;
− гибкость;
− высокая структурированность.
Строительными блоками языка С являются функции, с помощью
которых возможно выполнение операций как высокого, так и сравнительно
низкого уровня.
Важным аспектом языка С является его структурированность.
Специфическая черта структурированного языка – использование блоков.
Блок – это набор инструкций, которые логически связаны между собой.
Другая характерная особенность языка С – отсутствие ответственности
за действия программиста. Например, в нем не предусматривается контроль
выхода за границы массивов (числовых или символьных). Основной принцип
данного языка состоит в том, чтобы позволить программисту делать все, что
он хочет, но и за последствия отвечает не язык, а программист.

162
ЛАБОРАТОРНАЯ РАБОТА 1
Знакомство со средой Microsoft Visual Studio 2010 и настройка
компилятора языка С++. Стандартный ввод-вывод. Создание
простейшей программы на языке С++

Цель работы: научиться использовать среду Visual Studio 2010 для


создания простейших программ по программированию на языке С++.

Формируемые компетенции:
(ОПК-2) - способностью решать стандартные задачи профессиональной
деятельности на основе информационной и библиографической культуры с
применением инфокоммуникационных технологий и с учетом основных
требований информационной безопасности;
(ОПК-3) - способностью владеть основными методами, способами и
средствами получения, хранения, переработки информации;
(ОПК-4) - способностью иметь навыки самостоятельной работы на
компьютере и в компьютерных сетях; осуществлять компьютерное
моделирование устройств, систем и процессов с использованием
универсальных пакетов прикладных компьютерных программ.

Теоретическая часть

Язык С (читается как Си) в основе своей был создан в 1972 г. как язык для
операционной системы UNIX. Автором этого языка считается Деннис М. Ритчи
(DENNIS M. RITCHIE).
Популярность языка С обусловлена, прежде всего тем, что большинство
операционных систем были написаны на языке С. Его начальное
распространение было задержано из-за того, что не было удачных компиляторов.
Несколько лет не было единой политики в стандартизации языка С. В начале
1980-х годов в Американском национальном институте стандартов (ANSI) началась
работа по стандартизации языка С. В 1989 г. работа комитета по языку С была

163
ратифицирована, и в 1990 г. был издан первый официальный документ по стандарту
языка С. Появился стандарт 1989.
К разработке стандарта по языку С была также привлечена Международная
организация по стандартизации (ISO). Появился стандарт ISO/IEC 9899:1990, или
ANSI C99 языка С.
В данном пособии за основу принимается стандарт языка С от 1989 г. и
написание программ будет выполняться в среде разработки Visual Studio 2010.
Язык С является прежде всего языком высокого уровня, но в нем заложены
возможности, которые позволяют программисту (пользователю) работать
непосредственно с аппаратными средствами компьютера и общаться с ним на
достаточно низком уровне. Многие операции, выполняемые на языке С, сродни языку
Ассемблера. Поэтому язык С часто называют языком среднего уровня.
Для написания программ в практических разделах данного учебного пособия
будет использоваться компилятор языка С++, а программирование будет вестись в
среде Microsoft Visual Studio 2010. Предполагается, что на компьютере установлена
эта интегрированная среда.
Microsoft Visual Studio 2010 доступна в следующих вариантах:
 Express – бесплатная среда разработки, включающая только базовый
набор возможностей и библиотек.
 Professional – поставка, ориентированная на профессиональное создание
программного обеспечения, и командную разработку, при которой созданием
программы одновременно занимаются несколько человек.
 Premium – издание, включающее дополнительные инструменты для работы
с исходным кодом программ и создания баз данных.
 Ultimate – наиболее полное издание Visual Studio, включающие все доступные
инструменты для написания, тестирования, отладки и анализа программ, а
также дополнительные инструменты для работы с базами данных и
проектирования архитектуры ПО.
Отличительной особенностью среды Microsoft Visual Studio 2010 является то,
что она поддерживает работу с несколькими языками программирования и
программными платформами. Поэтому перед тем, как начать создание программы
на языке С, необходимо выполнить несколько подготовительных шагов по
созданию проекта и выбору и настройке ком- пилятора языка С для трансляции
исходного кода.

164
После запуска Microsoft Visual Studio 2010 появляется следующая
стартовая страница, которая показана на рис. 1.1.

Рисунок 1.1 – Стартовая страница Visual Studio 2010

Следующим шагом является создание нового проекта. Для этого в меню


Файл необходимо выбрать Создать →Проект (или комбинацию клавиш
Ctrl + Shift
+ N). Результат выбора пунктов меню для создания нового проекта показан
на рис. 1.2.

Рисунок 1.2 – Окно с выбором нового проекта

165
Среда Visual Studio отобразит окно Создать Проект, в котором необходимо
выбрать тип создаваемого проекта. Проект используется в Visual Studio для
логической группировки нескольких файлов, содержащих исходный код, на одном из
поддерживаемых языков программирования, а также любых вспомогательных
файлов. Обычно после сборки проекта (которая включает компиляцию всех
всходящих в проект файлов исходного кода) создается один исполняемый модуль.
В окне Создать Проект следует развернуть узел Visual С++,
обратиться к пункту Win32 и на центральной панели выбрать Консольное
приложение Win32. Выбор этой опции показан на рис. рис. 1.3.

Рисунок 1.3 – Выбор типа проекта

Затем в поле редактора Имя (где по умолчанию имеется <Введите имя>)


следует ввести имя проекта, например, hell. В поле Расположение можно указать путь
размещения проекта, или выбрать путь размещения проекта с помощью клавиши
(кнопки) Обзор. По умолчанию проект сохраняется в специальной папке Projects.
Пример выбора имени проекта показано на рис. 1.4.

Рисунок 1.4 – Пример задания имени проекта

166
Одновременно с созданием проекта Visual Studio создает решение. Решение
(solution) – это способ объединения нескольких проектов для организации более
удобной работы с ними.
После нажатия кнопки OK откроется окно Мастер приложений
Win32, показанное на рис. 1.5.
Выбор имени проекта может быть достаточно произвольным: допустимо
использовать числовое значение, допустимо имя задавать через буквы русского
алфавита.
В дальнейшем будем использовать имя, набранное с помощью букв латинского
алфавита и, может быть, с добавлением цифр.

Рисунок 1.5 – Мастер создания приложения

На первой странице представлена информация о создаваемом проекте, на


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

167
Рисунок 1.6 – Страница мастера настройки проекта по умолчанию

В дополнительных опциях (Параметры приложения) следует


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

Рисунок 1.7 – Выполненная настройка мастера приложений

Здесь и далее будут создавать проекты по приведенной схеме, т. е. проекты


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

168
Рисунок 1.8 – Меню добавления нового элемента к проекту

После выбора (нажатия) Новый элемент получим окно, показанное на рис. 1.9,
где через пункт меню Код узла Visual C++ выполнено обращение к центральной
части панели, в которой осуществляется выбор типа файлов. В данном случае
требуется обратиться к закладке C++ File (*.cpp).

Рисунок 1.9 – Окно выбора типа файла для подключения к проекту

Теперь в поле редактора Имя (в нижней части окна) следует задать имя нового
файла и указать расширение ".с". Например, main.c. Имя файла может быть
достаточно произвольным, но имеется негласное соглашение, что имя файла должно
отражать его назначение и логически описывать исходный код, который в нем

169
содержится. В проекте, состоящем из нескольких файлов, имеет смысл выделить
файл, содержащий главную функцию программы, с которой она начнет
выполняться. В данном пособии такому файлу мы будем задавать имя main.c, где
расширение .с указывает на то, что этот файл содержит исходный код на языке
С, и он будет транслироваться соответствующим компилятором. Программам на
языке С принято давать расширение .с. После задания имени файла в поле
редактора Name получим форму, показанную на рис. 1.10.

Рисунок 1.10 – Задание имени файла, подключаемому к проекту

Затем следует нажать кнопку Добавить. Вид среды Visual Studio после
добавления первого файла к проекту показан на рис. 1.11. Для добавленного файла
автоматически открывается редактор.

Рисунок 1.11 – Подключение файла проекта

170
В папке проекта отображаются файлы, включенные в проект в папках.
Приведем описание.
Папка Файлы исходного кода предназначена для файлов с исходным кодом. В
этой папке отображаются файлы с расширением .с.
Папка Заголовочные файлы содержит заголовочные файлы с
расширением .h. Папка Файлы ресурсов содержит файлы ресурсов,
например изображения и т. д. Папка Внешние зависимости отображает
файлы, не добавленные явно в проект, но использующиеся в файлах
исходного кода, например включенные при помощи директивы #include.
Обычно в папке Внешние зависимости присутствуют заголовочные файлы
стандартной библиотеки, использующиеся в проекте.
Следующий шаг состоит в настройке проекта. Для этого в меню Проект
главного меню следует выбрать Свойства hell (или с помощью последовательного
нажатия клавиш Alt+F7). Пример обращения к этому пункту меню показан на рис.
1.12.

Рисунок 1.12 – Обращение к странице свойств проекта

После того как произойдет открытие окна свойств проекта, следует обратиться
(с левой стороны) к Свойства конфигурации. Появится ниспадающий список,
который показан на рис. 1.13. Выполнить обращение к узлу Общие, и через него в
левой панели выбрать Набор символов, где установить свойство Использовать

171
многобайтовую кодировку. Настройка Набор символов позволяет выбрать, какая
кодировка символов – ANSI или UNICODE – будет использована при компиляции
программы. Для совместимости со стандартом C89 мы выбираем Использовать
многобайтовую кодировку. Это позволяет использовать многие привычные функции,
например, функции по выводу информации на консоль.

Рисунок 1.13 – Меню списка свойств проекта

После сделанного выбора, показанного на рис. 1.13, следует нажать кнопку


Применить. Затем следует выбрать узел С/С++ и в ниспадающем меню выбрать пункт
Создание кода, через который следует обратиться в правой части панели к закладке
Включить C++ исключения, для которой установить Нет (запрещение исключений
С++). Результат установки выбранного свойства показан на рис. 1.14. После
произведенного выбора нажать кнопку Применить.

172
Рисунок 1.14 – Страница свойств для запрещения исключений С++

Далее в ниспадающем меню узла С/С++ необходимо выбрать пункт


Язык и через него обратиться в правую часть панели, где установить
следующие свойства: свойство Отключить расширение языка
(дополнительные языковые расширения фирмы Microsoft) в Да (/Za),
свойство Считать wchar_t встроенным типом установить в Нет
(/Zc:wchar_t–), свойство Обеспечение согласования видимости
переменных, объяв- ленных в заголовке оператора цикла for установить
в да(/Zc:forScope), свойство Включить информацию о типах время
выполнения установить в Нет (/GR–), свойство Поддержка Open MP
(разрешить расширение Open MP – используется при написании программ
для многопроцессорных систем) установить в Нет(/openmp–).
Результат выполнения этих действий показан на рис. 1.15.

173
Рисунок 1.15 – Страница свойств закладки Язык

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


Далее в ниспадающем списке узла С/С++ следует выбрать пункт
Дополнительно и в правой панели изменить свойство Компилировать как в
свойство компиляции языка С, т. е. Компилировать как код C (/TC).
Результат установки компилятора языка С показан на рис. 1.16.

Рисунок 1.16 – Результат выбора режима компиляции языка С

После нажатия клавиш Применить и ОК сначала откроется подготовленный


проект с пустым полем редактора кода, в котором можно начать писать программы.
В этом редакторе наберем программу, выводящую традиционное приветствие "Hello
World". Для компиляции созданной программы можно обратиться в меню
Построение, или, например, набрать клавиши Ctr+F7. В случае успешной
компиляции получим следующую экранную форму, показанную на рис. 1.17.

174
Рисунок 1.17 – Успешно откомпилированная первая программа на языке С

Для приведенного кода программы запуск на ее исполнение из окна редактора


в Visual Studio 2010 можно нажать клавишу F5. На рис. 1.18 показан результат
исполнения первой программы.

Рисунок 1.18 – Консольный вывод первой программы на языке С

Примечание. Вывод требуемой информации осуществляется с помощью букв


латинского алфавита. Комментарии в программе могут быть сделаны после
символа "//" или внутри комбинации символов "/* */".
Произведем разбор первой программы. Во-первых, надо отметить, что в языке
С нет стандартных инструкций (операторов) для вывода сообщений на консоль (окно
пользователя). В языке С предусматриваются специальные библиотечные файлы, в
которых имеются функции для этих целей. В приведенной программе используется
заголовочный файл с именем stdio.h (стандартный ввод–вывод), который должен быть
включен в начало программы. Для вывода сообщения на консоль используется
функция printf(). Для работы с консолью включен также заголовочный файл conio.h,

175
который поддерживает функцию _getch(), которая извлекает символ из потока
ввода, т. е. она предназначена для приема сообщения о нажатии какой-либо
(почти любой) клавиши на клавиатуре. С другими компиляторами, возможно,
потребуется getch(), т. е. без префиксного нижнего подчеркивания. Строка программы
int main (void) сообщает системе, что именем программы является main() – главная
функция, и что она возвращает целое число, о чем указывает аббревиатура "int".
Имя main() – это специальное имя, которое указывает, где программа должна
начать выполнение. Наличие круглых скобок после слова main()
свидетельствует о том, что это имя функции. Если содержимое круглых скобок
отсутствует или в них содержится служебное слово void, то это означает, что в
функцию main() не передается никаких аргументов. Тело функции main()
ограничено парой фигурных скобок. Все утверждения программы, заключенные в
фигурные скобки, будут относиться к функции main().
В теле функции main() имеются еще три функции. Во-первых, функции printf()
находятся в библиотеке компилятора языка С, и они печатают или отображают те
аргументы, которые были подставлены вместо параметров. Символ "\n"
составляет единый символ newline (новая строка), т. е. с помощью этого символа
осуществляется перевод на новую строку. Символ "\t" осуществляет табуляцию, т.
е. начало вывода результатов программы с отступом вправо.
Функция без параметров _getch() извлекает символ из потока ввода (т. е. ожидает
нажатия почти любой клавиши). С другими компиляторами, возможно, потребуется
getch(), т.е. без префиксного нижнего подчеркивания.
Последнее утверждение в первой программе return 0 указывает на то, что
выполнение функции main() закончено и что в систему возвращается значение 0
(целое число). Нуль используется в соответствии с соглашением об индикации
успешного завершения программы.
В завершение следует отметить, что все действия в программе завершаются
символом точки с запятой.
Все файлы проекта сохраняются в той папке, которая сформировалась после
указания в поле Location имени проекта (hell). На рис. 1.19 показаны папки и
файлы проекта Visual Studio 2010.

176
Рисунок 1.19 – Файлы и папки созданного проекта

На рис. 1.19 файлы с полученными расширениями означают:


hell.sln – файл решения для созданной программы. Он содержит информацию о
том, какие проекты входят в данное решение. Обычно, эти проекты расположены в
отдельных подкаталогах. Например, наш проект находится в подкаталоге hell;
hell.suo – файл настроек среды Visual Studio при работе с решением, включает
информацию об открытых окнах, их расположении и прочих пользовательских
параметрах.
hell.sdf – файл, содержащий вспомогательную информацию о проекте, который
используется инструментами анализа кода Visual Studio, такими как IntelliSense для
отображения подсказок об именах и т. д.
Файлы папки Debug показаны на рис. 1.20.

177
Рисунок 1.20 – Файлы папки Debug

Рассмотрим файлы в соответствии с рис. 1.20.


hell.exe – исполняемый файл проекта;
hell.ilk – файл "incremental linker", используемый компоновщиком для
ускорения процесса компоновки;
hell.pdb – отладочная информация/информация об именах в исполняемых
файлах, используемая отладчиком.
Файлы папки hell показаны на рис. 1.21.

Рисунок 1.21 – Содержимое папки hell

178
Характеристика содержимого папки hell: main.c – файл исходного
программного кода, hell.vcxproj – файл проекта,
hell.vcxproj.user – файл пользовательских настроек, связанных с
проектом,
hell.vcxproj.filters – файл с описанием фильтров, используемых Visual Studio
Solution Explorer для организации и отображения файлов с исходным кодом.

Оборудование и материалы
1. Персональный компьютер;
2. Операционная система семейства Microsoft Windows;
3. Среда программирования Microsoft Visual Studio.

Указания по технике безопасности


1. Не входить в помещение, где находится вычислительная техника без
разрешения преподавателя.
2. Не работать в верхней одежде.
3. Не включать без разрешения оборудование.
4. При несчастном случае, или поломке оборудования позвать
преподавателя. Знать где находится рубильник (выключатель) выключения
электропитания оборудования.
5. Не трогать провода и разъемы (возможно поражение электрическим
током).
6. Не допускать порчи оборудования.

Задания
1. Получить навыки работы со средой Microsoft Visual Studio 2010 и
уметь настраивать компилятор языка С++.
2. Осуществлять стандартный ввод-вывод в Microsoft Visual Studio 2010
и создавать консольную программу.
179
3. Уметь создавать простейшие программы на языке С++ в Microsoft
Visual Studio 2010.

Содержание отчета
1 . Работа предъявляется на экране компьютера в виде исходного кода и в виде
отчета, содержащего: ФИО студента, шифр группы, номер и тему лабораторной
работы, полный код программы на языке программирования С++.
2 . Отчет выполняется на компьютере и распечатывается на листах бумаги
формата А4.
3. Каждая работа должна быть защищена.

Контрольные вопросы
1. Назовите компиляторы языка С?
2. Какое имя имеет исполняемый файл созданного проекта?
3. Объясните назначение заголовочных файлов stdio.h, conio.h.
4. Как будет работать программа без заголовочного файла conio.h?
5. В каком месте программы находится точка ее входа?
6. Как осуществляется табуляция строки на консоли и на сколько позиций
выполняется отступ от левого края?
7. Какое значение имеет главная функция проекта main() в программах на
языке С?

Список литературы, рекомендуемый к использованию по данной


теме
1. Павловская, Т. А. С/С++: программирование на языке высокого
уровня : учебник для вузов/ Т. А. Павловская. – СПб. : Питер, 2010. – 461 с. –
(Учебник для вузов). – Библиогр.: с. 383. –Прил.: с.384-449. –ISBN 978-5-
94723-568-5.
2. Крылов, Е. В. Техника разработки программ : учебник : в 2 кн. / Е. В.
Крылов, В. А. Острейковский, Н. Г. Типикин, Кн. 1, Программирование на
языке высокого уровня. – Москва : Высшая школа, 2007. – 375 с. – (Для

180
высших учебных заведений) (Информатика и вычислительная техника). –
Библиогр.: с. 333-348. – Прил. с. 349-375. – ISBN 978-5-06-005524-5.
3. Ашарина И. В. Основы программирования на языках С и С++. – М.:
Горячая линия – Телеком, 2002. –207 с.: ил.
4. Кнут Д. Искусство программирования. Доступно:
http://lib.ru/CTOTOR/KNUT/
5. Ресурс по программированию. Доступно: http://physics-for-
students.ru/bookpc/informatika/slovar.zip
6. Языки программирования. Доступно: http://cppstudio.com/

181
ЛАБОРАТОРНАЯ РАБОТА 2
Переменные и базовые типы данных языка С++.
Создание программы линейного алгоритма

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


алгоритма, записывать математические выражения на языке С++.

Формируемые компетенции:
(ОПК-2) - способностью решать стандартные задачи профессиональной
деятельности на основе информационной и библиографической культуры с
применением инфокоммуникационных технологий и с учетом основных
требований информационной безопасности;
(ОПК-3) - способностью владеть основными методами, способами и
средствами получения, хранения, переработки информации;
(ОПК-4) - способностью иметь навыки самостоятельной работы на
компьютере и в компьютерных сетях; осуществлять компьютерное
моделирование устройств, систем и процессов с использованием
универсальных пакетов прикладных компьютерных программ.

2.1 Теоретическая часть


2.1.1 Понятие алгоритма. Блок-схема
Алгоритм – конечная последовательность предписаний, однозначно
определяющая процесс преобразования исходных данных в результат
решения задачи.
В процессе разработки алгоритма могут использоваться различные
способы его описания. Наиболее распространенные:
− словесная запись;
− графические схемы алгоритмов (блок-схемы);
− псевдокод (формальные алгоритмические языки);
− структурограммы.
182
Блок-схема – это графическое представление алгоритма, дополненное
элементами словесной записи. На блок-схеме каждый пункт алгоритма
изображается соответствующей геометрической фигурой. В таблице 2.1.
приведены графические элементы, на которых компонуются блок-схемы, их
названия и символы.

Таблица 2.1 – Графические элементы блок-схем


Название блока Блок Отображаемая функция
Начало-конец Начало, конец, вход-выход
в программах

Блок ввода-вывода Ввод данных либо


вывод результатов на экран

Блок вывода Вывод данных на печать

Процесс Вычисление
или последовательность
вычислений

Предопределенный Выполнение
подпрограммы
процесс
Альтернатива Проверка условий

Модификация Начало цикла

Соединитель Разрыв линий потока


информации в пределах
одной страницы

В таблице 2.2. приведены основные базовые элементарные структуры


для составления блок-схем.

183
Таблица 2.2 – Базовые структуры блок-схем
Название типа
Изображение
структуры

Последовательность

Разветвление (выбор)

Сокращенная запись
разветвления

Выбор варианта

Цикл с предусловием

Цикл с постусловием

Цикл с параметрами

184
2.1.2 Алфавит и лексемы языка С++
В алфавит языка С входят:
 прописные и строчные буквы латинского алфавита;
 цифры: 0,1,2,3,4,5,6,7,8,9;
 специальные знаки:

Из символов алфавита формируются лексемы языка:


 идентификаторы;
 ключевые (служебные, иначе зарезервированные) слова;
 константы;
 знаки операций;
 разделители (знаки пунктуации).
Рассмотрим эти лексические элементы языка подробнее.
Идентификатор – последовательность из букв латинского алфавита,
десятичных цифр и символов подчеркивания, начинающаяся не с цифры:
RUN run hard_RAM_disk сору_54
Прописные и строчные буквы различаются. Таким образом, в этом
примере два первых идентификатора различны. На длину различаемой части
идентификатора конкретные реализации накладывают ограничение.
Компиляторы различают не более 32-х первых символов любого
идентификатора. Некоторые реализации С++ на ЭВМ типа VAX допускают
идентификаторы длиной до 8 символов.
Ключевые (служебные) слова – это идентификаторы, зарезервированные
в языке для специального использования. Ключевые слова С++:
asm else private throw
auto enum protected try
break extern public typedef
case float register typeid
catch for return union

185
char friend short unsigne
class goto signed virtual
const if sizeof void
continue inline static volatil
default int struct while
delete long switch
do new template
double operator this

Ранее в языке С++ был зарезервирован в качестве ключевого слова


идентификатор overload. Для компиляторов фирмы Borland (ВС++ и ТС++)
дополнительно введены ключевые слова:
cdecl _export _loadds _saveregs
_cs far near _seg
_ds huge pascal _ss
еs interrupt regparam

Там же введены как служебные слова регистровые переменные:


_АН _СН _SI _SS
_AL _CL _DI _ES
_AX _CX _BP _FLAGS
_ВН _DH _SP
_BL _DL _CS
_BX _DX _DS

Отметим, что ранние версии ВС++ и ТС++ не включали в качестве


ключевых слов идентификаторы throw, try, typeid, catch.
He все из перечисленных служебных слов сразу же необходимы
программисту, однако запрещено использовать их в качестве произвольно
выбираемых имен, и список служебных слов нужно иметь уже на начальном
этапе знакомства с языком С++. Кроме того, идентификаторы, включающие
два подряд символа подчеркивания ( ), резервируются для реализаций С++ и
стандартных библиотек. Идентификаторы, начинающиеся с символа
подчеркивания (_), используются в реализациях языка Си. В связи с этим

186
начинать выбираемые пользователем идентификаторы с символа
подчеркивания и использовать в них два подряд символа подчеркивания не
рекомендуется.
Константа (литерал) – это лексема, представляющая изображение
фиксированного числового, строкового или символьного (литерного)
значения.
Константы делятся на пять групп: целые, вещественные (с плавающей
точкой), перечислимые, символьные (литерные) и строковые (строки или
литерные строки). Перечислимые константы проект стандарта языка С++ [2]
относит к одному из целочисленных типов.
Компилятор, выделив константу в качестве лексемы, относит еѐ к той
или другой группе, а внутри группы – к тому или иному типу данных по ее
«внешнему виду» (по форме записи) в исходном тексте и по числовому
значению.
Целые константы могут быть десятичными, восьмеричными и
шестнадцатеричными.
Фундаментальные объекты данных, с которыми работает программа, –
это переменные и константы. Используемые в программе переменные
перечисляются в объявлениях или декларациях, в которых указывается их
тип, а также иногда их начальные значения.
С именами переменных связывается тип данных, который
контролируется компилятором и для которого выделяется определенное
количество байтов памяти. Имена переменных должны начинаться с буквы
(латинского алфавита) или символа подчеркивания (например, _aza), за
которым могут следовать любые комбинации букв в любом регистре
(заглавные или строчные), символы подчеркивания или цифры 0–9. В языке
С имеется различие между заглавными и строчными буквами. Поэтому
переменная World будет отличаться от переменной world и т. п. При этом в
определении переменной не разрешается символ пробела (пробелов) и
некоторые другие символы, например $... .
187
Стандарт С89 определяет пять базовых типов данных:
int – целочисленный тип, целое число;
float – вещественное число одинарной точности с плавающей точкой;
double – вещественное число двойной точности с плавающей точкой;
char – символьный тип для определения одного символа;
void – тип без значения.
Кроме того, существуют модификаторы, которые могут применяться к
этим базовым типам. Ряд компиляторов может поддерживать еще и
логический тип _Bool. Тип void служит для объявления функции, не
возвращающей значения, или для создания универсального указателя
(pointer).
Объект типа char всегда занимает 1 байт памяти. Размеры объектов
других типов, как правило, зависят от среды программирования и
операционной системы.
Приведем модификаторы базовых типов данных. К ним относятся
следующие спецификаторы, предшествующие им в тексте программы:
signed, unsigned, long, short
Базовый тип int может быть модифицирован каждым из перечисленных
спецификаторов. Тип char модифицируется с помощью unsigned и signed, тип
double – с помощью long.
В табл. 2.3 приведены допустимые комбинации типов данных языка С с
их минимальным диапазоном значений и типичным размером.

Таблица 2.3 – Типы данных языка С


Типичный размер Минимально
Тип данных в битах допустимый диапазон
char 8 (или 1 байт) от –127 до
начений
127
unsigned char 8 от 0 до 255
signed char 8 от –127 до 127
int 16 или 32 от –32767 до 32767
188
unsigned int 16 или 32 от 0 до 65535
signed int 16 или 32 от –32767 до 32767
short int 16 от –32767 до 32767
unsigned short int 16 от 0 до 65535
signed short int 16 от –32767 до 32767
long int 32 от –2147483647 до 2147483647
long long int 64 от –(263 –1 ) до (263 –1) для С99
signed long int 32 от –2147483647 до 2147483647
unsigned long int 32 от 0 до 4294967295
unsigned long long 64 от 0 до (264 –1) для С99
float 32 от 1Е–37 до 1Е+37 (с
точностью не менее 6
значащих десятичных
цифр)
double 64 от 1Е–37 до 1Е+37 (с
точностью не менее 10
значащих десятичных цифр)
long double 80 от 1Е–37 до 1Е+37 (с
точностью не менее 10
значащих десятичных цифр)

Для базового типа int возможны следующие записи с модификатором:


signed или signed int
unsigned или unsigned int
long или long int short
или short int
Для данных вещественного типа максимальные значения абсолютных
величин представлены в табл. 2.4.

Таблица 2.4 – Вещественные типы данных языка С


Типичный размер
Тип данных Диапазон абсолютных величин
в битах
float 32 от 3.4Е–38 до 3.4Е+37
double 64 от 1.7Е–308 до 1.7Е+308
long double 80 от 3.4Е–4932 до 1.1Е+4932

189
В языке С предусматривается преобразование типов в выражениях и
приведение типов. Если в выражении смешаны различные типы литералов и
переменных, то компилятор преобразует их в один тип. Во-первых, все char и
short int значения автоматически преобразуются (с расширением
"типоразмера") в тип int. Этот процесс называется целочисленным
расширением (integral promotion). Во-вторых, все операнды преобразуются
(также с расширением "типоразмера") в тип самого большого операнда. Этот
процесс называется расширением типа (type promotion), причем он
выполняется пооперационно. Например, если один операнд имеет тип int, а
другой – long int, то тип int расширяется в тип long int. Или если хотя бы один
из операндов имеет тип double, то любой другой операнд приводится к типу
double. Это означает, что такие преобразования, как тип char в тип double,
вполне допустимы (если предусматривать, к чему это приведет). После
преобразования оба операнда будут иметь один и тот же тип, а результат
операции – тип, совпадающий с типом операндов. Приведем
последовательность преобразования типов в выражениях по старшинству:
ЕСЛИ операнд имеет тип long double
ТО второй операнд преобразуется в long double
ИНАЧЕ ЕСЛИ операнд имеет тип double
ТО второй операнд преобразуется в double
ИНАЧЕ ЕСЛИ операнд имеет тип float
ТО второй операнд преобразуется в float
ИНАЧЕ ЕСЛИ операнд имеет тип unsigned long
ТО второй операнд преобразуется в unsigned long
ИНАЧЕ ЕСЛИ операнд имеет тип long
ТО второй операнд преобразуется в long
ИНАЧЕ ЕСЛИ операнд имеет тип unsigned int
ТО второй операнд преобразуется в unsigned int
Кроме того, действует правило: если один из операндов имеет тип long, а
второй – unsigned int, притом значение unsigned int не может быть
представлено типом long, то оба операнда преобразуются в значение типа
unsigned long.
В языке С предусматривается явное преобразование (приведение) типов.
190
Общая форма оператора явного приведения типа: (тип) выражение. В
приведенной форме тип – это любой поддерживаемый тип данных.
Явное преобразование типа – это операция. Оператор приведения типа
является унарным и имеет тот же приоритет, что и остальные унарные
операторы. В приводимых ниже программах используются такие средства
ввода-вывода, как
printf(), getchar(), gets(), scanf().
Приведем характеристику данных функций.
Прототип функции printf() имеет вид:
int printf(const char *format, ?);
Функция printf() записывает в стандартный поток stdout (стандартный
выходной поток данных) значения аргументов из заданного списка
аргументов в соответствии со строкой форматирования, адресуемой
параметром format. Строка форматирования состоит из элементов двух
типов. К элементам первого типа относятся символы, которые выводятся на
экран. Элементы второго типа содержат спецификации формата,
определяющего способ отображения аргументов. Спецификация формата
начинается символом процента, за которым следует код формата. На
спецификации формата могут воздействовать модификаторы, задающие
ширину поля, точность и признак выравнивания по левому краю. Целое
значение, расположенное между знаком % и командой форматирования,
играет роль спецификации минимальной ширины поля. Наличие этого
спецификатора приводит к тому, что результат будет заполнен пробелами
или нулями, чтобы выводимое значение занимало поле, ширина которого не
меньше заданной С І минимальной ширины. По умолчанию в качестве
заполнителя используется пробел (пробелы).
Для заполнения нулями перед спецификацией ширины поля нужно
поместить нуль, т. е. 0. Например, спецификация формата %05d дополнит
нулями выводимое целое число, в котором менее пяти цифр, чтобы общая
длина равнялась пяти символам. Действие модификатора точности зависит от
191
кода формата, к которому он применяется.
Чтобы добавить модификатор точности, следует поставить за
спецификатором ширины поля десятичную точку, а после нее – требуемое
значение точности (число знаков после десятичной точки). Применительно к
целым числам модификатор точности задает минимальное количество
выводимых цифр. При необходимости перед целым числом будут добавлены
нули. Если модификатор точности применяется к строкам, то число,
следующее за точкой, задает максимальную длину поля. Например,
спецификация %5.7s выведет строку длиной не менее пяти, но не более семи
символов. Если выводимая строка окажется длиннее максимальной длины
поля, конечные символы будут отсечены. По умолчанию все выводимые
значения выравниваются по правому краю: если ширина поля больше
выводимого значения, то оно будет выровнено по правому краю поля. Чтобы
установить выравнивание по левому краю, нужно поставить знак "минус" ("–
") сразу после знака процента. Например, спецификация формата % – 10.4f
обеспечит выравнивание вещественного числа с четырьмя десятичными
знаками по левому краю в 10-символьном поле. Существуют два
модификатора формата, позволяющие функции printf() отображать короткие
и длинные целые числа. Это модификатор l (латинская буква эль) уведомляет
функцию printf() о длинном типе значения. Модификатор h сообщает
функции printf(), что нужно вывести число короткого целого типа. Кроме
того, модификатор l можно поставить перед командами форматирования
вещественных чисел. В этом случае он уведомит о выводе значения типа long
double.
Спецификаторы формата для функции printf() перечислены в табл. 2.5.

Таблица 2.5 – Спецификаторы формата функции printf()


Код Формат
%c Символ
%d Десятичное целое число со знаком
%i Десятичное целое число со знаком
192
%e Экспоненциальное представление числа (в виде мантиссы
и порядка, е — на нижнем регистре)
%E Экспоненциальное представление числа (в виде мантиссы
и порядка, Е — на верхнем регистре)
%f Десятичное число с плавающей точкой
%F Десятичное число с плавающей точкой (только стандарт
С99; если применяется к бесконечности или нечисловому
значению, то выдает надписи INF, INFINITY
(бесконечность) или NAN — Not A Number на верхнем
регистре. Спецификатор %f выводит их эквиваленты на
нижнем регистре)
%g Использует более короткий из форматов %e или %f
%G Использует более короткий из форматов %E или %F
%o Восьмеричное число без знака
%s Символьная строка
%x Шестнадцатеричное без знака (строчные буквы)
%X Шестнадцатеричное без знака (прописные буквы)
%p Выводит указатель
%n Соответствующий аргумент должен быть указателем на
целое число. (Этот спецификатор указывает, что в
целочисленной переменной, на которую указывает
ассоциированный с данным спецификатором указатель,
будет храниться число символов, выведенных к моменту
обработки спецификации %n)
%% Выводит знак процента

Прототип функции getchar() имеет следующий вид:


int getchar(void);
Функция getchar() возвращает из стандартного потока stdin (входного
потока данных) следующий символ. При чтении символа предполагается, что
символ имеет тип unsigned char, который потом преобразуется в целый. При
достижении конца файла, как и при обнаружении ошибки, функция getchar()
возвращает значение EOF (End Of File – конец файла).
Прототип функции gets имеет следующий вид:
char *gets(char *str);
Функция gets() читает символы (включая пробелы) из стандартного потока
stdin и помещает их в массив символов, адресуемый указателем *str (далее это
массив символов). Символы читаются до тех пор, пока не встретится разделитель
строк или значение EOF. Для реализации EOF на клавиатуре следует набрать
193
одновременно Ctrl+Z. Вместо разделителя строк в конец строки вставляется
нулевой символ, свидетельствующий о ее завершении. Следует учесть, что нет
способа ограничить количество символов, которое прочитает функция gets().
Поэтому массив, адресуемый указателем *str, может переполниться, и тогда
программа выдаст непредсказуемые результаты.
Прототип функции scanf() имеет следующий вид:
int scanf(const char *format, ?);
Функция scanf() представляет собой функцию для ввода данных общего
назначения, которая читает поток stdin и сохраняет информацию в переменных,
перечисленных в списке аргументов. Если в строке форматирования встретится
разделитель, то функция scanf() пропустит один или несколько разделителей во
входном потоке. Под разделителем, или пробельным символом, подразумевают пробел,
символ табуляции \t или разделитель строк \n. Все переменные должны
передаваться посредством своих адресов, например, с помощью символа &.
Управляющая строка, задаваемая параметром format, состоит из символов трех
категорий: спецификаторов формата, пробельных символов, символов, отличных от
пробельных.
Спецификация формата начинается знаком % и сообщает функции scanf()
тип данного, которое будет прочитано. Спецификации формата функции scanf()
приведены в табл.2.6.

Таблица 2.6 – Спецификаторы формата функции scanf()


Код Формат
%c Читает один символ
%d Читает десятичное целое число
%i Читает целое число в любом формате (десятичное,
восьмеричное или шестнадцатеричное)
%u Читает десятичное целое число типа short int
%e Читает число с плавающей точкой (и в экспоненциальной
%E форме)
Аналогично коду %e
%f Читает число с плавающей точкой
%lf Читает десятичное число с плавающей точкой типа double
%F Аналогично коду %f (для стандарта С99)
%g Читает число с плавающей точкой.
%G Аналогично коду %g
%o Читает восьмеричное число
%x Читает шестнадцатеричное число
194
%X Аналогично коду %x
%s Читает строку
%p Читает указатель
%n Принимает целое значение, равное количеству
прочитанных до сих пор символов
%[ ] Просматривает набор символов
%% Читает знак процента

Строка форматирования читается слева направо, и спецификации


формата сопоставляются с аргументом в порядке их перечисления в списке
аргументов. Символ
*, стоящий после знака % и перед кодом формата, прочитает данные
заданного типа, но запретит их присваивание. Команды форматирования
могут содержать модификатор максимальной длины поля. Он представляет
собой целое число, располагаемое между знаком % и кодом формата, которое
ограничивает количество читаемых для всех полей символов. Если входной
поток содержит больше заданного количества символов, то при
последующем обращении к операции ввода чтение начнется с того места, в
котором «остановился» предыдущий вызов функции scanf(). Если
разделитель (например, пробел) встретится раньше, чем достигнута
максимальная ширина поля, то ввод данных завершится. В этом случае
функция scanf() переходит к чтению следующего поля. При чтении
одиночных символов символы табуляции и разделители строк читаются
подобно любому другому символу.
В программах бывает необходимость определять константы. В языке С
типы констант можно задавать явно при использовании суффиксов.
Например:
long int j = –12345678L; /* суффикс L */
unsigned int a = 678U; /* суффикс U */
float x = 123.45F; /* суффикс F */
long double z = 12345678.99L; /* суффикс L* /
По умолчанию спецификации f, e, g заставляют функцию scanf()
195
присваивать переменным типа float. Если перед одной из этих спецификаций
поставить модификатор l, то функция scanf() присвоит прочитанные данные
переменной типа double.
Функция scanf() поддерживает спецификатор формата общего
назначения, называемый набором сканируемых символов. В этом случае
определяется набор символов, которые могут быть прочитаны функцией
scanf() и присвоены соответствующему массиву символов. Для определения
такого набора символы, подлежащие сканированию, необходимо заключить в
квадратные скобки. Открывающая квадратная скобка должна следовать сразу
за знаком процента. При использовании набора сканируемых символов
функция scanf() продолжает читать символы и помещать их в
соответствующий массив символов до тех пор, пока не встретится символ,
отсутствующий в данном наборе. Если первый символ в наборе является
знаком "^", то получится обратный эффект: входное поле читается до тех пор,
пока не встретится символ из заданного набора сканируемых символов, т. е.
знак "^" заставляет функцию scanf() читать только те символы, которые
отсутствуют в наборе сканируемых символов. Если в строке форматирования
встретился символ, отличный от разделителя, то функция scanf() прочитает и
отбросит его. Если заданный символ не найден, то функция scanf() завершает
работу.
В таких средах разработки как MS Visual Studio 2008 и 2010
рекомендуется для безопасной работы применять функции gets_s() и
scanf_s(). Для этих функций при чтении символа или строки следует указать
размер в байтах, соответственно для символа или строки. Например,
scanf_s("%c", &ch, 1). В Visual Studio 2010 тип данных char занимает 1 байт.
2.1.3 Математические функции в языке программирования С++

Таблица 2.7 – Запись математических функций в С++

196
197
198
199
2.2 Практическая часть

Пример 1. Напишите программу вычисления площади круга и его длины


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

200
а также вывода на консоль максимальных значений чисел типа int, float и
double.
Для решения примера следует воспользоваться математической
библиотекой компилятора, т. е. включить в программу заголовочный файл
<math.h>, а также заголовочные файлы <limits.h>, <float.h>.

Программный код решения примера:


#include <stdio.h>
#include <conio.h>
#define _USE_MATH_DEFINES
#include <math.h>
#include <limits.h>
#include <float.h>
int main (void)
{
double R, Sr, Lr;
printf("\n Enter a real greater than zero: ");
scanf_s("%lf", &R);
Sr = M_PI*R*R;
Lr = 2*M_PI*R;
printf("\n Area of a circle of radius R = %g is %g", R, Sr);
printf("\n The length of a circle of radius R = %g is %g", R,Lr);
puts("");
printf("\n Maximum integer: %d\n ", INT_MAX);
printf("Maximum real number of float: %g\n ", FLT_MAX);
printf("Maximum real number type double: %g\n ", DBL_MAX);

printf("\n press any key: ");


_getch();
return 0;
}

В программу включена константа _USE_MATH_DEFINES для работы с


числом M_PI (). Остальные константы можно найти в справочной
документации компилятора. Например, через меню Help →Index системы MS
Visual Studio 2008.
Функция scanf_s() определена в компиляторе языка С системы MS
Visual Studio 2008. С этой функцией компилятор не выдает предупреждений.
Результат выполнения программы показан на рис. 2.1.

201
Рисунок 2.1 – Пример использования предопределенных констант

В начале функции int main(void) сделано объявление переменных, которые


будут использоваться в программе. Каждый тип переменныхобъявлен через
запятую.
Функции printf() выводят либо только сообщения, либо еще заданные
переменные соответствующих типов.
Функция gets() позволяет считывать символы с наличием разделителей, в
частности, с пробелами. В Microsoft Visual Studio 2010 рекомендуется
использовать gets_s(), чтобы не было предупреждений.
Следует обратить внимание на формат записи функций scanf(). Если
сканируются числа, или одиночные символы, то присваивание этих символов
переменным, которые были объвлены через соответствующие типы данных,
осуществляется с помощью взятия адреса этих переменных, т. е. с помощью
символа &, например, scanf_s(«%c»,&ch, 1). При сканировании массива символов,
т. е. при сканировании строки, символ & не используется. Имя массива само по
себе является указателем. Обращение к адресу осуществляется с помощью указателей
(будут рассмотрены позднее). Для сканирования чисел типа double в функции scanf_s()
используется спецификатор l.

Пример 2. Создать блок-схему к программе и программу на языке


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

если B x23xy z, где z x y3.


Окно с программой показано на рис. 2.2, а блок-схема к заданию на рис.2.3.

202
Рисунок 2.2 – Окно программы Примера 2

Программный код решения примера:

#include <stdio.h>
#include <conio.h>
#define _USE_MATH_DEFINES
#include <math.h>
#include <limits.h>
#include <float.h>
int main(void)
{
double x, y, z, b;
printf("\n Enter x = ");
scanf_s("%lf", &x);
printf("\n Enter y = ");
scanf_s("%lf", &y);
z = pow((x + y), 3);
printf("\n z = %1.2f", z);
b = pow(x, 2) + 3 * x*y + sqrt(z);
printf("\n b = %lf ", b);
printf("\n press any key ");
_getch();
return 0;
}

203
Рисунок 2.3 – Блок-схема примера 2

В программу включена библиотека математических функций math.h, в


которой sqrt() – функция извлечения квадратного корня, pow(а, b) – функция
возводит в степень b число по основанию а. Все эти функции возвращают
результат типа double и вычисляют от числа (выражения) также типа double.
Результат выполнения программы показан на рис. 2.4.

Рисунок 2.4 – Окно вывода результата Примера 2

Оборудование и материалы
1. Персональный компьютер;
2. Операционная система семейства Microsoft Windows;
3. Среда программирования Microsoft Visual Studio.
Указания по технике безопасности

204
1. Не входить в помещение, где находится вычислительная техника без
разрешения преподавателя.
2. Не работать в верхней одежде.
3. Не включать без разрешения оборудование.
4. При несчастном случае, или поломке оборудования позвать
преподавателя. Знать где находится рубильник (выключатель) выключения
электропитания оборудования.
5. Не трогать провода и разъемы (возможно поражение электрическим
током).
6. Не допускать порчи оборудования.

Задания
Составить блок-схему к программе и программу на языке
программирования С++ для вычисления функций b = f(x,y,z) , где z = w(x,y)
при постоянных значениях x и y (см. пример 2). Значения x и y заданы в
таблице 2.8.
Таблица 2.8 – Индивидуальные задания

205
206
Содержание отчета
1. Работа предъявляется на экране компьютера в виде исходного кода и в
виде отчета, содержащего: ФИО студента, шифр группы, номер и тему
лабораторной работы, полный код программы на языке программирования
С++.
2. Отчет выполняется на компьютере и распечатывается на листах
бумаги формата А4.
3. Каждая работа должна быть защищена.

Контрольные вопросы
1. Для каких типов данных используются суффиксы при инициализации
переменных?
2. Чем отличаются функции printf() и puts() при консольном выводе
информации?
3. Для чего в программах на С++ используется заголовочный файл
math.h?
4. При использовании функции gets_s() с какими разделителями может
происходить считывание информации с консоли?
5. Какой тип данных возвращает функция gets_s() при считывании
информации?
207
6. Как осуществляется считывание с консоли информация с помощью
функции scanf_s()?
7. Как с консоли осуществляется считывание последовательности
различных типов данных с помощью одной функции scanf_s()?
8. Как выводится на консоль последовательность различных типов
данных с помощью одной функции printf()?

Список литературы, рекомендуемый к использованию по данной


теме
1. Павловская, Т. А. С/С++: программирование на языке высокого
уровня : учебник для вузов/ Т. А. Павловская. – СПб. : Питер, 2010. – 461 с. –
(Учебник для вузов). – Библиогр.: с. 383. –Прил.: с.384-449. –ISBN 978-5-
94723-568-5.
2. Крылов, Е. В. Техника разработки программ : учебник : в 2 кн. / Е. В.
Крылов, В. А. Острейковский, Н. Г. Типикин, Кн. 1, Программирование на
языке высокого уровня. – Москва : Высшая школа, 2007. – 375 с. – (Для
высших учебных заведений) (Информатика и вычислительная техника). –
Библиогр.: с. 333-348. – Прил. с. 349-375. – ISBN 978-5-06-005524-5.
3. Ашарина И. В. Основы программирования на языках С и С++. – М.:
Горячая линия – Телеком, 2002. –207 с.: ил.
4. Кнут Д. Искусство программирования. Доступно:
http://lib.ru/CTOTOR/KNUT/
5. Ресурс по программированию. Доступно: http://physics-for-
students.ru/bookpc/informatika/slovar.zip
6. Языки программирования. Доступно: http://cppstudio.com/

208
ЛАБОРАТОРНАЯ РАБОТА 3
Принятие решений. Условные операторы в языке С++

Цель работы: изучить виды условных операторов, научиться создавать


программы на языке С++ разветвляющейся структуры.

Формируемые компетенции:
(ОПК-2) - способностью решать стандартные задачи профессиональной
деятельности на основе информационной и библиографической культуры с
применением инфокоммуникационных технологий и с учетом основных
требований информационной безопасности;
(ОПК-3) - способностью владеть основными методами, способами и
средствами получения, хранения, переработки информации;
(ОПК-4) - способностью иметь навыки самостоятельной работы на
компьютере и в компьютерных сетях; осуществлять компьютерное
моделирование устройств, систем и процессов с использованием
универсальных пакетов прикладных компьютерных программ.

3.1 Теоретическая часть


В языке программирования С используются несколько конструкций для
принятия решений:
− оператор if;
− оператор switch;
− условный оператор ? (оператор условия).
Для прерывания программного цикла при некотором условии
применяется утверждение (оператор) break, для продолжения итераций
цикла при выполнении некоторых условий применяется утверждение
(оператор) continue, для выхода из функции при выполнении некоторых
условий применяется оператор return, для перехода к заданному месту
209
программы применяется оператор goto, хотя считается, что в
программировании не существует ситуаций, в которых нельзя обойтись без
оператора goto [2; 3]. Утверждение break применяется также в телеоператора
switch.

3.1.1 Оператор if
Общая форма записи оператора if:
if (expression)
program statement;
В операторе if используется результат вычисления условия,
заключенного в круглые скобки, на основе которого принимается
решение. Результат вычисления условия expression может быть
арифметическим или логическим. Если результат выполнения условия
expression будет истинным, то возможно выполнить несколько
утверждений типа program statement. Для этого следует использовать
фигурные скобки, например:
if (expression)
{
program1 statement1;
program2 statement2;
...
}

3.1.2 Конструкция if–else


Общая форма записи конструкции if–else:
if (expression)
program1 statement1;
else
program2 statement2;
Если выполняется условие expression, то будет выполняться фрагмент
210
программы program1 statement1, в противном случае будет выполняться
program2 statement2.
Каждое из утверждений может быть множественным. В таком случае
применяются фигурные скобки:
if (expression)
{
program1 statement1;
program2 statement2;
...
}
else
{
program33 statement33;
program34 statement34;
...
}

3.1.3 Конструкция if–else if–else if–...–else


Форма записи конструкции if–else if–else if–...–else:
if (expression1)
program1 statement1;
else if (expression2)
program2 statement2;
else if (expression3)
program3 statement3;
...
else
program statement;
Приведенная конструкция используется для выбора возможных
ситуаций, когда проверяются условия expression1, expression2, expression1,...

211
. Соответственно будут выполняться действия program1 statement1, program2
statement2, program3 statement3 и т.д. В случае, когда ни одно из условий не
выполняется, выполняются действия, прописанные после оператора else.
В случае выполнения множественных действий применяются фигурные
скобки для каждого из утверждений:
if (expression1)
{
program1 statement1;
...
}
else if (expression2)
{
program2 statement2;
...
}
else if (expression3)
{
program3 statement3;
...
}
...
Else
{
program statement;
...
}

3.1.4 Оператор switch


Общая форма записи оператора switch:
switch (expression) {

212
case value1:
program statement;
...
break;
case value2:
program statement;
...
break;
...
case valuen:
program statement;
...
break;
default:
program statement;
...
break;
}
Выражение заключенного в круглые скобки оператора последовательно
сравнивается со значениями value1, value2,..., valuen, которые должны быть
простыми константами или константными выражениями. В том случае,
когда одно из этих значений равно значению, выполняются утверждения,
которые следуют за данным значением.
Утверждение break сигнализирует об окончании выполнения
утверждений и приводит к выходу из оператора switch. Утверждение break
ставится в конце каждого варианта выбора. Если этого не сделать, то
выполнение последовательности утверждений перейдет в следующий
вариант выбора и будет выполняться до тех пор, пока не встретится
утверждение break.
Специальный дополнительный вариант default будет выполнен в том
213
случае, когда не будет найдено ни одного совпадения.
Операторы if и switch той или иной синтаксической конструкции
существуют практически во всех языках программирования (в первую
очередь языках высокого уровня), и их часто называют операторами
ветвления.

3.1.5 Условный оператор


В отличие от других операторов языка С, которые могут быть
унарными или бинарными, специфический оператор условия является
тернарным оператором. Это означает, что у него может быть три операнда.
Общий формат записи оператора условия:
условие ? выражение_1 : выражение_2
Если в результате вычисления условия будет получено значение TRUE
(истина, не нуль), то выполняется выражение_1, и результатом выполнения
оператора условия будет значение, полученное при вычислении этого
выражения. Если в результате вычисления условия будет получено значение
FALSE (ложь, т. е. нуль), то выполняется выражение_2, и результатом
выполнения оператора условия будет значение, полученное при
вычислении выражение_2.
Оператор условия часто описывают как оператор ?. Тернарный оператор
условия ? наиболее часто используется для присвоения переменной одного
из двух значений в зависимости от некоторого условия.

3.1.6 Оператор break (от английского – прерывать)


Оператор или утверждение break служит для немедленного выхода из
цикла, будь то while, for или do–while. После выхода из цикла выполнение
программы продолжается с утверждения (фрагмента программы),
непосредственно следующего за циклом.
Если оператор break встречается во вложенном цикле (вложенных циклах),
то будет прекращено выполнение того цикла, в котором этот оператор
214
встретился.
Необходимость в использовании оператора прерывания break в теле цикла
возникает тогда, когда условие продолжения итераций нужно проверять не
в начале цикла (как в циклах while и for) и не в конце тела цикла (как в
цикле do–while), а в середине тела цикла.
Формат записи оператора break:
break;

3.1.7 Оператор continue (от английского – продолжать)


Оператор или утверждение continue служит для перехода к следующей
итерации цикла.
Оператор continue противоположен по действию оператору break.
Оператор continue позволяет в любой точке тела цикла (while, for или do–
while) прервать текущую итерацию и перейти к проверке условий
продолжения цикла. В соответствии с результатами проверки либо
заканчивается выполнение цикла, либо начинается новая итерация. При
этом все утверждения (фрагменты программы), которые следуют за
оператором continue (ключевым словом), автоматически пропускаются.
Формат записи оператора continue:
continue;

3.1.8 Оператор goto


Сейчас во многих языках программирования оператор безусловного
перехода типа goto не используется. Однако в языке программирования
С он имеет место. Применение оператора goto не является хорошим
стилем программирования. Но в некоторых случаях его применение бывает
уместно. Иногда, при умелом использовании, оператор goto может оказаться
весьма полезным, например, если нужно покинуть глубоко вложенные
циклы.
Для оператора goto всегда необходима метка. Метка – это идентификатор
215
с последующим двоеточием. Метка должна находиться в той же функции, что
и оператор goto, переход в другую функцию невозможен.
Общий формат записи оператора goto:
goto метка;
.
.
.
метка: заданные действия.
Метка может находиться как до, так и после оператора goto. С помощью
оператора goto можно не только выходить из цикла, но и организовать цикл.
Логические операторы отношения приведены в табл. 3.1.

Таблица 3.1 – Логические операторы


№ п/п Оператор Операция
1) && И
2) || ИЛИ
3) ! НЕ, отрицание

Ниже приведены операции отношений в убывающей последовательности


приоритетов:
Наивысший !
> >= < <=
== !=
&&
Низший ||
Как и в арифметических выражениях, для изменения порядка
выполнения операций сравнения и логических операций можно использовать
круглые скобки.
Операторы отношения перечислены в табл. 3.2.

216
Таблица 3.2 – Операторы отношения языка программирования С++
№ п/п Оператор Значение
1) == Равно
2) != Не равно
3) < Меньше
4) <= Меньше или равно
5) > Больше
6) >= Больше или равно

Результат любой операции сравнения или логической операции есть 0


(ноль) или 1.

3.2 Практическая часть

Пример 1. Напишите программу решения квадратного уравнения с


проверкой на наличие вещественных (не комплексных) корней на основе
только операторов if. Вид квадратного уравнения:
аx2 bx c 0
Как известно, квадратное уравнение будет иметь вещественные корни, если
его дискриминант будет неотрицательным, т. е. когда

D b2 4ac 0


Программный код решения примера:
#include <stdio.h>
#include <conio.h>
#include <math.h>

int main(void) {
float a, b, c;
float D, x1, x2, x;
printf("\n\t Equation a*x^2+b*x+c=0\n");
printf("\n\t Enter the coefficient a: ");
scanf("%f", &a);
printf("\n\t Enter the coefficient b: ");
scanf("%f", &b);
printf("\n\t Enter the coefficient c: ");
scanf("%f", &c);
D = b*b - 4 * a*c;
if (D >= 0 && a != 0) {

217
x1 = -b / (2 * a) + (float)sqrt(D) / (2 * a);
x2 = -b / (2 * a) - (float)sqrt(D) / (2 * a);
printf("\n\t The roots of the equation:\n\t x1 = %1.4f, x2 =
%1.4f\n", x1, x2);
}
if (D < 0)
printf("\n\t The rootsof complex\n");
if (a == 0 && b != 0) {
x = -c / b;
printf("\n\t As a = %1.0f,\n\t the solution of the equation
is: %1.4f\n", a, x);
}
printf("\n Press any key: ");
_getch();
return 0;
}

Возможный результат выполнения программы показан на рис. 3.1.

Рисунок 3.1 – Результат решения квадратного уравнения

В программе последовательно проверяются условия с помощью


операторов if. В последнем случае, когда коэффициент а = 0, квадратное
уравнение вырождается и превращается в линейное уравнение. Решение в
этом случае очевидно.
В программе применены функции scanf_s() вместо стандартной функции
scanf() языка С. Это сделано для того, чтобы по этим функциям не было
предупреждений (warning) в MS Visual Studio 2008.
Кроме того, в программу подключена библиотека math.h для действий с
математическими функциями, например, sqrt().

218
В первом операторе if применено логическое условие И (&&) для
проверки того, что дискриминант не равен отрицательному значению и
одновременно, чтобы первый коэффициент квадратного уравнения не был
равен нулю. Аналогичное условие прописано и для последнего оператора if.
Пример 2. Напишите программу решения квадратного уравнения с
проверкой на наличие вещественных корней на основе конструкции if– else.
Вид квадратного уравнения:

ax2 bx c 0


Программный код решения примера:
#include <stdio.h>
#include <conio.h>
#include <math.h>
int main(void)
{
float a, b, c;
float D, x1, x2, x;
printf("\n\t Equation a*x^2 + b*x + c = 0\n");
printf("\n\t Enter the coefficient a: ");
scanf_s("%f", &a);
printf("\t Enter the coefficient b: ");
scanf_s("%f", &b);
printf("\t Enter the coefficient c: ");
scanf_s("%f", &c);
D = b*b - 4 * a*c;
if (D >= 0 && a != 0 && b != 0) {
x1 = -b / (2 * a) + (float)sqrt(D) / (2 * a);
x2 = -b / (2 * a) - (float)sqrt(D) / (2 * a);
printf("\n\t The roots of the equation:\n\t xl = %1.4f, x2 =
%1.4f\n", x1, x2);
}
else {
if (a == 0 && b != 0) {
x = -c / b;
if (c != 0)
printf("\n\t As a= %1.0f,\n\t the solution of the
equation is: %1.4f\n", a, x);
else
printf("\n\t As a = %1.0f and c = %1.0f,\n\t the
solution of the equation is: %1.0f\n", a, -x);
}
if (D < 0)
printf("\n\t The roots of complex\n");
}
printf("\n Press any key: ");
219
_getch();
return 0;
}

В программе использованы вложенные операторы if.


Результат выполнения программы при исключительной ситуации
показан на рис. 3.2.

Рисунок 3.2 – Выполнение программы с двумя нулевыми коэффициентами

Пример 3. Напишите программу расчета простого арифметического


выражения на основе оператора switch.
Программный код решения примера:
#include <stdio.h>
#include <conio.h>
int main(void) {
float valuel, value2;
char operat;
printf("\n\t Printed on the keyboard expression: ");
scanf_s("%f%c%f", &valuel, &operat, sizeof(char), &value2);
switch (operat) {
case '+':
printf("\n\t Result: %1.4f\n", valuel + value2);
break;
case '-':
printf("\n\t Result: %1.4f\n", valuel - value2);
break;
case '*':
printf("\n\t Result: %1.4f\n", valuel * value2);
break;

case '/':
if (value2 == 0.0)
printf("\n\t Division by zero.\n");
else

220
printf("\n\t Result: %1.4f\n", valuel / value2);
break;
default:
printf("\n\t Unknown arithmetic operator\n\t error or enter
a number. Break!\n");
break;
} // End switch
printf("\n Press any key: ");
getch();
return 0;
}
В программе использована полная форма оператора switch. Оператор
break инициирует немедленный выход из оператора switch. Возможно
использование вложенных операторов switch.
Возможный результат выполнения программы показан на рис. 3.3.

Рисунок 3.3 – Расчет простого арифметического выражения

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


чисел и определения наибольшего из них. Определение наибольшего числа
произведите с помощью оператора условия ?.
Программный код решения примера:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
// Для функций случайных чисел
#include <time.h>
int main(void) {
int a, b, maxab;
unsigned int some;
long int L; L = (long)time(NULL);
some = (unsigned)L / 2;
srand(some);
a = rand();
b = rand();
221
printf("\n\t Random numbers: a = %d; b = %d\n", a, b);
// Оператор условия для определения максимального числа
maxab = (a > b) ? a : b;
printf("\n\t Maximum number: %d\n", maxab);
printf("\n Press any key: ");
_getch();
return 0;
}

В программе использованы функции генерации псевдослучайных чисел


rand() и задания исходного псевдослучайного числа srand(). Указанные
функции входят в стандартную библиотечную функцию stdlib.h. Функция
time() входит в библиотечную функцию time.h, которая поддерживает
функции, обращающиеся к системному времени.
Для переменных L и some выполнено приведение типов.
При каждом обращении к функции rand() возвращается целое в
интервале между нулем и значением RAND_MAX, которое в любой
реализации должно быть не меньше числа 32767.
Возможный результат выполнения программы показан на рис. 3.4.

Рисунок 3.4 – Результат определения максимального числа

Пример 5. Напишите программу распечатки четных целых чисел от 0


до 30.
Код программы:
#include <stdio.h>
#include <conio.h>
int main(void) {
int x;
printf("\n\t Even numbers from 0 to 30:\n\n");
for (x = 0; x < 31; x++) {
if (x % 2) continue;
printf("\t\t %3d\n", x);
222
}
printf("\n Press any key: ");
getch();
return 0;
}

В программе в качестве проверки условия использовано деление по


модулю (х%2). Если остаток от деления числа х не равен нулю, то
утверждение (оператор, инструкция) continue передает управление
непосредственно инструкции, проверяющей условное выражение, после
чего циклический процесс продолжается. С помощью программы
выводятся только четные числа, а при обнаружении нечетного числа
происходит преждевременный переход к следующей итерации цикла, и
функция printf() опускается. Функция printf() включена в тело цикла
оператора for.
Результат выполнения программы показан на рис. 3.5.

Рисунок 3.5 – Результат вывода четных чисел

Примечание. Оператор goto нельзя применять для перехода в тело


цикла, т. е. метка не должна быть внутри оператора цикла. Метка может
появиться текстуально до или после оператора goto.

223
Пример 6. Создать блок-схему и программу вычисления функции с
использованием оператора IF. Значение х и а ввести с клавиатуры.

Окно с программой показано на рис. 3.6, блок-схема к заданию на рис.


3.7.

Рисунок 3.6 – Окно с программой

224
Рисунок 3.7 – Блок-схема к заданию
Код программы:
#include <stdio.h>
#include <conio.h>
#include <math.h>
int main(void) {
float a, x;
float y;
printf("\n\t Vvedite coefficient a= ");
scanf_s("%f", &a);
printf("\t vvedite x= ");
scanf_s("%f", &x);
if (x >= 0) {
y = sqrt(2 * x*x*x + 4 * x + 7);
printf("\n\t y = %1.4f\n", y);
}
else if (x < a) {
y = (3 * x - 1) / pow((x*x + 2), 2);
printf("\n\t y = %1.4f\n", y);
}
printf("\n ...Press any key: ");
_getch();
return 0;
}
225
Оборудование и материалы
1. Персональный компьютер;
2. Операционная система семейства Microsoft Windows;
3. Среда программирования Microsoft Visual Studio.
Указания по технике безопасности
1. Не входить в помещение, где находится вычислительная техника без
разрешения преподавателя.
2. Не работать в верхней одежде.
3. Не включать без разрешения оборудование.
4. При несчастном случае, или поломке оборудования позвать
преподавателя. Знать где находится рубильник (выключатель) выключения
электропитания оборудования.
5. Не трогать провода и разъемы (возможно поражение электрическим
током).
6. Не допускать порчи оборудования.

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

226
значение х и а вводить с клавиатуры.
Вид функций f1(x), f2(x) и f3(x) выбрать из таблицы 3.2 в
соответствии с номером своего варианта.

Таблица 3.2 – Индивидуальные задания

227
Содержание отчета
1. Работа предъявляется на экране компьютера в виде исходного кода и
в виде отчета, содержащего: ФИО студента, шифр группы, номер и тему
лабораторной работы, полный код программы на языке программирования
С++.
2 . Отчет выполняется на компьютере и распечатывается на листах
бумаги формата А4.
3. Каждая работа должна быть защищена.

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

228
3. Какой оператор условия рекомендуется использовать для
программирования меню?
4. В чем различие и сходство между операторами break и continue?
5. Как можно обеспечить выход из вложенных циклов?
6. Как можно организовать переходы в различные точки программы на
С++?
7. Какие логические операторы отношения используются в языке С++?
8. Что произойдет, если в операторе switch после метки case не
использовать оператор break?
9. Что произойдет, если в операторе switch не поставить метку default и
условие переключения не совпадет ни с одной меткой case?

Список литературы, рекомендуемый к использованию по данной


теме
1. Павловская, Т. А. С/С++: программирование на языке высокого
уровня : учебник для вузов/ Т. А. Павловская. – СПб. : Питер, 2010. – 461 с. –
(Учебник для вузов). – Библиогр.: с. 383. –Прил.: с.384-449. –ISBN 978-5-
94723-568-5.
2. Крылов, Е. В. Техника разработки программ : учебник : в 2 кн. / Е. В.
Крылов, В. А. Острейковский, Н. Г. Типикин, Кн. 1, Программирование на
языке высокого уровня. – Москва : Высшая школа, 2007. – 375 с. – (Для
высших учебных заведений) (Информатика и вычислительная техника). –
Библиогр.: с. 333-348. – Прил. с. 349-375. – ISBN 978-5-06-005524-5.
3. Ашарина И. В. Основы программирования на языках С и С++. – М.:
Горячая линия – Телеком, 2002. –207 с.: ил.
4. Кнут Д. Искусство программирования. Доступно:
http://lib.ru/CTOTOR/KNUT/
5. Ресурс по программированию. Доступно: http://physics-for-
students.ru/bookpc/informatika/slovar.zip
6. Языки программирования. Доступно: http://cppstudio.com/

229
ЛАБОРАТОРНАЯ РАБОТА 4
Организация циклов в языке С++

Цель работы: изучить операторы цикла, научиться создавать программы


и блок-схемы циклических структур.

Формируемые компетенции:
(ОПК-2) - способностью решать стандартные задачи профессиональной
деятельности на основе информационной и библиографической культуры с
применением инфокоммуникационных технологий и с учетом основных
требований информационной безопасности;
(ОПК-3) - способностью владеть основными методами, способами и
средствами получения, хранения, переработки информации;
(ОПК-4) - способностью иметь навыки самостоятельной работы на
компьютере и в компьютерных сетях; осуществлять компьютерное
моделирование устройств, систем и процессов с использованием
универсальных пакетов прикладных компьютерных программ.

4.1 Теоретическая часть


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

4.1.1 Оператор while


Изучение операторов цикла начнем с оператора while. Цикл while
имеет следующий формат (синтаксис) записи:
while (expression) program statement;
Производится расчет выражения expression, заключенного в круглые
скобки. Если в результате расчета выражения expression получается
истинный результат (TRUE), то выполняется утверждение program
statement, следующее непосредственно за закрывающей круглой скобкой.

230
После выполнения этого утверждения вновь рассчитывается выражение
expression. Если в результате расчета будет TRUE, то вновь будут выполнены
утверждения program statement. Цикл повторяется до тех пор, пока в
результате расчета выражения expression (в круглых скобках оператора
while) не будет получено значение FALSE (ложный), которое является
признаком окончания цикла, после чего выполнение программы
продолжается с утверждения, следующего за утверждением program
statement. Когда требуется выполнить группу утверждений, то она (группа)
располагается в фигурных скобках:
while (expression)
{
program statement; program2 statement2; program3
statement3;
...
}
Открывающаяся фигурная скобка может следовать непосредственно
после закрывающей круглой скобки оператора while. Все, что находится в
фигурных скобках, будет выполняться, пока верно выражение expression.
Очевидно, что неверное задание выражения expression может привести к
бесконечному циклу (к зацикливанию).

4.1.2 Оператор for


Оператор цикла for имеет следующий формат записи:
for (init_expression; loop_condition;
loop_expression) program statement;
Три выражения, заключенные в круглые скобки оператора цикла for,
задают условия выполнения программного цикла.
Первый параметр init_expression используется для задания начального
значения цикла.
Второй компонент loop_condition определяет условие или условия, в

231
соответствии с которыми будет происходить выход из цикла. Повторение
будет происходить до тех пор, пока это условие (или условия) выполняется.
Если условие не выполняется, то цикл немедленно заканчивается.
Третий параметр loop_expression выполняется каждый раз, когда
заканчивается обработка тела цикла, т. е. program statement.
Чаще всего выражения init_expression и loop_expression являются
операторами присваивания или вызовами функций, а второе выражение
loop_condition – выражением отношения или логическим выражением.
Любую из трех частей можно опустить, но точки с запятыми должны
остаться на своих местах. Если опустить init_expression или loop_expression,
то соответствующие операции не будут выполняться. Если же опустить
проверку условия loop_condition, то по умолчанию считается, что условие
продолжения цикла всегда истинно, и тогда цикл станет бесконечным
(произойдет зацикливание).
Когда требуется выполнения нескольких утверждений, то они должны
заключаться в фигурные скобки:
for (init_expression; loop_condition; loop_expression)
{
program1 statement1; program2 statement2; program3
statement3;
...
}
В представленном случае тело цикла находится в фигурных скобках.
Конструкция цикла, реализованная оператором for, может быть выполнена
также и оператором while следующим образом:
init_expression; while
(loop_condition)
{
program statement; loop_expression;
}

232
Исключением является применение операции continue.
В программах языка С возможно применять вложенные циклы, каждый
из которых контролируется своей переменной цикла и своим отношением
(второе выражение в круглых скобках оператора for). Вложенные циклы
могут идти непосредственно друг за другом или составлять тело цикла с
помощью фигурных скобок. Возможно также использование двух
индексных переменных для инициализации начала цикла с последующим их
инкрементированием (увеличением) или декрементированием
(уменьшением).

4.1.3 Оператор do–while


Рассмотренные операторы цикла while и for производят проверку
условия выполнения цикла до начала выполнения тела цикла. Поэтому тело
цикла может ни разу не выполниться, если с самого начала результатом
расчета условия выполнения цикла будет значение FALSE (ложь). В случае
необходимости производить проверку условия выполнения цикла после
тела цикла (т. е. когда выполняется хотя бы одно предписанное действие в
теле цикла) прибегают к циклу do–while.
Оператор цикла do–while имеет следующий формат записи:
do
program statement;
while
(loop_expression);
Выполнение цикла do–while происходит следующим образом: сначала
выполняется утверждение program statement, затем производится проверка
условия выполнения цикла loop_expression с помощью оператора while.
Если результатом проверки будет значение TRUE (истина), то выполнение
цикла продолжится, и утверждение program statement всякий раз будет
выполняться вновь. Повторение цикла будет продолжаться до тех пор, пока
в результате проверки условия выполнения цикла loop_expression будет

233
получаться значение TRUE. Когда в результате проверки условия будет
вычислено значение FALSE (ложь), то выполнение цикла прекратится и
произойдет переход к утверждению (следующему фрагменту программы),
непосредственно следующему за циклом.
Таким образом, цикл do–while гарантированно выполнится хотя бы один
раз.
В случае выполнения нескольких утверждений используются фигурные
скобки для выделения тела цикла:
do {
program1 statement1; program2 statement2; program3 statement3;
... } while (loop_expression);
Оператор цикла while называется оператором цикла с предусловием,
оператор цикла for называется оператором цикла с параметром, оператор
цикла do–while называется оператором цикла c постусловием.

4.2 Практическая часть


Рассмотрим примеры программ с операторами циклов while, for и do–
while.
Пример 1. Напишите программу вывода на экран пользователя целых
положительных чисел с помощью оператора while. Начальное и последнее
число должно задаваться пользователем с клавиатуры.
Программный код решения примера:
#include <stdio.h>
#include <conio.h>
int main(void) {
int i, j = 0, n;
printf("\n\t Enter the primary natural number: ");
scanf_s("%d", &i);
printf("\t Enter the last natural number: ");
scanf_s("%d", &n);
printf("\n\t The numbers are:");
while (i <= n) {
printf("\n\t %3d", i);
++i;
++j;
}

234
printf("\n\t Total numbers: %d\n", j);
printf("\n Press any key: ");
_getch();
return 0;
}
Возможный результат выполнения программы показан на рис. 4.1.

Рисунок 4.1 – Результат выполнения программы с вводом целых чисел

В программе использована функция scanf_s(), принятая в MS Visual Studio.


В программе применено инкрементирование переменных, принятое в языке С, а
именно ++i или ++j означает, что переменные увеличиваются на единицу. При этом
знаки "++" могут располагаться перед именем переменной или после. Отличие в
том, что ++i – это значение переменной после увеличения, а i++ – сначала
переменная имеет заданное значение, а потом происходит ее увеличение. Для
переменных цикла обе формы равнозначны.
Условием цикла является то, что пока переменная i меньше или равна
переменной n (предполагается, что n больше начального значения i), то будут
выполняться действия (печать и увеличение переменной j), заложенные в теле
цикла. Расчет выражения, заключенного в круглые скобки оператора,
предназначен для проверки нестрогого неравенства переменной i по отношению
к переменной n. Если это неравенство выполняется, то в теле цикла происходят
печать и увеличение (инкрементирование) переменных i, j.

Пример 2. Напишите программу табличного вывода строчных букв


латинского алфавита и их десятичных кодов с помощью оператора цикла for.

235
Как известно, в латинском алфавите 26 букв. Поэтому можно создать
массив символов этих букв. С учетом того, что тип char представляет собой
целочисленный тип, то можно обойтись без создания массива.
Программный код решения примера:
#include <stdio.h>
#include <conio.h>
int main(void) {
int j = 1;
char a = 'a';
printf("\n Table code characters:\n");
for (; a <= 'z'; ++a)
printf("\n %4d) %2c: code%4d", j++, a, a);
printf("\n\n Press any key: ");
_getch();
return 0;
}

Результат выполнения программы показан на рис. 4.2.

Рисунок 4.2 – Таблица десятичных кодов букв латинского алфавита


Форматированный вывод данных предусматривает выравнивание по
правому краю, для чего предусматриваются числовые спецификаторы типа %4d и
%2c для целых чисел и символов в функции printf().

Пример 3. Вычислите с точностью до "машинного нуля" значение


суммы числового ряда:

Программный код решения примера:

236
#include <stdio.h>
#include <conio.h>
int main(void)
{
double denom;
double suml = 0.0, sum2 = 0.0;
int k = 1; denom = k * (k + 1) * (k + 2); // знаменатель ряда
do {
suml = sum2;
sum2 += 1.0 / denom;
denom = denom / k * (k + 3);
++k;
} while (suml < sum2);
printf("\n\t The amount of numerical series: %lg\n", sum2);
printf("\n Press any key: ");
_getch();
return 0;
}

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


sum2. Ее предыдущее значение сохраняется в переменной sum1. Так как
приближенное значение с добавлением неотрицательных слагаемых не
уменьшается, условием продолжения цикла служит отношение sum1 < sum2
(поскольку растет знаменатель denom). Когда при добавлении очередного
слагаемого значение суммы остается неизменным (за счет конечной разрядной
сетки для представления вещественных чисел), нарушается условие sum1 < sum2
и цикл прекращается. Таким образом, конечность разрядной сетки
представления вещественных чисел в компьютере определяет собой «машинный
нуль».
Инициализация знаменателя сделана до начала цикла. Форматный вывод
результата выполнен с помощью спецификатора символа «l».
Результат выполнения программы показан на рис. 4.3.

Рисунок 4.3 – Результат подсчета суммы бесконечного ряда

237
Пример 4. Произведите реверс цифр заданного целого числа, вводимого
с клавиатуры пользователем.
Задача заключается в том, чтобы, например, число 123 переписать как 321.
Программный код решения примера:
#include <stdio.h>
#include <conio.h>
int main(void)
{
long int x, r;
printf("\n Enter an integer: ");
scanf_s("%ld", &x);
printf("\n Reverse-digit number %ld:\n\n\t", x);
do {
r = x % 10;
printf(" %ld", r);
x = x / 10;
} while (x != 0);
printf("\n\n Press any key: ");
_getch();
return 0;
}

В программе применена операция арифметическая операция деления по


модулю, которая имеет символ процента, т. е. «%». Любой остаток, получающийся
в результате деления целых чисел, будет отброшен. В шкале старшинства
оператор деления по модулю имеет приоритет, равный приоритету операторов
умножения и деления. Переменные, используемые в программе, объявлены как
длинные числа, поэтому применен тип long int (или long). В некоторых
компиляторах имеются отличия между типами int и long int в смысле максимально
поддерживаемого значения числа.
Результат выполнения программы показан на рис. 4.4.

Рисунок 4.4 – Результат программы по реверсу числа

238
Пример 5. На основе только оператора цикла for напишите
программу по выводу "горки" заглавных букв, симметрично убывающих к
букве, введенной пользователем. Также на основе оператора цикла for
предусмотрите защиту от неправильного ввода.
Программный код решения примера:
#include <stdio.h>
#include <conio.h>
int main(void) {
int p = 0;
char ch = 'A';
char i, j, k, ch2, kk, chA;
chA = ch;
printf("\n Enter a capital letter between \"A\" and \"S\": ");
scanf_s("%c", &ch2, sizeof(char));
for (chA -= 1; chA >= ch2; chA--)
{
printf("\n Error! Press any key: ");
_getch();
return -1;
}
for (kk = 'S' + 1; kk <= ch2; kk++)
{
printf("\n Error! Press any key: ");
_getch();
return -1;
}
k = ch2;
for (kk = ch; kk <= k; kk++)
{
printf("\n ");
for (ch2 = ch; ch2 <= k - p; ch2++)
printf(" ");
for (j = ch; j <= kk; j++)
printf(" %c", j);
for (i = kk; i > ch; i--)
printf(" %c", i - 1);
p++;
}
printf("\n\n Press any key: ");
_getch();
return 0;
}
Пример выполнения программы показан на рис. 4.5.

239
Рисунок 4.5 – Пример горки букв

Пример 6. Создать блок-схему к программе и программу на языке


программирования С++ таблицы табулирования функции

с использованием оператора While на отрезке [-2; 5] с шагом 0,8.

Блок-схема к заданию

240
Программный код решения примера:
#include <stdio.h>
#include <conio.h>
#define USE_MATH_DEFINES
#include <math.h>
#include <limits.h>
#include <float.h>
int main(void)
{
double xn, xk, xh, a, x, y;
printf("\n\t Vvedite xn= ");
scanf_s("%lf", &xn);
printf("\t vvedite Xk= ");
scanf_s("%lf", &xk);
printf("\t vvedite Xh= ");

241
scanf_s("%lf", &xh);
printf("\t vvedite a= ");
scanf_s("%lf", &a);
printf("\n\t Tablica znacheniy");
x = xn;
while (x <= xk) {
if (x <= 0) { y = 2 * x + 2; }
else {
if (x <= a) { y = sqrt(x + 3); }
else {
if (x > a) { y = pow(cos(x + 2), 2); }
}
}
printf("\n\t %4.3f\t\t%4.3f\n", x, y);
x = x + xh;
}
printf("\n Press any key: ");
_getch();
return 0;
}

Рисунок 4.6 – Окно программы

242
Рисунок 4.7 – Результат выполнения программы

Оборудование и материалы
1. Персональный компьютер;
2. Операционная система семейства Microsoft Windows;
3. Среда программирования Microsoft Visual Studio.

Указания по технике безопасности


1. Не входить в помещение, где находится вычислительная техника без
разрешения преподавателя.
2. Не работать в верхней одежде.
3. Не включать без разрешения оборудование.
4. При несчастном случае, или поломке оборудования позвать
преподавателя. Знать где находится рубильник (выключатель) выключения
электропитания оборудования.
5. Не трогать провода и разъемы (возможно поражение электрическим
током).
6. Не допускать порчи оборудования.

243
4.3 Задания
Создать блок-схему к программе и программу на языке программирования
С++ таблицы табулирования функции

244
Содержание отчета
1 . Работа предъявляется на экране компьютера в виде исходного кода и в виде
отчета, содержащего: ФИО студента, шифр группы, номер и тему лабораторной
работы, полный код программы на языке программирования С++.
2 . Отчет выполняется на компьютере и распечатывается на листах бумаги
формата А4.
3. Каждая работа должна быть защищена.
Контрольные вопросы
1. Как организуются составные операторы циклов в языке С++?
2. Как организуются вложенные циклы в языке С++?
3. В каких случаях может произойти зацикливание при использовании
оператора цикла с предусловием?
4. В каких случаях может произойти зацикливание при использовании
оператора цикла с постусловием?
5. Сколько условий требуется для работы оператора цикла с
параметром?
6. Сколько операторов отношения в языке С++? Перечислите их.
7. Как реализуется взаимозаменяемость операторов цикла while и for?
8. В чем сходство и различие между циклами с предусловием и с
постусловием?

Список литературы, рекомендуемый к использованию по данной


теме
1. Павловская, Т. А. С/С++: программирование на языке высокого
уровня : учебник для вузов/ Т. А. Павловская. – СПб. : Питер, 2010. – 461 с. –
(Учебник для вузов). – Библиогр.: с. 383. –Прил.: с.384-449. –ISBN 978-5-
94723-568-5.
2. Крылов, Е. В. Техника разработки программ : учебник : в 2 кн. / Е. В.
Крылов, В. А. Острейковский, Н. Г. Типикин, Кн. 1, Программирование на
языке высокого уровня. – Москва : Высшая школа, 2007. – 375 с. – (Для
высших учебных заведений) (Информатика и вычислительная техника). –
Библиогр.: с. 333-348. – Прил. с. 349-375. – ISBN 978-5-06-005524-5.
3. Ашарина И. В. Основы программирования на языках С и С++. – М.:
Горячая линия – Телеком, 2002. –207 с.: ил.
4. Кнут Д. Искусство программирования. Доступно:
http://lib.ru/CTOTOR/KNUT/
5. Ресурс по программированию. Доступно: http://physics-for-

246
students.ru/bookpc/informatika/slovar.zip
6. Языки программирования. Доступно: http://cppstudio.com/

ЛАБОРАТОРНАЯ РАБОТА 5
Одномерные числовые массивы в языке программирования С++.

247
Селективная обработка элементов массива. Нахождение минимального
и максимального элементов массива

Цель работы: изучить понятие массива, способы ввода и вывода в


программе элементов массива, методов селективной обработки элементов
массива и нахождение минимального и максимального элемента в массиве.

Формируемые компетенции:
(ОПК-2) - способностью решать стандартные задачи профессиональной
деятельности на основе информационной и библиографической культуры с
применением инфокоммуникационных технологий и с учетом основных
требований информационной безопасности;
(ОПК-3) - способностью владеть основными методами, способами и
средствами получения, хранения, переработки информации;
(ОПК-4) - способностью иметь навыки самостоятельной работы на
компьютере и в компьютерных сетях; осуществлять компьютерное
моделирование устройств, систем и процессов с использованием
универсальных пакетов прикладных компьютерных программ.

5.1Теоретическая часть
В языке программирования С заложены средства для задания
последовательностей упорядоченных данных. Такие последовательности
называются массивами. В массивах должны быть упорядочены данные одного и
того же типа. В данной лабораторной работе будут рассматриваться массивы с
целыми и вещественными типами данных, т. е. типы int, float или double.
Массивы данных могут быть одномерными (векторами размера 1 х n или n х 1),
двухмерными (матрицами размера n х m) или многомерными (размера n х m х p...). В
частности, для векторов и матриц в приведенной записи первый индекс означает
количество строк, а второй (число или буква) – это количество столбцов. Для
названия массива может быть использована переменная, состоящая из букв (буквы),
букв с цифрами, букв с цифрами и знаком подчеркивания и т. д. в соответствии с
правилами объявления переменных, принятых в языке С. Если размерность массива

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

5.1.1 Одномерные массивы


Одномерный массив – это список связанных однотипных переменных. Общая
форма записи одномерного массива:
тип имя_массива[размер];
В приведенной записи элемент тип объявляет базовый тип массива. Количество
элементов, которые будут храниться в массиве с именем имя_массива, определяется
элементом размер.
В языке С индексация массива начинается с нуля. Например, если размер
массива определен величиной 9, то в массиве можно хранить 10 элементов с
индексацией 0, 1, 2, 3, 4, 5, 6, 7, 8, 9.
Доступ к отдельному элементу массива осуществляется с помощью индекса.
Индекс описывает позицию элемента внутри массива.
Все массивы занимают смежные ячейки памяти, т. е. элементы массива в
памяти расположены последовательно друг за другом. Ячейка памяти с
наименьшим адресом относится к первому элементу массива, а с наибольшим – к
последнему.
Для одномерных массивов общий размер массива в байтах вычисляется по
формуле
всего байт = размер типа в байтах * количество элементов

В языке С++ нельзя присвоить один массив другому. Для передачи элементов
одного массива другому необходимо выполнить присвоение поэлементно.

5.1.2 Инициализация массива


В языке С++ массив при объявлении можно инициализировать. Общая форма
инициализации массива:
тип имя_массива[размер1] * [размерN] = {список_значений};
В список_значений входят констант, разделенных запятыми. Типы констант
должны быть совместимыми с типом массива.
Пример инициализации одномерного массива:
int A[5] = {1, 2, 3, 4, 5};
При этом A[0] = 1, A[1] = 2 и т. д.

249
В языке С возможна инициализация безразмерных массивов. Например для
одномерного массива:
int A[ ] = {1, 2, 3, 4, 5};

5.2 Практическая часть


Пример 1. Напишите программу заполнения одномерного массива
случайными числами из интервала от 1 до 15 по случайному равномерному
закону. Отсортировать массив случайных чисел по возрастанию.
Для решения поставленной задачи применим сортировку методом прямого
выбора. Алгоритм сортировки заключается в следующем:
1 В исходной последовательности из N элементов отыскивается элемент с
наименьшим ключом.
2 Он меняется местами с первым элементом.

3 В оставшейся последовательности из (N–1) элементов отыскивается


минимальный элемент и меняется местами со вторым элементом и
т. д., пока не останется один, самый большой элемент.

Программный код решения примера:


#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <stdlib.h>
#define left 1
#define right 15
#define N 10

int main(void) {
float R, r, min;
float A[N];
int i, j, k;
unsigned int some;
long int L;
L = (long)time(NULL);
some = (unsigned)L;
srand(some);
printf("\n\t The initial array of random numbers in the interval
[%d, %2d]\n", left, right);
for (i = 0; i < N; ++i)
{
r = (float)rand() / RAND_MAX;
R = left + (right - left)*r;

250
A[i] = R;
}
for (i = 0; i < N; ++i)
printf("\n\t %5d) %10.4f", i + 1, A[i]);
for (i = 0; i < (N - 1); ++i)
{
min = A[i]; k = i;
for (j = i + 1; j < N; ++j)
if (A[j] < min) { k = j; min = A[k]; }
A[k] = A[i]; A[i] = min;
}
printf("\n\n\t Sort an array: \n");
for (i = 0; i < N; ++i)
printf("\n\t %5d) %10.4f", i + 1, A[i]);
printf("\n\n Press any key:");
_getch();
return 0;
}
Возможный результат выполнения программы показан на рис. 5.1.

Рисунок 5.1 – Сортировка одномерного массива по возрастанию

В программе использованы директивы препроцессора для задания левой


границы (#define Left 1), правой границы (#define Right 15) и размера одномерного
массива (#define N 10). Включены дополнительные библиотеки time.h – для
обращения к функциям системного времени, stdlib.h – для обращения к функциям
генерации псевдослучайных чисел.

Пример 2. Напишите программу поиска максимального элемента в заданном


одномерном массиве. Элементы массива являются целыми числами.
Программный код решения примера:
251
#include <stdio.h>
#include <conio.h>
int main(void)
{
int i, size, max;
int A[] = { 3,5,2,8,12,0,-7,-3,-21 };
size = sizeof(A) / sizeof(A[0]);
printf("\n\t The dimention of the array A is equal to: %d\n",
size);
max = A[0];
for (i = 0; i < size; ++i)
if (A[i] > max) max = A[i];
printf("\n\t Maximum array element: %d\n", max);
printf("\n\n Press any key: ");
_getch();
return 0;
}
В программе использована инициализация безразмерного массива и
определения его размерности с помощью функции sizeof().
Результат выполнения программы показан на рис. 5.2.

Рисунок 5.2 – Определение максимального элемента массива

Пример 3. Напишите программу циклической перестановки чисел


заданного массива так, чтобы i-e число стало (i+1)-м, а последнее число –
первым. Выведите на дисплей исходный массив и преобразованный.
Программный код решения примера:
#include <stdio.h>
#include <conio.h>
#define N 55

int main(void)
{
int i, j, k;
double D[] = { 1.23,2.34,3.45,4.56,5.67,6.78 };
double B[N];

252
for (i = 0; i < N; ++i)
B[i] = 0.0;

k = sizeof(D) / sizeof(D[0]);

B[0] = D[k - 1];


for (i = 0; i < (k - 1); ++i)
B[i + 1] = D[i];

printf("\n\t The original array:\n");


for (i = 0; i < k; ++i)
printf("%8.2f", D[i]);
printf("\n\n\t The reconfigured array:\n");
for (j = 0; j < k; ++j)
printf("%8.2f", B[j]);

printf("\n\n Press any key:");


_getch();
return 0;
}

Результат выполнения программы показан на рис. 5.3.

Рисунок 5.3 – Пример циклической перестановки


элементов числового массива

Пример 4. В данном одномерном массиве вещественных чисел


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

253
#include <stdio.h>
#include <conio.h>
#define n 7
int main(void)
{
int i, k;
float A[n] = { 1.23F,2.34F,3.45F,4.56F,5.67F,6.78F,7.89F };
float B[n];
for (i = 0; i < n; ++i)
B[i] = 0;
printf("\n\t\t The original array of dimention n=%d:\n", n);

printf("\t");
for (i = 0; i < n; ++i)
printf("%6.2F", A[i]);
printf("\n\n\t\t The reconfigqred array:\n");
for (i = 0; i < n; ++i) {
k = i % 2;
if (k == 0 && i < n - 1)
B[i] = A[i + 1];
else if (k != 0 && i>0)
B[i] = A[i - 1];
else if (k == 0 && i < n)
B[i] = A[i];
}
printf("\t");
for (i = 0; i < n; ++i)
printf("%6.2f", B[i]);

printf("\n\n Press any key:");


_getch();
return 0;
}

При инициализации массива каждый его элемент снабжен суффиксом F.


Результат выполнения программы показан на рис. 5.4.

Рисунок 5.4 – Смена четных и нечетных мест чисел массива

254
Пример 5. Создать блок-схему к заданию и программу на С++, если дан
массив А(8), элементы которого нужно ввести с клавиатуры, найти сумму
четных положительных элементов и минимальный элемент массива.
Блок-схема к заданию на рис. 5.5, окно кода программы показан на рис.
5.6, а результат выполнения программы на рис. 5.7.

Рисунок 5.5 – Блок-схема к заданию

Программный код решения примера:


255
#include <stdio.h>
#include <conio.h>
#include <math.h>

int main(void)
{
int A[8];
int i, sum, min;
printf("\n\t Vvedite massiv iz 8 chisel\n");
for (i = 0; i < 8; i++)
scanf("%i", &A[i]);
printf("\n\t ishodniy massiv\n");
for (int i = 0; i < 8; i++)
printf("\n\t %5d element massiva %10d", i + 1, A[i]);
sum = 0; min = A[0];
for (i = 0; i < 8; i++)
{
if ((A[i] > 0) && (!(A[i] % 2))) { sum = sum + A[i]; }
if (A[i] < min) { min = A[i]; }
}
printf("\n\t Minimalniy elementmassiva %d\n", min);
printf("\n\n\t Summa=:%10d\n", sum);
printf("\n\t Press any key:");
_getch();
return 0;
}

Рисунок 5.6 – Окно кода программы

256
Рисунок 5.7 – Окно обработки элементов массива

Оборудование и материалы
1. Персональный компьютер;
2. Операционная система семейства Microsoft Windows;
3. Среда программирования Microsoft Visual Studio.

Указания по технике безопасности


1. Не входить в помещение, где находится вычислительная техника без
разрешения преподавателя.
2. Не работать в верхней одежде.
3. Не включать без разрешения оборудование.
4. При несчастном случае, или поломке оборудования позвать
преподавателя. Знать где находится рубильник (выключатель) выключения
электропитания оборудования.

257
5. Не трогать провода и разъемы (возможно поражение
электрическим током).
6. Не допускать порчи оборудования.

Задания
Составить блок-схемы и программы для решения следующих задач
таблица 5.1.

Таблица 5.1 – Индивидуальные задания

Вариант задание Условие задания


1 а Найти количество положительных элементов
б Найти сумму элементов больших 3
в Найти максимальный элемент массива
2 а Найти количество отрицательных элементов
б Найти сумму отрицательных элементов
в Найти минимальный элемент кратный пяти
3 а Найти количество четных элементов
б Найти сумму элементов кратных 3
в Найти разность максимального и минимального элементов массива
4 а Найти среднее арифметичекое элементов массива
б Найти сумму наибольшего и наименьшего элементов массива
в Найти максимальный по модулю элемент массива
5 а Вычислить среднее арифметическое четных элементов массива
б Найти сумму минимального положительного элемента массива
и его номера
в Найти произведение модулей наибольшего
отрицательного и наименьшего четного элементов
массива
6 а Найти количество элементов кратных 5
б Найти сумму четных элементов массива стоящих на нечетных
в местах
Найти сумму второго и наибольшего положительного
элементов массива
7 а Найти среднее геометрическое четных элементов массива
б Найти номер наибольшего по модулю элемента массива

258
в Найти максимальный четный элемент массива
8 а Вычислить среднее арифметическое максимального и
минимального элементов массива
б Найти минимальный по модулю элемент массива
в Найти сумму элементов из интервала [0;10]
9 а Вычислить среднее геометрическое номеров
максимального и минимального элементов массива
б Найти разность суммы положительных и произведения
отрицательных чисел массива
в Найти количество положительных элементов
10 а Найти сумму отрицательных элементов
б Найти сумму элементов массива, у которых индекс кратен 3
в Найти произведение модулей наибольшего и наименьшего
элементов массива
11 а Найти сумму отрицательных элементов
б Найти сумму второго и наибольшего положительного
элементов массива
в Найти разность максимального и минимального элементов массива
12 а Вычислить среднее арифметическое четных элементов массива
б Найти сумму элементов в диапазоне [-10;20]
в Найти максимальный по модулю элемент массива
13 а Найти сумму минимального положительного элемента массива и
его номера
б Найти сумму четных элементов массива из
диапазона [-20;30]
в Найти минимальный по модулю элемент массива
14 а Найти количество элементов кратных 5
б Найти сумму четных элементов массива стоящих на нечетных
местах
в Найти максимальный четный элемент массива
15 а Найти количество положительных элементов
б Найти сумму элементов больших 3
в Найти максимальный элемент массива
16 а Найти количество отрицательных элементов
б Найти сумму отрицательных элементов
в Найти минимальный элемент кратный пяти
17 а Найти количество четных элементов
б Найти сумму элементов кратных 3
в Найти разность максимального и минимального элементов массива

18 а Найти среднее арифметическое элементов массива


259
б Найти сумму наибольшего и наименьшего элементов массива
в Найти максимальный по модулю элемент массива
19 а Вычислить среднее арифметическое четных элементов массива
б Найти сумму минимального положительного элемента массива и
его номера
в Найти произведение модулей наибольшего
отрицательного и наименьшего четного элементов
20 а массива
Найти количество элементов кратных 5
б Найти сумму четных элементов массива стоящих на нечетных
местах
в Найти сумму второго и наибольшего положительного
элементов массива
21 а Найти среднее геометрическое четных элементов массива
б Найти номер наибольшего по модулю элемента массива
в Найти максимальный четный элемент массива
22 а Вычислить среднее арифметическое максимального и
минимального элементов массива
б Найти минимальный по модулю элемент массива
в Найти сумму элементов из интервала [0;10]
23 а Вычислить среднее геометрическое номеров
максимального и минимального элементов массива
б Найти разность суммы положительных и произведения
отрицательных чисел массива
в Найти количество положительных элементов
24 а Найти сумму отрицательных элементов
б Найти сумму элементов массива, у которых индекс кратен 3
в Найти произведение модулей наибольшего и наименьшего
элементов массива
25 а Найти сумму отрицательных элементов
б Найти сумму второго и наибольшего отрицательного
элементов массива
в Найти разность максимального и минимального элементов массива
26 а Вычислить среднее арифметическое четных элементов массива
б Найти сумму элементов в диапазоне [-10;20]
в Найти максимальный по модулю элемент массива
27 а Найти сумму минимального положительного элемента массива и
его номера
б Найти сумму четных элементов массива из
диапазона [-20;30]
в Найти минимальный по модулю элемент массива
28 а Максимальный по модулю элемент
б Найти среднее арифметичекое элементов массива
в Найти сумму отрицательных элементов
29 а Найти количество элементов кратных 4

260
б Найти сумму отрицательных элементов
в Найти сумму наибольшего и наименьшего элементов массива
30 а Найти разность максимального и минимального
положительных элементов
б Найти сумму нечетных элементов
в Найти минимальный элемент из диапазона [-20;30]

Содержание отчета
1. Работа предъявляется на экране компьютера в виде исходного кода и в виде
отчета, содержащего: ФИО студента, шифр группы, номер и тему лабораторной
работы, полный код программы на языке программирования С++.
2. Отчет выполняется на компьютере и распечатывается на листах бумаги
формата А4.
3. Каждая работа должна быть защищена.

Контрольные вопросы
1. Как организуются одномерные числовые массивы в языке С++?
2. Как организуется индексирование числовых массивов в языке С++?
3. На кого или на что возлагается контроль границ числовых массивов
в языке программирования С++?
4. Для чего применяется начальная инициализация числовых массивов
при дальнейшем их использовании?
5. Почему при определении размерности массива с помощью
препроцессорной директивы define не используется точка с запятой после
числового значения?

Список литературы, рекомендуемый к использованию по данной


теме
1. Павловская, Т. А. С/С++: программирование на языке высокого
уровня : учебник для вузов/ Т. А. Павловская. – СПб. : Питер, 2010. – 461 с. –
(Учебник для вузов). – Библиогр.: с. 383. –Прил.: с.384-449. –ISBN 978-5-
94723-568-5.

261
2. Крылов, Е. В. Техника разработки программ : учебник : в 2 кн. / Е. В.
Крылов, В. А. Острейковский, Н. Г. Типикин, Кн. 1, Программирование на
языке высокого уровня. – Москва : Высшая школа, 2007. – 375 с. – (Для
высших учебных заведений) (Информатика и вычислительная техника). –
Библиогр.: с. 333-348. – Прил. с. 349-375. – ISBN 978-5-06-005524-5.
3. Ашарина И. В. Основы программирования на языках С и С++. – М.:
Горячая линия – Телеком, 2002. –207 с.: ил.
4. Кнут Д. Искусство программирования. Доступно:
http://lib.ru/CTOTOR/KNUT/
5. Ресурс по программированию. Доступно: http://physics-for-
students.ru/bookpc/informatika/slovar.zip
6. Языки программирования. Доступно: http://cppstudio.com/

ЛАБОРАТОРНАЯ РАБОТА 6
Понятие многомерного массива. Обработка элементов матриц

262
Цель работы: изучить понятие матрицы, селективной обработки
элементов матрицы, а также обработки элементов столбцов, строк и
диагоналей матриц.

Формируемые компетенции:
(ОПК-2) - способностью решать стандартные задачи профессиональной
деятельности на основе информационной и библиографической культуры с
применением инфокоммуникационных технологий и с учетом основных
требований информационной безопасности;
(ОПК-3) - способностью владеть основными методами, способами и
средствами получения, хранения, переработки информации;
(ОПК-4) - способностью иметь навыки самостоятельной работы на
компьютере и в компьютерных сетях; осуществлять компьютерное
моделирование устройств, систем и процессов с использованием
универсальных пакетов прикладных компьютерных программ.

6.1 Теоретическая часть


6.1.1 Двухмерные массивы, матрицы
Двухмерный массив представляет собой список одномерных массивов.
Общая форма записи двухмерного массива:
тип имя_массива[размер1] [размер2];
В приведенной записи размер1 означает количество строк двухмерного
массива, а размер 2 – количество столбцов.
В двухмерном массиве позиция любого элемента определяется двумя
индексами. Индексы каждого из размеров массива начинаются с 0 (с нуля).
Место хранения для всех элементов массива определяется во время
компиляции. Память, выделенная для хранения массива, используется в
течение всего времени существования массива.
Для двухмерных массивов общий размер массива в байтах вычисляется

263
по формуле

всего байт = число строк * число столбцов * размер типа в


байтах

6.1.2 Многомерные массивы


Общая форма записи многомерного массива:
тип имя_массива[размер1] [размер2]... [размерN];
Индексация каждого размера начинается с нуля. Элементы
многомерного массива располагаются в памяти в порядке возрастания
самого правого индекса. Поэтому правый индекс будет изменяться быстрее,
чем левый (левые).
При обращении к многомерным массивам компьютер много времени
затрачивает на вычисление адреса, так как при этом приходится
учитывать значение каждого индекса. Следовательно, доступ к элементам
многомерного массива происходит значительно медленнее, чем к
элементам одномерного. В этой связи использование многомерных
массивов встречается значительно реже, чем одномерных или
двухмерных массивов.
Для многомерных массивов общий размер многомерного массива в
байтах вычисляется по формуле
всего байт = размер1* размер2*...* размерN *размер
типа в байтах
Очевидно, многомерные массивы способны занять большой объем
памяти, а программа, которая их использует, может очень быстро
столкнуться с проблемой нехватки памяти.
Для определения размера типа в байтах применяется функция sizeof(),
которая возвращает целое число. Например, sizeof(float).

6.1.3 Инициализация массивов

264
При инициализации многомерного массива для улучшения наглядности
элементы инициализации каждого измерения можно заключать в фигурные
скобки.
Пример инициализации двухмерного массива:
int MN[3][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
Массив MN[3][4] – это матрица, у которой 3 строки и 4 столбца.
Для многомерных массивов инициализацию можно также проводить с
указанием номера инициализируемого элемента.
Пример инициализации трехмерного массива:
int XYZ[2][3][4] = {
{ {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} },
{ {13, 14, 15, 16}, {17, 18, 19, 20}, {21, 22, 23, 24} }
};
Как видно, массив XYZ содержит два блока, каждый из которых есть
матрица размера 3 х 4, т. е. 3 строки и 4 столбца.
В многомерном массиве размер самого левого измерения также можно
не указывать. В частности, для инициализации массива MN[3][4]
допустима следующая запись:
int MN[][4] = {
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
};
При инициализации многомерных массивов необходимо указать все
данные (размерности) за исключением крайней слева размерности. Это
нужно для того, чтобы компилятор смог определить длину подмассивов,
составляющих массив, и смог выделить необходимую память. Рассмотрим
265
пример безразмерной инициализации для трехмерного массива целых чисел:
int XYZ[][3][4] = {
{
{1, 2, 3, 4},
{5, 6, 7, 8},
{9, 10, 11, 12}
},
{
{13, 14, 15, 16},
{17, 18, 19, 20},
{21, 22, 23, 24}
}
};
Вывод трехмерного массива на консоль (дисплей) можно выполнить по
следующей программе:
#include <stdio.h>
#include <conio.h>
int main (void) {
int i, j, k;
int XYZ[][3][4] = {
{ {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} }, //
1-й
{ {13, 14, 15, 16}, {17, 18, 19, 20}, {21, 22, 23,
24}
} }; // 2-й
for (i = 0; i < 2; ++i) { printf("\n");
for (j = 0; j < 3; ++j) { printf("\n");
for (k = 0; k < 4; ++k)
printf(" %3d", XYZ[i][j][k]);
}
}
266
printf("\n\n Press any key: ");
_getch();
return 0;
}

Практическая часть
Пример 1. Напишите программу заполнения квадратной матрицы
(заданного размера n > 2) по спирали натуральными числами начиная с
левого верхнего угла (принимая его за номер 1) и двигаясь по часовой стрелке.
Образец заполнения:

Рисунок 6.1 – Образец заполнения матрицы числами по спирали

Программный код решения примера:


#include <stdio.h>
#include <conio.h>
#include <locale>
#define n 13
int main(void) {
setlocale(LC_ALL, "Russian");
int i = 1, j, k;
int p = n / 2;
int A[n][n];
for (j = 0; j < n; ++j)
for (k = 0; k < n; ++k)
A[j][k] = 0;
printf("\n\t Спиральная матрица размером (%d x %d) :\n", n, n);
for (k = 1; k <= p; k++)
{
for (j = (k - 1); j < (n - k + 1); j++)
A[(k - 1)][j] = i++;
for (j = k; j < (n - k + 1); j++)
A[j][n - k] = i++;
for (j = (n - k - 1); j >= (k - 1); --j)

267
A[n - k][j] = i++;
for (j = (n - k - 1); j >= k; j--)
A[j][(k - 1)] = i++;
}
if (n % 2)
A[p][p] = n*n;
for (i = 0; i < n; ++i)
for (j = 0; j < n; ++j)
{
printf("%5d", A[i][j]);
if (j == (n - 1))
printf("\n");
}
printf("\n Нажмите любую клавишу: ");
_getch();
return 0;
}
Результат выполнения программы показан на рис. 6.2.

Рисунок 6.2 – Заполнение матрицы по спирали

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


(вещественных значений), причем значения этих величин сводятся в
прямоугольную таблицу размера n х m. Составьте многомерный массив
данных за 30 дней. Формирование данных произвести по случайному
равномерному закону из интервала от –12 до 21.
Этот пример относится к определению трехмерного массива данных.
Программный код решения примера:
#include <stdio.h>

268
#include <conio.h>
#include <time.h>
#include <stdlib.h>
#include <locale>
#define n 6
#define m 7
#define N 30
const int Left = -12;
const int Right = 21;
int main(void)
{
setlocale(LC_ALL, "Russian");
float R, r;
float A[N][n][m];
int i, j, k;
srand((unsigned)time(NULL));
printf("\n\t Значения каждые 10 дней из 30 дней:");
for (k = 0; k < N; ++k)
for (i = 0; i < n; ++i)
for (j = 0; j < m; ++j)
{
r = (float)rand() / RAND_MAX;
R = Left + (Right - Left)*r;
A[k][i][j] = R;
}
for (k = 0; k < N; k += 10) {
printf("\n");
for (i = 0; i < n; ++i) {
printf("\n");
for (j = 0; j < m; ++j)
printf("%10.4f", A[k][i][j]);
}
}
printf("\n Нажмите любую клавишу: ");
_getch();
return 0;
}

В программе используется трехмерный массив размера 30 х 6 х 7. Это


означает, что прямоугольная таблица (массив) данных размера 6 х 7 как бы
скрепляется 30 раз
– по заданному числу дней. Границы случайных чисел определены с помощью
спецификатора const.
Возможный результат выполнения программы показан на рис. 6.3.

269
Рисунок 6.3 – Вывод данных за каждый 10-й день

Пример 3. Напишите программу по перемножению двух матриц А


и В с размерностями (m х r) и (r х n) соответственно. Матрицу А прими-
те размером 4 х 5, матрицу В – размером 5 х 3 (обе целочисленные).
Условием перемножения двух матриц А и В является равенство числа
столбцов матрицы А и числа строк матрицы В. Если первая матрица А имеет
размер m х r, то вторая матрица В должна иметь размер r х n. В результате
перемножения получим матрицу С размера m х n. Приведем следующую схему по
размерностям:

Поэлементное перемножение двух матриц в стандартной математической


форме имеет следующий вид:

С учетом синтаксиса формирования массивов в языке С индексация должна


начинаться с нуля, поэтому формулу перепишем в следующем виде:

270
Программный код решения примера:
#include <stdio.h>
#include <conio.h>
#include <locale>
#define m 4
#define r 5
#define n 3
int main(void) {
setlocale(LC_ALL, "Russian");
int i, j, k;
const int A[m][r] = { { 1,2,3,4,5 },
{ 2,3,4,5,6 },
{ 2,2,2,2,2 },
{ 3,3,3,3,3 } };
const int B[r][n] = { { 9,8,7 },
{ 1,2,3 },
{ 4,5,6 },
{ 7,8,9 },
{ 1,1,1 } };
int C[m][n];
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
C[i][j] = 0;
for (i = 0; i < m; i++)
for (j = 0; j < n; j++)
for (k = 0; k < r; k++)
C[i][j] = C[i][j] + A[i][k] * B[k][j];
printf("\n 1) Индексы: \"ijk\". Матрица (%dx%d):\n", m, n);
for (i = 0; i < m; i++) {
printf("\n");
for (j = 0; j < n; j++)
printf(" %4d", C[i][j]);
}
printf("\n\n ... Нажмите любую клавишу: ");
_getch();
return 0;
}
В программе используются три цикла по формированию произведения двух
матриц. Первый цикл (переменная i) связан с количеством строк первой
матрицы (матрицы А), второй цикл (переменная j) связан с количеством столбцов
второй матрицы (матрица В), третий цикл (переменная k) связан со смежной
размерностью матриц, которая исчезает в результирующей матрице С. Матрицы
А и В определены как неизменяемые типы (const int). Приведенный программный
метод можно назвать как первый метод, метод "ijk".
Результат выполнения программы показан на рис. 6.4.

271
Рисунок 6.4 – Результат произведения двух матриц

Пример 4. Создать блок-схему к заданию и программу на С++


нахождения суммы квадратов индексов максимального элемента
матрицы, ввод элементов матрицы сделать с клавиатуры.
Блок-схема к заданию на рис. 6.5, окно кода программы показан на рис. 6.6, а
результат выполнения программы на рис. 6.7.

272
Рисунок 6.5 – Блок-схема к заданию

Программный код решения примера:


#include <stdio.h>
#include <conio.h>

273
#include <locale>
#define m 3
int main(void) {
setlocale(LC_ALL, "Russian");
int i, j, k, l, max, sum;
int A[m][m];
for (i = 0; i < m; i++)
{
printf("\n введите 3 элемента %d строки\n", i + 1);
for (j = 0; j < m; j++)
scanf("%i, %j", &A[i][j]);
}
printf("\n Исходная матрица (%dx%d) :\n", m, m);
for (i = 0; i < m; i++) {
printf("\n");
for (j = 0; j < m; j++)
printf(" %4d", A[i][j]);
}
max = A[0][0];
for (i = 0; i < m; i++)
for (j = 0; j < m; j++)
if (A[i][j]>max) { max = A[i][j]; k = i + 1; l = j +
1; }
printf("\n максимальный элемент матрицы= %d его номер строки=%d
номер столбца=%d\n", max, k, l);
sum = k*k + l*l;
printf("\n сумма квадратов индексов максимального элемента
матрицы %d\n", sum);
printf("\n\n Нажмите любую клавишу: ");
_getch();
return 0;
}

Рисунок 6.6 – Окно примера

274
Рисунок 6.7 – Обработка элементов матрицы

Пример 5. Напишите программу транспонирования матрицы,


размерности которой (количество строк и количество столбцов)
вводятся с клавиатуры, а элементы – вещественные случайные числа,
распределенные по равномерному закону из интервала [0;15].
По определению транспонированная матрица – это матрица полученная из
исходной матрицы A заменой строк на столбцы.
Программный код решения примера:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#include <locale.h>
int main(void) {
int i, j, n, m;
double *A_ptr, *B_buf;
srand((unsigned)time(NULL));
setlocale(LC_ALL, "Russian");
printf("\n Введите размерность матрицы - \n число строк и число
столбцов через пробел: ");
scanf_s("%d%d", &n, &m);
A_ptr = (double *)calloc((n*m), sizeof(double));
B_buf = (double *)calloc((n*m), sizeof(double));
for (i = 0; i < n*m; ++i)
A_ptr[i] = 15.0*rand() / RAND_MAX;
setlocale(LC_NUMERIC, "English");
printf("\n Исходная матрица:\n");
275
for (i = 0; i < n; ++i) {
printf("\n");
for (j = 0; j < m; ++j)
printf(" %8.4f", A_ptr[i*m + j]);
}
for (i = 0; i < n; ++i)
for (j = 0; j < m; ++j)
B_buf[j*n + i] = A_ptr[i*m + j];
printf("\n\n Транспонированная матрица: \n");
for (j = 0; j < m; ++j) {
printf("\n");
for (i = 0; i < n; ++i)
printf(" %8.4f", B_buf[j*n + i]);
}
free(A_ptr); free(B_buf);
printf("\n\n Нажмите любую клавишу: ");
_getch();
return 0;
}
В программе использованы библиотечные функции для установки русских
шрифтов setlocale(LC_ALL, "Russian") и вывода элементов матрицы с плавающей
точкой: setlocale(LC_NUMERIC, "English"). Для этих функций подключен
заголовочный файл locale.h.
Возможный результат работы программы показан на рис. 6.8.

Рисунок 6.8 – Пример транспонирования матрицы


Оборудование и материалы
1. Персональный компьютер;
2. Операционная система семейства Microsoft Windows;
3. Среда программирования Microsoft Visual Studio.
276
Указания по технике безопасности
1. Не входить в помещение, где находится вычислительная техника без
разрешения преподавателя.
2. Не работать в верхней одежде.
3. Не включать без разрешения оборудование.
4. При несчастном случае, или поломке оборудования позвать
преподавателя. Знать где находится рубильник (выключатель) выключения
электропитания оборудования.
5. Не трогать провода и разъемы (возможно поражение электрическим
током).
6. Не допускать порчи оборудования.

Задания
Составить блок-схемы и программы для решения следующих задач
таблица 6.1. (задача a на селективную обработку элементов матрицы,
задача б на обработку элементов строк и столбцов).

Таблица 6.1– Индивидуальные задания


Вариант Содержание задачи
1 Найти сумму положительных кратных 3 элементов.
Найти среднее геометрическое нечетных элементов 2-го столбца и
количество кратных 5 элементов 3-ей строки матрицы Б(5;5).

2 Найти количество отрицательных четных элементов.


Найти сумму нечетных элементов 3-го столбца и
произведение отрицательных кратных 3 элементов 2-ой
строки матрицы С(6;6).
3 Найти произведение положительных четных элементов.
Найти произведение суммы кратных 3 чисел в 4-ом столбце
на количество нечетных чисел 2-ой строки матрицы Т(4;6).
4 Найти сумму отрицательных четных элементов.
В матрице А(5;7) найти разность количества нечетных чисел
1-ой строки и количества четных чисел 4-го столбца.

277
5 Найти максимальный элемент, номер строки и столбца, в
котором он находится.
Найти сумму нечетных элементов 2-го столбца и
произведение отрицательных кратных 3 элементов 4-ой
сторки матрицы Б(4;4).
6 Найти минимальный элемент, номер строки и столбца, в
котором он находится.
Найти произведение отрицательных четных элементов 2-ой
строки и количество не кратных 5 элементов 2-го столбца
матрицы В(3;5).
7 Найти количество положительных кратных 5 элементов.
Подсчитать количество положительных кратных 3 элементов
1-ой строки и количество нечетных элементов 2- го столбца
матрицы А(6;6).
8 Найти произведение отрицательных нечетных элементов.
Найти разность произведения нечетных чисел 3-ей строки и
произведения отрицательных чисел 1-го столбца матрицы
В(4;4).
9 Найти квадрат минимального элемента и номер строки и
столбца, где он находится.
В матрице Т(3;9) найти разность произведения нечетных
чисел 2-ой строки и суммы положительных чисел 6-го
столбца.
10 Найти произведение положительных не кратных 5 элементов.
В матрице А(5;5) найти сумму количества четных чисел 3- ей
строки и количества отрицательных чисел 4-го столбца.
11 Найти максимальный по модулю элемент и номер строки и
столбца, где он находится.
В матрице С(5;6) найти произведение количества нечетных
чисел 2-го столбца и количества положительных чисел 3
строки.
12 Найти количество отрицательных не кратных 3 элементов.
Найти максимальный элемент 2-ой строки и количество
четных элементов 5-го столбца матрицы Х(5;5).
13 Найти произведение положительных нечетных элементов.
В матрице А(6;6) найти произведение суммы четных чисел 3-
ей строки и суммы отрицательных чисел 1-го столбца.
14 Найти сумму отрицательных нечетных элементов.
Найти произведение суммы положительных чисел 1-й строки
на сумму четных чисел 2-го столбца матрицы М(4;5).

278
15 Найти произведение отрицательных четных элементов.
В матрице А(7;7) найти разность количества отрицательных
чисел 2-ой строки и количества нечетных чисел 3-го столбца.
16 Найти количество элементов, больших заданного числа С
(ввод числа С сделать с клавиатуры).
В матрице В(4;6) найти сумму произведения четных чисел 1-
ой строки и произведения положительных чисел 3-го
столбца.
17 Найти минимальный по модулю элемент и номер строки и
столбца, где он находится.
Подсчитать количество кратных 3 чисел 2-ой строки и
количество четных чисел 1-го столбца матрицы А(6;6).
18 Найти произведение элементов, меньших заданного числа Т
(ввод числа Т сделать с клавиатуры).
Найти разность произведения нечетных чисел 3-ей строки и
произведения отрицательных чисел 1-го столбца матрицы
В(4;4).
19 Найти сумму положительных кратных 5 элементов.
В матрице А(8;8) найти разность произведения нечетных
чисел 3-ей строки и суммы положительных чисел 6-го
столбца.
20 Найти произведение отрицательных четных элементов.
В матрице А(5;5) найти сумму количества четных чисел 2- ой
строки и количества отрицательных чисел 4-го столбца.
21 Найти количество положительных нечетных элементов.
В матрице А(3;3) найти произведение количества нечетных
чисел 1-ой строки и количества положительных чисел 3-го
столбца.
22 Найти количество элементов, меньших числа 5.
Найти максимальный элемент 3-го столбца и сумму нечетных
элементов 1-ой строки матрицы Т(5;5).
23 Найти произведение положительных кратных 3 элементов.
В матрице А(6;6) найти произведение суммы четных чисел в
3-ей строке и суммы отрицательных чисел 1-го столбца.
24 Найти сумму отрицательных не кратных 5 элементов.
Найти произведение суммы положительных чисел в 4-ом
столбце на количество четных чисел 2-ой строки матрицы
Б(6;6).
25 Найти квадрат максимального элемента и номер строки и
столбца, где он находится.
В матрице А(7;7) найти разность количества положительных
чисел 1-ой строки и количества четных чисел 3-го столбца.

279
26 Найти сумму четных элементов из интервала [-10; 10]
матрицы А(4;4).
Найти произведение количества четных элементов 3 строки
на сумму нечетных элементов 2 столбца матрицы В(5;4).
27 Найти количество кратных 3 элементов из интервала [-6;8]
матрицы А(5;5).
В матрице А(3;3) найти произведение количества четных
чисел 2-ой строки и количества отрицательных чисел 4-го
столбца.
28 Найти произведение отрицательных нечетных элементов
матрицы А(4;3).
В матрице А(5;5) найти произведение количества нечетных
чисел 3-го столбца и количества отрицательных чисел 3
строки.
29 Найти количество положительных элементов из интервала [-
5;6] матрицы В(6;6).
В матрице А(6;6) найти произведение суммы кратных 3 чисел
2-ей строки и суммы отрицательных чисел 2-го столбца.
30 Найти максимальный по модулю элемент и номер строки и
столбца, где он находится.
Найти произведение количества четных чисел в 2-ом столбце
на количество нечетных чисел 2-ой строки матрицы В(4;4).

Содержание отчета
1 . Работа предъявляется на экране компьютера в виде исходного кода и в виде
отчета, содержащего: ФИО студента, шифр группы, номер и тему лабораторной
работы, полный код программы на языке программирования С++.
2 . Отчет выполняется на компьютере и распечатывается на листах бумаги
формата А4.
3. Каждая работа должна быть защищена.
Контрольные вопросы
1 Как организуются многомерные числовые массивы в языке С++?
2 Как организуется индексирование числовых массивов в языке
3 На кого или на что возлагается контроль границ числовых масси-
вов в языке программирования С++?
4 В какой очередности и как происходит заполнение многомерных
числовых массивов в программах на языке С++?
5 Для чего применяется начальная инициализация числовых массивов при
дальнейшем их использовании?
280
6 Сколько потребуется операторов цикла для вывода на консоль
двухмерного числового массива (матрицы чисел)?
7 Почему при определении размерности массива с помощью препроцессорной
директивы define не используется точка с запятой после числового значения?

Список литературы, рекомендуемый к использованию по данной


теме
1. Павловская, Т. А. С/С++: программирование на языке высокого
уровня : учебник для вузов/ Т. А. Павловская. – СПб. : Питер, 2010. – 461 с. –
(Учебник для вузов). – Библиогр.: с. 383. –Прил.: с.384-449. –ISBN 978-5-
94723-568-5.
2. Крылов, Е. В. Техника разработки программ : учебник : в 2 кн. / Е. В.
Крылов, В. А. Острейковский, Н. Г. Типикин, Кн. 1, Программирование на
языке высокого уровня. – Москва : Высшая школа, 2007. – 375 с. – (Для
высших учебных заведений) (Информатика и вычислительная техника). –
Библиогр.: с. 333-348. – Прил. с. 349-375. – ISBN 978-5-06-005524-5.
3. Ашарина И. В. Основы программирования на языках С и С++. – М.:
Горячая линия – Телеком, 2002. –207 с.: ил.
4. Кнут Д. Искусство программирования. Доступно:
http://lib.ru/CTOTOR/KNUT/
5. Ресурс по программированию. Доступно: http://physics-for-
students.ru/bookpc/informatika/slovar.zip
6. Языки программирования. Доступно: http://cppstudio.com/

281
ЛАБОРАТОРНАЯ РАБОТА 7
Построение графика функции

Цель работы: научится строить график функции на языке


программирования С++ в консольном окне с помощью функций.

Формируемые компетенции:
(ОПК-2) - способностью решать стандартные задачи профессиональной
деятельности на основе информационной и библиографической культуры с
применением инфокоммуникационных технологий и с учетом основных
требований информационной безопасности;

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

7.1 Теоретическая часть


Принципы программирования на языке С основаны на понятии функции.
Например, к системным функциям относятся printf(), scanf(), gets(), putchar() и
др. Функции – это строительные элементы языка С и то место, в котором
выполняется вся работа программы.
Большие программы обычно состоят из нескольких пользовательских
функций и ряда системных функций. Функция – самостоятельная единица
программы. Функции повышают уровень модульности программы, облегчают ее
чтение, внесение изменений и коррекцию ошибок.
В основе всех программ на языке программирования С лежат одни и те же
фундаментальные элементы – функции. В частности, функция main() является
обязательной для любой программы. Во всех программах С определяется
единая внешняя функция с именем main(), служащая точкой входа в
программу, то есть первой функцией, выполняемой после запуска программы.
Ни одна программа в языке С++ не может обойтись без функций. Функция в
языке С играет ту же роль, что и подпрограммы или процедуры в других языках.
Каждая функция языка С имеет имя и список аргументов. По соглашению,
принятому в языке С, при записи имени функции после него ставятся круглые
скобки. Это соглашение позволяет легко отличить имена переменных от имен
функций.
Рассмотрим модельный пример программы, в которой, кроме функции main(),
содержатся еще три функции.
#include <stdio.h>
int main(void) /* Главная функция */
{ /* Начало тела функции */
function1(); /* вызов первой функции */
function2(); /* вызов второй функции */

283
function3(); /* вызов третьей функции */
} /* Конец тела функции main() */
/* Начало определения первой функции */
function1() {/* Начало тела первой функции */
/* Операторы первой функции */
/* Конец тела первой функции */
}
/* Начало определения второй функции */
function2()
{ /* Начало тела второй функции*/
/* Операторы второй функции */
/* Конец тела второй функции*/
}

/* Начало определения третьей функции */


function3()
{ /* Начало тела третьей функции*/
/* Операторы третьей функции */
/* Конец тела третьей функции*/
}

В условной (модельной) программе имеются четыре функции: main(),


function1(), function2(), function3(). Эти функции не имеют аргументов. Позднее
рассмотрим функции, которые имеют аргументы. Аргументы функции – это
величины, которые передаются функции во время ее вызова. Аргумент,
стоящий в операторе вызова функции, называется фактическим параметром.
Аргументы, стоящие в заголовке функции, называются формальными
параметрами. В языке С++ функция может возвращать значение в вызывающую
программу посредством оператора return. Оператор возврата из функции в точку
вызова имеет две формы:
return;
return выражение;
В общем виде функция выглядит следующим образом:
возвр-тип имя-функции(список параметров)
{

284
Тело_функции
}
Тело_функции – это часть определения функции, ограниченная фигурными
скобками и непосредственно размещенная вслед за заголовком функции. Тело
функции может быть либо составным оператором, либо блоком. В языке С
определения функций не могут быть вложенными, т. е. внутри одной функции
нельзя объявить и расписать тело другой функции.
Возвращаемый тип возвр-тип функции определяет тип данного,
возвращаемого функцией. Например, это могут быть int, float, double и т. д. В
случае, когда функция ничего не возвращает, ей присваивается тип void.
Функция может возвращать любой тип данных, за исключением массивов
список параметров – это список, элементы которого отделяются друг от друга
запятыми. При вызове функции параметры принимают значения аргументов.
Если функция без параметров, то такой пустой список можно указать в явном
виде, поместив для этого внутри скобок ключевое слово void. Все параметры
функции (входящие в список параметров) должны объявляться отдельно, причем
для каждого из них надо указывать и тип, и имя. В общем виде список
объявлений параметров должен выглядеть следующим образом:
fun(тип имя_перем1, тип имя_перем2,..., тип имя_перем
N)
Например:
fun(int i, int j, float k, char str1, char str2)
Рассмотрим пример программы с выводом сообщения не в главной
функции main(), а в другой:
#include <stdio.h>
#include <conio.h>
void printMessage (void)
{
printf("\n\t hello,
world\n");
return; printf("\n\t 123\n");
}
int main(void)
{
285
printMessage();
printf("\n Press any key: ");
_getch(); return 0;
}
Результат выполнения программы показан на рис. 7.1.

Рисунок 7.1 – Вывод сообщения с помощью двух функций


Программа состоит из двух функций: printMessage() и main(). Выполнение
программы всегда начинается с функции main(), которую называют еще главной.
Внутри функции main() происходит вызов функции printMessage() без
параметров. Когда происходит вызов функции, выполнение программы
передается непосредственно вызванной функции. Внутри функции printMessage()
выполняется только утверждение
printf("\n\t hello, world\n");
Несмотря на то, что в функции printMessage() есть еще одно утверждение
printf("\n\t 123\n"), которое не выполняется, поскольку используется утверждение
возврата (return) из функции.
В языке С функция введена как один из производных типов.
Формальные параметры в определениях функций могут объявляться в
форме прототипа. Прототипы дают компилятору возможность тщательнее
выполнять проверку типов аргументов. Если используются прототипы, то
компилятор может обнаружить любые сомнительные преобразования типов
аргументов, необходимые при вызове функции, если тип ее параметров отличается
от типов аргументов. Компилятор также обнаружит различия в количестве
аргументов, использованных при вызове функции, и в количестве параметров
функции.
В общем случае прототип функции должен выглядеть таким образом:
Тип имя_функции(тип имя_парам1, тип имя_парам2,...,
тип им_парамN);
В приведенной выше программе прототип функции printMessage() не
использовался, так как сама функция была объявлена до главной функции main().
Для переносимости С-кода в С++ использование прототипа функции обязательно.

286
Поэтому к хорошему стилю программирования от носится использование
прототипов функций, поскольку большие программы обычно состоят из
нескольких функций, часто расположенных в различных файлах.
Вышеприведенная программа с использованием прототипа функции
printMessage() будет выглядеть следующим образом:
#include <stdio.h>
#include <conio.h>
//void printMessage (void);//Прототип функции
int main(void)
{
void printMessage (void); //Прототип функции
printMessage(); // Вызов функции
printf("\n Press any key: ");
_getch(); return 0;
}
// Определение функции
void printMessage (void)
{
printf("\n\t hello,
world\n");
return; printf("\n\t 123\n");
}

В листинге программы показаны две возможности использования прототипа


функции printMessage(). При этом, сама функция printMessage() объявлена после
функции main().
Формальные параметры функции определены в прототипе функции. При
обращении к функции используются фактические параметры, называемые
аргументами функции.
Список фактических параметров – это список выражений, количество
которых равно количеству формальных параметров функции (исключение
составляют функции с переменным числом параметров). Соответствие между
формальными и фактическими параметрами устанавливается по их взаимному
287
расположению в списках. Между формальными и фактическими параметрами
должно быть соответствие по типам.
Синтаксис языка С++ предусматривает только один способ передачи
параметров
– передачу по значениям. Это означает, что формальные параметры
функции локализованы в ней, т. е. недоступны вне определения функции и никакие
операции над формальными параметрами в теле функции не изменяют значений
фактических параметров.
Передача параметров по значению предусматривает следующие шаги:
1. При компиляции функции выделяются участки памяти для формальных
параметров, т. е. формальные параметры оказываются внутренними объектами
функции. При этом для параметров типа float формируются объекты типа double, а
для параметров типов char и short int создаются объекты типа int. Если
параметром является массив, то формируется указатель на начало этого
массива, и он служит представлением массива-параметра в теле функции.
2. Вычисляются значения выражений, использованных в качестве
фактических параметров при вызове функции.
3. Значения выражений – фактических параметров заносятся в участки
памяти, выделенные для формальных параметров функции.
4. В теле функции выполняется обработка с использованием значений
внутренних объектов-параметров, и результат передается в точку вызова функции
как возвращаемое ею значение.
5. Никакого влияния на фактические параметры (на их значения) функция
не оказывает.
6. После выхода из функции освобождается память, выделенная для ее
формальных параметров.
Важным является момент, что объект вызывающей программы,
использованный в качестве фактического параметра, не может быть изменен из
тела функции. Для подобного изменения существует косвенная возможность
изменять значения объектов вызывающей программы действиями в вызванной
функции. Это становится возможным с помощью указателя (указателей), когда в
вызываемую функцию передается адрес любого объекта из вызывающей
программы. С помощью выполняемой в тексте функции разыменования
указателя осуществляется доступ к адресуемому указателем объекту из
вызывающей программы. Тем самым, не изменяя самого параметра (указатель-
288
параметр постоянно содержит только адрес одного и того объекта), можно изменять
объект вызывающей программы.
Массивы и строки также могут быть параметрами функции. В этом случае
внутрь функции передается только адрес начала массива. Тогда можно в качестве
параметра использовать указатель. Приведем два равноправных прототипа
функций:
float fun(int n, float A[ ], float B[ ]); float fun(int
n, float *a, float *b);
Поскольку массив передается в функцию как указатель, внутри функции
можно изменять значения элементов массива – фактического параметра,
определенного в вызывающей программе. Это возможно и при использовании
индексирования, и при разыменовании указателей на элементы массива.
В языке С существует возможность создавать функции, число аргументов
которых не определено – функции с переменным числом аргументов. При этом
следует указать только количество аргументов. Пример прототипа функции с
переменным числом аргументов:
int fun(int n, ј);
Многоточие (ј) в прототипе функции означает, что функция получает
переменное число аргументов любого типа. Многоточие должно всегда находиться
в конце списка параметров.
Макросы и определения заголовочного файла переменных аргументов stdarg.h
(табл. 7.1) предоставляют программисту средства, необходимые для построения
функций со списком аргументов переменной длины.
Таблица 7.1 – Макросы заголовочного файла stdarg.h
Идентификатор Объяснение
va_list Тип, предназначающийся для хранения информации,
необходимой макросам v_start, va_arg и va_end.
Чтобы получить доступ к аргументам в списке
переменной длины, необходимо объявить объект типа
va_list
va_start Макрос, который вызывается перед обращением к
аргументам списка переменной длины. Он
инициализирует объект, объявленный с помощью
va_list, для использования макросами va_arg и va_end

289
va_arg Макрос, расширяющийся до выражения со значением
и типом следующего аргумента в списке
переменной длины. Каждый вызов его изменяет
объект, объявленный с помощью va_list так, что
объект указывает на следующий аргумент списка

va_end Макрос обеспечивает нормальный возврат из


функции, на список аргументов которой ссылается
макрос va_start

Примеры обращений к функции с фактическими аргументами:


double k;
double v1 = 1.5,
v2 = 2.5,
v3 = 3.5;
// Первый вариант, где 3 – количество аргументов
k = fun(3,v1, v2, v3);
// Второй вариант, где 0.0 – завершающий нуль списка
аргументов
k = fun(v1, v2, v3, 0.0);
Указатели, передаваемые в функцию, могут быть указателями на
указатели. Указатели могут указывать на начало какого-либо массива и т. д.
Указатели могут использоваться для защиты массивов, над которыми необходимо
произвести некоторые вычисления или преобразования.
Особым свойством указателей можно считать возможность использовать их
в качестве возвращаемых значений функций. Поскольку функции возвращают
только одно значение, то несколько значений одного типа можно поместить в
массив, а затем указатель на этот массив использовать в качестве возвращаемого
значения.
Общая форма определения функции, которая возвращает указатель,
следующая:
тип *имя_функции ( аргументы функции )
{
// тело функции
тип *имя_указателя;
290
?
return имя_указателя;
}
Рассмотрим пример, в котором осуществляется сложение двух одномерных
массивов и результат возвращается через указатель.
Программный код решения примера:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
int *out2(int A[], int B[], int);
int main (void) {
int i, n;
int A[] = {1,2,3,4,5};
int B[] = {2,2,2,2,2};
int *ptrAB = NULL;
n = (sizeof(A)/sizeof(A[0]));
puts("\n The initial arrays: ");
for (i = 0; i < n; i++)
printf(" %d", A[i]);
ptrAB = out2(A, B, n);
puts("");
for (i = 0; i < n; i++)
printf(" %d", B[i]);
ptrAB = out2(A, B, n);
puts("\n\n Result from function: ");
for (i = 0; i < n; i++)
printf(" %d", ptrAB[i]);
puts("\n\n Control of the arrays: ");
for (i = 0; i < n; i++)
printf(" %d", A[i]);
puts("");

291
for (i = 0; i < n; i++)
printf(" %d", B[i]);
free(ptrAB); // освобождение выделенной памяти
printf("\n\n ... Press any key: ");
_getch();
return 0;
}
int *out2(int A[], int B[], int n)
{
int i;
int *ptr = (int *)calloc(n, sizeof(int)); //выделение
памяти
for (i = 0; i < n; i++)
ptr[i] = A[i] + B[i];
return ptr;
}
Программа не требует особых пояснений.
Следует отметить, что никогда не следует возвращать адрес переменной,
определенной в теле функции, так как переменные функции являются
локальными, и они существуют только во время работы функции.
Указатели возвращаются подобно значениям любых других типов данных.
Чтобы вернуть указатель, функция должна объявить его тип в качестве типа
возвращаемого значения. Таким образом, если функция возвращает указатель,
то значение, используемое в ее инструкции return, также должно быть
указателем. В частности, многие библиотечные функции, предназначенные для
обработки строк, возвращают указатели на символы.
В языке С++ существует такой механизм как указатель на функцию.
Допустим, существует несколько функций для различных операций с данными.
В этом случае оказывается удобным определить указатель на функцию, и
использовать его там, где требуется производить расчет для различных функций.
Указатель на функцию – это переменная, содержащая адрес в памяти, по
которому расположена функция. Имя функции – это адрес начала программного
кода функции. Указатели на функции могут быть переданы функциям в качестве

292
аргументов, могут возвращаться функциями, сохраняться в массивах и
присваиваться другим указателям на функции.
Типичное определение указателя на функцию следующее:
тип_возвращаемый_функцией(*имя_указателя_на_функцию)(аргумен
ты);
В приведенном объявлении используются круглые скобки, в которых
собственно и определяется указатель на функцию, которая возвращает тот или
иной тип – тип_возвращаемый_функцией. Хотя знак * обозначает префиксную
операцию, он имеет более низкий приоритет, чем функциональные круглые
функции, поэтому для правильного комбинирования частей объявления
необходимы еще и дополнительные скобки. При этом аргументы – это аргументы
той или иной функции с заданным типом возвращаемого значения, и на которую
ссылается указатель *имя_указателя_на_функцию. Очевидно, что возможны
сложные объявления функций.
Указатели на функции часто используются в системах, управляемых меню.
Пользователь выбирает команду меню (одну из нескольких). Каждая команда
обслуживается своей функцией. Указатели на каждую функцию находятся в
массиве указателей. Выбор пользователя служит индексом, по которому из массива
выбирается указатель на нужную функцию.
Другим типичным применением указателей на функции являются
реализация обобщенных алгоритмов, например, алгоритмов сортировки и
поиска. В этом случае критерии сортировки и поиска реализуются в виде
отдельных функций и передаются при помощи указателей на функции в качестве
параметра реализации основного алгоритма.

7.2 Практическая часть


Пример 1. Напишите программу сортировки по возрастанию заданного
массива случайных чисел, равномерно распределенных в интервале [–6;
6], с помощью вспомогательной функции.
Программный код решения примера:
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 10
void sort(double arr[], int n);

293
int main(void) {
double M[MAX];
int i, size = MAX;
long int L;
unsigned int some;
L = (long)time(NULL);
srand((unsigned)L);
for (i = 0; i < MAX; ++i)
M[i] = 12.0*rand() / RAND_MAX - 6.0;
printf("\n\t The original array:\n");
for (i = 0; i < MAX; ++i)
printf("\t%8.4f\n", M[i]);
sort(M, size);
printf("\n\t After sorting: \n");
for (i = 0; i < MAX; ++i) printf("\t%8.4f\n", M[i]);
printf("\n Press any key: ");
_getch();
return 0;
}
void sort(double Array[], int m) {
int i, j;
double tmp;
for (i = 0; i < m - 1; ++i)
for (j = 0; j < m - i - 1; ++j)
if (Array[j + 1] < Array[j]) {
tmp = Array[j];
Array[j] = Array[j + 1];
Array[j + 1] = tmp;
}
}
Следует обратить внимание на имена формальных параметров в самой
функции sort() и в ее прототипе: они имеют разные имена, но одинаковые
типы. Фактические параметры или аргументы функции sort() в вызывающей
программе (в теле функции main()) имеют свои имена, не связанные с именами
формальных параметров.
Заполнение массива случайными числами производится с помощью
библиотечной функции rand() и макроопределения RAND_MAX. Для
рандомизации массива случайных чисел при каждом новом запуске програм- мы
используется библиотечная функция srand(), аргументом которой является
системное время, формируемое библиотечной функцией time().
Возможный результат выполнения программы показан на рис. 7.2.

294
Рисунок 7.2 – Пример сортировки числового массива

Пример 2.
Ранее было отмечено, что в языке С++ аргументы передаются в функции по
значению и не существует прямого способа изменить переменную вызывающей
функции, действуя внутри вызываемой функции. Благодаря аргументам-
указателям функция может обращаться к объектам в вызвавшей ее функции, в
том числе модифицировать их. В качестве примера рассмотрим функцию swap(), в
задачу которой входит обмен элементов местами. Для решения такой задачи
необходимо передать из вызывающей программы (например, из главной функции
main()) в функцию указатели на переменные, которые нужно изменить.
Программный код решения примера:
#include <stdio.h>
#include <conio.h>
void swap(int*, int*);
int main(void) {
int a = 10,
b = -20;
printf("\n Initial values:\n a = %d, b = %d\n", a, b);
swap(&a, &b);
printf("\n New values:\n a = %d, b = %d\n", a, b);
printf("\n ... Press any key: ");
_getch();
return 0;
}
void swap(int *pa, int *pb)
{
int temp;
295
temp = *pa;
*pa = *pb;
*pb = temp;
}

В программе в качестве фактических параметров функции swap()


выступают адреса заданных переменных. Можно было в главной функции
определить указатели и инициализировать их адресами заданных переменных, а
потом передать эти указатели в функцию swap.
Результат выполнения программы показан нa рис. 7.3.

Рисунок 7.3 – Результат обмена данными, выполненного функцией swap()

Пример 3. Напишите программу с функцией пузырьковой сортировки,


использующей вызов по ссылке.
В условии примера «вызов по ссылке» означает, что в качестве
фактических параметров функций будут использоваться адреса переменных. И в
этом случае прототип таких функций будет содержать указатели на
соответствующие типы.
Программный код решения примера:
#include<stdio.h>
#include<conio.h>

//Прототип функции
void bsort(int* const, const int);

int main(void)
{

int A[] = { 56, 34, 2, 0, 1, -21, 6, 8, 7 };


int i, n;

//Размерность массива
296
n = sizeof(A) / sizeof(A[0]);
puts("\n Data items in original order:");
for (i = 0; i < n; i++)
printf("%3d", A[i]);
//Вызов функции - bsort()
bsort(A, n);
puts("\n\n Data items in ascending order:");
for (i = 0; i < n; i++)
printf("%3d", A[i]);
printf("\n\n ... Press any key: ");
_getch();
return 0;
}
//Определение функции
void swap(int *pa, int *pb)
{
int temp;
temp = *pa;
*pa = *pb;
*pb = temp;
}
void bsort(int *const arr, const int size)
{
int pass, //Счётчик проходов
j; // счетчик сравнений
//Протип функции обмена - swap()
void swap(int*, int*);
for (pass = 0; pass < size - 1; pass++)
{
for (j = 0; j < size - 1; j++)
{
if (arr[j] > arr[j + 1])
{
swap(&arr[j], &arr[j + 1]);
}
}
}
}

В программе функция сортировки bsort() в качестве формального параметра


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

Рисунок 7.4 – Пример сортировки массива методом пузырька

Пример 4 . Напишите программу построения на экране дисплея


графика следующей функции:
y sin(3x)e х/3
Предусмотрите возможность записи в текстовый файл графика данной
функции.
Для решения примера используем средства вывода на печать
форматированных данных без применения специальных графических библиотек.
Результат выполнения программы на рис. 7.5. Программный код решения
примера:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<math.h>
#define SCREENW 79
#define SCREENH 25
void plot(FILE *fout, double a, double b, double(*f)(double))
{
char screen[SCREENW][SCREENH];
double x, y[SCREENW];
double ymin = 0, ymax = 0;
double hx, hy;
int i, j;
int xz, yz;
hx = (b - a) / (SCREENW - 1);
for (i = 0, x = a; i < SCREENW; ++i, x += hx) {
y[i] = f(x);
if (y[i] < ymin) ymin = y[i];
if (y[i] > ymax) ymax = y[i];
}
hy = (ymax - ymin) / (SCREENH - 1);
yz = (int)floor(ymax / hy + 0.5);
xz = (int)floor(-a / hx + 0.5);
for (j = 0; j < SCREENH; ++j) {
298
for (i = 0; i < SCREENW; ++i) {
if (j == yz && i == xz)
screen[i][j] = '+';
else if (j == yz)
screen[i][j] = '-';
else if (i == xz)
screen[i][j] = '|';
else
screen[i][j] = ' ';
}
}
for (i = 0; i < SCREENW; ++i) {
j = (int)floor((ymax - y[i]) / hy + 0.5);
screen[i][j] = '.';
}
for (j = 0; j < SCREENH; ++j) {
for (i = 0; i < SCREENW; ++i)
fputc(screen[i][j], fout);
fprintf(fout, "\n");
}
}
double f(double x)
{
return sin(3.0*x)*exp(-x / 3.0);
}
int main(void)
{
plot(stdout, 0.0, 10.0, f);
printf("\n\n ... Press any key: ");
_getch();
return 0;
}

В программе используется указатель на файл, который может быть


стандартным потоком, т. е. экран дисплея. В главной функции main() происходит
обращение к функции рисования графика plot(), в которую вводят фактические
параметры, в частности файл – это stdout, т. е. стандартный поток, 0.0 – это
левая граница оси абсцисс, 10.0 – правая граница оси абсцисс, f – имя функции с
описанием зависимости y = f(x).
Пример выполнения программы показан на рис. 7.5.

299
Рисунок 7.5 – Пример построения графика функции на консоли

Оборудование и материалы
1. Персональный компьютер;
2. Операционная система семейства Microsoft Windows;
3. Среда программирования Microsoft Visual Studio.

Указания по технике безопасности


1. Не входить в помещение, где находится вычислительная техника без
разрешения преподавателя.
2. Не работать в верхней одежде.
3. Не включать без разрешения оборудование.
4. При несчастном случае, или поломке оборудования позвать
преподавателя. Знать где находится рубильник (выключатель) выключения
электропитания оборудования.
5. Не трогать провода и разъемы (возможно поражение электрическим
током).
300
6. Не допускать порчи оборудования.

Задания
Согласно своему варианту (таблица 7.2) создать программу для
построения графика функции.

Таблица 7.2 – Индивидуальное задание

301
Содержание отчета
1. Работа предъявляется на экране компьютера в виде исходного кода и в виде
отчета, содержащего: ФИО студента, шифр группы, номер и тему лабораторной
работы, полный код программы на языке программирования С++.
2. Отчет выполняется на компьютере и распечатывается на листах бумаги
формата А4.
3. Каждая работа должна быть защищена.

Контрольные вопросы
1. Каким образом можно вернуть из функции несколько значений?

302
2. Каким образом определяется тип функции?
3. Как выглядит описание функции, которая возвращает указатель на
заданный тип, например, char?
4. В каком месте программы можно определить указатель на функцию?
5. Имеет ли указатель на функцию прототип и определение?
6. Как осуществляется вызов функции с помощью указателя?
7. Как взаимосвязаны между собой объявление функции, ее определение
и вызов функции?

Список литературы, рекомендуемый к использованию по данной


теме
1. Павловская, Т. А. С/С++: программирование на языке высокого
уровня : учебник для вузов/ Т. А. Павловская. – СПб. : Питер, 2010. – 461 с. –
(Учебник для вузов). – Библиогр.: с. 383. –Прил.: с.384-449. –ISBN 978-5-
94723-568-5.
2. Крылов, Е. В. Техника разработки программ : учебник : в 2 кн. / Е. В.
Крылов, В. А. Острейковский, Н. Г. Типикин, Кн. 1, Программирование на
языке высокого уровня. – Москва : Высшая школа, 2007. – 375 с. – (Для
высших учебных заведений) (Информатика и вычислительная техника). –
Библиогр.: с. 333-348. – Прил. с. 349-375. – ISBN 978-5-06-005524-5.
3. Ашарина И. В. Основы программирования на языках С и С++. – М.:
Горячая линия – Телеком, 2002. –207 с.: ил.
4. Кнут Д. Искусство программирования. Доступно:
http://lib.ru/CTOTOR/KNUT/
5. Ресурс по программированию. Доступно: http://physics-for-
students.ru/bookpc/informatika/slovar.zip
6. Языки программирования. Доступно: http://cppstudio.com/

ЛАБОРАТОРНАЯ РАБОТА 8
Файловый ввод и вывод в языке С++

303
Цель работы: научится создавать программы на языке С++ используя
данные текстовых файлов.

Формируемые компетенции:
(ОПК-2) - способностью решать стандартные задачи профессиональной
деятельности на основе информационной и библиографической культуры с
применением инфокоммуникационных технологий и с учетом основных
требований информационной безопасности;
(ОПК-3) - способностью владеть основными методами, способами и
средствами получения, хранения, переработки информации;
(ОПК-4) - способностью иметь навыки самостоятельной работы на
компьютере и в компьютерных сетях; осуществлять компьютерное
моделирование устройств, систем и процессов с использованием
универсальных пакетов прикладных компьютерных программ.

8.1 Теоретическая часть


Файл – это именованный объект, хранящий данные (программа или любая
другая информация) на каком-либо носителе (дискета, винчестер, CD).
В языке С++ файлом может быть все что угодно, начиная с дискового файла
и заканчивая терминалом или принтером. Поток связывают с определенным
файлом, выполняя операцию открытия. Как только файл открыт, можно
проводить обмен информацией между ним и программой.
Не у всех файлов одинаковые возможности. Например, к дисковому файлу
прямой доступ возможен, в то время как к некоторым принтерам – нет. В языке
С++ все потоки одинаковы, а файлы – нет.
Если файл может поддерживать запросы на местоположение (указатель
текущей позиции), то при открытии такого файла указатель текущей позиции в
файле устанавливается в начало. При чтении из файла (или записи в него)
каждого символа указатель текущей позиции увеличивается, обеспечивая тем
самым продвижение по файлу.
Файл отсоединяется от определенного потока (т. е. разрывается связь
между файлом и потоком) с помощью операции закрытия. При закрытии файла,
304
открытого с целью вывода, содержимое (если оно есть) связанного с ним потока
записывается на внешнее устройство. Этот процесс, который обычно называют
дозаписью потока, гарантирует, что никакая информация случайно не останется
в буфере диска. Если программа завершает работу нормально, т. е. либо
функция main() возвращает управление операционной системе, либо вызывается
функция exit(), то все файлы закрываются автоматически. В случае аварийного
завершения программы, например, в случае краха или завершения путем вызова
функции abort(), файлы не закрываются.
Файловая системы языка С++ предназначена для работы с самыми
разнообразными устройствами, в том числе терминалами, дисками и накопителями
на магнитной ленте. Даже если какое-то устройство сильно отличается от других,
буферизованная файловая система все равно представит его в виде логического
устройства, которое называется потоком. Потоки бывают двух видов: текстовые
и двоичные.
Текстовый поток – это последовательность символов. В стандарте С++
считается, что текстовый поток организован в виде строк, каждая из которых
заканчивается символом новой строки. Однако в конце последней строки этот
символ не является обязательным. В текстовом потоке по требованию базовой
среды могут происходить определенные преобразования символов. Например,
символ новой строки может быть заменен парой символов – возврата каретки
(например, \r) и перевода строки (например, \n), т. е. \r\n.
Двоичные потоки – это последовательность байтов, которая взаимно
однозначно соответствует байтам на внешнем устройстве, причем никакого
преобразования символов не происходит. Кроме того, количество тех байтов,
которые пишутся (читаются), и тех, которые хранятся на внешнем устройстве,
одинаково. Однако в конце двоичного потока может добавляться определяемое
приложением количество нулевых байтов. Такие нулевые байты, например, могут
использоваться для заполнения свободного места в блоке памяти незначащей
информацией, чтобы она в точности заполнила сектор на диске.
Файловая система языка С++ состоит из нескольких взаимосвязанных
функций.
Самые распространенные из них показаны в табл. 8.1.

Таблица 8.1 – Функции файловой системы языка С

305
№ п/п Имя функции Что делает
1 fopen() Открывает файл
2 fclose() Закрывает файл
3 putc() Записывает символ в файл
4 fputc() То же, что и putc()
5 getc() Читает символ из файла
6 fgetc() То же, что и getc()
7 fgets() Читает строку из файла
8 fputs() Записывает строку в файл
9 fseek() Устанавливает указатель текущей позиции на
определенный байт файла
10 ftell() Возвращает текущее значение указателя текущей
позиции в файле
11 fprintf() Для файла то же, что printf() для консоли
12 fscanf() Для файла то же, что scanf() для консоли
13 feof() Возвращает значение true (истина), если достигнут
конец файла
14 ferror() Возвращает значение true (истина), если произошла
ошибка
15 rewind() Устанавливает указатель текущей позиции в начало
файла
16 remove() Стирает файл
17 fflush() Дозапись потока в файл

Для приведенных функций требуется подключить заголовок <stdio.h>.


Запись или чтение из файла осуществляются с помощью указателя файла.
Указатель файла – это указатель на структуру типа FILE. Для объявления
переменной–указателя файла, например, *fp, используется следующий оператор:
FILE *fp;
Ключевое слово FILE определяет собой своеобразный тип данных, а указатель
*fp указывает на этот тип.
Указатель файла указывает на структуру, содержащую различные сведения
о файле, его имя, статус и указатель текущей позиции в начало файла.
Открытие файла осуществляется с помощью функции fopen(), которая
открывает поток и связывает с этим потоком определенный файл.
Прототип функции fopen() такой:
FILE *fopen(const char *file_name, const char *mode);
В прототипе функции fopen() формальные переменные имеют следующий
смысл:

306
file_name – это имя файла с заданным расширением и возможным путем
расположения, mode – режим работы файла: чтение, запись и т. д.
В табл. 8.2 приводятся допустимые значения режима для функции fopen().

Таблица 8.2 – Допустимые значения режима функции fopen()


№ Режим Что означает
п/п
1 r Открыть текстовый файл для чтения
2 w Создать текстовый файл для записи
3 a Добавить в конец текстового файла
4 rb Открыть двоичный файл для чтения
5 wb Создать двоичный файл для записи
6 ab Добавить в конец двоичного файла
7 r+ Открыть текстовый файл для чтения/записи
8 w+ Создать текстовый файл для чтения/записи
9 a+ Добавить в конец текстового файла или создать
текстовый файл для чтения/записи
10 r+b Открыть двоичный файл для чтения/записи
11 w+b Создать двоичный файл для чтения/записи
12 a+b Добавить в конец двоичного файла или создать
двоичный файл для чтения/записи

Например, для записи в файл с именем (и расширением) data.txt на диск D


следует использовать такие объявление и операции:
FILE *fp;
fp = fopen("D: \\data.txt", "w");
fprintf(fp, "\n\t hello, world\n");
fclose(fp);
В приведенном фрагменте С++ – кода функция fclose() закрывает поток,
который был открыт с помощью вызова функции fopen(). Функция fprintf()
осуществляет форматную запись (в данном случае строку hello, world) в файл.
Все манипуляции с файлом происходят между функциями fopen() и fclose(). Режим
функции fopen() задается строкой "w", которая обеспечивает создание текстового
файла для записи. Это означает, что файл data.txt создается на диске D и в него
записывается строка hello, world с отступом от верхнего края и с отступом
(табуляцией) от левого края.
Прототип функции fclose() следующий:
int fclose(FILE *fp);
307
В приведенной записи *fp – указатель файла, возвращенный в результате
вызова функции fopen(). Возвращение нуля означает успешную операцию
закрытия. В случае же ошибки возвращается EOF. Обычно отказ при
выполнении функции fclose() происходит только тогда, когда диск был
преждевременно удален из дисковода или на диске не осталось свободного места.
Правомочность открытия файла с помощью функции fopen() обычно
подтверждается после проверки какой-либо ошибки, например, когда на диске нет
места для записи или неправильного имени диска, причем эти ошибки будут
обнаружены до того, как программа попытается в этот файл что-либо записать.
Поэтому приведенный фрагмент С++ – кода будет правильным, если
производится проверка возможности открытия файла:
FILE *fp;
if ((fp = fopen("D:\\data.txt", "w")) == NULL)
{
//exit(1);
printf("\n\t Error! Can not open file\n ");
printf("\n Press any key: ");
_getch(); return 0; }
fprintf(fp, "\n\t hello, world\n");
fclose(fp);
При выполнении условия проверки можно выходить при нажатии любой
клавиши с заданным сообщением или немедленный выход сделать с помощью
функции exit(), которая в данном фрагменте С++ – кода закомментирована.
Функции для работы с текстовыми файлами удобно использовать при
создании текстовых файлов, ведении файлов-протоколов и т. п. Но при создании
баз данных целесообразно использовать функции для работы с бинарными
файлами: fwrite() и fread(). Эти функции без каких-либо изменений копируют
выделенный блок данных из оперативной памяти в файл и, соответственно, из
файла – в память.
При записи или чтении суффикс «t» открывает файл в текстовом режиме. В
этом режиме символ CTRL+Z (символ с кодом 26) обрабатывается как символ
конца файла. Кроме того, комбинации символов перевода строки и возврата
каретки преобразуются в единственный символ перевода строки ('\n') при вводе, и

308
символы перевода строки преобразуются в комбинации символов перевода строки
и возврата каретки при выводе.
Суффикс «b» открывает файл в бинарном режиме, преобразования
символов перевода строки и возврата каретки не производятся.
FILE *fp;
if ((fp = fopen("D:\\data.txt", "w")) == NULL)
{
//exit(1);
printf("\n\t Error! Can not open file\n ");
printf("\n Press any key: ");
_getch(); return -1; }
fprintf(fp, "\n\t hello, world\n");
fclose(fp);

8.2 Практическая часть


Пример 1. Напишите программу заполнения матрицы размера n х m
нечетными целыми числами с выводом результата на консоль и в
текстовый файл. Размеры матрицы и начальное нечетное число задаются
пользователем с клавиатуры.
Программный код решения примера:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
int main(void) {
int i, j, x, xi, n, m, *matr;
FILE *fid;
char str[] = "D:\\data.txt"; // месторасположение файла
if ((fid = fopen(str, "w")) == NULL) {
printf("\n\t The file could not be opened.\n ");
printf("\n Press any key: ");
getch(); return 0;
}
309
printf("\n\t Enter the number of lines: "); scanf_s("%d", &n);
printf("\t Enter the number of columns: "); scanf_s("%d", &m);
printf("\t Enter the odd number: "); scanf_s("%d", &x);
xi = x;
matr = (int *)calloc(n*m, sizeof(int));
// Заполнение матрицы целыми числами
for (i = 0; i < n; ++i)
for (j = 0; j < m; ++j)
{
matr[i*m + j] = x; x += 2;
}
printf("\n\t Matrix (%d x %d) , initial number: %d\n", n, m, xi);
fprintf(fid, "\r\n\t Matrix (%d x %d) , initial number: %d\r\n",
n, m, xi);
for (i = 0; i < n; ++i) {
printf("\n "); fprintf(fid, "\r\n ");
for (j = 0; j < m; ++j) {
printf("%5d", matr[i*m + j]);
fprintf(fid, "%5d", matr[i*m + j]);
}
}
fclose(fid);
printf("\n\n Result of record look in file %s\n", str);
printf("\n Press any key: ");
_getch();
return 0;
}

В программу включена препроцессорная директива #define... для устранения


предупреждения о ненадежной работе функции fopen() в Visual Studio 2008.
Возможный результат выполнения программы показан на рис. 8.1.

310
Рисунок 8.1 – Заполнение матрицы нечетными числами

Текстовый файл с заполненной матрицей показан на рис. 8.2.

Рисунок 8.2 – Матрица нечетных чисел в текстовом файле

Примечание. В текстовом файле следует использовать моноширинный


(равноширинный) шрифт, например, Courier New.

Пример 2. Напишите программу форматированной записи в текстовый


файл трех строк различной длины и одномерного целочисленного массива.
Произведите чтение из текстового файла с выводом его содержания на
консоль и преобразования одномерного массива в двухмерный.
Для решения примера используем функции fprintf(), fgets(), atoi(),
fscanf().
Программный код решения примера:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
311
#include<conio.h>
#include<stdlib.h>

#define n 4 // Число строк матрицы


#define m 3 // Число столбцов матрицы
#define N 123 // Число считываемых строк из текстового файла

int main(void) {
int i, j = 0;
int A[n*m] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
int B[n*m];
FILE *fid;
char *str[] = { "aza","baza","qwerty" };
char str2[N][80]; // Буферный массив

// Обнуление массива B[n*m]


for (i = 0; i < n*m; ++i) B[i] = 0;
if ((fid = fopen("D:\\data2.txt", "w")) == NULL)
{
printf("\n\t The file could not be opened.\n ");
printf("\n Press any key: "); _getch(); return 0;
}

// Запись в файл data2.txt


fprintf(fid, "\n\t The lines are:\n");
for (i = 0; i < m; ++i) fprintf(fid, "\t %s\n", str[i]);
for (i = 0; i < n*m; ++i)
fprintf(fid, " %3d", A[i]);
fclose(fid);
printf("\n\t From file \"data2.txt\":\n");
if ((fid = fopen("D:\\data2.txt", "r")) == NULL)
{
printf("\n\t The file could not be opened.\n ");
printf("\n Press any key: "); _getch(); return 0;
}
312
// Чтение из файла data2.txt
for (i = 0; (fgets(str2[i], 80, fid) != NULL) && (i < N); ++i)
printf("%s", str2[i]);
fclose(fid);

if ((fid = fopen("D:\\data2.txt", "r")) == NULL)


{
printf("\n\t Error! You can not open the file \n ");
printf("\n Press any key: "); _getch(); return 0;
}
// Повторное чтение из файла data2.txt
for (i = 0; fscanf(fid, "%s", str2[i]) != EOF; ++i)
if (atoi(str2[i]))
{
B[j] = atoi(str2[i]); ++j;
}

fclose(fid);

printf("\n\n\t The reconfigured array:\n");


for (i = 0; i < n; ++i) {
printf("\n\t");
for (j = 0; j < m; ++j)
printf("%5d", B[i*m + j]);
}

printf("\n\n Press any key: ");


_getch();
return 0;
}
Для форматированной записи в текстовый файл и чтения из файла
применены массивы указателей *str[], str2[123][80]. Чтение из файла одномерного
массива целых чисел выполняется с помощью функции atoi(), значения целых чисел
заносятся сначала в одномерный массив B[n*m]. После закрытия файла data2.txt
313
одномерный массив B[n*m] выводится на консоль в виде двухмерной матрицы
размера 4 х 3. Форматированная запись строк и одномерного массива в файл
data2.txt производится с помощью функции fprintf(). Первое чтение информации
из текстового файла производится с помощью функции fgets(), что позволяет
практически точно копировать расположение строк текстового файла на консоль
(дисплей). Функция fscanf() используется для форматированного чтения
информации из текста с последующим выделением целых чисел с помощью
функции atoi().
Возможный результат выполнения программы показан на рис. 8.3.

Рисунок 8.3 – Содержимое текстового файла и преобразованного массива

Пример 3. Напишите программу добавления слов в текстовый файл с


контролем на консоли.
В текстовый файл запишем название книги и авторов. После будем
добавлять слова, символы и т. д.
Для программного решения примера используем функции файлового
ввода/вывода fprintf(), fgets() и rewind(). Кроме того, подключим библиотеку locale.h
и объявим прототип функции, что позволит использовать шрифты русского
алфавита:
#include <locale.h>
setlocale( LC_ALL, "Russian");
или

314
setlocale( LC_ALL, ".1251"); //кодовая страница Windows–1251.
Программный код решения примера:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#define MAX 40

int main(void) {
FILE *fid;
char words[MAX + 1];
char str_name[] = "D:\\data3.txt";
// Прототип функции поддержки русских шрифтов
setlocale(LC_ALL, "Russian");
if ((fid = fopen(str_name, "a+")) == NULL)
{
fprintf(stdout, "\n\t Файл не может быть открыт \"%s\".\n ",
str_name);
printf("\n Нажмите любую клавишу:");
_getch(); return -1;
}
printf("\n\t Введите слова для включения их в файл \"%s\"\n\t\ и
нажмите клавишу Enter в начале строки для завершения ввода\n\t:",
str_name);

// Запись в файл data3.txt


while (gets_s(words, MAX) != NULL && words[0] != '\0')
{
printf("\t: "); fprintf(fid, " %s\n", words);
}
puts("\t Содержимое файла:");
// Устанавливает указатель текущей позиции в начало файла
rewind(fid);
// Сканирование файла
while (fgets(words, MAX, fid) != '\0')
315
printf("\t%s", words);
if (fclose(fid) != 0)
fprintf(stderr, "\n\t Ошибка при закрытии файла \"%s\"\n",
str_name);
printf("\n\n Нажмите любую клавишу (Press any key): ");
_getch();
return 0;
}

В программе введены две проверки: на открытие файла if (... == NULL) и на


закрытие файла if (... != 0). Эти проверки позволяют исключить аварийный выход
из программы. Использование в функции форматного вывода fprintf() ключевого
слова stdout позволяет выводить сообщения на консоль – дисплей пользователя.
Вместо стандартной функции gets() использована функция gets_s(), которую
поддерживает MS Visual Studio. При работе в MS Visual Studio с функцией gets()
появляются предупреждения (которыми в общем случае можно пренебречь).
Предупреждения возникают и при работе с функцией fopen(). Вместо нее можно
использовать fopen_s() в следующем формате записи:
fopen_s(&fid, "D:\\data3.txt","a+");
Тогда проверку на открытие файла следует изменить, например:
if (fopen_s(&fid, "D:\\data3.txt","a+"))
{fprintf(stdout, "\n\t Ошибка! Не удается открыть файл
\"data3.txt\".\n ");
printf("\n Нажмите любую клавишу: ");
_getch(); return -1; }
Если файл data3.txt сохранить, то при последующих выполнениях программы в
этот файл будут дописывать данные. Это обеспечивает режим "a+" функции fopen().
Возможный результат выполнения программы показан на рис. 8.4.

316
Рисунок 8.4 – Пример записи в файл и чтения из файла
Примечание. Для данной программы формат записи функции
fscanf():fscanf(fid, "%s", words);

Пример 4. Напишите программу записи в файл нескольких строк и


отображения содержимого файла в обратном порядке, как на консоли, так и
в другом текстовом файле.
Для решения примера используем функции fseek() и ftell(). Программный
код решения примера:
#include <stdio.h>
#include <conio.h>
#define MAX 79
#define file "D:\\data6.txt" // запись в прямом порядке
#define file2 "D:\\data66.txt" // запись в обратном порядке

int main(void) {
char ch, str[MAX + 1];
long n, m;
FILE *fid, *fid2;
if (fopen_s(&fid, file, "w")) {
fprintf(stdout, "\n\t The file could not be opened.\n ");
printf("\nPress any key: ");
_getch(); return 0;
}
printf("\n\t Enter a few lines and press Enter to complete before
the new line\n\t: ");

317
// Запись в файл data6.txt
while (gets_s(str, MAX) != NULL && str[0] != '\0')
{
printf("\t: "); fprintf(fid, " %s\n", str);
}

fclose(fid);

if (fopen_s(&fid, file, "r")) {


fprintf(stdout, "\n\t File could not be opened.\n");
printf("\n Press any key: ");
_getch(); return 0;
}

if (fopen_s(&fid2, file2, "w")) {


fprintf(stdout, "\n\t File could not be opened.\n");
printf("\n Press any key: ");
_getch(); return 0;
}

//Переход в конец файла


fseek(fid, 0L, SEEK_END);
m = ftell(fid);

for (n = 1L; n <= m; n++) {


fseek(fid, -n, SEEK_END);
ch = getc(fid);

if (ch != '\n') {
printf(" "); putchar(ch);
fprintf(fid2, " "); putc(ch, fid2);
}
} // End for

318
putchar('\n');
fclose(fid);
fprintf(fid2, "%c", '\n');
fclose(fid2);
printf("\n Result see the files, \"%s\" and \"%s\"\n", file,
file2);
printf("\n Press any key: ");
_getch();
return 0;}

Функция fseek()имеет следующую форматную запись:


fseek(fid, 0L, SEEK_END);
Она определяет позицию со смещением в 0 байт от конца файла
(именованная константа SEEK_END). Суффикс L означает тип long int.
Строка с функцией ftell() определяет количество байтов от начала до конца
указанного файла. Это количество байтов записывается в переменную m:
m = ftell(fid);
Рассмотрим следующий программный цикл:
for (n = 1L; n <= m; n++)
{ fseek(fid, -n, SEEK_END);
ch = getc(fid);
if (ch != '\n')
{ printf(" "); putchar(ch);
fprintf(fid2, " "); putc(ch, fid2); }
} // End for
Первое выполнение цикла выводит программу на первый символ перед
концом файла. Затем программа печатает этот символ на консоль и записывает в
новый файл с именем data66.txt. Следующая итерация цикла выводит программу на
предпоследний символ файла, который она печатает и записывает в новый файл.
Этот процесс продолжается до тех пор, пока программа не выйдет на первый
символ файла и не распечатает его (и запишет в файл).
Возможные результаты выполнения программы показаны на рис. 8.5 – рис. 8.6.

319
Рисунок 8.5 – Результат обратного считывания информации из файла

Рисунок 8.6 – Результат записи информации в файл в обратном порядке

Пример 5. Создать на С++ таблицу табулирования функции

с использованием оператора While на отрезке [-2; 5] с шагом 0,8.


Результат записать в текстовый файл под именем «data_pr.txt».
Произвести чтение данных из файла «data_pr.txt» и вывод их на консоль.
Окно выполнения программы на рис. 8.7, а результат записи информации
в текстовый файл на рис. 8.8.
Программный код решения примера:
#define _CRT_SECURE_NO_WARNINGS
#define MAX 79
#include <stdio.h>
#include <conio.h>
#define _USE_MATH_DEFINES
#include <math.h>
#include <limits.h>
#include <float.h>
#include <locale.h>
int main(void) {
FILE *fid;
double xn, xk, xh, a, x, y;
int i;
char str_name[] = "D:\\data_pr.txt";
char words[MAX + 1];
320
setlocale(LC_ALL, "Russian");
if ((fid = fopen(str_name, "w")) == NULL)
{
fprintf(stdout, "\n\t (файл не может быть открыт \"%s\".\n",
str_name);
printf("\n Нажмите любую клавишу: ");
_getch(); return 0;
}
printf("\n\t Введите xn = ");
scanf_s("%lf", &xn);
printf("\t Введите Xk = ");
scanf_s("%lf", &xk);
printf("\t Введите Xh = ");
scanf_s("%lf", &xh);
printf("\t Введите a = ");
scanf_s("%lf", &a);
x = xn;
while (x <= xk) {
if (x <= 0) { y = 2 * x + 2; }
else {
if (x <= a) { y = sqrt(x + 3); }
else {
if (x > a) { y = pow(cos(x + 2), 2); }
}
}
fprintf(fid, "\n\t %4.3f\t\t%4.3f\n", x, y);
x = x + xh;
}
fclose(fid);
printf("\n\t Чтение из файла \"data_pr.txt\":\n");
if ((fid = fopen("D:\\data_pr.txt", "r")) == NULL)
{
printf("\n\t Файл не открываетс.\n ");
printf("\n Нажмите любую клавишу: "); _getch(); return 0;
}
puts("\t Содержимое файла:");
rewind(fid);
while (fgets(words, MAX, fid) != '\0')
printf("\t%s", words);
if (fclose(fid) != 0)
fprintf(stderr, "\n\t Ошибка при закрытии файла \"%s\"\n",
str_name);
fclose(fid);
printf("\n Press any key: ");
_getch();

321
return 0;
}

Рисунок 8.7 – Окно работы программы

Рисунок 8.8 – Результат записи информации в текстовый файл

Оборудование и материалы
1. Персональный компьютер;
2. Операционная система семейства Microsoft Windows;
3. Среда программирования Microsoft Visual Studio.
Указания по технике безопасности

322
1. Не входить в помещение, где находится вычислительная техника без
разрешения преподавателя.
2. Не работать в верхней одежде.
3. Не включать без разрешения оборудование.
4. При несчастном случае, или поломке оборудования позвать
преподавателя. Знать где находится рубильник (выключатель) выключения
электропитания оборудования.
5. Не трогать провода и разъемы (возможно поражение электрическим
током).
6. Не допускать порчи оборудования.
Задания
Создать таблицу табулирования функции с использованием оператора
цикла For на отрезке [xn;xk] с шагом xh. Данные взять из таблицы 8.3.
Результат табулирования записать в текстовый файл под именем
«Tablica.txt», а также произвести чтение данных из этого файла и сделать
вывод на экран консоли.

Таблица 8.3 – Индивидуальные задания

323
324
Содержание отчета
1. Работа предъявляется на экране компьютера в виде исходного кода и в виде
отчета, содержащего: ФИО студента, шифр группы, номер и тему лабораторной
работы, полный код программы на языке программирования С++.
2. Отчет выполняется на компьютере и распечатывается на листах бумаги
формата А4.

325
3. Каждая работа должна быть защищена.

Контрольные вопросы
1. Что может быть файлом в языке С++?
2. Какие обязательные операции выполняются при нормальной работе с
файлами? Какие библиотечные функции при этом используются?
3. Как определяется текстовой поток в стандарте языка С++?
4. Как определяется двоичный поток в стандарте языка С++?
5. Что определяет собой указатель файла?
6. С помощью каких функций языка С++ осуществляется форматная
запись в файл и форматное чтение данных из файла?
7. Какая переменная стандартной библиотеки используется для
определения стандартного потока вывода на дисплей?
8. Какая переменная стандартной библиотеки используется для
определения стандартного потока чтения с дисплея?
9. Как в языке С++ кодируется признак конца файла?
10. Как в языке С++ кодируется признак конца строки?
11. Что такое файл произвольного доступа?
12. Как в языке С++ осуществляется пакетная запись данных в файл?
13. Как осуществляется запись бинарной информации в текстовый файл?
14. Как осуществляется чтение бинарной информации из текстового
файла?

Список литературы, рекомендуемый к использованию по данной


теме
1. Павловская, Т. А. С/С++: программирование на языке высокого
уровня : учебник для вузов/ Т. А. Павловская. – СПб. : Питер, 2010. – 461 с. –
(Учебник для вузов). – Библиогр.: с. 383. –Прил.: с.384-449. –ISBN 978-5-
94723-568-5.
2. Крылов, Е. В. Техника разработки программ : учебник : в 2 кн. / Е. В.
Крылов, В. А. Острейковский, Н. Г. Типикин, Кн. 1, Программирование на
326
языке высокого уровня. – Москва : Высшая школа, 2007. – 375 с. – (Для
высших учебных заведений) (Информатика и вычислительная техника). –
Библиогр.: с. 333-348. – Прил. с. 349-375. – ISBN 978-5-06-005524-5.
3. Ашарина И. В. Основы программирования на языках С и С++. – М.:
Горячая линия – Телеком, 2002. –207 с.: ил.
4. Кнут Д. Искусство программирования. Доступно:
http://lib.ru/CTOTOR/KNUT/
5. Ресурс по программированию. Доступно: http://physics-for-
students.ru/bookpc/informatika/slovar.zip
6. Языки программирования. Доступно: http://cppstudio.com/

ЛАБОРАТОРНАЯ РАБОТА 9
Обработка элементов диагоналей квадратных матриц

327
Цель работы: научиться самостоятельно обрабатывать элементы
диагоналей квадратных матриц.

Формируемые компетенции:
(ОПК-2) - способностью решать стандартные задачи профессиональной
деятельности на основе информационной и библиографической культуры с
применением инфокоммуникационных технологий и с учетом основных
требований информационной безопасности;
(ОПК-3) - способностью владеть основными методами, способами и
средствами получения, хранения, переработки информации;
(ОПК-4) - способностью иметь навыки самостоятельной работы на
компьютере и в компьютерных сетях; осуществлять компьютерное
моделирование устройств, систем и процессов с использованием
универсальных пакетов прикладных компьютерных программ.

9.1 Теоретическая часть


Для доступа к элементу массива следует указать имя массива с
последующим числом (индексом), заключенным в квадратные скобки.
Элементы массива можно использовать в любом выражении точно
также как и значение константы или переменной.
Например:
a[0][0]=11.2;
a[1][2]=10.2;
a[3][1]=22.1;
a[4][2]=1.1;
Y = 2*a[0][1] – a[1][0];
Селективная обработка массива – это выделение из массивов
элементов, удовлетворяющих условию, и обработка выделенных
фрагментов. Часто из выделенных фрагментов формируют новый
(рабочий) массив, который далее и обрабатывают.

328
9.1.1 Селективная обработка элементов массива
Наиболее часто встречаются такие условия обработки элементов
массива:

При обработке двумерных массивов возникает необходимость вычисления


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

а для квадратных матриц (M=N) также:

329
Существует множество алгоритмов для сортировки массивов. Ниже
рассмотрены два из них: сортировка выбором и методом пузырька.

9.1.2 Сортировка выбором


Суть этого метода очень проста и может быть описана так:
1. В последовательности из n элементов выбирается наименьший
(наибольший) элемент;
2. Меняется местом с первым;
3. Далее процесс повторяется с оставшимися n-1 элементами, затем с
оставшимися n-2 элементами и т.д., до тех пор пока не останется один самый
большой (маленький) элемент.
Для реализации этого алгоритма необходимо использовать два вложенных
цикла с параметром For. Внешний цикл (по i) предназначен для
последовательного фиксирования элементов массива, внутренний (по j) -
осуществляет поиск минимального (максимального) и его позиции в
неотсортированной части массива. После выхода из внутреннего цикла
следует перестановка элементов. Последний элемент во внешнем цикле не
рассматривается: он сам встанет на свое место.

9.1.3 Сортировкаметодом пузырька


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

330
Вставка элемента в массив - задача обратная предыдущей. Прием
используется тот же - смещение группы элементов на одну позицию. Только
при уплотнении сдвиг производится влево, при вставке - вправо. При вставке
возникает проблема, что делать с последними элементами? Если в
дальнейшей работе с массивом участвуют только заявленные элементы, то
«хвост» придется вытеснить, последние значения при этом будут утрачены.
Иначе, нужно создавать дополнительный массив, размерность которого
будет больше исходного на количество вставленных элементов. Выбор типа
цикла для работы с массивом зависит от конкретного случая.

9.2 Практическая часть


Пример 1. Создать блок-схему к заданию и программу на СИ++ для
нахождения суммы положительных элементов главной диагонали.
(Матрица квадратная, ввод элементов сделать с клавиатуры).

Блок-схема к программе

331
Рисунок 9.1 – Блок-схема к программе

Программный код решения примера:


#include <stdio.h>
332
#include<conio.h>
#include <locale.h>
#define m 3
int main(void) {

int i, j, k, l, sum; // переменные циклов


int A[m][m];
setlocale(LC_ALL, "Russian");

// Ввод элементов матрицы


for (i = 0; i < m; i++)
{
printf("\n Введите 3 элемента %d строки\n", i + 1);
for (j = 0; j < m; j++)
scanf("%i,%j", &A[i][j]);
}

// Распечатка матриц
printf("\n Исходная матрица (%dx%d):\n", m, m);
for (i = 0; i < m; i++) {
printf("\n");
for (j = 0; j < m; j++)
printf("%4d", A[i][j]);
}

sum = 0;
for (i = 0; i < m; i++)
for (i = 0; i < m; i++)
if (A[i][i]>0) { sum = sum + A[i][i]; }
printf("\n сумма положительных элементов главной диагонали %d\n",
sum);
printf("\n\n ... Press any key: ");
_getch();
return 0;
}

333
Рисунок 9.2 – Окно кода программы

Рисунок 9.3 – Окно выполнения программы

334
Оборудование и материалы
1. Персональный компьютер;
2. Операционная система семейства Microsoft Windows;
3. Среда программирования Microsoft Visual Studio.

Указания по технике безопасности


1. Не входить в помещение, где находится вычислительная техника без
разрешения преподавателя.
2. Не работать в верхней одежде.
3. Не включать без разрешения оборудование.
4. При несчастном случае, или поломке оборудования позвать
преподавателя. Знать где находится рубильник (выключатель) выключения
электропитания оборудования.
5. Не трогать провода и разъемы (возможно поражение электрическим
током).
6. Не допускать порчи оборудования.

Задания
Составить блок-схему к заданию и программу на языке
программирования С++ для решения задания из таблицы 9.1.(Матрица
квадратная размером NN, ввод элементов массива сделать
автоматически через генератор случайных чисел, элементы массива
должны быть целыми числами).

Таблица 9.1 – Индивидуальные задания


варианта
Номер

Условие задания

Общую сумму положительных четных чисел на главной и


1
побочной диагоналях.

335
Общее произведение нечетных отрицательных элементов
2
главной и побочной диагоналей.
Количества кратных 3 элементов отдельно на главной и
3
отдельно на побочной диагоналях.
Среднее арифметическое для отрицательных элементов
главной диагонали и среднее арифметическое для
4
положительных элементов побочной диагонали.
Найти среднее геометрическое положительных кратных 4
5
элементов главной и побочной диагоналей.
Где больше кратных 3 элементов: на главной или побочной
6
диагоналях.
Где меньше отрицательных элементов: на главной или
7
побочной диагоналях.
Что больше: произведение положительных элементов
8
главной диагонали или произведение отрицательных
Что меньше: сумма нечетных элементов главной диагонали
9
или произведение некратных 3 элементов побочной.
Общую сумму отрицательных нечетных чисел на главной и
10
побочной диагоналях.
Общее произведение четных кратных 3 элементов главной и
11
побочной диагоналей.
Количества кратных 5 элементов отдельно на главной и
12
отдельно на побочной диагоналях.
Суммы положительных четных чисел отдельно на главной, и
13
отдельно на побочной диагоналях.
Произведения нечетных отрицательных элементов отдельно на
14
главной и отдельно на побочной диагоналях.
Общее количество кратных 3 элементов на главной и
15
побочной диагоналях.
Среднее арифметическое для всех отрицательных элементов
16
главной и побочной диагоналей.
Найти среднее геометрическое положительных элементов
17
отдельно для главной и отдельно для побочной диагоналей.
Где больше сумма кратных 4 элементов: на главной или
18
побочной диагоналях.
Где меньше сумма положительных элементов: на главной или
19
побочной диагоналях.
Что больше: сумма четных элементов главной диагонали или
20
сумма нечетных побочной.
Что меньше: произведение кратных 4 элементов главной
21
диагонали или сумма положительных побочной.
Суммы отрицательных нечетных чисел отдельно на
22
главной и отдельно на побочной диагоналях.
Произведения четных элементов отдельно на главной и
23
отдельно на побочной диагоналях.
336
Общее количество не кратных 5 элементов на главной и
24
побочной диагоналях.
Общую сумму квадратов положительных элементов
25
главной и побочной диагоналей.
26 Среднее арифметическое нечетных элементов главной
Произведение суммы четных элементов главной диагонали на
27
количество нечетных элементов побочной диагонали.
Количество элементов кратных числу 3 из диапазона
28
[-10;10] для главной диагонали.
Среднее геометрическое нечетных элементов главной и
29
побочной диагонали.
Сумму нечетных отрицательных элементов главной
диагонали и произведение четных чисел из диапазона [-5;6]
30
для побочной диагонали.

Содержание отчета
1 . Работа предъявляется на экране компьютера в виде исходного кода и в виде
отчета, содержащего: ФИО студента, шифр группы, номер и тему лабораторной
работы, полный код программы на языке программирования С++.
2 . Отчет выполняется на компьютере и распечатывается на листах бумаги
формата А4.
3. Каждая работа должна быть защищена.

Контрольные вопросы
1. Понятие матрицы, ввод элементов матрицы с клавиатуры (написать
фрагмент программы).
2. Селективная обработка элементов массива (четность, нечетность и
т.д.).
3. Различие сортировки методом пузырка и методом выбора, какой из
них быстрее.
4. Какое условие отбора элементов главной и побочной диагонали,
наддиагональных элементов.

Список литературы, рекомендуемый к использованию по данной


теме
337
1. Павловская, Т. А. С/С++: программирование на языке высокого
уровня : учебник для вузов/ Т. А. Павловская. – СПб. : Питер, 2010. – 461 с. –
(Учебник для вузов). – Библиогр.: с. 383. –Прил.: с.384-449. –ISBN 978-5-
94723-568-5.
2. Крылов, Е. В. Техника разработки программ : учебник : в 2 кн. / Е. В.
Крылов, В. А. Острейковский, Н. Г. Типикин, Кн. 1, Программирование на
языке высокого уровня. – Москва : Высшая школа, 2007. – 375 с. – (Для
высших учебных заведений) (Информатика и вычислительная техника). –
Библиогр.: с. 333-348. – Прил. с. 349-375. – ISBN 978-5-06-005524-5.
3. Ашарина И. В. Основы программирования на языках С и С++. – М.:
Горячая линия – Телеком, 2002. –207 с.: ил.
4. Кнут Д. Искусство программирования. Доступно:
http://lib.ru/CTOTOR/KNUT/
5. Ресурс по программированию. Доступно: http://physics-for-
students.ru/bookpc/informatika/slovar.zip
6. Языки программирования. Доступно: http://cppstudio.com/

338

Вам также может понравиться