ТОП 10:

Циклические алгоритмы с неизвестным числом повторений



Для организации циклов с заранее неизвестным числом повторений (а также и для организации циклов с известным числом повторений) используют оператор цикла с предусловием (оператор while) и оператор цикла с постусловием (оператор repeat). Вид оператора цикла с предусловием:

While b do s;

Здесь b – логическое выражение, s – тело цикла. При выполнении оператора сначала проверяется логическое выражение, а затем выполняется тело цикла, т.е. операторы циклической части. Цикл повторяется, пока логическое выражение истинно. Когда оно становится ложным, происходит выход из цикла. Если с самого начала логическое выражение ложно, тело цикла не выполнится ни разу. Если тело цикла является составным оператором, т. е. состоит из нескольких операторов, его необходимо ограничить операторными скобками begin и end.

Вид оператора цикла с постусловием:

repeat s until b;

Здесь s – тело цикла, b - логическое выражение. При выполнении оператора сначала выполняется тело цикла, а затем проверяется логическое выражение. Цикл повторяется, пока логическое выражение ложно. Когда оно становится истинным, происходит выход из цикла. Таким образом, если даже логическое условие изначально истинно, обеспечивается, по крайней мере, одно выполнение тела цикла.

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

Пример 1. Найти k, при котором значение суммы s=3+6+9+...+3k становится больше t при вводе t с клавиатуры.

Решение. Каждое слагаемое равно произведению числа 3 напорядковый номер этого слагаемого. Поэтому можно организовать цикл, в котором s находится путем прибавления предыдущего значения s к порядковому номеру слагаемого, умноженному на 3. В цикле также должен увеличиваться на единицу порядковый номер слагаемого. Перед циклом следует обнулить начальное значение s и задать начальное значение k. Выход из цикла происходит, когда s станет больше t. Поскольку количество повторений заранее неизвестно, можно использовать для организации цикла операторы While или Repeat, но нельзя использовать оператор For.

Существуют значения t (например, при t = -5), при которых цикл не должен быть выполнен ни разу. В этом случае для организации цикла надо использовать оператор while. Если производится суммирование, обязательно присвоить начальное значение s=0. Следует учесть, что сначала происходит увеличение k, а затем расчет s. Поэтому первоначальное значение k=0. Ниже приведён текст программы.

Uses Crt; {подключение модуля crt}

Var {описание переменных}

s,k:integer;

t:real;

Begin

Clrscr; {очистка экрана}

Write('t= ');

Readln(t); {ввод значения t}

s:=0; k:=0; {начальные значения s и k}

While s<=t do {начало цикла/проверка условия}

begin

k:=k+1; {увеличение k в цикле}

s:=s+3*k; {расчет s}

end; {окончание цикла}

Writeln('k= ',k); {вывод на экран найденного значения k}

Readln;

End.

Пример 2.Вывести на экран в два столбца угловые значения земных параллелей от экватора до Северного полюса через каждые 10о и соответствующие им длины параллелей, считая Землю идеальным шаром с радиусом 6370 км.

Решение. Длину земной параллели можно найти по формуле D=2prp=2przcos(a), где rp - радиус параллели, rz - радиус Земли, a - угловая величина параллели (см. рис). Длину следует рассчитывать и выводить на экран 10 раз по одной и той же формуле, изменяя только угол a (0о, 10о,…,90о). Поэтому организуем цикл, в котором рассчитывается длина параллели и выводятся на экран значения угла и длины параллели. В цикле также необходимо увеличивать значение угла a на 10о. Перед циклом следует задать начальное значение a, равное 0.

Поскольку в Паскале тригонометрические функции рассчитываются от углов, выраженных в радианах, то угловую величину параллели следует переводить из градусов в радианы по выражению a×p/180.

Число повторений в цикле известно (равно 10), поэтому для организации цикла можно использовать операторы for, while или repeat.

Текст программы при использовании оператора repeat:

uses crt;

var

rz,alfa:integer;

dlina:real;

Begin

clrscr; {очистка экрана}

rz:=6370; {значение радиуса Земли}

alfa:=0; {начальное значение широты (Экватор)}

repeat {начало цикла}

dlina:=rz*cos(alfa*pi/180)*2*pi; {расчет длины параллели}

Writeln(alfa:3,' ',dlina:7:1); {вывод на экран}

alfa:=alfa+10; {увеличение широты}

until alfa>90; {конец цикла/проверка условия}

Readln;

End. {конец программы}

Задания

При выполнении заданий в учебных целях следует организовывать циклы в задании 1 при помощи оператора while, в задании 2 - при помощи оператора repeat.

Вариант 1

