Применение инструкции цикла FOR 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Применение инструкции цикла FOR



Инструкция for…to…do позволяет последовательно перебирать значения некоторой переменной порядкового типа в заданном диапазоне, либо от начального значения до конечного значения, либо наоборот. С помощью этой инструкции легко организовать цикл. Особенность таких циклов в том, что число повторений заранее известно.

В общем виде инструкция for…to…do записывается так.

 

Рисунок 6.1– Синтаксис инструкции for…to…do

На этом рисунке <параметр цикла> - переменная порядкового типа; < начальное значение > - выражение, определяющее начальное значение <параметра цикла>; <конечное значение> - выражение, определяющее конечное значение <параметра цикла>.

Следует отметить, что если между словами begin и end находится только одна инструкция, то операторные скобки: begin и end можно не писать.

Инструкция цикла for…to…do выполняется следующим образом:

1) Вычисляются <начальное значение> и <конечное значение >.

2) Переменной <параметр цикла> присваивается <начальное значение>.

3) Если значение <параметра цикла> превышает <конечное значение>, то цикл заканчивается.

4) Выполняется тело цикла.

5) Переменной <параметр цикла> присваивается следующее значение.

6) Выполнение продолжается с пункта 3.

Количество повторений тела цикла можно вычислить по формуле:

Ord(<конечное значение>) – ord(<начальное значение>)+1;

Если <начальное значение> больше чем <конечное значение>, то тело цикла не будет выполнено ни разу.

Если <начальное значение> и <конечное значение> одинаковы, то тело цикла выполняется один раз.

Переменную <параметр цикла> можно использовать внутри цикла (но не изменять).

Если в инструкции for…to…do вместо слова to записать downto, то после очередного выполнения инструкций тела цикла, значение <параметра цикла> будет не увеличиваться, а уменьшаться.Начальное значение в этом случае должно быть больше чем <конечное значение>.

В рассмотренном ниже примере цикл for…to..do используется для того, чтобы добавить 10 символов ‘*’ к тексту в компоненте Label1.

for i:=1 to 10 do

Begin

label1.caption:=label1.caption + ‘*’;

end;

В следующем примере все прописные буквы текстового компонента Edit1 заменяются соответствующими строчными буквами. Для определения длины строки здесь используется функция length().

const rus=['А'..'Я']; lat=['A'..'Z'];

var ch: char; i:integer; s:string;

Begin

s:= Edit1.Text; // Запоминаем текст компонента в переменной типа String

for i:=1 to length(s) do // Цикл по символам строки

Begin

ch:= s[i]; // Очередной символ

if (ch in rus) or (ch in lat) then s[i]:= chr(ord(ch) +32);

Edit1.Text:= s; // Вывод результата

end;

end;

6.1.2.1 Табулирование значений функций

Одной из достаточно распространенных задач, в которых используются циклы, является задача табулирования значений некоторой функции. Суть задачи заключается в том, что необходимо изменять аргумент функции от некоторого начального значения до конечного значения с некоторым шагом и для полученных значений аргумента вычислять значения функции. Эту задачу можно решать с помощью цикла while…do, в котором параметр цикла будет последовательно увеличиваться на величину шага. Однако такой подход считается не совсем правильным. Обычно аргументы функций – вещественные числа, которые в памяти машины записываются с некоторой погрешностью. При многократном суммировании таких чисел погрешность накапливается и может стать заметной при большом количестве циклов. Поэтому при табулировании функций удобнее использовать цикл for, в котором параметром является целочисленный номер строки таблицы. Строки таблицы удобно считать пронумерованным с 0, тогда приращение аргумента на каждом шаге можно определять путем умножения шага на номер строки. Ошибка при этом не накапливается.

Ниже приведен фрагмент программы табулирования функции sin(x)

// Обьявляем внутренние переменные процедуры

var x0, x, xMax: real; // Начальное (х0), текущее (х) и конечное (xMax)

// значения аргумента

y: real; // Текущее значение функции

k: integer; // Номер последней строки в таблице

i: integer; // Параметр цикла (номер текущей строки в таблице)

s: string; // Строка таблицы

Begin

k:= round ((xMax-x0)/step); // Округляем число строк до целого значения

for i:=0 to k do

Begin

x:= x0 + step * i; // Очередное значение х

y:= sin (x);

s:= ‘x=’ + floatToStr(x) + ‘ y =’ + floatToStr (y)

memo1.Lines.Append(s);

end;

end;

6.1.2.2 Форматирование результатов при выводе таблиц

При выводе таблиц на экран или на печать желательно добиться, чтобы столбцы были ровными, десятичные разделители были в одной позиции. Для этого, прежде всего таблицы целесообразно выводить шрифтом Courier new, в котором все символы имеют одинаковую ширину. Но этого мало. Строки таблицы следует формировать с помощью функции format().

В общем виде обращение к функции выглядит так:

format (<строка форматов>,<список объектов форматирования>)

Cтрока форматов состоит из фрагментов текста и спецификаторов. Спецификаторы указывают, что в данном месте строки должен быть вставлен объект из списка объектов форматирования. Признаком спецификатора формата является символ процента (%). После этого символа располагаются числа и буквы, указывающие, как форматировать данный объект.

Список объектов форматирования может состоять из констант, переменных или выражений, разделенных запятыми. Весь список заключается в квадратные скобки.

Подробное описание функции можно найти в справочной системе Delphi. Здесь мы рассмотрим только несколько примеров.

Таблица 6.3 – Примеры использования функции format()

