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

         

Смысл индексных переменных при работе с массивами


При работе с массивами используются переменные-индексы, через которые происходит извлечение элементов массива. В значительном проценте случаев этот процесс осуществляется последовательно, элемент за элементом. Тогда в программе обязательно будут присутствовать фрагменты


while() {... c=A[i]; i++; ...} // Извлечь очередной и продвинуть индекс


while() {... c=A[i++]; ...} // " Нежесткая" связь с циклом


for (...;...;i++) { ... c=A[i]; ... } // " Жесткая" связь с циклом


while() {... A[i]=c; i++; ...} // Записать очередной и продвинуть индекс


while() {... A[i++]=c; ...} // " Нежесткая" связь с циклом


for (...;...;i++)
{ ... c=A[i]; ... } // " Жесткая" связь с циклом

Заметим, что процесс последовательного движения по массиву может быть " жестко" связан с выполнением цикла, тогда за каждый шаг цикла происходит строго одно перемещение и i++ может находиться в заголовке. Если же такой связи нет, тогда " движение" по массиву может быть косвенно связанным с самим циклом, через какие-либо условия. При этом оно может протекать со своей " скоростью" .

В качестве примера рассмотрим процесс разделения массива на две части относительно значения некоторого элемента - медианы. Пусть требуется переписать элементы массива A в массив B так, чтобы в выходном массиве слева относительно выбранного A[k] , называемого медианой, находились все элементы, меньшие данного, а справа - большие. Это можно сделать, если заполнять массив B с двух концов, перенося поочередно элементы из исходного массива. Для реализации такой программы потребуется три индекса и один цикл, поскольку имеет место три независимых " движения" по массивам, причем одно из них связано с циклом просмотра :



-" движение" по массиву A слева направо, связанное с циклом просмотра массива ;



-" движение" по массиву B в процессе заполнения его с левого конца ;



-" движение" по массиву B в процессе заполнения его с правого конца.


int A[20],B[20];
int i; // Движение по массиву A


int k1; // Движение по массиву B слева направо


int k2; // Движение по массиву B справа налево


int m; // Индекс элемента - медианы в А


for (i=0,k1=0,k2=19; i&#60 20; i++) // Просмотр A жестко связан с циклом


{
if (i==m) continue; // Медиану - пропустить


if (A[i]&#60A[m])
B[k1++]=A[i]; // Добавить слева


else
B[k2--]=A[i]; // Добавить справа


} // Движение по B не связано жестко с циклом


B[k1]=A[m]; // Перенести медиану в точку " встречи" k1-k2



Содержание раздела