Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Язык Си. Лабораторные работы / Справочник. Часть 1 (СПбГУТ).doc
Скачиваний:
50
Добавлен:
10.09.2019
Размер:
949.25 Кб
Скачать

2.3.2. Циклы и разветвления

2.3.2.1. Разветвление до цикла

На практике в программах часто возникает необходимость в контроле корректности ввода пользователем исходных данных. В простейших случаях такой контроль можно осуществить с помощью разветвлений. Объединяя коды контроля с циклом, выполняющим основную обработку, получим структуру программы  “разветвление до цикла”. Приведём пример.

Постановка задачи.

Вычислить значение следующей суммы.

s =

В связи с тем, что вычисление этой суммы имеет смысл только при выполнении условия n1 ≤ n2, в программе следует предусмотреть контроль выполнения этого условия. В случае невыполнения этого условия осуществить обмен значений переменных n1 и n2.

Решение.

Отдельные компоненты решения данной задачи (обмен переменных и накопление суммы) уже рассматривались. Это позволяет привести его программный код без дополнительных пояснений.

#include<stdio.h> #include<conio.h> #include<math.h> int main(void) { int i,n1,n2 ; double s,t ; printf(“n1=”); scanf(“%d”, &n1); printf(“n2=”); scanf(“%d”, &n2); if (n1 < n2) { t = n1; n1 = n2; n2 = t; } s = 0; for(i = n1; i <= n2; i++) s += sqrt(i); printf(“Сумма для n1=%d и n2=%d равна %0.4g\n”, n1,n2,s); getch(); return 0; }

2.3.2.2. Разветвление внутри цикла

На практике часто используются циклы, в теле которых имеются разветвления. Рассмотрим ряд примеров.

Пример 1. Табулирование функции, имеющей несколько областей задания,

Постановка задачи.

Табулировать в “n” равноотстоящих точках функцию

от начального значения x = xn вплоть до конечного значения x = xk.

Решение.

Тело цикла должно содержать разветвление в связи с тем, что на каждом шаге цикла необходимо принимать решение по какой из двух расчётных формул следует выполнять вычисление значения функции.

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

#include<stdio.h> #include<conio.h> #include<math.h> int main(void) { int i,n; double x.xn.xk.dx.y ; printf(“Количество расчётных точек=”); scanf(“%d”, &n); printf(“Начальное значение аргумента=”); scanf(“%lf”, &xn); printf(“Конечное значение аргумента=”); scanf(“%lf”, &xk); printf(“%5s%10s%15s\n”,”НОМЕР”,”АРГУМЕНТ”,”ФУНКЦИЯ”); x = xn; dx = (xk - xn)/(n - 1); for(i = 1; i <= n; i++) { if(fabs(x) <= 2) y = x*x; else y = 4; printf(“%5d%15.4g%15.4g\n”, i, x, y); x += dx; } getch(); return 0; }

Пример 3. Счётчик. Операция счёта.

На практике часто используются циклы, в которых находят применение переменные, играющие роль счётчиков. Это имеет место в тех случаях, когда необходимо подсчитать количество объектов, удовлетворяющих некоторым условиям. В качестве таких объектов могут, например, выступать отсчёты табулируемой функции, цифры анализируемого целого числа.

Отметим общие элементы, характерные для решения подобных задач:

● необходимость введения целочисленной переменной, играющей роль счётчика (например, int count),

● организация цикла, содержащего ветвление; назначение разветвления  проверять указанное выше условие,

● для каждого шага цикла, для которого удовлетворяется условие, необходимо выполнять операцию счёта; операция счёта состоит в инкременте счётчика (count++),

● обнуление счётчика до входа в цикл.

Постановка задачи.

Функция y = x * sin(x) табулируется на отрезке [xn, xk] в n равноотстоящих точках. Определить количество положительных отсчетов функции.

Решение.

Модифицируем решение задачи табулирования. Уберем из программы элементы, связанные с построением таблицы. Введем дополнительную целочисленную переменную count, которая должна выполнять функции счетчика количества положительных отсчетов. Эта переменная должна быть обнулена при инициализации цикла. В теле цикла необходимо поместить сокращенную инструкцию if, предназначенную для управления счетчиком count. Ниже приводится решение рассматриваемой задачи.

#include<stdio.h> #include<conio.h> #include<math.h> int main(void) { int i,n, count; double x.xn.xk.dx.y ; printf(“Количество расчётных точек=”); scanf(“%d”, &n); printf(“Начальное значение аргумента=”); scanf(“%lf”, &xn); printf(“Конечное значение аргумента=”); scanf(“%lf”, &xk); count = 0; x = xn; dx = (xk - xn)/(n - 1); for(i = 1; i <= n; i++) { y = x * sin(x); if(y > 0) count++; x += dx; } printf(“Количество положительных отсчетов=%d\n”, count); getch(); return 0; }

Пример 4. Вычисление максимума (минимума). Переменная-максимум (минимум).

На практике часто встречается необходимость в определении максимального (минимального) значения некоторой величины. Эта задача решается с помощью введения специальной переменной, которую принято называть переменной - максимум (минимум). Введём следующие обозначения: x – анализируемая величина, x_max – переменная-максимум (x_min – переменная-минимум).

Для определения искомого максимума (минимума) следует организовать цикл, содержащий разветвление. В логике разветвления текущее значение x необходимо сравнивать с текущим значением величины x_max (x_min). В тех случаях, когда имеет место x > x_max (x < x_min), текущее значение переменной x_max (x_min) следует заменить с помощью оператора присваивания на значение x.

Постановка задачи.

Непустая последовательность из n действительных чисел вводится с клавиатуры. Требуется найти значение наибольшего числа в этой последовательности.

Решение.

При решении этой задачи возникают определенные сложности, связанные с инициализацией переменной – максимум x_ max. Один из возможных способов преодоления этих сложностей состоит в следующем. Ввод первого числа последовательности можно выполнить до начала работы цикла. Это позволит использовать его для инициализации переменной x_max. При этом начальное значение счетчика цикла i следует взять равным 2. Программа, предназначенная для решения рассматриваемой задачи, приведена ниже.

#include<stdio.h> #include<conio.h> int main(void) { int i, n;

double x, x_max; printf(“Количество вводимых чисел=”); scanf(“%d”, &n); printf(“Введите число=”); scanf(“%lf”, &x_max); for(i = 2; i <= n; i++) { printf(“Введите число=”); scanf(“%lf”, &x); if(x > x_max) x_max = x; } printf(“Значение наибольшего числа=%0.4g\n”, x_max); getch(); return 0;

}