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

5.3. Разработка текста программы

     Начинаем разработку текста программы с заголовка главной функции:

int main(void)

     Далее открывается тело функции, и в него включаются объявления переменных (см. п.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().

     Полный текст программы приведен ниже.

/****************************************************/

/* Лабораторная работа ╧7 */

/* Вычисление значений периодической функции */

/* Пример выполнения. Вариант ╧30. */

/****************************************************/

#include <stdio.h>

#include <math.h>

int main(void) {

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;

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