- •Часть 1
- •1. Основы программирования на языке Си
- •1.1. Структура программы на языке Си.
- •1.2. Структура простейшей одномодульной программы
- •1.2.1. Комментарии в программе на языке Си
- •1.2.2. Начальные сведения о препроцессоре
- •1.2.3. Определение функции main().
- •1.2.4. Пример простейшей программы
- •1.3. Алфавит, синтаксис и семантика
- •1.4. Алфавит языка Си
- •1.5. Понятие о типе
- •1.6. Система типов языка Си
- •1.7. Понятие об объекте
- •1.8. Лексемы
- •1.9. Зарезервированные слова
- •1.10. Идентификаторы
- •1.11. Литералы
- •1.11.1. Целочисленные литералы
- •1.11.2. Литерал вещественного типа
- •1.11.3. Символьные литералы
- •1.11.4. Строковый литерал
- •1.12. Переменные
- •1.13. Символические константы в языке Си
- •1.14. Операторы, выражения и инструкции. Общие сведения.
- •1.14.1. Классификация операторов
- •1.14.2. Приоритет и ассоциативность операторов.
- •1.14.3. Побочные эффекты при вычислении выражений
- •1.14.4. Порядок вычисления выражений
- •1.15. Арифметические операторы и выражения
- •1.15.1. Унарные операторы
- •1.15.2. Бинарные операторы
- •1.15.3. Преобразования типа при выполнении бинарных операторов
- •1.15.3.1. Автоматическое преобразование типов
- •1.15.3.2. Явное преобразование типа
- •1.15.4. Математические функции
- •1.16. Оператор присваивания и инструкция присваивания
- •1.16.1. Простой оператор присваивания
- •1.16.2.Множественное присваивание
- •1.16.3. Составной оператор присваивания
- •1.16.4. Преобразование типа при присваивании
- •1.17. Начальные сведения об указателях. Выходные параметры функции
- •1.18. Принятие решений и логические величины. Операторы отношения и сравнения на равенство
- •1.18.1. Логические операторы
- •1.18.2. Поразрядные операторы
- •1.19. Условные выражения (оператор ?:)
- •1.20. Оператор запятая
- •1.21. Оператор sizeof
- •1.22.4. Инструкция return
- •1.23. Составная инструкция
- •1.24. Инструкция if else
- •1.24.1. Полная и сокращенная формы инструкции if
- •1.24.2. Вложенные инструкции if
- •1.25. Инструкция switch
- •1.25.1. Синтаксис инструкции switch
- •1.25.2. Использование инструкции switch
- •1.26. Функциональные компоненты цикла
- •1.27. Арифметические и итерационные циклы
- •1.27.1. Задачи, приводящие к арифметическим циклам
- •1.27.2. Задачи, приводящие к итерационным циклам
- •1.28. Циклические управляющие инструкции
- •1.29. Цикл, управляемый инструкцией for
- •2. Примеры решенных задач
- •2.1. Линейные вычислительные процессы
- •2.2. Организация разветвлений
- •2.2.1. Простейшие разветвления
- •2.2.2. Многовариантные разветвления
- •2.2.2.1. Использование переключателя switch
- •2.2.2.2. Использование вложенных инструкций if else if
- •2.2.2.3. Использование вложенных инструкций if ... If
- •2.2.2.4. Использование сокращённых форм инструкции if
- •2.2.3. Рекомендации по программированию
- •2.3. Организация циклов
- •2.3.1. Простые циклы
- •2.3.2. Циклы и разветвления
- •2.3.2.1. Разветвление до цикла
- •2.3.2.2. Разветвление внутри цикла
- •2.3.2.3. Разветвление после цикла
- •2.3.2.4. Циклы в ветвях разветвлений.
- •2.3.3. Рекомендации по программированию
- •Содержание
- •1. Основы программирования на языке Си
- •Литература
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;
}
