Сборник методических указаний для студентов по выполнению практических работ по МДК 01 02 «Прикладное программирование»

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














СБОРНИК МЕТОДИЧЕСКИХ УКАЗАНИЙ

ДЛЯ СТУДЕНТОВ ПО ВЫПОЛНЕНИЮ

ПРАКТИЧЕСКИХ РАБОТ




МДК 01 02 «Прикладное программирование»


специальность 09.02.03 Программирование в компьютерных системах

ДЛЯ СТУДЕНТОВ ОЧНОЙ ФОРМЫ ОБУЧЕНИЯ













Ставрополь, 2016 г.

Одобрено кафедрой программного
обеспечения и информационных технологий



Методические указания для выполнения практических работ по МДК 01.02 Прикладное программирование




Методические указания для выполнения практических работ являются частью основной профессиональной образовательной программы ГБПОУ СРМК по специальности 09.02.03 «Программирование в компьютерных системах» в соответствии с требованиями ФГОС СПО третьего поколения.
Методические указания по выполнению практических работ адресованы студентам очной формы обучения.
Методические указания включают в себя учебную цель, перечень образовательных результатов, заявленных во ФГОС СПО третьего поколения, задачи, обеспеченность занятия, краткие теоретические и учебно-методические материалы по теме, вопросы для закрепления теоретического материала, задания для практической работы студентов и инструкцию по ее выполнению, методику анализа полученных результатов, порядок и образец отчета о проделанной работе.










Составитель:
Краскова Ольга Владимировна, преподаватель ГБПОУ СРМК







СОДЕРЖАНИЕ
13 TOC \o "1-3" \h \z \u 1413 LINK \l "_Toc442096119" 14Введение 13 PAGEREF _Toc442096119 \h 1441515
13 LINK \l "_Toc442096120" 14Разработка ПО при структурном подходе к программированию. 13 PAGEREF _Toc442096120 \h 1451515
13 LINK \l "_Toc442096121" 14Нисходящее проектирование 13 PAGEREF _Toc442096121 \h 1461515
13 LINK \l "_Toc442096122" 14Разработка ПО при объектно-ориентированном подходе к программированию. 13 PAGEREF _Toc442096122 \h 14191515
13 LINK \l "_Toc442096123" 14Работа с инструментальными средствами автоматизации оформления документации. 13 PAGEREF _Toc442096123 \h 14241515
13 LINK \l "_Toc442096124" 14Разработка простейших программ в среде программирования Borland C++ Builder. 13 PAGEREF _Toc442096124 \h 14281515
13 LINK \l "_Toc442096125" 14Программирование линейных алгоритмов 13 PAGEREF _Toc442096125 \h 14331515
13 LINK \l "_Toc442096126" 14Решение задач с использованием ветвлений 13 PAGEREF _Toc442096126 \h 14421515
13 LINK \l "_Toc442096127" 14Программирование разветвляющихся алгоритмов 13 PAGEREF _Toc442096127 \h 14491515
13 LINK \l "_Toc442096128" 14Решение задач с использованием циклических алгоритмов 13 PAGEREF _Toc442096128 \h 14651515
13 LINK \l "_Toc442096129" 14Программирование циклических вычислений в языке c++ 13 PAGEREF _Toc442096129 \h 14721515
13 LINK \l "_Toc442096130" 14Решение задач обработки одномерных массивов данных 13 PAGEREF _Toc442096130 \h 14831515
13 LINK \l "_Toc442096131" 14Решение задач обработки двумерных массивов 13 PAGEREF _Toc442096131 \h 14881515
13 LINK \l "_Toc442096132" 14Программирование с использованием динамических двумерных массивов в языке с++. 13 PAGEREF _Toc442096132 \h 14921515
13 LINK \l "_Toc442096133" 14Решение задач с использованием функций 13 PAGEREF _Toc442096133 \h 14961515
13 LINK \l "_Toc442096134" 14Программирование с использованием вспомогательных функций в языке с++ 13 PAGEREF _Toc442096134 \h 14981515
13 LINK \l "_Toc442096135" 14Решение задач по обработке строк 13 PAGEREF _Toc442096135 \h 141031515
13 LINK \l "_Toc442096136" 14Программирование с использованием файлов 13 PAGEREF _Toc442096136 \h 141101515
13 LINK \l "_Toc442096137" 14Решение задач с использованием структур 13 PAGEREF _Toc442096137 \h 141151515
13 LINK \l "_Toc442096138" 14Классы. Программирование линейных алгоритмов с использованием функций инициализации set() и вывода результатов print(). 13 PAGEREF _Toc442096138 \h 141221515
13 LINK \l "_Toc442096139" 14Программирование линейных алгоритмов с использованием конструктора, деструктора, friend - функции инициализации set() и функции вывода результатов print() 13 PAGEREF _Toc442096139 \h 141291515
15






Введение

УВАЖАЕМЫЙ СТУДЕНТ!

Методические указания по МДК 01 02 «Прикладное программирование» для выполнения практических работ по разделу 1 «Разработка прикладных программ» созданы Вам в помощь для работы на занятиях, подготовки к практическим работам, правильного составления отчетов.
Приступая к выполнению практической работы, Вы должны внимательно прочитать цель и задачи занятия, ознакомиться с требованиями к уровню Вашей подготовки в соответствии с федеральными государственными стандартами третьего поколения (ФГОС-3), краткими теоретическими и учебно-методическими материалами по теме практической работы, ответить на вопросы для закрепления теоретического материала.
Все задания к практической работе Вы должны выполнять в соответствии с инструкцией, анализировать полученные в ходе занятия результаты по приведенной методике.
Отчет о практической работе Вы должны выполнить по приведенному алгоритму, опираясь на образец.
Наличие положительной оценки по практическим работам необходимо для допуска к экзамену по МДК, поэтому в случае отсутствия на уроке по любой причине или получения неудовлетворительной оценки за практическую работу Вы должны найти время для ее выполнения или пересдачи.

Внимание! Если в процессе подготовки к практическим работам или при решении задач у Вас возникают вопросы, разрешить которые самостоятельно не удается, необходимо обратиться к преподавателю для получения разъяснений или указаний в дни проведения дополнительных занятий.
Время проведения дополнительных занятий можно узнать у преподавателя или посмотреть на двери его кабинета.


Желаем Вам успехов!!!

Название практической работы 1:
Разработка ПО при структурном подходе к программированию.

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

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

Образовательные результаты, заявленные во ФГОС третьего поколения:
Студент должен
уметь:
- осуществлять разработку кода программного модуля на современных языках программирования;
- создавать программу по разработанному алгоритму как отдельный модуль;
- выполнять отладку и тестирование программы на уровне модуля;
знать:
- основные этапы разработки программного обеспечения;
- основные принципы технологии объектно-ориентированного программирования;
- основные принципы отладки и тестирования программных продуктов

Задачи практической работы:

Повторить теоретический материал по теме практической работы.
Ответить на вопросы для закрепления теоретического материала.
Разработать алгоритмы задач методом пошаговой детализации.
Оформить отчет.

Обеспеченность занятия (средства обучения):

Учебно-методическая литература:
- Архангельский А. Я.. Программирование в C++ Builder.  Бином-Пресс, 2010;
Хорев П.Б. Объектно-ориентированное программирование (4-е изд., стер.) учеб. Пособие. Издательский центр «Академия», 2012.
Справочная литература:
Справочный материал по компонентам среда разработки C++ Builder .
Технические средства обучения: ПК.
Программное обеспечение: C++ Builder.
Раздаточные материалы (карточки-задания, инструкционные карты, образцы, заготовки; указать, сколько).


Краткие теоретические и учебно-методические материалы по теме практической работы
Нисходящее проектирование
Спецификация задачи служит отправной точкой в создании программы. Нужно понять, какие действия должны быть совершены для решения задачи, описать их на естественном языке и на достаточно высоком уровне абстракции.
Спецификация задачи является ее первичным проектом. От неё мы движемся к программе, постепенно уточняя описание.
Постепенное уточнение проекта называется методом проектирования сверху вниз (пошаговой детализации или нисходящего проектирования).
Пример 1. В качестве примера рассмотрим проект одевания ребенка.
Решение:
1. Первичная цель:
Одеть.
2. Конкретизация цели на первом шаге:
Одеть нижнюю половину.
Одеть верхнюю половину.
2.1. Нижнюю половину можно одеть в два этапа:
Надеть брюки.
Надеть носки и ботинки.
2.2. Верхнюю половину можно также одеть в два этапа:
Надеть рубашку.
Надеть куртку.
3. Окончательный проект выглядит так:
Надеть брюки.
Надеть носки.
Надеть ботинки.
Надеть рубашку.
Надеть куртку.
Метод нисходящего проектирования предполагает последовательное разложение общей функции обработки данных на простые функциональные элементы («сверху-вниз»). В результате строится иерархическая схема – функциональная структура алгоритма (ФСА), отражающая состав и взаимоподчиненность отдельных функций
Виды основных управляющих структур алгоритма приведены на рис. 1.
1. Структура типа «следование» (рис. 1, а) – образуется последовательностью действий, S1, S2, , Sn, следующих одно за другим:
выполнить S1;
выполнить S2;

выполнить Sn.
В линейном вычислительном процессе все операции выполняются последовательно в порядке их записи. Типовым примером такого процесса является стандартная вычислительная схема, состоящая из трех этапов:
ввод исходных данных;
вычисление по формулам;
вывод результата.
В языке Pascal такая структура заключается в операторные скобки Begin ... End:
Begin
S1;
S2;
...
Sn;
End

2. Структура типа «ветвление» (ЕСЛИ – ТО – ИНАЧЕ) (рис. 1, б) – обеспечивает в зависимости от результата проверки условия Р, принимающего одно из двух логических значении Да (True) или Нет (False), выбор одного из альтернативных путей работы алгоритма:
если Р
то выполнить S1
иначе выполнить S2.
Каждый из путей ведет к общему выходу, так что работа алгоритма будет продолжаться независимо от того, какой путь будет выбран.
В языке Pascal такая структура имеет следующий формат:
If P
Then S1
Else S2;
3. Структура типа «цикл с предусловием» (рис. 4, в) – обеспечивает многократное выполнение действия S в зависимости от того, какое значение принимает логическое условие Р:
до тех пор пока Р
выполнять S.
Выполнение цикла прекращается, когда условие Р не выполняется.
В языке Pascal такая структура имеет следующий формат:
While P Do
S;
В расширенный комплект элементарных алгоритмических структур дополнительно входят следующие управляющие конструкции (рис. 2).
4. Структура типа «сокращенное ветвление» (ЕСЛИ – ТО) (рис. 2, а) – если результат проверки условия Р принимает значение Да (True), то выполняется действие S; в противном случае это действие пропускается и управление передается следующей структуре:
если Р
то выполнить S1.
В языке Pascal такая структура имеет следующий формат:
If P
Then S;
5. Структура типа «выбор – иначе» (рис. 2, б) являются расширенным вариантом структуры типа ЕСЛИ – ТО – ИНАЧЕ. Здесь проверяемое условие Р может принимать не два логических значения, а несколько порядковых значений, например, 1, 2, , n. Если Р = i, то будет выполняться действие Si. Если же значение Р будет выходить из диапазона допустимых значений, то выполняется действие S (в укороченном варианте «выбор» никакого действия не производится и управление передается к следующей структуре. В языке Pascal такая структура имеет следующий формат:
Case P Of
1: S1;
2: S2;

n: Sn
Else S
End;

6. Структура типа «цикл с постусловием» (рис. 2, в) – обеспечивает многократное выполнение действия S до тех пор, пока не выполняется условие Р.
В языке Pascal такая структура имеет следующий формат:
Repeat
S
Until P;
7. Структура типа «цикл с параметром» (рис. 2, г) – обеспечивает заранее определенное многократное выполнение действия S. При этом здесь последовательно выполняются следующие типовые операции:
задание начального значения используемого параметра цикла (например, если переменной цикла является i, то ей присваивается значение i1, т.е. i:=i1);
выполнение действий S, предусмотренных в теле цикла;
изменение параметра цикла, который обеспечивает вычисление результата с новыми начальными данными (например, если параметр цикла i изменяется с шагом i3, i:=i( i3);
проверка текущего значения параметра цикла с заданным конечным значением (i<=i2);
переход к повторению тела цикла, если параметр цикла не превысил конечного значения, иначе выполнение следующих действий или вывод результата.
В языке Pascal такая структура имеет следующий формат:
For Переменная:=i1 To (Downto) i3 Do
S;
Рассматривая схему программы, можно выделить в ней части (фрагменты), достаточно простые и понятные по структуре. Представление этих фрагментов укрупненными блоками существенно облегчает восприятие алгоритма (а в дальнейшем и программы) в целом.
Структурные операторы обычно применяются уже на ранних стадиях нисходящего проектирования программы.
Таким образом, структурное программирование основано на модульной структуре программного продукта и типовых (базовых) управляющих структурах алгоритмов обработки данных различных программных модулей.

Пример 2. Необходимо составить алгоритм нахождения значений функции:

при с = 2; а = 3,14 и значениях х = -3; -1.5; 0; 1.5; 3.
Решение. В данном примере х меняется от начального значение -3 до конечного значения +3 с шагом +1.5. Поэтому, если используется цикл с предусловием, то следует вначале присвоить x := -3, затем в теле цикла изменять текущее значение х на x := х + 1.5, а в предусловии проверять х
· 3. Как только это условие прекратит выполняться, следует выйти из цикла.
Схема алгоритма поставленной задачи показана на рис. 3.
Блоки 2-4 образуют линейную структуру (структуру следования). В этих блоках осуществляются действия, связанные с присвоением числовых значений переменным а, с и х. Причем х присваивается начальное значение -3.0, так как значение этой переменной будет циклически изменяться.
В блоке 5 проверяется условие окончания цикла по х. Если окажется, что условие x
· 3 не выполняется, то будет осуществлен выход из цикла и процесс вычислений закончится (управление передается на блок 14, означающий конец вычислений).
При выполнении условия x
· 3 осуществляется вход в тело цикла.
В блоке 6 вычисляется вспомогательная переменная z = c2 – x (она введена для того, чтобы не вычислять многократно выражение c2 – x).
Блоки 7 и 8 обеспечивают проверку заданных условий и в зависимости от того, выполняются они или нет, в блоках 9-11 осуществляется вычисление значения функции y по соответствующей формуле.
Блок 12 предназначен для обозначения вывода результатов: выводится текущее значение х и соответствующее ему значение y.
В блоке 13 осуществляется изменение значения переменной цикла х: к текущему значению прибавляется шаг изменения (в данном примере это 1.5). После этого действия управление передается к блоку 5 и цикл вновь повторяется, но с новым значением х.

Рис. 3. Схема алгоритма, использующая типовые (базовые) управляющие структуры
2. РАЗРАБОТКА АЛГОРИТМА МЕТОДОМ ПОШАГОВОЙ ДЕТАЛИЗАЦИИ
Для разработки алгоритмов программ часто используют метод пошаговой детализации. С использованием данного метода разработку алгоритмов выполняют поэтапно. На первом этапе описывают решение поставленной задачи, выделяя подзадачи и считая их решенными. На следующем – аналогично описывают решение подзадач, формулируя уже подзадачи следующего уровня. Процесс продолжают до тех пор, пока не дойдут до подзадач, алгоритмы решения которых очевидны. При этом, описывая решение каждой задачи, желательно использовать не более одной-двух конструкций, таких как цикл или ветвление, чтобы четче представлять структуру программы.
Пример 3. Разработать программу, которая с заданной точностью ( находит значение аргумента х по заданному значению функции у при известном значении n

где n > 1, х > 0.
Решение. При n > 1 данная функция является монотонно возрастающей. Для нахождения значения х можно применить метод половинного деления, суть которого заключается в следующем. Вначале определяют отрезок [x1, х2] такой, что f(x1)
· у
· f(x2). Затем делят его пополам xt = (x1 + х2)/2 и определяют, в какой половине отрезка находится х, для чего сравнивают f(xt) и у. Полученный отрезок опять делят пополам и так до тех пор, пока разность x1 и x2 не станет меньше заданного значения (.
Для разработки алгоритма программы используем метод пошаговой детализации. Будем представлять алгоритмы псевдокодом и в виде блок-схем.
Шаг 1. Определяем общую структуру программы.

Программа
Ввести у, n, (
Определить х
Вывести х, у
Конец.


Шаг 2. Детализируем операцию определения х.
Определить х
Определить x1 такое, что f(x1)
· у
Определить х2 такое, что f(x2)
· у
Определить х на интервале [x1, х2]
Все



Шаг 3. Детализируем операцию определения x1.

Значение x1 должно быть подобрано так, чтобы выполнялось условие f(x1)
· у. Известно, что х > 0, следовательно, можно взять некоторое значение х, например, x1 = 1, и последовательно уменьшая его, например в два раза, определить значение x1, удовлетворяющее данному условию.
Определить x1
x1 := 1
цикл-пока f(x1) > у
x1 := x1/2
все-цикл
Все










Шаг 4. Детализируем операцию определения х2.
Значение х2 определяем аналогично x1, но исходное значение будем увеличивать в два раза.
Определить x2
x1 := 1
цикл-пока f(x2) < у
x1 := x1*2
все-цикл
Все


Шаг 5. Детализируем операцию определения х.
Определение х выполняется последовательным сокращением отрезка [x1, х2].
Определить x
цикл-пока x2 – x1 > (
Сократить отрезок [x1, х2]
все-цикл
Все











Шаг 6. Детализируем операцию сокращения интервала определения х.
Сокращение отрезка достигается делением пополам и отбрасыванием половины, не удовлетворяющей условию f(x1)
· у
· f(x2).
Сократить интервал определения х:
xt := (x1 + х2)/2
если f(xt) > у
то х2 := xt
иначе x1 := xt
все-если
Все


Таким образом, за шесть шагов разработан весь алгоритм, который выглядит следующим образом.
Программа:
Ввести у, n, eps
x1 := 1
цикл-пока f(x1) > у
x1 := x1/2
все-цикл
х2 := 1
цикл-пока f(x2) < у
х2 := х2*2
все-цикл
цикл-пока x2 – x1 > eps
xt := (x1 + х2)/2
если f(xt) > у
то х2 := xt
иначе x1 := xt
все-если
все-цикл
Вывести xt, у
Конец.







Таким образом, на каждом шаге решается одна достаточно простая задача, что существенно облегчает разработку алгоритма и является основным достоинством метода пошаговой детализации.
При разработке алгоритма методом пошаговой детализации мы использовали псевдокод, но можно было использовать и схемы алгоритма, в которых решение каждой подзадачи обозначено блоком «предопределенный процесс».

Вопросы для закрепления теоретического материала к практическому занятию:
Какие существуют методы структурного программирования?
Какие цели преследует структурное программирование?
Какие цели преследует структурное программирование?
На каких принципах реализуется структурное программирование?
В чем заключается идея нисходящего проектирования алгоритма?
Что такое модульное программирование и какими свойствами должны обладать модули?
В чем заключается смысл структурного кодирования? Какие элементарные структуры образуют функционально-полную систему? Как они работают?
Какие дополнительные элементарные структуры используются в структурном кодировании? Как они работают?

Задания для практического занятия:

Выполнить задания 1-3.
Подготовить отчет.

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

Задания для самостоятельного выполнения:
Задание № 1. Методом нисходящего проектирования составьте алгоритм проекта написания реферата.
Задание № 2. Используя базовые элементарные структуры, составьте алгоритм нахождения значений функции:

при a = 3 и х = 2; 2.5; 3; 3.5; 4.
Задание 3. Разработайте алгоритм программы, определяющей первые 10 чисел последовательности Фибоначчи, которая формируется следующим образом:
F1 = F2 = 1, Fn = Fn–1 + Fn–2, где n > 2.
Алгоритм представьте в виде схемы и запишите псевдокодом.

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

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

Разработать алгоритмы в соответствии с заданием.
Предоставить преподавателю алгоритм решения в виде блок-схем.







Название практической работы 2:
Разработка ПО при объектно-ориентированном подходе к программированию.

Учебная цель: cформировать умение разработки программного обеспечения при объектно-ориентированном подходе.

Учебные задачи:
Овладеть практическими навыками выполнения объектной декомпозиции элементов системы
Отработать методику построения объектной модели системы.
Образовательные результаты, заявленные во ФГОС третьего поколения:
Студент должен
уметь:
- осуществлять разработку кода программного модуля на современных языках программирования;
- создавать программу по разработанному алгоритму как отдельный модуль;
- выполнять отладку и тестирование программы на уровне модуля;
знать:
- основные этапы разработки программного обеспечения;
- основные принципы технологии объектно-ориентированного программирования;
- основные принципы отладки и тестирования программных продуктов

Задачи практической работы:

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

Обеспеченность занятия (средства обучения):

Учебно-методическая литература:
- Архангельский А. Я.. Программирование в C++ Builder.  Бином-Пресс, 2010;
Хорев П.Б. Объектно-ориентированное программирование (4-е изд., стер.) учеб. Пособие. Издательский центр «Академия», 2012.
Справочная литература:
Справочный материал по компонентам среда разработки C++ Builder .
Технические средства обучения: ПК.
Программное обеспечение: C++ Builder.

Краткие теоретические и учебно-методические материалы по теме практической работы
Объектная декомпозиция
При использовании технологии ООП решение представляется в виде результата взаимодействия отдельных элементов некоторой системы, имитирующей процессы, происходящие в предметной области поставленной задачи. Каждый элемент системы, получая сообщение, выполняет заранее определенную последовательность действий (например, обрабатывает полученные данные, изменяет свое состояние, пересылает полученные данные другому элементу системы). Передавая сообщения от одного элемента системы к другому, система выполняет поставленную перед ней задачу.
Элементы системы, параметры и поведение которой определяются условием задачи, обладающие самостоятельным поведением (т. е. «умеющие» выполнять некоторые действия, зависящие от полученных сообщений и состояния элемента), получили название объектов.
Процесс представления предметной области в виде совокупности объектов, обменивающихся сообщениями, называется объектной декомпозицией.
Пример 1. Выполните объектную декомпозицию программы, которая по запросу пользователя рисует точку, окружность или квадрат.
Решение
По правилам объектной декомпозиции разрабатывается имитационная модель программы. Для этого необходимо проанализировать все происходящие в системе процессы и выделить элементы, обладающие собственным поведением, воздействующие на другие элементы и/или являющиеся объектами такого воздействия.
Основная цель системы нарисовать фигуру, выбранную пользователем. Действия пользователя это либо выбор фигуры, либо изменение параметров фигуры (цвет, размер, координаты), либо команда нарисовать выбранную фигуру с заданными параметрами. Для выполнения этих команд можно воспользоваться следующими объектами: Менеджер (получает, анализирует и обрабатывает команды пользователя) и три объекта фигуры (каждая со своими параметрами). Фигуры получают следующие сообщения: нарисовать, изменить цвет контура, изменить размер, изменить координаты.
Все эти сообщения инициируются Менеджером в соответствии с командой пользователя. Получив от пользователя команду Завершить, Менеджер прекращает выполнение программы.

Пример 2. Выполните объектную декомпозицию системы «Телефонный справочник».
Решение:
Опишем назначение системы. В системе хранятся данные о родственниках, друзьях, знакомых или коллегах по работе:
фамилия, имя, отчество, дата рождения, адрес, домашний телефон, характер знакомства, место работы, должность, рабочий телефон. Система при запуске выдает информацию о тех людях, чей день рождения приходится на текущую дату, осуществляет поиск данных по произвольному формату, позволяет добавлять, редактировать, удалять записи.
Для выполнения выделенных задач можно воспользоваться следующими объектами: Менеджер (получает, анализирует и обрабатывает команды пользователя), Поисковик (осуществляет поиск записей по определенным данным), ОбработатьЗапись (добавляет, редактирует, удаляет запись), Файл (для хранения записей, получает сообщения от объектов Поисковик, ОбработатьЗапись), ОткрытиеФайла (отвечает за существование файла, если файл не существует, то он создается).

В объектно-ориентированном программировании разрабатываемая система состоит из объектов, которые взаимодействуют через передачу сообщений.

Вопросы для закрепления теоретического материала к практическому занятию:

1. В чем состоит концептуальное отличие структурного программирования от объектно-ориентированного программирования?
2. Что такое класс? Объясните различие терминов класс и объект.
3. Перечислите этапы объектной декомпозиции.
4. Что такое полиморфизм? Приведите пример, демонстрирующий
необходимость определения полиморфного метода.
5. В чем сходство и отличие методов, описанных как виртуальные и
динамические?
6. Для чего используются абстрактные методы?

Задания для практического занятия:

Рассмотреть примеры 1-2.
Разработать объектную модель в соответствии с заданием.

Инструкция по выполнению практической работы
Выполнить задания в тетради.
Задания для самостоятельного выполнения:
Составьте объектную модель для автоматизации работы библиотеки.
Составьте объектную модель телефонного справочника.
Составьте объектную модель «Процессор», эмулирующую работу процессора ЭВМ.
Составьте объектную модель известной игры «Жизнь», придуманной Дж. Г. Конуэем. Игра моделирует жизнь гипотетической колонии живых клеток.
Клетки рождаются, выживают и погибают по определенным правилам.
Все поле жизни клеток представляет собой квадратную решетку, каждая ячейка которой может вмещать одну клетку.
Соседями клетки считаются все клетки, находящиеся в восьми ячейках, расположенных с данной по горизонтали, вертикали и диагонали.
Если у клетки меньше двух соседей, то она погибает от одиночества.
Если у клетки больше трех соседей, то она погибает от перенаселения.
Если рядом с пустой ячейкой окажутся ровно три соседние клетки, то в этой ячейке рождается новая клетка.
Гибель и рождение клеток происходит в момент смены поколений.
Исходными данными служит начальное расположение клеток.
Составьте объектную модель, демонстрирующую поведение системы «Солнце Земля Луна».
Составьте объектную модель, демонстрирующую строение и функционирование Солнечной системы.

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

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

Предоставить преподавателю объектную модель в тетради.
.


Название практической работы 3:
Работа с инструментальными средствами автоматизации оформления документации.
Учебная цель: сформировать умение разрабатывать приложения с линейным вычислительным процессом в среде С++Builder.

Учебные задачи:
1. Закрепить практические навыки разработки приложений с использованием стандартных компонентов.
3. Овладеть практическими навыками разработки приложения, реализующие линейные алгоритмы.
4. Написать и отладить программу линейного алгоритма в оконном приложении.

Образовательные результаты, заявленные во ФГОС третьего поколения:
Студент должен
уметь:
- осуществлять разработку кода программного модуля на современных языках программирования;
- создавать программу по разработанному алгоритму как отдельный модуль;
- выполнять отладку и тестирование программы на уровне модуля;
знать:
- основные этапы разработки программного обеспечения;
- основные принципы технологии объектно-ориентированного программирования;
- основные принципы отладки и тестирования программных продуктов

Задачи практической работы:
Повторить теоретический материал по теме практической работы.
Ответить на вопросы для закрепления теоретического материала.
Разработать простейшие приложения.
Оформить отчет.

Обеспеченность занятия (средства обучения):
Учебно-методическая литература:
- Архангельский А. Я.. Программирование в C++ Builder.  Бином-Пресс, 2010;
Хорев П.Б. Объектно-ориентированное программирование (4-е изд., стер.) учеб. Пособие. Издательский центр «Академия», 2012.
Справочная литература:
Справочный материал по компонентам среда разработки C++ Builder .
Технические средства обучения: ПК.
Программное обеспечение: C++ Builder.
Раздаточные материалы (карточки-задания, инструкционные карты, образцы, заготовки; указать, сколько).

Краткие теоретические и учебно-методические материалы по теме практической работы
Компонента Memo - для вывода результатов работы программы используется окно многострочного редактора текста, После установки с помощью инспектора свойства ScrollBars – SSBoth в окне появятся вертикальная и горизонтальная полосы прокрутки.
Для очистки окна используется метод Memo1–>Clear( ).
Для добавления новой строки используется метод Memo1–>Lines–>Add( ).
Если нужно вывести числовое значение, то его надо преобразовать к типу AnsiString и добавить в массив Memo1–>Lines, например, вывести int u = 100;
double w = –256.38666;
в результате записей
Memo1–>Lines–>Add (“ Значение u = ”+IntToStr(u));
Memo1–>Lines–>Add (“ Значение w = ”+FloatToStrF(w,ffFixed,8,2));
появятся строки
Значение u = 100
Значение w = –256.39
При этом под все число отводится восемь позиций, из которых две позиции занимает его дробная часть.
Если выводимая информация превышает размер окна Memo1, то для просмотра используются полосы прокрутки.
Обработка событий: программа в среде Builder представляет собой набор функций, выполняющих обработку событий, связанных с формой, например, щелчок кнопкой мыши – событие OnClick, создание формы – событие OnCreate.
Функция-обработчик FormCreate возникает при запуске программы событие «создание формы» (OnCreate).

Вопросы для закрепления теоретического материала к практическому занятию:
Все ли компоненты видимы во время разработки и выполнения программы?
Назовите один невизуальный компонент VCL.
Существуют ли свойства, общие для всех компонентов?
Назовите два свойства, общих для всех визуальных компонентов.
Возможно ли использование одного обработчика событий двумя или более компонентами?
Можно ли изменять свойство Name компонента во время выполнения программы?
Какое свойство используется для того, чтобы разрешить или запретить доступ к компоненту?
Как можно во время выполнения программы сообщить пользователю, что доступ к кнопке запрещен?
Какой компонент обычно используется в качестве контейнера для других компонентов?
Опишите назначение и перечислите основные свойства компонента Memo.
Опишите назначение и порядок использования свойства Lines компонента Memo.

Задания для практического занятия:

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

Инструкция по выполнению практической работы

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

Разработать приложение из упражнения 1 и выполнить самостоятельное задание.
Предоставить преподавателю работающие версии приложений.
Название практической работы 4:
Разработка простейших программ в среде программирования Borland C++ Builder.
Учебная цель: приобретение практических навыков разработки простейших программ в среде программирования Borland C++ Builder.

Учебные задачи:
Овладеть практическими навыками работы в среде программирования Borland C++ Builder.
Овладеть практическими навыками разработки простейших программ в среде программирования Borland C++ Builder.

Образовательные результаты, заявленные во ФГОС третьего поколения:
Студент должен
уметь:
- осуществлять разработку кода программного модуля на современных языках программирования;
- создавать программу по разработанному алгоритму как отдельный модуль;
- выполнять отладку и тестирование программы на уровне модуля;
знать:
- основные этапы разработки программного обеспечения;
- основные принципы технологии объектно-ориентированного программирования;
- основные принципы отладки и тестирования программных продуктов

Задачи практической работы:

Повторить теоретический материал по теме практической работы.
Ответить на вопросы для закрепления теоретического материала.
Разработать простейшие программы.
Оформить отчет.

Обеспеченность занятия (средства обучения):

Учебно-методическая литература:
- Архангельский А. Я.. Программирование в C++ Builder.  Бином-Пресс, 2010;
Хорев П.Б. Объектно-ориентированное программирование (4-е изд., стер.) учеб. Пособие. Издательский центр «Академия», 2012.
Справочная литература:
Справочный материал по компонентам среда разработки C++ Builder .
Технические средства обучения: ПК.
Программное обеспечение: C++ Builder.
Раздаточные материалы (карточки-задания, инструкционные карты, образцы, заготовки; указать, сколько).


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

Теоретический материал
Основные сведения о языке C++. Язык C++ является универсальным языком программирования, в дополнение к которому разработан набор разнообразных библиотек. Поэтому он позволяет решить практически любую задачу программирования.
Язык программирования C++(читается «си плюс плюс») был разработан на основе языка C(Си) Бьярном Страуструпом в 1972 году. На первых этапах разработки язык носил условное название «Си с классами», а позже Рик Маскитти придумал название «C++», что образно отразило происхождение этого нового языка от языка C. Язык C++ является расширением языка C, поэтому программы, написанные на языке C, могут обрабатываться компилятором языка C++. Язык C++ был создан, чтобы улучшить язык C, поддержать абстракцию данных и обеспечить объектно-ориентированное программирование (ООП).
С++ – это язык программирования общего назначения, хорошо известный своей эффективностью, экономичностью, и переносимостью. Указанные преимущества C++ обеспечивают хорошее качество разработки почти любого вида программного продукта. Использование C++ в качестве инструментального языка позволяет получать быстрые и компактные программы. Во многих случаях программы, написанные на C++, сравнимы по скорости с программами, написанными на языке Ассемблера.
Основные элементы среды разработки Borland C++ Builder. Программный продукт Borland C++ Builder является не просто компилятором языка C++, а представляет интегрированную среду разработки. Это означает, что в Borland C++ Builder средства редактирования исходных текстов программ, их компиляции и отладки объединены в одну программу.
При запуске среды Borland C++ Builder на экране можно увидеть примерно следующее (рис. 1.1)

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

Инструкция по выполнению практической работы
При запуске среда Borland C++ Builder автоматически создает заготовку приложения с графическим интерфейсом. При выполнении лабораторных и практических работ потребуется заготовка текстового или консольного приложения. Для того чтобы создать такую заготовку необходимо:
1. Выбрать пункт меню File->New->Other(Файл-Создать-Другие). При этом на экране появится окно New Items (Новые элементы), содержащее несколько вкладок. На каждой из вкладок находится группа элементов, пред- назначенных для создания того или иного компонента приложения Borland C++ Builder (рис. 1.2).

2. Выбрать на этой вкладке элемент Console Wizard (Мастер консоли). Этот элемент запускает мастер создания заготовки консольного приложения.
Мастер Console Wizard (Мастер консоли) состоит из одного окна (рис. 1.3). Borland C++ Builder позволяет создавать консольные приложения как на C, так и на C++. Наше первое приложение, как и все последующие, будет написано на языке C++, поэтому в группе Source Type (Тип исходного текста) выберите переключатель C++. Сбросьте флажки Use VCL (Использовать VCL) и Multi Threaded (Многопоточный).
Флажок Specify project source (Указать исходный файл проекта) мастера Console Wizard (Мастер консоли) может быть очень полезен, так как позволяет создать проект консольного приложения на основе имеющегося текста программы на языке C или C++.

3. Щелкните на кнопке ОК. Теперь окно редактора форм исчезло, и мы видим на экране окно редактора кода (рис. 4), в котором уже присутствует заготовка консольного приложения на языке C++.

Необходимо удалить текст из окна редактора кода и ввести текст, представленный в листинге 1.1.
Листинг 1.1
#include
#include
int main() {
cout << “Hello, world!” << endl;
cout << “Press any key to stop the program”;
getch();
return 0; }
Это и есть наша первая программа на языке C++ в среде С++Builder. По традиции она выводит на экран надпись «Hello, World!» (Здравствуй, Мир!). Далее программа поясняет, что для ее завершения необходимо нажать какую-либо клавишу на клавиатуре.
4. Запустите программу на выполнение. Для этого можно воспользоваться командой меню Run->Run (Выполнить->Выполнить), соответствующей кнопкой на панели быстрого доступа или клавишей F9. Если вы все сделали правильно, на экране появится окно с соответствующими надписями. Чтобы закрыть это окно, нажмите любую клавишу на клавиатуре (рис. 1.5).
После того как программа завершилась, вы можете запустить ее еще раз тем же способом. Если между запусками в текст программы не были внесены изменения, то, запуская программу повторно, вы обнаружите, что запуск выполняется быстрее. Это происходит потому, что при первом запуске Borland C++ Builder должен скомпилировать программу, то есть преобразовать ее исходный текст в исполнимый машинный код.
5. Созданную нами программу необходимо сохранить. Проще всего сделать это с помощью команды меню File->Save All... (Файл->Сохранить все). Эта команда выведет несколько диалоговых окон для сохранения раз-личных файлов нашей программы. На первый взгляд это может показаться странным, ведь наша программа состоит только из одного файла. Но дело в том, что Borland C++ Builder создан для разработки сложных программ, которые состоят из множества файлов. Совокупность всех файлов, составляющих программу C++ Builder, называется проектом C++ Builder. Для управления проектами служат специальные файлы проектов Borland C++ Builder (эти файлы имеют расширение bpr). Файлы проектов представляют программу C++ Builder в целом. Открывать ранее сохраненную программу нужно именно с помощью bpr-файла. Если вы откроете каталог, в котором сохранили проект C++ Builder, то увидите, что кроме файлов с расширениями cpp и bpr в этом каталоге сохранены еще несколько файлов (с расширениями h, hpp, res, tds, bpf). Все эти файлы также являются частью проекта.

Задания для практического занятия:

Выполнить задания практической работы.
Подготовить отчет.

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

Порядок выполнения отчета по практической работе
Разработать программы с заданием.
Предоставить преподавателю работающие версии программ.
Название практической работы 5:
Программирование линейных алгоритмов

Учебная цель: закрепить умения разработки программ в интегрированной среде программирования (ИСП) и приобрести навыки составления линейных алгоритмов.

Учебные задачи:
Овладеть навыками разработки текста программы на языке программирования C++.
Овладеть навыками и ввода/редактирования текста программы, компилирования и запуска программы на выполнение.
Овладеть навыками отладки программы;
Овладеть навыками написания текста программы по схеме алгоритма, и, наоборот, по тексту программы составить схему её алгоритма

Образовательные результаты, заявленные во ФГОС третьего поколения:
Студент должен
уметь:
- осуществлять разработку кода программного модуля на современных языках программирования;
- создавать программу по разработанному алгоритму как отдельный модуль;
- выполнять отладку и тестирование программы на уровне модуля;
знать:
- основные этапы разработки программного обеспечения;
- основные принципы технологии объектно-ориентированного программирования;
- основные принципы отладки и тестирования программных продуктов

Задачи практической работы:
Повторить теоретический материал по теме практической работы.
Ответить на вопросы для закрепления теоретического материала.
Разработать программы с использованием линейных алгоритмов.
Оформить отчет.

Обеспеченность занятия (средства обучения):
Учебно-методическая литература:
- Архангельский А. Я.. Программирование в C++ Builder.  Бином-Пресс, 2010;
Хорев П.Б. Объектно-ориентированное программирование (4-е изд., стер.) учеб. Пособие. Издательский центр «Академия», 2012.
Справочная литература:
Справочный материал по компонентам среда разработки C++ Builder .
Технические средства обучения: ПК.
Программное обеспечение: C++ Builder.
Раздаточные материалы (карточки-задания, инструкционные карты, образцы, заготовки; указать, сколько).

Краткие теоретические и учебно-методические материалы по теме практической работы
Основы языка С++
Приступая к составлению программ, следует помнить следующее:
1) программа должна оформляться в соответствии со структурой языка программированияС++ (табл. 1);
2) программа должна иметь начало и конец, обозначенные операторным блоком { };
3) каждая переменная программы должна быть объявлена в начале программы с указанием её типа. Переменная может быть инициализирована некоторым значением. В имени переменной могут использоваться цифры и буквы латинского алфавита. Базовые типы данных даны в табл. 2;
4) все арифметические выражения состоят из операндов, которые должны расписываться в одну строчку. Если в формуле имеется дробь, то числитель и знаменатель указывается в круглых скобках. Основные операции, применяемые в выражениях, представлены табл. 3.
Операция % выполняется только с целыми числами, и результатом вычисления является целое число.
В языке С++ операции инкремента (++) и декремента (––) могут появляться перед или после своего операнда. Когда операция является префиксом своего операнда, то операнд инкрементируется или декрементируется и его новое значение является результатом вычисления выражения. Когда операция является постфиксом своего операнда, то непосредственным результатом выражения является значение операнда перед его инкрементированием или декрементированием. После этого результат используется в контексте, а операнд инкрементируется или декрементируется;
5) вычисления в выражениях выполняются в соответствии с приоритетом операций, распределенных по категориям (табл. 4);
6) каждый оператор должен заканчиваться символом « ; » - признаком окончания действия;
7) для ввода и вывода информации используются специальные функции (табл. 5). После вывода информации курсор устанавливается в этой же строке. Если есть необходимость переслать курсор на начало следующей строки, то используются вС++ – специальные управляющие символы «\n» и «endl»;
8) в составе транслятора среды программирования имеются стандартные функции, применяемые при вычислениях. Основные, наиболее часто используемые функции представлены табл. 6. Необходимо обращать внимание на подключаемые библиотечные модули, содержащие стандартные функции.
Таблица1 – Структура программы
Назначение
Структура

Директивы препроцессора


Раздел объявлений и соглашений





Раздел описания процедур и функций




Основная программа
# include < Имя библиотеки>
# define Имя Макрос

label Номер метки;
const Имя константы = Значение константы;
Имя типа переменной Список имен переменных;

functionИмя функции (входные и выходные данные)
{
Тело функции
}

main( )
{ Тело программы }


Таблица 12 – Типы данных и диапазон представления чисел


Диапазон
Тип

целые числа
0255
unschar


-128127
char


-3276832767
int, short


065535
unsshort


-21474836482147483647
long


04294967295
unslong

вещественные числа
3,4Е-383,4Е38
float


1,7Е-3081,7Е308
double


3,4Е-49321,1Е4932
longdouble


Таблица3 – Операции

Назначение
Операция

аддитивные
арифметические
+, –

мультипликативные

*, /


остаток от деления
%

отношений
равно
==


не равно
!=


больше
>


меньше
<


больше или равно
>=


меньше или равно
<=

логические
и
&&


или
||


отрицание
!

присваивания
простое присваивание
=


сложение с присваиванием
+=


вычитание с присваиванием
–=


умножение с присваиванием
*=


деление с присваиванием
/=


остаток от деления с присваиванием
%=


унарный инкремент
++


унарный декремент
– –


Таблица4 – Приоритет выполнения операций

Операция
Приоритет
Категория

!, ++, – –
Первый
Унарные

*, /, %, &&
Второй
Мультипликативные

+, –, ||
Третий
Аддитивные

==, !=, <, >, <=, >=
Четвертый
Отношения

=, *=, /=, %=, +=, –=
Низший
Простое и составное


Таблица5 – Функции и процедуры ввода и вывода


Спецификаторы форматов и управляющие символы
Функции

Ввод
Библиотека: stdio.h
%d, %i – целые
%f – вещественные
%с – символьные
%s – строковые
scanf(“специф“, & идентификатор);
например,
scanf(“%d%f”, &a, &b);
scanf (“%c”, &ch);
scanf (“%s”, st);


Библиотека: iostream.h
cin>>идентификатор;
например,
cin>>a; cin>>b>>ch; cin>>st;

Вывод
Библиотека: stdio.h
%d, %i – целые
%f – вещественные
%с – символьные
%s – строковые
\n – перевод строки
printf (“текст специф“, идентиф);
например,
printf (“Значение а= %d\n”, a);
printf (“а= %d\n и b= %f\n ”, a, b);
printf (“\n символ= %c \n ”, ch);
printf (“ строка: %s \n ”, st);


Библиотека: iostream.h
\n и endl– перевод строки
cout<<текст<<идентификатор;
например,
cout<<”Значение a=”<cout<<” a=”<cout<<”символ: ”<cout<<”строка: ”<

Таблица6 – Часто используемые стандартные функции

Назначение
Функция

абсолютное значение по модулю
abs (int x), fabs(double x),
labs( longint x)

тригонометрические функции (в радианах)
double cos (double x)
double sin (double x)
double atan(double x)
double tan (double x)

экспонента числа – expx
doubleexp(double x)

вычисляет остаток от числа
double fmod(double x, double y)

вычисляет целую часть от числа
struct div ( int x; int y)

натуральный логарифм числа
doublelog(double x)

десятичный логарифм
double log10 (double x)

квадрат числа
doublesqr(double x)

квадратный корень числа
doublesqrt(double x)

вычисляет число x в степени y
double pow (double x, double y)

возвращает случайное число в диапазоне 0x;
intrand ()

округляет число до целого
doublefloor(double x)

Вопросы для закрепления теоретического материала к практическому занятию:
1. В чем особенности формализованного языка?
2. Что понимают под вычислительным алгоритмом?
3. Какие требования предъявляются к алгоритмам?
4. В чём суть основных этапов подготовки и компьютерного решения задач?
5. Общие правила построения программ.
6. Как получают исполняемую программу?
7. Какие операции можно выполнять над величинами целого типа? Укажите приоритет их выполнения при расчете значения арифметического выражения.
8. Как определить остаток от деления одной величины целого типа на другую?
9. Как оформляется оператор вывода результатов на экран? Что можно указывать в качестве элементов списка вывода? Какой символ используется для разделения элементов списка вывода? Как должен быть оформлен оператор вывода, чтобы информация выводилась на экран с новой строки?
10. Как оформляется оператор ввода? Что можно указывать в качестве элементов списка ввода? Как работает оператор ввода (что происходит при его выполнении)?
11. Как оформляется оператор присваивания? Как он работает (что происходит при его выполнении)?
12. Как проверить, правильно ли работает программа, в которой проводятся какие-то вычисления?


Задания для практического занятия:
Разобрать пример 1.
Разработать по индивидуальному заданию алгоритм решения и программу
Подготовить отчет.

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

Задания для самостоятельного выполнения:
Рассмотрите пример 1.
Пример 1. Дано двухзначное целое число b. Найти сумму его цифр.
Текстуальная форма алгоритма задачи.
1. Ввести число b с клавиатуры в ЭВМ.
2. Для выделения первой цифры воспользуемся известным в математике способом деления числа b на 10, и возьмем целое число от этого деления.
3. Для выделения второй цифры разделим число b на 10, и возьмем дробную часть от этого деления.
4. Найдем сумму найденных цифр.
5. Полученный результат выдать на экран дисплея.
Графическая форма представления алгоритма дана в виде схемы (рис. 1), использующей блоки для обозначения каждого действия и приведен текст программы.






























Рисунок 1 – Схема алгоритма к примеру 1

#include
#include
#include
main ()
{ int b, x, y, z;
cout<<" Введите целое число : " ; cin>>b ;
x = b%10; // остаток от деления b на 10,
cout<<" 2-я цифра числа "<< b << " равна " << x <y = b/10 ; // целую часть и
cout<<" 1-я цифра числа "<< b << " равна " << y <z = x + y ;
cout<<" Сумма цифр числа "<< b << " равна " << z <getch();
}
Варианты заданий
Задание. Составить алгоритм, написать программу на языке программированияС++, отладить программу на ПК. Написать тест программы. Все результаты предъявить преподавателю. Подготовить ответы на контрольные вопросы.
1. Дано трехзначное число. Найти число, полученное при прочтении его цифр справа налево.
2. Дано натуральное число n (n>9). Найти число единиц в нем.
3. Дано трехзначное число. Найти сумму его крайних цифр.
4. Дано четырехзначное число. Найти произведение и сумму второй и последней цифр заданного числа.
5. Даны два целых числа. Разделить каждое число на целое число d. Найти произведение их остатков от деления.
6. Даны два целых числа. Переменой d присвоить результат деления первого числа на второе число, а переменой f присвоить результат деления второго числа на первое число. Найти произведение их остатков от деления.
7. Дано четырехзначное число. Найти сумму и произведение его цифр.
8. Дано натуральное число n (n>99). Найти число десятков в нем.
9. Даны два целых числа. Разделить каждое число на целое число d. Найти сумму их целой части от деления.
10. Дано трехзначное число. Найти число, полученное при перестановке первой и последней цифр заданного числа.
11. Дано четырехзначное число. Найти сумму и произведение второй и третьей цифр заданного числа.
12. Дано трехзначное число. Найти число, полученное при перестановке первой и второй цифр заданного числа.
13. Дано трехзначное число. Переставить местами вторую и третью цифры в числе.
14. Дано четырехзначное число. Найти сумму первых цифр и произведение двух последних цифр в числе.
15. Даны два целых двухзначных числа. Переставить местами последние цифры чисел. Например, даны числа 25 и 48, после перестановки получится 28 и 45.



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

Порядок выполнения отчета по практической работе
Разработать алгоритмы и программы в соответствии с заданием.
Предоставить преподавателю отчет .

Содержание отчета
1. Тема, цель, ФИО, вариант.
2. Постановка задачи.
3. Необходимые математические выкладки (и/или поясняющую картинку).
4. Алгоритм решения задачи (в виде блок-схемы или в текстуальной форме).
5. Тексты программы.
6. Тестовые наборы (тест – это проверка работоспособности программы по контрольным значениям данных).
7. Результаты вычислений по каждому тесту.
Отчет для практической работы составляется в одном экземпляре и подлежит защите. Для защиты практической работы студент должен подготовиться к ответу на контрольные вопросы.

Название практической работы 6:
Решение задач с использованием ветвлений
Учебная цель: овладеть умениями использования условных операторов if
и switch.

Учебные задачи:
Овладеть практическими навыками применения использования условных операторов if и switch при разработке программ.

Образовательные результаты, заявленные во ФГОС третьего поколения:
Студент должен
уметь:
- осуществлять разработку кода программного модуля на современных языках программирования;
- создавать программу по разработанному алгоритму как отдельный модуль;
- выполнять отладку и тестирование программы на уровне модуля;
знать:
- основные этапы разработки программного обеспечения;
- основные принципы технологии объектно-ориентированного программирования;
- основные принципы отладки и тестирования программных продуктов

Задачи практической работы:

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

Обеспеченность занятия (средства обучения):

Учебно-методическая литература:
- Архангельский А. Я.. Программирование в C++ Builder.  Бином-Пресс, 2010;
Хорев П.Б. Объектно-ориентированное программирование (4-е изд., стер.) учеб. Пособие. Издательский центр «Академия», 2012.
Справочная литература:
Справочный материал по компонентам среда разработки C++ Builder .
Технические средства обучения: ПК.
Программное обеспечение: C++ Builder.
Раздаточные материалы (карточки-задания, инструкционные карты, образцы, заготовки; указать, сколько).


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

Условные операторы if и switch
Для того чтобы иметь возможность реализовать логику в программе используются условные операторы. Умозрительно эти операторы можно представить в виде узловых пунктов, достигая которых программа делает выбор по какому из возможных направлений двигаться дальше. Например, требуется определить, содержит ли некоторая переменная arg положительное или отрицательное число и вывести соответствующее сообщение на экран. Для этого можно воспользоваться оператором if (если), который и выполняет подобные проверки. В самом простом случае синтаксис данного оператора if следующий:
if (выражение) <оператор>
Если значение параметра «выражение» равно «истинно», выполняется оператор, иначе он пропускается программой. Следует отметить, что «выражение» является условным выражением, в котором выполняется проверка некоторого условия.
В табл. 2 представлены варианты простых логических выражений оператора if.
Таблица 2. Простые логические выражения
if(a < b)
Истинно, если переменная a меньше переменной b и ложно в противном случае.

if(a > b)
Истинно, если переменная a больше переменной b и ложно в противном случае.

if(a == b)
Истинно, если переменная a равна переменной b и ложно в противном случае.

if(a <= b)
Истинно, если переменная a меньше либо равна переменной b и ложно в противном случае.

if(a >= b)
Истинно, если переменная a больше либо равна переменной b и ложно в противном случае.

if(a != b)
Истинно, если переменная a не равна переменной b и ложно в противном случае.

if(a)
Истинно, если переменная a не равна нулю, и ложно в противном случае.

Пример 1. Программа позволяет определять знак введенной переменной.
Листинг. Программа определения знака введенного числа.
#include
int main()
{
float x;
printf(“Введите число: ”);
scanf(“%f”,&x);
if(x < 0)
printf(“Введенное число %f является отрицательным.\n”, x);
if(x >= 0)
printf(“Введенное число %f является неотрицательным.\n”, x);
return 0;
}
Анализ приведенного текста программы показывает, что два условных оператора можно заменить одним, используя конструкцию
if (выражение) <оператор1>
else
<оператор2>
которая интерпретируется таким образом. Если «выражение» истинно, то выполняется «оператор1», иначе выполняется «оператор2».
В случаях, когда при выполнении какого-либо условия необходимо записать более одного оператора, необходимо использовать фигурные скобки, т.е. использовать конструкцию вида
if (выражение)
{
<список операторов>
}
else
{
<список операторов>
}
Следует отметить, что после ключевого слова else формально можно поставить еще один оператор условия if, в результате получим еще более гибкую конструкцию условных переходов:
if(выражение1) <оператор1>
else
if(выражение2) <опреатор2>
else <оператор3>
До сих пор рассматривались простые условия типа x<0. Вместе с тем оператор if позволяет реализовывать более сложные условные переходы. В языке С имеются три логические операции:
&& - логическое И
|| - логическое ИЛИ
! – логическое НЕТ
На основе этих трех логических операций можно сформировать более сложные условия. Например, если имеются три переменные exp1, exp2 и exp3, то они могут составлять логические конструкции, представленные в табл. 3.
Таблица 3. Пример составных логических выражений
if(exp1 > exp2 && exp2 < exp3 )
Истинно, если значение переменной
exp1 больше значения переменной
exp2 и значение переменной exp2
меньше значения переменной exp3.

if(exp1 <= exp2 || exp1 >= exp3 )
Истинно, если значение переменной exp1 меньше либо равно значения переменной exp2 или значение переменной exp2 больше либо равно значения переменной exp3.


if(exp1 && exp2 && !exp3)
Истинно, если истинное значение exp1 и истинно значение exp2 и ложно
значение exp3.


if(!exp1 || !exp2 && exp3)
Истинно, если ложно значение exp1 или ложно значение exp2 и истинно
значение exp3.


Подобно операциям умножения и сложения в математике, логические операции И ИЛИ НЕТ, также имеют свои приоритеты. Самый высокий приоритет имеет операция НЕТ, т.е. такая операция выполняется в первую очередь. Более низкий приоритет у операции И, и наконец самый малый приоритет у операции ИЛИ.
Условная операция if облегчает написание программ, в которых необходимо производить выбор между небольшим числом возможных вариантов. Однако иногда в программе необходимо осуществить выбор одного варианта из множества возможных. Формально для этого можно воспользоваться конструкцией if else if else. Однако во многих случаях оказывается более удобным применять оператор switch языка С. Синтаксис данного оператора следующий:
switch(переменная)
{
case константа1: <операторы>; break;
case константа2: <операторы>; break;

default: <операторы>
}
Данный оператор последовательно проверяет на равенство переменной константам, стоящим после ключевого слова case. Если ни одна из констант не равна значению переменно, то выполняются операторы, находящиеся после слова default. Оператор switch имеет следующую особенность. Допустим, значение переменной равно значению константы1 и выполняются операторы, стоящие после первого ключевого слова case. После этого выполнение программы продолжится проверкой переменной на равенство константы2, что часто приводит к неоправданным затратам ресурсов ЭВМ. Во избежание такой ситуации следует использовать оператор break для перехода программы к следующему оператору после switch.
В листинге представлен пример программирования условного оператора switch.
Листинг. Пример использования оператора switch.
#include
int main()
{
int x;
printf(“Введите число: ”);
scanf(“%d”,&x);
switch(x)
{
case 1 : printf(“Введено число 1\n”);break;
case 2 : printf(“Введено число 2\n”); break;
default : printf(“Введено другое число\n”);
}
char ch;
printf(“Введите символ: ”);
scanf(“%с”,&сh);
switch(ch)
{
case a’ : printf(“Введен символ а\n”); break;
case b’ : printf(“Введен символ b\n”); break;
default : printf(“Введен другой символ\n”);
}
return 0;
}
Данный пример демонстрирует два разных варианта использования оператора switch. В первом случае выполняется анализ введенной цифры, во втором – анализ введенного символа. Следует отметить, что данный оператор может производить выбор только на основании равенства своего аргумента одному из перечисленных значений case, т.е. проверка выражений типа x<0 в
данном случае невозможна.

Вопросы для закрепления теоретического материала к практическому занятию:
1. Запишите условный оператор if для определения знака переменной var.
2. В каких случаях следует использовать оператор switch?
3. Используя условный оператор, выполните проверку на принадлежность
значения переменной диапазону [10; 20).
4. Приведите программу замены малых латинских букв большими с использованием оператора switch.
5. Как записывается логическое равенство в операторе if?
6. Приведите обозначение логического знака «не равно».
7. Какими символами обозначаются логические операции И и ИЛИ в условном операторе if?

Задания для практического занятия:
Написать программу работы с условным оператором if в соответствии с номером своего варианта.
Написать программу с использованием оператора switch в соответствии с номером своего варианта.
Сделать выводы о полученных результатах работы программ.
Подготовить отчет.

Инструкция по выполнению практической работы
Повторить теоретический материал.
Ответить на контрольные вопросы.
Изучить примеры построения алгоритмов.
Выполнить самостоятельные задания в тетради.
Подготовить отчет
Задания для самостоятельного выполнения:
Вариант
Оператор if
Оператор switch

1
Написать программу вычисления
модуля введенного числа.
Написать программу перевода введенного символа от a до f в верхний регистр

2
Написать программу проверки попадания введенного числа в диапазон от -2 до 2
Написать программу перевода введенного символа от A до F в нижний регистр.

3
Написать программу проверки не вхождения введенного числа в диапазон от 0 до 5
Написать программу замены введенного числа от 0 до 9 соответствующим значением – словом (1 – один)

4
Написать программу проверки на положительность введенного числа
Написать программу замены введенного числа от 0 до 5 соответствующим символом, а все другие значения заменять буквой z.

5
Написать программу проверки попадания введенного числа в диапазон от -6 до -2
Написать программу перевода введенного символа от a до f в верхний регистр, а другие символы заменять на Z

6
Написать программу проверки не вхождения введенного числа в диапазон от -5 до -1
Написать программу замены введенного слова от «один» до «девять» соответствующим числом.

7
Написать программу проверки на отрицательность введенного числа
Написать программу сравнения
введенного символа с a, s, d, j и e

8
Написать программу вычисления 1/ a с проверкой a
· 0
Написать программу замены введенного символа от 0 до 5 соответствующим числом, а все другие символы заменять числом -1

9
Написать программу определения
знака введенного числа

Написать программу перевода введенного символа от A до F в нижний регистр, а все другие символы заменять на x

10
Написать программу вычисления суммы модулей двух введенных чисел (учесть, что число может быть положительным или отрицательным)
Написать программу сравнения введенного числа со значениями 0, 4,8,9 и 30


11
Написать программу проверки попадания введенного числа в диапазон от а до с
Написать программу определения четности или нечетности введенного с клавиатуры числа в диапазоне от 10 до 20

12
Написать программу проверки на четность введенного числа
Написать программу определения названия дня недели по его номеру.


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

Порядок выполнения отчета по практической работе
Разработать программы в соответствии с заданием.
Предоставить преподавателю отчет.

Содержание отчета
Титульный лист с названием практической работы, номером варианта, фамилией студента и группы.
Текст задания
Листинг программ.
Результаты действия программ.
Выводы о полученных результатах работы программ.
Название практической работы 7:
Программирование разветвляющихся алгоритмов
Учебная цель: закрепление навыков программирования разветвляющихся алгоритмов.

Учебные задачи:
Закрепить практические навыки разработки программ с использованием разветвляющихся алгоритмов.

Образовательные результаты, заявленные во ФГОС третьего поколения:
Студент должен
уметь:
- осуществлять разработку кода программного модуля на современных языках программирования;
- создавать программу по разработанному алгоритму как отдельный модуль;
- выполнять отладку и тестирование программы на уровне модуля;
знать:
- основные этапы разработки программного обеспечения;
- основные принципы технологии объектно-ориентированного программирования;
- основные принципы отладки и тестирования программных продуктов

Задачи практической работы:
Повторить теоретический материал по теме практической работы.
Ответить на вопросы для закрепления теоретического материала.
Разработать программы с использованием разветвляющихся алгоритмов.
Оформить отчет.

Обеспеченность занятия (средства обучения):
Учебно-методическая литература:
- Архангельский А. Я.. Программирование в C++ Builder.  Бином-Пресс, 2010;
Хорев П.Б. Объектно-ориентированное программирование (4-е изд., стер.) учеб. Пособие. Издательский центр «Академия», 2012.
Справочная литература:
Справочный материал по компонентам среда разработки C++ Builder .
Технические средства обучения: ПК.
Программное обеспечение: C++ Builder.
Раздаточные материалы (карточки-задания, инструкционные карты, образцы, заготовки; указать, сколько).

Краткие теоретические и учебно-методические материалы по теме практической работы
Условный оператор if... else
Условный оператор реализует структуру выбора. Он имеет такой вид: if (условие) оператор1[ else оператор 2]
Если условие оценивается как истинное (ненулевое), выполняется onepaтop1, если как ложное (нулевое), выполняется onepaтop2. Простейший пример: if (а > b)
max_ab = a;
else max_ab = b;
Как было сказано чуть выше, вместо одиночного оператора всегда можно подставить блок из нескольких операторов, заключенный в фигурные скобки. Другими словами, возможна следующая синтаксическая форма: if (условие) {операторы_блока_if}
Else {операторы_блока_еlsе}
В случае, когда при ложности условия не нужно выполнять никаких действий, а требуется только пропустить операторы блока if, ключевое слово else и соответствующий ему оператор (блок) могут отсутствовать, как в следующем примере:
if (а > b) 
{ temp = а;
а = b;
b = temp;
}  //...Продолжение программы...
 
