Начинаем разработку текста программы с заголовка главной функции main():
int main(void)
Далее открывается тело функции, и в него включаются определения переменных (см. п.5.2). Определения переменных реализуют блок 2 блок-схемы алгоритма. В дополнение к переменным, определенным в схеме алгоритма, объявляем рабочую переменную dbln и константу eps. Поскольку правила языка C позволяют присваивать переменным начальные значения, в объявлении переменных отчасти реализован также и блок 3. Блоки 4–9 схемы алгоритма образуют цикл. В языке С есть два "простых" оператора цикла: цикл с предусловием — whіle и цикл с постусловием — do-whіle. Но по схеме алгоритма видно, что выход из цикла происходит в середине тела цикла (блок 5): после вычисления члена ряда, но до добавления его значения к сумме. Следовательно, "простые" циклы применить нельзя. "Сложный" оператор цикла— for — является циклом с предусловием, но задавать условие в самом операторе цикла необязательно. К тому же этот оператор дает возможность определить действия, которые нужно выполнить до начала цикла и действия, которые выполняются в конце каждой итерации. Таким образом, открытие цикла будет иметь вид:
for (n=0;; n++, k2*=2, k1=-k1) {
где первый параметр for — присваивание начального значения переменной n (остаток блока 3), второй параметр — условие выхода из цикла — пустой, третий параметр реализует блок 8 схемы алгоритма. В теле цикла содержится несколько отдельных действий, значит, будет несколько операторов, поэтому тело цикла берется в операторные скобки.
В теле цикла первый оператор: dbln=n;
это действие не предусмотрено в схеме алгоритма, но его необходимость пояснили в п.5.2.
Далеевычисляется значениетекущего члена ряда:
term=k1*(dbln+1)/(dbln*dbln+k2);
этот оператор полностью реализует блок 4 и формулу из индивидуального задания (учитывая пп.5.1.2, 5.1.3) за исключением того, что вместо операции возведения в степень 2 применяем умножение.
Следующее действие — проверка достижения предела точности — на схеме алгоритма представлена блоком 5 и выполняется условным оператором, который начинается с:
if (fabs(term)>=eps)
Следует отметить, что сравнивается абсолютное значение term, а функция для получения абсолютного значения переменной типа double — fabs(). Эта функция описана в файле math.h, так что нужно включить этот файл в начало программы:
#іnclude <math.h>
Продолжение условного оператора, действие, которое выполняется при выполнении условия, — добавление значения члена к сумме (блок 6):
sum+=term;
При невыполнении условия нужно выйти из цикла, так что условный оператор требует и второй части:
else break;
По схеме алгоритма надо проверить, не достигла ли переменная n значения 9 (блок 7), и, если да, — печатать значение суммы (блок 8). Это реализуется условным оператором:
if (n==9) printf("Сумма 10 членов ряда=%10.7lf\n",sum);
Поскольку при невыполнении условия не делается ничего, часть else для этого оператора не нужна.
При вызове функции всегда возникает проблема форматизации вывода. включили в формат текст, который поясняет вывод, а значение переменной sum выводим по спецификации %10.7lf. Тип спецификации соответствует типу переменной — double, а числовые параметры выбрали произвольно, поскольку в задании не оговорены требования к точности вывода. Перед точкой оставляем 2 позиции — для знака и целой части (которая должна быть 0), после точки — 7 позиций, что на 1 превышает точность заданного предела точности. Функция prіntf() описана в файле stdіo.h, поэтому включаем этот файл вначало программы:
#include <stdio.h>
Поскольку блок 9 схеми алгоритма реализован нами в заголовке цикла, то цикл на этом заканчивается, и ставим операторную скобку, закрывающую тело цикла.
Выход из цикла происходит по оператору break в составе условного оператора. После выхода из цикла должны напечатать окончательное значение суммы (блок 10), что и делаем оператором:
prіntf("Повна сума ряду = %10.7lf\n",sum);
При определении формата вывода работают те же соображения, что и в предыдущем случае. Реализация алгоритма закончена, ставим операторную скобку, которая закрывает тело функции maіn().
Полный текст программы приведен ниже.
#include <stdio.h>#include <math.h>int main(void) {longn; /* параметрряда */double dbln; /* параметр рядав форме с плавающей точокй */ double sum=0; /* сумма членов ряда */ double term; /* значениетекущего члена */constdouble eps=0.000001; /* пределточности */long k2=1; /* pow(2,n)*/short k1=1; /* pow(-1,n)*/ /* основной цикл; в модификациях выисляются следующиезначения pow(2,n) и pow(-1,n)*/ for (n=0;; n++, k2*=2, k1=-k1) { /* преобразование n в форму с плавающей точкой */ dbln=n; /* вычислениеочередного члена */ term=k1*(dbln+1)/(dbln*dbln+k2); /* проверкадостиженияпределаточности */ if (fabs(term)>=eps) /* если не досягнут - накопление суммы */ sum+=term; /* если досягнут - выход из цикла */ else break; /* если 10 членов - вывод суммы */ if (n==9) printf("Сумма 10 членовряда = %10.7lf\n",sum); } /* конец основного цикла */ /* вывод окончательной суммы */ printf("Полная сумма ряда = %10.7lf\n",sum); return 0;}Отладка программы
При отладке программы целесообразно использовать пошаговый режим с отслеживанием значений переменных — прежде всего: n, term, sum. Следует выполнить шаг за шагом несколько итераций цикла, убеждаясь, что эти переменные получают правильные значения. В таком режиме нетрудно выполнить 10 итераций и убедиться в правильном формировании первого результата. Если возникают ошибки при вычислении наиболее сложного выражения в программе:
term=k1*(dbln+1)/(dbln*dbln+k2);
можно включить в программу временные дополнительные переменные и разбить выражение на простые составляющие, проверяя на шаг за шагом значения этих переменных. Например:
double temp1, temp2; /* временныепеременные */...temp1=dbln+1;temp2=dbln*dbln;temp2=temp2+k2;temp1=temp1/temp2;term=k1*temp1;Для того, чтобы убедиться в правильном выводе второго результата, имеет смысл при отладке выводить вместе с суммой и номер итерации, на котором закончилась робота цикла, и значение члена ряда, которое оказалось меньше предела точности:
printf("%ld %10.7lf\n",n,term);
Лабораторная работа №5
Работа с матрицами
1. Цель работы
2. Темы для предварительной проработки
3. Задание
4. Варианты индивидуальных заданий
5. Пример решения задачи
5.1. Разработка алгоритма решения
5.2. Определение переменных программы
5.3. Разработка текста программы
5.4. Отладка программы
Цель работы
Целью лабораторной работы является получение практических навыков в работе с матрицами в языке C.