Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
20
Добавлен:
17.04.2013
Размер:
50.06 Кб
Скачать

МОСКОВСКИЙ ИНСТИТУТ ЭЛЕКТРОННОЙ ТЕХНИКИ

(ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ)

 

 

 

 

Кафедра “Информатика и программное обеспечение вычислительных систем”

Учебная дисциплина “Информатика”

 

 

 

 

 

 

“УТВЕРЖДАЮ”

Зав. кафедрой ИПОВС

Шаньгин В.Ф.

 

 

Лабораторная работа

Разработка циклических программ на языке С.

 

 

 

 

 

Разработала:

к .т. н. Ашарина И.В.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

МОСКВА - 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.

Сравнить методы вычисления.

Соседние файлы в папке C_cicles