
- •6. Вложенные циклы
- •6.1 Цель работы
- •6.2Заданиe
- •Найдите наибольший элемент, укажите его положение.
- •6.3Теоретические сведения
- •Пример 1. Ручной ввод массива в поле tEdit
- •Двумерные массивы
- •Динамические двумерные массивы
- •Пример 2. Инициация двумерного динамического массива
- •Пример 3. Процедура инициации двумерного массива
- •Пример 4. Формирование двумерного массива случайных чисел
- •Оператор присоединения With
- •Пример 5. Использование With при формировании массива
- •Пример 6. Нахождение наименьшего элемента массива
- •Компонент tStringGrid
- •Основные свойства компонента TstringGrid
- •Пример 7. Работа с таблицей
- •2. Нумерация строк и столбцов фиксированной зоны таблицы
- •3. Контроль ввода данных в таблицу
- •4. Формирование массива по данным таблицы, вывод массива
- •Вывод двумерного массива в таблицу
- •6.4Содержание отчета
- •6.5 Контрольные вопросы
Какой тип переменной Счётчик в операторе For?
К какому типу выражений принадлежит Условие в операторах While и Repeat?
Каков синтаксис описания одномерных массивов?
Какой тип могут иметь индексы массива?
В чём особенность открытых параметров массива в процедурах?
Какие значения возвращают функции Low(M) и High(M), если М массив?
В чём особенность динамических массивов?
Как описывают динамический массив?
Как задать размер динамического массива?
6. Вложенные циклы
6.1 Цель работы
Цель работы - приобретение навыков построения вложенных циклических алгоритмов и реализация с их помощью управляющих конструкций повторения.
6.2Заданиe
1. Задайте массив M x N, выполните действия для Вашего варианта. Ввод массива вручную.
Найдите наибольший элемент, укажите его положение.
Найдите столбец с наибольшей суммой.
Найдите столбец с наименьшей суммой.
Найдите сумму элементов каждой диагонали.
Найдите строку с наибольшей суммой.
Найдите строку с наименьшей суммой.
2. Задайте таблицу M x N, выполните действия для Вашего варианта. Ввод данных вручную.
Найдите наибольший элемент, укажите его положение.
Найдите столбец с наибольшей суммой.
Найдите столбец с наименьшей суммой.
Найдите сумму элементов каждой диагонали.
Найдите строку с наибольшей суммой.
Найдите строку с наименьшей суммой.
6.3Теоретические сведения
В качестве оператора в теле цикла можно использовать практически любой оператор, в том числе For, While, Repeat. Такие конструкции называют конструкциями с вложенными циклами. При выборе оператора повторений следует учитывать:
оператор For применяют только при известном заранее количестве повторений;
операторы While и Repeat управляют повторениями по логическому условию;
оператор, находящийся в теле цикла Repeat, всегда будет выполнен минимум один раз;
в зависимости от условия, оператор, находящийся в теле цикла While, может быть не выполнен ни разу.
Ниже приведены фрагменты алгоритмов с вложенными циклами.
Пример 1. Ручной ввод массива в поле tEdit
Дано: LabeledEdit1.Text – поле ввода в которое вручную введён массив как строка текста;
введённые значения соответствуют алфавиту вещественных чисел и разделены пробелами;
переменная Mx: T_M - динамический массив (T_M = array of Real); Label1.Caption - метка для вывода номера элемента массива i, и значения элемента массива Mx[i];
Требуется сформировать из данных поля ввода числовые значения массива Mx.
Постановка задачи.
для выделения одного элемента массива из строки LabeledEdit1.Text, будем в цикле считывать по одному символы и вставлять их во вспомогательную строку S, пока не достигнем пробела, LabeledEdit1.Text[j] <> ' ')
количество считанных символов фиксирует счётчик элементов текстовой строки j;
количество сформированных строк фиксирует счётчик числового массива i;
преобразуем вспомогательную строку S в элемент массива Val(S, Mx[i], Cod);
эти действия будем повторять, пока количество считанных символов меньше или равно длине строки ввода, j <= Length(LabeledEdit1.Text.
procedure TForm1.Button1Click(Sender: TObject);
Var Cod, i, j : Integer; //Cod – индикатор преобразования Строка-Число;
// i – счётчик числового массива, j – счётчик элементов текстовой строки
S: String; //вспомогательная строка, для формирования очередного элемента
begin
i:=0; J:=0; //обнуление счётчиков
Label1.Caption:= ''; //очистка метки вывода
Repeat //повторять, пока условие «Until ….» не станет true
inc(j); //увеличивает j на 1, при первом вхождении j=1
S:=''; //очистка вспомогательной строки
{Пока «очередной символ не пробел» и «счётчик j меньше или равен длине строки, повторять}
While (LabeledEdit1.Text[j] <> ' ') and (j <= Length(LabeledEdit1.Text)) do
begin
S:= S + LabeledEdit1.Text[j]; //к S присоединяется очередной символ
Inc(j); //j увеличился на 1, переход на новый виток цикла While
end; //конец While, в S символы одного элемента массива
Val(S, Mx[i], Cod);
//Преобразование символов S в элемент числового массива Mx[i]
if Cod <> 0 //контроль, если Cod =0 – преобразование успешное
then begin //ошибка преобразования
ShowMessage('Недопустимый символ!' );
Label1.Caption:= ''; //очистка метки вывода
exit; //досрочное завершение цикла Repeat
end;
{Преобразование было успешным. Далее вывод счётчика i, табуляция (#9), вывод элемента массива Mx[i], символы конца строки}
Label1.Caption:= Label1.Caption+
IntTostr(i)+#9+ FloatToStr(Mx[i])+#10#13;
inc(i); //увеличивает i на 1
{Если i < старшего индекса массива или j < длины строки цикл Repeat продолжать}
Until (i>High(Mx)) or (j> Length(LabeledEdit1.Text)); //конец цикла Repeat
end;