- •Лабораторная работа № 34
- •5.1.2. Вычисление функции на отрезке 0 - 1
- •5.1.3. Вычисление функции на отрезке 1 - 3
- •5.1.4. Вычисление функции на отрезке 3 - 4
- •5.1.5. Алгоритм вывода результатов в псевдографической форме
- •5.1.6. Схема алгоритма
- •5.2. Определение переменных программы
- •5.3. Разработка текста программы
- •5.4. Отладка программы
- •5.5. Результаты работы программы
- •5.6. Выводы
5.1.6. Схема алгоритма
Схема алгоритма показана на рисунке ниже.
5.2. Определение переменных программы
Для реализации алгоритма понадобятся такие переменные:
n - параметр внешнего цикла, для него достаточно короткого целого значения:
short n;
x - параметр внутреннего цикла и одновременно - текущее значение абсциссы графика. Хотя его точность невелика, объявим его как double, в соответствии с общим стилем программирования на С.
double x;
y - текущее значение ординаты графика:
double y;
h - смещение в строке символа, который означает точку графика. Поскольку смещение не может превышать 80 (размер строки экрана), для этой переменной достаточно будет короткого целого:
hort h;
5.3. Разработка текста программы
Начинаем разработку текста программы с заголовка главной функции:
int main()
Далее открывается тело функции, и в него включаются объявления переменных (см. п.5.2).
Кодовая часть программы начинается в соответствии со схемой алгоритма (блок 2) оператором-заголовком внешнего цикла. Это типичный цикл со счетчиком, он реализуется оператором:
for (n=0; n<5; n++) {
Так как в теле цикла содержится несколько отдельных действий, значит, будет несколько операторов, тело цикла берется в операторные скобки.
В теле цикла прежде всего печатается заголовок таблицы (блок 3) операторами:
printf("| X | Y |\n");
printf("|------------|------------|\n");
После этого открываем внутренний цикл (блок 4). Параметр этого цикла - значение абсциссы x - принимает значения от 0 до 3.75 с шагом 0.25:
for (x=0; x<4; x+=0.25) {
Блок 5 схемы алгоритма (проверка попадания на первый отрезок) реализуется условным оператором:
if (x<1)
В случае выполнения этого условия, значение абсциссы вычисляется (блок 7) по уравнению для первой прямой:
y=2*x-1;
Если же предыдущее условие не выполняется, блок 6 схемы алгоритма (проверка попадания на второй отрезок) реализуется условным оператором:
else if (x<3)
В случае выполнения этого условия, значение абсциссы вычисляется (блок 8) по уравнению для полуокружности:
y=1-sqrt(1-(x-2)*(x-2));
В этом выражении для возведения в степень 2 применяется умножение. Функция sqrt() описана в файле math.h, так что включаем этот файл в начало программы:
#include <math.h>
Если же и это условие не выполняется, то мы имеем попадание на третий отрезок, и значение абсциссы вычисляется (блок 9) по уравнению для второй прямой:
else y=7-2*x;
Во внутреннем цикле мы выполняем вычисления для одного периода функции, но внешний цикл выполняется у нас 5 раз. Реальное значение абсциссы с учетом внешнего цикла составляет x+4n. Теперь, когда мы имеем абсциссу и ординату графика, можем выводить строку выходных данных (блок 10). Сперва выводим строку таблицы:
printf("| %5.2lf | %10.7lf | ",x+n*4,y);
Спецификации формата подобраны таким образом, чтобы значения x и y выводились в два столбца. Числовые параметры спецификации %lf должны обеспечить представление значений x и y с достаточной точностью. Функция printf() описана в файле stdio.h, поэтому мы включаем этот файл в начало программы:
#include <stdio.h>
Следующий шаг - вывод в той же строку точки графика. После вывода строки таблицы в строке экрана осталось 57 свободных знакомест. На этом пространстве нам нужно показать значения y от -1 до +1. Если мы возьмем коэффициент масштабирования 10, то амплитуда графика составит 20 знакомест - достаточно для наглядного его представления. Масштабирование значения ординаты выполняется оператором:
h=(y+1)*10;
Выбранное значение коэффициента масштабирования - 10 - может быть изменено при отладке).
При выполнении последнего оператора мы теряем дробную часть. Поскольку среди библиотечных функций языка C нет функции точного округления, мы выполняем такое округление сами:
if (y-1-h*10>0.5) h++;
Далее в строку экрана выводится (блоки 12-13) требуемое количество пробелов. В следующем цикле полученное ранее значение h работает как счетчик на вычитание.
for (; h>0; h--) printf(" ");
а потом выводится символ '*' и происходит переход на новую строку экрана:
printf("*\n");
На этом заканчивается внутренний цикл.
После выхода из внутреннего цикла мы выводим сообщение оператору:
printf("Нажмите клавишу Enter...");
И ждем нажатия клавиши:
getchar();
На этом закрывается внешний цикл, а потом и тело функции main().
Полный текст программы приведен ниже.
/****************************************************/
/* Лабораторная работа N34 */
/* Вычисление значений периодической функции */
/* Пример выполнения. Вариант ╧30. */
/****************************************************/
#include <stdio.h>
#include <math.h>
int main() {
short n; /* параметр внешнего цикла */
double x, y; /* абсцисса и ордината графика */
short h; /* позиция точки на экране */
/* внешний цикл - для 5 периодов */
for (n=0; n<5; n++) {
/* вывод заголовка таблицы */
printf("| x | y |\n");
printf("|-------|------------|\n");
/* внутренний цикл для одного периода */
for (x=0; x<4; x+=0.25) {
/* 1-й отрезок */
if (x<1) y=2*x-1;
/* 2-й отрезок */
else if (x<3) y=1-sqrt(1-(x-2)*(x-2));
/* 3-й отрезок */
else y=7-2*x;
/* вывод строки таблицы */
printf("| %5.2lf | %10.7lf |",x+n*4,y);
/* определение позиции точки */
h=(y+1)*10;
if (y-1-h*10>0.5) h++;
/* вывод точки графика */
for (; h>0; h--) printf(" ");
printf("*\n");
} /* конец внутреннего цикла */
/* пауза до команды оператора */
printf("Нажмите клавишу Enter...");
getchar();
} /* конец внешнего цикла */
return 0;
} /* конец программы */