Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Определение переменных программы




Для реализации алгоритма понадобятся такие переменные:

n - параметр внешнего цикла, для него достаточно короткого целого значения:

short n;

x - параметр внутреннего цикла и одновременно - текущее значение абсциссы графика. Хотя его точность невелика, объявим его как double, в соответствии с общим стилем программирования на С.

double x;

y - текущее значение ординаты графика:

double y;

h - смещение в строке символа, который означает точку графика. Поскольку смещение не может превышать 80 (размер строки экрана), для этой переменной достаточно будет короткого целого:

short h;

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

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

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;} /* конец программы */







Отладка программы

Форма вывода в приведенной программе такая, что нет настоятельной необходимости применять при отладке пошаговый режим. Однако логический план отладки следует составить поэтапным:

  • убедиться в правильной организации внешнего и внутреннего циклов;
  • убедиться в правильной работе цепочки условий, которые определяют отрезок;
  • убедиться в правильном вычислении значения ординаты на первом отрезке (только по числовым значениям);
  • на примере первого отрезка убедиться в правильном выводе графика;
  • убедиться в правильном вычислении значения ординаты на втором отрезке;
  • убедиться в правильном вычислении значения ординаты на третьем отрезке.

Результаты работы программы

Мы приводим только часть результатов, полученных на экране при работе программы (для одного периода функции). Остальные результаты повторяют приведенные с другими значениями x.

| x | y ||-------|------------|| 0.00 | -1.0000000 |*| 0.25 | -0.5000000 | *| 0.50 | 0.0000000 |     *| 0.75 | 0.5000000 |          *| 1.00 | 1.0000000 |               *| 1.25 | 0.3385622 |        *| 1.50 | 0.1339746 |      *| 1.75 | 0.0317542 |     *| 2.00 | 0.0000000 |     *| 2.25 | 0.0317542 |     *| 2.50 |  0.1339746 |      *| 2.75 | 0.3385622 |        *| 3.00 | 1.0000000 |               *| 3.25 | 0.5000000 |          *| 3.50 | 0.0000000 |     *| 3.75 | -0.5000000 | *Нажмите клавишу Enter.... . .

Выводы

При выполнении лабораторной работы изучены вопросы:

  • составления циклических алгоритмов с вложенными циклами и разветвлениями в теле цикла;
  • организации наглядного вывода информации в текстовом режиме;
  • программной реализации циклических алгоритмов;
  • отладки программ, содержащих циклические алгоритмы.

 










Последнее изменение этой страницы: 2018-05-10; просмотров: 258.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...