Лабы / C++.Ашарина / C_cicles / LAB_RAB1
.HTM
МОСКОВСКИЙ ИНСТИТУТ ЭЛЕКТРОННОЙ ТЕХНИКИ
(ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ)
Кафедра “Информатика и программное обеспечение вычислительных систем”
Учебная дисциплина “Информатика”
“УТВЕРЖДАЮ”
Зав. кафедрой ИПОВС
Шаньгин В.Ф.
Лабораторная работа
Разработка циклических программ на языке С.
Разработала:
к .т. н. Ашарина И.В.
МОСКВА - 1998
Цель работы: научиться составлять программы с использованием операторов цикла for, whilе, do-while.
Циклы в практике программирования – это повторяющиеся выполнения одних и тех же простых или составных операторов.
Оператор цикла for.
Оператор цикла for в С++ является универсальным, т. к. компоненты цикла могут быть произвольными выражениями.
Общая форма записи оператора цикла for имеет вид:
for(<инициализация управляющих переменных цикла>; <проверка на продолжение цикла>;
<инкремент/декремент управляющих переменных цикла>)<оператор>;
Оператор цикла for содержит три компонента, каждый из которых является необязательным. Первый компонент инициализирует управляющие переменные цикла. Второй частью цикла является условие, которое определяет, будет ли выполняться следующая итерация цикла. В последней части цикла происходит пошаговое увеличение и/или уменьшение значения управляющих переменных цикла.
1. Самый простой вариант использования цикла for очень похож на аналогичные операторы цикла в других языках программирования:
For (n=10; n<=10; n++) у=n * n;
Однако существует еще много других возможностей его применения.
2. Можно применять операцию уменьшения для счета в порядке убывания:
For (n=10; n=>0; n--)
printf(“%d секунд ! \n”, n);
printf(“пуск !
3. При желании можно вести счет двойками, десятками и т.д.
for (n=2; n<60; n=n+13)
printf ("%d \n", n );
Вместо выражения n=n+13 можно воспользоваться записью n+=13. Знак += определяет аддитивную операцию присваивания, в результате выполнения которой величина, стоящая справа, прибавляется к значению переменной, расположенной слева.
4. Можно вести подсчет с помощью символов, а не только чисел:
for(ch=’a’;ch<=’z’;ch++)
printf(“Величина кода ASCII для %c равна %d .\n”,ch,ch);
При выполнении этого оператора будут выведены на печать все буквы от а до z вместе с их АSСII-кодами.
5. Можно проверить выполнение некоторого произвольного условия, отличного от условия, полагаемого на число итераций:
for (num=1; num* num* num<=21б; num++)
printf (“%5d%5d\n”, num, num* num ' num);
Это целесообразно в том случае, когда более критично ограничение максимального значения, а не количества итераций.
6. Можно сделать так, чтобы значение некоторой величины возрастало в геометрической, а не в арифметической прогрессии, т.е. чтобы вместо прибавления фиксированного значения на каждом шаге цикла выполнялось умножение:
for (debt=100.0; debt<150.0; debt=debt*1.1)
printf ("Ваш долг теперь $%.2f.\n", debt);
Для выражения debt=debt*1.1 существует сокращенная запись: debt*=1.1, в которой знак *= определяет мультипликативную операцию присваивания, при выполнении которой значения переменой, расположенной слева, умножается на величину, стоящую справа.
7. В качестве третьего выражения можно использовать любое правильно составленное выражение. При этом его значение будет изменяться при каждой итерации:
for ( х=1; у<=75; у=5*х++10);
printf ("%10d %10d \n", х, у);
В спецификации цикла в данном примере проверяется значение у, а не х. В каждом из трех выражений, управляющих работой цикла for, могут использоваться любые переменные.
Следует отметить, что хотя приведенный пример правилен, он не может служить иллюстрацией хорошего стиля программирования.
8. В цикле for можно опустить одно или более выражений (но при этом нельзя опускать символы "точка с запятой"). Необходимо только включить в тело цикла несколько операторов, которые рано или поздно приведут к завершению его работы.
ans=2;
for ( n=3; ans<=25; )
ans=ans*n;
Тело следующего цикла
for( ; ; )
printf ("Мы написали бесконечный цикл \n");
будет выполняться "бесконечное" число раз, поскольку пустое условие всегда считается истинным.
Если в цикле оставлены пустыми все три компонента, как в последнем из приведенных случаев, то такой цикл называется открытым. Выход из такого цикла может осуществляться двумя способами:
8а. Оператор break служит для продолжения работы программы после окончания текущего цикла и используется, если после выхода из цикла for необходимо выполнить оставшуюся часть программы.
8б. Функция exit; объявленная в заголовочном файле STDLIB.H, позволяет выйти из программы. Эта функция используется в том случае, если нужно прекратить выполнение шагов цикла и выйти из программы.
В состав цикла for входит операция "запятая", которая увеличивает гибкость его использования, позволяя включать в его спецификацию несколько инициализирующих или корректирующих выражений.
Пример:
// почтовые тарифы
#define FIRST 20 // 20 центов за первую унцию веса
#define NEXT 17 // 17 центров за каждую следующую.
void ( )
{
int ounces,cost;
printf ("стоимость унции \n");
for(ounces=1, cost=FIRST; ounces<=16; ounces++,cost+= NEXT)
printf ("%Зd %7d \n", ounces, cost);
Здесь операция "запятая" используется в первом и третьем выражениях: в первом случае она позволяет инициализировать переменные ounces и cost; во втором – на каждой итерации увеличивать значение ounces на 1, а cost – на 17 (величину константы NEXT). Все вычисления осуществляются в спецификации цикла for.
Оператор цикла do-whilе.
В операторе цикла do-whilе условие повторения проверяется после каждого прохождения тела цикла, то есть цикл с постусловием. Следовательно, цикл do-whilе выполняется по крайней мере один раз. Этот цикл повторяется до тех пор, пока выполняется условие, проверяемое в конце цикла.
Форма его записи:
do {<оператор или группа операторов>}
while (условие);
Пример:
do { ch=getchar ( );
putchar(ch);
}
Оператор цикла while.
Оператор цикла while является еще одной разновидностью условного цикла, повторяющегося до тех пор, пока выполняется условие, проверяемое перед началом каждой итерации цикла. Таким образом - это цикл с предусловием (как и цикл for).
Форма записи:
while(условие) {последовательность операторов}
Пример:
Index=2;
While(index++<5) printf (“Желаю удачи! \n”);
Оператор continue.
Оператор continue позволяет выполнить переход на конец цикла и продолжить выполнение программы со следующей итерации цикла. Эта особенность языка программирования позволяет пропустить итерацию в цикле для некоторых случаев, которые, например, могут вызвать ошибки во время выполнения программы.
Форма записи:
<предложение начала цикла>
{<последовательность #1 операторов>
if (условие пропуска) continue;
<последовательность #2 операторов>
} <предложение конца цикла>
Пример:
double x,y;
for( int i=-10; i<11; i++)
{
x=i;
if(i==1)
continue;
y=1/sqrt(x*x-1);
printf(“1/sqrt(%d%d1) = %d, “ x, x, y);
}
Оператор выхода из цикла break.
Для обеспечения выхода из цикла в С++ используется оператор break, даже если цикл не является открытым.
Форма записи:
<предложение начала цикла>
{<последовательность #1 операторо>
if (условие выхода из цикла)
break;
<последовательность #2 операторов>
} <предложение конца цикла>
<последовательность #3 операторов>
Пример:
//вычисление факториала
factorial=1;
for(int i=1; ; i++)
{ if (i>n)
break;
factorial*=(double)i;
}
Стандартные математические функции.
Наиболее распространенными и часто употребляемыми являются бинарные арифметические операторы +, -, *, /, и % (определение остатка от целочисленного деления).
Операция Тип операнда #1 Тип операнда #2 Тип результата +,- Int Int Int +,- Float Float Float +,- Int Float Float +,- Float Int Float * Int Int Int * Int Float Float * Float Int Float * Float Float Float / Int Int Int / Float Int Float / Int Float Float / Float Float Float % Int Int Int
Если операнды оператора принадлежат к разным типам, то они приводятся к некоторому общему типу по следующим правилам:
Автоматически производятся преобразования, которые без каких –либо потерь переводят операнды с меньшим диапазоном значений, например, при преобразовании целого в вещественное в выражении вида f+i.
Выражения, в которых возможна потеря информации, например, при присваивании вещественных значений целым переменным или при преобразовании длинных типов в более короткие, сопровождаются предупреждениями (warning), но допустимы.
Стандартные математические функции.
Функция Наименование Тип аргументов Тип результата sin(x) синус x (long)double (long)double cos(x) косинус x (long)double (long)double tan(x) тангенс x (long)double (long)double asin(x) арксинус x (long)double (long)double acos(x) арккосинус x (long)double (long)double atan(x) арктангенс x (long)double (long)double exp(x) экспонента x (long)double (long)double log(x) натуральный логарифм x (long)double (long)double log10(x) десятичный логарифм x (long)double (long)double pow(x,y) x в степени y (long)double,
double (long)double sqrt(x) квадратный корень из x (long)double (long)double abs(x) абсолютное значение x int int fabs(x) абсолютное значение x (long)double (long)double
Вычисление значения с заданной точностью методом прямоугольников.
Для вычисления первого приближения интеграла разделим отрезок [a, b] на n равных частей (n=4), определим значения x i = a + h i – h / 2; h = ( b – a ) / n.
Вычислим площадь S i = h * f ( x i ). Сумма S i площадей этих прямоугольников является приближенным значением интеграла:
Однако одно приближение не позволяет оценить точность, с которой вычислено значение интеграла, необходимо найти второе приближение. Для этого увеличим n в два раза, то есть n=2n. Аналогично S1 найдем S2:
Требуется вычислить значение интеграла с точностью z , поэтому проверим условие |S1-S2|<z . Если условие выполняется, то S2 принимается за искомое значение интеграла; если не выполняется, то последнее выполненное значение S2 считается предыдущим, то есть S1= S2. После этого удвоим число точек деления отрезка и вычислим новое значение S2. Процесс удвоение n и вычисление S2 будем продолжать до тех пор, пока модуль разности S1 и S2 не станет меньше z .
Вычисление по формуле Симпсона.
Вычисление интеграла по формуле Симпсона определяется путем деления отрезка [ a, b ] на множество более мелких отрезков.
Формула Симпсона имеет вид:
Здесь N – четное число делений интервала интегрирования: x i = a + i ( b – a ) / N.
Алгоритм состоит в циклическом выполнении расчетов f ( x i ). При этом следует отдельно рассмотреть случаи для границ интегрирования f ( a ) и f ( b ) и учесть, что при нечетном номере вычисляемого элемента, значение функции умножается на 4, при четном – на 2. При конечных значениях отрезка умножение не производится.
Вычисление с заданной точностью z корня уравнения F(x)=0 методом итераций.
Пусть корень уравнения находится на отрезке [ a, b ].
Для использования метода итераций исходное уравнение F(x)=0 нужно привести к виду x=f(x). Если известно начальное приближение к корню х=х1, то подставив его в правую часть уравнения х=f(x), получим новое приближение x3=f(x2),……..xk+1=f(xk).
Итерационный процесс сходится к корню уравнения, если |f ‘(x)|<1 на отрезке, содержащем корень уравнения. Если выполняется неравенство –1<f ‘(x)<0, то корень уравнения всегда находится на отрезке [xk, xk+1] и условие окончания итерационного процесса имеет вид неравенства |xk+1-xk|<z .
Переход от уравнения F(х)=0 к уравнению f(х) можно осуществить следующим образом. Умножим левую и правую части уравнения F(х)=0 на произвольную константу h и добавим к обеим частям уравнения неизвестное х. Эти действия не изменяют корней уравнения:
h F(х) +х=О*h+х
h F(х) +х=х
Обозначив f(х) =h f(х) +х, перейдем к уравнению х=f(х).
Величину h желательно выбрать такой, чтобы выполнялось неравенство –1<f '(х)<0 на отрезке, содержащем корень уравнения.
Исходными данными для программы, соответствующей приведенному алгоритму, является грубое значение корня и точность вычисления. Условием выхода из итерационного процесса является неравенство |хk+1-хk]<z , при этом искомым значением является хk+1.
Решить уравнение f(x)=0 с заданной точностью z методом деления отрезка пополам.
Метод деления отрезка пополам заключается в следующем.. Проверяется наличие корня на отрезке [а, b]. Для этого вычисляются значения функции f(а) и f(b) . Если f(а)*f(b) > 0, то уравнение не имеет корней на заданном отрезке. Если f(а) * f(b) < 0, т. е. на концах отрезка [а, b] функция f(х) имеет противоположные знаки, то искомый корень лежит на этом отрезке. Поиск корня происходит следующим образом. Находим в точке а значение функции у1=f(а). Затем определяем значение х как среднюю точку между а и b, вычисляем значения у2=f(х). Теперь, если f(а) * f(х) > 0, то корень находится на отрезке [a, b]. Переместим точку а вправо, выполнив присвоение а=х. В противном случае нужно перемещать влево точку b: b=х. Таким образом получим второй отрезок [а, b], но вдвое меньше предыдущего. Процесс деления отрезка пополам продолжается до тех пор, пока отрезок [а, b] не станет меньше заданной точности.
Требования к отчету.
Отчет должен содержать:
наименование и цель работы;
схему алгоритма;
краткие теоретические сведения;
текст программы для варианта задания, соответствующего номеру фамилии студента в группе (если студент закреплен за определенной ЭВМ, то – номеру ЭВМ);
результаты выполнения программ.
Контрольные вопросы.
1.Каким образом цикл whilе может имитировать цикл for?
2.Каким образом цикл while может имитировать цикл do- while?
З.В каких случаях используются операторы break, continue, exit?
4.Почему в языке С (и С++) нет необходимости использовать оператор goto?
Варианты заданий.
Задание 1. Даны х и точность вычисления Eps. Вычислить сумму с заданной точностью.
№ варианта З А Д А Н И Е 1,16
2,17
3,18
4,19
5,20
6,21
7,22
8,23
9,24
10,25
11,26
12,27
13,28
14,29
15,30
Задние 2.
№ варианта З А Д А Н И Е 1,16 Методом деления отрезка пополам и методом итераций найти приближенное значение корня уравнения х + ln(x+0.5)-0.5=0 на интервале[0,2]. Абсолютная погрешность не превышает 10-5. Сравнить методы вычисления. 2,17 Методом деления отрезка пополам и методом итераций найти приближенное значение корня уравнения 2х3 + 4x -1=0 на интервале[0, 0.5]. Абсолютная погрешность не превышает 10-4. Сравнить методы вычисления. 3,18 Методом деления отрезка пополам и методом итераций найти приближенное значение корня уравнения 1/х = ышт(x) на интервале[0,2]. Абсолютная погрешность не превышает 10-4. Сравнить методы вычисления. 4,19 По формуле Симпсона и методом прямоугольников вычислить приближенное значение интеграла. Точность не превышает 10-3.
Сравнить методы вычисления. 5,20 Методом деления отрезка пополам и методом итераций найти приближенное значение корня уравнения х4 + 2x3 –х-1=0 на интервале[0, 1]. Абсолютная погрешность не превышает 0.00015. Сравнить методы вычисления. 6,21 Методом деления отрезка пополам и методом итераций найти приближенное значение корня уравнения х3 + 12x –2=0 на интервале[0.5, 1]. Абсолютная погрешность не превышает 0.00015. Сравнить методы вычисления. 7,22 По формуле Симпсона и методом прямоугольников вычислить приближенное значение интеграла. Точность не превышает 10-3.
Сравнить методы вычисления. 8,23 Методом деления отрезка пополам и методом итераций найти приближенное значение корня уравнения х5 - x –0.2=0 на интервале[0.9, 1.1]. Абсолютная погрешность не превышает 0.0001. Сравнить методы вычисления. 9,24 Методом деления отрезка пополам и методом итераций найти приближенное значение корня уравнения 5х + 8lnx –1=0 на интервале[4, 5]. Абсолютная погрешность не превышает 0.0015. Сравнить методы вычисления. 10,25 По формуле Симпсона и методом прямоугольников вычислить приближенное значение интеграла. Точность не превышает 10-3.
Сравнить методы вычисления. 11,26 Методом деления отрезка пополам и методом итераций найти приближенное значение корня уравнения x + 8lnx –1=0 на интервале[2.1, 2.2]. Абсолютная погрешность не превышает 0.001. Сравнить методы вычисления. 12,27 Методом деления отрезка пополам и методом итераций найти приближенное значение корня уравнения х2 + x2 –3=0 на интервале[0.5, 1.5]. Абсолютная погрешность не превышает 0.00001. Сравнить методы вычисления. 13,28 По формуле Симпсона и методом прямоугольников вычислить приближенное значение интеграла. Точность не превышает 10-3.
Сравнить методы вычисления. 14,29 По формуле Симпсона и методом прямоугольников вычислить приближенное значение интеграла. Точность не превышает 10-3.
Сравнить методы вычисления. 15,30 По формуле Симпсона и методом прямоугольников вычислить приближенное значение интеграла. Точность не превышает 10-3.
Сравнить методы вычисления.