Задание 1. Найти t, при котором значение выражения (2+4+6+…+2t)/(1×2×3×…×t) становится меньше 0,06.

Задание 2. Из пункта А в пункт В, расстояние между которыми 500 км, равномерно и прямолинейно движется автомобиль со скоростью v. При вводе v с клавиатуры вывести на экран в одну строку через один пробел расстояния от автомобиля до пункта В через каждые два часа от начала движения до момента прибытия в пункт В.

Вариант 2

Задание 1. Найти x, при котором значение выражения (0,5×1×1,5×2×…×0,5x)/x2 становится больше s при вводе s с клавиатуры.

Задание 2. Из пункта А в пункт В, расстояние между которыми s км, равномерно и прямолинейно движется материальная точка со скоростью v. При вводе v и s с клавиатуры вывести на экран в один столбец расстояния от материальной точки до пункта А через каждый час от начала движения до момента прибытия в пункт В.

Вариант 3

Задание 1. Найти f, при котором значение выражения (f3+ln f)/(f2-11f+2,3) становится больше s при вводе s с клавиатуры, если f увеличивается в ряду 1,2,3,4, … .

Задание 2. Материальная точка равноускоренно и прямолинейно движется с начальной нулевой скоростью и ускорением a км/мин2. Скорость точки описывается уравнением v=at, где t - время. При вводе a с клавиатуры вывести на экран в один столбец значения скорости точки через каждую минуту от начала движения до момента достижения скорости 20 км/мин.

Вариант 4

Задание 1. Найти значение выражения 1+3+5+7+…+(2z-1) при вводе z с клавиатуры.

Задание 2. Камень падает с высоты 200 м. Без учета сопротивления воздуха длина пути, пройденного камнем, описывается уравнением s=gt2/2, где g - ускорение свободного падения, t - время. Вывести на экран в один столбец расстояния от камня до земли через каждую секунду от начала падения до момента соприкосновения с землей.

Вариант 5

Задание 1. Найти значение выражения 1/1+1/2+1/3+1/4+…+1/n при вводе n с клавиатуры.

Задание 2. Скорость некоторой химической реакции при 0°С равна 0,002 моль/л×мин и увеличивается в два раза при увеличении температуры на каждые 10°С (температурный коэффициент реакции равен 2). Вывести на экран в два столбца значения температуры, начиная от 0°С, с шагом 10°С, и соответствующие им значения скорости реакции до достижения скорости более 0,2 моль/л×мин.

Вариант 6

Задание 1. Найти значение выражения (1+2+3+4+…+n)/(2×4×6×…×2n) при вводе n с клавиатуры.

Задание 2. Вывести на экран в одну строку через один пробел все високосные годы в период с 2000 до 2050, при условии, что 2000-й год - високосный.

Вариант 7

Задание 1. Найти j, при котором значение выражения (lg j+134j)/(j2-ln j+3) становится меньше e при вводе e с клавиатуры, если j увеличивается в ряду 1,2,3,4, … .

Задание 2. Вывести на экран в три столбца массовые концентрации серной кислоты в растворе при возрастании от 10 г/л до 300 г/л с шагом 10 г/л, а также соответствующие им молярные концентрации (моль/л) и нормальные концентрации (г-экв/л).

Вариант 8

Задание 1. Найти x, при котором значение выражения 100+99+98+97+…+x становится меньше r. Значение r ввести с клавиатуры (r<100).

Задание 2. Вывести на экран в четыре столбца значения длин в метрах в диапазоне от 1 до 20 м с шагом 1 м, а также соответствующие им значения длин в дюймах (в одном дюйме 2,54 см), футах (в одном футе 0,3048 м) и ярдах (в одном ярде 0,9144 м).

Вариант 9

Задание 1. Найти значение выражения 1+4+9+16+…+x2 при вводе x с клавиатуры (x - целое число).

Задание 2. Вывести на экран в четыре столбца значения объема в литрах при убывании от 40 до 2 л с шагом 2 л, а также соответствующие им значения объема в галлонах (в одном галлоне 4,546 л), квартах (в одной кварте 1,138 л) и пинтах (в одной пинте 0,569 л).

Вариант 10

Задание 1. Найти сумму квадратных корней первых ста натуральных чисел.

Задание 2. Растворимость сернистого газа в воде описывается уравнением x=0,3p×1,0363-t, где x- растворимость, г/л, p - парциальное давление сернистого газа, мм.рт.ст., t - температура, °С. Вывести на экран в два столбца значения температуры в диапазоне от 0 до 50°С с шагом 5°С и соответствующие им значения растворимости сернистого газа при вводе p с клавиатуры.

Тема 9

Итерационные алгоритмы циклической структуры

 

