Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа 4.doc
Скачиваний:
10
Добавлен:
09.11.2018
Размер:
331.26 Кб
Скачать

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

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

EPS COUNT

Варианты заданий

0.00001

10

1

16

0.000001

11

2

17

0.000001

12

3

18

0.000001

13

4

19

0.00001

9

5

20

0.00001

8

6

21

0.000001

7

7

22

0.00001

6

8

23

0.000001

11

9

24

0.000001

12

10

25

0.0000001

15

11

26

0.000001

11

12

27

0.000001

12

13

28

0.000001

13

14

29

0.00001

9

15

30

Пример 5. Для функции Y = f(X), график которой приведен ниже, вывести на экран значения Y для Х = 0, 0.25, 0.5, ... 19.75 и получить на экране график функции средствами текстового режима.

Алгоритм решения:

Из приведенного в индивидуальном задании графика функции видно, что функция является периодической. В заданный интервал вкладываются 5 периодов функции. Так то, программа может содержать в себе цикл, в котором 5 раз будут выполняться одни и те же вычисления. В каждой итерации этого цикла должны перебираться значения x от 0 до 3.75 с шагом 0.25, т.е., должен быть вложенный цикл. В каждой итерации вложенного цикла вычисляется значение y для текущего x и выводятся результаты.

Анализ приведенного графика показывает, что каждый период его состоит из трех частей: на отрезке 0<=x<=1 график является прямой, на отрезке 1<=x<=3 – дугой, а на отрезке 3<=x<=4 – другой прямой. Следовательно, во вложенном цикле должно быть разветвление, в котором определяется текущее значение x и обеспечиваются вычисления для первого, второго или третьего случая.

Вычисление функции на отрезке 0 ÷ 1: На этом отрезке функция является функцией прямой. Формула прямой: y=ax+b. Для этого случая a=2, b=–1. Итак, окончательная формула для отрезка 0<=x<=1 такая:  y=2x–1

Вычисление функции на отрезке 1 ÷ 3: На этом отрезке функция является частью окружности. Формула окружности: (x-x0)2+(y-y0)2=R2, где (x0, y0) – координаты центра окружности, а R – радиус. Отсюда y можно определить как: .

