
Задания для выполнения
Для
ряда, члены которого вычисляются по
формуле, соответствующей Вашему
индивидуальному заданию, подсчитать
сумму первых 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 | *