Файл: Методические указания по выполнению лабораторных работ Для обучающихся (очная форма обучения) по направлению подготовки 09. 03. 03 Прикладная информатика.pdf
ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 30.11.2023
Просмотров: 138
Скачиваний: 2
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
54
Во избежание ошибок, управляйте количеством повторений цикла с помощью
целой переменной.
Операторы break и continue
Операторы цикла можно использовать при проверке данных, задаваемых пользователем с клавиатуры. Идея такова: цикл должен выполняться до тех пор, пока пользователь не задаст правильное число. Для этого надо написать бесконечный цикл.
Однако из цикла надо выходить, если число введено правильно. Для этого обычно используется оператор break. Это тоже зарезервированное слово языка С++. Его действие заключается в немедленном выходе их блока.
Но в С++ есть и второй оператор, используемый исключительно внутри тела цикла.
Это оператор continue. Пример его использования во фрагменте программы на рис 7.
Рис. 7.
Проверка ввода данных
В этом примере в условном операторе использован оператор continue, который немедленно передает управление на проверку условия, которое пусто. Выражение увеличения счетчика тоже пусто, поэтому сразу выполняется оператор вывода приглашения. Если же условие оператора if не выполняется (число задано верно), то выполняется оператор break, и происходит немедленный выход из блока - тела цикла.
Таблица 2.
Популярные математические функции библиотеки math.h.
55
Существует несколько способов вывода кириллицы на экран.
56
2.
Требования к выполнению, оформлению и порядку защиты лабораторной
работы
1. Изучить теоретические материалы и подготовить ответы на контрольные вопросы.
2. Задание на лабораторную работу состоит из двух примеров. Каждый пример должен быть оформлен в виде отдельного консольного программного проекта в среде
Visual Studio .NET Программные проекты должны быть оформлены в виде единого программного решения (Solution).
3. Программа должна выводить фамилию студента, группу, вариант и условия задачи.
4. К защите предъявляется приложение на языке C++, созданное в соответствии с заданием.
5. В рамках защиты лабораторной работы необходимо продемонстрировать полученные практические навыки и понимание теоретического материала, ответив на вопросы преподавателя.
6. Порядок защиты предполагает: a. Описание (устное) математической постановки задачи (описание множества входных и выходных параметров, а также формул, описывающих зависимости между входными и выходными параметрами). b. Демонстрацию выполнения программы с устными комментариями к выполняемым действиям. c. Описание (устное) программного кода (текста программы) в терминах математической модели и словесно-формульного описания алгоритма ее вычисления. d. Демонстрацию выполнения программы в режиме пошаговой отладки с подробными комментариями к действиям, выполняемым компьютером на каждом шаге.
3.
Задания к выполнению лабораторной работы
Задание. Вычислите и выведите на экран значения функции y = f(x) в точках x
0
= x нач, x
1
= x
0
+ h, x
2
= x
1
+ h,… x
N
= x кон
, где h = (x кон
– x нач
)/N.
Функция y = f(x) зависит от параметра a.
Результаты вычислений следует оформить в виде таблицы, снабженной заголовком и вывести на экран;
Задачу решить тремя различными способами (цикл с предусловием, цикл с постусловием, цикл с параметром). Все три решения оформить в одной программе, выбор способа предоставить пользователю.
Исходные данные ввести с клавиатуры.
Вид функции y = f(x) и рабочий набор исходных данных приведены в таблице.
57
Продолжение таблицы 1.
Примерный вид результата
Контрольные вопросы.
1. Назовите основные алгоритмические структуры.
2. В чём состоит преимущество структурного программирования по сравнению с операциональным?
3. Какой алгоритм называют циклическим?
4. Какие разновидности циклических алгоритмов Вам известны? Чем они отличаются друг от друга?
5. В чём принципиальная разница между постфиксной и префиксной формой записи
58 инкремента и декремента?
6.В чём состоит принцип нисходящего программирования и пошаговой детализации? Чем удобен такой подход к программированию?
7. Как организован в С++ цикл с предусловием? Сколько раз выполняется такой цикл и когда происходит выход из цикла?
8 .Как организован в С++ цикл с постусловием? Сколько раз выполняется такой цикл и когда происходит выход из цикла?
9. Как организован в С++ цикл с параметром? Сколько раз выполняется такой цикл и когда происходит выход из цикла?
10. Какие циклические процессы невозможно организовать с использованием цикла for?
11. Что происходит в результате использования операции , (запятая)?
12. Почему не рекомендуется пользоваться оператором безусловного перехода для организации циклов?
13. Какой оператор позволяет выйти из цикла немедленно? В какой ещё конструкции используется этот оператор?
14. Для чего используется оператор continue?
15. Манипуляторы: назначение, правила использования
59
Лабораторная работа 1.9
ПОЛЬЗОВАТЕЛЬСКИЕ ФУНКЦИИ
Цель работы: получить навыки в организации функций, возвращающих результат вычислений освоить механизм передачи параметров по значению и по ссылке
1.
Краткая теория
Список параметров и вызов функции
В заголовке определения функции формальные параметры перечисляются через запятую. Наиболее часто спецификация отдельного параметра имеет синтаксис, аналогичный синтаксису обычных объявлений переменных: тип имя
Тип аргумента может быть любым, который только возможен в С++: либо одним из встроенных простых типов, либо типом, определенным пользователем тем или иным способом. Имя — обычный идентификатор, если параметров несколько, то все имена должны быть различны.
Передача параметров по значению
Передача по значению — самый распространённый и надежный метод передачи,
При такой передаче параметров предполагается, что каждый параметр внутри функции является локальной переменной поэтому любые изменения параметра внутри функции не влияют на соответствующую переменную вне функции. Однако копирование значения фактического параметра в эту локальную переменную требует времени, поэтому способ передачи параметров по значению обычно применяется для данных простых типов, время копирования которых мало. При передаче по значению допускается в качестве параметра передавать выражения, которые предварительно вычисляются и в функцию передается вычисленное значение.
60
Передача параметров по ссылке
Очень часто требуется получить от подпрограммы более одного результата, например, изменить значения нескольких переменных. Передача по значению в таких случаях не работает. Чтобы понять, в чем суть дела, рассмотрим классический пример: функцию, обменивающую значения двух целых переменных.
Такая функция не вызовет протестов компилятора, но работать не будет, поскольку параметры передаются по значению. Пусть в программе объявлены две переменные х и у, и нам необходимо обменять их значение местами.
Оператор cout выведет на экран x=5; y=3. Таким образом, функция Swap не сделала свою работу.
Вставим в функцию оператор вывода на экран.
Повторив выполнение, увидим на экране следующее
Таким образом, внутри функции обмен происходит. Тем не менее, на значения переменных х и у это никак не влияет. Это происходит именно вследствие передачи параметров по значению: внутрь функции передаются только значения переменных. Никакой связи между передаваемыми значениями и переменными, в которых эти значения хранились вне функции, внутри функции не сохраняется. Передаваемые значения помещаются в личные внутренние переменные функции, и обмен происходит в этих внутренних переменных.
Именно в таких случаях и необходим способ передачи параметров по ссылке. В этом случае определение функции Swap выглядит следующим образом:
Обращение к таким образом определенной функции не отличается от обращения при передаче параметров по значению: Swap(x,y);
2. Требования к выполнению, оформлению и порядку защиты лабораторной работы
1. Изучить теоретические материалы и подготовить ответы на контрольные вопросы.
2. Задание на лабораторную работу содержит задачу, требующую детализации.
Задание должно быть выполнено в одном консольном программном проекте в среде Visual
61
Studio .NET.
3. Программа должна выводить фамилию студента, группу, вариант и условие задачи.
4. К защите предъявляется приложение на языке C++, созданное в соответствии с заданием. В рамках защиты лабораторной работы необходимо продемонстрировать полученные практические навыки и понимание теоретического материала, ответив на вопросы преподавателя.
3.
Задание к выполнению лабораторной работы
Необходимо реализовать программный код, позволяющий найти сумму двух дробей, результат представить в виде несократимой дроби. При выполнении лабораторной работы следует:
1. Написать функцию, обеспечивающую ввод дроби с клавиатуры и проверку на корректность.
2. Написать функцию, возвращающую наибольший общий делитель двух натуральных чисел.
3. Написать функцию сокращения дроби.
4. Написать функцию, вычисляющую сумму двух дробей, Возвращаемая дробь должна быть несократимой.
5. Написать функцию подсчитывающую количество цифр в числе.
6. Написать функцию вывода дроби на экран (длина черты между числителем и знаменателем должна быть равна количеству цифр большего из выводимых чисел)
7. Вызывая функцию нахождения суммы дробей нужное количество раз, вывести результаты на экран.
Индивидуальные задания
Варианты с нечётными номерами необходимо решать следующим образом: вычислить сумму первых двух слагаемых как сумму обычных дробей; при необходимости полученную дробь сократить; до тех пор, пока не вычислена вся сумма, прибавлять к имеющейся дроби очередное слагаемое и при необходимости сокращать. Варианты с чётными номерами необходимо решать следующим образом:
1. определить числитель и знаменатель начального элемента последовательности
2. вычислить очередной элемент как сумму обычных дробей;
3. при необходимости полученную дробь сократить;
4. повторять предыдущие пункты до тех пор, пока не будет получен требуемый элемент. При выполнении индивидуального задания следует
1. Написать функцию, обеспечивающую ввод данных с клавиатуры и их проверку на корректность; тип и диапазон значений определить самостоятельно.
2. Написать функцию нахождения суммы дробей нужное количество раз.
Вариант 1.
Вариант 2
Вариант 3
62
в виде несократимой дроби.
Вариант 4
Вариант 5
Вариант 6
Вариант 7
Вариант 8
Контрольные вопросы
1. Понятие функции. Почему используют функции?
2. Как объявить функцию, не возвращающую результат?
3. Как объявить функцию, возвращающую результат?
4. Вызов функции на выполнение.
5. Что такое прототип функции?
6. В каких случаях используют передачу параметров по значению?
7. В каких случаях используют передачу параметров по значению?
8. Какие требования предъявляют к параметрам?
9. Какие функции называются встраиваемыми?
10. Как создать шаблон функции?
11. Глобальные и локальные переменные. Обращение к глобальным переменным внутри функций.
12. Какие функции называются перегруженными?
63
Лабораторная работа №1.10
РЕКУРСИВНЫЕ ФУНКЦИИ
Цель работы: получить практические навыки работы с рекурсивными алгоритмами.
1.
Краткая теория
Рекурсивные функции - это функции, которые вызывают сами себя. Например, определим вычисление факториала в виде рекурсивной функции:
#include
{ int n = 5; int result = factorial(n); std::cout << "Factorial of " << n << " is equal to " << result << std::endl; return 0;
} int factorial(int n)
{ if(n>1) return n * factorial(n-1); return 1;
}
В функции factorial задано условие, что если число n больше 1, то это число умножается на результат этой же функции, в которую в качестве параметра передается число n-1. То есть происходит рекурсивный спуск. И так далее, пока не дойдем того момента, когда значение параметра не будет равно 1. В этом случае функция возвратит 1.
Рекурсивная функция обязательно должна иметь некоторый базовый вариант, который использует оператор return и к которому сходится выполнение остальных вызовов этой функции. В случае с факториалом базовый вариант представлен ситуацией, при которой n = 1. В этом случае сработает инструкция return 1;.
Например, при вызове factorial(5) получится следующая цепь вызовов:
1. 5 * factorial(4)
2. 5 * 4 * factorial(3)
3. 5 * 4 * 3 * factorial(2)
4. 5 * 4 * 3 * 2 * factorial(1)
5. 5 * 4 * 3 * 2 * 1
64
Другим распространенным показательным примером рекурсивной функции служит функция, вычисляющая числа Фиббоначчи. n-й член последовательности чисел Фибоначчи определяется по формуле: f(n)=f(n-1) + f(n-2), причем f(0)=0, а f(1)=1. Значения f(0)=0 и f(1)=1, таким образом, определяют базовые варианты для данной функции:
#include
{ int n; for(int i = 0; i < 10; i++)
{ n = fibonachi(i); std::cout << n << "\t";
} std::cout << std::endl; return 0;
} int fibonachi(int n)
{ if (n == 0) return 0; if (n == 1) return 1; return fibonachi(n - 1) + fibonachi(n - 2);
}
Результат работы программы - вывод 10 чисел из последовательности Фиббоначчи на консоль:
2.
Методические указания:
1.Для каждой задачи своего варианта написать рекурсивные функции, выполняющие указанные действия.
2. Продемонстрировать на подобранных примерах правильность работы программы.
Примеры подобрать самостоятельно.
3. В программе должны быть указаны фамилия, группа, номер варианта, условия заданий.
4. В основном алгоритме предусмотреть ввод корректных данных, вызов функции и вывод результата.
65
3.
Задания для самостоятельной работы:
Вариант 1
1.
Описать рекурсивную функцию hord(a, b,
), которая методом хорд находит с точностью
корень уравнения f(x) = 0 на отрезке [а, b] (считать, что
> 0, а < b, f(a) · f(b) < 0 и f(x)
– непрерывная и монотонная на отрезке [а, b]).
1 2 3 4 5 6 7