Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
БрошюраОкончательный.doc
Скачиваний:
20
Добавлен:
28.10.2018
Размер:
3.14 Mб
Скачать

Задания для выполнения

Пример 8. Дано натуральное число n. Вычислить сумму:

.

Решение. Ясно, что пользователь должен ввести с клавиатуры число n. Это число определит количество прогонов цикла. Мы будем знать, сколько раз повторится цикл (именно, n раз). Это означает, что задача может быть решена с использованием любого типа цикла.

Определимся с переменными. Здесь стоит выделить несколько обязательных моментов. Во-первых, имеется целочисленная переменная n – число прогонов цикла. Во-вторых, так как нужно вычислять промежуточные значения слагаемых, нужна целочисленная переменная, выступающая в роли параметра. Пусть ее обозначение i. Далее, нужна вещественная переменная s, в которую будет записываться сумма. Кроме того, стоит ввести вещественную переменную a, в которую будет записываться текущее слагаемое. Заметим, что текущее слагаемое (множитель) должно быть функцией текущего параметра i, а не конечного значения n. Поэтому порой будем записывать не просто a, но ai, чтобы показать зависимость от i.

Запомните: перед циклом вычисляемой сумме или произведению нужно присвоить начальное значение. Обычно для суммы это значение равно 0, а для произведения 1. Основными операторами, изменяющими сумму или произведение являются: для суммы s := s + a (где a – текущее слагаемое), для произведения p := p * b (где b – текущий множитель). Кроме того, в циклах с предусловием и с постусловием Условие должно содержать переменную, изменяемую в теле цикла, так чтобы при некотором значении последней был произведен выход из цикла и чтобы цикл не повторялся бесконечно.

Используем цикл с предусловием. Приведем блок-схему алгоритма решения задачи и ниже – текст программы.

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

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

var n,i: integer;

s,a: real;

begin

writeln(‘Введите число n’);

readln(n);

s:=0; {важный оператор –

задание сумме начального значения}

i:=n; {важный оператор –

задание параметру начального значения}

while i>0 do {условие продолжения цикла –

пока i не меньше 1}

begin

a:=1/(sqr(i)+1); {вычисление слагаемого,

зависящего от i}

s:=s+a; {приращение суммы}

i:=i-1; {важный оператор –

изменение параметра i}

end;

writeln(‘Результат: ’,s:5:2);

writeln(‘Готово. Нажмите [ENTER]…’);

readln;

end.

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

var n,i: integer;

s,a: real;

begin

writeln(‘Введите число n’);

readln(n);

s:=0; {важный оператор –

задание сумме начального значения}

i:=n; {важный оператор –

задание параметру начального значения}

repeat

a:=1/(sqr(i)+1); {вычисление слагаемого,

зависящего от i}

s:=s+a; {приращение суммы}

i:=i-1; {важный оператор –

изменение параметра i}

until i=0;

writeln(‘Результат: ’,s:5:2);

writeln(‘Готово. Нажмите [ENTER]…’);

readln;

end.

Используем цикл с параметром:

var n,i: integer;

s,a: real;

begin

writeln(‘Введите число n’);

readln(n);

s:=0; {важный оператор –

задание сумме начального значения}

for i:=n downto 1 do {заголовок цикла}

begin

a:=1/(sqr(i)+1); {вычисление слагаемого,

зависящего от i}

s:=s+a; {приращение суммы, заметьте, в

цикле нет команды, изменяющей

i, так как изменение параметра

проводится в цикле автоматически}

end;

writeln(‘Результат: ’,s:5:2);

writeln(‘Готово. Нажмите [ENTER]…’);

readln;

end.

Пример 9. «Параллельные» вычисления. Для данных вещественного x и натурального n вычислить сумму: (эта сумма есть приближенное значение выражения ex).

Решение. Данная задача сложна тем, что одновременно с вычислением суммы «параллельно» надо высчитывать текущее слагаемое, в числителе которого (по сравнению с предыдущим i-ым шагом) добавляется множитель x, а в знаменателе – множитель i + 1. Заметим, что i факториал» есть произведение первых i натуральных чисел). То есть, сначала слагаемое равно 1, затем , затем , затем и так далее. В общем случае, если на шаге с номером i мы имеем слагаемое ai, то на следующем шаге оно равно (вычисляется через предыдущее значение самого себя – рекурсивно).

Используем указанное свойство при составлении текста программы:

var i,n:integer;

x,a,s:real;

begin

write(‘Введите x (вещественное): ’);readln(x);

write(‘Введите n (натуральное): ’);readln(n);

a:=1;

s:=0;

for i:=0 to n do

begin

s:=s+a;

a:=a*(x/(i+1));

end;

writeln(‘Сумма равна ’,s:10:9);

writeln(‘Готово. Нажмите [Enter]…’);

readln;

end.

