Алгоритмы с разветвлениями
Цель работы: изучение приемов программирования алгоритмов обработки данных с разветвлениями, выработка умений отладки и тестирования программ с условными операторами перехода, закрепление навыков программирования арифметических выражений и циклов с заданным числом повторений.
Задание: составить программу для вычисления 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.