Условие оператора if может быть сколь угодно сложным выражением. При записи условия используются логические операции (записаны в порядке убывания приоритета):
!    – логическое НЕ (инверсия);
<    – меньше;
<=    – меньше или равно;
>    – больше;
>=    – больше или равно;
= =    – равно;
!=    – логическое И;
&&    – логическое И;
||    – логическое ИЛИ.
! – логическое НЕ (инверсия, отрицание), дает в результате false (0), если операнд true(
· 0 ) или 1 если операнд false (0).
ПРИМЕЧАНИЕ: обратите внимание на разницу между операцией проверки на равенство (==) и операцией присваивания (=), результатом которой является значение, присвоенное левому операнду. Пример: a= =0;
логическое значение этого выражения true, если а равно 0, иначе false. a=0; логическое значение этого выражения всегда false. Логические операции && (И) и  || (ИЛИ). Операнды логических операций И (&&) и ИЛИ ( || ) могут иметь арифметический тип или быть указателями, при этом операнды в каждой операции могут быть различных типов. Преобразования типов не производятся, каждый операнд оценивается с точки зрения его эквивалентности нулю (операнд, равный нулю, рассматривается как false, не равный нулю – как true). Результатом логической операции является true или false. Результат операции логическое И имеет значение true только если оба операнда имеют значение true. Результат операции логическое ИЛИ имеет значение true, если хотя бы один из операндов имеет значение true. Логические операции выполняются слева направо. Если значения первого операнда достаточно, чтобы определить результат операции, второй операнд не вычисляется.
Примеры: a>b && cесли одновременно а больше b и с меньше d, то выражение равно true, иначе false. a>b || cесли а больше b или с меньше d, то выражение равно true, иначе false. Можно было бы записать (a>b)&&(c и < выше чем && и ||. Оператор выбора switch
Часто возникают ситуации, когда некоторая переменная может принимать несколько возможных значений-вариантов, и для каждого варианта требуется выполнить какие-то свои действия. Например, пользователю может быть предложено меню, когда нажатие различных клавиш инициирует соответствующие команды. Управляющая конструкция, реализующая такую логику, может использовать "последовательно вложенные” операторы if...else if...: int key;
printf(RUS("\nВыберите команду (F, M or Q): ")); // Вывести подсказку.
key = getch(); // Прочитать символ.
key = toupper(key); // Преобразовать в верхний регистр.
// блок определения команды...
if (key == 'F') printf(RUS("\nВыбрана команда \"F\" – означает Файл.\n")); else if (key == 'M')
printf(RUS("\nВыбрана команда \"M\" – означает сообщение.\n"));
else if (key == 'Q')
printf(RUS("\nВыбрана команда \"Q\" – означает Выход.\n"));
else printf(RUS("\nНеправиьная клавиша!"));
Условия операторов if содержат проверку кода нажатой клавиши на равенство одному из допустимых символов. Если код клавиши не соответствует никакой команде, выводится сообщение об ошибке. Для подобных случаев в С существует специальная, более удобная, конструкция выбора switch. Выглядит она так:
switch (выражение)
{ case константное_выражение: группа_операторов
case константное_выражение: группа_операторов
[default: группа операторов]
} Сначала производится оценка выражения в операторе switch. Полученное значение последовательно сравнивается с каждым из константных_выражений, и при совпадении значений управление передается на соответствующую группу_операторов. Если значение выражения не подходит ни под один из вариантов, управление передается на группу операторов с меткой default или на следующий после блока switch оператор, если группа default отсутствует.
Под группой _операторов подразумевается просто один или несколько произвольных операторов. Группа здесь вовсе не обязана быть блоком, т. е. заключать ее в операторные скобки не требуется. И еще одна особенность, о которой следует помнить при написании структур switch. Если найдена метка case, совпадающая со значением проверяемого выражения, то выполняется группа_операторов данного case. Однако дело на этом не заканчивается, поскольку, если не принять никаких дополнительных мер, управление "провалится” ниже, на следующую по порядку метку case и т. д., и в результате будут выполнены все операторы до самого конца блока switch. Если это нежелательно (как чаще всего и бывает), в конце группы_операторов case нужно поставить оператор break. Он прерывает выполнение блока c совпавшей меткой и передает управление оператору, непосредственно следующему за блоком switch.
Для иллюстрации мы перепишем предыдущий пример "меню”, оформив его в виде законченной программы, и продемонстрируем попутно еще один управляющий оператор С.
Демонстрация структуры switch:
int key;
loop: //здесь можно добавить программу, выполняемую каждый раз
//после выбора команд F, M or Q
printf(RUS("\nВыберите команду (F, M or Q): "));
key = getche(); // Прочитать клавишу.
// Определение команды...
switch (key)
{ case 'f':
case 'F':
printf(RUS("\nВыбрана команда \"Файл\".\n"));break;
case 'm':
case 'M':
printf (RUS("\nВыбрана команда \"Message\".\n"));break;
case 'q':
case 'Q':
printf(RUS("\nВыбрана команда \"Quit\".\n"));
printf(RUS("Нажмите любую клавишу для завершения программы ...\n")); getch() ;
return 0; // Возврат в Windows.
default: printf(RUS("\nНеправиьная клавиша!"));
} goto loop; // переход в начало программы на метку loop
Мы организовали в программе простейший "бесконечный” цикл, который все время просит пользователя ввести команду – до тех пор, пока не будет нажата клавиша "Q”. В этом случае происходит возврат в операционную систему. Чтение команды производится функцией getche(). Она, как и getch(), возвращает код нажатой клавиши, однако в отличие от getch() отображает введенный символ на экране.
Для реализации цикла мы использовали оператор goto, исполнение которого приводит к передаче управления на метку, указанную в операторе. В примере метка с именем loop стоит в самом начале программы. Таким образом, дойдя до конца функции main (), управление возвращается к ее началу и все повторяется снова.

Оператор goto
Оператор безусловного перехода goto имеет формат:
goto metka;
В теле той же функции должна присутствовать ровно одна конструкция вида: metka: оператор;
Оператор goto передает управление оператору с меткой metka. Метка –это обычный идентификатор. Оператор goto может передать управление на метку, обязательно расположенную в одном с ним теле функции. Операторы if и goto могли бы заменить все операторы ветвления, передачи управления и цикла, но такой подход оказался не очень удобен. Применение goto может нарушить принципы структурного и модульного программирования, по которым все блоки, из которых состоит программа, должны иметь только один вход и один выход. Кроме того, операторы выбора и цикла выглядят более изящно и позволяют ускорить выполнение программы. Использование оператора безусловного перехода оправдано в двух случаях: -   принудительный выход вниз по тексту программы из нескольких вложенных циклов или переключателей; -    переход из нескольких мест функции в одно (например, если перед выходом из функции необходимо всегда выполнять какие-либо одни и те же действия). В остальных случаях для записи любого алгоритма существуют более подходящие средства, а использование goto приводит только к усложнению структуры программы и затруднению отладки. В любом случае не следует с помощью goto передавать управление внутрь операторов if, switch и циклов. Нельзя переходить внутрь блоков, содержащих инициализацию переменных, на операторы, расположенные после нее, поскольку в этом случае инициализация не будет выполнена:
int k; ...
 goto metka; ...
 {int a = 3. b = 4;
 k = a + b;
metka: int m = k + 1; ... }
После выполнения этого фрагмента программы значение переменной m не определено. Оператор break
Оператор прерывает выполнение оператора switch. Управление передается следующему за ним оператору. Об этом было уже сказано выше. Здесь следует лишь подчеркнуть, что break относится к операторам передачи управления. Тестирование программ
Тестирование выполняется после отладки программы и заключается в проверке правильности ее функционирования при всех вариантах исходных данных, значений переменных, условий и т.п. Это означает, что нужно проверить проход программы по всем «путям» блок-схемы. Сколько путей – столько раз нужно выполнить программу с разными значениями переменных. Следует также проверять какие значения нельзя присваивать переменным в ходе выполнения программы по причине их несоответствия типу переменных или недопустимости этого значения в каком-либо выражении программы (например, нулевое значение переменной может вызвать ошибку деления на 0).
Результат тестирования – примеры выполнения программы при разных исходных данных и инструкция пользователя, запрещающая вводить неверные исходные данные (например, вместо цифр буквы или цифры, но не те, что надо). В инструкции следует пояснить, почему вводится то или иное запрещение, рекомендация или требование.


Задания для практического занятия:
Выполнить задания 1-2.
Подготовить отчет.

Инструкция по выполнению практической работы
Повторить теоретический материал.
Изучить пример выполнения задания.
Разработать программы для решения задач
Подготовить отчет
Задания для самостоятельного выполнения:

Задание 1: Задание 1.1 Вычислить значения функции F при вещественных a, b, c, x, вводимых с клавиатуры. Задание 1.2 Вычислить значения функции F при вещественных a, b, c, x, вводимых с клавиатуры. Задание 1.3 Вычислить значения функции F при вещественных a, b, c, x, вводимых с клавиатуры. Задание 1.4 Вычислить значения функции F при вещественных a, b, c, x, вводимых с клавиатуры. Задание 1.5 Вычислить значения функции F при вещественных a, b, c, x, вводимых с клавиатуры. Задание 1.6 Вычислить значения функции F при вещественных a, b, c, x, вводимых с клавиатуры. Задание 1.7 Вычислить значения функции F при вещественных a, b, c, x, вводимых с клавиатуры. Задание 1.8 Вычислить значения функции F при вещественных a, b, c, x, вводимых с клавиатуры. Задание 1.9 Вычислить значения функции F при вещественных a, b, c, x, вводимых с клавиатуры. Задание 1.10 Вычислить значения функции F при вещественных a, b, c, x, вводимых с клавиатуры. Задание 1.11 Вычислить значения функции F при вещественных a, b, c, x, вводимых с клавиатуры. Задание 1.12 Вычислить значения функции F при вещественных a, b, c, x, вводимых с клавиатуры. Задание 1.13 Вычислить значения функции F при вещественных a, b, c, x, вводимых с клавиатуры. Задание 1.14 Вычислить значения функции F при вещественных a, b, c, x, вводимых с клавиатуры. Задание 1.15 Вычислить значения функции F при вещественных a, b, c, x, вводимых с клавиатуры. Задание 2:
Составить программу, которая печатает сообщение о принадлежности, если точка с координатами (х, у) принадлежит или не принадлежит заштрихованной области (номера вариантов на графиках):
[ Cкачайте файл, чтобы посмотреть ссылку ]
[ Cкачайте файл, чтобы посмотреть ссылку ]


[ Cкачайте файл, чтобы посмотреть ссылку ]
Пример выполнения задания
Задача №1
1.Вычислить значения функции F при вещественных a, b, c, x, вводимых с клавиатуры. 2.Составить программу, которая печатает сообщение о принадлежности, если точка с координатами (х, у) принадлежит или не принадлежит заштрихованной области.  После выполнения задания 2 дополните программу циклом с оператором goto. В цикле с помощью оператора switch организуйте выбор: повторение или завершение программы.

A: float a, b, c, x,f; cout<<"Vvedite a, b, c, x"<<'\n'; cin>>a>>b>>c>>x; if(x<0 && b!=0) {   f=a*x*x+b;   cout<<"F="<0 && b==0) {  if(x==c)cout<
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·y': case 'Y': goto A;break; default: cout<<"Nepravil`nay klavisha"<<'\n';goto loop; }


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

Порядок выполнения отчета по практической работе
Разработать программы в соответствии с заданием.
Предоставить преподавателю работающие версии программ.




Название практической работы 8.
Решение задач с использованием циклических алгоритмов
Учебная цель: отработка умений программирования с использованием циклических алгоритмов алгоритмов.

Учебные задачи:
Закрепить практические навыки разработки программ с использованием циклических алгоритмов.

Образовательные результаты, заявленные во ФГОС третьего поколения:
Студент должен
уметь:
- осуществлять разработку кода программного модуля на современных языках программирования;
- создавать программу по разработанному алгоритму как отдельный модуль;
- выполнять отладку и тестирование программы на уровне модуля;
знать:
- основные этапы разработки программного обеспечения;
- основные принципы технологии объектно-ориентированного программирования;
- основные принципы отладки и тестирования программных продуктов

Задачи практической работы:
Повторить теоретический материал по теме практической работы.
Ответить на вопросы для закрепления теоретического материала.
Разработать программы с использованием циклических алгоритмов.
Оформить отчет.

Обеспеченность занятия (средства обучения):
Учебно-методическая литература:
- Архангельский А. Я.. Программирование в C++ Builder.  Бином-Пресс, 2010;
Хорев П.Б. Объектно-ориентированное программирование (4-е изд., стер.) учеб. Пособие. Издательский центр «Академия», 2012.
Справочная литература:
Справочный материал по компонентам среда разработки C++ Builder .
Технические средства обучения: ПК.
Программное обеспечение: C++ Builder.
Раздаточные материалы (карточки-задания, инструкционные карты, образцы, заготовки; указать, сколько).

Краткие теоретические и учебно-методические материалы по теме практической работы
Операторы циклов
Различают:
итерационные циклы;
арифметические циклы.
Группа действий, повторяющихся в цикле, называется его телом. Однократное выполнение цикла называется его шагом.
В итерационных циклах известно условие выполнения цикла.
Цикл с предусловием:
while (выражение-условие)
оператор;
В качестве <выражения-условия> чаще всего используется отношение или логическое выражение. Если оно истинно, т. е. не равно 0, то тело цикла выполняется до тех пор, пока выражение-условие не станет ложным.
Пример
while (a!=0)
{
cin>>a;
s+=a;
}
Цикл с постусловием:
do
оператор
while (выражение-условие);
Тело цикла выполняется до тех пор, пока выражение-условие истинно.
Пример:
do
{
cin>>a;
s+=a;
}
while(a!=0);

Цикл с параметром:
for ( выражение_1;выражение-условие;выражение_3)
оператор;
выражение_1 и выражение_3 могут состоять из нескольких выражений, разделенных запятыми. Выражение_1 - задает начальные условия для цикла (инициализация). Выражение-условие> определяет условие выполнения цикла, если оно не равно 0, цикл выполняется, а затем вычисляется значение выражения_3. Выражение_3 - задает изменение параметра цикла или других переменных (коррекция). Цикл продолжается до тех пор, пока выражение-условие не станет равно 0. Любое выражение может отсутствовать, но разделяющие их « ; » должны быть обязательно.
Примеры использования цикла с параметром.
Уменьшение параметра:
for ( n=10; n>0; n--)
{ оператор};
Изменение шага корректировки:
for ( n=2; n>60; n+=13)
{ оператор };
Возможность проверять условие отличное от условия, которое налагается на число итераций:
for ( num=1;num*num*num<216; num++)
{ оператор };
Коррекция может осуществляться не только с помощью сложения или вычитания:
for ( d=100.0; d<150.0;d*=1.1)
{ <тело цикла>};
for (x=1;y<=75;y=5*(x++)+10)
{ оператор };
Можно использовать несколько инициализирующих или корректирующих выражений:
for (x=1, y=0; x<10;x++;y+=x);

Операторы перехода
Операторы перехода выполняют безусловную передачу управления.
break - оператор прерывания цикла.
{
< операторы>
Т. е. оператор break целесообразно использовать, когда условие продолжения итераций надо проверять в середине цикла.
Пример:
// ищет сумму чисел вводимых с клавиатуры до тех пор, пока не будет введено 100 чисел или 0
for(s=0, i=1; i<100;i++)
{
cin>>x;
if( x==0) break; // если ввели 0, то суммирование заканчивается
s+=x;
}
continue - переход к следующей итерации цикла. Он используется, когда тело цикла содержит ветвления.
Пример:
//ищет количество и сумму положительных чисел
for( k=0,s=0,x=1;x!=0;)
{
cin>>x;
if (x<=0) continue;
k++;s+=x;
}

Вопросы для закрепления теоретического материала к практическому занятию:
Какой алгоритм является алгоритмом циклической структуры?
Типы циклов в языке Си.
Назовите основные параметры цикла.
Как записывается условие продолжения цикла в циклах типа while и do ... while?
Какие три раздела записываются в круглых скобках для оператора цикла типа for? Какой разделитель между разделами?
Что такое вложенные циклы? Примеры.
Как образуется бесконечный цикл и как выйти из него?

Задания для практического занятия:
Выполнить задания 1-5.
Подготовить отчет.

Инструкция по выполнению практической работы
Повторить теоретический материал.
Разработать блок-схемы для примеров 1-5
Протестировать программы 1-5
Подготовить отчет
Задания для самостоятельного выполнения:
Арифметические циклы
Задача №1. Дана последовательность целых чисел из n элементов. Найти среднее арифметическое этой последовательности.
Листинг
#include
#include
void main()
{
int a,n,i,k=0;
double s=0;
cout<<"\nEnter n";
cin>>n;
for(i=1;i<=n;i++)
{
cout<<"\nEnter a";
cin>>a;
s+=a;k++;
}
s=s/k;
cout<<"\nSr. arifm="<}

Тесты
N
5

A
1,2,3,4,5,3

S
3


Задача №2. Найти S=1+2+3+4+. . . +N
Листинг
#include
#include
void main()
{
int n,i,s=0;
cout<<"\nEnter n";
cin>>n;
if(n<=0) {cout<<”\nN<=0”;return;}
for(i=1;i<=n;i++)s+=i;
cout<<"\nS="<}
Тесты
n
S

n=-1
N<=0

n=0
N<=0

n=5
S=15


Итерационные циклы. Для итерационного цикла известно условие выполнения цикла.
Задача №4. Дана последовательность целых чисел, за которой следует 0. Найти минимальный элемент этой последовательности.
Листинг
#include
#include
void main()
{
int a,min;
cout<<"\nEnter a";
cin>>a;
min=a;
while(a!=0)//for(;a!=0;)
{
cout<<"\nEnter a";
cin>>a;
if (a!=0&&a}
cout<<"\nmin="<}
Тесты:
a
2
55
-3
-10
0

min
-10






a
12
55
4
27
0

min
4






a
-6
-43
-15
-10
0

min
-10






Вложенные циклы
Задача №5: Напечатать N простых чисел.
Листинг
#include
void main()
{
int a=1,n,d;
cout<<"\nEnter N";
cin>>n;
for(int i=0;i {
a++;d=1;
do //внутренний цикл
{
d++;
}
while(a%d!=0);//конец внутреннего цикла
if(a==d){
cout< i++;}

}//конец внешнего цикла
}

Методика анализа результатов, полученных в ходе практической работы
В результате выполнения заданий у Вас должны быть разработаны программы решения задач 1-5.
Проведено тестирование программ.
Разработаны блок-схемы.

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




Название практической работы 9:
·
Программирование циклических вычислений в языке c++

Учебная цель: приобретение навыков программирования циклических алгоритмов. Освоить конструкции языка C++, позволяющего реализовывать циклические алгоритмы.

Ход работы
Алгоритм циклической структуры – это алгоритм, в котором происходит многократное повторение одного и того же участка программы. Такие повторяемые участки вычислительного процесса называются циклами.
Программа циклической структуры содержит один или несколько циклов. Различают детерминированные циклы с заранее известным числом повторений и итерационные циклы, в которых число повторений заранее неизвестно.
В языке C++ существует 3 вида циклов:
цикл с параметром или цикл типа for,
цикл с предусловием или цикл типа while,
цикл с постусловием или цикл типа do ... while. В всех циклах повторяющаяся часть (тело цикла) состоит из одного оператора, если требуется выполнить в цикле несколько операторов, они заключаются в фигурные скобки, образуя, составной оператор. Также во всех типах циклов условие продолжения цикла заключается в круглые скобки.
Цикл с параметром или цикл типа for. Для цикла типа for заголовок цикла состоит из трех разделов: инициализации (присваивания начальных значений), проверки условия повторения, модификации (изменения параметров). Разделителем между разделами заголовка цикла типа for служит точка с запятой.
Основная форма цикла for имеет следующий вид:
for(<список_инициализации>; <условие_продолжения>; <переход_к_следующей_итерации>) <тело_цикла>;
Все три параметра цикла for должны быть разделены точкой с запятой. Перед выполнением цикла выполняются операторы, содержащиеся в первом параметре <список_инициализации> оператора for, затем осуществляется проверка условия продолжения цикла в параметре <условие_продолжения>, если данное условие принимает истинное значение, то выполняются операторы, образующие тело цикла (<тело_цикла>). Если условие продолжения принимает ложное значение, то работа цикла завершается, и выполняются операторы, следующие за телом цикла. После выполнения последнего оператора в теле цикла, выполняются <переход_к_следующей_итерации> операторы третьего параметра цикла for. После чего снова производится проверка условия продолжения и процесс повторяется.
В простейшем виде список инициализации используется для присвоения начального значения параметру цикла. Проверка условия продолжения – обычное условное выражение, определяющее, при каких условиях цикл будет продолжен. Изменение (приращение) обычно используется для изменения параметра цикла каждый раз при повторении цикла. Как только условие становится ложным, начинает выполняться следующий за циклом оператор.

В качестве параметра цикла необязательно использовать целочисленный счетчик. Далее показан фрагмент программы, выводящей на экран все буквы английского алфавита:
unsignet char ch;
for(ch = A’; ch <= Z’; ch++) cout << ch;

Следующий фрагмент программы показывает как вывести на печать квадраты вещественных чисел от -2 до 3 с шагом 0.1:
double x;
for(x = -2.; x <= 3.; x += 0.1) cout << x*x << endl;
С помощью цикла типа for удобно находить суммы, произведения, искать максимальные и минимальные значения и т.п. При нахождении суммы некоторой переменной, например S присваивается значение 0, затем в цикле к этой переменной прибавляется соответствующий член заданной последовательности. Далее показано, как можно найти сумму натуральных чисел от 1 до 10:
S = 0;
for(i = 1; i < 11; i++) S += i;
с использованием операции «запятая» и операции постфиксного инкремента данная задача может быть решена следующим образом:
for(S = 0, i = 1; i < 11; S += i++);
Цикл for может быть вложенным. В качестве примера рассмотрим программу, печатающую таблицу умножения целых чисел от 0 до 9:
Листинг 3.1
#include #include
int main(void) {
int i, j;
for(i = 0; i < 10; i++)
for(j = 0; j < 10; j++)
cout << i << “ * “ j << “ = “ << i*j << endl;
getch(); return 0; }
Пример 3.1. Составить UML-диаграмму деятельности и написать программу, позволяющую вычислить сумму квадратов натуральных чисел от 1 до n, где n



вводится с клавиатуры.
Составим UML-диаграмму деятельности расчета суммы квадратов натуральных чисел от 1 до n (рис. 3.2).


По составленной диаграмме может быть написана программа вычисления значения функции.
Листинг 3.2.
#include
#include
int main(void) {
int n, i, S = 0;
cout << “Введите значение n: “;
cin >> n;
for(i = 1; i <= n; i++) S += i*i;
cout << “Сумма чисел S = “ << S << endl;
getch(); return 0; }

Пример 3.2. Составить UML-диаграмму деятельности и написать программу, позволяющую вычислить конечную сумму
где n и x вводятся с клавиатуры.
Составим UML-диаграмму деятельности расчета конечной суммы (рис. 3.3).

По составленной диаграмме может быть написана программа вычисления значения конечной суммы.
Листинг 3.3.
#include
#include
#include
int main(void) {
double x, S = 0.;
int k, n;
cout << “Введите значение x: “; cin >> x;
cout << “Введите значение n: “; cin >> n;
for(k = 1, k <= n; k++) {
double a = log(k*x)/(k*k);
S += a; }
cout << “Конечная сумма: “ << S << endl; getch(); return 0; }
Очень часто в операторе for используются операторы инкремента (++) – увеличения на единицу и декремента (--) – уменьшения на единицу. Оба оператора используются как в префиксной, так и в постфиксной формах. Префиксная операция инкремента (++i) – увеличение на 1 операнда до его использования, соответственно, префиксная операция декремента (--i) – уменьшение на 1 операнда до его использования. Постфиксная операция инкремента (i++) – увеличение значения операнда на 1 после его использования, соответственно, постфиксная операция декремента (i--) – уменьшение значения операнда на 1 после его использования. Операнд этих операций не может быть константой либо другим праводопустимым выражением. Операндом не может быть и произвольное выражение. Операндом унарных операций ++ и -- должны быть всегда леводопустимые выражения, например, переменные.

Цикл с предусловием или цикл типа while. Не всегда число повторений цикла известно заранее, в этих случаях применяются циклы с предусловием (проверка перед циклом) или с постусловием (проверка после цикла) – это цикл while.
Основная его форма
while(<выражение_условие>) <тело_цикла>
При входе в цикл вычисляется выражение_условие. Если его значе-ние отлично от нуля, то выполняется тело_цикла. Затем вычисление условия, заданного в выражении_условии и выполнение операторов тела_цикла выполняются последовательно, пока выражение_условие не станет равным 0. Данная инструкция может быть выполнена ноль или более раз. Оператором while удобно пользоваться для просмотра всевозможных последовательностей, если в конце каждой из них находится заранее известный признак.
Например, сумма натуральных чисел от 1 до 10 с использованием цикла while может быть найдена следующим образом:

S = 0; i = 1; while(i <= 10) { S += i; i++; }

Цикл с постусловием или цикл типа do while. Инструкция do представляет собой вариант инструкции while. Но вместо проверки условия в начале цикла, в инструкции do она производится в конце. Это значит, что инструкция, контролируемая условием do, выполняется по крайней мере один раз, тогда как while может вообще не передать управление своему телу, если условие изначально не выполняется. Оператор цикла do while называется оператором цикла с постусловием. Основная форма цикла do
do
<тело_цикла> while (<выражение_условие>);

Сначала выполняется тело_цикла, затем вычисляется условие продолжения цикла выражение_условие. Если оно истинно то управление передается обратно на начало инструкции do и процесс повторяется. Когда значение условия становится ложно, управление передается следующей инструкции после тела цикла.
Например, сумма натуральных чисел от 1 до 10 с использованием цикла do while может быть найдена следующим образом:
S = 0; i = 1;
do {
S + = i ; i + + ; } while (i < 11);

Оператор безусловного перехода goto. Оператор безусловного перехода имеет вид:
goto идентификатор;
где идентификатор – имя метки оператора, расположенного в той же функции, где используется оператор безусловного перехода.
Передача управления разрешена на любой помеченный оператор в теле функции. Однако существует одно важное ограничение: запрещено «перескакивать» через описания, содержащие инициализацию объектов. Это ограничение не распространяется на вложенные блоки, которые можно обходить целиком. Следующий фрагмент иллюстрирует сказанное:
goto В; // Ошибочный переход, минуя описание
float х = 0.0; // Инициализация
// не будет выполнена
goto В; // Допустимый переход, минуя блок
{
int n = 10; // Внутри блока определена
// переменная
x = n*x + x; }
В: cout << "\tx = " << х;
Все операторы блока достижимы для перехода к ним из внешних блоков. Однако при таких переходах необходимо соблюдать то же самое правило: нельзя передавать управление в блок, обходя инициализацию. Следовательно, будет ошибочным переход к операторам блока, перед которыми помещены описания с явной или неявной инициализацией. Это же требование обязательного выполнения инициализации справедливо и при внутренних переходах в блоке.
Принятая в настоящее время дисциплина программирования рекомендует либо вовсе отказаться от оператора goto, либо свести его применение к минимуму и строго придерживаться следующих рекомендаций:
не входить внутрь блока извне;
не входить внутрь условного оператора, т.е. не передавать управление операторам, размещенным после служебных слов if или else;
не входить извне внутрь переключателя (switch);
- не передавать управление внутрь цикла.
Следование перечисленным рекомендациям позволяет исключить возможные нежелательные последствия бессистемного использования оператора безусловного перехода. Полностью отказываться от оператора goto вряд ли стоит. Есть случаи, когда этот оператор обеспечивает наиболее простые и понятные решения. Один из них – это ситуация, когда в рамках текста одной функции необходимо из разных мест переходить к одному участку программы. Если по каким-либо причинам эту часть программы нельзя оформить в виде функции (например, это может быть текст на ассемблере), то наиболее простое решение – применение безусловного перехода с помощью оператора goto. Такое положение возникает, например, при необходимости обрабатывать ошибки, выявляемые в процессе выполнения программы.
Второй случай возникает, когда нужно выйти из нескольких вложенных друг в друга циклов или переключателей. Оператор break прерывания цикла и выхода из переключателя здесь не поможет, так как он обеспечивает выход только из самого внутреннего вложенного цикла или переключателя. Например, в задаче поиска в матрице хотя бы одного элемента с заданным значением для перебора элементов матрицы обычно используют два вложенных цикла. Как только элемент с заданным значением будет найден, нужно выйти сразу из двух циклов, что удобно сделать с помощью goto.
Оператор break. Оператор break служит для принудительного выхода из цикла или переключателя. Определение «принудительный» подчеркивает безусловность перехода. Например, в случае цикла не проверяются и не учитываются условия дальнейшего продолжения итераций. Оператор break прекращает выполнение оператора цикла или переключателя и осуществляет передачу управления (переход) к следующему за циклом или переключателем оператору. При этом в отличие от перехода с помощью goto оператор, к которому выполняется передача управления, не должен быть помечен. Оператор break нельзя использовать нигде, кроме циклов и переключателей.
Необходимость в использовании оператора break в теле цикла возникает, когда условия продолжения итераций нужно проверять не в начале итерации (циклы for, while), не в конце итерации (цикл do), а в середине тела цикла. В этом случае тело цикла может иметь такую структуру:
{
операторы;
if(условие) break;
операторы; }

Циклы и переключатели могут быть многократно вложенными. Однако следует помнить, что оператор break позволяет выйти только из самого внутреннего цикла или переключателя.
При многократном вложении циклов и переключателей оператор break не может вызвать передачу управления из самого внутреннего уровня непосредственно на самый внешний. Например, при решении задачи поиска в матрице хотя бы одного элемента с заданным значением удобнее всего пользоваться не оператором break, а оператором безусловной передачи управления (goto).
Оператор continue. Оператор continue употребляется только в операторах цикла. С его помощью завершается текущая итерация и начинается проверка условия дальнейшего продолжения цикла, т.е. условий начала следующей итерации. Для объяснений действия оператора continue рекомендуется рассматривать следующие три формы основных операторов цикла:
while(<условие>) {

if(<условие_прерывания>) continue;
}
do {

if(<условие_прерывания>) continue;
} while(<условие>);
for(<список_инициализации>; <условие>;
<следующая_итерация>) {

if(<условие_прерывания>) continue;
}
В каждой из форм многоточием обозначены операторы тела цикла.
Вслед за ними размещен пустой оператор с меткой continue. Если среди операторов тела цикла есть оператор continue и он выполняется, то его действие эквивалентно оператору безусловного перехода на метку continue.

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

Индивидуальное задание №1.
Вариант:
Найти все трехзначные натуральные числа, сумма цифр которых равна их произведению.
Найти сумму целых положительных чисел, больших 20, меньших 100 и кратных 3.
Начав тренировки, спортсмен пробежал 10 км. Каждый следующий день он увеличивал дневную норму на 10% от нормы предыдущего дня. Какой суммарный путь пробежит спортсмен за 7 дней?
Одноклеточная амеба каждые три часа делится на 2 клетки. Определить, сколько будет клеток через 6 часов.
В 1985 г. урожай ячменя составил 20 ц с га. В среднем каждые 2 года за счет применения передовых агротехнических приемов, урожай увеличился на 5%. Определить, через сколько лет урожай достигнет 25 ц с га.
Напечатать таблицу соответствия между весом в фунтах и весом в кг для значений от 1 до а фунтов с шагом 1 фунт, если 1 фунт = 400 г.
Определить среди всех двузначных чисел те, которые делятся на сумму своих цифр.
Сумма цифр трехзначного числа кратна 7. Само число также делится на 7. Найти все такие числа.
Если к сумме цифр двузначного числа прибавить квадрат этой суммы, то снова получится это двузначное число. Найти все эти числа.
Сколько можно купить быков, коров и телят, платя за быка 10 р., за корову – 5 р., а за теленка – 0,5 р., если на 100 р. надо купить 100 голов скота?
Составьте программу, которая печатает таблицу умножения натуральных чисел в десятичной системе счисления.
Покупатель должен заплатить в кассу S р. У него имеются 1, 2, 5, 10, 100, 500 р. Сколько купюр разного достоинства отдаст покупатель, если он начинает платить с самых крупных.
Дано натуральное число n. Получить все его натуральные делители.
Вычислить сумму всех n-значных чисел (1<=n<=4)
16. Вычислить сумму всех n-значных чисел, кратных k (1<=n<=4)
Ученик выучил в первый день 5 английских слов. В каждый следующий день он выучивал на 2 слова больше, чем в предыдущий. Сколько английских слов выучит ученик в 10-ый день занятий.
Составьте программу, которая печатает таблицу сложения натуральных чисел в десятичной системе счисления.

Индивидуальное задание №2.

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






































Примечание: При вычислении факториалов необходимо результат накапливать в переменных типа double.





Содержание отчета и его форма.

Отчет по лабораторной работе должен состоять из:
Названия лабораторной работы.
Цели и содержания лабораторной работы.
Ответов на контрольные вопросы лабораторной работы.
Формулировки индивидуальных заданий и порядка их выполнения. Отчет о выполнении лабораторной работы в письменном виде сдается преподавателю.

Вопросы для защиты работы

Какой алгоритм является алгоритмом циклической структуры?
Типы циклов в языке Си.
Назовите основные параметры цикла.
Как записывается условие продолжения цикла в циклах типа while и do ... while?
Какие три раздела записываются в круглых скобках для оператора цикла типа for? Какой разделитель между разделами?
Что такое вложенные циклы? Примеры.
Как образуется бесконечный цикл и как выйти из него?

Название практической работы № 10:
Решение задач обработки одномерных массивов данных.
Учебная цель: закрепление навыков программирования задач с использованием одномерных массивов.
Учебные задачи:
Закрепить практические навыки разработки программ с использованием одномерных массивов.
Образовательные результаты, заявленные во ФГОС третьего поколения:
Студент должен
уметь:
- осуществлять разработку кода программного модуля на современных языках программирования;
- создавать программу по разработанному алгоритму как отдельный модуль;
- выполнять отладку и тестирование программы на уровне модуля;
знать:
- основные этапы разработки программного обеспечения;
- основные принципы технологии объектно-ориентированного программирования;
- основные принципы отладки и тестирования программных продуктов
Задачи практической работы:
Повторить теоретический материал по теме практической работы.
Ответить на вопросы для закрепления теоретического материала.
Разработать программы обработки одномерных массивов.
Оформить отчет.
Обеспеченность занятия (средства обучения):
Учебно-методическая литература:
- Архангельский А. Я.. Программирование в C++ Builder.  Бином-Пресс, 2010;
Хорев П.Б. Объектно-ориентированное программирование (4-е изд., стер.) учеб. Пособие. Издательский центр «Академия», 2012.
Справочная литература:
Справочный материал по компонентам среда разработки C++ Builder .
Технические средства обучения: ПК.
Программное обеспечение: C++ Builder.
Раздаточные материалы (карточки-задания, инструкционные карты, образцы, заготовки; указать, сколько).

Краткие теоретические и учебно-методические материалы по теме практической работы
Основное предназначение современных компьютеров – обработка большого количества данных. При этом надо както обращаться к каждой из тысяч (или даже миллионов) ячеек с данными. Очень сложно дать каждой ячейке собственное имя и при этом не запутаться. Из этой ситуации выходят так: дают имя не ячейке, а группе ячеек, в которой каждая ячейка имеет собственный номер. Такая область памяти называется массивом.
Массив – это группа переменных одного типа, расположенных в памяти рядом (в соседних ячейках) и имеющих общее имя. Каждая ячейка в массиве имеет уникальный номер.
Для работы с массивами нужно, в первую очередь, научиться:
выделять память нужного размера под массив;
записывать данные в нужную ячейку;
читать данные из ячейки массива.
Чтобы использовать массив, надо его объявить – определить тип массива (тип входящих в него элементов), выделить место в памяти и присвоить имя. Имена массивов строятся по тем же правилам, что и имена переменных.
В языках C и C++ массивы объявляются почти так же, как и обычные переменные, только после имени массива в квадратных скобках указывают количество элементов:
int A[5];
double V[8];
bool L[10];
char S[80];
Индексы элементов массива всегда начинаются с нуля. Если, например, в массиве A пять элементов, то последний элемент будет иметь индекс 4.
Для того, чтобы обратиться к элементу массива, нужно записать имя массива и в квадратных скобках индекс нужного элемента, например, A[3]. Индексом может быть не только число, но значение целой переменной или арифметического выражения целого типа. В этом примере массив заполняется квадратами первых натуральных чисел:
main()
{
const int N = 10;
int A[N];
int i;
for ( i = 0; i < N; i++ )
A[i] = i*i;
}
При объявлении границ индексов массивов можно использовать константы – постоянные величины, имеющие имя. В приведенном примере с помощью ключевого слова const объявлена целочисленная (int) константа N, равная 10. Константы обычно вводятся выше блока объявления переменных. Использование констант очень удобно, потому что при изменении размера массива в программе нужно поменять только одно число – значение этой константы.
Далее во всех примерах мы будем считать, что в программе объявлен целочисленный массив A, состоящий их N элементов (с индексами от 0 до N-1), а также целочисленная переменная i, которая будет обозначать индекс элемента массива. Чтобы ввести такой массив или вывести его на экран, нужно использовать цикл, то есть ввод и вывод массива выполняется поэлементно:
for ( i = 0; i < N; i++ )
{
printf ( "A[%d]=", i );
scanf ( "%d", &A[i] );
}
for ( i = 0; i < N; i++ )
printf ( "%d ", A[i] );

for ( i = 0; i < N; i++ )
{
cout << "A[" << i << "]=";
cin >> A[i];
}
for ( i = 0; i < N; i++ )
cout << A[i] << " ";



В этом примере перед вводом очередного элемента массива на экран выводится подсказка. Например, при вводе 3го элемента будет выведено «A[3]=». После вывода каждого элемента ставится пробел, иначе все значения сольются в одну строку.
Перебор элементов
Перебор элементов состоит в том, что мы в цикле просматриваем все элементы массива и, если нужно, выполняем с каждым из них некоторую операцию. Для этого удобнее всего использовать цикл с переменной, которая изменяется от минимального до максимального индекса. Поскольку мы будем работать с массивом, элементы которого имеют индексы от 0 до N-1, цикл выглядит так:
for ( i = 0; i < N; i++ )
{
...
}
Здесь вместо многоточия можно добавлять операторы, работающие с элементом A[i].
Во многих задачах нужно найти в массиве все элементы, удовлетворяющие заданному условию, и както их обработать. Простейшая из таких задач – подсчёт нужных элементов. Для решения этой задачи нужно ввести переменнуюсчётчик, начальное значение которой равно нулю.
Далее в цикле (от 0 до N-1) просматриваем все элементы массива. Если для очередного элемента выполняется заданное условие, то увеличиваем счётчик на 1. На псевдокоде этот алгоритм выглядит так:
счётчик = 0;
for ( i = 0; i < N; i++ )
if ( условие выполняется для A[i] )
счётчик ++;
Предположим, что в массиве A записаны данные о росте игроков баскетбольной команды.
Найдем количество игроков, рост которых больше 180 см, но меньше 190 см. В следующей программе используется переменнаясчётчик count:
count = 0;
for ( i = 0; i < N; i++ )
if ( 180 < A[i] && A[i] < 190 )
count ++;
Теперь усложним задачу: требуется найти средний рост этих игроков. Для этого нужно дополнительно в отдельной переменной складывать все нужные значения, а после завершения цикла разделить эту сумму на количество. Начальное значение переменной sum, в которой накапливается сумма, тоже должно быть равно нулю.
count = 0;
sum = 0;
for ( i = 0; i < N; i++ )
if ( 180 < A[i] && A[i] < 190 ) {
count ++;
sum += A[i];
}
printf ( "%f", (float)sum / count );
Обратите внимание, что в последней строке для того, чтобы получить вещественный (а не округленный целочисленный) результат деления, значение переменной sum преобразовано к вещественному числу с помощью записи (float)sum.
Контрольные вопросы
1. Что такое массив? Зачем нужны массивы?
2. Зачем нужно объявлять массивы?
3. Как объявляются массивы?
4. Как вы думаете, почему элементы массива расположены в памяти рядом?
5. Как обращаются к элементу массива?
6. Может ли нумерация элементов массива в языках C и С++ начинаться не с 0, а с другого чис
ла?
7. Почему размер массива лучше вводить как константу, а не число?
8. Как ввести массив и вывести его на экран?
9. Как заполнить массив случайными числами в диапазоне от 100 до 200?
Задания для практического занятия:
Разработать программы для 2-х задач из спмска самостоятельных заданий.
Подготовить отчет.
Инструкция по выполнению практической работы
Повторить теоретический материал.
Ответить на контрольные вопросы
Разработать программы для решения задач
Подготовить отчет
Задания для самостоятельного выполнения:
Заполните массив элементами арифметической прогрессии. Её первый элемент и разность нужно ввести с клавиатуры.
Заполните массив степенями числа 2 (от 21 до 2N).
Заполните массив случайными числами в диапазоне 20..100 и подсчитайте отдельно число чётных и нечётных элементов.
Заполните массив случайными числами в диапазоне 1000.2000 и подсчитайте число элементов, у которых вторая с конца цифра – чётная.
Заполните массив случайными числами в диапазоне 0..100 и подсчитайте отдельно среднее
значение всех элементов, которые <50, и среднее значение всех элементов, которые
·50.

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

Порядок выполнения отчета по практической работе
Разработать программы в соответствии с заданием.
Предоставить преподавателю работающие версии программ.

Название практической работы №12:
Решение задач обработки двумерных массивов.
Цель работы – овладеть навыками алгоритмизации и программирования структур с вложенными циклами, способами ввода и вывода, матриц, использовать приемы программирования во вложенных циклах,

Задания
1. Изучить:
а) правила организации вложенного цикла с учетом порядка перебора элементов матрицы;
б) правила использования приемов программирования в структурах с вложенными циклами;
в) способы ввода и вывода матриц, имеющиеся в языке программирования.
2. Разработать алгоритм решения в соответствии с заданием.
3. Составить программу решения задачи.
4. Подготовить тестовый вариант программы и исходных данных.

Контрольные вопросы
Указать основные правила организации вложенных циклов.
Указать способы выхода из внутреннего цикла.
Как организовать вывод матрицы в общепринятом виде?
Как организовать вывод нижней треугольной матрицы в общеприня
том виде?
Как организовать ввод матрицы размером N x M элементов?
Верно ли утверждение, что индекс массива должен иметь тип float.
Что такое матрицы? Зачем они нужны?
Сравните понятия «массив» и «матрица».
Как вы думаете, можно ли считать, что первый индекс элемента матрицы – это номер
столбца, а второй – номер строки?
Могут ли индексы элементов матрицы принимать отрицательные значения?
Что такое главная и побочная диагонали матрицы?
Почему суммирование элементов главной диагонали требует одиночного цикла, а суммирование элементов под главной диагональю – вложенного?

Варианты заданий
1. Дан двумерный массив. В каждой строке все его элементы, не равные нулю, переписать (сохраняя порядок) в начало строки, а нулевые элементы – в конец массива. Новый массив не заводить.
2. Даны целые числа a1, a2, a3. Построить целочисленную матрицу bij ,
i, j = 1, 2, 3, для которой bij= a
· i – 3
·a
· j.
3. Дана целочисленная матрица размера N x M. Вывести номер ее последней строки столбца, содержащего равное количество положительных и отрицательных элементов (нулевые элементы не учитываются).
4. Дана целочисленная матрица размера M x N. Различные строки (столбцы) матрицы назовем похожими, если совпадают множества чисел, встречающихся в этих строках (столбцах). Найти количество строк столбцов, похожих на первую последнюю строку столбца.
5. Дана целочисленная матрица размера M x N. Найти количество ее
строк столбцов, все элементы которых различны.
6. Дана квадратная матрица. Найти максимальное значение из элементов, расположенных в левом нижнем углу.
7. Дана квадратная матрица порядка M. Найти суммы элементов ее диагоналей, параллельных главной побочной (начиная с одноэлементной диагонали A[1,M]1|A[1,1]2).
8. Дана квадратная матрица порядка M. Вывести минимальные максимальные из элементов каждой ее диагонали, параллельной главной побочной (начиная с одноэлементной диагонали A[1,M]3|A[1,1]4).
9. Дана квадратная матрица порядка M. Заменить нулями элементы, лежащие одновременно выше ниже главной диагонали (включая эту диагональ) и выше ниже побочной диагонали (также включая эту диагональ).
10. Дана квадратная матрица порядка M. Зеркально отразить ее элементы относительно [горизонтальной оси симметрии] [вертикальной оси симметрии] [главной диагонали] [побочной диагонали] матрицы.
11. Дана квадратная матрица порядка M. Повернуть ее на 90о, 180о, 270о в положительном направлении.
12. Дана матрица размера N x M. Вывести количество строк столбцов, элементы которых монотонно возрастают, убывают.
13. Дана матрица размера N x M. Найти минимальный, максимальный среди элементов тех строк столбцов, которые упорядочены либо по возрастанию, либо по убыванию.
14. Дана квадратная матрица. Составить программу, которая прибавила бы каждому элементу данной строки элемент, который принадлежит этой строке и главной диагонали.
15. Дана матрица размера N x m. Поменять местами строки столбцы, содержащие минимальный и максимальный элементы матрицы.
16. В матрице А (m, n) найти строку с максимальной суммой элементов и строку с минимальной суммой элементов. Далее сформировать вектор В (2, m), у которого бы элементы чередовались с максимальной и минимальной строками.
17. Дана действительная квадратная матрица. Требуется преобразовать матрицу: поэлементно вычесть последнюю строку из всех строк, кроме последней.
18. В данной целочисленной квадратной матрице указать индексы всех элементов, имеющих наибольшее значение.
19. Задана квадратная матрица. Найти местоположение столбца (номер L) строки c минимальной суммой элементов, а также элемент с минимальным значением в матрице А. Далее сформировать вектор Р (5), каждый элемент которого равен разности соответствующих элементов К-столбца и L-строки, деленной на минимальный элемент матрицы А.
20. Задана прямоугольная матрица размера N х M. Найти местоположение (номер К) строки с максимальной суммой элементов. Далее сформировать матрицу В размером N х M, каждый элемент строки которой равнялся бы элементу соответствующей строки матрицы А, деленному на соответствующий элемент К-й строки.
21. Задана квадратная матрица R (n, n). Найти номер столбца К и строки L с максимальным произведением. Сформировать вектор В (2n), элементы которого чередуются: нечетные равны сумме, а четные – разности элементов К-го столбца и L-й строки.
22. Дана целочисленная матрица размера M x N. Найти элемент, являющийся максимальным в своей строке и минимальным в своем столбце.
23. Дана матрица размера M x N. Элемент называется локальным минимумом (максимумом), если он меньше (больше) всех окружающих его элементов. Заменить все локальные минимумы, максимумы данной матрицы на 0.
24. Дана матрица размера M x N. Поменять местами ее строки столбцы так, чтобы их минимальные и максимальные элементы образовывали возрастающую убывающую последовательность.
25. Дана прямоугольная матрица. Определить четные элементы, имеющие нечетную сумму индексов.
26. Найти максимальное из чисел, которое встречается в данной матрице более одного раза.
27. По данной матрице построить массив, элементы которого являются максимальными элементами диагоналей, параллельных главной.
28. По данной матрице построить массив, элементы которого являются максимальными элементами диагоналей, параллельных побочной.
29. Для заданной матрицы найти максимум среди сумм элементов диагоналей, параллельных главной.
30. Для заданной матрицы найти максимум среди сумм элементов диагоналей, параллельных побочной.
31. Среди строк целочисленной матрицы, которые содержат только простые числа, найти строку с максимальной суммой элементов
32. Среди столбцов целочисленной матрицы, которые содержат только четные числа, найти строку с максимальной суммой элементов
33. Две строки матрицы называются похожими, если совпадают множество чисел этих строк. Найти пару строк, у которых количество непохожих элементов максимально.
34. Дана матрица, найти максимальное значение среди минимальных по строкам.

Пример решения варианта задания
Дана квадратная матрица размером N x N. Переставить элементы верхнего треугольника матрицы с соответствующими элементами нижнего треугольника.__
Анализ задачи.
1. Начальные данные:
а) константа n, которая определяет размер матрицы;
б) двумерный массив размерности n;
в) параметр i для цикла по строкам;
г) параметр j для цикла по столбцам;
д) параметр r для промежуточной информации.
2. Результат вычисления: новая матрица с переставленными элементами.
3. Определяем диапазон изменения индексов элементов верхней треугольной матрицы:
а) если a[i][j] элемент верхнего треугольника матрицы, то его надо переставить с элементом a[n-1][j] нижнего треугольника;
б) строки верхней треугольной матрицы изменяются от индекса 0 до индекса n/2 (независимо от того, является ли значение n четным или нечетным).
в) номера столбцов j элементов верхнего треугольника i-той строки меняются от i до n-1- i.
На основании проделанного анализа запишем код программы для поставленной задачи.
void main()
{ const n = 5;
int i,j, a[n][n];
int r;
clrscr();
printf (“ Введи элементы матрицы: \n”);
for (i = 0; i <= n-1;i++)
for ( j = 0; j <= n-1; j++)
{ printf(“a(%d,%d)= “,i,j);
scanf( "%d", &a[i][j]);
cout << "Введена матрица: \n";
for ( i = 0;i < n; i++)
{ for ( i = 0; j < n; j++)
printf(“%d “, a[i][j]);
printf("\n");
}
for ( i = 0; i <= n/2; i++)
for (j = i; j <= n-1-i; j++)
{ r = a[i][j];
a[i][j] = a[n-1-i][j];
a[n-1-i] [j]=r; }
cout << "\n\nМатрица после перестановки:\n";
for ( i = 0; i <= n-1; i++)
{ for ( j = 0; j <= n-1; j++)
printf("%d ", a[i][j]);
printf("\n"); }
getch();}


Название практической работы №13:
Программирование с использованием динамических двумерных массивов в языке с++.
Теоретический материал
Объявление указателя
Для всех переменных выделяются участки памяти размером, соответствующим типу переменной. Программист имеет возможность работать непосредственно с адресами, для чего определен соответствующий тип данных – указатель. Указатель имеет следующий формат:
тип *имя_указателя;
Например:
int *a;
double *b, *d;
char *c;
Знак «звездочка» относится к имени указателя. Значение указателя соответствует первому байту участка памяти, на который он ссылается. На один и тот же участок памяти может ссылаться любое число указателей.
В языке С существует три вида указателей:
1. Указатель на объект известного типа. Содержит адрес объекта определенного типа.
Например: int *ptr;
2. Указатель типа void. Применяется, еcли тип объекта заранее не определен.
Например: void *vptr;
3. Указатель на функцию. Адрес, по которому передается управление при вызове функции.
Например: void (*func)(int);
*func указатель на функцию, принимающей аргумент int и не возвращающей никаких значений.
2. Операции над указателями
К указателям можно применять две унитарные операции:
1. & (взятие адреса).
Указатель получает адрес переменной. Данная операция применима к пе-ременным, под которые выделен соответствующий участок памяти.
Например: int *ptr, var=1; // ptr – указатель, var – переменная
ptr = &var; // В ptr заносится адрес var
2. * (операция разадресации).
Предназначена для доступа к значению, расположенному по данному ад-ресу.
*ptr = 9; // В ячейку памяти, с адресом ptr записывается значение 9
var = *ptr; // Переменной var присваивается значение,
// расположенное по адресу ptr
Над указателями можно выполнять арифметические операции сложения, инкремента (увеличения на 1), вычитания, декремента (уменьшения на 1) и операции сравнения (>, >=, <, <=, ==, !=). При выполнении арифметических операций с указателями автоматически учитывается размер данных, на которые он указывает.
Например:
ptr++; // Сдвиг указателя ptr на один элемент вперед
(*ptr)++; // (или ++*ptr;) Увеличение на 1 значения переменной,
// на которую указывает указатель ptr
*ptr = NULL; // Очистка указателя рtr1
Указатели, как правило, используются при работе с динамической памя-тью (heap или «куча»). Для работы с динамической памятью в языке С опреде-лены следующие функции: malloc, сalloc, realloc и free.
В языке C++ для выделения и освобождения памяти определены операции new и delete соответственно. Используют две формы операций:
1. Тип *указатель = new тип (значение); – выделение участка памяти в соответствии с указанным типом и занесение туда заданного значения.
delete указатель; – освобождение выделенной памяти.
2. Тип *указатель = new тип[n]; – выделение участка памяти размером n блоков указанного типа.
delete [ ] указатель; – освобождение выделенной памяти.
Пример работы с одномерным динамическим массивом:
int *a; // Объявление указателя a
a = new int[n]; // Выделение n блоков памяти целого типа
// Работа с массивом a
delete [] a; // Освобождение выделенной памяти
3. Создание двумерного динамического массива
Имя любого массива рассматривается компилятором как указатель на ну-левой элемент массива. Так как имя двумерного динамического массива явля-ется указателем на указатель, то сначала выделятся память под указатели, а затем под соответствующие этим указателям строки. Освобождение выделен-ной памяти происходит в обратном порядке.
4. Пример выполнения работы
Написать программу перестановки минимального и максимального эле-ментов двумерного массива размером NxM. Память для массива выделить ди-намически.
#include
#include
#include
int main() 23 {
double **a, tmp;
int i, j, n, m, imin, jmin, imax, jmax;
cout << "Vvedite razmer: n, m" << endl;
cin >> n >> m;
a = new double*[n]; // Выделение памяти под массив указателей
for(i=0; ia[i] = new double[m]; // этим указателям строки матрицы
for (i=0; ifor (j=0; j{
cout << "Vvedite a[" << i << "][" << j << "]: " ;
cin >> a[i][j];
}
cout << "Мassiv A:" << endl; // Вывод двумерного массива
for (i=0; i{
for (j=0; jcout << setw (9) << a[i][j] << " ";
cout << endl;
}
imin=jmin=imax=jmax=0; // Поиск индексов минимального и
for (i=0; ifor (j=0; j{
if (a[i][j]jmin=j;
}
if (a[i][j]>a[imax][jmax]) { imax=i;
jmax=j;
}
}
tmp = a[imin][jmin]; // Перестановка элементов
a[imin][jmin] = a[imax][jmax];
a[imax][jmax] = tmp;
cout << "Result :" << endl; // Вывод результата
for (i=0; i{
for (j=0; jcout << setw (9) << a[i][j] << " ";
cout << endl;
}
for(i=0; idelete [] a[i];
delete []a;
a = NULL;
return 0;
}
5.5. Индивидуальные задания
Ввести матрицу размером NxM. Память для массива выделить динамически. Выполнить в соответствии с номером варианта индивидуальное задание и вывести на экран исходные данные и полученный результат.
1. Определить количество положительных элементов, расположенных ниже побочной диагонали матрицы.
2. Определить количество отрицательных элементов, расположенных вы-ше главной диагонали матрицы.
3. Определить сумму отрицательных элементов, расположенных выше побочной диагонали матрицы.
4. Определить произведение положительных элементов, расположенных ниже главной диагонали матрицы.
5. Определить сумму элементов, расположенных на главной диагонали матрицы, и произведение элементов, расположенных на побочной диагонали матрицы.
6. Определить количество четных элементов, расположенных на главной и побочной диагоналях.
7. Найти максимальный среди элементов, лежащих ниже побочной диагонали.
8. Найти минимальный среди элементов, лежащих выше главной диагонали.
9. Найти максимальный среди элементов, лежащих выше побочной диагонали.
10. Найти минимальный среди элементов, лежащих ниже главной диагонали.
11. Найти в каждой строке матрицы максимальный элемент.
12. Найти в каждом столбце матрицы минимальный элемент.
13. Найти сумму элементов, расположенных в четных (по номеру) строках матрицы.
14. Найти произведение элементов, расположенных в нечетных (по номеру) столбцах матрицы.
15. Подсчитать сумму четных элеметнов и произведение нечетных эле-ментов матрицы.
Контрольные вопросы
Что такое матрицы? Зачем они нужны?
Сравните понятия «массив» и «матрица».
Как вы думаете, можно ли считать, что первый индекс элемента матрицы – это номер
столбца, а второй – номер строки?
Могут ли индексы элементов матрицы принимать отрицательные значения?
Что такое главная и побочная диагонали матрицы?
Почему суммирование элементов главной диагонали требует одиночного цикла, а суммирование элементов под главной диагональю – вложенного?

Название практической работы 14:
Решение задач с использованием функций

Ц е л ь р а б о т ы : Приобретение навыков работы с функциями.

Основные сведения
Функции – это блоки языка программирования, самостоятельные единицы программы, спроектированные для решения конкретных задач, обычно повторяющиеся несколько раз.
Объявление функций. Основная форма описания функции имеет вид:
тип <имя функции>(список параметров){<тело функции>}

Тип определяет тип значения, которое возвращает функция с помощью оператора return. Список параметров состоит из перечня типов и имен передаваемых параметров, разделенных запятыми. Функция может не иметь параметров, но круглые скобки необходимы в любом случае.
П р и м е р .1. Выполнить вычисление по формуле, используя функцию:
z = |x2 + y2 |.
Вариант 1

Вариант 2

# include
# include
double fn(double x,double y)
{return fabs(x*x+y*y);}
void main()
{double x,y,z;
printf("Введите х и y");
scanf("%lf%lf",&x,&y);
z=fn(x,y);
printf("z равно %lf",z);
}

# include
# include
double fn(double x,double y);
void main()
{double x,y,z;
printf("Введите х и y");
scanf("%lf%lf",&x,&y);
z=fn(x,y);
printf("z равно %lf",z);
}
double fn(double x,double y)
{return fabs(x*x+y*y);}



Как видно из примера 1, описание функции может быть произведено до и после функции main, а объявление функции, т.е. задание ее прототипа необходимо производить до ункции main. В примере 1 прототипом функции является строка
double fn(double x,double y).
В качестве аргумента (передаваемого значения) функции можно использовать массив. Одним из способов объявления такой функции является строка:
тип <имя функции>(<тип элементов массива> *<имя массива>);

П р и м е р . 2. Объявить функцию, в качестве аргумента которой используется массив с именем ar, состоящий из 10 элементов типа int.
1 способ: void sort(int *ar); 2 способ: void sort(int ar[]); 3 способ: void sort(int ar[10]);

П р и м е р 5.3. Оформить сортировку массива в виде функции.
# include
void sort(int *arr,int n);
void main()
{ int mass[10]={1,3,-5,7,9,0,22,4,6,8};
int size=10,i;
for(i=0;i<10;i++) printf(" %d",mass[i]);
sort(mass,size);
printf("\n");
for(i=0;i<10;i++) printf(" %d",mass[i]);
}
void sort(int *arr,int n)
{ int i,j,tmp;
for(i=0;ifor(j=0;jif(arr[j+1]{ tmp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=tmp;
}
}
Практические задания
В соответствии с номером варианта выполнить задания, используя функции.


Контрольные вопросы
1. Описание и объявление функции с параметрами и без параметров.
2. Оператор return. Использование в функциях.
3. Область действия и область видимости переменных.
4. Параметры и аргументы функций.
5. Передача параметров функции по значению и по ссылке.
6. Использование рекурсивных функций.
7. Функции с переменным числом параметров.
8. Использование указателей на функции.

Название практической работы 15:
Программирование с использованием вспомогательных функций в языке с++
Цель работы – овладеть навыками программирования задач с использованием функций пользователя различных видов.
Задания
1. Изучить:
а) правила записи функций различных видов и способов обращений к ним;
б) способы передачи параметров в функцию;
в) порядок выполнения программ, использующих функции.
2. Разработать алгоритм решения в соответствии с заданием.
3. Составить программу решения задачи.
4. Подготовить тестовый вариант программы и исходных данных.

Контрольные вопросы
1. Указать, при каких условиях целесообразно использовать функции, какие выгоды они предоставляют пользователю.
2. Запишите общий формат объявления функции.
3. Указать, в чем отличие различных видов функций пользователя.
4. Указать способ обращения к функциям пользователя.
5. Указать способы передачи параметров в функцию.
6. Указать способы передачи одномерного массива в функцию.
7. Указать способы передачи двумерного массива в функцию.
8. Как можно передавать динамический двумерный массив в функцию.
9. Классификация параметров относительно функций.
10. Перечислить, как согласуются формальные и фактические параметры.
11. Пояснить, как и куда осуществляется выход из подпрограммы.
12. Может ли функция с типом void возвращать значение.
13. Может ли функция быть частью выражения.
14. Сохраняет ли значение локальная переменная значение между вызовами функции, в которой она объявлена.
15. Может ли функция возвращать массив.
Варианты задания
Составить программы, используя функции.
Задания практических работ 8 и 10 оформить в виде набора функций.
Пример решения варианта работы
Дан одномерный массив x[n], где n – размер массива. Оформить ввод элементов массива из файла, сортировку и вывод массива на экран монитора в виде функции.
Анализ задачи.
1. Начальные данные:
а) константа n, которая определяет размер массива;
б) одномерный массив размерности n;
в) файловая переменная;
г) переменная i для управляющего параметра цикла.
2. Составляем программу ввода массива из файла, вывод массива на экран монитора и сортировки массива без применения функций.
void main(void)
{
const n = 4 ;
int i, j, imi, a[n];
int r;
FILE *f;
clrscr();
// Ввод одномерного массива из файла
f = fopen("t.dat","r");
for ( i = 0; i <= n-1; i++ ) // Перебор индексов массива.
fscanf( f, "%d", &a[i] ); // Ввод элемента массива из файла.
// Вывод массива на терминал
cout << “\t\tМассив из файла до сортировки:\n”;
for ( i = 0; i <= n-1; i++ )
printf("%d ", a[i]);
// Сортировка элементов массива
for ( i = 0; i < n; i++)
{ imi = i;
for ( j = i+1; j < n; j++)
if ( a[imi] > a[j]) imi = j;
r = a[i];
a[i] = a[imi];
a[imi] = r; }
cout << “\n\n\t\tМассив после сортировки:\n”;
for ( i = 0; i <= n-1; i++ )
printf("%d ", a[i]);
getch(); }
В тексте кодов жирным шрифтом выделяются три фрагмента, которые в программе выполняют задачу вводы, вывода массива и его сортировки. Вообще любой фрагмент программы можно оформить в виде функции. Для этого надо:
а) этот фрагмент оформить как блок операторов с заголовком;
б) затем решить вопрос, какие переменные включить в заголовок.
в) определить какие переменные будут являться локальными в блоке;
г) этот блок операторов с заголовком разместить после вызывающей программы.
д) в вызывающей программе фрагмент кодов, оформленный в виде функции, заменяем обращением к этой функции).
Используя этот несложный алгоритм, оформим в виде функции фрагмент программы, сортирующий массив.
3. Оформляем этот фрагмент в виде блока операторов с заголовком:
void sort_m ()
{
for ( i = 0; i < n; i++)
{ imi = i;
for ( j = i+1; j < n; j++)
if ( a[imi] > a[j]) imi = j;
r = a[i];
a[i] = a[imi];
a[imi] = r; }
}
4. Массив и размер массива надо передавать в функцию из вызывающей программы, поэтому данные переменные включаем в заголовок функции
void sort_m (int *a, int n)
{
for ( i = 0; i < n; i++)
{ imi = i;
for ( j = i+1; j < n; j++)
if ( a[imi] > a[j]) imi = j;
r = a[i];
a[i] = a[imi];
a[imi] = r; }
}
6. Переменные фрагмента i, j, imi, r, которые ни как не связаны с параметрами вызывающей программы, объявляем локальными для новой функции.
void sort_m (int *a, int n)
{
int i, j, imi, r;
for ( i = 0; i < n; i++)
{ imi = i;
for ( j = i+1; j < n; j++)
if ( a[imi] > a[j]) imi = j;
r = a[i];
a[i] = a[imi];
a[imi] = r; }
}
Функция для сортировки элементов массива сформирована.
Осталось: эту функцию разместить в конце вызывающей программы;
фрагмент кодов, оформленный в виде функции, заменить обращением к этой функции.
В итоге (применяя данный подход к первому и второму фрагменту)
программа с тремя функциями: ввода, вывода и сортировки данных будет составлена.
void vv_mas(int *a, FILE *f, int n);
void viv_mas(int *a, int n);
void sort_mas (int *a, int n);
void main(void)
{
const n = 4 ;
int i, j, imi, a[n];
int r;
FILE *f;
clrscr();
// Ввод одномерного массива из файла.
f = fopen("t.dat","r");
vv_mas(a,f,n); // Обращение к функции ввода массива из файла.
cout << “\t\tМассив из файла до сортировки:\n”;
viv_mas(a,n); // Обращение к функции вывода массива.
sort_mas(a,n); // Обращение к функции сортировки массива.
cout << “\n\n\t\tМассив после сортировки:\n”;
viv_mas(a,n); // Обращение к функции вывода массива.
getch(); }
// Функция ввода элементов массива из файла.
void vv_mas(int *a, FILE *f, int n)
{int i;
for ( i = 0; i <= n-1; i++ ) // Перебор индексов массива.
fscanf( f, "%d", &a[i] ); // Ввод элемента массива из файла.
}
// Функция вывода элементов массива из файла.
void viv_mas(int *a, int n)
{int i;
for ( i = 0; i <= n-1; i++ )
printf("%d ", a[i]);
}
// Функция для сортировки элементов массива.
void sort_mas (int *a, int n)
{
int i, j, imi, r;
for ( i = 0; i < n; i++)
{ imi = i;
for ( j = i+1; j < n; j++)
if ( a[imi] > a[j]) imi = j;
r = a[i];
a[i] = a[imi];
a[imi] = r; }
}
Замечание 1. Если функции расположены после вызывающей программы, то заголовки функций должны быть через точку с запятой перечислены перед именем вызывающей программы.
Замечание 2. Имена формальных параметров функции – произвольные и не обязательно (как в нашем примере) должны совпадать с именами переменных головной программы.
Название практической работы 16:
Решение задач по обработке строк
Цель урока: 
    Цель - познакомиться с функциями работы со строками в языке С. 
1. Специальная библиотека в файле string.h. 
    Для работы со строками в языке С есть специальные функции, которые описаны в библиотечном файле string.h. Наиболее часто используются такие функции как: 
strcpy(), strcat(), strcmp(). 
    Рассмотрим их поподробнее. Вызов функции strcpy() имеет вид: 
strcpy(s1, s2); 
    Эта функция позволяет копировать содержимое строки s2 в строку s1. Массив s1 должен быть достаточно вместительным, чтобы в него поместилась строка s2. Если нужного места не хватает, то компилятор не выдает сообщение об ошибке или хотя бы предупреждение. Программа не прервет свою работу. Однако же все это вполне может привести к порче данных или самой программы. В результате программа может работать, но неправильно. И никто об этом не узнает. 
    Функция strcat() имеет вызов: 
strcat(s1, s2); 
    Функция strcat() присоединяет строку s2 к строке s1 и помещает новую строку в массив, где находилась строка s1. Строка s2 не изменяется. При этом, как и в предшествующем случае, нет никакого контроля. Нулевой байт строки s1 заменяется первым символом строки s2. Новая строка автоматически завершится нулевым байтом. 
    Разберем и изучим несложную программу, в которой показано использование этих функций. 
#include
#include
#include
/* Пример программы для работы со строками */
main() { char s1[20], s2[20];
// Очистить экран
textbackground(5); textcolor(15); clrscr(); strcpy(s1, "Hello, ");
strcpy(s2, "World!");
puts(s1); puts(s2); strcat(s1, s2);
puts(s1); puts(s2); getch(); }      Ниже на рисунках показаны: исходный текст программы после отладки и результат работы программы. 
        В силу того, что строка s1 и строка s2 в описании программы предусмотрены довольно длинными (каждая по 20 символов) ничего плохого не наблюдается при выполнении программы. Вы видите, что новая строка s1 содержит прежнюю строку s1 и к ней как бы "приклеена справа" строка s2. Сама строка s2 в результате этих манипуляций не изменилась. 

2. Функции strcmp() и strlen() . 
    Вызов функции strcmp() имеет вид: 
strcmp(s1, s2); 
    Функция strcmp сравнивает строки s1 и s2 и возвращает значение 0, если строки равны. При этом код первого символа одной строки сравнивается с кодом соответствуюго символа второй строки. Если они равны, то сраваются вторые символы и так далее. Если s1 лексикографически больше s2, то функция возвращает положительное значение. Если меньше, то - отрицательное значение. 
    Вызов функции strlen() имеет вид: 
strlen(s);      Функция strlen() возвращает длину строки s. При этом завершающий нулевой байт не учитывается. Например, вызов функции strlen("Hello") вернет значение 5. Рассмотрим применение этой функции для вычисления длины строки, вводимой с клавиатуры. 
#include
#include
#include
#include
/* Пример программы */
main() { char s[80];
char str0[50];
char str1[50];
// Очистить экран
textbackground(5); textcolor(15); clrscr(); CharToOem("Введите строку: \n", str0);
printf(str0); gets(s); CharToOem("Строка \n %s \n имеет длину %d символов \n", str1);
printf(str1, s, strlen(s));
getch(); }     Ниже на первом рисунке Вы видите исходный текст программы, полученный после устранения всех ошибок. 
      На втором рисунке показано решение, полученное по этой программе. Вводился такой текст: "люблю грозу в начале мая, когда весенний первый гром как бы резвяся и играя". Длина этого текста действительно составляет 75 символов. 
 
3. Наиболее часто используемые функции для работы со строками в Си.      Строковые функции языка Си находятся в специальной библиотеке: string.h. Это такие функции как:
    strcpy(),
    strcat(),
    strcmp().
Рассмотрим отдельно вызов и назначение каждой названной функции.  3.1. Вызов функции strcpy() имеет вид: strcpy(s1, s2). 
    Функция используется для копирования строки s2 в строку s1. Согласно предшествующему уроку Вам известно, что строка s2 - это одномерный массив. Поэтому строка s1, принимающая строку s2, должна быть также одномерным массивом. Однако, если размер строки s1 меньше, чем размер массива s2, то может возникнуть неприятность, ибо Си не проверяет равны ли размеры строк s1 и s2. Си не выдаст указания или предупреждения об ошибке, не прервет выполнение программы, и это может привести к порче данных или даже самой программы. Возможна даже неправильная работа программы в дальнейшем.
3.2. Вызов функции strcat() имеет вид: strcat(s1, s2). 
    Функция присоединяет строку s2 к строке s1 и помещает ее в массив, где расположена строка s1. При этом строка s2 остается прежней и никак не меняется. В этом случае нулевой байт, который имелся в конце строки s1, заменяется первым символом строки s2. В результате новая строка s1 обязательно завершаются нулевым байтом. 
    Рассмотрим следующий простой пример использования этих двух функций: 
    Программа 
   #include
  #include
   main()    {    char s1[21], s2[21]; /* место для двух строк s1 и s2 */
   // Очистить экран
   textbackground(4);
   textcolor(15);
   clrscr();
   strcpy(s1, "Краснодарский край -");
   strcpy(s2, " житница всей России");
   puts(s1);
   puts(s2);
   strcat(s1, s2);
   puts(s1);
   puts(s2);
   printf("\n Для выхода нажмите любую клавишу");
   getch();    }      3.3. Вызов функции strcmp() имеет вид: strcmp(s1, s2). 
    Функция сравнивает строки s1 и s2 и возвращает значение 0, если строки равны. Что значит равенство строк? Это значит, что обе строки имеют одно и то же число одинаковых символов. Здесь происходит посимвольное сравнение кодов символов. При этом сравнение основано на использовании обычного лексикографического расположения символов. По алфавиту, например, как это делается при расположении слов в словаре. Код первого символа первой строки сравнивается с кодом первого символа второй строки, код второго символа первой строки сравнивается с кодом второго символа второй строки и так далее. Если символы, расположенные на одном и том же месте в двух строках равны, то сравниваются следующие символы и так далее. Если обычное лексикографическоев (как в словаре) сравнение показывает, что символ s1 больше символа s2, то функция возвращает положительное значение. В противном случае - возвращает отрицательное значение. Это будет означать, что символ s1 меньше символа s2. 
2.4. Вызов функции strlen() имеет вид: strlen(s). 
    Функция возвращает длину строки s. Нулевой байт не прибавляется к длине строки. Например, если Вы обратитесь в функции strlen() с запросом: strlen("Krasnodar"), то данное обращение вернет Вам число 9. Хотя в массиве под эту величину отведено 10 байтов. Последний нулевой байт при определении длины строки не принимается во внимание. Рассмотрим в заключение применение этой функции для вычисления длины строки, вводимой с клавиатуры. 
   


Название практической работы 17:
Программирование с использованием файлов

Цель работы – овладеть навыками алгоритмизации и программирования задач, обрабатывающих символьные данные; ввода и вывода символьных данных, их обработки; научиться использовать функции обработки символьных данных; овладеть навыками алгоритмизации и программирования файловых структур данных; научиться проектировать структуры файла, запись данных в файл, ввод данных из файла.

Задания
1. Изучить:
а) правила записи символьных данных (констант, переменных, массивов) и их описание;
б) способы ввода и вывода символьных данных;
в) способы обработки символьных данных;
г) использование функций обработки символьных данных;
д) правила составления программ с использованием символьных данных;
е) основную терминологию, связанную с файловыми структурами данных.
ж) возможности языка программирования по обработке файла с последовательной организацией: записи данных в файл, ввод из файла, до записи данных в файл и т. п.
2. Разработать алгоритм решения в соответствии с заданием.
3. Составить программу решения задачи.
4. Подготовить тестовый вариант программы и исходных данных.

Контрольные вопросы
1. Указать, какие операции можно выполнять над символьными данными.
2. Указать способ описания символьных данных.
3. Назвать специальные функции, используемые для обработки символьных данных.
4. Объяснить, что означают следующие термины: файл, запись, метод доступа, структура записи?
7. Каково назначение операторов открытия и закрытия файлов на языке программирования?
8. Допустимы ли различные типы данных для элементов одной записи?
9. Указать, с помощью, каких операторов выполняется запись данных в файл последовательного доступа, чтение из файла?
10. Привести пример использования файлов последовательного доступа.
11. Как распознать конец файла данных?
12. Какому коду эквивалентно выражение *s++;
Варианты заданий
Обрабатываемый текст программа считывает из файла.
1. Подсчитать количество слов во введенном тексте.
2. Подсчитать количество предложений во введенном тексте.
3. Напечатать в столбик первые слова всех предложений текста.
4. Напечатать в столбик последние слова всех предложений текста.
5. Определить и напечатать слова максимальной длины.
6. Определить и напечатать слова минимальной длины.
7. Определить, в каком по счету предложении впервые встретилось заданное слово.
8. Напечатать предложение, в котором впервые встретилось заданное слово.
9. Напечатать последовательно все двойные буквы (в слове подряд две одинаковых).
10. Подсчитать количество букв, которые встретились в тексте двойными.
11. Напечатать текст, заменив все буквы е на буквы е.
12. Напечатать текст, выпустив все гласные буквы.
13. Напечатать последовательно все встретившиеся в тексте цифры.
14. Подсчитать количество встретившихся в тексте цифр.
15. Проверить правильность написания чисел в тексте. Встретившиеся в начале числа незначащие нули опустить. Исправленный текст напечатать.
16. Прочитать текст построчно справа налево, напечатать.
17. Напечатать текст, выпустив повторяющиеся пробелы между словами.
18. Напечатать в столбик все аббревиатуры из текста.
19. Проверить правильность написания знаков пунктуации. Слева от знака пунктуации пробел не ставится, справа ставится один пробел. Исправленный текст напечатать.
20. Округлить все имеющиеся в тексте числа, оставив после точки две цифры.
21. Напечатать последовательно первые буквы всех слов текста.
22. Напечатать последовательно последние буквы всех слов текста.
23. Напечатать последовательно все гласные буквы из текста.
24. Напечатать все отрицательные числа из текста.
25. Напечатать все положительные числа из текста.
26. Выдать строки по возрастанию количества слов в них.
27. Даны две строки. Определить, состоят ли они из одних и тех же символов.
28. Выдать слова, которые начинаются и заканчиваются одной и той же буквой.
29. Выдать слова, у которых первый символ совпадает с первым, а последний – с последним.
30. Выдать строки, в которых есть слова с тремя буквами у.
Пример решения варианта задания
Подсчитать количество слов, которые начинаются с гласной буквы.
Текст вводить из файла.
Анализ задачи.
Начальные данные:
а) строковая константа для разделителей;
б) строковая константа для гласных букв;
в) переменная ch для символа текста;
г) переменная k для числа символов в слове;
д) строка для текста из файла;
е) строка для формирования слова из текста;
ж) переменная i для параметра цикла (индекса элементов строк);
з) файловая переменная для указателя файла;
и) параметр n для подсчета слов, которые начинаются с гласных букв.