Пример 10. «Цикл в цикле». Для данных вещественного x и натурального n вычислить сумму: .

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

Приведем текст программы (разберитесь в нем внимательно):

var i,j,n:integer;

s,a:real;

begin

write(‘Введите n (натуральное): ’);readln(n);

s:=0;

for i:=1 to n do {заголовок внешнего цикла}

begin

ssin:=0;

scos:=0;

for j:=1 to i do {заголовок внутреннего цикла}

{видите, максимальное значение j равно i?}

begin

ssin:=ssin+sin(j);

scos:=scos+cos(j);

end; {в конце каждого прогона этого цикла}

{будут вычислены две суммы – синусов и косинусов}

a:=ssin/scos;

s:=s+a;

end;

writeln(‘Сумма: ’,s:10:9,‘. Нажмите [Enter]…’);

end.

Заметим, что данную задачу можно решить проще, если делать все операции одновременно:

var i,n:integer;

s,a:real;

begin

write(‘Введите n (натуральное): ’);readln(n);

s:=0;

ssin:=0;

scos:=0;

for i:=1 to n do

begin

ssin:=ssin+sin(i);

scos:=scos+cos(i);

a:=ssin/scos;

s:=s+a;

end;

writeln(‘Сумма: ’,s:10:9,‘. Нажмите [Enter]…’);

end.

С помощью циклов можно решать разнообразные задачи. Построение алгоритмов их решения – творческий процесс. Нельзя охватить примерами все возможные случаи. Дадим лишь несколько образцов решения.

Пример 11. Найти такой наименьший номер n, чтобы слагаемое стало меньше 0.00001, и найти сумму . Также вывести количество слагаемых в этой сумме.

Решение. В этой задаче кроме того, что нужно вычислять сумму, нужно проверять условие ai < 0.00001 (ai =  – текущее слагаемое). Как только данное условие выполнится, цикл должен быть завершен. Отсюда следует, что мы не знаем число прогонов цикла, поэтому используем цикл с предусловием:

var i,n:integer;

s,a:real;

begin

write(‘Введите n (натуральное): ’);readln(n);

i:=1; {в i – количество слагаемых, и, одновременно,}

{текущее слагаемое}

s:=0;

a:=1;

while a>=0.00001 do

begin

s:=s+a;

a:=1/exp(i);

i:=i+1;

end;

writeln(‘Сумма ’,s:10:8);

writeln(‘Число слагаемых: ’,i-1);

end.

… или с постусловием:

var i,n:integer;

s,a:real;

begin

write(‘Введите n (натуральное): ’);readln(n);

i:=1; {в i – количество слагаемых, и, одновременно,}

{текущее слагаемое}

s:=0;

a:=1;

repeat

s:=s+a;

a:=1/exp(i);

i:=i+1;

until a<0.0001;

writeln(‘Сумма ’,s:10:8);

writeln(‘Число слагаемых: ’,i-1);

end.

Пример 12. Вычислить .

Решение. Этот пример отличается от предыдущих. Здесь важно понять, каков должен быть состав тела цикла. Надо разглядеть элементарную операцию, с помощью которой мы переходим от шага i к шагу i + 1. Из построения выражения видно, что к текущему пересчитываемому значению прибавляется 2 и из суммы берется квадратный корень. Это и есть элементарное действие.

Текст программы:

var i,n:integer;

s:real;

begin

write(‘Введите n (натуральное): ’);readln(n);

s:=0;

for i:=1 to n do

s:=sqrt(s+2); {элементарное действие}

writeln(s:10:5); readln; end.

Пример 13. Дано целое число типа longint. Определить количество его разрядов (сколько знаков в числе).

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

Пользователь вводит с клавиатуры некоторое целое число n. Судя по типу, оно не может быть больше (по абсолютной величине), чем 2147483647. Иначе говоря, число не может быть больше десяти разрядов. Но точное их число мы не знаем. Поэтому будет использоваться цикл с условием (например, с предусловием). В этом цикле как-то должно меняться то число, которое мы исследуем. Например, при каждом проходе цикла у него будет отсекаться по одной цифре. Тогда, перечислив все цифры, мы придем к тому, что число n превратится в 0. Отсечение цифр проводится операторами div или mod при делении на 10. С их использованием текст программы приобретает следующие очертания:

var i,n:longint;

begin

write(‘Введите n (целое): ’);readln(n);

i:=0; {i - количество разрядов}

while n<>0 do

begin

i:=i+1; {учитываем новый разряд}

n:=n div 10; {уменьшаем n в 10 раз,}

{отсекая последнюю цифру}

end;

writeln(‘Число разрядов: ’,i);

readln;

end.

