Организация циклических вычислений. Основной теоретический материал. Операторы для организации циклов, страница 3

          В записи оператора 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;

.

//   Перевод  числа  в  символы  строки   s

void  int_to_str (int  n,  char  *s) { 

     intisign;  //  в операторе 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или наоборот;

·  вычисление значения интеграла с параметром в подынтегральной функции;

·  вычисление сумм вида  .и  бесконечных  произведений;

·  матричные операции (сложение, вычитание, умножение матриц);

·  упорядочивание массивов (сортировка) по возрастанию или убыванию и др.