В нашем случае R=1, а координаты центра – (2, 1). Извлечение квадратного корня дает два значения – положительное и отрицательное, в нашем случае используется только нижняя полуокружность, так что следует брать только отрицательное значение. Окончательная формула для отрезка 1<=x<=3 такая: y=2-sqrt((1-(x-2)2)

Вычисление функции на отрезке 3 ÷ 4: Для прямой на этом отрезке a=–2, b=7, окончательная формула:  y=7-2x

Алгоритм вывода результатов в псевдографической форме:

В каждой итерации внутреннего цикла мы получает одну ординату графика. Следовательно, для представления результата в псевдографической форме будет удобно развернуть график на 90о и в каждой строке экрана отображать значения x, y и символ ‘*’, который изображает одну точку графика, смещение этого символа в строке будет пропорционально значению ординаты. Для отображения этого символа с необходимым смещением нужно преобразовать ординату в целое число (с масштабированием к размеру строки), это число будет количеством пробелов, которое нужно вывести в строке перед символом ‘*’.

В каждый период функции вкладывается 16 итераций внутреннего цикла, т.е. на экран будет выведено 16 строк на период. Целесообразно после вывода каждого периоду (который целиком помещается на экране) делать остановку в программе до команды оператора на продолжение.

Схема алгоритма:      Схема алгоритма показана на рисунке.

Определение переменных программы:

Для реализации алгоритма понадобятся такие переменные:

n - параметр внешнего цикла (тип int);

x - параметр внутреннего цикла и одновременно – текущее значение абсциссы графика (тип float);

y - текущее значение ординаты графика (тип float);

h - смещение в строке символа, отображающего точку графика (тип int).

Разработка текста программы

Кодовая часть программы начинается в соответствии со схемой алгоритма оператором-заголовком внешнего цикла. Это типичный цикл со счетчиком, он реализуется оператором:

for (n=0; n<5; n++)

В теле цикла прежде всего печатается заголовок таблицы (блок 3) операторами:

printf("| X | Y |\n");

printf("|------------|------------|\n");

После этого открываем внутренний цикл. Параметр этого цикла - значение абсциссы x - принимает значения от 0 до 3.75 с шагом 0.25: for (x=0; x<4; x+=0.25)

Блок 5 схемы алгоритма (проверка попадания на первый отрезок) реализуется условным оператором: if (x<1). В случае выполнения этого условия, значение абсциссы вычисляется по уравнению для первой прямой: y=2*x-1.

Если же предыдущее условие не выполняется, проверка попадания на второй отрезок реализуется условным оператором: else if (x<3). В случае выполнения этого условия, значение абсциссы вычисляется по уравнению для полуокружности: y=1-sqrt(1-(x-2)*(x-2)).

В этом выражении для возведения в степень 2 применяется умножение. Функция sqrt() описана в файле math.h, так что включаем этот файл в начало программы: #include <math.h>

Если же и это условие не выполняется, то мы имеем попадание на третий отрезок, и значение абсциссы вычисляется по уравнению для второй прямой: else y=7-2*x.

Во внутреннем цикле мы выполняем вычисления для одного периода функции, но внешний цикл выполняется у нас 5 раз. Реальное значение абсциссы с учетом внешнего цикла составляет x+4n. Теперь, когда мы имеем абсциссу и ординату графика, можем выводить строку выходных данных. Сперва выводим строку таблицы:

printf("| %5.2lf | %10.7lf | ",x+n*4,y).

 Спецификации формата подобраны таким образом, чтобы значения x и y выводились в два столбца. Числовые параметры спецификации %lf должны обеспечить представление значений x и y с достаточной точностью.

Следующий шаг – вывод в той же строку точки графика. После вывода строки таблицы в строке экрана осталось 57 свободных знакомест. На этом пространстве нам нужно показать значения y от -1 до +1. Если мы возьмем коэффициент масштабирования 10, то амплитуда графика составит 20 знакомест - достаточно для наглядного его представления. Масштабирование значения ординаты выполняется оператором: h=(y+1)*10. Выбранное значение коэффициента масштабирования – 10 – может быть изменено при отладке.  Для правильного округления добавляем 0.5: h=(y+1)*10 + 0.5.

Далее в строку экрана выводится требуемое количество пробелов. В следующем цикле полученное ранее значение h работает как счетчик на вычитание.

for (; h>0; h--) printf(" ");

а потом выводится символ '*' и происходит переход на новую строку экрана: printf("*\n");

На этом заканчивается внутренний цикл.

Полный текст программы приведен ниже.

#include <stdio.h>

#include <math.h>

int main(int argc, char* argv[])

{

short n; // параметр внешнего цикла

float x, y; // абсцисса и ордината графика

short h; // позиция точки на экране

for (n = 0; n < 5; n++) // внешний цикл - для 5 периодов

{

printf("| x | y |\n"); // вывод заголовка таблицы

printf("|-------|------------|\n");

for (x = 0; x < 4; x += 0.25) // внутренний цикл для одного периода

{

if (x < 1) y = 2 * x - 1; // 1-й отрезок

else if (x < 3) y = 1 - sqrt(1 - (x - 2) * (x - 2)); // 2-й отрезок

else y = 7 – 2 * x; // 3-й отрезок

printf("| %5.2f | %10.7f |",x + n * 4, y); // вывод строки таблицы

h = (y + 1) * 10 + 0.5; // определение позиции точки для графика

for (; h>0; h--) printf(" "); // вывод точки графика

printf("*\n");

} // конец внутреннего цикла

printf("Press Enter..."); // пауза до команды оператора

getchar();

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

return 0;

}

Результаты работы программы приведены для одного периода функции. Остальные результаты повторяют приведенные с другими значениями x.

| x | y |

|-------|------------|

| 0.00 | -1.0000000 |*

| 0.25 | -0.5000000 | *

| 0.50 | 0.0000000 | *

| 0.75 | 0.5000000 | *

| 1.00 | 1.0000000 | *

| 1.25 | 0.3385622 | *

| 1.50 | 0.1339746 | *

| 1.75 | 0.0317542 | *

| 2.00 | 0.0000000 | *

| 2.25 | 0.0317542 | *

| 2.50 | 0.1339746 | *

| 2.75 | 0.3385622 | *

| 3.00 | 1.0000000 | *

| 3.25 | 0.5000000 | *

| 3.50 | 0.0000000 | *

| 3.75 | -0.5000000 | *