Пример 14. “Однопроходной” алгоритм. Приведем цитату из [14]: «“Однопроходные” алгоритмы позволяют получить требуемый результат после однократного просмотра набора исходных данных… Однопроходные алгоритмы обладают важным преимуществом: для решения задачи не требуется хранить в памяти одновременно весь набор данных. Поэтому при программировании таких алгоритмов не нужно использовать массивы».

Приведем пример задачи, решаемой с помощью однопроходного алгоритма:

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

Решение. Особенностью задачи является то, что бóльшая часть тела программы представляет собой цикл с параметром. Десять раз повторяется тело цикла. При каждом повторении пользователь вводит с клавиатуры некоторое целое число. Если проход осуществляется первый раз, то это первое число является начальным значением минимального и максимального (одновременно!) элемента, поэтому запоминается его номер как номер максимума и минимума. Затем, при каждом новом проходе цикла мы смотрим, является ли текущий элемент «более минимальный», чем текущий минимум или «более максимальный», чем текущий максимум. Если есть, то запоминаем его номер как первого, а также последнего экстремума (мы пересчитываем номер последнего экстремума, так как он не может быть меньше номера первого экстремума), причем различаем максимум это или минимум. Одновременно с этим, при каждом новом проходе цикла мы смотрим, является ли текущий элемент равным текущему минимуму или текущему максимуму (экстремум повторился). Если есть, то запоминаем его номер как последнего экстремума.

var a,i,

firstmin,firstmax,{номера первых максимума, минимума}

firstextr,lastextr,{номера первого, последнего экстр.}

min,max:integer; {сами максимум, минимум}

begin

for i:=1 to 10 do

begin

write('Input ',i:2,'th number: ');

readln(a); {чтение текущего числа}

if i=1 then

begin {начало – от чего оттолкнемся}

min:=a;

max:=a; {запомнили начальные значения экстремумов}

firstmin:=i;

firstmax:=i; {запомнили начальные номера экстремумов}

end

else

if (a<min) then

begin {если встретили лучший минимум}

firstmin:=i; {изменяем номера первого минимума}

lastextr:=i; {и последнего экстремума}

min:=a; {и сам минимум}

end

else

if (a>max) then

begin {если встретили лучший максимум}

firstmax:=i; {изменяем номера первого максимума}

lastextr:=i; {и последнего экстремума}

max:=a; {и сам максимум}

end

else

if (a=min)or(a=max) then {если встретили иные экстрем.}

lastextr:=i; {изменяем номер последнего экстрем.}

end;

if firstmin<firstmax then firstextr:=firstmin

else firstextr:=firstmax; {выбор первого экстремума}

writeln('The first exremum is ',firstextr,'th,');

writeln('The last exremum is ',lastextr,'th.');

readln;

end.

Вычислить конечные суммы:

4.1. ;

4.2. ;

4.3. ;

4.4. ;

4.5. ;

4.6. ;

4.7. ;

4.8. ;

4.9. (вспомните, как записать степень с произвольным показателем);

4.10. ;

4.11. ;

4.12. (вспомните, как записать степень с произвольным показателем);

4.13. ;

4.14. ;

4.15. ;

4.16. ;

4.17.

4.18. ;

4.19. ;

4.20. .

4.21-4.40. В задачах с данными номерами вид общего члена берите из соответствующих номеров 4.1-4.20, но вычисляйте не сумму, а произведение. Например, для варианта 14 задание будет выглядеть так: вычислить .

В следующих заданиях в цикле новый элемент суммы вычисляется рекурсивно (см. Пример 9). Число x подразумевается вещественным, число n - натуральным.

4.41. ;

4.42. ;

4.43. ;

4.44. ;

4.45. ;

4.46. ;

4.47. ;

4.48. ;

4.49. ;

4.50. ;

4.51. ;

4.52. ;

4.53. ;

4.54. ;

4.55. ;

4.56. ;

4.57. ;

4.58. ;

4.59. ;

4.60. ;

Решите разнообразные задачи на использование циклов.

4.61. Пользователь вводит с клавиатуры два целых числа a и b (так что a < b). Вывести на экран все четные целые числа, находящиеся между ними, не включая эти числа, в порядке убывания.

4.62. Пользователь вводит с клавиатуры два целых числа a и b (так что a < b). Вывести на экран все четные целые числа, находящиеся между ними, не включая эти числа, в порядке возрастания.

4.63. Пользователь вводит с клавиатуры два целых числа a и b (так что a < b). Вывести на экран все нечетные целые числа, находящиеся между ними, не включая эти числа, в порядке убывания.

4.64. Пользователь вводит с клавиатуры два целых числа a и b (так что a < b). Вывести на экран все нечетные целые числа, находящиеся между ними, не включая эти числа, в порядке возрастания.

4.65. Пользователь вводит с клавиатуры два целых числа a и b (так что a < b). Вывести на экран все четные целые числа, находящиеся между ними, включая эти числа, в порядке убывания.

