УЧЕБНО-МЕТОДИЧЕСКОЕ ПОСОБИЕ
к выполнению курсовой работы
по дисциплине «Программирование на языке высокого уровня»
Ставрополь, 2017
УДК - Печатается по решению
Северо-Кавказского федерального
университета
Рецензенты:
Сорокин Александр Анатольевич, кандидат технических наук, доцент,
доцент кафедры инфокоммуникаций;
Братченко Наталья Юрьевна, кандидат физико-математических наук,
доцент, доцент кафедры инфокоммуникаций.
©ФГАОУ ВО «Северо-Кавказский
Федеральный университет», 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
ЗАКЛЮЧЕНИЕ…………………………………………………………….. 76
3
ВВЕДЕНИЕ
4
применением инфокоммуникационных технологий и с учетом основных
требований информационной безопасности;
(ОПК-3) - способностью владеть основными методами, способами и
средствами получения, хранения, переработки информации;
(ОПК-4) - способностью иметь навыки самостоятельной работы на
компьютере и в компьютерных сетях; осуществлять компьютерное
моделирование устройств, систем и процессов с использованием
универсальных пакетов прикладных компьютерных программ.
5
1 ФОРМУЛИРОВКА ЗАДАНИЯ
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
7
обратиться к пункту CLR и на центральной панели выбрать Приложение
Windows Form.
Затем в поле редактора Имя (где по умолчанию имеется <Введите имя>)
следует ввести имя проекта, например, Primer. В поле Расположение можно
указать путь размещения проекта или выбрать путь размещения проекта с
помощью клавиши (кнопки) Обзор. По умолчанию проект сохраняется в
специальной папке Projects. Пример выбора имени проекта показано на
рис. 1.3.
8
Рисунок 1.3 – Пример задания имени проекта
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();}
19
диалога. C помощью свойства SizeMode вписываем нашу картинку в блок
PictureBox1, выбрав пункт StretchImage.
14. В результате проведенных операций должна получиться форма
примерно такого вида, как показано на рис. 2.4.
23
Таблица 2.4 – Индивидуальные задания
24
1.3 Порядок выполнения задания 3 «Циклический алгоритм.
Табулирование функции и поиск экстремумов»
27
математическую формулу в соответствии с заданием с помощью редактора
формул.
19. Выделить набранную формулу и скопировать ее в буфер обмена.
20. Запустить графический редактор Paint (Пуск Программы
Стандартные Paint) и вставить из буфера обмена набранную формулу.
Сохранить графический файл (на английском языке) в туже папку, чтопроект
программы (Visual_Lab3).
21. Выделить на форме компонент PictureBox1 и с помощью
свойства Image загрузить в него созданный нами рисунок, отображающий
функцию. Загрузка рисунка производится с помощью стандартного окна
диалога. C помощью свойства SizeMode вписываем нашу картинку в блок
PictureBox1, выбрав пункт StretchImage.Выделить компонент
DataGridView1 и для свойств RowHeaders Visible (отображение заголовка
строк) выбрать параметр False.
22. В результате проведенных операций должна получиться форма
примерно такого вида, как показано на рис. 3.3.
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
);}
}
30
с использованием оператора While на отезке [xn;xk] с шагом xh.
Данные взять из таблицы 3.1.
31
32
1.4 Порядок выполнения задания 4 «Построение графика
функции на промежутке с определенным шагом»
Ход выполнения
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).
36
Рисунок 4.3– Рабочий вид формы приложения
Варианты для задания
37
38
39
1.5 Порядок выполнения задания 5 «Понятие одномерного
массива. Селективная обработка элементов массива»
Ход выполнения
43
Рисунок 5.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. Войти в среду Visual Studio 2010.
2. В окне Создать Проект следует развернуть узел Visual С++,
обратиться к пункту CLR и на центральной панели выбрать Приложение
Windows Form.
3. Затем в поле редактора Имя (где по умолчанию имеется <Введите
имя>) следует ввести имя проекта, Lab6. В поле Расположение можно
46
указать путь размещения проекта или выбрать путь размещения проекта с
помощью клавиши (кнопки) Обзор (например, N:\\CI\2_trim\Lab6).
4. Для формы изменить значение свойства Text, занеся, например,
следующие данные: «Выполнил студент группы ИТС-121 Иванов П. А.
Задание 6».
49
Рисунок 6.2 – Рабочий вид формы приложения
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 строки
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-го столбца
53
Рисунок 7.1 – Пример фигуры для нахождения площади
методом Монте-Карло
Ход выполнения
57
Таблица 7.1 – Виды плоских фигур
58
1.8 Порядок выполнения задания 8 «Работа с диалоговыми
окнами. Создание операционного меню»
60
Рисунок 8.1 – Подпункты меню пункта Файл
63
Рисунок 8.9 – Внешний вид Form2
int h;
int m;
#include <math.h>
#include "Form2.h"
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;}
68
Рисунок 8.11 – Рабочий вид формы приложения вкладки
«Таблица данных промежутка»
69
Таблица 8.1 –Индивидуалъные задания
70
71
1.9 Порядок выполнения задания 9 «Обработка матрицы.
Формирование одномерных массивов из двумерных. Сортировка
одномерных массивов»
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 ОПИСАНИЕ СТРУКТУРЫ РАБОТЫ
74
Слово «ЗАДАНИЕ» и тему задания следует писать прописными
буквами без точки в конце предложения, не подчеркивая. Переносы слов в
заголовках не допускаются. Если заголовок состоит из двух предложений,
их разделяют точкой.
Каждое задание необходимо начинать с нового листа (страницы).
Первый лист курсовой работы – это титульный лист, который
представлен в приложении А.
На втором листе помещают содержание, которое включают в общее
количество листов.
В конце курсовой работы приводится список источников, ис-
пользованных при выполнении заданий. Источники следует располагать в
алфавитном порядке. Список использованных источников включают в
содержание курсовой работы.
Сведения об источниках, включенных в список, необходимо давать в
соответствии с требованиями ГОСТ 7.1-2003 «Библиографическая запись.
Библиографическое описание. Общие требования и правила составления».
Нумерация страниц курсовой работы должна быть сквозная.
75
5 ПОРЯДОК ЗАЩИТЫ
6 КРИТЕРИИ ОЦЕНИВАНИЯ
78
ЗАКЛЮЧЕНИЕ
79
СПИСОК РЕКОМЕНДУЕМОЙ ЛИТЕРАТУРЫ
80
ПРИЛОЖЕНИЕ А
КУРСОВАЯ РАБОТА
ПО ДИСЦИПЛИНЕ «ПРОГРАММИРОВАНИЕ
НА ЯЗЫКЕ ВЫСОКОГО УРОВНЯ»
Автор работы:_____________________
Специальность:____________________
Группа:___________________________
Руководитель работы:_______________
(звание, уч. степень)
__________________________________
(Фамилия, И.О.)
Ставрополь
200_
81
ПРИЛОЖЕНИЕ Б
83
Cursor Позволяет задать курсор, который будет отображаться в момент,
когда курсор мыши находится над поверхностью окна. При
изменении этого свойства в визуальном дизайнере появляется
выпадающий список, в котором перечислены названия типов
курсоров и даже показаны их изображения.
85
Size Размер окна, его ширина и высота
86
1.1.1.3 События элемента управления Form
87
ReadOnly Получает или задает значение, указывающее, является ли текст в
текстовом поле доступным только для чтения
88
DeselectAll Указывает, что значение свойства SeiectionLength
равно нулю для отмены выделения символов в элементе
управления
Dispose() Освобождает все ресурсы, используемые объектом
Focus Задает фокус ввода элемента управления
Hide Скрывает элемент управления от пользователя
Paste () Заменяет текущий выбор в текстовом поле содержимым
буфера обмена
Select() Активирует элемент управления
SelectAll Выбирает весь текст в текстовом поле
Show Отображает элемент управления для пользователя
Undo Отменяет последнюю операцию редактирования в
текстовом поле
91
TabIndex Возвращает или задает последовательность перехода элемента
управления внутри контейнера
TabStop Получает или задает значение, показывающее, может ли
пользователь перевести фокус в данный элемент управления при
помощи клавиши ТАВ
TextImageRelat Получает или задает метаположение текста и изображения
ion относительно друг друга
94
Таблица 1.11 – Основные методы ListView
Название метода Описание метода
Clear Удаляет все элементы и столбцы из данного элемента
управления
Contains Получает значение, показывающее, является ли
указанный элемент управления дочерним элементом
CreateGraphics Задает объект Graphics для элемента управления
BeginUpdate Запрещает прорисовку элемента управления до вызова
метода EndUpdate
EndUpdate Возобновляет прорисовку элемента управления списка
после того, как она была приостановлена методом
BeginUpdate
Hide Скрывает элемент управления от пользователя
Select() Активирует элемент управления
SelectNextControl Активирует следующий элемент управления
Show Отображает элемент управления для пользователя
Sort Сортирует элементы в представлении списка
Update Вызывает перерисовку элементом управления
недопустимых областей клиентской области
97
1.1.5.3 События элемента управления RadioButton
99
OnCheckedChanged Повышает CheckedChanged событие CheckBox
управления. Это позволяет обрабатывать событие
напрямую
OpenFile Получает поток, используется для чтения файлов
SaveViewState Сохраняет изменения в CheckBox
ToString Возвращает строку, которая представляет текущий
объект
1.1.6.3 События элементауправления CheckBox
104
VisibleChanged
Происходит при изменении значения свойства Visible
105
BorderStyle Возвращает или задает стиль границы для элемента
управления
Dock Указывает, какие границы элемента управления привяза-
ны к контейнеру
Image Изображение, отображаемое в PictureBox
Enabled Указывает, включен ли элемент управления
Font Параметры шрифта
SizeMode Определяет, как будет обрабатываться размещение ри-
сунка в данной области рисунка и изменение размеров
элемента управления
Visble Указывает, отображается ли данный элемент или скрыт
106
1.1.9.3 События элемента управления PictureBox
Основные события элемента управления PictureBox отображены в
таблице 1.27.
107
Название свойства Описание свойства
BorderStyle Возвращает или задает стиль границы для
элемента управления
TextAlign Возвращает или задает выравнивание текста
в метке
Text Получает или задает текст, сопоставленный с
этим элементом управления
UseMnemonic Возвращает или задает значение, показываю-
щее, интерпретируется ли знак амперсанда
(&) в свойство Text элемента управления как
знак префикса для ключа доступа
действие1; действие2;
...
}
if (условие)действие1; else
действие2;
Если выполняется условие, то будет выполняться фрагмент программы
действие1, в противном случае будет выполняться действие2.
Каждое из утверждений может быть множественным. В таком случае
применяются фигурные скобки:
if (условие)
{
действие1; действие2;
...
}
else
{
действие3; действие4;
...
}
if (условие1)
действие1;
109
else if (условие2)
действие2;
else if (условие3)
действие3;
...
else
действие;
110
...
break;
...
case значениеn: действие;
...
break;
default:
действие;
...
break;
}
Выражение заключенного в круглые скобки оператора последовательно
сравнивается со значениями: значение 1, значение 2, ..., значение n,
которые должны быть простыми константами или константными
выражениями. В том случае, когда одно из этих значений равно значению,
выполняются утверждения, которые следуют за данным значением.
Утверждение break сигнализирует об окончании выполнения
утверждений и приводит к выходу из оператора switch. Утверждение
break ставится в конце каждого варианта выбора. Если этого не сделать, то
выполнение последовательности утверждений перейдет в следующий
вариант выбора и будет выполняться до тех пор, пока не встретится
утверждение break.
Специальный дополнительный вариант default будет выполнен в
том случае, когда не будет найдено ни одного совпадения.
Операторы if и switch той или иной синтаксической конструкции
существуют практически во всех языках программирования (в первую
очередь языках высокого уровня), и их часто называют операторами
ветвления.
111
выражение_2.
Оператор условия часто описывают как оператор ?. Тернарный
оператор условия ? наиболее часто используется для присвоения переменной
одного из двух значений в зависимости от некоторого условия.
113
Таблица 2.2 – Операторы отношения языка программирования С++
№ п/п Оператор Значение
1 == Равно
2 != Не равно
3 < Меньше
4 <= Меньше или равно
5 > Больше
6 >= Больше или равно
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)
119
4. ПОСТРОЕНИЕ ГРАФИКА ФУНКЦИИ НА ПРОМЕЖУТКЕ
С ОПРЕДЕЛЕННЫМ ШАГОМ
120
Рисунок 4.2 – Диалоговое окно «Редактор коллекции Series»
122
элемента управления Chart отображены в таблице 4.2.
125
6. МНОГОМЕРНЫЙ МАССИВ. ПОНЯТИЕ МАТРИЦЫ.
СЕЛЕКТИВНАЯ ОБРАБОТКА ЭЛЕМЕНТОВ СТРОК, СТОЛБЦОВ И
ДИАГОНАЛЕЙ МАТРИЦЫ
127
Например, для нахождения условия «найти элементы 3 столбца 2
строки», укажем условие с помощью условного IF:
If (i==1&&j==2) {действие};
128
Рисунок 6.1 – Компонент DataGridWiew
130
Таблица 6.1 – Свойства для добавления и удаления строк
Функции Описание
Add () Добавляет в коллекцию одну или более строк
Insert () Вставляет в коллекцию одну или более строк
Clear() Удаляет все строки коллекции
AddCopy() Добавляет копию строки, указанную в аргументе
InsertCopy() Вставляет копию строки, указанную первым
аргументом, в позицию, которая задана вторым
аргументом
Remove() Удаляет строку, указанную аргументом типа
DataGridviewRow.
RemoveAt () Удаляет строку, указанную значением индекса,
которое передано в качестве аргумента.
Функция Add (), применяемая к значению, возвращенному свойством
Rows, существует в виде четырех перегруженных версий, которые позволяют
добавлять в элемент управления строку данных.
Все версии функции Add () возвращают значение типа int,
представляющее собой индекс последней добавленной в коллекцию строки.
Если значение свойства SataSource элемента управления DataGridView
не нулевое или элемент управления не содержит столбцов, все версии
функции Add () генерируют исключение типа System::
InvalidOpera-tionException.
132
Свойство Описание
WrapMode следующую строку, если он слишком длинен, чтобы
уместиться в ячейке. Допустимое значение - одна из
констант, определенных перечислимым объектом
DataGridViewTri- State: True, False, NotSet.
Значение, используемое по умолчанию - NotSet
Это значение - Объект типа System::Windows::
Forms: :Padding, который определяет пробел между
содержимым и краем ячейки. Конструктор класса
Padding Padding требует передачи аргумента типа int,
который представляет значение дополнения
содержимого ячейки пробелами, измеренное в
пикселях. Значение, используемое по умолчанию,
соответствует отсутствию дополнения содержимого
ячейки
Это значение - строка формата, которая определяет
способ форматирования содержимого строки. Это
Format форматирование аналогично используемому в
функции Console:: WriteLine() . Значение,
используемое по умолчанию, - пустая строка
134
содержащего ячейку. Как правило, обращение к объекту
DataGridViewColumn будет выполняться посредством индексации
свойства Columns объекта элемента управления;
свойством DefaultCellstyle объекта элемента управления.
Вообще говоря, для каждой ячейки можно было бы использовать отдельный
объект DataGridViewCellStyle, но для повышения эффективности
количество таких объектов следует сохранять минимальным.
141
Естественно, такое определение погрешности делается толькодля
демонстрации точности метода Монте-Карло. При реальном его применении
реальную площадь фигуры Sp найти нельзя, так как в противном случае
незачем использовать метод Монте-Карло.
142
Рисунок 8.2 – Окно ToolStrip Container Задачи
146
Рисунок 8.6 – Свойства Dock в окне Свойства элемента управления
с вкладками
148
Рисунок 8.9 – Диалоговое окно Добавление нового элемента
150
Рисунок 8.10 – Диалоговое окно ColorDialog
151
Рисунок 8.12 – Диалоговое окно SaveFileDialog
154
Пошаговый пример выполнения данного алгоритма сортировки
представлен в таблице 9.2.
157
МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ
УЧЕБНОЕ ПОСОБИЕ
(ЛАБОРАТОРНЫЙ ПРАКТИКУМ)
по дисциплине «Программирование на языке высокого уровня»
Ставрополь, 201
158
УДК - Печатается по решению
Северо-Кавказского федерального
университета
Рецензенты:
Петренко Вячеслав Иванович, кандидат технических наук,
доцент, заместитель директора по науке института информационных
технологий и телекоммуникаций;
Братченко Наталья Юрьевна, кандидат физико-математических наук,
доцент, доцент кафедры инфокоммуникаций.
Ш-
Шаяхметов О.Х. Программирование на языке высокого уровня: Учебное
пособие (лабораторный практикум). – Ставрополь: Изд. СКФУ, 2016. - 186 с.
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
ВВЕДЕНИЕ
162
ЛАБОРАТОРНАЯ РАБОТА 1
Знакомство со средой Microsoft 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.
165
Среда Visual Studio отобразит окно Создать Проект, в котором необходимо
выбрать тип создаваемого проекта. Проект используется в Visual Studio для
логической группировки нескольких файлов, содержащих исходный код, на одном из
поддерживаемых языков программирования, а также любых вспомогательных
файлов. Обычно после сборки проекта (которая включает компиляцию всех
всходящих в проект файлов исходного кода) создается один исполняемый модуль.
В окне Создать Проект следует развернуть узел Visual С++,
обратиться к пункту Win32 и на центральной панели выбрать Консольное
приложение Win32. Выбор этой опции показан на рис. рис. 1.3.
166
Одновременно с созданием проекта Visual Studio создает решение. Решение
(solution) – это способ объединения нескольких проектов для организации более
удобной работы с ними.
После нажатия кнопки OK откроется окно Мастер приложений
Win32, показанное на рис. 1.5.
Выбор имени проекта может быть достаточно произвольным: допустимо
использовать числовое значение, допустимо имя задавать через буквы русского
алфавита.
В дальнейшем будем использовать имя, набранное с помощью букв латинского
алфавита и, может быть, с добавлением цифр.
167
Рисунок 1.6 – Страница мастера настройки проекта по умолчанию
168
Рисунок 1.8 – Меню добавления нового элемента к проекту
После выбора (нажатия) Новый элемент получим окно, показанное на рис. 1.9,
где через пункт меню Код узла Visual C++ выполнено обращение к центральной
части панели, в которой осуществляется выбор типа файлов. В данном случае
требуется обратиться к закладке C++ File (*.cpp).
Теперь в поле редактора Имя (в нижней части окна) следует задать имя нового
файла и указать расширение ".с". Например, main.c. Имя файла может быть
достаточно произвольным, но имеется негласное соглашение, что имя файла должно
отражать его назначение и логически описывать исходный код, который в нем
169
содержится. В проекте, состоящем из нескольких файлов, имеет смысл выделить
файл, содержащий главную функцию программы, с которой она начнет
выполняться. В данном пособии такому файлу мы будем задавать имя main.c, где
расширение .с указывает на то, что этот файл содержит исходный код на языке
С, и он будет транслироваться соответствующим компилятором. Программам на
языке С принято давать расширение .с. После задания имени файла в поле
редактора Name получим форму, показанную на рис. 1.10.
Затем следует нажать кнопку Добавить. Вид среды Visual Studio после
добавления первого файла к проекту показан на рис. 1.11. Для добавленного файла
автоматически открывается редактор.
170
В папке проекта отображаются файлы, включенные в проект в папках.
Приведем описание.
Папка Файлы исходного кода предназначена для файлов с исходным кодом. В
этой папке отображаются файлы с расширением .с.
Папка Заголовочные файлы содержит заголовочные файлы с
расширением .h. Папка Файлы ресурсов содержит файлы ресурсов,
например изображения и т. д. Папка Внешние зависимости отображает
файлы, не добавленные явно в проект, но использующиеся в файлах
исходного кода, например включенные при помощи директивы #include.
Обычно в папке Внешние зависимости присутствуют заголовочные файлы
стандартной библиотеки, использующиеся в проекте.
Следующий шаг состоит в настройке проекта. Для этого в меню Проект
главного меню следует выбрать Свойства hell (или с помощью последовательного
нажатия клавиш Alt+F7). Пример обращения к этому пункту меню показан на рис.
1.12.
После того как произойдет открытие окна свойств проекта, следует обратиться
(с левой стороны) к Свойства конфигурации. Появится ниспадающий список,
который показан на рис. 1.13. Выполнить обращение к узлу Общие, и через него в
левой панели выбрать Набор символов, где установить свойство Использовать
171
многобайтовую кодировку. Настройка Набор символов позволяет выбрать, какая
кодировка символов – ANSI или UNICODE – будет использована при компиляции
программы. Для совместимости со стандартом C89 мы выбираем Использовать
многобайтовую кодировку. Это позволяет использовать многие привычные функции,
например, функции по выводу информации на консоль.
172
Рисунок 1.14 – Страница свойств для запрещения исключений С++
173
Рисунок 1.15 – Страница свойств закладки Язык
174
Рисунок 1.17 – Успешно откомпилированная первая программа на языке С
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 – Файлы и папки созданного проекта
177
Рисунок 1.20 – Файлы папки Debug
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. Получить навыки работы со средой 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() в программах на
языке С?
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) - способностью иметь навыки самостоятельной работы на
компьютере и в компьютерных сетях; осуществлять компьютерное
моделирование устройств, систем и процессов с использованием
универсальных пакетов прикладных компьютерных программ.
Процесс Вычисление
или последовательность
вычислений
Предопределенный Выполнение
подпрограммы
процесс
Альтернатива Проверка условий
183
Таблица 2.2 – Базовые структуры блок-схем
Название типа
Изображение
структуры
Последовательность
Разветвление (выбор)
Сокращенная запись
разветвления
Выбор варианта
Цикл с предусловием
Цикл с постусловием
Цикл с параметрами
184
2.1.2 Алфавит и лексемы языка С++
В алфавит языка С входят:
прописные и строчные буквы латинского алфавита;
цифры: 0,1,2,3,4,5,6,7,8,9;
специальные знаки:
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
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 приведены допустимые комбинации типов данных языка С с
их минимальным диапазоном значений и типичным размером.
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.
196
197
198
199
2.2 Практическая часть
200
а также вывода на консоль максимальных значений чисел типа int, float и
double.
Для решения примера следует воспользоваться математической
библиотекой компилятора, т. е. включить в программу заголовочный файл
<math.h>, а также заголовочные файлы <limits.h>, <float.h>.
201
Рисунок 2.1 – Пример использования предопределенных констант
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
Оборудование и материалы
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()?
208
ЛАБОРАТОРНАЯ РАБОТА 3
Принятие решений. Условные операторы в языке С++
Формируемые компетенции:
(ОПК-2) - способностью решать стандартные задачи профессиональной
деятельности на основе информационной и библиографической культуры с
применением инфокоммуникационных технологий и с учетом основных
требований информационной безопасности;
(ОПК-3) - способностью владеть основными методами, способами и
средствами получения, хранения, переработки информации;
(ОПК-4) - способностью иметь навыки самостоятельной работы на
компьютере и в компьютерных сетях; осуществлять компьютерное
моделирование устройств, систем и процессов с использованием
универсальных пакетов прикладных компьютерных программ.
3.1.1 Оператор if
Общая форма записи оператора if:
if (expression)
program statement;
В операторе if используется результат вычисления условия,
заключенного в круглые скобки, на основе которого принимается
решение. Результат вычисления условия expression может быть
арифметическим или логическим. Если результат выполнения условия
expression будет истинным, то возможно выполнить несколько
утверждений типа program statement. Для этого следует использовать
фигурные скобки, например:
if (expression)
{
program1 statement1;
program2 statement2;
...
}
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;
...
}
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 той или иной синтаксической конструкции
существуют практически во всех языках программирования (в первую
очередь языках высокого уровня), и их часто называют операторами
ветвления.
216
Таблица 3.2 – Операторы отношения языка программирования С++
№ п/п Оператор Значение
1) == Равно
2) != Не равно
3) < Меньше
4) <= Меньше или равно
5) > Больше
6) >= Больше или равно
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;
}
218
В первом операторе if применено логическое условие И (&&) для
проверки того, что дискриминант не равен отрицательному значению и
одновременно, чтобы первый коэффициент квадратного уравнения не был
равен нулю. Аналогичное условие прописано и для последнего оператора if.
Пример 2. Напишите программу решения квадратного уравнения с
проверкой на наличие вещественных корней на основе конструкции if– else.
Вид квадратного уравнения:
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.
223
Пример 6. Создать блок-схему и программу вычисления функции с
использованием оператора IF. Значение х и а ввести с клавиатуры.
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 в
соответствии с номером своего варианта.
227
Содержание отчета
1. Работа предъявляется на экране компьютера в виде исходного кода и
в виде отчета, содержащего: ФИО студента, шифр группы, номер и тему
лабораторной работы, полный код программы на языке программирования
С++.
2 . Отчет выполняется на компьютере и распечатывается на листах
бумаги формата А4.
3. Каждая работа должна быть защищена.
Контрольные вопросы
1. Как организуются множественные действия в операторе условия if?
2. Какой формат записи имеет тернарный оператор условия?
228
3. Какой оператор условия рекомендуется использовать для
программирования меню?
4. В чем различие и сходство между операторами break и continue?
5. Как можно обеспечить выход из вложенных циклов?
6. Как можно организовать переходы в различные точки программы на
С++?
7. Какие логические операторы отношения используются в языке С++?
8. Что произойдет, если в операторе switch после метки case не
использовать оператор break?
9. Что произойдет, если в операторе switch не поставить метку default и
условие переключения не совпадет ни с одной меткой case?
229
ЛАБОРАТОРНАЯ РАБОТА 4
Организация циклов в языке С++
Формируемые компетенции:
(ОПК-2) - способностью решать стандартные задачи профессиональной
деятельности на основе информационной и библиографической культуры с
применением инфокоммуникационных технологий и с учетом основных
требований информационной безопасности;
(ОПК-3) - способностью владеть основными методами, способами и
средствами получения, хранения, переработки информации;
(ОПК-4) - способностью иметь навыки самостоятельной работы на
компьютере и в компьютерных сетях; осуществлять компьютерное
моделирование устройств, систем и процессов с использованием
универсальных пакетов прикладных компьютерных программ.
230
После выполнения этого утверждения вновь рассчитывается выражение
expression. Если в результате расчета будет TRUE, то вновь будут выполнены
утверждения program statement. Цикл повторяется до тех пор, пока в
результате расчета выражения expression (в круглых скобках оператора
while) не будет получено значение FALSE (ложный), которое является
признаком окончания цикла, после чего выполнение программы
продолжается с утверждения, следующего за утверждением program
statement. Когда требуется выполнить группу утверждений, то она (группа)
располагается в фигурных скобках:
while (expression)
{
program statement; program2 statement2; program3
statement3;
...
}
Открывающаяся фигурная скобка может следовать непосредственно
после закрывающей круглой скобки оператора while. Все, что находится в
фигурных скобках, будет выполняться, пока верно выражение expression.
Очевидно, что неверное задание выражения expression может привести к
бесконечному циклу (к зацикливанию).
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). Вложенные циклы
могут идти непосредственно друг за другом или составлять тело цикла с
помощью фигурных скобок. Возможно также использование двух
индексных переменных для инициализации начала цикла с последующим их
инкрементированием (увеличением) или декрементированием
(уменьшением).
233
получаться значение TRUE. Когда в результате проверки условия будет
вычислено значение FALSE (ложь), то выполнение цикла прекратится и
произойдет переход к утверждению (следующему фрагменту программы),
непосредственно следующему за циклом.
Таким образом, цикл do–while гарантированно выполнится хотя бы один
раз.
В случае выполнения нескольких утверждений используются фигурные
скобки для выделения тела цикла:
do {
program1 statement1; program2 statement2; program3 statement3;
... } while (loop_expression);
Оператор цикла while называется оператором цикла с предусловием,
оператор цикла for называется оператором цикла с параметром, оператор
цикла do–while называется оператором цикла c постусловием.
234
printf("\n\t Total numbers: %d\n", j);
printf("\n Press any key: ");
_getch();
return 0;
}
Возможный результат выполнения программы показан на рис. 4.1.
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;
}
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;
}
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;
}
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 – Пример горки букв
Блок-схема к заданию
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;
}
242
Рисунок 4.7 – Результат выполнения программы
Оборудование и материалы
1. Персональный компьютер;
2. Операционная система семейства Microsoft Windows;
3. Среда программирования Microsoft Visual Studio.
243
4.3 Задания
Создать блок-схему к программе и программу на языке программирования
С++ таблицы табулирования функции
244
Содержание отчета
1 . Работа предъявляется на экране компьютера в виде исходного кода и в виде
отчета, содержащего: ФИО студента, шифр группы, номер и тему лабораторной
работы, полный код программы на языке программирования С++.
2 . Отчет выполняется на компьютере и распечатывается на листах бумаги
формата А4.
3. Каждая работа должна быть защищена.
Контрольные вопросы
1. Как организуются составные операторы циклов в языке С++?
2. Как организуются вложенные циклы в языке С++?
3. В каких случаях может произойти зацикливание при использовании
оператора цикла с предусловием?
4. В каких случаях может произойти зацикливание при использовании
оператора цикла с постусловием?
5. Сколько условий требуется для работы оператора цикла с
параметром?
6. Сколько операторов отношения в языке С++? Перечислите их.
7. Как реализуется взаимозаменяемость операторов цикла while и for?
8. В чем сходство и различие между циклами с предусловием и с
постусловием?
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
меньше, чем требуется, то компилятор не выдаст сообщения об ошибке. Выход за
границы массивов должен следить только сам программист.
В языке С++ нельзя присвоить один массив другому. Для передачи элементов
одного массива другому необходимо выполнить присвоение поэлементно.
249
В языке С возможна инициализация безразмерных массивов. Например для
одномерного массива:
int A[ ] = {1, 2, 3, 4, 5};
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.
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]);
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]);
254
Пример 5. Создать блок-схему к заданию и программу на С++, если дан
массив А(8), элементы которого нужно ввести с клавиатуры, найти сумму
четных положительных элементов и минимальный элемент массива.
Блок-схема к заданию на рис. 5.5, окно кода программы показан на рис.
5.6, а результат выполнения программы на рис. 5.7.
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;
}
256
Рисунок 5.7 – Окно обработки элементов массива
Оборудование и материалы
1. Персональный компьютер;
2. Операционная система семейства Microsoft Windows;
3. Среда программирования Microsoft Visual Studio.
257
5. Не трогать провода и разъемы (возможно поражение
электрическим током).
6. Не допускать порчи оборудования.
Задания
Составить блок-схемы и программы для решения следующих задач
таблица 5.1.
258
в Найти максимальный четный элемент массива
8 а Вычислить среднее арифметическое максимального и
минимального элементов массива
б Найти минимальный по модулю элемент массива
в Найти сумму элементов из интервала [0;10]
9 а Вычислить среднее геометрическое номеров
максимального и минимального элементов массива
б Найти разность суммы положительных и произведения
отрицательных чисел массива
в Найти количество положительных элементов
10 а Найти сумму отрицательных элементов
б Найти сумму элементов массива, у которых индекс кратен 3
в Найти произведение модулей наибольшего и наименьшего
элементов массива
11 а Найти сумму отрицательных элементов
б Найти сумму второго и наибольшего положительного
элементов массива
в Найти разность максимального и минимального элементов массива
12 а Вычислить среднее арифметическое четных элементов массива
б Найти сумму элементов в диапазоне [-10;20]
в Найти максимальный по модулю элемент массива
13 а Найти сумму минимального положительного элемента массива и
его номера
б Найти сумму четных элементов массива из
диапазона [-20;30]
в Найти минимальный по модулю элемент массива
14 а Найти количество элементов кратных 5
б Найти сумму четных элементов массива стоящих на нечетных
местах
в Найти максимальный четный элемент массива
15 а Найти количество положительных элементов
б Найти сумму элементов больших 3
в Найти максимальный элемент массива
16 а Найти количество отрицательных элементов
б Найти сумму отрицательных элементов
в Найти минимальный элемент кратный пяти
17 а Найти количество четных элементов
б Найти сумму элементов кратных 3
в Найти разность максимального и минимального элементов массива
260
б Найти сумму отрицательных элементов
в Найти сумму наибольшего и наименьшего элементов массива
30 а Найти разность максимального и минимального
положительных элементов
б Найти сумму нечетных элементов
в Найти минимальный элемент из диапазона [-20;30]
Содержание отчета
1. Работа предъявляется на экране компьютера в виде исходного кода и в виде
отчета, содержащего: ФИО студента, шифр группы, номер и тему лабораторной
работы, полный код программы на языке программирования С++.
2. Отчет выполняется на компьютере и распечатывается на листах бумаги
формата А4.
3. Каждая работа должна быть защищена.
Контрольные вопросы
1. Как организуются одномерные числовые массивы в языке С++?
2. Как организуется индексирование числовых массивов в языке С++?
3. На кого или на что возлагается контроль границ числовых массивов
в языке программирования С++?
4. Для чего применяется начальная инициализация числовых массивов
при дальнейшем их использовании?
5. Почему при определении размерности массива с помощью
препроцессорной директивы define не используется точка с запятой после
числового значения?
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) - способностью иметь навыки самостоятельной работы на
компьютере и в компьютерных сетях; осуществлять компьютерное
моделирование устройств, систем и процессов с использованием
универсальных пакетов прикладных компьютерных программ.
263
по формуле
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) и двигаясь по часовой стрелке.
Образец заполнения:
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.
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;
}
269
Рисунок 6.3 – Вывод данных за каждый 10-й день
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 – Результат произведения двух матриц
272
Рисунок 6.5 – Блок-схема к заданию
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;
}
274
Рисунок 6.7 – Обработка элементов матрицы
Задания
Составить блок-схемы и программы для решения следующих задач
таблица 6.1. (задача a на селективную обработку элементов матрицы,
задача б на обработку элементов строк и столбцов).
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 не используется точка с запятой после числового значения?
281
ЛАБОРАТОРНАЯ РАБОТА 7
Построение графика функции
Формируемые компетенции:
(ОПК-2) - способностью решать стандартные задачи профессиональной
деятельности на основе информационной и библиографической культуры с
применением инфокоммуникационных технологий и с учетом основных
требований информационной безопасности;
282
(ОПК-3) - способностью владеть основными методами, способами и
средствами получения, хранения, переработки информации;
(ОПК-4) - способностью иметь навыки самостоятельной работы на
компьютере и в компьютерных сетях; осуществлять компьютерное
моделирование устройств, систем и процессов с использованием
универсальных пакетов прикладных компьютерных программ.
283
function3(); /* вызов третьей функции */
} /* Конец тела функции main() */
/* Начало определения первой функции */
function1() {/* Начало тела первой функции */
/* Операторы первой функции */
/* Конец тела первой функции */
}
/* Начало определения второй функции */
function2()
{ /* Начало тела второй функции*/
/* Операторы второй функции */
/* Конец тела второй функции*/
}
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.
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");
}
289
va_arg Макрос, расширяющийся до выражения со значением
и типом следующего аргумента в списке
переменной длины. Каждый вызов его изменяет
объект, объявленный с помощью va_list так, что
объект указывает на следующий аргумент списка
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
аргументов, могут возвращаться функциями, сохраняться в массивах и
присваиваться другим указателям на функции.
Типичное определение указателя на функцию следующее:
тип_возвращаемый_функцией(*имя_указателя_на_функцию)(аргумен
ты);
В приведенном объявлении используются круглые скобки, в которых
собственно и определяется указатель на функцию, которая возвращает тот или
иной тип – тип_возвращаемый_функцией. Хотя знак * обозначает префиксную
операцию, он имеет более низкий приоритет, чем функциональные круглые
функции, поэтому для правильного комбинирования частей объявления
необходимы еще и дополнительные скобки. При этом аргументы – это аргументы
той или иной функции с заданным типом возвращаемого значения, и на которую
ссылается указатель *имя_указателя_на_функцию. Очевидно, что возможны
сложные объявления функций.
Указатели на функции часто используются в системах, управляемых меню.
Пользователь выбирает команду меню (одну из нескольких). Каждая команда
обслуживается своей функцией. Указатели на каждую функцию находятся в
массиве указателей. Выбор пользователя служит индексом, по которому из массива
выбирается указатель на нужную функцию.
Другим типичным применением указателей на функции являются
реализация обобщенных алгоритмов, например, алгоритмов сортировки и
поиска. В этом случае критерии сортировки и поиска реализуются в виде
отдельных функций и передаются при помощи указателей на функции в качестве
параметра реализации основного алгоритма.
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;
}
//Прототип функции
void bsort(int* const, const int);
int main(void)
{
//Размерность массива
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]);
}
}
}
}
299
Рисунок 7.5 – Пример построения графика функции на консоли
Оборудование и материалы
1. Персональный компьютер;
2. Операционная система семейства Microsoft Windows;
3. Среда программирования Microsoft Visual Studio.
Задания
Согласно своему варианту (таблица 7.2) создать программу для
построения графика функции.
301
Содержание отчета
1. Работа предъявляется на экране компьютера в виде исходного кода и в виде
отчета, содержащего: ФИО студента, шифр группы, номер и тему лабораторной
работы, полный код программы на языке программирования С++.
2. Отчет выполняется на компьютере и распечатывается на листах бумаги
формата А4.
3. Каждая работа должна быть защищена.
Контрольные вопросы
1. Каким образом можно вернуть из функции несколько значений?
302
2. Каким образом определяется тип функции?
3. Как выглядит описание функции, которая возвращает указатель на
заданный тип, например, char?
4. В каком месте программы можно определить указатель на функцию?
5. Имеет ли указатель на функцию прототип и определение?
6. Как осуществляется вызов функции с помощью указателя?
7. Как взаимосвязаны между собой объявление функции, ее определение
и вызов функции?
ЛАБОРАТОРНАЯ РАБОТА 8
Файловый ввод и вывод в языке С++
303
Цель работы: научится создавать программы на языке С++ используя
данные текстовых файлов.
Формируемые компетенции:
(ОПК-2) - способностью решать стандартные задачи профессиональной
деятельности на основе информационной и библиографической культуры с
применением инфокоммуникационных технологий и с учетом основных
требований информационной безопасности;
(ОПК-3) - способностью владеть основными методами, способами и
средствами получения, хранения, переработки информации;
(ОПК-4) - способностью иметь навыки самостоятельной работы на
компьютере и в компьютерных сетях; осуществлять компьютерное
моделирование устройств, систем и процессов с использованием
универсальных пакетов прикладных компьютерных программ.
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() Дозапись потока в файл
306
file_name – это имя файла с заданным расширением и возможным путем
расположения, mode – режим работы файла: чтение, запись и т. д.
В табл. 8.2 приводятся допустимые значения режима для функции fopen().
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);
310
Рисунок 8.1 – Заполнение матрицы нечетными числами
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]; // Буферный массив
fclose(fid);
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);
316
Рисунок 8.4 – Пример записи в файл и чтения из файла
Примечание. Для данной программы формат записи функции
fscanf():fscanf(fid, "%s", words);
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 (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;}
319
Рисунок 8.5 – Результат обратного считывания информации из файла
321
return 0;
}
Оборудование и материалы
1. Персональный компьютер;
2. Операционная система семейства Microsoft Windows;
3. Среда программирования Microsoft Visual Studio.
Указания по технике безопасности
322
1. Не входить в помещение, где находится вычислительная техника без
разрешения преподавателя.
2. Не работать в верхней одежде.
3. Не включать без разрешения оборудование.
4. При несчастном случае, или поломке оборудования позвать
преподавателя. Знать где находится рубильник (выключатель) выключения
электропитания оборудования.
5. Не трогать провода и разъемы (возможно поражение электрическим
током).
6. Не допускать порчи оборудования.
Задания
Создать таблицу табулирования функции с использованием оператора
цикла For на отрезке [xn;xk] с шагом xh. Данные взять из таблицы 8.3.
Результат табулирования записать в текстовый файл под именем
«Tablica.txt», а также произвести чтение данных из этого файла и сделать
вывод на экран консоли.
323
324
Содержание отчета
1. Работа предъявляется на экране компьютера в виде исходного кода и в виде
отчета, содержащего: ФИО студента, шифр группы, номер и тему лабораторной
работы, полный код программы на языке программирования С++.
2. Отчет выполняется на компьютере и распечатывается на листах бумаги
формата А4.
325
3. Каждая работа должна быть защищена.
Контрольные вопросы
1. Что может быть файлом в языке С++?
2. Какие обязательные операции выполняются при нормальной работе с
файлами? Какие библиотечные функции при этом используются?
3. Как определяется текстовой поток в стандарте языка С++?
4. Как определяется двоичный поток в стандарте языка С++?
5. Что определяет собой указатель файла?
6. С помощью каких функций языка С++ осуществляется форматная
запись в файл и форматное чтение данных из файла?
7. Какая переменная стандартной библиотеки используется для
определения стандартного потока вывода на дисплей?
8. Какая переменная стандартной библиотеки используется для
определения стандартного потока чтения с дисплея?
9. Как в языке С++ кодируется признак конца файла?
10. Как в языке С++ кодируется признак конца строки?
11. Что такое файл произвольного доступа?
12. Как в языке С++ осуществляется пакетная запись данных в файл?
13. Как осуществляется запись бинарной информации в текстовый файл?
14. Как осуществляется чтение бинарной информации из текстового
файла?
ЛАБОРАТОРНАЯ РАБОТА 9
Обработка элементов диагоналей квадратных матриц
327
Цель работы: научиться самостоятельно обрабатывать элементы
диагоналей квадратных матриц.
Формируемые компетенции:
(ОПК-2) - способностью решать стандартные задачи профессиональной
деятельности на основе информационной и библиографической культуры с
применением инфокоммуникационных технологий и с учетом основных
требований информационной безопасности;
(ОПК-3) - способностью владеть основными методами, способами и
средствами получения, хранения, переработки информации;
(ОПК-4) - способностью иметь навыки самостоятельной работы на
компьютере и в компьютерных сетях; осуществлять компьютерное
моделирование устройств, систем и процессов с использованием
универсальных пакетов прикладных компьютерных программ.
328
9.1.1 Селективная обработка элементов массива
Наиболее часто встречаются такие условия обработки элементов
массива:
329
Существует множество алгоритмов для сортировки массивов. Ниже
рассмотрены два из них: сортировка выбором и методом пузырька.
330
Вставка элемента в массив - задача обратная предыдущей. Прием
используется тот же - смещение группы элементов на одну позицию. Только
при уплотнении сдвиг производится влево, при вставке - вправо. При вставке
возникает проблема, что делать с последними элементами? Если в
дальнейшей работе с массивом участвуют только заявленные элементы, то
«хвост» придется вытеснить, последние значения при этом будут утрачены.
Иначе, нужно создавать дополнительный массив, размерность которого
будет больше исходного на количество вставленных элементов. Выбор типа
цикла для работы с массивом зависит от конкретного случая.
Блок-схема к программе
331
Рисунок 9.1 – Блок-схема к программе
// Распечатка матриц
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 – Окно кода программы
334
Оборудование и материалы
1. Персональный компьютер;
2. Операционная система семейства Microsoft Windows;
3. Среда программирования Microsoft Visual Studio.
Задания
Составить блок-схему к заданию и программу на языке
программирования С++ для решения задания из таблицы 9.1.(Матрица
квадратная размером NN, ввод элементов массива сделать
автоматически через генератор случайных чисел, элементы массива
должны быть целыми числами).
Условие задания
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. Какое условие отбора элементов главной и побочной диагонали,
наддиагональных элементов.
338