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

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

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


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

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

1)

floatX,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)

floatX,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 = X 1 X 0 +1, H

где

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

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

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

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

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

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

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

inti,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]);

}


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: