Главная Случайная страница Контакты | Мы поможем в написании вашей работы! | ||
|
Простейшими примерами применения операторов цикла на практике являются программы вычисления значений функций при изменяющихся значениях аргумента и вывода данных в виде таблиц с заголовками. В качестве аргумента обычно выступает
«Практикум по программированию на языке 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 = 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 будет следующим
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]);
}
Дата публикования: 2015-03-26; Прочитано: 206 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!