Обращение к функции Значения объектов форматирования Возвращаемое значение
format(‘Результат = %1.3f’, [x]) x=23.45678 Результат =23.457
format(‘%1d+%1d=%1d’,[a, b, a+b] a=12. b=13 12+13=25
format(‘%1s= %1.3f’, [r, x]) r=’Результат’. x=23.4 Результат =23.400

В первом примере спецификатор имеет значение %1.3f и относится он к переменной х. Символ f указывает на то, что форматироваться будет вещественное число, но в форме с фиксированной точкой. Число 3 после точки указывает на то, что для дробной части числа выделяется три позиции. Поэтому результат был округлен до трех знаков после точки. Число 1 перед точкой указывает на то, что общее число позиций для вывода объекта равно 1. Этого явно мало, поэтому функция выделяет столько позиций, сколько требуется. В данном случае требуется 6 позиций (две на целую часть, одна на точку, и три на дробную часть). Если бы перед точкой стояло число большее чем 6, например 9, то слева было бы добавлено три пробела.

Во втором примере форматируются целые числа, поэтому для определения типа используется символ d. Числом задается требуемое количество позиций.

В третьем примере одним из объектов форматирования является строка символов, поэтому в качестве символа для определения типа используется буква s.

Строки символов

Строка – это тип данных, которому соответствует последовательность символов. При работе со строками оперируют понятиями имя строки, размер строки, символ, номер символа. Для идентификации положения отдельных символов строки, используют индексы. В качестве индексов строки в Object Pascal могут использоваться только целые числа. Нумерация символов в строке начинается с единицы.

В языке Object Pascal существует несколько разновидностей строк, но мы рассмотрим только один из них, аналогичный типу String в языке Pascal. Этот тип в языке Object Pascal имеет название ShortString - короткая строка. Вместо него можно использовать и название String, но следует иметь в виду, что оно будет соответствовать типу ShortString только в том случае, если включена директива компилятора {$H+}. В противном случае String интерпретируется компилятором как тип AnsiString - длинная строка. Но, если в объявлении типа после ключевого слова String в квадратных скобках следует число, определяющее максимальную длину строки (например, String [4]), то, независимо от директив компилятора, тип трактуется как короткая строка.

Данные типа ShortString представляют собой последовательности 8-битовых ANSI символов, количество которых может быть от 0 до 255. Длина строки в процессе работы программы может изменяться, но размер выделяемой памяти при этом не меняется и равен 256 байтов.

Начальный (нулевой) байт в выделенной памяти используется для хранения длины строки, в остальных хранятся символы строки. Если S – это строка типа ShortString, то Ord(S[0]), так же как и Length(S), возвращают длину строки.

Object Pascal поддерживает и подтипы типа ShortString, максимальная длина которых может быть меньше чем 255 символов. Требуемая максимальная длина строки задается в квадратных скобках после слова String. Например:

var MyString: String [10];

Эта запись равносильна такой:

Type

Tstring10 = String [10];

var MyString: Tstring10;

Использование подтипов экономит память, так как для строки выделяется меньше места.

Если переменной такого типа присваивается строка большей длины, то она будет обрезана справа.

Объявление типа со спецификатором длины нельзя использовать в заголовках процедур, которые используют параметры такого типа. Ниже приведен пример объявления процедуры, которое приведет к появлению сообщения об ошибке компиляции.

procedure Check(S: string[20]); // будет синтаксическая ошибка

Однако это не означает, что в процедуры нельзя передавать данные таких типов. Передавать такие данные можно, но предварительно следует определить соответствующий тип данных, а в объявлении процедуры для параметров использовать этот, предварительно объявленный, тип. Ниже приведен пример правильного объявления такой процедуры.

Type

TString20 = String [20];

procedure Check(S: TString20);

6.1.3.1 Операции над строками

Сцепление (конкатенация) строк осуществляется операцией "+". Например, выражение S1+S2 даст в результате новую строку, в которой после символов строки S1 будут расположены символы строки S2.

Для строк определены операции сравнения >, >=, <, <=, =, <>. Большей считается строка, у которой код первого из не совпавших символов больше. Обратите внимание, оценивается не длина строки, а коды символов. Именно на основе такого способа сравнения упорядочены слова в словарях.

В программах можно обращаться и к отдельным символам строки. Например, S[i] - это символ, расположенный в позиции i строки (индексы отсчитываются от 1, т.е. индекс 1 соответствует первому символу). Выражение S[i] возвращает значение типа Char.

При работе со строками не следует забывать о том, что задание максимального размера строки при ее объявлении не означает, что строка имеет такую длину. Размер строки устанавливается во время операции присваивания значения всей строке, и не изменяется при изменении отдельного символа.

Пусть мы хотим создать строку, состоящую из 15 случайных символов ‘0’ и ‘1’. На первый взгляд может показаться, что процедура, приведенная ниже, даст правильный результат, однако это не так. Фактическая длина строки в этой процедуре равна 0, и такой же она останется после завершения цикла.

procedure TForm1.Button1Click(Sender: TObject);

var s: String[20]; i: integer;

Begin

for i:=1 to 15 do s[i]:= intToStr(random(2))[1];

edit1.Text:=s;

end;

Желаемый результат мы получим при таком варианте:

procedure TForm1.Button1Click(Sender: TObject);

var s: String[20]; i: integer;

Begin

s:='';

for i:=1 to 20 do s:= s+intToStr(random(2));

edit1.Text:=s;

end;



Поделиться:


Последнее изменение этой страницы: 2017-02-07; просмотров: 243; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.144.12.205 (0.037 с.)