Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПО_ЛР_34.docx
Скачиваний:
1
Добавлен:
27.09.2019
Размер:
165.06 Кб
Скачать

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;

} /* конец программы */

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]