Итерационные алгоритмы нашли широкое применение в инженерно-технических расчётах. В этих расчётах производится многократные последовательные вычисления с целью постепенного приближения к искомому результату, причем для вычислений на каждом шаге используются результаты вычислений на предыдущем шаге. Завершение вычислений производится при достижении заданной точности вычислений. Поскольку количество итераций (повторений вычислений) заранее неизвестно, то при организации вычислений необходимо использовать циклы While или Repeat.

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

Одной из наиболее часто используемых областей использования итерационных алгоритмов является вычисление значений тригонометрических и трансцендентных функций, таких, как синус, косинус, натуральный логарифм, экспонента и др. При этом, задаваясь требуемой точностью вычислений, можно заменить точное значение функции, например, sin x, её приближённым значением, полученным в результате сохранения конечного числа членов разложения этой функции в ряд Тейлора:

Точность конечного результата зависит от количества сохранённых членов ряда. Если задана погрешность e (и, например, равна 10-4). Номер последнего слагаемого n определяется условием

Упражнение. Вычислить на ЭВМ значение суммы членов бесконечного ряда точностью до члена ряда, меньшего e = 10-4 для x, равного 0,1. Определить число членов ряда, вошедших в сумму.

Ключевым этапом решения задачи является вычисление каждого члена ряда . Его значение можно вычислять напрямую, однако, удобнее выразить n-й член через (n-1)-й, в данном случае получаем:

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

Блок-схема алгоритма решения представлена на рис. 7.1. В блоке 2 организуется ввод исходных данных. В блоке 3 производится подготовка цикла, для этого задаётся значение первого члена ряда, начальное значение суммы, равное этому члену, и номер члена ряда, равный 1 (просуммирован один член). Блоки 4 и 5 выполняют расчет текущего номера члена ряда и значения этого члена с использованием рекуррентного соотношения. Блок 6 реализует функцию накопления суммы. Блок 7 выполняет проверку условия окончания цикла. В блоке 8 организуется вывод результатов расчётов.

 

Программа, реализованная в соответствии со схемой алгоритма, имеет вид:   Program Rows1; Uses Crt; Var x,eps,a,s:real; n:integer;   begin ClrScr; Write('введите x '); Readln(x); Write('введите eps '); Readln(eps); a:=x; s:=0; n:=1; While abs(a)>=eps do begin s:=s+a; n:=n+1; a:=-a*x*x/((2*n-2)*(2*n-1)) end; Writeln('Сумма ряда = ',s:8:4); Writeln('Число членов ряда = ', n:4) End.  
Рис.7.1. Блок-схема алгоритма

 

Задание

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

Вариант Сумма членов ряда Значение x Точность вычисления e
0,20 10-5
0,10 0,5·10-4
0,15 10-3
0,12 10-4
0,70 10-4
- 10-4
1,5 0,5·10-3
p/6 0,5·10-4
1,7 10-3
- 0,5·10-4

 

 

Тема 10

Работа с массивами

По определению, принятому в языке Pascal, массив - это сложный тип данных, состоящий из фиксированного числа элементов, имеющих один и тот же тип. С точки зрения программиста массив – это группа однотипных переменных с одним именем, каждый элемент массива имеет свой номер (индекс). Массив описывается одним из следующих способов:

1) Var

identificator : array [ index-type ] of element-type;

2) Type

TypeName= array [ index-type ] of element-type;

Var

identificator : TypeName;

Тип элементов может быть любым, но индекс должен быть перечислимого типа. Примеры описаний типа массив:

IntList:array[1..100] of Integer;

CharData:array['A'..'Z'] of Byte;

Matrix:array[0..9, 0..9] of Real;

Если в описании массива задан один индекс, массив называется одномерным, если два индекса – двухмерным, если n индексов – n-мерным. Одномерные массивы обычно используются для представления векторов, а двумерные – для представления матриц.

После объявления массива к каждому его элементу можно обратиться, указав идентификатор (имя) массива и индекс (номер) элемента в квадратных скобках. Например, запись IntList[2] позволяет обратиться ко второму элементу массива IntList, а запись Matrix[4,5] делает доступным для использования значение элемента, находящегося в четвёртом столбце пятой строки массива Matrix.

Перед использованием массива рекомендуется его очистить путём присваивания каждому элементу массива значения нуль:

for i:=1 to n do a[i]:=0;

Заполнение массива, то есть присваивание элементам массива значений может производиться путём ввода данных с клавиатуры, генерации случайных чисел, или присваивания результатов вычисления выражений.

Пример 1. Ввод с клавиатуры 10 элементов массива.

for i:=1 to 10 do

begin

Write(i,'-й элемент массива = ');

Readln(a[i]);

end;

