Лабораторная работа №10 «Программирование алгоритмов итеративных циклических структур»

Цель работы: овладение практическими навыками разработки и программирования вычислительного процесса, связанного с применением в программах итеративного циклического процесса, получение дальнейших навыков по отладке и тестированию программ, выработка при решении поставленных задач таких

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

Пример выполнения работы

Условие: разработайте проект, содержащий несколько форм. Первая форма является заставкой к приложению. На второй форме реализуйте решение задачи своего варианта.

Задача 1. Среди чисел 1, 1 + -,1 + - + -,... найдите первое число, большее вво-

2 2 3

димого значения переменной а.

Комментарий: алгоритм решения данной задачи относится к алгоритмам вычисления членов бесконечных последовательностей. Очередной член бесконечной последовательности обозначим как Ь. Его номер, который совпадает со значением знаменателя дроби, добавляемой к предыдущему члену для получения значения очередного члена последовательности, обозначим как п. Тогда, итерационная формула вычисления очередного члена последовательности примет вид:

, ^ 1

=*„ч + -п

Разработка алгоритма решения задачи представлена на рис. 200.

Алгоритм решения задачи

Рис. 200. Алгоритм решения задачи

В листинге 189 приведен код процедуры, отвечающий за решение задачи. Листинг 189

namespace WindowsApplicationl {

public partial class Forml : Form {

public Forml()

{

InitializeComponent();

} private void buttonl_Click(object sender, EventArgs e)

{

double a = Convert.ToDouble(textBoxl.Text);

double b = 1;

double n = 1;

listBoxl.Items.Clear();

listBoxl.Items.Add(" n " + " b ");

listBoxl.Items.Add(" ");

while (b

{

n = n + 1 ; b = b + 1 / n ;

listBoxl.Items.Add(" " + n.ToString() + " "

+ b.ToString());

}

textBox2.Text = b.ToString() ; textBox3.Text = n.ToString() ;

}

}

}

Внешний вид формы и результаты выполненной программы представлены на рис. 201. _

Результаты выполненной программы

Рис. 201. Результаты выполненной программы

Задача 2. Вычислите с точностью ? = 10"4 корень уравнения ех + х=0, воспользовавшись итерационной формулой хм = -ех‘, а 1 = 0, 1,2, ....; х0 = 0. Закончите итеративный процесс, как только хм - х1 станет меньше ? = 10~4 .

Комментарий: для решения данной задачи необходимо из очередного вычисленного корня хм вычитать предыдущий корень X;. Для этого при каждом

повторении цикла перед вычислением очередного корня х сохраняем в переменной а текущее значение х (оно становится предыдущим). Цикл заканчивается,

когда разность между х (т.е. */+1 и а (т.е. х1) станет меньше ? = 10~4. В программе обозначим ? как е1.

Разработка алгоритма решения задачи представлена на рис. 202.

Алгоритм решения задачи

Рис. 202. Алгоритм решения задачи

В листинге 190 приведен код процедуры, отвечающий за решение задачи.

Листинг 190

namespace WindowsApplicationl

{

public partial class Forml : Form

{

public Forml()

{

InitializeComponent();

}

private void buttonl_Click(object sender, EventArgs e)

{

double a; double x = 0 ; double xl = -Math.Exp(x) ; double el = 0.0001 ; do {

a = x ;

x = -Math.Exp(a) ;

}

while (Math.Abs(x - a) > el);

textBoxl.Text = x.ToString() ; textBox2.Text = xl.ToString() ;

}

}

}

Результаты разобранной задачи представлены на рис. 203.

Лабораторная работа

0@®

Корень ураенєния, Еьчисленньй с заданной точностью

-0.56711Э040057215

Корень ураЕнения, Еьчисленньй напрямую -1

Ок

Рис. 203. Результаты работы программы Задача 3. Задана возрастающая последовательность

2 3

, X X X

1 ? 3 > 32 ’ э —Ю)

Требуется вычислять все члены последовательности, до тех пор пока значение очередного члена не превысит некоторое число с1 (3< (1 <1000).

Комментарий: для вычисления любого члена последовательности можно воспользоваться формулой:

X

ап =

уі , где п = 0, 1,2 ... — номер члена последовательности

П

В приведенном алгоритме имеется «защита» от зацикливания (проверка ус ловия п>100, т.е. количество итераций не превысит 100).

В листинге 191 приведен код процедуры, отвечающий за решение задачи.

Листинг 191

namespace WindowsApplicationl

public partial class Forml : Form

{

public Forml()

{

InitializeComponent();

}

private void buttonl_Click(object sender, EventArgs e)

{

double a;

double x = Convert.ToDouble(textBoxl.Text); double d = Convert.ToDouble(textBox2.Text); int n = 0 ;

listBoxl.Items.Clear();

listBoxl.Items.Add(" n " + " a ");

listBoxl.Items.Add(" ");

do

{

II

a = Math.Pow (x, n) / Math.Pow (3, n) ; listBoxl.Items.Add(" " + n.ToStringO + "

+ a.ToString());

n = n + 1 ;

}

(n > 100));

while ((a < d)

}

}

Результаты разобранной задачи представлены на рис. 205.

Лабораторная работа

?

Введите значение х>=10

1 СО

Введите значение d (3'd'10Q0)

n

  • 1 2
  • 33.3333333333333
  • 1111.11111111111
  • 40

Ok

Рис. 205. Результаты работы программы

Задача 4. Разработайте программу, вычисляющую приближенное значение

функции Ехр (х) с заданной точностью &.

Комментарий: функция Ехр (х) может быть представлена бесконечным рядом

( л х1 х' х"

схр(х) — 1 + X н---1---ь... н---ь...

2! 3! п

Для вычисления значения функции Ехр (х) с точностью ? необходимо просуммировать все члены ряда, которые по модулю превышают заданную точность, т.е. &. Следовательно, необходимо организовать циклический процесс для вычисления суммы и повторять его, пока выполняется условие

Рассматривая приведенную выше формулу, можно заметить, что соседние члены ряда (обозначим их как С„ и C„+j) связаны между собой соотношением

Сп+1 п • —где п = 0, 1, 2,причем С0= 1. п + 1

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

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

В листинге 192 приведен код процедуры, отвечающий за решение задачи.

Листинг 192

namespace WindowsApplicationl

{

public partial class Forml : Form

{

public Forml()

{

InitializeComponent();

}

private void buttonl_Click(object sender, EventArgs e)

{

double x = Convert.ToDouble(textBoxl.Text);

double eps = Convert.ToDouble(textBox2.Text);

double s = 1;

double n = 1;

double cn = x ;

listBoxl.Items.Clear();

while (Math.Abs(cn) > eps)

{

s = s + cn ;

n = n + 1 ;

cn = cn * x / n ;

}

double у = Math.Exp(x) ;

listBoxl.Items.Add("Значение функции, вычисленное с заданной точностью: " + s.ToStringO ) ;

listBoxl.Items.Add("Значение функции у, вычисленное через встроенную функцию: " + у.ToString()) ;

listBoxl.Items.Add("Количество членов ряда:" + n.ToString()) ;

}

}

}

Алгоритм решения задачи

Рис. 206. Алгоритм решения задачи

Результаты разобранной задачи представлены на рис. 207.

В разработанную программу добавлен оператор у = МаШ.Ехр(х), для того чтобы сравнить полученные результаты. Из ответов, представленных на рис. 207, видно, что значение функции в вычислено более точно, чем значение функции у, полученное «классическим» способом через оператор у = МаШ.Ехр(х).

Полученные результаты

Рис. 207. Полученные результаты

Задача 5. Вычислить сумму членов знакопеременной убывающей последова-

р

тельности с заданной точностью с :

х-1 (х-1)2 { (х-1)3 + (Х-1Г

1! 2! 3! ..... 1 (и + 1)! ......’

Комментарий: вычисление с заданной точностью ? означает, что суммирование членов ряда надо продолжать до тех пор, пока очередной вычисленный член ряда не станет меньше по абсолютной величине числа ? .

Отметим, что во многих задачах непосредственный подсчет очередного члена связан с вычислительными трудностями. В этом случае целесообразно использовать рекуррентную формулу, которая позволяет вычислить значение переменной на следующем шаге, используя ее значение на текущем шаге

@п+ Выражение для q можно получить, разделив ап+ член на^,.

член.

Приведем вывод рекуррентной формулы для заданного в задаче ряда. Формула п-го члена

  • (*-1Г+1
  • 0 + 1)!

тогда формула п+1 члена

  • (х-1)"+'+'
  • (и + 1 + 1)!
  • (х-1 Г2
  • (я+ 2)!

Разделив Яц+1 член на ап , получим выражение для ц

(-І)"1 -(х-у*2•(« + !)! (х-1)

_ _

  • 4 а„ (я + 2)!-(-1)" - + -1)"+' и + 2 Таким образом, рекуррентная формула для данного ряда:
    • (х-1)

ап+1 = ~ап

п + 2

Выбор начального значения номера члена ряда (п) для нашего случая будет п = 0, так как при подстановке этого значения в формулу п-го члена ряда

  • (х -1)"*1
  • (/7 + 1)!

мы получим значение первого члена, равного х — 1 или а = х — 1.

В листинге 193 приведен код процедуры, отвечающий за решение задачи.

Листинг 193

namespace WindowsApplicationl {

public partial class Forml : Form {

public Forml()

{

InitializeComponent();

}

private void buttonl_Click(object sender, EventArgs e) {

double x = Convert.ToDouble(textBoxl.Text);

double el = Convert.ToDouble(textBox2.Text);

int n = 0;

double a = x - 1;

double s = 0;

listBoxl.Items.Clear();

listBoxl.Items.Add(" n " + " a");

listBoxl.Items.Add(" ");

do {

listBoxl.Items.Add(" " + n.ToString() + "

" + a.ToString());

s = s + a ;

a = -a * (x-1) / (n + 1) ;

n = n + 1 ;

}

while ((Math.Abs(a) > el));

listBoxl.Items.Add(" Сумма = " + s.ToString() ) ;

}

}

}

Результаты разобранной задачи представлены на рис. 208.

Лабораторная работа

0(п||х|

n

a

0

-0.5

1

-0,25

2

-0,0625

3

-0.010416666GG66667

4

-0,00130208333333333

w

-0,000130208333333333

6

-1.08506S44444444E-05

Сумма

= -0.824359809027778

Введите значение х

0.5

Введите ТОЧНОСТЬ ЕЬЧИолений

0.000001

Ок

Рис. 208. Результаты работы программы

Задача 6. Вычислите с точностью ?' = 10~:' корень уравнения /(х) = х3 - 2х2 + х - 3 = 0, воспользовавшись итерационной формулой

/О)

1 = 0,1, 2....,х0 =2.2

Комментарий: проверим правильность решения подстановкой найденного

f ГхЗ * f fx^ — Зх~ — 4x “Ь 1

корня в уравнение. Вычислим производную J v ’ ’ J v J

Обозначим x — текущее приближение к корню, а — предыдущее приближение, f — значение функции / (х) для предыдущего значения, р — значение производной F (х) для предыдущего значения, / — номер итерации, совпадающий с номером текущего приближения к корню уравнения,^ — значение функции f (х) для найденного с заданной точностью корня уравнения.

Будем считать, что заданная точность ? обеспечена, если модуль разности между текущим и предыдущим значениями корня меньше ТОЧНОСТИ ? , т.е. для нашего случая |х — а < е.

В листинге 194 приведен код процедуры, отвечающий за решение задачи. Листинг 194

namespace WindowsApplicationl {

public partial class Forml : Form {

public Forml()

{

InitializeComponent();

} private void buttonl_Click(object sender, EventArgs e)

{

double x = 2.2 ; double el = 0.00001 ; double i — 0 ; double f, a, p; listBoxl.Items.Clear();

listBoxl.Items.Add(" i " + " x ");

listBoxl.Items.Add(" ");

do

{

a = x ;

f = Math.Pow (x, 3) - 2 * a *a + a - 3 ;

p=3*a*a+4*a+l; x = a - f / p 1 = 1 + 1 ;

ii

listBoxl.Items.Add(" " + i.ToString() + "

+ x.ToString());

}

while ((Math.Abs(x - a) > el));

listBoxl.Items.Add(" Искомый корень= " + x.ToString() double у = Math.Pow (x, 3) -2*x*x+x-3 ; textBoxl.Text = y.ToString() ;

}

}

}

Результаты разобранной задачи представлены на рис. 209,

Результаты программы

Рис. 209. Результаты программы

Задания для самостоятельной подготовки Изучить:

  • - возможности языка программирования для реализации циклических алгоритмов с использованием операторов цикла do...while и while;
  • - базовые алгоритмы, использующие итеративные циклические структуры: алгоритм вычисления суммы (или произведения) членов бесконечной последовательности, алгоритм проведения вычислений по итеративным формулам.

Разработать:

  • - алгоритм решения поставленной задачи в соответствии с вариантом;
  • - интерфейс программы;
  • - программу решения задачи;
  • - тестовые варианты (число тестов равно числу ветвей вычислительного процесса) для проверки правильности функционирования программы.

Работа в лаборатории

Для успешного получения зачета по лабораторной работе необходимо выполнить следующие требования:

  • 1. Получить допуск к лабораторной работе при предъявлении преподавателю отчета по текущей лабораторной работе.
  • 2. Проект должен иметь заставку, в которой указываются:

название учебного заведения; название кафедры; название лабораторной работы; цель лабораторной работы; условие задачи; вариант задачи.

  • 3. Заставка к проекту выполняется студентами 1-й подгруппы с использованием программного кода, который реализует создание нестандартной формы (см. Приложение 2, заставка №10), студентами 2-й подгруппы с использованием программного кода, который реализует эффект повернутой надписи (см. Приложение 2, заставка №9).
  • 4. Главную форму разрабатываемого приложения студенты 1-й подгруппы и 2-й подгруппы программируют с использованием обычной формы.
  • 5. Обе подгруппы при окончательной компоновке проекта создают и демонстрируют преподавателю .ехе файл приложения.
  • 6. Студент должен уметь ответить на контрольные вопросы по лабораторной работе, т.е. проявить свои знания по теоретической части курса.
  • 7. Студент должен продемонстрировать свои навыки и умения при работе на персональном компьютере в среде программирования Microsoft Visual Studio, набрав и отладив программу своего варианта.
  • 8. Студент обязан соблюдать правила по технике безопасности при работе с вычислительной техникой.

Содержание отчета

  • 1. Название лабораторной работы.
  • 2. Фамилия, имя студента, номер группы, номер варианта.
  • 3. Цель лабораторной работы.
  • 4. Условие задачи.
  • 5. Разработанный алгоритм (все алгоритмические блоки чертятся карандашом или выполняются в текстовом редакторе Microsoft Word).
  • 6. Листинг программы.
  • 7. Результаты выполнения программы.

Контрольные вопросы

  • 1. Какой цикл называется итеративным?
  • 2. В каком случае целесообразно использовать рекуррентную формулу?
  • 3. Какие формулы называются рекуррентными соотношениями?
  • 4. Назовите условия окончания итерационного процесса?

Варианты к лабораторной работе «Программирование алгоритмов итеративных циклических структур»

(порядковый номер студента по журналу соответствует его номеру варианта)

варианта

Задача

і

Вычислите с точностью ? = 0.00001 константу Эйлера (основание натурального логарифма), воспользовавшись разложением в ряд:

, , х х2 х3 х"

є —1+ + + +...+ +...

1! 2! 3! п

Сравните результат со значением, полученным с помощью соответствующей встроенной функции.

2

Вычислите и выведите те члены последовательности

X2 х3 х"

ЗС» ч ч • • • ч • • • ч

2! 3! п

значения которых больше ? = 0.001 при х = 0.2

3

Вычислите с точностью ? = 0.00001 значение функции у = л/х при х = 2, воспользовавшись рекуррентной формулой:

ум=0-5 У,+ ; г = 0,1,2...;^о =

У,] 2

Сравните результат со значением, полученным с помощью соответствующей встроенной функции.

4

Вычислите и выведите те члены последовательности,

Зх,8х2 ,.../?(/? + 2)х",...

значения которых больше ? =0.01, при х = 0.6

5

Вычислите с точностью ? = 0.00001, воспользовавшись разложением в ряд:

х3 х5 х7 х2',+|

аг(х) = х---1-----К..+(-1)--К..

3 5 7 2/7+1

и соотношением п = 4 • агс^ (1)

Сравните результат со значением, полученным с помощью соответствующей встроенной функции.

6

Вычислите с точностью ? = 0.00001 значение функции у = —-=

ух

при х = 2, воспользовавшись формулой:

Ум =1 -5у, -0.5xy,3;i = ОД,2,...;^0 =1

Сравните результат со значением, полученным с помощью соответствующей встроенной функции.

7

Вычислите sin 0.5 с точностью ? = 0.0001, воспользовавшись разложением в ряд:

3 5 7 2/7+1

XXX X

Sin х = х + + ... + ( 1) +... Сравните результат со

3! 5! 7! (2/7 + 1)!

значением, полученным с помощью соответствующей встроенной функции.

8

хк

Для функции z = найдите наименьшее целое положительное значе-

?(х-0.5)

ние к, при котором z < 0.001 (х=0.5)

9

Вычислите cos 0.6 с точностью ? = 0.00001, воспользовавшись разложением в

х2 х4 х6 х2"

ряд: cos х = --Н----+ ... + (-1) -+...

2! 4! 6! (2/7)!

Сравните результат со значением, полученным с помощью соответствующей встроенной функции.

10

Вычислите с точностью ? = 0.0001 корень уравнения X — COS* = 0 воспользовавшись формулой:

xi+1 = cosx д i = 0,1,2..., х0 = 0

Проверьте правильность решения подстановкой найденного корня в уравнение.

11

Вычислите и выведите те члены последовательности,

х2 х3 Xя

  • ? V • • 9 V *?) V”
  • 2! 3! п

значения которых по модулю больше ? = 0.001 при х = 0.5.

12

хк

Для функции z =- при х = 2.5 найдите наименьшее целое положи-

(х + к)2

тельное значение к, при котором z > 100.

13

Вычислите корень уравнения /(х) = х4 + 2 - х-1 = 0 с точностью ?=0.0001, воспользовавшись итерационной формулой

*,+,=*, ' ;* = 0,1,2,.=0 /О,)

Проверьте правильность решения подстановкой найденного корня в уравнение.

14

Вычислите значение V2 с точностью ? = 0.00001, воспользовавшись представлением в виде в виде цепной дроби:

  • 72-1= 1
  • 2 +
  • 2 + -
  • • • •

Значение дроби равно пределу числовой последовательности, члены которой вычисляются по рекуррентной формуле до достижения заданной точности

а= ,п = 1,2,3,..., а0 = 0.5..

2 + а„,

Сравните результат со значением, полученным с помощью соответствующей встроенной функции.

15

Вычислите и выведите те члены последовательности,

  • -X5 ( п„+1 *2"+
  • 3 ’ 15 ,,Л ' 4л72 -1

значения которых по модулю больше ? = 0.001 при х = 0.3.

16

Найдите наименьшее целое положительное п, при котором:

1 11 1 л

л/2 л/з -Л

17

Вычислите ей 0.3 с точностью до ?= 0.00005, воспользовавшись разложением в

х2 х5 х2,,+1

ряд: бЫх) = X Н---1---1-... Н---1-... Сравните результат со значе-

3! 5! (2п + 1)!

нием, полученным с помощью встроенной функции для вычисления ех, ис-

е' — е~х

пользуя соотношение:

18

Вычислите корень уравнения х-0.5(8тх2-1)=0 с точностью ? = 0.001, воспользовавшись итерационной формулой:

хм = 0.5(8тх2 -1);/ = ОДД...;х0 =-0.25

Проверьте правильность решения подстановкой найденного корня в уравнение.

19

Вычислите 1п(2) с точностью ? = 0.001, воспользовавшись представлением в виде ряда:

  • 1п2 = 1---1----- Н---... + (—1)”+1 —1-... Сравните результат со значени-
  • 2 3 4 5 п

ем, полученным с помощью соответствующей встроенной функции.

20

Вычислите с точностью ? = 0.00001 корень уравнения /(X) = tg(X) — X = 0, воспользовавшись итерационной формулой

Хы =Х, - [ ,1 = 0,1,2,...,х0 =4.6.

Проверьте правильность решения подстановкой найденного корня в уравнение.

21

Вычислите ей 0.7 с точностью до ? = 0.00005, воспользовавшись разложением в

X2 X4 X2"

ряд. сЫх) — 1+ + +...+ +...

2! 4! (2/7)!

Сравните результат со значением, полученным с помощью встроенной функ-

ех+е~х

дни е , используя соотношение: сИ(х) =-

2

22

Пусть уо = 0; ук = ; к = 1, 2,.... Дано действительное число 8>0. Най-

Л-. + 2

дите первый член уп, для которого выполнено условие уп — у < ? .

23

Дано действительное а>0. Последовательность хо, хь ...образована по закону гшп(2я, 0.95), при а <= 1

[а/5, в остальных случаях.

х =4/5х ,+йг/5х4,, п = 1,2,....

п п~ /;-1 9 ?

Найдите первый член х„, для которого ^охм1 хп < 10 6

Вычислите для найденного значения х„ разность а-х5„.

24

Дано действительное Ь>0. Последовательность а^ а2,... образована по следующему закону:

а)=Ь; ак=ак-1-1/к, к=2,3,..

Найдите первый отрицательный член последовательности аьаз, ...

25

Дано действительное Ь<0. Последовательность аь аг, ...образована по следующему закону:

а!=Ь; ак=(ак-1+1)/(1-8т2к), к=2,3,....

Найдите первый неотрицательный член последовательности.

26

Дано действительное х. Вычислите приближенное значение бесконечной суммы с точностью ?=0,00001:

(х-1)/х+(х-1)2/(2х2)+(х-1)3/(Зх3)+... (х> 1/2)

27

Дано действительное х. Вычислите приближенное значение 1/х+1/(Зх3)+1/(5х5)+... (х>1)

бесконечной суммы С ТОЧНОСТЬЮ ?=0.0001.

28

Вычислите приближенное значение бесконечной суммы С ТОЧНОСТЬЮ ?=0,0001 (справа от суммы дается ее точное значение, с которым можно сравнить полученный результат):

1+1/22+1/32+... я2/6

29

Вычислите приближенное значение бесконечной суммы С ТОЧНОСТЬЮ ?=0,0001 (справа от суммы дается ее точное значение, с которым можно сравнить полученный результат):

1-1/3+1/5-1/7+... я/4

30

Вычислите приближенное значение бесконечной суммы С ТОЧНОСТЬЮ ?=0,0001 (справа от суммы дается ее точное значение, с которым можно сравнить полученный результат):

1/(1*3)+1/(2*4)+1/(3*5)+... 3/4

31

Вычислите приближенное значение бесконечной суммы С ТОЧНОСТЬЮ ?=0,0001 (справа от суммы дается ее точное значение, с которым можно сравнить полученный результат):

1/(1*2*3)+1/(2*3*4)+1/(3*4*5)+... 1/4

32

Даны действительные числа л:, ? (д:<>0, ?>0). Вычислите с точностью

)кх2к+'

8=0,001: У -—--

^к(2к + )

33

Даны действительные числа л:, 8 (л^0, ?>0). Вычислите с точностью у, (-1)*лг4*+|

е'Ь(2к)(4к + 1)

34

оо х2 к

Даны действительные числа х, ? (х^0, ?>0). Вычислите с точностью ?:^ ——

к=о 2 к

35

Дано действительное число х. Последовательность аьаг,... образована по указанному ниже закону. Получите сумму а1+...+ак, где к - наименьшее целое число, удовлетворяющее двум условиям: к>10 и |ак+11<10-5:

(-1)"х2" п(п + )(п + 2)

 
< Пред   СОДЕРЖАНИЕ     След >