Оператор цикла с постусловием.
Постусловие вычисляется и проверяется после выполнения операторов, составляющих тело цикла, и если значение логического выражения, определяющего условие работы цикла (в языке Си), истинно (=1), то цикл продолжает выполняться до тех пор, пока это значение не станет ложным (=0). В любом случае тело цикла с постусловием выполнится, по крайней мере, один раз.
Структура оператора цикла с постусловием:
[<инициализация>; ]
do
{
<тело_цикла>;
[<итерация>;]
}
while (<условие>);
<условие> – логическое выражение, определяющее условие повторения тела цикла; <инициализация> и <итерация> – необязательны.
II. Контрольные вопросы.
1. Что такое цикл?
2. Какие существуют два типа циклов?
3. Структура оператора цикла с параметром.
4. Как работает цикл с параметром?
5. Указать особенности оператора цикла с параметром в языке Си?
6. Какие циклы относятся к итерационным?
7. Привести структуру оператора цикла с предусловием.
8. Как работает цикл с предусловием?
9. Какую структуру имеет оператор цикла с постусловием?
10. Как работает цикл с постусловием?
III. Практическая часть.
1. Выполнение общего задания.
Задача 1.
1. Постановка задачи:разработать алгоритм вычисления и вывода значения суммы членов ряда = x+x2+x3+…+xn-1+xn для 0<x≤5 при n=8. Написать программу, реализующую разработанный алгоритм.
2. Математическая модель и описательный алгоритм задачи:
• ввести значение переменной x;
• проверить условие: если 0<x≤5, то продолжить выполнение алгоритма, иначе вывести соответствующее сообщение и выйти из алгоритма;
• для формирования суммы использовать переменную S, изначально ее обнулить – S=0;
• для получения степени переменной x использовать переменную xs, изначально xs=x;
• в цикле c параметром (количество повторений = n) каждый раз значение S увеличивать на значение xs, а значение xs увеличивать в x раз для получения степени x;
• после выхода из цикла вывести значение переменной S.
3. Блок-схема алгоритма задачи:
4. Текст программы:
#include <stdio.h>
#include <conio.h>
int main()
{
const n=8;
float x,xs,S;
printf(“\nВвести x=”);
scanf(“%d”,&x);
if (x>0 && x<=5)
{
S=0; xs=x;
for (int i=1;i<=n;i++)
{
S=S+xs; xs=xs*x;
}
printf(“\nS=%d”,S);
}
getch(); return 0;
}
5. Тестирование:
Теоретически рассчитанное выходное значение | Практически полученное выходное значение |
Тест 1: входные данные: x=-2 (не удовлетворяют условию 0<x≤5) | |
выход из программы | выход из программы |
Тест 2: входные данные: x=1 | |
S=8 | S=8.000000 |
Тест 3: входные данные: x=10 (не удовлетворяют условию 0<x≤5) | |
выход из программы | выход из программы |
Задача 2.
1. Постановка задачи: разработать алгоритм вычисления и вывода значения частичной суммы членов ряда + … с точностью ε=10-4 (суммировать пока очередной член ряда по модулю не будет ≤10-3) для π/3≤x≤2ּπ/3. Написать программу, реализующую разработанный алгоритм.
2. Математическая модель и описательный алгоритм задачи:
• значение переменной x изначально обнулить (x=0) перед входом в цикл с предусловием x≤π/3 или x≥2∙π/3 с тем, чтобы войти в цикл и вводить значение в переменную x до тех пор, пока оно не будет удовлетворять заданному условию: π/3<x<2∙π/3;
• для формирования суммы использовать переменную S, изначально ее обнулить (S=0);
• изначально коэффициент i=1 при переменной x;
• в цикле c предусловием |sin(i∙x)/i| ≥ε (проверяется очередной член ряда по модулю) формировать сумму членов ряда – S=S+sin(i∙x)/i и коэффициент i увеличивать на 1 для следующей итерации;
• после завершения цикла вывести значение переменной S и количество итераций i-1 (сколько раз повторился цикл, т.е. сколько членов ряда суммировалось, чтобы получить частичную сумму для заданных условий; количество итераций равно i-1, так как увеличение i=i+1 происходит для следующего прохода цикла, который, возможно, не выполнится).
3. Блок-схема алгоритма задачи:
4. Текст программы:
#include <stdio.h>
#include <conio.h>
#include <math.h>
int main()
{
const float p=3.14, e=.0001;
int i=1;
float S,x=0;
while (x<=p/3 || x>=2*p/3)
{
printf(“\nВвести x = ”);
scanf(“%f”,&x);
}
S=0;
while (fabs(sin(i*x)/i)>=e)
{
S=S+sin(i*x)/i;
i++;
}
printf(“\n S = %f, количество итераций = %d”,S,i-1);
getch();
return 0;
}
5. Тестирование:
Теоретически рассчитанное выходное значение | Практически полученное выходное значение |
Тест: входные данные: x=1,57 (≈π/2) | |
S=?; кол-во итер.=? | S=?; кол-во итер.=? |
Задача 3.
1. Постановка задачи: разработать алгоритм вычисления значения частичной суммы членов ряда Фибоначчи + … для -3<x≤2 и оценить скорость сходимости, найдя число слагаемых, необходимое для достижения заданной погрешности ε=10-4. Вывести значения суммы и числа слагаемых. Написать программу, реализующую разработанный алгоритм.
2. Математическая модель и описательный алгоритм задачи:
• в цикле с постусловием x≤-5 или x≥5 вводить значение в переменную x,пока не будет -3<x≤2;
• для введенного значения переменной х сначала вычисляется левая часть равенства при использовании встроенной функции exp(x), затем вычисляется частичная сумма ряда правой части до тех пор, пока она не будет отличаться от левой части менее, чем на заданную погрешность ε (использовать константу e=10-4) или количество итераций будет больше некоторого заданного значения limit=30;
• для формирования суммы использовать переменную S, изначально S=1, так как первый член ряда=1;
• для вычисления каждого слагаемого ряда требуется возведение в степень (достаточно трудоемкая операция) и вычисление факториала (дополнительный цикл), поэтому в случаях степенной функции и факториала для упрощения вычисления суммы ряда следует использовать рекуррентную формулу, которая позволяет получить следующий член ряда через предыдущий, т.е. каждое очередное слагаемое можно рекуррентно вычислить через предыдущее:
;
• изначально очередной член ряда – переменная a=1 и количество итераций – переменная i=0;
• для вычисления частичной суммы ряда организовать цикл с постусловием |y-S|≥e и i≤limit, в котором увеличивать число итераций i=i+1, вычислять следующий член ряда a=a∙x/i и формировать сумму S=S+a;
• после выхода из цикла проверить, по невыполнению какого из двух условий завершился цикл: если i>limit, то вывести информацию «точность не достигнута»; иначе вывести значение S и количество итераций i.
3. Блок-схема алгоритма задачи:
4. Текст программы:
#include <stdio.h>
#include <соnio.h>
#include <math.h>
int main()
{
const float e=.0001;
const limit=30;
int i=0;
float y,a,S,x;
do
{
printf(“\nВвести x = ”);
scanf(“%f”,&x);
}
while (x<=-3 || x>2);
y=exp(x);
S=1; a=1;
do
{
i++;
a=a*x/i;
S=S+a;
}
while (fabs(y-S)>=e && i<=limit);
if (i>limit) printf(“\n точность не достигнута”);
else
{
printf(“\n S = %f\t y = %f”,S,y);
printf(“\n количество итераций = %d”,i);
}
getch();
return 0;
}
5. Тестирование:
Теоретически рассчитанное выходное значение | Практически полученное выходное значение |
Тест 1: входные данные: x=-1.5 (-3<x≤2) | |
S=?; количество итераций=? | y=?; S=?; количество итераций=? |
Тест 2: входные данные: x=2 (-3<x≤2) | |
S=?; количество итераций=? | y=?; S=?; количество итераций=? |
Тест 3: входные данные: x=-3 (-3<x≤2) | |
точность не достигнута | точность не достигнута |
Задача 4.
1. Постановка задачи: разработать алгоритм суммирования n введенных чисел и вывода значения суммы.
2. Математическая модель и описательный алгоритм задачи:
• используя цикл с постусловием n≤0 (количество введенных чисел не может быть меньше или равно нуля), ввести количество вводимых чисел, чтобы n>0;
• для формирования суммы значение s обнулить (s=0);
• в цикле c параметром (количество повторений = n) каждый раз вводить значение a и формировать сумму: s=s+a;
• после выхода из цикла вывести значение переменной s.
3. Блок-схема алгоритма задачи:
4. Текст программы: написать самостоятельно!
5. Тестирование: произвести самостоятельно!
Теоретически рассчитанное выходное значение | Практически полученное выходное значение |
Тест 1: входные данные: ? | |
S=? | S=? |
Тест 2: входные данные: ? | |
S=? | S=? |
2. Выполнение индивидуального задания.
Постановка задачи.
Разработать циклический алгоритм и написать программу по индивидуальному заданию, используя операторы цикла, оператор ввода для ввода значений входных данных и оператор вывода для вывода результата вычисления.
2. Входные и выходные данные.
Все действующие в программе переменные должны быть объявлены.
Недопустимо задавать исходные (входные) данные с помощью операторов присваивания. Ввод данных с клавиатуры должен предваряться выводом соответствующего сообщения.
3. Математическая модель и описательный алгоритм задачи.
Блок-схема алгоритма.
Представить циклический алгоритм в виде блок-схемы.
Текст программы.
Разработанный алгоритм реализуется на языке программирования высокого уровня Cи.
Тестирование.
Результаты тестирования представить в виде таблицы.
IV. Требования к разработке программы.
Программа должна содержать следующие три составные части:
- ввод исходных данных;
- обработку данных;
- вывод результатов.
Произвести отладку и тестирование разработанной программы.
V. Требования к защите индивидуальных заданий.
ИМЕТЬ отчет, который включает:
1. постановку задачи;
2. математическую модель и описательный алгоритм задачи;
3. блок-схему алгоритма;
4. текст программы;
5. результаты тестирования.
ЗНАТЬ ответы на контрольные вопросы.
VI. Варианты индивидуальных заданий.
Разработать алгоритмы решения задач, написать программы, реализующие соответствующие алгоритмы, и осуществить их тестирование. Входные данные вводятся с клавиатуры. Вторая задача для каждого варианта соответствует номеру варианта из таблицы 3.
Вариант №1
1. Найти и вывести все двузначные числа, в которых есть цифра n или само число делится на n.
Вариант №2
1. Из чисел от 10 до 99 вывести те, сумма цифр которых равна n, где 0<n<18.
Вариант №3
1. Вывести количество трехзначных натуральных чисел, сумма цифр которых равна заданному числу n.
Вариант №4
1. Среди двузначных чисел найти и вывести те, сумма квадратов цифр которых делится на 13.
Вариант №5
1. Найти и вывести двузначные числа такие, что если к сумме цифр этого числа прибавить квадрат этой суммы, то получится это число.
Вариант №6
1. Найти и вывести сумму целых положительных чисел из интервала от a до b, кратных 4.
Вариант №7
1. Для натурального n вывести все его натуральные делители.
Вариант №8
1. Сумма цифр трехзначного числа кратна 7, само число также делится на 7. Найти и вывести все такие числа.
Вариант №9
1. Среди четырехзначных чисел найти и вывести те, у которых все 4 цифры различны.
Вариант №10
1. Определить, является ли введенное число n совершенным, т.е. равным сумме всех своих делителей, не превосходящих само число; вывести соответствующую информацию.
Вариант №11
1. Определить и вывести все числа, кратные введенным a и b, меньшие a∙b.
Вариант №12
1. Определить, являются ли введенные натуральные числа a и b взаимно простыми, т.е. не имеющими общих делителей, кроме единицы.
Вариант №13
1. Вычислить и вывести для введенного натурального числа n сумму S=1+22+33+…+nn, не используя стандартную функцию возведения в степень.
Вариант №14
1. Получить и вывести все простые числа p, удовлетворяющие неравенству a<p<b, где введенные а, b (а<b) – натуральные числа.
Вариант №15
1. Для введенного натурального числа s, выражающего площадь, найти и вывести стороны, выраженные натуральными числами, всех таких прямоугольников, площадь которых равна s.
Вариант №16
1. Найти и вывести все двузначные числа, в которых есть цифра n или само число делится на n.
Вариант №17
1. Из двузначных чисел вывести те, сумма цифр которых равна n, где 1<n<11.
Вариант №18
1. Вывести количество двухзначных натуральных чисел, сумма цифр которых равна заданному числу n.
Вариант №19
1. Среди трехзначных чисел найти и вывести те, сумма квадратов цифр которых делится на 35.
Вариант №20
1. Найти и вывести двузначные числа такие, что если к сумме цифр каждого из них прибавить квадрат этой суммы, то можно получить само число.
Вариант №21
1. Найти и вывести сумму целых положительных чисел из диапазона от a до b, кратных 3.
Вариант №22
1. Для натурального n вывести все его простые делители.
Вариант №23
1. Найти и вывести все трехзначные числа, сумма цифр которых кратна 3, а само число делится на 3.
Вариант №24
1. Среди трехзначных чисел найти и вывести те, у которых все 3 цифры различны.
Вариант №25
1. Определить, является ли введенное число n совершенным, т.е. равным сумме всех своих делителей, не превосходящих само число; вывести соответствующую информацию.
Таблица 3.
Вычислить частичную сумму ряда с точностью e:
N | Формула частичной суммы ряда | N | Формула частичной суммы ряда |
1 | , e=10-5, | , e=0.5∙10-5, | |
, e=10-4, | , e=10-5, | ||
, e=10-6, | , e=10-4, | ||
, e=0.5∙10-5, | , e=10-4, | ||
, e=10-3, | , e=0.5∙10-5 | ||
, e=0.2∙10-5, | , e=10-3, | ||
, e=10-4, | , e=10-5, | ||
15 | , e=10-4, | , e=10-4, | |
, e=10-5, | , e=0.2∙10-4, | ||
, e=10-4, | , e=10-5 | ||
, e=10-5, | , e=10-4, | ||
, e=10-5, | , e=10-4, | ||
, e=10-5, |
Лабораторная работа №8
Тема