Пример 6 составить программу табулирования сложной функции

(a sin x+b cos x)[x]!, если x£ k;

y = f(x) =

если x> k,

действительной переменной x = xn (hx) xk. Для вычисления ln x необходимо воспользоваться формулой:

ln x =

Вычисления произвести с погрешностью e.

Алгоритм решения поставленной задачи представлен ниже (рис. 7).

Так как вычисление ln x должно производиться при х> 1/2, то при вводе данных необходимо предупредить пользователя о том, чтобы он обратил внимание на значение левой границы интервала изменения х, что и осуществляется в программе.

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

На втором этапе более детально раскроем тело цикла по х без расшифровки вычислений функций факториала и логарифма. Тело цикла представляет собой разветвляющуюся структуру. На последнем этапе раскроем внутренние циклы для вычисления функции ln x и [ x ]!.

Для вычисления [ x ]! используем структуру цикла с параметром, так как [ x ]!=1×2…[ x ].

Вычисление ln x осуществим накоплением суммы членов заданного ряда с требуемой точностью. Везде, где возможно, постараемся использовать рекуррентные формулы.

Рисунок 7 – Схема алгоритма к примеру 6

Программа, соответствующая этому алгоритму, представлена в листинге 6.

Листинг 6

using System;

namespace ConsoleApplication1

{

class Program

{

static void Main(string[] args)

{

double xn, xk, hx, eps, a, b, k, l, t, s, y = 0;

int f;

Console.Write("Enter a ");

a = Convert.ToDouble(Console.ReadLine());

Console.Write("Enter b ");

b = Convert.ToDouble(Console.ReadLine());

Console.Write("Enter k ");

k = Convert.ToDouble(Console.ReadLine());

Console.Write("Enter eps ");

eps = Convert.ToDouble(Console.ReadLine());

Console.Write("Enter xn >1/2 ");

xn = Convert.ToDouble(Console.ReadLine());

Console.Write("Enter xk ");

xk = Convert.ToDouble(Console.ReadLine());

Console.Write("Enter hx ");

hx = Convert.ToDouble(Console.ReadLine());

Console.WriteLine("Исходные данные");

Console.WriteLine("xn=" + xn + " xk=" + xk + " hx=" + hx);

Console.WriteLine("a=" + a + " b=" + b + " k=" + k + " eps=" + eps);

for (double x = xn; x <= xk; x += hx)

{ // Начало внешнего цикла

s = a * Math.Sin(x) + b * Math.Cos(x);

if (x <= k)

{ // Вычисление факториала

f = 1;

for (int n = 1; n <= x; n++)

{

f = f * n;

y = f * s;

}

}

else

{ //Вычисление логарифма

int n = 1; l = 0; t = 1;

do

{

t = t * (x - 1) / x;

l = l + t / n;

n++;

}

while (t >= eps);

y = l / s;

}

Console.WriteLine("x=" + x + " y=" + y);

} //Конец внешнего цикла

}

}

}

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

Программа решения данной задачи представлена в листинге 7.

Листинг 7

using System;

namespace ConsoleApplication1

{

class Program

{

static void Main(string[] args)

{

int n,x;

bool b,t;

Console.WriteLine("ВВедите количество чисел n ");

n = Convert.ToInt32(Console.ReadLine());

b=false;

t=false;

for (int i = 1; i <= n; i++)

{

Console.WriteLine("Введите число х ");

x = Convert.ToInt32(Console.ReadLine());

if (x >= 0) continue;

t = true;

for (int j = 2; j <= Math.Abs(x) - 1; j++)

{

if (Math.Abs(x) % j == 0)

{

b = true;

Console.WriteLine("Число не простое");

break;

}

}

break;

}

if ((b == false) && (t == true))

Console.WriteLine("Число простое");

if (t == false)

Console.WriteLine("Отрицат. чисел нет");

}

}

}

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

В программе в качестве вспомогательных переменных используются две переменные логического типа: t- принимает значение true, если введено отрицательное число, в противном случае оно сохранит значение false, присвоенное ей в начале работы программы.

Переменная b примет значение true только тогда, когда найдется такое значение j, которое поделит |x| без остатка. Поскольку такое значение j - делитель |x|, то делается вывод о том что, |x| -непростое число. Если b сохранило значение false, то, следовательно, |x| не имеет других делителей, кроме 1 и |x|, а значит оно - простое число.

Для сокращения числа выполняемых операций используются стандартные операторы сontinue и break. Оператор сontinue прерывает выполнение очередной итерации внешнего цикла, если введено неотрицательное число. Оператор break используется здесь дважды. Один раз он прерывает поиск других делителей числа, если один уже найден, осуществляя выход из внутреннего цикла. Сразу же после выхода из внутреннего цикла повторное использование оператора break реализует выход из внешнего цикла, так как по условию задачи нас интересует только первое отрицательное число.

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

Ниже приведены схема алгоритма (рис. 8) и программа для решения данной задачи (лист. 8).

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

Работа пользовательского интерфейса программы обеспечивается с помощью оператора множественного выбора. В данной программе значение селектора b вводится с клавиатуры пользователем. Далее это значение переменной b используется в операторе множественного выбора. Таким образом, пользователь, задавая это значение, определяет, какие операции будет выполнять компьютер. Так, если b =1, то программа выводит на экран предложение ввести исходные данные и считывает их. Если b =2, то на экран выводятся последние значения исходных данных, введенные пользователем. Если b =3, то осуществляется собственно решение задачи, и на экран выводится результат. И если b =4, то осуществляется выход из программы.

Листинг 8

using System;

namespace ConsoleApplication1

{

class Program

{

static void Main(string[] args)

{

int n=0,b;

do

{

Console.WriteLine("- Нажмите 1 и Enter для ввода числа n ");

Console.WriteLine("- Нажмите 2 и Enter для просмотра исходных данных");

Console.WriteLine("- Нажмите 3 и Enter для выполнения программы");

Console.WriteLine("- Нажмите 4 и Enter для выхода из программы");

b = Convert.ToInt32(Console.ReadLine());

switch (b)

{

case 1: Console.WriteLine("ВВедите число n ");

n = Convert.ToInt32(Console.ReadLine()); break;

case 2: Console.WriteLine("n= " +n); break;

case 3: for (int i = n; i>= 1; i--)

{

if (n % i ==0) Console.WriteLine(i);

}

break;

}

}

while (b<4);

}

}

}

Рисунок 8 – Схема алгоритма к примеру 8


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: