Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Материалы для подготовки к экзамену по ОП.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
297.52 Кб
Скачать

Цикл for

Одним из самых используемых является цикл со счётчиком for. Его синтаксис

for (<инициализация>; <условие продолжения>; <изменение счётчика>){

<тело цикла>

}

Например, выведем квадраты первых ста чисел.

int i;

for (i = 1; i < 101; i++) {

printf("%d ", i*i);

}

Одним из замечательных моментов цикла for является то, что он может работать не только с целыми числами.

float num;

for (num = 5.3f; num > 0f; num -= 0.2) {

printf("%.2f ", num);

}

Этот цикл выведет числа от 5.3 до 0.1. Цикл for может не иметь некоторых "блоков" кода, например, может отсутствовать инициализация, проверка (тогда цикл становится бесконечным) или изменение счётчика. Вот пример с интегралом, реализованный с применением счётчика for.

#include<conio.h>

#include<stdio.h>

int main() {

double sum = 0.0;

double a = 0.0;

double b = 1.0;

double h = 0.01;

double x;

for (x = a; x < b; x += h) {

sum += x*x * h;

}

printf("%.3f", sum);

getch();

}

Давайте рассмотрим кусок кода

double x ;

for (x = a; x < b; x += h) {

sum += x*x * h;

}

Его можно изменить так

double x = a;

for (; x < b; x+=h) {

sum += x*x*h;

}

Более того, используя оператор break, можно убрать условие и написать

double x;

for (x = a;; x += h){

if (x>b){

break;

}

sum += x*x*h;

}

или так

double x = a;

for (;;){

if (x > b){

break;

}

sum += x*x*h;

x += h;

}

кроме того, используя оператор ",", можно часть действий перенести

double x ;

for (x = a; x < b; x += h, sum += x*x*h) ;

Но, Это ухудшает читаемость кода и приводит к трудноуловимым ошибкам.

Давайте решим какую-нибудь практическую задачу посложнее. Пусть у нас имеется функция f(x). Найдём максимум её производной на отрезке. Как найти производную функции численно? Очевидно, по определению. Производная функции в точке - это тангенс угла наклона касательной.

Возьмём точку на кривой с координатами (x; f(x)), сдвинемся на шаг h вперёд, получим точку (x+h, f(x+h)), тогда производная будет

dy / dx = [ f( x + h ) – f(x) ]/ ( x + h - x ) = tg( α )

То есть, отношение малого приращения функции к малому приращению аргумента. Почему мы двигаемся вперёд по функции, а не назад. Ну, пойдёмте назад сути это не изменит.

dy / dx = [f(x) – f(x - h)]/(x - x + h) = tg(β)

Возьмём среднее от этих двух значений, получим

[ f(x + h) – f(x - h) ]/(2∙h) = tg(β)

В общем-то теперь задача становится тривиальной: идём от точки a до точки b и находим максимальное значение производной, а также точку, в которой производная принимает это значение. Для решения нам понадобятся, как и в задаче с интегралом, переменные для границ области поиска a и b, текущее значение x и шаг h. Кроме того, необходимо максимальное значение maxVal и координата maxX этого максимального значения. Для работы возьмём функцию

x∙sin(x)

#include<conio.h>

#include<math.h>

#include<stdio.h>

int main() {

double a = 0;

double b = 3.0;

double h = 0.001;

double h2 = h * 2.0;

double maxVal = a*sin(a);

double maxX = a;

double curVal;

double x;

// Проходим по всей области от a до b

// и ищем максимум первой производной

// Используем функцию x*sin(x)

for (x = a; x < b; x += h) {

curVal = ( (x+h)*sin(x+h)-(x-h)*sin(x-h) )/h2;

if (curVal > maxVal) {

maxVal = curVal;

maxX = x;

}

}

printf("max value = %.3f at %.3f", maxVal, maxX);

getch();

}

На выходе программа выдаёт max value = 1.391 at 1.077

Численное решение даёт такие же (с точностью до погрешности) результаты, что и наша программа.