- •Проектирование программ простейшей структуры
- •Варианты заданий
- •Функции форматированного ввода и вывода
- •Задание к лабораторной работе
- •Разработка и реализация разветвляющихся алгоритмов
- •Программирование алгоритмов и программ циклической структуры при помощи цикла for
- •Контрольные вопросы
- •Варианты заданий
- •Программирование алгоритмов и программ циклической структуры с предусловием
- •Контрольные вопросы
- •Варианты заданий
- •Конструирование программ циклической структуры с постусловием
- •Контрольные вопросы
- •Варианты заданий
- •Программирование сложных циклических процессов
- •Контрольные вопросы
- •Варианты заданий
- •Программирование сложных циклических процессов
- •Контрольные вопросы
- •Варианты заданий
- •Обработка текста с использованием фунцкий ввода-вывода одного символа. Побитовые операции. Перключение ввода-вывода
- •Контрольные вопросы
- •Задания для выполнения
- •Варианты задания
Контрольные вопросы
Нарисуйте блок-схему циклического вычислительного процесса с предусловием.
Какое минимальное число раз может выполняться цикл while?
В чем сущность уточнения корней методом половинного деления?
Как подсчитать количество итераций при уточнении корней?
Какое минимальное значение может иметь погрешность уточнения корня для типа float?
Покажите графически, в чем состоит принцип уточнения корней методом Ньютона ?
Что неправильно в приведенном цикле?
while ( i <=S S > i)
операторы;
Варианты заданий
1-6. Вычислить значение интеграла I с погрешностью E < 10-3 по формуле трапеций:
где f(x)
- подынтегральная функция, a
и b - соответственно нижний
и верхний пределы интегрирования, h
= (b - a)/n,
.
7-13. Уточнить корни уравнения в заданном диапазоне с погрешностью E < 10-3 методом Ньютона:
.
7.3sin(x) + 0.35x - 3.8 = 0 2< x < 3.
0 <
x < 1.
0
< x < 1.x - 2 + sin(1/x) = 0 1.2 < x < 2.
1 - x + sin(x) - ln(1 + x) = 0 0 < x < 15.
x2 - ln(1+x) - 3 = 0 2 < x < 3.
ln(x) - x + 1.8 = 0 2 < x < 3.
14-21. Найти корни уравнения с погрешностью E < 10-4 методом половинного деления:
.3x/1.6 - 2.3x - 3 = 0.
tg(x) - tg3(x)/3 + tg5(x)/5 = 0.
cos(2/x) - 2sin(1/x) + 1/x = 0.
.
.sin(x2) + cos(x2) - 10x = 0.
x2 - cos(2x) - 1 = 0.
Лабораторная работа № 6
Конструирование программ циклической структуры с постусловием
Цель работы
Изучение использования оператора типа DO-WHILE в программировании циклических процессов.
Методические указания
Оператор типа DO используется в тех случаях, когда тело цикла должно выполняться хотя бы один раз.
Формат оператора do:
do
оператор;
while (выражение);
Схема выполнения оператора DO:
1)выполняется оператор;
2)вычисляется выражение. Если оно не равно нулю (истинно), то выполнение продолжается с шага 1. Если он принимает значение, равное нулю, то работа оператора DO заканчивается. Управление передается следующему за ним оператору программы.
Для прекращения работы оператора до того, как условие, представленное выражением, станет ложным, используется оператор break. Это оператор должен работать, когда выполняется условие, по которому необходимо прервать работу цикла. Этому случаю должен соответствовать условный оператор, стоящий внутри тела цикла, а именно:
if (условие_досрочного_прекращения)
break;
В отличие от оператора while, проверяющего условие в начале цикла, оператор do-while проверяет условие в конце цикла.
Пример:
x = 1;
do
printf (%d \n, power (x, 2));
while (++x <=7);
В данном примере в роли параметра цикла (управляющей переменной) выступает переменная x, которой присваивается начальное значение x = 1, а затем она в каждом цикле увеличивается на единицу.
Операторы цикла используются при вычислении различных сумм и произведений. При этом часто целесообразно использовать некоторые преобразования, позволяющие избежать трудностей, связанных с вычислением степеней и факториалов.
При вычислении сумм членов ряда вида
член суммы
может относиться к одному из следующих
трех типов.
Он может иметь вид:
В первом случае целесообразно использовать рекуррентное соотношение, выражающее следующий член ряда через предыдущий, что позволяет избежать прямого вычисления факториала n!.
Пусть нужно вычислить сумму
Здесь
.
Воспользовавшись рекуррентным
соотношением для n! = (n
- 1)!n, найдем равенство,
связывающее
c
для
любого n, для чего рассмотрим
отношение
к
.
,
отсюда следует соотношение, связывающее
два соседних члена ряда
n + 1 = J.
Программа вычисления суммы в этом случае будет иметь вид:
main ( )
{ int n = 1;
float S, x;
S = 0; a = x;
scanf ( %e , &x);
do
{ S = S + a;
n ++;
a = a*(-x*x/((2*n+2)*(2*n+3)));
}
while n < 100;
printf (Сумма равна %e \n, S)
}
Во втором случае применение рекуррентных соотношений нецелесообразно, так как общий член ряда может быть вычислен непосредственно по формуле.
В третьем случае член суммы можно представить в виде двух сомножителей, один из которых вычисляется по рекуррентному соотношению, а другой - непосредственно.
Пример выполнения задания
Составить программу вычисления значения некоторой функции y = f(x) по рекуррентным выражениям вида:
Текст программы будет иметь вид:
main ( )
{ int k ;
float x, z, U;
scanf ( %d , &x);
y = U = z = (x-1)/(x+1);
k = 1;
do
{U = U*z*z(2*k-1)/(2*k+1);
y = y - U;
}
while k++ < 100;
printf (Значение функции y = %d \n, y)
}
Следует отметить,
что в математической постановке задачи
означают соответственно новое значение
U и y, и
прежнее значение этих переменных.
