ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ ИНДУСТРИАЛЬНЫЙ УНИВЕРСИТЕТ
Д.Ю. Куприянов
Информатика Методические указания по выполнению курсовой работы для студентов инженерных специальностей
МГИУ Москва 2008
ББК 32.97 УДК 681.3 К92 Рецензент: И.М. Белова, кандидат физико-математических наук, доцент Московского государственного индустриального университета
К92
Куприянов Д.Ю. Информатика: методические указания по выполнению курсо вой работы для студентов инженерных специальностей. — М.: МГИУ, 2008. — 40 c. Методические указания содержат изложение ряда теоретических понятий учебного курса «Информатика», введение в численные мето ды, примеры типовых вариантов курсовой работы, подробный разбор одного из вариантов с примерами и описанием исходных кодов про грамм на объектно-ориентированном языке Ruby, а также требования и рекомендации по оформлению курсовой работы.
ББК 32.97 УДК 681.3
Редактор Подписано в печать 05.02.08 Формат бумаги 60x84/16 Усл.печ.л. 2,5 Уч.-изд.л. 2,75 Тираж 900
К.В. Шмат
Бум. офсетная Изд. № 1-07/08 Заказ № 76
РИЦ МГИУ, 115280, Москва, Автозаводская, 16 www.izdat.msiu.ru
[email protected] тел. 677-23-15 © Д.Ю. Куприянов, 2008 © МГИУ, 2008
Оглавление . . . . . . . . . . . . . . . . . . . . . . . . .
5
2. Примеры типовых вариантов курсовой работы . . . . . . . .
20
3. Решение задач типового варианта курсовой работы . . . . .
24
4. Оформление курсовой работы . . . . . . . . . . . . . . . . . .
38
. . . . . . . . . . . . .
40
1. Численные методы
Список литературы и интернет-ресурсов
Введение Курсовая работа для студентов инженерных специальностей является завершающим этапом изучения дисциплины «Информатика». Она вклю чает в себя выполнение студентами ряда тематических заданий по про граммированию, а также оформление курсовой работы в виде электрон ного документа. Для выполнения курсовой работы студентам требуются знания основ программирования, базовых элементов, конструкций и неко торых библиотек объектно-ориентированного языка Ruby, представление о численных методах, а также навыки работы c прикладным программным обеспечением. Исходный программный код для каждого задания курсовой работы создается на языке Ruby, а оформление документа, описывающего результаты курсовой работы, выполняется в одном из текстовых процессоров. Элек тронный документ должен содержать титульный лист и описание решения каждого задания, в которое необходимо включить постановку задания, объ яснение алгоритма решения, исходный код программы, а также несколько примеров с результатами выполнения программы и снимками окна, в ко тором выполнялась программа. Особенностью выполнения данной курсовой работы является тот факт, что учебный процесс по дисциплине «Информатика» построен на осно ве свободного программного обеспечения, работающего под операцион ной системой Linux. Поэтому в качестве базовых прикладных программ для выполнения курсовой работы рекомендуется использовать свободно распространяемые пакет офисных приложений OpenOffice и систему ком пьютерной алгебры Maxima, которые, так же, как и интерпретатор языка Ruby, могут работать под управлением как ОС Linux, так и OC Microsoft Windows. Таким образом, у студентов имеется возможность выполнять кур совую работу не только в компьютерных классах МГИУ, но и на домашних компьютерах.
1. Численные методы В данном разделе описываются методы численного интегрирования и численного решения уравнений, необходимые для успешного написания курсовой работы.
Численное интегрирование. Численное интегрирование — это про цесс вычисления приближённого значения определённого интеграла, кото рое основано на том, что величина интеграла численно равна площади криволинейной трапеции, ограниченной графиком интегрируемой функции f(x), осью абсцисс, а также отрезками прямых x = a и x = b (рис. 1), где a и b — пределы интегрирования Zb I=
f(x)dx = S.
(1.1)
a
Рис. 1. Значение интеграла как площадь криволинейной трапеции
Необходимость применения численного интегрирования чаще всего мо жет быть вызвана отсутствием у первообразной функции представления в элементарных функциях и, следовательно, невозможностью аналитическо го вычисления значения определённого интеграла по формуле Ньютона Лейбница. Также возможна ситуация, когда вид первообразной настолько сложен, что быстрее вычислить значение интеграла численным методом.
6
Численные методы
Основная идея большинства методов численного интегрирования со стоит в локальной замене подынтегральной функции на более простую, интеграл от которой легко вычисляется аналитически. При этом отрезок, на котором проводится интегрирование, разбивается на определённое коли чество отрезков, подынтегральная функция на каждом отрезке заменяется более простой функцией, а искомая площадь криволинейной трапеции вы числяется как сумма площадей более простых фигур, значения которых могут быть получены аналитически.
Метод прямоугольников Метод прямоугольников — это метод численного интегрирования, ко торый получается при замене подынтегральной функции на кусочно-посто янную. Получим основные соотношения для вычисления значения опреде лённого интеграла. Для этого разобъем отрезок [a, b] на n равных частей и вычислим длину каждого из отрезков разбиения ∆ = (b − a) /n. На каж дом из получившихся отрезков заменим заданную функцию константой. В качестве константы можно взять значение функции f(x) в любой точке от резка [xi , xi+1 ]. Однако наиболее часто используются значения функции на концах отрезка или в его середине. Соответствующие модификации но сят названия метода левых прямоугольников, правых прямоугольников и средних прямоугольников (рис. 2–4).
Рис. 2. Численное интегрирование методом левых прямоугольников
Численные методы
Рис. 3. Численное интегрирование методом правых прямоугольников
Рис. 4. Численное интегрирование методом средних прямоугольников
7
8
Численные методы
Из геометрического посторения видно, что значение определённого ин теграла функции f(x) на отрезке [a, b] можно считать примерно равным сумме площадей (с учетом знака функции) получившихся прямоугольни ков n X S≈ Si , (1.2) i=1
где Si — площадь i-ого прямоугольника. Используя стандартные соотношения для нахождения площади прямо угольника, получим выражения для приближённого вычисления значения определённого интеграла методом прямоугольников: для метода левых прямоугольников I≈
n−1 X
f(xi)∆ = ∆
i=0
n−1 X
n−1
f(xi) =
b−aX f(xi); n
(1.3)
i=0
i=0
для метода правых прямоугольников
I≈
n−1 X i=0
n−1
f(xi+1)∆ =
b−aX f(xi+1); n
(1.4)
i=0
для метода средних прямоугольников
I≈
n−1 n−1 X xi + xi+1 b−aX xi + xi+1 f f ∆= . 2 n 2 i=0
(1.5)
i=0
Необходимо отметить, что точность полученного значения определён ного интеграла напрямую зависит от количества отрезков, на которые раз бивается исходный отрезок [a, b]. Поэтому для получения более точного значения интеграла необходимо увеличить число n.
Метод трапеций Метод трапеций аналогичен методу прямоугольников и получается при замене подынтегральной функции кусочно-линейной. Основное отличие этого метода заключается в том, что на каждом отрезке разбиения за данная функция заменяется линейной функцией, принимающей на концах отрезка те же значения, что и функция f(x). Получившиеся фигуры являют ся трапециями, и их площадь вычисляется как полусумма длин оснований трапеции, умноженная на её высоту.
Численные методы
9
Рис. 5. Численное интегрирование методом трапеций
Из геометрических соображений легко получить, что значение опреде лённого интеграла функции f(x) на отрезке [a, b], вычисленного с помощью метода трапеций, с учетом погрешности метода будет приблизительно рав но n−1 n−1 X f(xi) + f(xi+1) b − a X f(xi) + f(xi+1) I≈ ∆= . (1.6) 2 n 2 i=0
i=0
Метод Монте-Карло Метод Монте-Карло часто применяется для вычисления простых и кратных интегралов. Предположим, что необходимо взять интеграл от некоторой функции f(x). Воспользуемся геометрическим свойством опре делённого интеграла, значение которого численно равно площади под гра фиком функции. Для определения этой площади можно использовать сле дующий стохастический алгоритм (рис. 6): ограничим сверху функцию f(x) прямой y = h, такой что h ≥ f(x) для любого x ∈ [a, b] ; используя стандартную формулу, вычислим площадь ограничива ющего прямоугольника Sпр = (b − a)h; случайным образом внутрь полученного прямоугольника «выбро сим» некоторое количество точек (N штук);
10
Численные методы определим число точек (K штук), которые попадут внутрь фигу ры, ограниченной графиком функции, осью x, а также прямыми x = a и x = b; вычислим площадь под графиком заданной функции
S≈
K K Sпр = (b − a)h. N N
(1.7)
Рис. 6. Численное интегрирование методом Монте-Карло
Смысл выражения (1.7) заключается в том, что при достаточно боль шом числе испытаний отношение числа точек, попавших под график функ ции, к общему числу точек стремится к отношению площадей ограничива ющего прямоугольника и криволинейной трапеции. Это означает, что при n → ∞ искомая площадь K S −→ Sпр . (1.8) N Поэтому для увеличения точности вычислений значения интеграла, произ водимых данным методом, необходимо: максимально приблизить размеры ограничивающего прямоуголь ника к области, заданной графиком функции; увеличить размер выборки (количества «выбрасываемых» точек).
Численные методы
11
Конечно, при достаточно малом количестве «выброшенных» точек точ ность метода Монте-Карло гораздо ниже точности, получаемой при ис пользовании методов прямоугольников и трапеций. Тем не менее, в некото рых случаях, когда интегрируемая функция задана неявно или же область интегрирования задана в виде сложных неравенств, стохастический метод может оказаться наиболее предпочтительным.
Численное решение нелинейных уравнений. Нелинейными уравнениями называют уравнения, содержащие алгебраические функции: целые, рациональные, иррациональные (алгебраические уравнения), а также тригонометрические, показательные, логарифмические и другие функ ции (трансцендентные уравнения). Методы решения нелинейных урав нений делятся на две группы: точные методы; итерационные методы. Точные методы позволяют записать корни уравнения в виде неко торого конечного соотношения (формулы). Из школьного курса алгебры такие методы известны для решения некоторых тригонометрических, лога рифмических, показательных, а также простейших алгебраических уравне ний. Однако многие уравнения не имеют аналитических решений. В первую очередь это относится к большинству трансцендентных уравнений и произ вольным алгебраическим уравнениям степени выше четвертой. Кроме того, в некоторых случаях уравнение может содержать коэффициенты, извест ные лишь приблизительно, и, следовательно, сама задача о точном опре делении корней уравнения теряет смысл. Для их решения используются итерационные методы. Решить уравнение f(x) = 0 (1.9) итерационным методом — значит установить, имеет ли оно корни, опреде лить количество корней и найти значения корней с заданной точностью. Поэтому задача нахождения корней уравнения итерационным методом со стоит из двух этапов: отделение корней — нахождение отрезков, содержащих только один корень уравнения, и, если это необходимо, выбор началь ного приближения (первого приближённого значения корня) для каждого из этих отрезков; уточнение приближённых значений корней до заданной сте пени точности. Процесс отделения корней начинается с установления знаков функции f(x) в граничных точках области ее существования x = a и x = b. Прибли
12
Численные методы
жённые значения корней (начальные приближения) могут быть известны из физического смысла задачи, из решения аналогичной задачи при других исходных данных или могут быть найдены графическим способом. В инженерной практике наиболее распространен графический способ определения приближённого значения корней. Принимая во внимание, что действительные корни уравнения — это точки пересечения графика функ ции f(x) с осью абсцисс, достаточно построить график этой функции и отметить точки её пересечения с осью Ох или отметить на оси Ох отрез ки, содержащие по одному корню. Определять приближённые значения корней уравнения графическим способом удобно с помощью систем компьютерной алгебры или графо построителей. Воспользовавшись соответствующей фунцией построения графиков, можно определить общий вид функции, а также путём последо вательных приближений (выбирая разные отрезки для построения) найти нужный отрезок, содержащий корень уравнения и удовлетворяющий усло виям постановки задачи. Итерационный процесс получения приближённого значения корня урав нения заданной точности состоит в последовательном уточнении начально го приближения х0 или же уменьшения содержащего его отрезка. Каж дый такой шаг называется итерацией. В результате выполнения итераци онного процесса получается последовательность приближённых значений корня х1 , х2 ,. . . , хn . Если эти значения с увеличением числа итераций n приближаются к истинному значению корня, то говорят, что итерационный процесс сходится.
Метод деления отрезка пополам (дихотомии) Самым простым среди методов уточнения корней является метод деле ния отрезка пополам (метод дихотомии). Использование этого метода для решения уравнения (1.9) возможно лишь в том случае, когда функция f(x) удовлетворяет следующим условиям: функция f(x) непрерывна на отрезке [a, b] ; значения функции f(x) на концах отрезка имеют разные знаки (f(a) · f(b) < 0); отрезок [a, b] содержит только один корень уравнения. Метод дихотомии заключается в последовательном уменьшении отрез ка, содержащего корень уравнения, путем его деления пополам. Пусть точ ка c является серединой отрезка [a, b] , тогда ее значение можно вычислить по формуле a+b c= . (1.10) 2
Численные методы
13
В общем случае точка с может совпасть с корнем рассматриваемого уравнения (при этом значение функции f(x) в точке c равно нулю), или же корень уравнения будет принадлежать одному из отрезков [a, c] или [c, b] . Сделать выбор отрезка можно, рассмотрев знаки функции f(x) на концах каждого из них. Нетрудно показать, что корень уравнения принадлежит то му отрезку, на котором функция меняет знак (пересекает ось Ox). Поэтому выбор отрезка определим следующим образом. Если f(a) · f(c) < 0, то выбирается отрезок [a, c] . В противном случае выбира ется отрезок [c, b] . Далее итерационный процесс продолжается путем деления нового от резка, после чего одна из его половин выбирается на основе описанных выше условий (рис. 7). Таким образом, получается система отрезков, схо дящихся к одной точке — точному значению корня уравнения. Завершить итерационный процесс следует тогда, когда расстояние между граничными точками нового отрезка a и b станет меньше заданной точности ε: (b − a) < ε.
(1.11)
При этом последнее значение точки c можно считать приближённым зна чением корня уравнения, найденным с погрешностью ε.
Рис. 7. Численное решение уравнения методом дихотомии
14
Численные методы
Метод хорд Метод хорд — итерационный процесс, в котором строится система последовательных приближений (точек, стремящихся к корню исходного уравнения), которые получаются при пересечении строящихся хорд с осью абсцисс. Каждая новая хорда проходит через значение функции на одном из концов отрезка [a, b] (зависит от вида функции) и значение функции в точке предыдущего приближения (рис. 8). Итак, пусть для функции f(x) из уравнения (1.9) выполняются следую щие условия: функция f(x) непрерывна на отрезке [a, b] ; значения функции f(x) на концах отрезка имеют разные знаки (f(a) · f(b) < 0); отрезок [a, b] содержит только один корень уравнения. В методе хорд, так же, как и в методе дихотомии, используется ме ханизм деления отрезка. Но если в методе дихотомии разбиение отрезка производится на две равные части, то в методе хорд используется деление, пропорциональное значениям функции, которые она принимает на своих концах. Обозначим через x1 , x2 , . . . , xn точки разбиения отрезка, через ко торые проходят строящиеся хорды. Назовем эти точки последовательными приближениями корня уравнения и получим соотношения для вычисления их значений. Для этого напишем уравнение хорды x−a y − f(a) = . f(b) − f(a) b−a
(1.12)
В точке пересечения хорды с осью абсцисс x = x1 , а y = 0. Подста вим эти значение в уравнение (1.12) и получим новое соотношение для вычисления значения x1 : x1 = a −
f(a) (b − a). f(b) − f(a)
(1.13)
Заметим, что здесь, так же, как и в методе дихотомии, возможны две ситуации, когда искомый корень уравнения принадлежит отрезку [a, x1 ] или [x1 , b] . Поэтому выбор отрезка определим таким же образом. Если f(a) · f(x1) < 0, то выбирается отрезок [a, x1 ] . В противном случае выби рается отрезок [x1 , b] . Далее итерационный процесс продолжается путем деления нового от резка [a, b] , после чего одна из его частей выбирается на основе описанных выше условий (рис. 8). Значение нового приближения корня после изме
Численные методы
15
Рис. 8. Численное решение уравнения методом хорд
нения границ отрезка вычисляется аналогично: xi = a −
f(a) (b − a). f(b) − f(a)
(1.14)
Таким образом, получается последовательность приближений x1 , x2 , . . . , xn , сходящихся к искомой точке — точному значению корня уравнения. Для функции общего вида написание критерия завершения итераци онного процесса является достаточно сложной и неоднозначной задачей, поэтому в дальнейшем будем считать, что для рассматриваемых функций достаточным условием, определяющим близость приближения к точному значению корня уравнения, будет условие |xi+1 − xi | < ε,
(1.15)
где ε — заданная погрешность вычислений. При этом полученная в результате вычислений последняя точка xn на зывается приближённым значением корня уравнения, найденным с погреш ностью ε. Далее, на рисунке 9, приведены примеры того, как изменяются границы отрезка [a, b] в случаях, когда первая и вторая производные функ ции f(x) на всём отрезке сохраняют постоянный знак.
16
Численные методы
Рис. 9. Изменение границ отрезка в методе хорд в случаях, когда первая и
вторая производные функции на всём отрезке сохраняют постоянный знак
Метод касательных (Ньютона) Метод касательных — итерационный процесс, в котором строится си стема последовательных приближений, получающихся при пересечении но вой касательной с осью абсцисс. Каждая новая касательная к функции строится в точке предыдущего приближения (рис. 10). В отличие от методов дихотомии и хорд, в методе Ньютона к функции f(x) предъявляются более строгие требования, а именно: функция f(x) должна быть непрерывна на отрезке [a, b] вместе со своими производными 1-го и 2-го порядка; значения функции f(x) на концах отрезка должны иметь разные знаки (f(a) · f(b) < 0); первая и вторая производные функции f 0 (x) и f 00 (x) должны со хранять постоянный знак на всём отрезке. Первые два условия гарантируют, что на отрезке [a, b] найдётся хотя бы один корень уравнения, а из монотонности первой производной в третьем условии следует, что функция f(x) на данном отрезке будет иметь един ственный корень. Замечание. Так как построение касательных требует только одной точ ки, то в этом методе не требуется целиком задавать отрезок, содержащий корень уравнения (1.9), а достаточно найти лишь некоторое начальное при ближение корня x = х0 .
Численные методы
17
Рис. 10. Численное решение уравнения методом касательных
Выбор начального приближения x0 зависит от вида функции f(x). На рисунке 11 представлены четыре возможных ситуации. В первых двух слу чаях (a и б) в качестве начального приближения x0 выбирается точка а, и последовательные приближения: x0 = a, x1 , x2 , . . . , xn образуют ограни ченную монотонно возрастающую последовательность, причем x0 < x1 < . . . < xi < xi+1 < . . . < x ∗ < b.
(1.16)
В остальных случаях (в и г) в качестве x0 выбирается точка b, и после довательные приближения: x0 = b, x1 , x2 , . . . , xn образуют ограниченную монотонно убывающую последовательность, причем a < x ∗ < . . . < xi+1 < xi < . . . < x1 < x0 .
(1.17)
Легко заметить, что выбор одного из описанных случаев зависит от знаков первой и второй производных функции f(x). Составим таблицу их значений для каждого случая. f 0 (x) f 00 (x)
а + −
б − +
в + +
г − −
Из таблицы видно, что в первом случае знаки производных отличны друг от друга, а в во втором случае — одинаковы. Таким образом, если f 0 (x) · f 00 (x) < 0, то в качестве x0 выбирается точка a, иначе — точка b.
18
Численные методы
а)
б)
в)
г)
Рис. 11. Выбор начального приближения в методе касательных
Получим соотношения для последовательного вычисления приближён ных значений корня уравнения x1 , x2 , . . . , xn . Для этого напишем уравнение касательной, проведенной к кривой y = f(x) через точку с координатами х0 и f(х0): y − f(x0) = f 0 (x0) (x − x0). (1.18) В точке пересечения касательной с осью абсцисс x = x1 , а y = 0. Подставим эти значения в уравнение (1.18) и получим новое соотношение для вычисления значения первого приближения x1 : x1 = x0 −
f(x0) . f 0 (x0)
(1.19)
Аналогично могут быть получены соотношения для последующих при ближений, которые получаются в результате пересечения с осью абсцисс касательных, проведенных в точках (x1 , f(x1)), (x2 , f(x2)) и т.д. Формула для i + 1 приближения имеет вид: xi+1 = xi −
f(xi) . f 0 (xi)
(1.20)
Численные методы
19
Здесь, так же, как и в методе хорд, будем рассматривать только такие функции, для которых итерационный процесс необходимо выполнять до тех пор, пока не будет обнаружено, что |xi+1 − xi | < ε,
(1.21)
где ε — заданная погрешность вычислений. При этом полученная в резуль тате вычислений последняя точка xn называется приближённым значением корня уравнения, найденным с погрешностью ε. Далее на рисунке 12 представлен пример функции f(x), для которой не выполняется требование, накладываемое на её производные. Как видно из примера, в таком случае метод Ньютона может привести к некорректно му решению, например, очередное приближение может выйти за пределы отрезка [a, b] , где функция может быть не определена или иметь особен ности.
Рис. 12. Пример выполнения метода Ньютона для функции, меняющей зна
ки своих производных на заданном отрезке
2. Примеры типовых вариантов курсовой работы Вариант 1 Задание 1. Найдите площадь треугольника, используя формулу Герона. Длины сторон треугольника должны вводиться с клавиатуры. Задание 2. Найдите количество чисел, кратных числу 17, в диапазоне от 1 до 1000 и выведите эти числа на экран. Задание 3. Напишите программу, которая находит номер первого и по следнего максимального числа в массиве, элементы которого являются целыми числами и вводятся с клавиатуры (количество элементов массива равно 10). Задание 4. Напишите программу, позволяющую ввести с клавиатуры стро ку и найти количество слов в строке, начинающихся на букву «а». Задание 5. Напишите программу, которая находит и распечатывает фами лии всех сотрудников, чей номер телефона заканчивается на цифру «7», из файла следующего вида:
Èâàíîâ Èâàí Ôåäîðîâè÷: 111-33-54 Ñåìåíîâ Ïåòð Ñåðãååâè÷: 123-66-87 è ò.ä. Задание 6. Используя метод Монте-Карло, вычислите значение опреде √ лённого интеграла функции f(x) = x 2 sin x на отрезке [0, π] . Ответ округ лите до 3 знаков после запятой. Задание 7. Вычислите значение определённого интеграла функции f(x) = arctg cos x на отрезке [0, π /2] методом левых прямоугольников с точностью 3 знака после запятой. Задание 8. Используя метод дихотомии, найдите наименьший положитель ный корень уравнения 5 ln x = 3 − x с точностью 4 знака после запятой.
Примеры типовых вариантов курсовой работы
21
Вариант 2 Задание 1. Напишите программу, которая по ввёденному c клавиатуры радиусу вычисляет объем шара. Задание 2. Напишите программу, которая находит сумму всех чётных чи сел в диапазоне от 1 до 1000. Задание 3. Заполните массив 20 случайными числами в диапазоне от 1 до 50. Распечатайте элементы получившегося массива и найдите про изведение его элементов, кратных 5. Задание 4. Напишите программу, позволяющую ввести с клавиатуры стро ку и найти количество слов в строке, таких, что длина этих слов больше трех символов и они являются палиндромами. Палиндромом называется слово, которое одинаково читается как справа налево, так и слева напра во, например, «шалаш» или «кабак». Задание 5. Напишите программу, которая считывает матрицу, находящу юся в файле, и находит сумму элементов, стоящих на побочной диагонали.
1 6 11 16 21
2 7 12 17 22
3 8 13 18 23
4 9 14 19 24
5 10 15 20 25
Задание 6. Используя метод Монте-Карло, вычислите значение опреде лённого интеграла функции f(x) = e x cos x на отрезке [0, 1] . Ответ округ лите до 2 знаков после запятой. Задание 7. Используя метод правых прямоугольников, вычислите пло √ щадь фигуры, ограниченной графиком функции f(x) = x/ 5 − 4x, осью Ox, прямыми x = −1 и x = 0, с точностью 5 знаков после запятой. Задание 8. Используя метод касательных, найдите наибольший отрица тельный корень уравнения 2 ln (2 − x) = −1/x с точностью 4 знака после запятой.
22
Примеры типовых вариантов курсовой работы Вариант 3
Задание 1. Напишите программу, которая из трех введённых c клавиатуры чисел находит максимум. Задание 2. Найдите количество чисел из диапазона от 1 до 2000, квадрат которых кратен 7. Выведите эти числа на экран. Задание 3. Заполните массив, состоящий из 100 элементов, случайными числами в диапазоне от -50 до 50. Распечатайте элементы получившегося массива и найдите сумму его элементов, не кратных числу 3. Задание 4. Напишите программу, позволяющую ввести с клавиатуры стро ку и найти количество букв «а» в этой строке. Задание 5. Напишите программу, подсчитывающую, сколько раз в произ вольном файле встретилась буква «а». Задание 6. Используя метод Монте-Карло, вычислите площадь фигуры, ограниченной графиком функции f(x) = (1 − x 2) cos x, осью Ox, прямыми x = −1 и x = 1. Ответ округлите до 4 знаков после запятой. Задание 7. Вычислите значение определённого интеграла функции f(x) = 4x /x на отрезке [0.5, 2] методом средних прямоугольников с точ ностью 4 знака после запятой. Задание 8. Используя метод секущих, найдите наименьший положитель ный корень уравнения e −x + x 2 = 2 с точностью 3 знака после запятой.
Примеры типовых вариантов курсовой работы
23
Вариант 4 Задание 1. Напишите программу, которая позволяет ввести c клавиатуры коэффициенты квадратного уравнения a, b и c, а затем решает это урав нение. Задание 2. Напишите программу, которая позволяет ввести с клавиатуры целое число n и находит факториал этого числа (n! = 1 · 2 · . . . · n). Задание 3. Напишите программу, которая заполняет массив факториала ми целых чисел от 1 до 10. [1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800]. Задание 4. Напишите программу, которая находит количество чётных цифр в числе, введенном с клавиатуры. Ïðèìåð: 76152765165 => 4 Задание 5. Напишите программу, которая считывает матрицу, находящу юся в файле, а также находит среди элементов матрицы минимальное и максимальное числа.
1 6 11 16 21
2 7 12 17 22
3 8 13 18 23
4 9 14 19 24
5 10 15 20 25
Задание 6. Используя метод Монте-Карло, вычислите площадь фигуры, ограниченной графиком функции f(x) = ((x + 1) sin x) 2 , осью Ox, прямыми x = 0 и x = π. Ответ округлите до 4 знаков после запятой. Задание 7. Используя метод трапеций, вычислите площадь фигуры, огра ниченной графиком функции f(x) = arctg cos x, осью Ox, прямыми x = 0 и x = π /2, с точностью 2 знака после запятой. Задание 8. C точностью 4 знака после запятой найдите площадь√фигуры, ограниченной графиками функций f(x) = 0.2(x + 1) 3 и f(x) = 2 x − 0.3, осью Ox, прямыми x = x1 и x = x2 , где √ x1 и x2 — наименьшие положи тельные корни уравнения 0.2(x + 1) 3 = 2 x − 0.3. Напечатайте значения указанных корней.
3. Решение задач типового варианта курсовой работы Вариант 1 Задание 1. Найдите площадь треугольника, используя формулу Герона. Длины сторон треугольника должны вводиться с клавиатуры. Решение Алгоритм решения задачи заключается в том, чтобы позволить пользо вателю ввести с клавиатуры размеры трех сторон треугольника a, b и c, после чего вычислить площадь треугольника, используя формулу Герона S=
p
p(p − a) (p − b) (p − c), где p =
a+b+c . 2
(3.1)
Замечание. Длины сторон треугольника не могут принимать отрица тельные значения и, согласно «неравенству треугольника», должны быть связаны следующими неравенствами: a <= b + c b <= a + c c <= a + b.
(3.2)
В случае выполнения равенства в одном из условий треугольник называ ется вырожденным. Поэтому, перед тем как применять формулу Герона, необходимо проверить, существует ли такой треугольник. В противном слу чае необходимо вывести сообщение об ошибке и прервать вычисления.
1 2 3 4 5 6 7 8 9 10 11 12 13
Исходный код программы задания 1 print "Ââåäèòå ðàçìåð ïåðâîé ñòîðîíû òðåóãîëüíèêà a = " a = gets.to_f print "Ââåäèòå ðàçìåð âòîðîé ñòîðîíû òðåóãîëüíèêà b = " b = gets.to_f print "Ââåäèòå ðàçìåð òðåòüåé ñòîðîíû òðåóãîëüíèêà c = " c = gets.to_f if a<0 or b<0 or c<0 or a>(b+c) or b>(a+c) or c>(a+b) puts "Çàäàííûé òðåóãîëüíèê íå ñóùåñòâóåò" else p = (a+b+c)/2 s = Math.sqrt(p*(p-a)*(p-b)*(p-c)) puts "Ïëîùàäü çàäàííîãî òðåóãîëüíèêà ðàâíà S=#{s}" end
Решение задач типового варианта курсовой работы
25
Описание программы В результате выполнения первой команды программы в терминале по явится текст приглашения для ввода стороны a, причем, в отличие от ко манды puts, при использовании комманды print курсор останется на той же строке. Во второй строке программы переменной a присваивается дли на первой стороны a, которая будет введена с клавиатуры (функция gets) и преобразована из строки в действительное число (функция to_f). Ана логично записывается код для ввода длин сторон b и c (строки 3–4 и 5–6 соответственно). После того как значения длин сторон треугольника будут введены с клавиатуры, в строке 7 выполняется проверка каждого из условий a < 0, b < 0, c < 0, a > (b + c), b > (a + c) и c > (a + b). В слу чае, если хотя бы одно условие выполняется (принимает истинное значе ние), в терминал печатается сообщение о том, что заданный треугольник не существует (строка 8). В противном случае производится раcчет площади треугольника и вы вод результатов на печать. В стороке 10 переменной p, характеризующей полупериметр треугольника, присваивается значение, вычисляемое как по лусумма длин сторон треугольника, а затем по формуле Герона вычисля ется значение переменной s (строка 11), характеризующей площадь тре угольника. Здесь функция Math.sqrt обозначает взятие квадратного корня от выражения p(p − a) (p − b) (p − c). После расчетов в терминал будет вы ведена строка, включающая вычисленное значение площади треугольника (строка 12). Замечание. Необходимо отметить, что для каждого задания может су ществовать несколько способов решения. В данном пособии не ставится задача описать все возможные способы решения, поэтому в дальнейшем будем приводить лишь один из возможных вариантов. Задание 2. Найдите количество чисел, кратных числу 17, в диапазоне от 1 до 1000 и выведите эти числа на экран. Решение Рассмотрим следующий алгоритм решения. Сначала заведем в програм ме счетчик чисел, кратных 17. Затем последовательно переберем все целые числа из промежутка от 1 до 1000 и проверим каждое из них на кратность числу 17. Для этого воспользуемся определением кратности, а именно, бу дем искать числа, которые делятся на число 17 нацело. Заметим, что одно число делится на другое нацело, если остаток от деления первого числа на второе равен нулю. В случае, если число кратно 17, выведем его на экран и увеличим значение счетчика на 1.
26
Решение задач типового варианта курсовой работы Исходный код программы задания 2
1 2 3 4 5 6 7 8
counter = 0 for i in 1..1000 if i%17 == 0 counter += 1 puts i end end puts "Èòîãî íàéäåíî ÷èñåë: #{counter}"
Описание программы В первой строке программы заводится переменная counter (счетчик), и ее значение инициализируется нулем. После этого выполняется цикл по всем элементам списка 1..1000 (строка 2), и для каждого элемента этого списка проводится проверка на кратность числу 17 (строки 3–6). Выражение 1..1000 обозначает список всех целых чисел из диапазона от 1 до 1000. Выполнение цикла по всем элементам этого списка обозначает последовательное присвоение переменной i значений 1, 2, 3, . . . , 1000 и последущее выполнение команд, входящих в тело цикла. Внутри цикла проводится проверка кратности значения, содержащего ся в переменной i, числу 17 (строка 3). Здесь выражение i%17 обознача ет взятие остатка от деления значения переменной i на 17, а выражение i%17 == 0 — сравнение этого остатка с нулем. В случае если условие вы полняется, то значение счетчика counter увеличивается на 1 (строка 4), значение переменной i распечатывается в терминал (строка 5), и выполня ется следующая итерация цикла. В процессе выполнения цикла на экран будут выведены все числа, кратные 17, из заданного диапазона, после че го в терминал печатается количество найденных чисел, содержащееся в счетчике counter (строка 8). Задание 3. Напишите программу, которая находит номер первого и по следнего максимального числа в массиве, элементы которого являются целыми числами и вводятся с клавиатуры (количество элементов массива равно 10). Решение Первым шагом при написании алгоритма решения данной задачи необ ходимо определить способ считывания целых чисел с клавиатуры. Для определенности будем полагать, что все числа будущего массива вводятся в одну строчку через пробел. После ввода строки с числами с клавиатуры она должна быть преобразована в массив чисел, и в случае, если размер
Решение задач типового варианта курсовой работы
27
этого массива отличен от 10, на экран должно быть выведено сообщение об ошибке, а дальнейшее выполнение программы прекращено. Сама процедура нахождения максимального числа в массиве может быть описана следующим образом. Предположим, что в начальный момент времени (пока не рассмотрен ни один элемент массива) максимальным эле ментом массива является первый (с индексом 0). Далее, последовательно перебирая все оставшиеся элементы массива, будем проверять, не являет ся ли текущий элемент массива, по значению больше, чем ранее найденный максимальный элемент. Замечание. Для того, чтобы сравнивать значение элементов с макси мальным значением, необходимо в дополнительной переменной сохранять значение этого максимального элемента (переменная max_val). Также в отдельных переменных будем хранить первый и последний индекс элемен тов, по значению равных максимальному числу (переменные index_first и index_last). В процесе перебора элементов массива следует рассмотреть несколько случаев. Если текущий элемент по значению строго больше, чем макси мальный, то найден новый максимальный элемент. Сохраним зна чение этого элемента в переменной max_val, а его индекс в пере менных index_first и index_last (так как до этого элементы с таким значением еще не встречались). Если значение текущего элемента равно максимальному, то най ден еще один элемент, по значению равный максимальному. В этом случае следует поменять значение переменной index_last, сохра нив в нее значение индекса текущего элемента, а значения пере менных max_val и index_first оставить без изменений. Если рассматриваемый элемент по значению меньше, чем мак симальный (отличный от первых двух случай), никаких действий производить не требуется. Заметим, что после того как будут рассмотрены все элементы масси ва, значение, в последний раз сохраненное в переменной max_val, будет максимальным для всего массива чисел. А переменные index_first и index_last при этом будут содержать индекс первого и последнего вхож дения найденного максимального числа в массиве. Описание программы При выполнении первой строки программы в терминал выводится текст приглашения для ввода 10 целых чисел. Во второй строке программа ожи дает, пока пользователь не введет с клавиатуры текстовую строчку с чис лами (функция gets), удаляет все пробельные символы из начала и конца
28
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
Решение задач типового варианта курсовой работы Исходный код программы задания 3 puts "Ââåäèòå ÷åðåç ïðîáåë äåñÿòü öåëûõ ÷èñåë" a = gets.strip.split(' ') if a.size != 10 puts "Îøèáêà êîëè÷åñòâî ââåäåííûõ ÷èñåë íå ðàâíî äåñÿòè" else max_val = a[0].to_i index_first = 0 index_last = 0 i = 1 while i < 10 a[i] = a[i].to_i if a[i] == max_val index_last = i elsif a[i] > max_val max_val = a[i] index_first = i index_last = i end i += 1 end puts "Íàéäåí ìàêñèìàëüíûé ýëåìåíò #{max_val}" puts "Ïåðâûé èíäåêñ ýòîãî ÷èñëà ðàâåí #{index_first}" puts "Ïîñëåäíèé èíäåêñ ýòîãî ÷èñëà ðàâåí #{index_last}" puts "Ïîðÿäêîâûå íîìåðà ðàñ÷èòûâàëèñü íà÷èíàÿ ñ íóëÿ" end
этой строки (функция strip), после чего по пробельному символу разби вает ее на массив строк, содержащих текстовое представление введенных чисел (функция split(' ')), и сохраняет этот массив в переменную a. В строке 3 производится проверка количества введенных чисел и в слу чае, если оно не равно десяти, печатается сообщение об этом. В противном случае выполняются действия алгоритма, описанного выше. В строке 6 переменной max_val присваивается значение, соответству ющее первому элементу массива и предварительно преобразованное из текстового представления числа в целочисленный тип (функция to_i). В строках 7–8 переменные index_first и index_last инициализируются значением 0, соответствующим индексу первого элемента массива. Далее выполняется цикл по всем элементам массива, начиная со второ го (с индексом 1) и заканчивая десятым (с индексом 9). Для этого указатель индекса массива (переменная i) инициализируется единицей (строка 9), и перед каждой итерацией цикла проверяется условие i < 10 (строка 10). В теле цикла каждый элемент массива, являющийся строкой, приводит
Решение задач типового варианта курсовой работы
29
ся к целому числовому типу (строка 11), после чего для каждого случая, описанного в алгоритме, выполняются следующие действия: в случае, когда значение текущего элемента равно максимальному значению (строка 12), значение переменной index_last меняется на индекс текущего элемента; в случае, когда значение текущего элемента больше максимально го значения (строка 14), согласно алгоритму меняются значения переменных max_val, index_first и index_last. В конце текущей итерации цикла значение переменной i увеличивается на единицу (строка 19). А после выполнения цикла искомые значения, хранящиеся в переменных max_val, index_first и index_last, распеча тываются в окно терминала (строки 21–24). Задание 4. Напишите программу, позволяющую ввести с клавиатуры стро ку и найти количество слов в строке, начинающихся на букву «а». Решение Данную зачачу можно решить с помощью следующего алгоритма. На первом шаге позволим пользователю ввести с клавиатуры строчку и прове рим, содержит ли она хотя бы один символ. В случае если строка не пуста, создадим массив входящих в эту строку слов. При этом будем считать, что строка содержит набор слов, разделенных между собой пробельным символом. После этого, перебрав в цикле каждое слово друг за другом, подсчитаем количество слов в массиве, начинающихся с буквы «a». Описание программы В первой строке программы в терминал выводится строка с пригла шением для ввода строки. Во второй строке переменной s присваивается строка, введенная с клавиатуры (функция gets), из начала и конца которой удаляются все пробельные символы (функция strip). В третьей строке определяется переменная-счетчик count, которая слу жит для хранения количества найденных во введенной строке слов, начи нающихся с буквы «a». Будем считать, что в начальный момент времени, пока не просмотрено ни одно слово, таких слов в строке нет. Поэтому присвоим переменной count значение 0, а при последовательном переборе слов будем увеличивать её значение на единицу, если такое слово встре тится. В строке 4 проверяется размер введенной строки и, если он боль ше нуля (строка не пуста), то выполняются следующие действия алго ритма. Сначала создается массив слов a (строка 5). После этого для каждого элемента массива (цикл по массиву a в строке 6) проверяется
30
1 2 3 4 5 6 7 8 9 10 11 12
Решение задач типового варианта курсовой работы Исходный код программы задания 4 puts "Ââåäèòå ñòðîêó, ðàçäåëÿÿ ñëîâà ñèìâîëîì ïðîáåë" s = gets.strip count = 0 if s.size > 0 a = s.split(' ') for x in a if x[0].chr == 'a' count += 1 end end end puts "Íàéäåíî #{count} ñëîâ, íà÷èíàþùèõñÿ íà áóêâó <
>"
условие, начинается ли текущее слово x на букву «a» (строка 7). Если это условие выполняется, значение переменной count увеличивается на едини цу (строка 8). Здесь x[0] обозначает код первой буквы слова, а выражение x[0].chr — ее символьное представление. Результат, включающий в себя количество найденных в строке слов, выводится в терминал по завершении работы цикла (строка 12). Задание 5. Напишите программу, которая находит и распечатывает фами лии всех сотрудников, чей телефон заканчивается на цифру «7», из файла следующего вида:
Èâàíîâ Èâàí Ôåäîðîâè÷: 111-33-54 Ñåìåíîâ Ïåòð Ñåðãååâè÷: 123-66-87 è ò.ä. Решение Рассмотрим следующий алгоритм решения задачи. Для начала преоб разуем содержимое заданного файла в массив строк, после чего в цикле переберем каждый элемент массива, который является строкой, и прове рим, заканчивается ли эта строка символом «7». В случае, если это усло вие выполняется, преобразуем эту строку, выделив в ней фамилию, имя и отчество, и получившийся результат выведем на экран. Описание программы Открытие файла “phone.txt” с содержимым адресной книги на чтение выполняется во второй строке программы. После этого содержимое файла считывается в массив строк при помощи функции readlines (строка 3). Далее для каждого элемента массива (цикл по массиву a в строке 4) вы полняется действие, при котором из начала и конца строки удаляются все
Решение задач типового варианта курсовой работы
1 2 3 4 5 6 7 8 9
31
Исходный код программы задания 5 puts "Íàéäåíû ñëåäóþùèå ñîòðóäíèêè:" file = File.open('phone.txt', 'r') a = file.readlines for x in a x = x.strip if x[-1].chr == '7' puts x.split(':')[0] end end
пробельные символы (строка 5), а затем проверяется условие, оканчивает ся ли текущая строка x символом «7» (строка 6). В случае если условие выполняется, то в окно терминала выводятся фамилия, имя и отчество это го человека (строка 7). Здесь x[-1] обозначает код последнего символа строки, а выражение x[-1].chr — его символьное представление. Для этого, чтобы распечатать фамилию, имя и отчество найденного человека, строка x разбивается по символу двоеточия «:» и из получившегося мас сива берется значение элемента с индексом 0 (функция split(':')[0]). Задание 6. Используя метод Монте-Карло, вычислите значение опреде √ лённого интеграла функции f(x) = x 2 sin x на отрезке [0, π] . Ответ округ лите до 3 знаков после запятой. Решение √ Построим график функции f(x) = x 2 sin x (рис. 13) и сделаем дополни тельные построения. Для этого зададим прямоугольник, который ограничи вает криволинейную трапецию, характеризующую площадь под графиком функции. В качестве направляющих, задающих прямоугольник, возьмем прямые x = 0, x = π, y = 0 и y = 5. Выбор верхней направляющей y = 5 обусловлен оценкой максимального значения заданной функции на отрезке [0, π] . Из графика функции видно, что на всем отрезке функция ограничена и ее значение меньше 5. Алгоритм решения задачи напишем исходя из описания метода Монте Карло. Позволим пользователю ввести с клавиатуры количество пробных точек N и выполним N «выбрасываний» точек с произвольними коорди натами внутрь прямоугольника x = 0, x = π, y = 0 и y = 5. После этого подсчитаем количество точек K , попавших под график заданной функции, и вычислим площадь криволинейной трапеции по приближенной формуле K S=N Sпр .
32
Решение задач типового варианта курсовой работы
√
Рис. 13. График функции y(x) = x 2 sin x
Описание программы В начале кода программы (строка 1) производится подключение биб лиотеки Math для возможности дальнейшего использования сокращенной записи вызова математических функций sqrt, sin и константы PI (вме сто Math.sqrt, Math.sin и Math::PI соответственно). Далее в строках 3–p 5 следует описание метода f(x), который возвращает значение функции x 2 sin(x) в точке x. Это позволит нам использовать в программе вызов метода f(x) вместо записи выражения x*x*sqrt(sin(x)) (см. строку 18). При выполнении программы в консоль выводится приглашение для вво да размера выборки N (строка 7) и переменной n присваивается значение, введенное с клавиатуры (строка 8). В строках 9–12 задаются значения пе ременных h, a и b, которые характеризуют высоту, левую и правую границы (интервал интегрирования) ограничивающего прямоугольника, а также вы числяется его площадь s. Далее в программе инициализируется переменная k, в которой будет храниться количество точек, попавших под график функции (строка 14), и n-раз выполняется цикл, имитирующий выбрасывание точек в ограничи вающий многоугольник (строка 15). В теле цикла вычисляются случайные координаты x и y новой «выброшенной» точки (строки 16–17). Для того чтобы получить случайную величину x в диапазоне от a до b, случайное значение от 0 до 1, возвращенное функцией rand, умножается на длину интервала [a, b] , равную (b − a), и увеличивается на a. Аналогично полу чается случайная y-координата точки в диапазоне от 0 до h.
Решение задач типового варианта курсовой работы
33
Исходный код программы задания 6 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
include Math def f(x) return x*x*sqrt(sin(x)) end puts "Ââåäèòå êîëè÷åñòâî ïðîáíûõ òî÷åê (ðàçìåð âûáîðêè)" n = gets.to_i h = 5 # âûñîòà îãðàíè÷èâàþùåãî ïðÿìîóãîëüíèêà a = 0 # ëåâûé êîíåö îòðåçêà [a, b] b = PI # ïðàâûé êîíåö îòðåçêà [a, b] s = (b-a)*h # ïëîùàäü îãðàíè÷èâàþùåãî ïðÿìîóãîëüíèêà k = 0 for i in 1..n x = a + (b-a)*rand y = h * rand if f(x) >= y then k += 1 end end printf("Çíà÷åíèå èíòåãðàëà ðàâíî %.3f \n", s*k/n)
В зависимости от того, какие значения примут координаты новой точ ки, количество точек, попавших под график, может измениться. Поэтому, если y-координата новой точки оказывается меньше значения функции в точке x (точка лежит ниже графика функции), значение переменной k уве личивается на единицу (строка 18). Для того чтобы вывести значение интеграла, округленное до 3 знаков после запятой, воспользуемся функцией форматируемого вывода printf. Первый аргумент функции printf задает строку печати и вид, в котором будут напечатаны остальные параметры функции. В данном случае выра жение %.3f обозначает, что площадь криволинейной трапеции, вычисляе мая как s*k/n, будет напечатана как действительное число (%f) с тремя знаками после запятой (%.3f). Замечание. При выполнении программы следует выбирать такое ко личество «выбрасываемых» точек N, при увеличении которого требуемое количество цифр в ответе после запятой не будет изменяться. В против ном случае может оказаться так, что значение интеграла будет вычислено с большей погрешностью, и точность, заданная в задаче, так и не будет достигнута.
34
Решение задач типового варианта курсовой работы
Задание 7. Вычислите значение определённого интеграла функции f(x) = arctg cos x на отрезке [0, π /2] методом левых прямоугольников с точностью 3 знака после запятой. Решение Решение задачи вычисления значения определенного интеграла функ ции методом прямоугольников в общем случае сводится к нахождению суммы площадей прямоугольников, полученных при разбиении отрезка ин тегрирования. Поэтому для данной задачи достаточно написать алгоритм нахождения суммы площадей левых прямоугольников, которая определяет величину интеграла в зависимости от разбиения. Зададим для дальшейшего использования в коде программы метод, воз вращающий значение подынтегральной функции при заданном значении аргумента функции. Позволим пользователю ввести параметр, задающий разбиение отрезка интегрирования, и вычислим значение длин отрезков разбиения. Выполним цикл по всем отрезкам разбиения, увеличивая при этом текущее значение суммы, характеризующей площадь криволинейной трапеции, на величину площади соответствующего прямоугольника (в на чальный момент времени сумма равна нулю), после чего полученную в ре зультате вычислений сумму, которая будет равна приближенному значению интеграла, распечатаем в окно терминала. Исходный код программы задания 7 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
include Math def f(x) return atan(cos(x)) end puts "Ââåäèòå êîëè÷åñòâî îòðåçêîâ ðàçáèåíèÿ" n = gets.to_i a = 0 # ëåâûé êîíåö îòðåçêà [a, b] b = PI/2 # ïðàâûé êîíåö îòðåçêà [a, b] delta = (b-a).to_f/n # äëèíà îòðåçêà ðàçáèåíèÿ s = 0 # ñóììàðíàÿ ïëîùàäü x_i = a # ëåâàÿ ãðàíèöà òåêóù. îòðåçêà for i in 0..(n-1) s += f(x_i)*delta x_i += delta end printf("Çíà÷åíèå èíòåãðàëà ðàâíî %.3f\n", s)
Решение задач типового варианта курсовой работы
35
Описание программы При выполнении программы сначала в терминал выводится приглаше ние для ввода количества отрезков, на которое будет разбит отрезок ин тегрирования [a, b] (строка 7), после чего переменной n присваивается значение, введенное с клавиатуры (строка 8). В строках 10–12 задают ся значения переменных a и b, которые характеризуют левую и правую границы интервала интегрирования, а также вычисляется длина отрезка разбиения delta. Далее переменной s присваивается значение 0 — начальное значение суммы (строка 14), левая граница первого отрезка разбиения x_i устанав ливается в значение a (строка 15), после чего выполняется цикл по всем отрезкам разбиения начиная с нулевого и закаканчивая n − 1 (строка 16). В теле цикла значение переменной s увеличивается на величину площади прямоугольника с высотой f(x_i), соответствующей значению функции на левом конце текущего отрезка, и основанием delta (строка 17). При этом к значению переменной x_i прибавляется значение длины отрезка разби ения delta, что соответствует сдвигу левой границы текущего отрезка к левой границе следующего отрезка (строка 18). По окончании выполнения цикла полученное значение интеграла с по мощью функции форматированного вывода printf печатается в терминал. Здесь выражение %.3f обозначает вывод действительного числа, содержа щегося в переменной s, с тремя знаками после запятой. Задание 8. Используя метод дихотомии, найдите наименьший положитель ный корень уравнения 5 ln x = 3 − x с точностью 4 знака после запятой. Решение Запишем уравнение 5 ln x = 3 − x в виде f(x) = 0. Для этого перенесем правую часть уравнения налево и получим уравнение 5 ln x + x − 3 = 0. Посторим график функции f(x) = 5 ln x + x − 3 (рис. 14), а также най дем интервал, на котором выполняются требования метода дихотомии для данной функции. Обратим внимание на то, что фунцкция f(x) не определена при x < 0, а в пределе при x → 0 справа стремится к минус бесконечности. Поэтому в качестве начального отрезка приближения выберем отрезок [1, 2] . Этому отрезку принадлежит искомый корень уравнения, и на нем выполняются все требования, необходимые для применения метода дихотомии, а именно: функция f(x) = 5 ln x + x − 3 непрерывна на отрезке [1, 2] ; значения функции f(x) на концах отрезка f(1) = −2 < 0 и f(2) = 5 ln 2 − 1 > 0 имеют разные знаки; отрезок [1, 2] содержит только один корень уравнения.
36
Решение задач типового варианта курсовой работы
Рис. 14. График функции y(x) = 5 ln(x) + x − 3
После того как выбран начальный отрезок, дальнейший алгоритм ре шения задачи заключается в том, чтобы задать точность, с которой необхо димо произвести вычисление приближенного значения корня, и, согласно методу дихотомии, организовать цикл, в котором исходный отрезок [a, b] уменьшается (делится пополам) до тех пор, пока его длина не станет мень ше заданной точности.
Решение задач типового варианта курсовой работы
37
Исходный код программы задания 8 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
include Math def f(x) return 5*log(x)+x-3 end a = 1 # ëåâûé êîíåö îòðåçêà [a, b] b = 3 # ïðàâûé êîíåö îòðåçêà [a, b] epsilon = 0.0001 # òî÷íîñòü âû÷èñëåíèé while (b-a) > epsilon c = (b + a) / 2.0 if f(a)*f(c) > 0 a = c else b = c end end printf("Ïðèáëèæ. çíà÷åíèå êîðíÿ óðàâíåíèÿ %.4f\n", c)
Описание программы В начале программы (строки 7–9) инициализируются значения пе ременных a, b и epsilon, определяющих границы начального интерва ла и точность вычислений. Далее, до тех пор пока выполняется условие (b-a)>epsilon, обозначающее, что длина отрезка [a, b] больше заданной точности (строка 11), выполняется цикл. В теле цикла вычисляется значение переменной c, задающей середи ну отрезка (строка 12), после чего в зависимости от того, какое значение принимает логическое выражение f(a) · f(c) > 0, сдвигается либо левая (выполняется ветвь if — случай 1), либо правая граница отрезка (выпол няется ветвь else — случай 2). В первом случае значение переменной c присваивается переменной à, а во втором случае — переменной b. После выполнения цикла, когда найден приближенный корень уравне ния, в терминал при помощи функции форматируемой печати printf выво дится строка, которая содержит значение переменной c — приближенного корня уравнения (строка 20). Значение переменной c печатается в терми нал как действительное число с четырьмя знаками после запятой (%.4f).
4. Оформление курсовой работы Курсовая работа по учебному курсу «Информатика» должна быть оформлена в виде электронного документа, который может быть создан в одном из текстовых процессоров. Электронный документ должен содер жать титульный лист и описание решения каждого задания, в которое необходимо включить: постановку задания; описание решения; исходный код программы; результаты выполнения программы. Титульный лист оформляется согласно шаблону, который выдает пре подаватель при выдаче заданий курсовой работы. Он должен содержать название дисциплины, фамилию, имя и отчество студента, номер учебной группы, а также номер варианта курсовой работы. При описании решения задания в документ необходимо включить но мер и текст задания, привести достаточно подробное описание алгоритма, поясняющего, каким способом решается задача и какие исходные данные выбираются (фиксируются в коде программы) для её решения. После это го в документ требуется вставить исходный код программы и там, где это необходимо, пояснить отдельные элементы программы. Замечание. Необходимо помнить о том, что преподаватель оставляет за собой право требовать устной защиты курсовой работы с целью полу чения более детального описания решенных задач. При описании результатов, полученных в ходе решения задания, требу ется указать, какие входные данные использовались при выполнении про граммы и что получилось в результате. Там где это необходимо, в качестве примеров следует привести результаты выполнения программы, получен ные при разных входных данных. В дополнение к входным и выходным данным результаты должны содержать один или, если это необходимо, несколько снимков окна терминала, в котором выполнялась программа. Далее приведем пример оформления первого задания разобранного ва рианта курсовой работы.
Оформление курсовой работы
39
Задание 1. Найдите площадь треугольника, используя формулу Герона. Длины сторон треугольника должны вводиться с клавиатуры. Решение Опишем алгоритм решения задачи. Позволим пользователю ввести с клавиатуры размеры трех сторон треугольника a, b и c. Проверим, может ли существовать такой треугольник, для чего убедимся, что все введенные длины сторон положительны и удовлетворяют «неравенству треугольника» a < (b + c), b < (a + c) и c < (a + b). В случае, если такой треугольник не существует, выведем сообщение об ошибке. В противном случае вычислим полупериметр заданного треуголь ника p = (a + b + c) /2 и найдем его площадь, используя формулу Герона: p S = p(p − a) (p − b) (p − c). Исходный код программы
print "Ââåäèòå ðàçìåð ïåðâîé ñòîðîíû òðåóãîëüíèêà a = " a = gets.to_f print "Ââåäèòå ðàçìåð âòîðîé ñòîðîíû òðåóãîëüíèêà b = " b = gets.to_f print "Ââåäèòå ðàçìåð òðåòüåé ñòîðîíû òðåóãîëüíèêà c = " c = gets.to_f if a<0 or b<0 or c<0 or a>(b+c) or b>(a+c) or c>(a+b) puts "Çàäàííûé òðåóãîëüíèê íå ñóùåñòâóåò" else p = (a+b+c)/2 s = Math.sqrt(p*(p-a)*(p-b)*(p-c)) puts "Ïëîùàäü çàäàííîãî òðåóãîëüíèêà ðàâíà S=#{s}" end Результаты выполнения программы В качестве результатов выполнения программы приведем два приме ра. Для начала в качестве входных данных возьмем такие длины сторон треугольника, которые не удовлетворяют «неравенству треугольника», на пример a = 2, b = 3 и c = 10. В данном примере не выполняется условие c < (a + b), так как выражение 10 < (2 + 3) ложно.
40
Оформление курсовой работы
Запустим программу, введем c клавиатуры выбранные значения сторон треугольника и убедимся, что программа напечатает в терминал сообщение о том, что треугольник не существует.
В качестве второго примера вычислим площадь прямоугольного тре угольника со сторонами a = 3, b = 4 и c = 5. Аналитически легко вычис лить, что площадь такого треугольника равна (3 · 4) /2 = 6. Запустим программу, введем c клавиатуры выбранные значения сторон треугольника и убедимся, что программа правильно вычисляет площадь заданного треугольника.
Список литературы и интернет-ресурсов [1] Роганов Е.А., Роганова Н.А. Практическая информатика: Учеб. пособие. Ч. 2. — М.: МГИУ, 2002. [2] Бахвалов Н.С., Жидков Н.П., Кобельков Г.М. Численные методы: Учеб. пособие. — М.: Наука, 1987. [3] http://www.ruby-lang.org/en/ — Язык программирования Ruby. [4] http://ru.wikibooks.org/wiki/Ruby/ — Википедия (свободная энциклопедия) о языке Ruby. [5] http://www.openoffice.org — Домашняя страница OpenOffice. [6] http://ru.openoffice.org — OpenOffice для русскоговорящих пользователей. [7] http://maxima.sourceforge.net — Система компьютерной алгебры Maxima.