Пример 2. Генерация массива действительных случайных чисел в диапазоне от X до Y:

for i:=1 to n do a[i]:=x+(y-x)*random;

(перед использованием функции random следует выполнить ее инициализацию функцией randomize)

Пример 3. Вывод массива из 10 элементов действительного типа

Writeln('Вывод элементов массива в строку:');

for i:=1 to 10 do

Write(a[i]:7:2);

Writeln('Вывод элементов массива в столбец:');

for i:=1 to 10 do

Writeln(i,'-й элемент массива = ',a[i]:7:2);

Пример 4. Вычисление суммы 10 элементов массива

s:=0;

for i:=1 to 10 do

s:=s+a[i];

Writeln('Сумма равна ', s:8:2);

Пример 5. Нахождение минимального и максимального элементов массива

mina:=a[1]; maxa:=a[1];

for i:=2 to 10 do

begin

if a[i]<mina then mina:=a[i];

if a[i]>maxa then maxa:=a[i];

end;

Writeln('Минимальное значение равно ', mina:8:2);

Writeln('Максимальное значение равно ', maxa:8:2);

Пример 6. Поиск в массиве элементов, удовлетворяющих определённым условиям. Например, чтобы подсчитать, сколько элементов массива имеют нулевые значения, надо записать:

k:=0;

for i:=1 to n do

if a[i]=0 then k:=k+1;

Writeln('В массиве А ', k, ' элементов равны 0');

 

Упражнение. Наберите текст следующей программы:

Uses Crt;

Var

a:array[1..10] of byte;

b,i,p:byte;

Begin

ClrScr;

Writeln('Заполнение массива из 10 элементов целыми числами');

for i:=1 to 10 do

a[i]:=random(255);

Writeln('Вывод массива в строку:');

for i:=1 to 10 do

Write(a[i]:7:2);

Writeln;

repeat {сортировка массива}

p:=0;

for i:=1 to 9 do

if a[i]>a[i+1] then

begin

b:=a[i]; a[i]:=a[i+1];

a[i+1]:=b; p:=1;

end;

until p=0;

Writeln;

Writeln('Вывод массива после сортировки:');

for i:=1 to 10 do

Writeln(i,'-й элемент массива = ',a[i]);

Readln;

End.

В этой программе организован ввод элементов массива, вывод исходного массива, его сортировка и вывод результатов сортировки. Сортировка выполняется методом "пузырька", при котором сравниваются значения соседних элементов массива, и если необходимо, производится их перестановка. С помощью комбинаций клавиш Ctrl-F7 введите в окно просмотра переменных имя массива а. Затем таким же образом i, a[i], p (окно просмотра открывается и закрывается клавишей F5).

Выполните пошаговое прохождение программы. Для выполнения каждой строчки программы следует нажимать клавишу F7. При этом строка, которая будет выполняться следующим шагом, выделяется другим цветом. При прохождении внимательно следите за значениями переменных в окне Watch. При вводе переменных числа, имеющие размер более 255, будут восприняты неправильно, так как они выходят из диапазона чисел типа Byte (0..255).

Задание

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

Вариант 1

а) Организовать сортировку массива по возрастанию.

б) Определить сумму отрицательных элементов массива.

Вариант 2

а) Организовать сортировку таким образом, чтобы значение 4-го элемента никогда не изменялось.

б) Определить сумму элементов массива с четными номерами.

Вариант 3

а) Определить максимальный элемент массива и его номер.

б) Организовать обработку (ввод и вывод) строковых элементов, например, фамилий студентов группы.

Вариант 4

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

б) Организовать сортировку букв в строковом массиве.

Вариант 5

а) Определить среднее арифметическое из отрицательных чисел массива.

б) Увеличить все элементы массива на 25.

Вариант 6

а) Заполнить массив так, чтобы его элементы содержали арифметическую прогрессию (8, 10, 12, 14 ...).

б) Определить сумму отрицательных элементов массива.

Вариант 7

а) Модифицировать программу так, чтобы элементы массива со значением больше 100 стали равны 100.

б) Найти наименьший из положительных элементов массива.

Вариант 8

а) Модифицировать программу так, чтобы элементы массива меньше 10 стали равны 0.

б) Вычислить среднее арифметическое из положительных элементов массива.

Вариант 9

а) Заполнить массив так, чтобы его элементы содержали геометрическую прогрессию (1, 2, 4, 8...)

б) Определить сумму четных и сумму нечетных элементов массива.

Вариант 10

а) Найти произведение всех элементов массива не равных нулю

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


 

Тема 11







Последнее изменение этой страницы: 2016-04-18; Нарушение авторского права страницы

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 34.204.176.125 (0.027 с.)