Основой для решения задач из данного раздела является программа для выделения слова из текста. Данная программа подробно разбирается в лекциях методического комплекса и ее код приведен ниже.
Программа выделяет слово из текста.
void main()
{FILE *f1;
char *str = ",. !?:;:'\n\0"; // str – Константа с разделителями.
char ch = ' ';
char st[81], sr[81]; // sr – для строки из файла.
// st – для слова из строки.
int k = -1, i;
clrscr();
f1 = fopen("str_w.dat", "r");
do
{ fgets(sr,80,f1); // Ввод строки из файла.
for (i = 0; i < strlen(sr); i++) // Начало цикла по i.
{ ch = sr[i];
if (strchr( str,ch) ) // Если символ не разделитель, то иди на
// формирование слова.
{
if (k != -1) // Если слово сформировано, значение k не равно –1.
{
k++; // Определяем индекс для символа \0 (конец строки).
st[k] = '\0'; // Из массива символов st формируем строку.
cout << "\n" << st; // Вывод слова на экран.
k = -1; // Устанавливаем k = –1.
}
}
else
{ // Формируем слово.
k++; // Определяем индекс k для текущего символа слова.
st[k] = ch; // В массив для слова st засылаем текущий символ.
} } // Конец цикла по i.
} while (!feof(f1)); // Конец цикла по считыванию текста из файла.
fclose(f1);
getch(); }

