Лекция: Вычисление и вывод данных в виде таблицы

 

Простейшими примерами применения операторов цикла на практике являются программы вычисления значений функций при изменяющихся значениях аргумента и вывода данных в виде таблиц с заголовками. В качестве аргумента обычно выступает

 

«Практикум по программированию на языке C в среде VS C++»


 

переменная, изменяющаяся в цикле по требуемому закону. Она может быть как допол-нительным, так и основным параметром в циклах for, while и do while.

 

При работе с вещественными данными необходимо иметь в виду, что их значения могут представляться с ошибкой, что эти ошибки могут зависеть от типа переменных, накапливаться при выполнении арифметических операций и приводить к непредусмот-ренному программистом выполнению программы. Рассмотрим два фрагмента програм-мы вывода таблицы значений аргумента и функции, где аргумент — дополнительный па-раметр в цикле является вещественной переменной с именем Х:

 

1)

 

float X,H,Xk;//Все переменные типа float

 

.. .

 

X=0.0;

 

H=1.0/3.0; Xk=5.0/3.0;;//==1.6(6) while (X<=Xk)

 

{

 

printf("\n%6.2f %8.2f", X,sin(X)); X=X+H;

}

 

Результат выполнения:

 

0.0 0.00

 

0.33 0.33

 

0.67 0.62

 

1.0 0.84

 

1.33 0.97

 

2)

 

H=1.0/3.0; X=-H; Xk=5.0/3.0; do

 

{

 

X=X+H;

 

printf("\n%6.2f %8.2f", X,sin(X)); }while (X!=Xk);

 

«Практикум по программированию на языке C в среде VS C++»


 

Казалось бы, оба фрагмента выведут на экран таблицы значений синуса для аргу-мента Х, изменяющегося от 0 до 5/3 включительно с шагом 1/3. Но в действительности первый фрагмент не выведет значения 5/3 и sin(5/3), а второй не обеспечит завершение выполнения цикла при Х равном 5/3, так что цикл продолжит выполняться и при боль-ших значениях Х.

 

Во избежание подобных ситуаций следует вместо проверок вещественных данных на равенство использовать проверки на < (меньше) и/или > (больше) с некоторым доста-точно малым запасом, превышающим точность представления чисел данного типа и не нарушающим логику работы программы. Например, рассмотренные фрагменты про-граммы можно изменить так

1)

 

float X,H,Xk;//Все переменные типа float

 

.. .

 

X=0.0;

 

H=1.0/3.0;

 

Xk=5.0/3.0+H/2.0;

 

while (X<Xk) //и при Х=5.0/3.0 цикл будет выполнен.

 

{

 

printf("\n%6.2f %8.2f", X,sin(X)); X=X+H;

}

 

Результат выполнения:

 

0.0 0.00

 

0.33 0.33

 

0.67 0.62

 

1.0 0.84

 

1.33 0.97

 

1.67 1.00

 

2)

 

H=1.0/3.0; X=-H;

 

//Запас в H/2.0 больше ошибки

 

 

«Практикум по программированию на языке C в среде VS C++»


 

//представления вещественных чисел

 

Xk=5.0/3.0-H/2.0; do

 

{

 

X=X+H;

 

printf("\n%6.2f %8.2f", X,sin(X));

 

}while (X<Xk);//и выход из цикла будет, и будет //только при Х, равном 5.0/3.0, что больше Xk.

 

Результат выполнения будет таким же, как и для предыдущего фрагмента программы.

 

Рассмотрим решение этой же задачи вывода таблицы значений синуса, но при ис-пользовании оператора цикла for с параметром целого типа. Для этого потребуется за-ранее вычислить, сколько раз цикл должен выполняться, воспользовавшись формулой

 

N = X1−X 0+1, H

где

N – искомое число повторений цикла,

X0 и X1 – начальное и конечное значения аргумента, H – шаг изменения аргумента,

а cкобки ] [ в формуле обозначают округление.

Округление вещественного числа можно получить, добавив к нему 0,5 и приме-нив к результату библиотечную функцию ceil (она возвращает наименьшее целое, не меньшее аргумента), или вычев из него 0,5 и применив к результату библиотечную функцию floor (она возвращает наибольшее целое, не большее аргумента).

 

Дополним условие задачи требованием сохранения значений аргумента и функ-ции в массивах и вычисление очередного значения аргумента не методом накопления суммы, а умножением параметра цикла на шаг приращения аргумента. Так как в нашем случае Х0=0, Х1=5/3 и H=1/3, фрагмент программы с циклом for будет следующим

 

float X,H,Xk;//Все переменные типа float

 

float x[6], y[6];//Мссивы для сохранения значений //аргумента и функции

 

int i,N;

 

.. .

 

 

«Практикум по программированию на языке C в среде VS C++»


 

H=1.0/3.0;

 

//Вычисление количества повторений цикла

 

N=ceil(5.0/3.0/H-0.5)+1;//или так, //N=floor(5.0/3.0/H+0.5)+1;//или так for (i=0;i<N;i++)

 

{

 

X=i*H;

 

x[i]=X;

 

y[i]=sin(X);

 

printf("\n%6.2f %8.2f", X,y[i]);

 

}

 

еще рефераты
Еще работы по информатике