4.66. Пользователь вводит с клавиатуры два целых числа a и b (так что a < b). Вывести на экран все четные целые числа, находящиеся между ними, включая эти числа, в порядке возрастания.

4.67. Пользователь вводит с клавиатуры два целых числа a и b (так что a < b). Вывести на экран все нечетные целые числа, находящиеся между ними, включая эти числа, в порядке убывания.

4.68. Пользователь вводит с клавиатуры два целых числа a и b (так что a < b). Вывести на экран все нечетные целые числа, находящиеся между ними, включая эти числа, в порядке возрастания.

4.69. Вычислить .

4.70. Пользователь вводит с клавиатуры два целых числа a и b (так что a < b). Вывести на экран все целые числа, находящиеся между ними, не включая эти числа, в порядке убывания.

4.71. Пользователь вводит с клавиатуры два целых числа a и b (так что a < b). Вывести на экран все целые числа, находящиеся между ними, не включая эти числа, в порядке возрастания.

4.72. Пользователь вводит с клавиатуры два целых числа a и b (так что a < b). Вывести на экран все целые числа, находящиеся между ними, включая эти числа, в порядке убывания.

4.73. Пользователь вводит с клавиатуры два целых числа a и b (так что a < b). Вывести на экран все целые числа, находящиеся между ними, включая эти числа, в порядке возрастания.

4.74. Вывести на экран числа a-n, a-n+1, a-n+2,… a-1 для заданных вещественного a и натурального n.

4.75. Вывести на экран числа a-1, a-2, a-3,… a-n для заданных вещественного a и натурального n.

4.76. Вывести на экран числа an, an-1, an-2,… a1 для заданных вещественного a и натурального n.

4.77. Вывести на экран числа a1, a2, a3,… an для заданных вещественного a и натурального n.

4.78. Вычислить .

4.79. Вычислить .

4.80. Вычислить .

Следующие задачи используют в своем решении «однопроходные» алгоритмы (см. Пример 14).

4.81. Пользователь вводит последовательно с клавиатуры десять целых чисел (разнообразных по знаку). Вывести значение максимального элемента.

4.82. Пользователь вводит последовательно с клавиатуры десять целых чисел (разнообразных по знаку). Вывести значение минимального элемента.

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

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

4.85. Пользователь вводит последовательно с клавиатуры десять целых чисел (разнообразных по знаку). Пусть в ряде имеется несколько минимальных элементов. Вывести номер первого минимального элемента.

4.86. Пользователь вводит последовательно с клавиатуры десять целых чисел (разнообразных по знаку). Пусть в ряде имеется несколько максимальных элементов. Вывести номер первого максимального элемента.

4.87. Пользователь вводит последовательно с клавиатуры десять целых чисел (разнообразных по знаку). Пусть в ряде имеется несколько минимальных элементов. Вывести номер последнего минимального элемента.

4.88. Пользователь вводит последовательно с клавиатуры десять целых чисел (разнообразных по знаку). Пусть в ряде имеется несколько максимальных элементов. Вывести номер последнего максимального элемента.

4.89. Пользователь вводит последовательно с клавиатуры десять целых чисел (разнообразных по знаку). Пусть в ряде имеется несколько минимальных элементов. Вывести количество минимальных элементов.

4.90. Пользователь вводит последовательно с клавиатуры десять целых чисел (разнообразных по знаку). Пусть в ряде имеется несколько максимальных элементов. Вывести количество максимальных элементов.

4.91. Пользователь вводит последовательно с клавиатуры десять целых чисел (разнообразных по знаку). Пусть в ряде имеется несколько минимальных среди четных и несколько минимальных среди нечетных его элементов. Вывести количество минимальных элементов среди четных.

4.92. Пользователь вводит последовательно с клавиатуры десять целых чисел (разнообразных по знаку). Пусть в ряде имеется несколько максимальных среди четных и несколько максимальных среди нечетных его элементов. Вывести количество максимальных элементов среди четных.

4.93. Пользователь вводит последовательно с клавиатуры десять целых чисел (разнообразных по знаку). Пусть в ряде имеется несколько минимальных среди четных и несколько минимальных среди нечетных его элементов. Вывести количество минимальных элементов среди нечетных.

4.94. Пользователь вводит последовательно с клавиатуры десять целых чисел (разнообразных по знаку). Пусть в ряде имеется несколько максимальных среди четных и несколько максимальных среди нечетных его элементов. Вывести количество максимальных элементов среди нечетных.

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

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

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

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

4.99. Пользователь вводит последовательно с клавиатуры десять целых чисел (разнообразных по знаку). Определить, что раньше встречается в ряде - минимальный или максимальный элемент.

4.100. Пользователь вводит последовательно с клавиатуры десять целых чисел (разнообразных по знаку). Определить, что позже встречается в ряде - минимальный или максимальный элемент.