Если мы теперь код вывода слова (этот код выделен жирным шрифтом) заменим на коды, которые определены условием задачи, то исходная задача будет решена. В нашем варианте надо определить, начинается ли слово с гласной буквой. Для этого надо код:
cout << "\n" << st; // Вывод слова на экран.
заменить на коды:
if (strchr( stb,st[0]) ) // Если у слова первая буква гласная,
{ cout << "\n" << st; // то слово выводится на экран.
n++; }
Здесь stb – строковая константа с набором гласных букв; st – строка с текущим словом; strchr() – стандартная функция из файла string.h. Эта функция определяет, содержится ли символ st[0] в строке stb.
В других задачах сформированное слово надо преобразовать по определенным правилам.
void main()
{
FILE *f1;
char *str = ",. !?:;:'\n\0"; // str – Константа с разделителями.
char *stb=“aAeEyYuUiIoOjJаАуУеЕыЫоОэЭяЯиИюЮ”; // Константа
// с гласными
char ch = ' ';
char st[81], sr[81]; // sr – для строки из файла.
// st – для слова из строки.
int k = -1, i, n =0;
clrscr();
f1 = fopen("str_w.dat", "r");
do
{
fgets(sr,80,f1); // Ввод строки из файла.
for (i = 0; i < strlen(sr); i++) // Начало цикла по i.
{
ch = sr[i];
if (strchr( str,ch) ) // Если символ не разделитель, то иди на
// формирование слова.
{
if (k != -1) // Если слово сформировано, значение k не равно –1.
{
k++; // Определяем индекс для символа \0 (конец строки).
st[k] = '\0'; // Из массива символов st формируем строку.
if (strchr( stb,st[0]) ) // Если у слова первая буква гласная,
{ cout << "\n" << st; //то слово выводится на экран.
n++;
}
k = -1; // Устанавливаем k = –1.
}
}
else
{ // Формируем слово.
k++; // Определяем индекс k для текущего символа слова.
st[k] = ch; // В массив для слова st засылаем текущий символ.
}
} // Конец цикла по i.
} while (!feof(f1)); // Конец цикла по считыванию текста из файла.
fclose(f1);
if ( n!= 0)
cout << “Число слов, которые начинаются с гласных букв= ”
<< n << “\n”;
else
cout << “Слов, которые начинаются с гласных букв нет\n ”;
getch(); }

Название практической работы 18:
Решение задач с использованием структур
Цель работы – научиться определять структуры, освоить формат доступа к элементам структуры и к элементам массива структур. Научится создавать текстовые файлы с массивом структур, овладеть техникой ввода и вывода элементов структур.

Задания
1. Изучить:
а) терминологию, которая связана со структурой;
б) формат определения структуры;
в) формат доступа к полям структуры;
г) способ задания массива структур;
д) способы доступа к полям элемента массива структуры;
е) способы ввода и вывода элементов массива структур.
2. Разработать алгоритм решения в соответствии с заданием.
3. Составить программу решения задачи.
4. Подготовить тестовый вариант программы и исходных данных.

Контрольные вопросы
1. Где может быть использована структура?
2. Как называются элементы структуры?
3. Как определить структуру?
4. Может ли структура содержать элементы одного типа?
5. Как обратиться к полям структуры?
6. Как обратится к элементу массива структур?
7. Какое ключевое слово начинает определение структуры?
8. Как обратиться к полям структуры через указатель на нее?
9. При помощи какой операции формируется доступ к полям структуры?
10. Какая разница между определениями структуры и массива?
11. Опишите объект, для которого надо определить структуру и определите ее.

