Информатика и технология программирования


Смысл переменных - часть 2


}

Более сложный пример иллюстрирует тот факт, что переменная-признак " запоминает" факт наступления события и сохраняет его в течение некоторого времени.


for (i=0,s=0,k=0; i&#60 10; i++)
if (A[i]&#60 0) k=1;
else
{ if (k==1) s++; k=0; }

Несложно догадаться, что " смысл" переменной k - текущий элемент массива является отрицательным, а " смысл" s - счетчик. Счетчик увеличивается, если выполняется ветка else - текущий элемент массива положителен, и в то же самое время k==1 - соответствует отрицательному значению элемента массива. Преодолеть это противоречие можно, если учесть, что признак проверяется в этой ветке до его изменения, то есть l проверяется его значение, оставшееся от предыдущего шага. Следовательно. фрагмент подсчитывает количество пар элементов вида " отрицательный - положительный" .

Еще один пример - обнаружение комментариев в строке. Признак com в процессе переписывания строки устанавливается в 1, если программа находится " внутри комментария" .


void copy(char dst[], char src[])
{ int i,com=0,j=0;
for (com=0,i=0; src[i]!=0; i++)
if (com)
{ // внутри комментария


if (src[i]== * &#38&#38 src[i+1]== / )
{ com=0; i++; } // не в комментарии, пропустить символ


}
else
{ // вне комментария


if (src[i]== / &#38&#38 src[i+1]== * )
{ com=1; i++; } // в комментарии, пропустить символ


else
dst[j++] = src[i]; // переписать символ в выходную строку


}
dst[j]=0; }


for (s=0,...;...;...) { получить k; s=s+k; }

Он дает переменной s единственный " смысл" - переменная накапливает сумму значений k , полученных на каждом из шагов выполнения цикла. Для доказательства этого факта можно привлечь метод математической индукции : действительно, если на очередном шаге s содержит сумму, накопленную на предыдущих шагах, то после выполнения s=s+k она будет содержать сумму уже с учетом текущего шага. Типичный пример - сумма элементов массива.


for (s=0,i=0; i&#60 10; i++) s=s+A[i];

То же самое можно сказать и о произведении, которое накапливается следующим фрагментом :




Начало  Назад  Вперед