Листинг 10 — Пример использования математических функций
/* rasst. c – пример использования математических функций */ #include <stdio. h> // scanf(), printf() #include <locale. h> #include <math. h> // sqrt(), pow() int main() { float x1, y1, x2, y2; // координаты двух точек float d; // расстояние между точками setlocale(LC_ALL, “”); // запрос на ввод координат первой точки printf("Введите координаты первой точки: "); // ввод с клавиатуры двух вещественных чисел scanf("%f %f", &x1, &y1); // запрос на ввод координат второй точки printf("Введите координаты второй точки: "); // ввод с клавиатуры двух вещественных чисел scanf("%f %f", &x2, &y2); /* расчет расстояния между точками sqrt() - функция извлечения квадратного корня pow() - функция возведения в степень */ d = sqrt(pow(x2 - x1, 2) + pow(y2 - y1,2)); // вывод результатов расчета printf("Расстояние между (%+.1f, %+.1f) и \ (%+.1f, %+.1f) равно %.3f\n", x1, y1, x2, y2, d); getch(); return 0; } |
Результаты выполнения программы rasst. c представлены на рисунке 25. Координаты точек при запросе оператором scanf могут быть введены через пробел или нажатием клавиши ENTER после ввода каждого числа.

Рисунок 25 — Результат выполнения программы rasst. c
14 Управляющие структуры
Управляющие структуры или операторы управления служат для управления последовательностью действий в программе. Операторы ветвления и цикла позволяют переходить к выполнению другой части программы или выполнять какую-то часть программы многократно, пока удовлетворяется одно или более условий.
Для реализации управляющих структур используются логические выражения. Как уже отмечалось выше, логическое выражение в качестве результата вырабатывает значение типа int (истина = 1, ложь = 0).
14.1 Операторы ветвления
К операторам ветвления в Си относятся if (if — если), if else (else — иначе), тренарный оператор?:, switch (switch — переключить, case — случай). Ниже приведен общий вид операторов ветвления.
if (logical_expression) statement; |
Если значение логического выражения истинно, то выполняется оператор statement, иначе следующий за if оператор.
if (logical_expression) statement_1; else statement_2; |
Если значение логического выражения истинно, то выполняется оператор statement_1, иначе выполняется оператор statement_2.
(logical_expression) ? (expression_1) : (expression_2); |
Если значение логического выражения истинно, то вычисляется выражение expression_1, иначе вычисляется выражение expression_2.
switch (integer_expression) { case value_1: statements_1; break; ... case value_n: statements_n; break; default: statements_n+1; } |
Если значение выражение совпадает с одним из значений ветвей case, то производится выполнения последовательности операторов данной ветви до тех пор, пока не встретится оператор break. Ветка default (значение по умолчанию) выполняется, если ни одно из значений case не равно значению выражения. Ветку default можно не описывать.
Листинг 11 — Использование операторов ветвления
/* branch. c – пример использования операторов ветвления */ #include <stdio. h> #include <locale. h> #include <conio. h> int main() { float a1, a2, m; setlocale(LC_ALL, “”); printf(“Введите два числа: ”); scanf(“%f %f”, &a1, &a2); if (a2 != 0) printf(“\n%f делить на %f равно %f\n”, a1, a2, a1 / a2); if (a1 > a2) printf(“Число %f больше %f\n”, a1, a2); else printf(“Число %f меньше или равно %f\n”, a1, a2); m = (a1 > a2) ? a1 : a2; printf(“Максимальное из двух чисел: %f\n”, m); getch(); return 0; } |

Рисунок 26 — Результат выполнения программы branch. c
Листинг 12 — Использование оператора ветвления switch
/* switch. c – пример использования оператора switch */ #include <stdio. h> #include <locale. h> #include <conio. h> int main() { int mark; setlocale(LC_ALL, “”); printf(“Введите оценку: ”); scanf(“%d”, &mark); printf(“\nВаша оценка: ”, mark); switch (mark) { case 1: case 2: printf(“неудовлетворительно”); break; case 3: printf(“удовлетворительно”); break; case 4: printf(“хорошо”); break; case 5: printf(“отлично”); break; default: printf(“неправильная”); } getch(); return 0; } |

Рисунок 27 — Результат выполнения программы switch. c
14.2 Операторы цикла
В Си имеются следующие конструкции, позволяющие программировать циклы: while, do while и for.
Цикл «Пока» — тело цикла выполняется, если значение логического выражения истинно:
while (logical_expression) statement; |
Если значение логического выражение заведомо ложно, то тело цикла не будет выполнено ни разу.
Цикл «До» — сначала выполняется тело цикла, затем проверяется логическое выражение, если оно ложно, то выполнение цикла завершается:
do statement; while (logical_expression); |
В отличие от предыдущей конструкции тело цикла выполняется хотя бы один раз независимо от значения логического выражения.
Общий цикл (вариант цикла «Пока» с инициализацией):
for (initialization; logical_expression; new_value) statement; |
До начала выполнения цикла выполняется блок инициализации. Затем выполняется проверка — вычисление логического выражения. Если результат — истина, то выполняется тело цикла, после чего производится расчет нового значения и следующая проверка. Наиболее часто данный вариант применяется для реализации цикла с заранее известным числом повторений. Например, код:
for (i = 0; i < 10; i++) printf(“%d”, i); |
выведет на экран целые числа от 0 до 9.
Студенту на заметку! В блок-схеме оператору for соответствует блок цикла с заранее известным числом повторений:
Если шаг изменения переменной цикла равен 1, то его можно не указывать. |
Для преждевременного выхода из цикла можно использовать оператор break.
Для перехода на проверку условия из любого места тела цикла можно использовать оператор continue.
15 Массивы
Возможно, наиважнейшим структурным типом данных является массив (array — массив). Массив — это набор объектов одинакового типа, доступ к которым осуществляется по индексу (аналог матриц в математике).
Массивы можно объявлять следующим образом:
type arrayname[SIZE]; |
Здесь type — имя типа элементов массива; arrayname — имя массива (см. параграф 8.1); SIZE — размер массива, в качестве которого должна использоваться целочисленная константа.
Используя имя массива и индекс, можно обращаться к элементам массива arrayname[index], присваивать им значения, использовать их значение в выражениях, выводит на экран. Здесь index может быть целочисленными константой, переменной или выражением, например: arrayname[4], arrayname[SIZE-2], arrayname[i], arrayname[i+1], arrayname[SIZE-i+1].
Значения индекса должны быть целыми числами и лежать в диапазоне от нуля до величины, на единицу меньшей, чем размер массива, указанный при его описании. В нашем примере от 0 до SIZE-1. Контроль правильности индекса массива в процессе компиляции и выполнения программы не осуществляется, поэтому эта задача полностью ложится на плечи программиста.
Вот несколько примеров описания массивов:
#define SIZE1 125 const int SIZE2 = 1500; char name[20]; int grades[SIZE1]; float income[30]; double measurements[SIZE2]; |
Первый из массивов name содержит 20 символов. Обращением к элементам массива может быть: name[0], name[1], ..., name[19]. Так как размер типа char составляет 1 байт (см. параграф 8.2), то в памяти компьютера данный массив займет 20 байт.
Второй массив grades содержит 125 целых чисел. Обращением к элементам массива может быть: grades[0], grades[1], ..., grades[124]. С учетом размера типа int 4 байта данный массив займет в памяти компьютера 125∙4 = 500 байт.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |




