- •Программирование на языке высокого уровня
- •Составитель: л.А. Прокушев
- •Подписано к печати Формат 60х84 1/16. Бумага тип. №3
- •Редакционно-издательский отдел
- •190000, Санкт-Петербург, ул. Б. Морская, 67
- •Алгоритмизация вычислительных процессов
- •Средства программирования вычислительных процессов
- •Данные и их типы
- •Константы
- •Переменные
- •Ввод-вывод данных
- •Ввод-вывод данных в стиле с
- •Форматированный ввод
- •Форматированный вывод
- •Консольный ввод-вывод
- •Функция ввода символа (без отображения):
- •Функция очистки экрана результатов:
- •Выражения и операции
- •Логические выражения и операции.
- •Работа с ветвящимися процессами Операторы
- •Оператор присваивания
- •Условный оператор (if)
- •Операторы передачи управления
- •Оператор break (прервать) используется для прерывания работы текущего сложного оператора, в теле которого находится оператор break, и передачи управления на следующий по порядку оператор.
- •Оператор выбора (switch)
- •Действие оператора выбора состоит в следующем:
- •Введите 2 числа х, y : 3 8
- •Работа с циклическими вычислительными процессами
- •Циклы с фиксированным числом повторений Оператор цикла с предусловием (while)
- •Прерывание цикла
- •Циклы с неизвестным числом повторений Вычисление рекуррентных последовательностей
- •Оператор цикла с постусловием (do)
- •Вложенные циклы и организация диалога в программе
- •Оператор цикла с параметром (for)
- •Программа:
- •Работа с массивами
- •Описание массива
- •Доступ к элементам массива
- •Указатель.
- •Занесение данных в массив
- •Многомерные массивы
- •Работа с функциями
- •Определение функции
- •Вызов функции
- •Передача параметров функции
- •Передача данных по значению
- •Передача данных по адресу
- •Прототип (шаблон) функции
- •Блочная структура программы
- •Внешние описания переменных
- •Многомодульные программы Проект программы
- •Внешние ссылки
- •Создание проекта программы
- •Работа с указателями Объявления объектов со сложными описателями
- •Массивы указателей
- •Указатель на указатель
- •Указатель на функцию
- •Использование указателя на функцию как аргумента
- •Массивы указателей на функции
Вложенные циклы и организация диалога в программе
Несколько циклов могут быть независимыми, если они не влияют друг на друга. В случае если тело цикла полностью входит другой цикл, то он является вложенным, причем глубина вложения неограниченна. Рассмотрим организацию диалога с пользователем в программе с вложенными циклами.
Пример21.
Организовать диалог с пользователем и проверку исходных данных в задаче определения цифр младшего и старшего разрядов натурального числа N, вводимого пользователем.
Программа:
# include<stdio.h>
# include<conio.h>
void main ()
{ long N , n ; int mp, r ; // описание переменных
clrscr (); // очистка экрана
do { // внешний цикл диалога
do { // цикл контроля числа
printf (“Введите натуральное число:”);
scanf (“%ld”, &N); // ввод числа
} while (N<0); // повтор ввода, если N не натуральное
n = N; // текущее число
mp = n % 10; // младший разряд
while (n>9) // цикл до старшего разряда
n /=10; // деление числа нацело на 10
printf (“В числе %ld старший разряд =%d младший” “ разряд=%d”, N, n, mp);
printf (“Продолжить? Если нет- введите 0, иначе – любую” “ другую цифру”);
scanf (“%d”, &n); // ввод цифры для цикла диалога
} while (n); // условие для цикла диалога
}
В данном случае порядок организации внешнего цикла и вложенных циклов определен условиями задачи. В других задачах, когда циклы равноправны, их порядок определяется программистом.
Пример22.
Вычислить значения переменной y=sin(x)+b с параметрами циклов x = x0(hx)xk и b = b0(hb)bk, где x0, b0 – начальные значения, hx, hb – шаг изменения, xk, bk – конечные значения параметров циклов x и b. Здесь параметры циклов x и b равноправны, поэтому любой из них может быть внешним или вложенным. В данном примере логично использовать оператор цикла while, который проверяет необходимость выполнения цикла.
Программа:
# include<stdio.h>
#include<math.h>
#include<conio.h>
void main()
{ float y, x, x0, hx, xk, b, b0, hb, bk;
clrscr();
printf (“Введите x0, hx, xk, b0, hb, bk: ”);
scanf (“%f%f%f%f%f%f”, &x0, &hx, &xk, &b0, &hb, &bk);
x=x0; // начальное значение параметра x
while (x<=xk) // внешний цикл по x
{ b=b0; // начальное значение параметра b
while (b<=bk) // вложенный цикл по b
{ y = sin(x)+b; // оператор тела цикла
printf (“x=%f b=%f y=%f\n”, x, b, y); // вывод результатов
b += hb; // изменение параметра b
}
x += hx; // изменение параметра x
}
}
Оператор цикла с параметром (for)
Этот наиболее гибкий по своим возможностям оператор цикла имеет вид
for (инициатор; условие; модификатор) // заголовок цикла
оператор // тело цикла, где
for (для) – ключевое слово;
инициатор – одно или несколько выражений, задающих начальное значение переменным оператора цикла;
условие – выражение сравнимое с нулем, определяющее условие продолжения цикла;
модификатор – одно или несколько выражений, изменяющих переменные оператора цикла;
оператор (тело цикла) – одиночный, составной или пустой оператор, выполняющий действия в цикле.
Оператор for действует следующим образом.
В инициаторе параметру цикла и, возможно, другим переменным задаются начальные значения.
Вычисляется выражение условия. Если его значение не равно 0 (истинно), то выполняется оператор (тело цикла), иначе при значении равном 0 (ложно) управление передается следующему оператору.
В модификаторе изменяются значение параметра цикла и, возможно, других переменных для следующего цикла.
Существенно то, что условие цикла проверяется перед выполнением тела цикла. Это значит, что цикл может ни разу не выполниться, если условие сразу будет ложным, что аналогично действию оператора цикла while. Однако оператор for удобнее для восприятия, поскольку все три выражения, управляющие циклом, (инициализация, проверка и модификация параметра цикла) представлены в его заголовке, а не разнесены, как в операторе while.
Операция запятая (,) может использоваться в инициаторе для разделения нескольких инициирующих выражений для разных переменных, а в модификаторе могут использоваться операторы из тела цикла, разделенные запятыми, а не точкой с запятой, как это принято в программе. При этом тело цикла может превратиться в пустой оператор.
Пример23.
Возможные варианты заголовков оператора цикла for.
Вывод значений изменяющихся переменных: for (i=20, k=i; i > - 45; k += i, i -= 5) printf (“k=%d i=%d\n”, k, i);
Получение величины переменной x с заданной точностью: for (x=d/2.0; fabs(x*x-d) > 0.01; x=(x+d/x)/2) /* тело цикла – пустой оператор, за которым стоит точка с запятой */ ;
Оператор суммирует первые 10 ненулевых целых значений: for (c=1, sum=0; c <= 10; sum +=c, c++) ;
Пустой оператор тела цикла можно использовать для организации задержки выполнения: for (i=0; i < 100000; i++) ; // заголовок цикла с пустым телом цикла
Прерывание выполнения оператора for может быть осуществлено с помощью операторов break (прервать), continue (продолжить), goto (перейти) аналогично их действию в операторе while. Во вложенных циклах оператор break прерывает самый внутренний, содержащий его цикл for; оператор continue передает управление на конец самого внутреннего тела цикла, в котором он находится, для продолжения итераций. Оператор goto из тела цикла оператора for любой глубины вложения передает управление любому оператору блока функции. Он используется для аварийного выхода из внутренних и любых циклов вообще. Рассмотрим примеры применения оператора for.
П ример 24.
Вычислить сумму ряда
где N – количество членов ряда.
Рекуррентная формула суммы Sk = Sk-1 + sin(kx), при начальном значении параметра цикла k=1 начальное значение S0 = 0.
Программа.
# include<stdio.h>
#include<conio.h>
# include <math.h>
void main( )
{ int k, N; float S, x; // описание переменных
clrscr ( ); // чистка экрана
printf (“ Введите x, N: ”);
scanf (“ %f%d”, &x, &N); // ввод данных ряда
for (k=1, S=0; k<=N; k++ ) // заголовок цикла
S += sin(k * x); // вычисление суммы ряда
printf (“Сумма = %f ”, S); // вывод результата
}
Пример 25. Программа вывода четных чисел меньше 100.
void main ( )
{ int n ;
for ( n = 0; n < 100; n++)
{ if (n % 2) // если нечетные (≠0) – продолжить
continue;
printf(“%3d ”, n); // печать четных чисел
}
}
Пример 26.
Ввести натуральное число N и определить, является ли оно простым.
Простое число делится без остатка только на 1 и N, а не простое число может делиться без остатка и на другие числа в диапазоне от 2 до N/2.