Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Доступ к символам строки с помощью цикла for




Цикл for предоставляет непосредственный доступ поочередно к каждому символу строки. Например, программа из листинга 4_4 позволяет вводить строку, а затем отображать ее посимвольно в обратном порядке. При этом функция Length подсчитывает количество символов в строке, а затем это значение используется в выражении инициализации цикла для присвоения i значения позиции последнего символа в строке, не считая пустого символа. Для перемещения по строке в обратном порядке в данной программе используется оператор downto в цикле for, который уменьшает на 1 индекс массива на каждой итерации цикла.

Программа 4_4

// использование цикла for для обработки строк

program Project1;

{$APPTYPE CONSOLE}

Uses

SysUtils;

Const

ArSize = 20;

Var

word: String[ArSize];

i: Integer;

Begin

Write('Enter a word: ');

Readln(word);

//отображение символов строки в обратном порядке

for i:=Length(word) downto 1 do

Write(word[i]);

Readln;

end.

Результат:

Enter a word: animal

Lamina

Программа выводит слово animal (животное) в обратном порядке.

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

Формат (или синтаксис) оператора for может показаться ограниченным, поскольку тело данного цикла должно состоять из одного оператора, а это неудобно, если операторов может потребоваться больше. К счастью, существует специальный синтаксический прием, позволяющий обойти это ограничение и вставить в тело цикла сколько угодно операторов. Он заключается в использовании ключевых слов begin и end для построения составного оператора или блока. Блок состоит из пары фигурных скобок и операторов, которые в них заключены, при этом с точки зрения синтаксиса блок считается единым оператором. Например, в программе из листинга 4_5 операторы begin и end используются для объединения трех отдельных операторов в единый блок. Это дает возможность ввести в тело цикла запрос ввода данных пользователем, обеспечить чтение ввода и выполнение вычислений. В данной программе выполняется подсчет текущей суммы вводящихся чисел.

Программа 4_5

// демонстрация применения блока операторов

program Project1;

 

{$APPTYPE CONSOLE}

 

Var

i, number: Integer;

sum: Real;

 

Begin

sum:= 0.0;

Write('The Amazing Accounto will sum and average ');

Writeln('five numbers for you.');

Writeln('Please enter five values: ');

for i:= 1 to 5 do

begin //здесь начинается блок

Write('Value ', i, ': ');

Readln(number);

sum:= sum + number;

end; //завершение блока

Write('Five exquisite choice indeed! ');

WriteLn('The sum to ', sum:0:0);

Writeln('and average to ', sum / 5:0:1);

 

Readln;

end.

Результат:

The Amazing Accounto will sum and average five numbers for you.

Please enter five values:

Value 1: 1942

Value 2: 1948

Value 3: 1957

Value 4: 1974

Value 5: 1980

Five exquisite choice indeed! The sum to 9801

And average to 1960.2

Допустим, что отступ в тексте программы оставлен, однако при этом опущены операторы begin и end:

for i:= 1 to 5 do

Write('Value ', i, ': '); //здесь завершается цикл

Readln(number);

sum:= sum + number;

Write('Five exquisite choice indeed! ');

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

Выражения сравнения

Компьютер — не только средство для беспрерывного "перемалывания" чисел, его возможности гораздо шире. Он обладает способностью сравнивать значения, и именно это свойство служит для него основанием для принятия решений. Указанная возможность воплощена в операторах сравнения. Каждое выражение сравнения сводится к значению True типа Boolean, если результат сравнения оказывается истинным, и к значению False типа Boolean, если результат сравнения оказывается ложным. Именно поэтому данные операторы вполне пригодны для применения в условии продолжения цикла.


Операторы сравнения

Оператор Значение
< Меньше
<= Меньше или равно
= Равно
> Больше
>= Больше или равно
<> Не равно

Операторы сравнения обладают более низким приоритетом, чем арифметические операторы. Это означает, что выражение

x + 3 > y – 2 //выражение 1

соответствует выражению

(x + 3) > (y – 2) //выражение 2

а не выражению

x + (3 > y) – 2 //выражение 3

Цикл while

Структура while...do используется для организации циклического выполнения оператора, называемого телом цикла, пока выполняется некоторое условие. Синтаксис управляющей структуры while...do:

While (условие продолжение цикла) do

Тело цикла

Сначала программа проверяет условие продолжения цикла. Если в результате вычисления этого выражения получается логическое значение True, выполняются операторы в теле цикла. Подобно циклу for, тело данного цикла состоит из одного оператора или блока, определяемого операторами begin.. end. После завершения выполнения тела цикла программа возвращается к условию продолжения цикла и вычисляет его еще раз. Если данное условие оказывается True, то программа снова выполняет тело цикла. Подобный цикл проверки и выполнения продолжается до тех пор, пока в результате вычисления выражения не получится логическое значение False. Ясно, что если требуется, чтобы цикл в конечном итоге был завершен, в теле цикла должно быть выполнено некоторое действие, которое могло бы оказать влияние на значение условия продолжения цикла. Цикл while является циклом с входным условием продолжения цикла. Таким образом, если в результате вычисления условие продолжения цикла оказывается ложным с самого начала, программа вообще не выполняет тело цикла.

В листинге 4_6 демонстрируется работа цикла while. В данном цикле осуществляется последовательное обращение к каждому символу строки и отображение его ASCII-кода. Цикл завершается по достижении нулевого символа. Такой способ пошагового обращения к символам строки вплоть до нулевого символа является типичным для обработки строк в C++. Благодаря тому, что строка содержит собственный маркер завершения, программам зачастую не требуется явного указания длины строки.

Программа 4_6

В цикле осуществляется последовательное обращение к каждому символу строки и отображение его ASCII-кода.

program Project1;

 

{$APPTYPE CONSOLE}

 

Var

sName: String;

i, iLength: Integer;

 

Begin

Write('Your first name, please: ');

Readln(sName);

iLength:= Length(sName); //определяем длину строки

Writeln('Here is your name, verticalized and ASCIIized:');

i:= 1;

while i <= iLength do

Begin

Writeln(sName[i], ': ', Ord(sName[i]));

Inc(i);

end;

 

Readln;

end.

Результат:

Your first name, please: Muffy

Here is your name, verticalized and ASCIIized:

M: 77

U: 117

F: 102

F: 102

Y: 121

Условие продолжения цикла while выглядит следующим образом:

while i <= iLength do

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

Для вывода ASCII-кода каждого символа в рассматриваемой программе выполняется преобразование типа символа, который содержится в элементе sName[i], в целочисленный тип при помощи функции Ord которая возвращает порядковый номер символа.

Цикл repeat..until

Структура repeat...until используется для организации циклического выполнения совокупности операторов, называемой телом цикла, до тех пор, пока не выполнится некоторое условие. Синтаксис управляющей структуры repeat...until:

Repeat

тело цикла

until (условие продолжение цикла);

Точка с запятой после последнего оператора тела цикла (перед ключевым словом until) может опускаться.

Структура работает следующим образом. Выполняются операторы тела цикла. Затем вычисляется
<условие>, которое должно возвращать результат булева типа. Если выражение условия возвращает False, то повторяется выполнение операторов тела цикла и после этого снова вычисляется условие. Такое циклическое повторение цикла продолжается до тех пор, пока проверяемое условие не вернет True. После этого цикл завершается и управление передается оператору, следующему за структурой repeat...until.

Поскольку проверка условия осуществляется после выполнения операторов тела цикла, то эти операторы заведомо будут выполнены хотя бы один раз, даже если условие сразу истинно. С другой стороны, программист должен быть уверен, что условие рано или поздно вернет true. Если этого не произойдет, то программа «зациклится», т.е. цикл будет выполняться бесконечно. Иногда такие бесконечные циклы используются. Но в этом случае внутри тела цикла должно быть предусмотрено его прерывание в какой-то момент, например, оператором break, прерывающим цикл, или функциями Exit или Abort, вызывающими прерывание не только цикла, но и функции или процедуры, внутри которой выполняется данный цикл.

Программа 4_7

//программа, демонстрирующая цикл с постусловием

program Project1;

{$APPTYPE CONSOLE}

Var

n: Integer;

Begin

Write('Enter numbers in the range 1-10 to find ');

Writeln('my favorite number');

Repeat

Readln(n);

until n = 7;

Writeln('Yes, 7 is my favorite.');

Readln;

end.

Результат:

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...