Доступ к символам строки с помощью цикла 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) может опускаться. Структура работает следующим образом. Выполняются операторы тела цикла. Затем вычисляется
Поскольку проверка условия осуществляется после выполнения операторов тела цикла, то эти операторы заведомо будут выполнены хотя бы один раз, даже если условие сразу истинно. С другой стороны, программист должен быть уверен, что условие рано или поздно вернет 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 Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|