Варианты заданий
Создать структуру «студент» со следующими данными: фамилия, имя, отчества, пол, факультет, курс, группа, отметки по пяти предметам, город (село) проживания. Сформировать текстовый файл со списком студентов.
Для каждого пункта характеристики студента выделять строку. Данные о студентах отделяются друг от друга пустыми строками. Для выполнения задания данные из текстового файла ввести в массив структур программы.
1. Сформировать список студентов, в котором студенты-задолжники расположены по алфавиту. Список выдать на экран. Студентов-задолжников при выводе пометить.
2. Сформировать список студентов, в котором студенты-задолжники по двум предметам расположены по алфавиту. Список выдать на экран. Студентов-задолжников при выводе пометить.
3. Сформировать список студентов, в котором студентки-отличницы расположены по алфавиту. Список выдать на экран. Студенток-отличниц при выводе пометить.
4. Сформировать список студентов, в котором студентки-отличницы, проживающие в городе Ачинске и имеющих пятерки, расположены по алфавиту.
5. Сформировать список студентов, в котором студенты расположены по алфавиту мест проживания. Список выдать на экран.
6. Сформировать список студентов, в котором студенты-отличники, проживающие в городе Москве, расположены по алфавиту. Список выдать на экран. Студентов-москвичей при выводе пометить.
7. Сформировать список студентов, в котором студенты расположены по убыванию среднего балла. Этот список выдать.
8. Сформировать список студентов по курсам. Список по курсам формировать по убыванию процентов отличников среди юношей.
9. Сформировать список студентов по группам факультета ИВТ. Список по группам формировать по возрастанию количества неуспевающих студентов. Список выдать. Неуспевающих студентов при выводе пометить.
10. Выдать номер курса факультета ИВТ, на котором больший процент отличников юношей. Составить список студентов, в котором группы факультета ИВТ расположены по убыванию процента отличников в нем.
11. Выдать самую распространенную фамилию юношей из списка студентов. Сформировать список студентов, в котором фамилии юношей расположить в порядке уменьшения их частоты. Фамилии юношей одинаково распространенных располагать по алфавиту. Список студентов выдать. Студентов с самой распространенной фамилией пометить.
12. Сформировать список студентов, в котором студентки расположены по убыванию среднего балла. Список студентов выдать.
13. Выдать самую распространенную фамилию девушки из списка студентов. Сформировать список студентов, в котором фамилии студенток расположить в порядке уменьшения их частоты. Фамилии студенток, одинаково распространенных, располагать по алфавиту. Список студентов выдать. Студенток с самой распространенной фамилией пометить.
14. Выдать самую распространенную фамилию юношей из списка студентов первого курса. Сформировать список студентов, в котором студенты найденного курса располагаются первыми. Если таких курсов несколько, то списки выдавать по убыванию номера курса.
15. Выдать самую распространенную фамилию юношей из списка студентов факультета ИВТ. Сформировать список студентов ИВТ, в котором на первом месте перечисляются группы с распространенной фамилией. Если таких групп несколько, то группы располагать по убыванию номеров групп. Список выдать. Студентов с самой распространенной фамилией при выводе пометить.
16. Выдать самую распространенную фамилию девушки из списка студентов из первого курса. Сформировать список, в котором на первом месте перечисляются факультеты с распространенной фамилией. Если факультетов несколько, то порядок по факультетам произвольный. Список выдать. Студенток с самой распространенной фамилией при выводе пометить.
17. Выдать самую распространенную фамилию девушки из списка студентов факультета ИВТ. Сформировать список студентов ИВТ, в котором на первом месте перечисляются группы с распространенной фамилией. Если таких групп несколько, то группы располагать по убыванию номеров групп. Список выдать. Студенток с самой распространенной фамилией при выводе пометить.
18. Выдать курс и фамилии студенток по алфавиту, на котором обучается больше всего девушек. Сформировать список студентов, в котором курсы расположить по уменьшению количества девушек в нем. Список выдать.
19. Выдать курс и фамилии девушек по алфавиту. На каком курсе обучается больше всего девушек факультета ИВТ? Сформировать список студентов ИВТ по курсам. Курсы располагать по возрастанию студенток в нем. Список выдать.
20. По заданному номеру курса подсчитать средней бал каждой группы. Сформировать список, в котором группы данного курса располагаются по убыванию среднего бала. Список выдать.
21. По заданному факультету подсчитать средней бал каждого курса. Сформировать список, в котором курсы данного факультета располагаются по убыванию среднего бала. Список выдать.
22. На каждом курсе найти группы, в которых больше всего отличников. Сформировать список, в котором на первом месте перечислить студентов из этих групп. Группы перечислять в порядке убывания номеров курса. Список выдать.
23. Сформировать список студентов по факультету ИВТ, в котором на первом месте перечисляются отличники. Студенты-отличники перечисляются в порядке убывания номеров курса. Внутри курса в порядке убывания номеров групп. Список отличников выдать.
24. Сформировать список студентов, в котором студенты пятых курсов расположены в порядке убывания средних балов. Список выдать.
25. Сформировать список студентов, в котором неуспевающие студенты расположены в конце списка. Список выдать.
26. Исключить из списка студентов, которые по всем предметам имеют двойки. Новый список выдать.
27. Добавить в список одного студента. Студент должен быть внесен в соответствующий факультет и на соответствующий курс. Новый список выдать.
28. Из общего списка студентов сформировать список по факультетам (порядок по факультетам произвольный). Внутри факультета студентов группировать по возрастанию номеров курса. Список выдать.

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

Пример решения варианта задания
Личное дело студентов характеризуется пунктами: фамилия, пол и номер курса. Отсортировать список студентов по алфавиту. Список студентов занесен в текстовый файл.

Анализ задачи.
1. Начальные данные:
а) новый тип переменной styd, которая является структурой;
б) константа n, которая определяет число студентов в списке;
в) переменная i, j для параметров цикла;
г) указатель на файл;
д) массив структур типа styd;
е) переменная st типа styd для промежуточных результатов преобразований;
ж) текстовый файл со списком студентов. Структура файла следующее: для каждой характеристики студента отводится строка. Характеристики студентов отделены друг от друга пустой строкой.
2. Составляем программу ввода в массив структур данных из текстового файла.
const n = 10;
struct styd
{
char fam[60];
char pol;
float ves;
};
void main()
{
FILE *f1;
styd sp[n], sp1;
int i;
clrscr();
f1 = fopen("spis.dat","r");
for ( i = 0; i < n; i++)
{
fscanf(f1,"%s\n",&sp[i].fam);
fscanf(f1,"%c\n",&sp[i].pol);
fscanf(f1,"%f\n",&sp1.ves);
fscanf(f1,"%f\n",&sp[i].ves);
fscanf(f1, "\n");
printf("Фамилие\t%s\n",sp[i].fam);
printf(" пол\t%c\n",sp[i].pol);
printf(" вес\t%f\n",sp[i].ves);
printf("\n"); }
fclose(f1);
getch(); }
Сортировка массива слов по алфавиту реализуется следующим фрагментом:
for ( i = 0; i < n-1; i++)
{ im = i;
for ( j = i+1; j < n; j++)
if ( strcmp( sp[im], sp[j]) > 0) im = j;
strcpy(sr, sp[i]);
strcpy(sp[i] , sp[im]);
strcpy(sp[im], sr); }
Здесь sp[n] – массив слов, sr – строка для промежуточных результатов преобразования. Сортировка массива структур реализуется следующим фрагментом.
for ( i = 0; i < n-1; i++)
{ im = i;
for ( j = i+1; j < n; j++)
if ( strcmp( sp[im].fam, sp[j].fam) > 0) im = j;
sr = sp[i];
sp[i] = sp[im];
sp[im] = sr; }

Сравнение фрагментов показывает, что принципиальной разницы сортировки массива строк и массива структур по алфавиту нет. Просто элементы массива слов заменяются на элементы полей структур.
Фактически решение любых задач для массива структур алгоритмически ничем не отличается от решения подобных задач для массивов. И если поставлена задача для структуры, ее можно смело решать для массива, а затем там, где это надо, значение элементов массива заменить на соответствующие поля структуры.
Приведем окончательный вариант программы решения поставленной
задачи.
const n = 5;
struct styd
{
char fam[60];
char pol;
float ves;
};
void main()
{
FILE *f1;
styd sp[n], sp1;
int i,j, im;
clrscr();
f1 = fopen("spis.dat","r");
cout << "\t\tДо сортировки:\n\n";
for ( i = 0; i < n; i++)
{
fscanf(f1,"%s\n",&sp[i].fam);
fscanf(f1,"%c\n",&sp[i].pol);
fscanf(f1,"%f\n",&sp[i].ves);
fscanf(f1, "\n");
printf("Фамилие\t%s\n",sp[i].fam);
printf(" пол\t%c\n",sp[i].pol);
printf(" вес\t%f\n",sp[i].ves);
printf("\n");
}
getch();
clrscr();
for ( i = 0; i < n-1; i++)
{
im = i;
for ( j = i+1; j < n; j++)
if ( strcmp( sp[im].fam, sp[j].fam) > 0) im = j;
sp1 = sp[i];
sp[i] = sp[im];
sp[im] = sp1;
}
cout << "\t\tПосле сортировки:\n\n";
for ( i = 0; i < n; i++)
{ printf("Фамилие\t%s\n",sp[i].fam);
printf(" пол\t%c\n",sp[i].pol);
printf(" вес\t%f\n",sp[i].ves);
printf("\n"); }
fclose(f1);
getch(); }

Название практической работы 19.
Классы. Программирование линейных алгоритмов с использованием функций инициализации set() и вывода результатов print().
 
Цель работы – изучить основные способы работы с пользовательским типом данных «класс», его объектами, методами и способы доступа к ним.
 
Теоретические сведения
Основное отличие С++ от С состоит в том, что в С++ имеются классы. С точки зрения языка С классы в С++ - это структуры, в которых вместе с данными определяются функции. Это и есть инкапсуляция в терминах ООП.
Класс (class) - это тип, определяемый пользователем, включающий в себя данные и функции, называемые методами или функциями-членами класса.
Данные класса - это то, что класс знает.
Функции-члены (методы) класса - это то, что класс делает.
Таким образом, определение типа задаваемого пользователем (class) содержит спецификацию данных, требующихся для представления объекта этого типа, и набор операций (функций) для работы с подобными объектами.
Объявление класса
Приведем пример объявления класса
class my_Fun
{ // компоненты-данные 
double x,y;  
// компоненты-функции 
public: // функция инициализации 
void set(char *c, double X)
{ x=X; y=sin(x);     } // функция вывода результатов 
void print(void)
{ cout << point<} };
Обычно описания классов включают в заголовочные файлы (*.H), а реализацию функций-членов классов - в файлы *.CPP.
Для каждого объекта класса устанавливается область видимости либо явно – указанием уровня доступа одним из ключевых слов public, private, protected с двоеточием, либо неявно – по умолчанию. Указание области видимости относится ко всем последующим объектам класса, пока не встретится указание другой области видимости. Область видимости public разрешает доступ к объектам класса из любой части программы, в которой известен этот объект (общедоступный). Область видимости private разрешает доступ к объектам класса только из методов этого класса. Объекты с такой областью видимости называют частными. Область видимости protected определяется для защищенных объектов, она имеет смысл только в иерархической системе классов и разрешает доступ к объектам этой области из методов производных классов. В теле класса ключевое слово области видимости может использоваться неоднократно. Область видимости для объектов типа «класс» по умолчанию private.
Способы объявления и инициализации объектов и доступ к методам класса:
1. Прямой вызов
my_Fun Fun1; //объявление объекта1,но не инициализация
Fun1.set("Function1 = ",1.0); // инициализация данных
Fun1.print();                 // прямой вызов 
cout << "Input enter1..." << endl<
2. Косвенный вызов
my_Fun *p1 = &Fun1;  // воспользовались объектом 1
                     // новая инициализация
p1->set("Function1 = ",1.0); // косвенный вызов
p1->print();                  // косвенный вызов 
 cout << "Input enter1..." << endl<
3. Динамическое выделение памяти
my_Fun *p1 = new my_Fun;
p1->set("Function1 = ",1.0);  // косвенный вызов
p1->print();                  // косвенный вызов  
cout << "Input enter1..." << endl<// удаляется динамически выделенный объект
delete p1;
 
Задание к работе
Пользовательский класс должен содержать необходимые элементы-данные, метод установки их начальных значений:
Void set(double X, );
метод печати:
Void print(void);
метод, решающий поставленную задачу:
Void Run(void);
Код методов – вне пространства определения класса. Программа должна включать в себя статический и динамический способы создания объектов, и для каждого объекта использовать прямую и косвенную адресацию при вызове методов класса.
 

Варианты заданий
 
При x=14.26, y=-1.22, z=3.5 t=0.564849.
При x=-4.5, y=0.75,z=0.845 u=-55.6848.
При x=3.74, y=-0.825, z=0.16, v=1.0553.
При x=0.4 ,y=-0.875, z=-0.475 w=1.9873.
При x=-15.246, y=4.642, z=20.001 =-182.036.
При x=16.55, y=-2.75, z=0.15 =-40.630.
При x=0.1722, y=6.33, z=3.25 =-205.305.
При x=-2.235, y=2.23, z=15.221 =39.374.
При x=1.825, y=18.225, z=-3.298 =1.2131.
При x=6.251, y=0.827, z=25.001 b=0.7121.
При x=3.251, y=0.325, z=0.466 c=4.25.
. При x=17.421, y=10.365, z=0.828 f=0.33056.
. При x=12.3, y=15.4, z=0.252 g=82.8257.
. При x=2.444, y=0.869, z=-0.13 -0.49871.

Пример выполнения
#include
#include
#include
////////////////////////////////////////////
class fun
{
private:
double x;
double y;
double z;
double gamma;
public:
void set(void);
void print(void);
void run(void);
};
//------------------------------------------
// metod ystanovki nachalnih znachenii
void fun::set(void)
{
cout << "Vvedite x: ";
cin >> x;
cout << "Vvedite y: ";
cin >> y;
cout << "Vvedite z: ";
cin >> z;
}
//------------------------------------------
// metod pechati
void fun::print(void)
{
cout << "Funkcia gamma ravna = " << gamma << endl;
}
//------------------------------------------
// metod, reshayschii postavlennyy zadachy
void fun::run(void)
{
gamma = 5*atan(x)-(1/4.)*acos(x)*((x+3*fabs(x-y)+pow(x,2))/(fabs(x-y)*z+pow(x,2)));
}
/////////////////////////////////////////////
void main()
{
//priamoj vizov
fun *obj1 = new fun; //dinamicheskoe
fun gamma1;
gamma1.set();
gamma1.run();
gamma1.print();
cout << endl;
delete obj1; //dinamicheskoe
//kosvennii vizov fun *obj2 = &gamma1; //staticheskoe
obj2->set();
obj2->run();
obj2->print();
cout << endl;
getch();
}

Контрольные вопросы
Что значит в ООП понятие «класс», и какой формат его объявления в программе?
Что такое объект класса, что он содержит?
 Какие существуют  уровни доступа к объектам  и методам класса (дать характеристику каждому)?
                Что такое операция привязки, ее основное назначение?

Название практической работы 20.
Программирование линейных алгоритмов с использованием конструктора, деструктора, friend - функции инициализации set() и функции вывода результатов print()
 
Цель работы – изучить основные способы работы по созданию конструктора класса с захватом динамической памяти и деструктора для ее освобождения, применение friend – функции, и изучение ее особенностей.
 
Теоретические сведения
Конструктор класса
Конструктор – это метод класса, имя которого совпадает с именем класса. Конструктор вызывается автоматически после выделения памяти для переменной и обеспечивает инициализацию компонент – данных. Конструктор не имеет никакого типа (даже типа void) и не возвращает никакого значения в результате своей работы. Конструктор нельзя вызывать как обычную компонентную функцию в программе. Для класса может быть объявлено несколько конструкторов, различающихся числом и типами параметров. При этом даже если для объектного типа не определено ни одного конструктора, компилятор создает для него конструктор по умолчанию, не использующий параметров, а также конструктор копирования, необходимый в том случае, если переменная объектного типа передается в конструктор как аргумент. В этом случае создаваемый объект будет точной копией аргумента конструктора.
class my_Fun
{
// компоненты-данные  double x;
unsigned size;
public:
// объявление конструктора 1 (с параметрами)
my_Fun (double X=0);
// объявление конструктора 2 (без параметров)
my_Fun(void);
// объявление и описание деструктора
~my_Fun ()
{ cout<<"Destroyed object... "<}
// описание конструктора 1
my_Fun::my_Fun (double X)
{ cout<<"Constructor1...."<{ cout<<"Constructor2..."<Деструктор класса
Еще одним специальным методом класса является деструктор. Деструктор вызывается перед освобождением памяти, занимаемой объектной переменной,  и предназначен для выполнения дополнительных действий, связанных с уничтожением объектной переменной, например, для освобождения динамической памяти, закрытия, уничтожения файлов и т.п.  Деструктор всегда имеет то же имя, что и имя класса, но перед именем записывается знак ~ (тильда). Деструктор не имеет параметров и подобно конструктору не возвращает никакого значения. Таким образом, деструктор не может быть перегружен и должен существовать в классе в единственном экземпляре. Деструктор вызывается автоматически при уничтожении объекта. Таким образом, для статически определенных объектов деструктор вызывается, когда заканчивается блок программы, в котором определен объект (блок в данном случае – составной оператор или тело функции). Для объектов, память для которых выделена динамически, деструктор вызывается при уничтожении объекта операцией delete.
Дружественная функция(friend)
В языке С++ одна и та же функция не может быть компонентом двух разных классов. Чтобы предоставить функции возможность выполнения действий над различными классами можно определить обычную функцию языка С++ и предоставить ей право доступа к элементам класса типа private, protected. Для этого нужно в описании класса поместить заголовок функции, перед которым поставить ключевое слово friend. Дружественная функция не является методом класса, не зависит от позиции в классе и спецификаторов прав доступа. Friend – функции получают доступ к членам класса через указатель, передаваемый им явно. Можно сделать все функции класса Y друзьями класса X в одном объявлении.
 Задание к работе
Общая постановка. Пользовательский класс Х должен содержать необходимые элементы-данные, которые создаются в динамической области памяти.
                   Конструктор для их создания (операция new) и установки их начальных значений: Х();
                   деструктор: ~Х(); 
                   friend – функция печати: friend void print();
                   функция, решающая поставленную задачу: friend Void Run().
Код методов и функций – вне пространства определения класса.
 Варианты заданий
Варианты заданий используются из лабораторной работы №1.
Пример выполнения
 Код программы:
#include
#include

class fun
{
private:
double *x, *y, *z, *gamma;
public:
fun(double parx, double pary, double parz, double gmm);

friend void print(fun&);
friend void run(fun&);

~fun(void);
};
//------------------------------------------
//konstruktor
fun::fun(double parx, double pary, double parz, double gmm)
{
x = new double;
y = new double;
z = new double;
gamma = new double;

* fun::x=parx;
* fun::y=pary;
* fun::z=parz;
* fun::gamma=gmm;
}
//------------------------------------------
//destruktor
fun::~fun()
{
delete x,y,z,gamma;
cout << endl;
}
//------------------------------------------
// metod pechati
void print(fun &a)
{
cout << "Funkcia gamma ravna = " << (*a.gamma) << endl;
}

//------------------------------------------
// metod, reshayschii postavlennyy zadachy
void run(fun &a)
{
(*a.gamma) = 5*atan((*a.x))-(1/4.)*acos((*a.x))*(((*a.x)+3*fabs((*a.x)-(*a.y))+pow((*a.x),2))/(fabs((*a.x)-(*a.y))*((*a.z))+pow((*a.x),2)));
}

/////////////////////////////////////////////
void main(void)
{
fun a(0.1722, 6.33, 0.000325, 0);
run(a);
print(a);
cout << endl;
}
//Pri x(0.1722), y(6.33), z(0.000325), gamma=-205.305


Контрольные вопросы
Что такое «конструктор», формат объявления, его особенности?
Формат объявления деструктора, его назначение
Особенности дружественных функций, доступ к закрытой части класса
Каким образом дружественная функция получает доступ к закрытой части класса?














13PAGE 15


13PAGE 14115



Рис. 1. Базовые алгоритмические структуры:
а) следование (Begin – End); б) ветвление (If – Then – Else); в) цикл с предусловием (While – Do)

Рис. 2. Дополнительные элементарные алгоритмические структуры:
а) сокращенное ветвление (If – Then); б) выбор – иначе (Case – Of – Else); в) цикл с постусловием (Repeat – Until); г) цикл с параметром (For – To (Downto) – Do)

Начало

y := arctg(a)

y := 0.9*ex

y := 1.7*e-x

с := 2

а := 3.14

х := -3

х := х + 1.5

z := c2 – x

x
· 3?

z
· 1?

z < -1?

Останов

Вывод
x, y

Да

Да

Нет

Нет

1

2

3

4

5

6

7

8

9

10

11

12

13

14

Да

Нет

Да

Нет

f(x2)
3

Опред. х2

1

х2 := 1

2

Все

5

х2 := х2*2

4

Сократить отрезок [х1, х2]

3

Да

Нет

x1– x2>(

2

Определить х

1

Все

4

xt := (x1+ x2)/2

2

х2 := xt

5

Да

Нет

f(x2)>y

3

Сокр. [x1, x2]

1

Все

6

х1 := xt

4

Программа

1

Ввести
y, n, (

2

Да

Нет

f(x1)>y

4

х1 := 1

3

х1 := х1/2

5

Да

Нет

f(x1)
7

х2 := 1

6

х2 := х1*2

8

xt := (x1+ x2)/2

10

х2 := xt



Да

Нет

f(x2)>y

11

х1 := xt

12

Да

Нет

x1– x2>(

9

Конец

15

Вывести
x, y

14

9

8

X=b%10

y=b/10



Рисунок 7Рисунок 1Рисунок 9Рисунок 1Рисунок 2Рисунок 15Рисунок 16Рисунок 17Рисунок 20Рисунок 21Рисунок 23Рисунок 24Рисунок 25Рисунок 28Рисунок 30"Нажмите, для просмотра в полном размере..."Рисунок 31"Нажмите, для просмотра в полном размере..."Рисунок 87Рисунок 88Рисунок 1Рисунок 1Рисунок 5Рисунок 6Рисунок 1Рисунок 2Рисунок 3Рисунок 1Рисунок 2Рисунок 3Рисунок 6Рисунок 7Рисунок 9Рисунок 11Рисунок 12Рисунок 14Рисунок 17Рисунок 18Рисунок 21Рисунок 22Рисунок 27Рисунок 30Рисунок 31Рисунок 35Рисунок 38Рисунок 39Рисунок 40Рђ Заголовок 1 Заголовок 2 Заголовок 315