Алгоритмы с разветвлениями

Цель работы: изучение приемов программирования алгоритмов обработки данных с разветвлениями, выработка умений отладки и тестирования программ с условными операторами перехода, закрепление навыков программирования арифметических выражений и циклов с заданным числом повторений.

Алгоритмы с разветвлениями - student2.ru Задание: составить программу для вычисления 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.

Наши рекомендации