1
Министерство образования Российской Федерации Государственное образовательное учреждение высшего профессионального об...
24 downloads
223 Views
385KB Size
Report
This content was uploaded by our users and we assume good faith they have the permission to share this book. If you own the copyright to this book and it is wrongfully on our website, we offer a simple DMCA procedure to remove your content from our site. Start by pressing the button below!
Report copyright / DMCA form
1
Министерство образования Российской Федерации Государственное образовательное учреждение высшего профессионального образования Ульяновский государственный технический университет
М.В. Петрова
АЛГОРИТМИЗАЦИЯ И ПРОГРАММИРОВАНИЕ ЗАДАЧ Методические указания для студентов специальности 180400 дневной и заочной форм обучения
Ульяновск 2003
2
УДК 681.3.06 (076) ББК 22.18я7 П 30 Рецензент кандидат технических наук Кузнецов А. В.
Петрова М. В. П 30 Алгоритмизация и программирование задач: Методические указания. − Ульяновск: УлГТУ, 2003. – 32 с. Разработаны на кафедре «Электропривод и автоматизация промышленных установок». Содержат методические указания к разработке алгоритмов и практическому программированию на языке Турбо Паскаль, которые могут быть использованы для подготовки к выполнению контрольных, лабораторных и практических заданий по следующим дисциплинам: «Численные методы решения задач», «Основы алгоритмизации», «Теоретические основы электротехники». Указания предназначены для студентов вузов специальности 180400 дневной и заочной форм обучения. УДК 681.3.06 (076) ББК 22.18 я 7
Петрова Марина Валерьевна АЛГОРИТМИЗАЦИЯ И ПРОГРАММИРОВАНИЕ ЗАДАЧ Методические указания Редактор Н. А. Евдокимова Подписано в печать 30.11.2003. Формат 60×84/16 Бумага тип. №1. Печать трафаретная. Усл. печ. л. 1,86. Уч.-изд.л 1,50. Тираж 100экз. Заказ Ульяновский государственный технический университет 432027, г. Ульяновск, ул. Сев. Венец, д. 32 Типография УлГТУ, 432027, г. Ульяновск, ул. Сев. Венец, д. 32.
3
ОГЛАВЛЕНИЕ Введение………………………………………………………………………….. 4 1. Программирование алгоритмов линейной структуры……………………… 7 2. Программирование алгоритмов разветвляющейся структуры……………….. 8 3. Программирование алгоритмов циклической структуры…………………... 11 4. Массивы……………………………………………………………………… . 15 5. Характерные приемы алгоритмизации задач……………………………… . 16 5.1. Вычисление в цикле с несколькими одновременно изменяющимися параметрами………………………………………………………………… 16 5.2. Запоминание результатов……………………………………………….. 17 5.3. Вычисление суммы и произведения……………………………………. 19 5.4. Вычисление суммы членов бесконечного ряда………………………. 22 5.5. Вычисление полинома………………………………………………….. 23 5.6. Нахождение наибольшего и наименьшего значения……………….. . 24 5.7. Уточнение корней уравнения………………………………………… . 27 6. Алгоритмы со структурой вложенных циклов…………………………… 29 7. Список литературы………………………………………………………….. 32
4
ВВЕДЕНИЕ Язык программирования Паскаль назван в честь французского математика Блеза Паскаля. Он разработан в начале 70-х годов 20 века профессором Швейцарской высшей технической школы Никлаусом Виртом. Интегрированная среда программирования Турбо Паскаль разработана фирмой Borland. Среда программирования Турбо Паскаль характеризуется высокой скоростью компиляции программ, тщательно продуманной и удобной средой для работы. Обнаружение ошибок при компиляции программы вызывает останов обработки программы с выдачей на экран сообщения о характере ошибки. Таким образом, наличие в одной среде редактора, компилятора и отладчика значительно увеличивает эффективность разработки программ. Работа в интегрированной среде Для эффективного управления процессом обработки программы пользователю необходимо иметь представление о технологии прохождения программы в интегрированной среде. Выполняются последовательно такие действия: 1. Создать исходный текст программы. 2. Записать ее на диск в виде файла. 3. Запустить программу на компиляцию. 4. Найти и устранить синтаксические ошибки. 5. Запустить программу на выполнение. Запуск системы Запуск интегрированной среды программирования Турбо Паскаль осуществляется следующим образом: 1. Находим директорию с именем ТР7 (Turbo Pascal 7.версия). 2. Находим файл turbo.exe. При нажатии клавиши Enter произойдет запуск программы, устанавливающей интегрированную среду программирования с выдачей на экран основного меню. Основное изображение экрана содержит четыре части: 1. Основное меню (верхняя строка экрана). 2. Окно редактирования (поле экрана). 3. Окно просмотра (поле экрана расположенное под надписью «Watch»). 4. Нижняя строка (назначение функциональных клавиш). Для всех элементов основного меню выводится перечень подрежимов. Для того чтобы активизировать основное меню (верхнюю строку), необходимо нажать клавишу F10, далее, перемещая с помощью клавиш управления курсором, выбирается нужный режим (опция), затем, нажав клавишу Enter, открывается падающее меню, содержащее подрежимы.
5
Система меню Все управление средой Турбо Паскаля осуществляется в основном с помощью системы последовательно разворачивающихся меню. Главное меню содержит фактически лишь оглавление дополнительных меню. FILE (Файл) - действие с файлами и выход из системы; EDIT (Редактировать) - восстановление испорченной строки и операция с временным буфером; SEARCH (искать) - поиск текста, процедуры, функции или места ошибки; RUN (работа) - прогон программы; COMPILE (компиляция) - компиляция программы; DEBUG (отладка) - отладка программы; TOOLS (инструменты) - вызов вспомогательных программ (утилит); OPTIONS (варианты) - установка параметров среды; WINDOW (окно) - работа с окнами; HELP (помощь) - обращение к справочной службе. Разработка алгоритма решения задачи Алгоритм − некоторая конечная последовательность предписаний, определяющих процесс преобразования исходных и промежуточных данных в результате решения задачи. Наиболее наглядный способ представления алгоритмов − их изображение в виде схем − последовательности блоков, предписывающих выполнение определенных функций, и связей между ними. Внутри блоков указывается поясняющая информация, характеризующая выполняемые ими действия. В таблице 1 приведены некоторые наиболее часто употребляемые блоки и даны пояснения к ним. Таблица 1 Символ
Выполняемые действия Обозначает начало и конец алгоритма Ввод и вывод данных Вычислительные действия Наличие условия в алгоритме Наличие цикла в алгоритме Наличие подпрограммы Разрыв алгоритма Внесение комментариев
При составлении алгоритма необходимо обеспечить, чтобы он обладал рядом свойств:
6
1. Однозначность алгоритма − единственность толкования исполнителем правил выполнения действий и порядка их выполнения. 2. Конечность алгоритма − обязательность завершения каждого из действий. 3. Результативность алгоритма − выполнение алгоритма завершается получением определенных результатов. 4. Массовость алгоритма − возможность применения данного алгоритма для решения целого класса задач. 5. Правильность алгоритма − способность алгоритма давать правильные результаты решения поставленных задач. Простые типы данных Все переменные, используемые в программе, должны быть перечислены в разделе описания переменных, который состоит из предложений описания переменных. Эти предложения размещаются между заголовком программы, подпрограммы или модуля и зарезервированным словом begin, открывающим раздел операторов. Предложение описания переменных имеет вид Var v1,v2,…: type; где v1,v2…. − список переменных, а type задает тип переменных из данного списка. Все имеющиеся в Паскале типы принято делить на группы. Типы, принадлежащие одной группе, имеют определенное сходство. Прежде всего, выделяют простые и структурные типы. Простые типы, в свою очередь, подразделяются на порядковые и вещественные типы. В табл. 2 приведено описание простых типов. Таблица 2 Название Короткий целый Байтовый Слово Целый Длинный целый Символьный Булев Вещественный С одинарной точностью С двойной точностью С повышенной точностью Сложный
Идентификатор Множество допустимых символов Порядковый shortint -128..127 byte 0..255 word 0..65535 integer -32768..32767 longint -2147483648..2147483647 char Набор символов кода ASCII boolean True, False Вещественный Real -1,7×1038..-2,9×10-39, 2,9×10-39..1,7×1038 Single -3,4×1038..-1,5×10-45, 1,5×10-45..3,4×1038 Double -1,7×10308..-5,0×10-324, 5,0×10-324..1,7×10308 Extended -1,1×104932..-1,9×10-4951, 1,9×10-4951..1,1×104932 comp -263+1..263-1
7
1. ПРОГРАММИРОВАНИЕ АЛГОРИТМОВ ЛИНЕЙНОЙ СТРУКТУРЫ Алгоритм, в котором действия выполняются последовательно друг за другом, называется линейным алгоритмом. 1.1. Вычислить высоты треугольника со сторонами a,b,c по формулам: ha = (2 / a ) p( p − a)( p − b)( p − c) ; hb = (2 / b) p( p − a )( p − b)( p − c) ; hc = (2 / c) p ( p − a )( p − b)( p − c) , p = (a + b + c) / 2.
где
Для решения любой задачи может иметь место несколько алгоритмов приводящих к получению результата ее решения. Из всех возможных алгоритмов следует выбирать наилучший в смысле некоторого критерия. Часто в качестве критерия используют либо оценку точности решения задачи, либо затраты времени на ее решение, либо некоторый интегральный критерий, включающий оценки и точности, и затрат времени. При организации решения задачи 1.1 для исключения повторений вычислять высоты следует не по приведенным выше формулам, а используя промежуточную переменную: t = 2 p ( p − a )( p − b)( p − c) , тогда ha = t / a, hb = t / b, hc = t / c. С учетом преобразований схема алгоритма решения задачи будет иметь вид, представленный на рис.1.1. Начало Начало
Начало
a, b, c
x, n
p=(a+b+c)/2
t=2√p(p-a)(p-b)(p-c)
a, b, x да
x≤a нет
y=sin x + 0,5 да
y=0
z=sin x
нет да
x≥b
ha=t/a
нет
z=x3/y hb=t/b
z
z=cos x
hc=t/c y=0 ha , hb , hc конец
Рис.1. Рис
z=tg x
конец
Рис.2.
z конец
Рис.3.
8
1.2. Вычислить площадь поверхности и объем усеченного конуса по следующим формулам: S = π ( R + r )l + πR 2 + πr 2 ; V = (1 / 3)π ( R 2 + r 2 + Rr )h.
1.3. Вычислить координаты центра тяжести трех материальных точек с массами m1 , m 2 , m3 и координатами ( x1 , y1 ); ( x 2 , y 2 ); ( x 3 , y 3 ) по формулам: x c = (m1 x1 + m 2 x 2 + m3 x 3 ) /(m1 + m 2 + m3 ); y c = (m1 y1 + m 2 y 2 + m3 y 3 ) /(m1 + m 2 + m3 ).
1.4. Вычислить координаты точки, делящей отрезок a1 a 2 в отношении n1 : n 2 , по формулам: x = ( x1 + γx 2 ) /(1 + γ );
y = ( y1 + γy 2 ) /(1 + γ ), где
γ = n1 / n 2 .
1.5. Вычислить медианы треугольника со сторонами a, b, c по формулам: m a = 0,5 2b 2 + 2c 2 − a 2 ; mb = 0,5 2a 2 + 2c 2 − b 2 ; m c = 0,5 2a 2 + 2b 2 − c 2 .
1.6. Вычислить значение функции y = ae − ax sin ωx
при
x = (π / 2 − ϕ ) / ω .
1.7. Вычислить значения функций: y = (e − x1 + e − x2 ) / 2; z = (a x1 − b x2 ) / c, где
x1 = (b + b 2 − 4ac ) / 2a, x2 = (b − b 2 − 4ac ) / 2a.
1.8. Определить высоту треугольника, если его площадь равна S, а основание больше высоты на величину a. 2. ПРОГРАММИРОВАНИЕ АЛГОРИТМОВ РАЗВЕТВЛЯЮЩЕЙСЯ СТРУКТУРЫ На практике редко удается представить схему алгоритма решения задачи в виде линейной структуры. В программу может быть включено условие (например, выражение отношения или логическое отношение), в зависимости от которого вычислительный процесс идет по той или иной ветви. Алгоритм такого вычислительного процесса называется алгоритмом разветвляющейся структуры. В общем случае количество ветвей в таком алгоритме не обязательно равно двум. 2.1. Вычислить значение функции z = x 3 / y, где y = sin nx + 0,5 .
9
Казалось бы, решение этой задачи можно описать алгоритмом линейной структуры. Однако для удовлетворения свойств массовости и результативности алгоритма необходимо, чтобы при любых исходных данных был получен результат или сообщение о том, что задача не может быть решена при заданных исходных данных. Действительно, если y = 0 , задача не может быть решена, так как деление на 0 невозможно. Поэтому в алгоритме необходимо предусмотреть этот случай и выдать в качестве результата информацию о том, что y = 0 . Таким образом, рассматриваемый вычислительный процесс должен иметь две ветви: в одной, если y ≠ 0 , необходимо вывести и отпечатать значение переменной z , а в другой − вывести на печать информацию, что y = 0 . Блок-схема алгоритма решения этой задачи представлена на рис.2. Этот вычислительный процесс можно описать условным выражением: Вычислить z=x3/y, если y≠0. Вывести y=0, если y=0. В блок−схеме до блока номер 4 располагаются блоки сначала одной ветви (блоки 5,6), а затем второй ветви (блок 7). Поскольку после выполнения блоков первой ветви нет необходимости выполнять блоки второй ветви, осуществляется переход сразу к концу алгоритма (к блоку 8). В алгоритме дважды нарушается естественный порядок выполнения блоков: 1) при проверке условия y=0 (условный переход); 2) после выполнения блоков первой ветви (безусловный переход). 2.2. Вычислить значение функции: sin x, если x ≤ a z = cos x, если a < x < b . tgx, если x ≥ b
Здесь вычислительный процесс имеет три ветви. С помощью условного блока можно проверить выполнение только условия, по которому будет определен выбор выражения для реализации одной ветви. Поэтому, чтобы установить, по какой из двух оставшихся ветвей должен идти вычислительный процесс в случае невыполнения первого условия, необходимо использовать еще один условный блок. Блок-схема этого алгоритма представлена на рис.3. Блок 3 проверяет условие x≤ a, а в случае его выполнения осуществляется переход к блоку 4, вычисляющему z=sin x. Если x>a, то блок 5 проверяет условие x≥ b. Если это условие выполняется, то осуществляется переход к блоку 6, вычисляющему z=tg x. В противном случае x лежит в интервале между a и b и происходит переход к блоку 7, вычисляющему z=cos x. После вычисления по любой из формул осуществляется переход в общую ветвь к блоку печати. 2.3. Вычислить корни квадратного уравнения ax2+bx+c=0.
10
Если d=b2-4ac≥0, то корни действительные; следовательно, необходимо вычислить x1,2=e± f. Если d<0, то корни мнимые; следовательно, необходимо вычислить e и f по формулам e=-b/(2a), f=√ |b2-4ac|/(2a). 2.4. Вычислить значение функции 3,67e − x , если п 2 − x ≥ 0 z= . x 2 0 , 89 e , если n x 0 − <
2.5. Найти квадрат наибольшего из двух чисел a и b и вывести на печать признак N = 1 , если наибольшим является a , и N = 2 , если наибольшим является b. 2.6. Определить, попадает ли точка с координатами x 0 , y 0 в круг радиусом r . Присвоить признаку N = 1 , если точка находится внутри круга, и N = 0 , если точка вне круга. 2.7. Вычислить значение функции: ln x, если x ≥ 1 z = 1, если − 1 < x < 1 . e x , если x ≤ −1
2.8. Определить в каком квадранте находится точка с координатами x, y , и вывести на печать номер квадранта. 2.9. Округлить действительное положительное число x , меньшее 5, до ближайшего целого числа: 0, если 1, если 2, если NX = 3, если 4, если 5, если
0,5 ≤ x < 1,5 1,5 ≤ x < 2,5 . 2,5 ≤ x < 3,5 3,5 ≤ x < 4,5 x ≥ 4,5 x < 0,5
2.10. Составить программу для решения квадратного уравнения ax 2 + bx + c = 0 . 2.11. Определить максимальное четное число из двух введенных. 2.12. Определить, можно ли из отрезков с длинами a, b, c построить треугольник. 2.13. Для двух чисел x, y определить, являются ли они корнями уравнения: ax 4 + by 2 + c = 0 . 2.14. Вычислить значения функции z в зависимости от значения x :
11
1 + (sin x) , если x < −0,8 1, 7 z = 1 − x , если x > 1 . x + 1, в противном случае 2.15. Если среди трех чисел x, y, z имеется хотя бы одно четное, то найти
максимальное число, иначе − минимальное. 2.16. Ввести два числа a и b . Меньшее заменить полусуммой, а большее удвоенным произведением. 3. ПРОГРАММИРОВАНИЕ АЛГОРИТМОВ ЦИКЛИЧЕСКОЙ СТРУКТУРЫ Алгоритм, в котором вычисления повторяются по одной и той же совокупности формул, называется циклическим алгоритмом. В языке Турбо Паскаль имеются три различных оператора, с помощью которых можно запрограммировать повторяющиеся фрагменты программ: с параметром, с предусловием и с постусловием. Использование циклов позволяет существенно сократить схему алгоритма и длину соответствующей ему программы. Различают циклы с заданным и неизвестным числом повторений. К последним относятся итерационные циклы, характеризующиеся последовательным приближением к искомому значению с заданной точностью. Если число повторений тела цикла заранее известно, то чаще всего применяется оператор цикла с параметром: FOR<параметр цикла>:=<нач. знач.>TO<кон. знач.>DO<оператор> FOR<пар. цикла>:=<нач.знач.>DOWNTO<кон.знач.>DO<оператор>, где <параметр цикла> − величина, которая изменяется в цикле (переменная типа Integer); <нач.знач.> − величина, задающая начальное значение параметра цикла; <кон.знач.> − величина, задающая конечное значение параметра цикла. Шаг наращивания параметра цикла строго равен 1. При замене зарезервированного слова TO на DOWNTO шаг наращивания параметра цикла равен (-1). 3.1. Осуществить ввод с клавиатуры целого числа N и вычислить суммы всех целых чисел от 1 до N. Составим программу: Var i,N,S: integer; Begin Write ('введите N'); Readln (N); S:=0; FOR i:=1 TO N DO S:=S+i; Writeln ('S=',S); End. 3.2. Вычислить и вывести на печать значения функции y = a 3 /(a 2 + x 2 ) при x , изменяющемся от 0 до 3 с шагом 0,1.
12
Это цикл с заданным числом повторений, которое определяется по формуле n = ]( x m − x 0 ) / h[ + 1 ; где x 0 и x m − соответственно начальное и конечное значение аргумента; h − шаг изменения аргумента. Перед первым выполнением цикла необходимо задать начальное значение, равное 0, а затем организовать 31 раз вычисление и печать значений функции. При каждом новом выполнении цикла необходимо изменять аргумент на шаг, равный 0,1. Чтобы процесс был конечным, необходимо задать условие окончания цикла. Таким образом, для организации цикла необходимо: 1. Задавать перед циклом начальное значение переменной, изменяющейся в цикле. 2. Изменять значение переменной перед каждым новым повторением цикла. 3. Проверять условие окончания цикла. 4. Управлять циклом, т. е. переходить к его началу, если он незакончен, или выходить из него по окончании. Последние три функции повторяются многократно. Переменную, изменяющуюся в цикле называют параметром цикла. В одном цикле может быть несколько параметров. Схема алгоритма приведена на рис.4 Начало
Начало
Начало a
a
x=0
x = 0..3,0.1
x, ε y=1 n=1
3
y=a3/(a2+x2)
2
y=a /(a +x)
y=y⋅x/n
y y
y n=n+1
x=x+0,1 да
x≤3
конец да
нет
y>ε нет конец
конец
Рис. 4.
Рис. 5.
Рис. 6.
На схеме блок 3 выполняет первую функцию, необходимую для организации цикла, блок 6 – вторую, блок 7 – третью и четвертую функции. Схема алгоритма получается во многих случаях более компактной и наглядной, если для ее построения использовать блок начала цикла, который выполняет все функции, необходимые для его организации (рис.5).
13
3.3. Вычислить значения членов бесконечного ряда x,
x 2 x3 xn , ,..., ,... 2! 3! n!
до члена x n / n!≤ ε .
Здесь имеет место итерационный цикл, так как заранее не известно, при каком n выполняется условие xn/n!≤ε. Для итерационных циклов число повторений зависит от некоторого промежуточного или окончательного результата, а не от параметра цикла. Сравнивая два соседних члена ряда, видим, что yn/yn-1=x/n. Поэтому для уменьшения времени счета, при вычислении текущего члена ряда целесообразно использовать в цикле рекуррентную формулу yn=yn-1 x/n. Чтобы использовать эту формулу для вычисления значения первого члена ряда y1=y0(x/1), необходимо, заданное начальное значение y0 приравнять 1. Параметром, изменяющимся в этом цикле, будет номер n члена ряда. Тогда формула для вычисления значения текущего члена ряда будет иметь вид y=yx/n. Схема алгоритма такого вычислительного процесса приведена на рис.6. Если использовать для организации цикла блок начала цикла, то в нем надо указать в качестве последнего значения параметра цикла некоторое большое число, заведомо большее того n, при котором выполняется условие y≤ε. Оператор цикла с предпроверкой условия WHILE <условие>DO<оператор> Указанный оператор выполняется повторно до тех пор, пока условие истинно. Действие его таково: если при выполнении этого цикла условие ложно сразу же, то оператор, стоящий после DO , не выполняется ни разу. Оператор цикла с постпроверкой условия REPEAT<группа операторов>UNTIL<условие> В этом операторе, в отличие от оператора цикла с предусловием, условие проверяется после выполнения тела цикла. При этом тело цикла выполняется хотя бы один раз и до тех пор, пока условие ложно. Если в цикле WHILE выполняется несколько операторов, то они объединяются в один составной и заключаются в операторные скобки BEGIN и END, а в цикле REPEAT это не делается. x 3 − 4x + 1 3.4. Вычислить значение функции y = , пользуясь оператором | x | +1 цикла WHILE, при x , изменяющемся в диапазоне x НАЧ ≤ x ≤ x КОН с шагом ∆x .
Представим решение этой задачи в виде блок-схемы (рис.7).
14 Начало
Составим программу:
xN,xK,dx
Var x,y,xN,xK,dx:real; Begin Writeln ('введите xN,xK,dx); Read (xN,xK,dx); X:=xN; WHILE x<=xK DO begin Y:=(x*sqr(x)-4*x+1)/(abs(x)+1); Writeln('x=',x,' y=',y); X:=x+dx; End; End.
x=xN x≤xK
нет
да y =
x3 − 4x + 1 | x | +1
x, y x=x+dx
конец
Рис.7 3.5. Вычислить сумму целых четных чисел до 10 включительно. Представим решение этой задачи в виде блок-схемы (рис.8). Начало
Составим программу: Var S,i:integer; Begin S:=0; i:=0; Repeat S:=S+i; i:=i+2 Until (i>10); Writeln ('i=',i' S=',S); End.
S=0 i=0 S=S+i i=i+2 нет
i>10
i,S конец
Рис.8 4. МАССИВЫ Массив − это совокупность переменных, которые имеют одно и то же имя и тип. Элементы массива различаются по индексу. Имя общее, индекс оригинальный. Упорядоченность данных в массиве позволяет обращаться к любому
15
элементу массива по его номеру (индексу), а однотипность данных позволяет использовать циклическую обработку всех элементов Различают одномерные массивы (1 индекс) − они используются для представления векторов и двумерные массивы (2 индекса) − они используются для представления матриц. В Паскале можно описать массив любой размерности с учетом следующих ограничений: 1. Границы изменения индексов (тип − диапазон) необходимо определить в описании массива или до его объявления. 2. Максимальный объем памяти, выделенной под массив не должен превышать 64 кБ. Переменные типа массив − объявляются следующим образом: Var A: array [1..10] of integer; − одномерный массив из 10 целых чисел, B: array [1..20] of real; − одномерный массив из 20 вещественных чисел, C: array [1..4,1..7] of integer; − двумерный массив из 28 целых чисел. При описании массива используются зарезервированные слова: ARRAY - массив OF - из За словом array в квадратных скобках указывается тип − диапазон, с помощью которого компилятор определяет общее число элементов массива. 4.1. Вычислить значения функции z = ( x i + a i ) / 2 , если x i и a i − элементы массивов, состоящие из 40 элементов каждый. 4.2. Записать в массив x , состоящий из 20 элементов, нули. 4.3. Вычислить значения функции, если a i − элементы массива (a1 , a 2 ..., a 25 ) . a i = a i , если a i = 0, если
ai > 0 ai ≤ 0
.
4.4. Вывести на печать положительные элементы массива (a1 , a 2 ..., a 25 ) . 4.5. Вывести на печать первый отрицательный элемент массива (a1 , a 2 ..., a 25 ) и его порядковый номер, полагая, что в массиве есть хотя бы один отрицательный элемент. 4.6. Вывести на печать номера элементов массива (a1 , a 2 ..., a 25 ) , удовлетворяющих условию 0 < a i < 1 . 4.7. Вычислить z = 3 a i bi c i / 3 , где a i , bi , c i − элементы массивов, состоящие из 20 элементов каждый. 4.8. Вывести на печать элементы массива (a1 , a 2 ..., a 25 ) , кратные трем. 4.9. Вывести на печать номера точек, лежащих в круге радиусом r . Координаты точек заданы массивами ( x1 , x 2 ,..., x10 ), ( y1 , y 2 ,.., y10 ).
16
4.10. В одномерном массиве найти сумму положительных, произведение отрицательных, количество четных элементов. 4.11. Найти минимальное значение элемента массива и его порядковый номер. 4.12. Найти минимальное значение элемента массива из нечетной позиции. 4.13. Найти максимальное значение элемента массива и его порядковый номер. 4.14. Дан массив, состоящий из 30 элементов, найти второй положительный элемент. 4.15. Дан массив, состоящий из 50 элементов, найти предпоследний нечетный элемент. 4.16. В одномерном массиве перенести элемент, стоящий на первом месте в конец массива. 5. ХАРАКТЕРНЫЕ ПРИЕМЫ АЛГОРИТМИЗАЦИИ ЗАДАЧ Рассмотрим приемы, наиболее часто используемые при решении практических задач. 5.1. Вычисление в цикле с несколькими одновременно изменяющимися параметрами В рассмотренных ранее примерах алгоритмов циклической структуры в цикле изменялся только один параметр. На практике часто встречаются задачи, в которых необходимо использовать несколько параметров цикла, изменяющихся одновременно. Цикл с несколькими одновременно изменяющимися параметрами организуется по схеме, аналогичной схеме организации цикла с одним параметром. Для остальных параметров перед циклом необходимо задавать их начальные значения, а внутри его вычислять текущие. 5.1.1. Вычислить значение функции z = ( xi + a) / 2 , если xi являются элементами массива ( x1 , x 2 ,..., x30 ) , a изменяется от 2 с шагом 0,5. Считать xi + a > 0 . 5.1.2. Вычислить значение функции z = (a + b + ci ) / i , если a изменяется от 0 до 1 с шагом 0,1, b изменяется от 1 до 3 с шагом 0,2, ci являются элементами массива (c1 , c 2 ,..., c11 ). 5.1.3. Вычислить значения функции u = ( xi + y ) / z 2i −1 , если xi являются элементами массива ( x1 , x 2 ,.., x50 ) , z i − массива ( z1 , z 2 ,.., z100 ) , а y изменяется от 1 с шагом 0,25. 5.1.4. Вычислить значение функции z = xyi /( x + y i ) , если x изменяется одновременно с y i от начального значения a с шагом h , где y i являются элементами массива ( y1 , y 2 ,..., y 20 ) . Здесь в цикле, выполняемом 20 раз, изменяются два параметра: простая переменная x и i индекс переменной y . Схема алгоритма решения этой задачи представлена на рис.9, где блок 4 задает закон изменения параметра i от 1 до 20
17
с шагом 1, блок 3 – перед циклом начальное значение параметра x , а блок 7 вычисляет новое значение параметра x . Начало a, h, y
Начало
Начало
x
x
x =a
i=1..50
i=1..20
zi=√(xi2+1)/i
z =x⋅yi/(x+yi) z
z
z=0 i=1..20 z=z+xi2/i
конец z
x=x+h
конец конец
Рис.9
Рис.10
Рис.11
5.1.5. Вычислить значения функции z = x xy , где x изменяется от 1 с шагом 0,1 до 2, y изменяется от y 0 с шагом h . Считать y > 0 . 5.1.6. Вычислить и вывести на печать значения членов ряда x + h x + 2h x + 3h x + nh x + 20h , , ,..., ,..., . 3 5 7 2n + 1 41
5.1.7. Вычислить и вывести на печать значения членов ряда x 0 + ∆x x0 + 3∆x x + (2n − 1)∆x ,... . ,..., 0 , n0 + 3∆n n0 + 5∆n n0 + (2n + 1)∆n
Последнее значение знаменателя принять равным m. 5.2. Запоминание результатов Если результатом вычислений является значение простой переменной, то для записи в памяти ЭВМ выделяется одна ячейка памяти. В том случае, когда в процессе вычислений значение переменной изменяется, то в памяти после окончания вычислений остается лишь последнее значение результата. Чтобы записать все вычисленные значения, нужно выделить для их хранения необходимое количество ячеек памяти (массив), а текущие результаты обозначить переменной с индексом. 5.2.1. Вычислить и запомнить значения функции z i = ( xi2 + 1) / i , где xi − элементы массива ( x1 , x2 ,.., x50 ) . Схема алгоритма, результирующего этот вычис-
18
лительный процесс, представлена на рис. 10. В схеме блок печати стоит за циклом, так как на печать выводится массив Z . 2
5.2.2. Вычислить и запомнить значения функции z = ae bx −cx при изменении аргумента x от 0 до 2 с шагом 0,1. 5.2.3. Вычислить и запомнить значения функции z i = ( xi + yi ) / 2 , где
X ,Y
− массивы из 45 элементов каждый. 5.2.4. Вычислить и запомнить значения функции xi , если
xi > 0;
0, если
xi = 0;
− 1, если
xi < 0,
yi =
где xi − элементы массива из 20 элементов. 5.2.5. Записать положительные элементы массива ( x1 , x 2 ,...x30 ) подряд в массив Y . 5.2.6. Переписать в массив порядке. 5.2.7. Записать в массив
Y
Y
элементы массива ( x1 , x 2 ,...x30 ) в обратном
подряд номера положительных элементов
массива ( x1 , x 2 ,...x30 ) . 5.2.8. Вычислить значение функции y = n sin x − cos nx , если x изменяется от x0 до x m с шагом h . Записать в массив Z подряд значения функции, удовлетворяющие условию y ≤ 0 ≤ 1 . 5.2.9. Записать подряд в массив щие четные индексы. 5.2.10. Записать подряд в массив
B
элементы массива ( x1 , x 2 ,...x30 ) , имею-
B
элементы массива ( x1 , x 2 ,...x30 ) , стоя-
щие на четных местах, а элементы, стоящие на нечетных местах, − в массив 5.2.11. Запомнить в массиве
Z
C
.
положительные значения y для монотонно
убывающей функции y = − x 3 + ax 2 + bx + c , если x изменяется от 0 с шагом 0,1 до 10. Отрицательные значения функции не вычислять. Считать, что функция имеет хотя бы один отрицательный элемент. 5.2.12. Переписать положительные элементы массива ( x1 , x 2 ,...x30 ) в массив Z , а отрицательные – в массив Y . Элементы в массивах располагать подряд. 5.2.13. Запомнить в массиве
A значения
n , при которых z > 0 для знако-
чередующейся функции z = sin(nx + ϕ ) , а в массиве
B
− значения n , при которых
z ≤ 0 (n = 1,2,3,..,10) .
5.2.14. Переписать элементы главной диагонали матрицы номерный массив
B
, считая n ≤ 30 .
A ( n × n)
в од-
19
5.3. Вычисление суммы и произведения Если необходимо вычислить сумму значений некоторой функции y = f (x) при различных значениях аргумента, целесообразно организовать цикл, в котором надо предусмотреть не только вычисление значений функции, но и накопление суммы путем прибавления полученных слагаемых к сумме всех предыдущих слагаемых. Формула, используемая для накопления суммы, имеет вид z n = z n −1 + y n . Поскольку надобности в запоминании значений всех слагаемых и промежуточных сумм нет, в качестве z и y нужно использовать простые переменные и накопление суммы вести в цикле по формуле z = z + y , где знак «=» означает присваивание значения. Если начальное значение z предварительно приравнять к нулю, то после первого выполнения цикла значение z будет равно первому значению функции. Аналогично накапливается и произведение с той лишь разницей, что для его накопления используется формула z = zy , а начальное значение произведения должно быть равно единице. 5.3.1. Вычислить значение функции Схема алгоритма решения этой задачи представлена на рис.11. Блок 3, задающий начальное значение суммы, стоит перед циклом, в котором накапливается эта сумма. Блок 5 вычисляет значение слагаемого и накапливает сумму. Поскольку результат решения этой задачи одно число, блок печати стоит за циклом и выполняется один раз. 5.3.2.Вычислить произведение положительных элементов массива (x1, x2,…x100). Схема алгоритма решения задачи представлена на рис.12. Значения сомножителей вычислять не требуется, поскольку они уже имеются в массиве. Однако прежде чем накапливать произведение, надо проверить, является ли сомножитель положительным (блок 5). Блок 3 задает начальное значение произведения, равное единице. В одной из ветвей этого процесса стоит блок 6, осуществляющий накопление произведения. При невыполнении условия xi>0 никаких действий не предусматривается, а осуществляется переход к концу цикла. 20
5.3.3. Вычислить значения функции z = ∑ sin x / i + x , если x изменяется от i =1
0 с шагом h одновременно с i. 15
5.3.4. Вычислить значения функции z = ∏ (n + i ) / i . i =1
5.3.5. Вычислить сумму положительных элементов массива (x1,x2,…,x55). 5.3.6. Вычислить среднее арифметическое элементов массива (a1,a2,…,a60). 5.3.7. Вычислить среднее арифметическое отрицательных элементов массива (c1,c2,…c30), полагая, что в массиве есть отрицательные значения.
Начало x z =1
20 Начало
Начало
x, ε
a, n
y=1, z=1, n=1
y=a1
i=1..100 y=y⋅(x)2/2n(2n-1) нет
xi >0
i=2, n+1 y=y⋅x+ai
z=z+y да n=n+1
z=z⋅xi да
y
y >ε
z
нет
конец
z конец
конец
Рис.12
Рис.13
Рис.14
5.3.8. Вычислить среднее геометрическое положительных элементов массива ( x1 , x 2 ,..., x 60 ) , имеющих четные индексы. Если таких элементов нет, то вывести на печать признак 0. 5.3.9. Вычислить среднее геометрическое элементов массива ( y1 , y 2 ,..., y 25 ) , удовлетворяющих условию y i > a , считая, что в массиве есть элементы, для которых выполняется это условие. 5.3.10. Подсчитать количество элементов целочисленного массива ( x1 , x 2 ,..., x 60 ) , кратных трем. 5.3.11. Для целочисленного массива ( x1 , x 2 ,..., x 60 ) определить, является ли сумма его элементов четным числом, и вывести на печать ДА или НЕТ. 5.3.12. Подсчитать для массива ( x1 , x 2 ,..., x 60 ) количество элементов, ближайшим целым числом для которых является 1. 5.3.13. Вычислить сумму четных и сумму нечетных чисел натурального ряда от 1 до N. 5.3.14. Вычислить сумму элементов массива ( x1 , x 2 ,..., x 60 ) , стоящих на четных местах. 5.3.15. Вычислить сумму 20 первых элементов ряда S = 1+ x +
19 x2 x 19 xi + ... + = 1+ ∑ . 2 19 i =1 i
Для определения x i использовать прием накопления произведения, т. е. x i = x i −1 x .
21
5.3.16. Вычислить среднее арифметическое элементов S массива (a1 , a 2 ,..., a 80 ) , удовлетворяющих условию 1 ≤ a i ≤ 2 . Если таких элементов нет, то считать S = 0 . 5.3.17. Подсчитать количество положительных и количество отрицательных элементов массива ( x1 , x 2 ,..., x 60 ) . 5.3.18. Вычислить сумму элементов главной диагонали матрицы A(20 × 20) . 5.3.19. Вычислить значение функции z=n!. 5.3.20. Вычислить сумму членов ряда z = 1 +
10 x2 x4 x 20 x 2i + + ... + = 1+ ∑ . 2! 4! 20! i =1 ( 2i )!
Для вычисления значения члена ряда использовать рекуррентную формулу y n = y n −1 x 2 /[2n(2n − 1)] . 5.3.21. Вычислить сумму членов ряда z = 1− x +
x3 x5 x 2 n −1 x 21 − + ... + (−1) n + ... − . 3! 5! (2n − 1)! 21!
Для определения значения члена ряда использовать формулу − x2 . Начальное значение z=1-x, а y=-x. 2n(2n + 1) n−m n! m+i =∏ . 5.3.22. Вычислить значение функции c nm = m!(n − m)! i =1 i y n +1 = y n
5.3.23. Вычислить сумму элементов двух главных диагоналей матрицы А (10×10). Элементами i-й строки, лежащими на главных диагоналях, являются aij и ai,11-i. 5.3.24. Вычислить сумму положительных и сумму отрицательных значений функции z = cos(nx + a) sin(nx − a) , где n = 1,2,...,10. 5.3.25. Вычислить приближенное значение функции Бесселя 2k +n
x (−1) 100 2 J ( x) = ∑ k!(n + k )! k =0 k
n
2k +n
x x (−1) k 100 2 2 = +∑ . n! k!(n + k )! k =1
Для определения n! использовать отдельный цикл, а слагаемого – рекуррентную формулу y k = y k −1
− ( x / 2) 2 . В качестве начальных значений суммы и k (n + k )
слагаемого использовать член ряда при k = 0 , равный
( x / 2) n . n!
5.3.26. Вычислить размещение из n элементов по m, т. е. a nm = n(n − 1)(n − 2)...(n − (m − 1)) .
5.4. Вычисление суммы членов бесконечного ряда Задачи этого типа являются типичными задачами, использующими итерационный цикл, так как заранее не известно, при каком члене ряда будет достигнута требуемая точность. Выход из цикла организуется по условию дости-
22
жения требуемой точности. Для вычисления суммы членов ряда используется рассмотренный ранее прием накопления суммы. 5.4.1. Вычислить сумму членов ряда z = 1−
∞ x2 x4 x 2n x 2n + − ... + (−1) n + ... = 1 + ∑ (−1) n 2! 4! (2n)! (2n)! n =1
с точностью до члена ряда, меньшего ε. В целях уменьшения затрат времени на вычисление значения текущего члена ряда использовать рекуррентную формулу. Схема алгоритма решения этой задачи представлена на рис. 13. Блок 3 задает начальное значение y , равное 1, начальное значение суммы, равное члену ряда с номером 0, так как вычислять его нет надобности, и начальное значение параметра цикла. В цикле блок 4 вычисляет значение текущего члена ряда, блок 5 накапливает сумму, блок 6 изменяет параметр цикла. Блок 7 проверяет условие повторения цикла и осуществляет переход к началу цикла, если y>ε, или выход из него в противном случае. 5.4.2. Вычислить сумму членов ряда z = 1+ x +
x2 xn + ... + + ... 2! n!
с точностью до члена ряда, меньшего ε. 5.4.3. Вычислить сумму членов ряда z = 1+
mx m(m − 1) 2 m(m − 1)(m − 2) 3 x + + x + ... (m + 1)! (m + 2)! (m + 3)!
с точностью до члена ряда, меньшего ε. Для определения текущего значения члена ряда использовать рекуррентную формулу y n = y n −1 номер члена ряда. Начальное значение y принять равным
x(m − n + 1) , где n – n+m
1 . m!
5.4.4. Вычислить сумму членов ряда y=
1 2 n + + ... + + ... 2 ⋅3 3⋅ 4 (n + 1)(n + 2)
с точностью до члена ряда, меньшего 10-4. 5.4.5. Вычислить сумму членов ряда z = cos x +
cos 2 x cos 3x cos nx + + ... + + ... 4 9 n2
с точностью до члена ряда, меньшего ε. 5.4.6. Вычислить сумму членов ряда
x − 1 ( x − 1) 3 ( x − 1) 5 ( x − 1) 2 n +1 ... z = 2 + + + + + ... 3 5 2 n +1 5( x + 1) (2n + 1)( x + 1) x + 1 3( x + 1)
с точностью до члена ряда, меньшего 10-6. 5.4.7. Вычислить сумму членов ряда y=
cos 2 x cos 4 x cos 2nx + + ... + + ... 1⋅ 3 3⋅5 (2n − 1)(2n + 1)
с точностью до члена ряда, меньшего 10-4. 5.4.8. Вычислить сумму членов ряда
23
y = 1x n +
1 n −1 1 1 1 x + ... + x + + x −1 + ... 2 n n +1 n + 2
с точностью до члена ряда, меньшего 10-6. Для определения текущего члена ряда использовать рекуррентную формулу. 5.5. Вычисление полинома Для вычисления полинома n-й степени y = a1 x n + a 2 x n −1 + ... + a n x + a n+1 удобно использовать формулу Горнера y = (...((a1 x + a 2 ) x + a3 ) x + ... + a n ) x + a n +1 . Если выражение, стоящее внутри скобок, обозначить y i , то значение выражения в следующих скобках можно вычислить, используя рекуррентную формулу y i +1 = y i x + ai +1 . Значение полинома y получается после повторения этого процесса в цикле n раз. Начальное значение y1 целесообразно взять равным a1 , а цикл начинать с i=2. Если обозначить y простой переменной, то схема примет вид, показанный на рис.14. Все коэффициенты полинома и свободный член, как правило, сводятся в массив, состоящий из n+1 элементов (n порядок полинома). Если полином не содержит членов с некоторыми степенями x , то на соответствующем месте в массиве необходимо поместить коэффициент, равный 0. 5.5.1. Вычислить значение многочлена y = 2 x 8 − x 6 + 4 x 5 − 5 x 2 + 6 x + 1 , используя формулу Горнера. Коэффициенты полинома удобно представить массивом (2; 0; -1; 4; 0; 0; -5; 6; 1). Порядок полинома n равен 8. Схема алгоритма будет аналогична схеме алгоритма, представленной на рис.14. 5.5.2. Вычислить значение функции sin x = c1 x 9 + c 2 x 7 + c3 x 5 + c 4 x 3 + c5 x + x , используя формулу Горнера sin x = ((((c1 x 2 + c 2 ) x 2 + c3 ) x 2 + c 4 ) x 2 + c5 ) x + x , где c1 , c 2 ,..., c5 − элементы массива. 5.5.3. Вычислить значение многочлена, используя формулу Горнера. z = 2 x 12 − 4,5 x 10 + x 9 + 3x 7 − 0,5 x 4 − x 2 + 1 . 5.5.4. Вычислить значение полинома z = 1x 8 + 2 x 7 + 3 x 6 + 4 x 5 + 5 x 4 + 6 x 3 + 7 x 2 + 8 x + 9 . Так как коэффициенты полинома – числа натурального ряда, то сводить их в массив не имеет смысла. Вычисление их целесообразно производить в процессе решения. Тогда формула для вычисления текущего значения полинома будет иметь вид z n = z n−1 x + n . 5.5.5. Вычислить значение s = (1 + x) 8 , используя формулу Горнера 1 3 2 s = ... x + 1 x + 1 x + ... + 18 x + 1 . 7 6 8
Множитель, на который умножается любая скобка, можно представить как hi = ix /(m − i + 1) , где m = 8 . x2 x 12 5.5.6. Вычислить сумму членов ряда z = 1 + x + + ... + , используя фор2! 12! x x x x мулу Горнера z = ... + 1 + 1 + ... + 1 + ... + 1 x + 1 . n 12 11 10
24
5.6. Нахождение наибольшего и наименьшего значения Нахождение наибольшего и наименьшего значения функции y = f (x) выполняется в цикле, в котором вычисляется текущее значение функции, и сравнивается с наибольшим или наименьшим из всех предыдущих значений этой функции. Если текущее значение функции окажется больше наибольшего из предыдущих значений, то его надо считать новым наибольшим значением. В противном случае наибольшее значение остается прежним. Сказанное можно описать условной математической формулой y max
y , если y i > y max ; = i где i = 1,2,..., n . y max , если y i ≤ y max .
(1)
Аналогично для наименьшего значения y min
y , если y i < y min ; = i y min , если y i ≥ y min .
(2)
После первого выполнения цикла вычисляется y1 и сравнивается с начальным значением y max или y min . После сравнения y max или y min принимает значение y1 . Тогда после вычисления y 2 будет находить наибольшее или наименьшее из этих первых двух значений функции. Необходимо в качестве начального значения y max брать число порядка –1010, чтобы наверняка выполнилось условие y1 > y max , а в качестве начального значения y min − очень большое число, чтобы выполнилось условие y1 < y min . Следует отметить, что здесь речь идет не о максимуме или минимуме функции, а о наибольшем или наименьшем из вычисленных значений функции. Это объясняется тем, что ПЭВМ вычисляет дискретные значения функции, и истинный минимум или максимум может находиться между ними. 5.6.1. Найти наименьшее значение функции y = ae −bx sin(ωx + ϕ ) в интервале изменения аргумента x от 0 до с с шагом h. Схема алгоритма решения этой задачи представлена на рис.15. Блок 3 задает перед циклом начальное значение y min = 1019 . Блок 5 вычисляет текущее значение функции, а блоки 6 и 7 реализуют условную формулу (2). 5.6.2. Найти наибольший элемент массива ( x1 , x 2 ,..., x 40 ) и его порядковый номер. Здесь нет надобности вычислять сравниваемые значения, так как они уже имеются в массиве X . Поэтому в качестве начального значения x max берется первый элемент массива. Поскольку сравнивать первый элемент массива с собой не имеет смысла, цикл выполняется начиная со второго элемента. Схема алгоритма решения этой задачи представлена на рис.16. Блок 3 перед циклом задает начальное значение x max = x1 и N max = 1 . В цикле блоки 5 и 6 реализуют условную формулу (1), блок 7 определяет номер наибольшего элемента массива.
25 2
5.6.3. Найти экстремальное значение функции y =| a | e bx +cx при изменения аргумента x от 0 до 4 с шагом h. Функция такого вида имеет один экстремум. Если c > 0 , то следует искать минимум, если c < 0 , то максимум. Рассмотренный выше алгоритм нахождения наибольшего или наименьшего является универсальным, так как позволяет решить задачу даже в том случае, если функция не имеет экстремума или имеет несколько экстремумов. Если же функция имеет один экстремум, то затраты времени на решение такой задачи можно существенно сократить, используя другой алгоритм. Пусть функция имеет один максимум. Тогда вычисляя ее значения, лежащие до максимума, всегда будем получать новое значение функции, большее, чем наибольшее из всех предыдущих, т.е. всегда будет выполняться условие y i > y max . После максимума функция начинает убывать; поэтому, все последующие y i будут меньше наибольшего. Условие y i < y max можно использовать для выхода из цикла, так как среди последующих значений функции не может быть наибольшего. Этот процесс можно описать условной формулой y max
y i , если y i > y max ; = выход из цикла, если y i ≤ y max .
Аналогично для нахождения наименьшего значения y min
y i , если y i < y min ; = выход из цикла, если y i ≥ y min .
Рассматриваемая функция всегда положительна. В зависимости от знака величины с она имеет максимум или минимум. Поэтому алгоритм должен начинаться с проверки знака величины с. Схема алгоритма приведена на рис.17. Блок 3 проверяет знак величины с, и если он положительный, то N = 1 (функция имеет минимум), а если отрицательный, то N = −1 (функция имеет максимум). Блок 6 задает начальное значение y m (экстремум). Если N = 1 , то y m = 1019 ; если N = −1 , то y m = −1019 . Блок 9 в цикле проверяет условие Ny < Ny m . Если N = 1 , то условие аналогично условию y < y m (как и надо при нахождении минимума); если N = −1 , то условию y > y m (как и надо при нахождении максимума). Если условие Ny < Ny m выполняется, то y считается новым экстремальным значением функции. В противном случае осуществляется выход из цикла к блоку 11. Выход из цикла может осуществляться и естественным образом, когда цикл будет выполнен для всех значений аргумента x , и условие выхода из цикла ни разу не выполнится. Блок 11 выдает на печать значение N − признак экстремума и y m − экстремальное значение. Сокращение времени счета осуществляется за счет выхода из цикла, если условие Ny < Ny m не выполняется.
26
Начало
Начало
ymin=1019
xmax=x1,Nmax=1
x = 0..c,
i=2…40
y=a⋅e-bxsin(ωx+ϕ) нет
a, b, c, h
x
a, b, c, ϕ, ω, h
да ymin=y
c>0
нет
да
нет
N=1
xi > xmax да
y=ymin
Начало
N = -1
xmax = xi ym=N⋅1019 Nmax =i
Nmax,xmax ymin конец конец
x=0..4, h y=|a|ebx+cx2 Ny
нет
да ym=y N, ym конец
Рис.15
Рис.16
Рис.17
5.6.4. Найти номер (индекс) наименьшего элемента массива ( x1 , x2 ,..., x100 ). 5.6.5. Найти наибольшее значение ( xi + yi ) для массивов ( x1 , x2 ,..., x40 ) и ( y1 , y 2 ,..., y 40 ).
5.6.6. Найти наименьшее значение функции y = ax 3 + bx 2 + cx + d и значение аргумента, при котором оно получено. Значение аргумента x изменяется от 0 до 10 с шагом 0,1. 5.6.7. Найти экстремум функции y = ax 3 + bx 2 + cx + d , имеющий один максимум и один минимум при a > 0 и 3ac − b 2 < 0 , если x изменяется от –10 до 10 с шагом 0,2, и максимума функция достигает при меньших значениях аргумента. 5.6.8. Для условия задачи 5.6.7 найти значения аргумента, при которых функция имеет наибольшее и наименьшее значения. 5.6.9. Найти экстремум функции y = ae ax − be − cx , если x изменяется от x0 до xm с шагом h . Функция имеет один экстремум. Для определения того, является
27
этот экстремум максимумом или минимумом, можно использовать следующий способ. Вычислить два значения функции y1 и y 2 . Если y1 > y 2 , то функция имеет максимум, в противном случае – минимум. 5.6.10. Записать +1 вместо максимального элемента массива ( x1 , x2 ,..., x50 ) , а – 1 вместо минимального. 5.6.11. Найти и записать вместо x1 наибольший элемент, а вместо x2 − наименьший для массива ( x1 , x2 ,..., x100 ). 5.6.12. Для массива (a1 , a2 ,...a80 ) вычислить наибольшее и наименьшее значение модуля разности между соседними элементами. 5.6.13. Для функции y = ae −bx sin(ωx + ϕ ) найти первый максимум и первый минимум и значения аргумента, при которых они достигаются. Функция сначала достигает максимума. Величина x изменяется от 0 до 6 с шагом 0,1. 5.6.14. Найти наибольший элемент главной диагонали матрицы A (20 × 20) и вывести на печать всю строку, в которой он находится. 5.6.15. Найти наименьший из положительных элементов массива ( x1 , x2 ,..., x40 ) . 5.7. Уточнение корней уравнения Аналитическое решение для многих алгебраических и трансцендентных уравнений получить не удается. Для решения таких уравнений используют приближенные итерационные методы (методы последовательных приближений). Решение уравнений производится определением грубого значения корня (например, графическим путем) и последующим его уточнением. Уточнение значения корня уравнения рассматривается на примере метода итераций. Сущность метода заключается в том, что исходное уравнение представляется в виде x = f (x) . Если в интервале между приближенным значением корня x0 и корнем уравнения x выполняется условие | f ′( x) < 1 | , то метод дает возможность вычислить значение корня с заданной точностью. Если это условие не выполняется, то надо перейти к обратной функции. Новое значение корня вычисляется через предыдущее по формуле xi +1 = f ( xi ) . Повторяя этот процесс для x1, x2 , x3 ,..., можно найти значение корня с заданной точностью, определяемой с помощью отношения | xi − xi +1 |≤ ε . 5.7.1. Вычислить наименьший положительный корень уравнения x − tgx = 0 с точностью ε = 10 −5 . Преобразуем уравнение к виду x = tgx . Для этого уравнения | tg ′x |> 1 , поэтому перейдем к обратной функции x = arctgx , где arctgx = arctgx + kπ − неглавное значение функции. Будем считать все значения xi (приближенные значения корня) простыми переменными. Для решения задачи требуется два смежных значения корня. Обозначим x0 − предыдущее значение корня, а x1 − последующее значение корня. Начальное значение наименьшего положительного корня
28
x0 = 4,7. Для вычисления нового значения корня будем использовать формулу x1 = arctgx0 + π . Схема алгоритма решения этой задачи приведена на рис.18. Блок
2 задает начальное (грубое) значение корня. Блок 3 вычисляет новое значение корня. Блок 4 проверяет достижение заданной точности. Если точность достигнута, то осуществляется выход из цикла, в противном случае выполняется блок 5 и переход к началу цикла. Блок 5 присваивает предыдущему значению корня только что вычисленное значение. На печать выводятся два смежных значения корня, так как корень уравнения лежит между ними. Начало
Начало
Начало
a
x0=4,7
x
i =1…10
k =1..99
S=0
xmin= xk, n=k
j =1..8
j =k+1..100
xi=arctgx0+π |x1 – x0|≤10-5 да нет x0= x1
нет
нет
aij>0
xj < xmin
да s =s+aij
xmin= xj,n=j
x0, x1 конец
да
xn= xk, xk =xmin
s
конец
x конец
Рис.18
Рис.19
Рис.20
5.7.2. Вычислить приближенное значение корня уравнения x = ln( x + 2) с точностью ε = 10 −4 , используя метод итераций ( x0 = b). 5.7.3. вычислить значение функции y = 1 / x по итерационной формуле 3 1 yi − xyi3 , с точностью ε = −10 −5 , принять y0 = 2(2 − 2 ). 2 2 2 5.7.4. Определить корень уравнения x − e − ( ax ) / 2 = 0 , используя метод итераций, с точностью ε = 10 −5 ( x 0 = b). yi +1 =
x = x 2 + y 2 + 0,05;
5.7.5. Решить систему уравнений
2 2 y = x − y + 0,23.
точностью ε = 10 −4 . Принять x0 = 0, y0 = 0.
методом итераций с
29
6. АЛГОРИТМЫ СО СТРУКТУРОЙ ВЛОЖЕННЫХ ЦИКЛОВ Любой цикл, содержащий внутри себя один или несколько других циклов, называется вложенным. Цикл, охватывающий другие циклы, называется внешним, а остальные циклы – внутренними. Правила организации как для внешнего, так и внутреннего циклов такие же, как и для простого цикла. Параметры этих циклов изменяются не одновременно, т. е. при одном значении параметра внешнего цикла параметр цикла принимает по очереди все свои значения. 6.1. Вычислить сумму положительных элементов каждой строки матрицы A (10 × 8) . Для вычисления суммы положительных элементов одной строки матрицы необходимо организовать цикл с целью перебора всех элементов строки, поэтому параметром этого цикла следует выбрать номер столбца j . Перед циклом нужно задать начальное значение суммы S = 0 . После окончания цикла результат необходимо вывести на печать. Если действия повторить во внешнем цикле, изменяя индекс строки i , то будут вычислены все 10 сумм. Схема алгоритма решения этой задачи приведена на рис.19. В рассмотренной задаче внешний цикл обязательно должен быть по i (индексу строки), так как в противном случае были бы вычислены суммы положительных элементов каждого столбца. Часто встречаются задачи, в которых не имеет значения, по какому параметру организовать внешний и внутренний цикл. Все приемы программирования, изложенные выше, можно использовать и при организации вложенных циклов. 6.2. Упорядочить элементы массива ( x1 , x2 ,..., x100 ) , расположив их в порядке возрастания в том же массиве. Для решения этой задачи требуется найти наименьший элемент. Поэтому перед внутренним циклом необходимо задать начальное значение наименьшего, а внутри цикла искать наименьшее и его порядковый номер. После окончания цикла необходимо записать наименьший элемент в первую ячейку, а первый – в ячейку, где ранее был наименьший. Повторяя эти действия начиная со второго, затем третьего элемента и т. д., можно добиться того, что элементы массива будут упорядочены по возрастанию. Схема алгоритма решения задачи представлена на рис.20. Внешний цикл повторяется 99 раз, так как находить наименьший элемент из одного элемента x100 не имеет смысла. Блок 4 задает начальные значения xmin и номер n наименьшего элемента. Блоки 6,7 находят наименьший элемент и его порядковый номер. Блок 8 записывает k-й элемент в n-ю ячейку и наименьший элемент в kю ячейку. 10
sin k ( x i ) , где xi заданы массиk k =1 n
6.3. Вычислить значения функции z = ∑ ∑ i =1
вом ( x1 , x 2 ..., x10 ),
k = 1,2,.., n.
30 20
6.4. Вычислить значения функции z j = ∏ (1 + 1 /(e i + x j )) , где xi заданы масi =1
сивом ( x1 , x 2 ..., x 20 ). Результаты запомнить в массиве z . 6.5. Упорядочить элементы массива ( x1 , x2 ..., x50 ) , расположив их по убыванию в том же массиве. 6.6. Найти наибольшие элементы каждой строки матрицы
X (10×20)
и
записать их в массив Y . 6.7. Найти среднее арифметическое положительных элементов каждого столбца матрицы X (10×20) при условии, что в каждом столбце есть хотя бы один положительный элемент. 6.8. Вычислить суммы элементов каждой строки матрицы X (20×20), определить наименьшее значение этих сумм и номер соответствующей строки. 6.9. Из матрицы X (10×15) построить матрицу Y , поменяв местами строки и столбцы. 6.10. Вычислить наибольшие значения функции y i = 2e b x −5 x , если bi задано массивом (b1 , b2 ,..., b20 ) . Аргумент x изменяется от -2 до 2 с шагом 0,1. Все y max запомнить в массиве C . i
2
6.11. Определить количество положительных и отрицательных элементов матрицы X (20×20). 6.12. Определить количество положительных элементов каждого столбца матрицы
X (20×20) и запомнить их в массиве Y .
6.13. Найти наибольший элемент матрицы столбца, в которых он находится.
X (20×30)
6.14. Найти наименьший элемент матрицы ту строку и столбец, где он находится.
X (10×15) и записать нули в
20
10
i =1
k =1
и номер строки и
6.15. Вычислить значение функции z = ∑ ai ∏ (ai + b) / 2 , где ai заданы массивом (a1 , a 2 ,..., a 20 ) , b изменяется от 0 с шагом 0,1. 6.16. Перемножить матрицы A (n×m) и B (m×l). Элементы результиm
рующей матрицы вычислить с помощью выражения cik = ∑ aij b jk . j =1
6.17. Вычислить математическое ожидание m x = Dx =
1 100 ∑ xi и дисперсию 100 i =1
1 100 ( xi − m x ) 2 случайных величин, записанных в массивах ∑ 100 i =1
A, B
и
C
по
31
100 элементов каждый. В целях экономии памяти все исходные данные хранить в массиве A . 6.18. Переписать первые элементы каждой строки матрицы X (10×15), большие c , в массив B . Если в строке нет элемента, большего c , то записать ноль в массив
B
.
6.19. Вычислить значения полинома y i = ai1 x 9 + ai 2 x 8 + .. + ai 9 x + ai10 при различных значениях коэффициентов, используя формулу Горнера y i = (...((ai1 x + ai 2 ) x + ai 3 ) x + ... + ai 9 ) x + ai10 . Коэффициенты сведены в матрицу A (5×10). 6.20. Определить с точностью ε = 0,01 значение аргумента, при котором функция y = ax − ln x достигает минимума при x , изменяющемся от 0,2 до 10. Можно было бы решать эту задачу, взяв шаг изменения аргумента, равный 0,01. Однако это приведет к увеличению времени счета. Поэтому решение задачи разбивается на два этапа: 1)определение грубого значения минимума функции при большом шаге изменения аргумента, например 0,2; 2) повторение процесса в районе минимума при шаге изменения аргумента, равном 0,01. Таким образом, при первом нахождении минимума шаг изменения аргумента равен 0,2, а его начальное значение x0 = 0,2 . При повторном нахождении минимума шаг равен 0,01, а x0 = x min − 0,2 . Схема алгоритма решения задачи приведена на рис.21. Во внутреннем цикле осуществляется поиск наименьшего значения функции и значения аргумента, при котором оно достигается. Поскольку функция имеет один минимум, выход из цикла происходит при y ≥ y min . В качестве параметра цикла взята некоторая переменная i , которая выполняет роль счетчика количества повторений цикла. После окончания внутреннего цикла проверяется условие h = 0,01 . Если выполнение условия имеет место, то осуществляется выход из внешнего цикла. В противном случае задаются новое начальное значение переменной x , новый шаг h и внешний цикл повторяется еще один раз. 6.21. Найти значение аргумента x для функции y = ae bx +cx , имеющей один максимум, при котором достигается максимум с точностью ε = 0,005 . Аргумент изменяется от -2 до 2 с шагом 0,1. 2
32 Начало
6.22. Найти минимальные элементы ка-
a h=0,2; x=0,2; ymin=1019 i =1..51 y =ax-lnx
y < ymin ymin= y; xmin= x
нет
да
h = 0,01 нет x = xmin- 0,2 h =0,01
да
ждой строки матрицы X (10×10) и поместить их на главную диагональ, а диагональные элементы записать на место минимальных. 6.23. Найти максимум функции 2 2 y = ax + bx + cx + d при изменении аргумента x от -10 до +10 с шагом 0,1 и минимум с шагом 0,01. Функция y имеет один максимум и один минимум при a > 0 и 3ac − b 2 < 0 и достигает максимума при меньших значениях аргумента. 6.24. Найти и запомнить в массиве Z , начиная с первого максимума все максимумы и минимумы функции y = ae −bx sin(ωx + ϕ ) при изменении аргумента x от 0 до 5 с шагом 0,1. 6.25. Вычислить значения функции z = (ai + b j ) / c k , где ai , ci , bi заданы массивами из 10, 8 и 5 элементов соответственно.
xmin конец
Рис.21 Список литературы 1. Фаронов В. В. Турбо Паскаль (в 3-х книгах).- М.: Учебно-инженерный центр «МВТУ – ФЕСТО ДИДАКТИК», -1992.-304 с. 2. Алексеев В. Е., Ваулин А. С., Петров Г. Б. Вычислительная техника в инженерных и экономических расчетах. Сборник задач и упражнений: Учеб.пособие для вузов./Под ред. А. В. Петрова. – М.: Высш.шк., 1984.-136 с., ил. 3. Пильщиков В. Н. Сборник упражнений по языку Паскаль: Учеб. Пособие для вузов.-М.: Высш. Шк., 1990.-223 с.