Цель работы: изучение приемов программирования алгоритмов обработки данных с разветвлениями, выработка умений отладки и тестирования программ с условными операторами перехода, закрепление навыков программирования арифметических выражений и циклов с заданным числом повторений.
Задание: составить программу для вычисления n значений функции (3).
sin3 (x), х ≤ – π,
f(x) = 1 + cos(x), – π < x < π, (3)
x – π, x ≥ π
/* Программа 5.1 вычисляет значения функции (3) для n вводимых с клавиатуры значений х. ТЕСТ: n = 3, x1 = –7∙π/6, y1 = 0,125;
x2 = π/2, y2 = 1; x3 = 2∙π, y3 = π = 3,1415… */
#include <stdio.h>
#include <math.h>
main()
{ float x, fx;
int i, n;
< Вывод шапки результатов программы, см. программу 1 или 2 >
printf("\n Введите n: ");
scanf("%d", &n);
printf("\n Введите %d значений x: ", n);
for (i = 0; i < n; i++)
{ scanf("%f", &x);
if (x <= – M_PI)
fx = pow(sin(x), 3);
else if ((x > – M_PI) && (x < M_PI))
fx = 1 + cos(x);
else fx = x – M_PI;
printf("\n x = %10.3f f(x) = %15.3f ", x, fx);
}
/* Программа 5.2 позволяет определить, попадает ли точка Z с координатами
(xz, yz) в кольцо, образованное двумя окружностями с радиусами r1 и r2
и с центром (xc, yc). ТЕСТЫ: r1=1, r2=2, xc=1, yc=1,
а) xz=2, yz=1.5 – “ попадает ”;
b) xz=1, yz=1.5 – “ не попадает ”;
*/
#include <stdio.h>
#include <math.h>
main()
{ float r1, r2, xz, yz, xc, yc, p;
int bl; // или bool bl;
< Вывод шапки программы, см. программу 1 или 2 >
printf("\n Введите r1, r2, xc, yc, xz и yz: ");
scanf("%e%e%e%e%e%e", &r1, &r2, &xc, &yc, &xz, &yz);
// Расстояние от точки до центра кольца:
p = sqrt(pow(xz-xc, 2) + pow(yz-yc, 2));
printf(" Точка Z(%.3f, %.3f) ", xz, yz);
bl = (r1 <= p) && (r2 >= p) || (r2 <= p) && (r1 >= p);
// bl имеет логическое значение 0 (ложь) или 1 (истина)
if (bl)
printf(" попадает ");
else
printf(" не попадает ");
printf(" в кольцо с радиусами r1 = %.3f и r2 = %.3f ", r1, r2);
printf("\n и с центром (%.3f, %.3f) \n ", xc, yc);
}
/* Программа 5.3 – модификация программы 5.1 – демонстрирует применение оператора множественного выбора switch: вычисление n значений одной из функций в (3), указанной целым числом k (1, 2, 3), соответствующим порядковому номеру функции в выражении (3). */
#include <stdio.h>
#include <stdlib.h> // функция завершения выполнения программы exit(s)
#include <math.h>
main()
{ float x, fx, k;
int i, n;
< Вывод шапки результатов программы, см. программу 1 или 2 >
printf("\n Введите n и номер функции k (1, 2 или 3): ");
scanf("%d%d ", &n, &k);
printf("\n Введите %d значений x: ", n);
for (i = 0; i < n; i++)
{ scanf("%f", &x);
switch (k)
{ case 1: fx = pow(sin(x), 3); break;
case 2: fx = 1 + cos(x); break;
case 3: fx = x – M_PI; break;
default: { printf("\n Номер функции 1, 2 или 3 "); exit(0); }
}
printf("\n x = %10.3f f(x) = %15.3f ", x, fx);
} // Конец блока цикла for
} // Окончание программы 5.3
Вопросы и упражнения:
1. Как выбираются тестовые данные для алгоритмов и программ с разветвлениями вычислительного процесса?
2. Как записать в программе 5.1 оператор if, не используя else? Какой вариант программы «if - else» или «if» лучше и почему?
3. Как будут располагаться на экране результаты программы 5.1?
4. Модифицируйте программу 5.2 для обработки данных n точек.
5. Как изменится логическое выражение “bl = … ”в программе 5.2, если область фигуры ограничить левой половиной кольца и не учитывать точки, лежащие в третьем квадранте плоскости?
6. Как в программе 5.3 прервать цикл for при неправильном вводе k?
7. Составьте тесты для программы 5.3.