В записи оператора for может отсутствовать любой его операнд-выражение и даже все. В этом случае обязательно наличие двух точек с запятой (признак пустого операнда-выражения). При отсутствии операнда выражение_1 не выполняется инициализация параметра цикла, что может привести к ошибке времени выполнения. Если отсутствует операнд выражение_3, то не осуществляется изменение параметра цикла, что может привести к зацикливанию. При отсутствии операндавыражение_2 в составе цикла нет шага проверки условия повторения. Это приводит к зацикливанию, так как в реализации С++ принято, что в этом случае значение операнда выражение_2 по умолчанию принимается отличным от нуля (true).
В заголовке цикла for могут отсутствовать все три операнда-выражения. В этом случае инициализация параметра цикла должна осуществляться до входа в цикл. В теле цикла необходимо обеспечить изменение текущего значения параметра цикла и проверку условия повторения (или выхода). Например:
// Вывод на экран первых десяти чисел натурального ряда
int i = 1;
for (;;) { cout << “i = “ << i << ‘\t’;
i++; // изменение текущего значения параметра
if (i > 10) break; // выход из цикла
}
Это так называемый открытый итеративный цикл for. Такой цикл лучше организовать обычным образом.
Обратите внимание на следующие примеры!!!
for (b;b;b); // b – пробел.Это – бесконечный цикл, программа “зависает”.
При отсутствии пробела на месте операнда выражение_3 некоторые компиляторы Си (но не С++) выдают предупреждение.
for (i = 1; i < 100; i++)b; // b – пробел, пустое тело цикла.
Пробел перед ";" говорит о том, что такая конструкция построена специально и не является ошибкой ввода.
Начальное и конечное значение параметра цикла for можно задавать выражением соответствующего типа. После выхода из цикла параметр сохраняет значение, полученное при последнем выполнении тела цикла.
В каждом из операндов-выражений заголовка оператора for можно записать несколько выражений, разделенных запятыми. Для параллельной обработки двух индексов массива-строки цикл можно организовать так:
// Инверсия (“переворачивание”) строки s
void reverse (char *s) { // параметр s – указатель на строку
intc, i, j;
// функция strlen (s) возвращает длину строки
for (i = 0, j = strlen(s) – 1; i < j; i++, j--) {
c = s[i]; s[i] = s[j]; s[j] = c;
}
return;
} .
// Перевод числа n в символы строки s
void int_to_str (int n, char *s) {
inti, sign; // в операторе if переменная signинициализируется значением n
if ((sign = n) < 0) n = - n; // число n преобразуется в положительное
i = 0;
// остаток от деления – очередная цифра числа. Так как ASCII-коды символов- // цифр ‘0’ .. ‘9’ – числа 0х30 .. 0х39, то к цифре добавляется код цифры ‘0’
// и число записывается в строку в «перевернутом» виде (младшие цифры
// записываются в строку первыми (например: число 12345 → “54321”)
do { s[i++] = n % 10 + ‘0’
} while ((n /= 10) > 0); // n = n / 10;
if (sign < 0) s[i++] = ‘-‘;
s[i]=’\0’; // признак конца строки в С++
reverse (s); // инверсия строки для вывода числа в естественном виде.
return;
}
1.2. Вложенные циклы
В циклических вычислительных процессах достаточно часто встречаются случаи, когда внутри одного цикла содержится один или несколько других – такназываемый вложенный цикл. Примерами таких вычислительных процессов являются:
· табулирование функции двух переменных f (x, y), причем параметры изменяются независимо друг от друга (при фиксированном x «пробегает» свои значения yили наоборот;
· вычисление значения интеграла с параметром в подынтегральной функции;
· вычисление сумм вида .и бесконечных произведений;
· матричные операции (сложение, вычитание, умножение матриц);
· упорядочивание массивов (сортировка) по возрастанию или убыванию и др.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.