Оператор цикла с постусловием REPEAT 


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



ЗНАЕТЕ ЛИ ВЫ?

Оператор цикла с постусловием REPEAT



Оператор repeat имеет следующий формат: Repeat<оператор1>; < оператор2 >; < операторN > until < логическое выражение>;

Выполняются оператор repeat следующим образом. В начале выполняется группа операторов - оператор 1, оператор2,..., операторN. Затем вычисляется значение логического выражения. Если оно равняется true, то цикл прекращается, в противном случае выполняется следующая итерация цикла.

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

В отличие от операторов for и while, синтаксис которых предусматривает выполнение в цикле только одного оператора, в тело цикла оператора repeat может входить произвольное количество операторов. Это означает, что использование операторных скобок begin...end в операторе repeat не обязательно, хотя их присутствие не будет ошибкой.

Пример4.

Определить число членов бесконечного ряда

и найти его сумму с погрешностью е =10-5

Решение

Эта задача была решена нами с использованием оператора while в примере 3 Покажем, что ее можно решить и с использованием оператора цикла с постусловием Напомним, что: s - накапливаемая сумма, t - очередное слагаемое, n - номер текущего члена ряда, eps - погрешность.

Программа

program 4;

{$APPTYPE CONSOLE}

Uses

SynUtils,Math;

Var

eps,s,t:real;

n:integer;

Begin

writeln('Enter eps');

readln(eps);

s:= 0;

t:=1;

n: = 0;

Repeat

s:= s+t;

n:= n+1;

t:= power(2,-n);

until t

writeln('s=',s:7:3);

writeln('number of members of row n=',n:3);

Readln

End.

Результаты работы программы

Enter eps;

o.oooo1

n=2.000

number of members of row n=17

Самостоятельная работа.

Найти сумму ряда:

с погрешностью e=0.001.

Оператор выбора CASE

В отличие от оператора if, оператор ease позволяет выбрать и выполнить один оператор не из двух, а от нескольких операторов. В общем случае оператор case может быть записан следующим образом:

case < выражение > of

< список _меток_1 >: < оператор 1 >;

< список _меток_2 >: < оператор2 >;

.....................................

< список _меток_N>: < операторN >;

Else

< оператор >

end;

В приведенном формате оператора < выражение > - это выражение порядкового типа,определяющее дальнейший ход выполнения программы. Использование порядкового типа означает, что нельзя использовать выражения, возвращающие действительные числа или строки. Список меток представляет собой список констант, разделенных запятыми. Если константы представляют диапазон чисел, то вместо списка можно указать первую и последнюю константы диапазона, разделенные двумя точками. Например, список 1.2,3,4 можно записать как 1..4.

Выполняется оператор case следующим образом.

В начале вычисляется значение выражения, следующего за словом case. Далее полученное значение последовательно сравнивается с константами из списков меток, стоящих перед двоеточиями.

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

Если значение выражения не совпадает ни с одной константой из всех списков меток,то выполняется оператор, стоящий за зарезервированным словом else.

Раздел else не обязательно должен присутствовать в операторе case. Если он отсутствует и значение выражения не совпало ни с одной константой из списков меток, то ни один оператор не будет выполнен.

Пример 5.

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

Решение

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

Программа

program 5;

{$APPTYPE CONSOLE}

Uses

SynUtils;

Var

n:integer;

s: string;

Begin

writeln('Enter n');

readln(n);

case n of

1,2,12:s:='Winter';

3,4,5:s:='Spring';

6,7,8:s:='Summer';

9,10,11:s:='Autumn'

End;

writeln(s);

readln

End.

Результат работы программы

Enter n

Spring.

Для данной задачи в операторе case могут быть использованы диапазоны:

case n of

1,2,12:s:='Winter';

3..5:s:='Spring';

6..8:s:='Summer';

9..11:s:='Autumn'

End;

При использовании раздела else оператор case примет следующий вид:

case n of

3..5:s:='Spring';

6..8:s:='Summer';

9..11:s:='Autumn'

else:s:='Winter';

End;

Оператор перехода GOTO

Оператор перехода goto — это простой оператор, передающий управление в программе на другой оператор, перед которым стоит метка, указанная в операторе goto.

В общем виде оператор записывается следующим образом:

goto < метка >;

Метка в Object Pascal - это произвольный идентификатор либо целое число без знака. Любая метка должна появиться в разделе описания меток, прежде чем она встретится в теле программы. В разделе операторов метка может стоять только перед одним оператором и отделяется от него двоеточием. Нельзя передавать управление внутрь сложных операторов (if, case, операторы циклов), а также из вызывающей программы в подпрограмму.

Пример 6.

Составить программу для вычисления суммы с точностью до 0.001.

Решение

В программе используется алгоритм накопления суммы. Процесс является циклическим и прекращается, как только очередное слагаемое станет меньше 0.001.

Программа.

Program 6;

{$APPTYPE CONSOLE}

Uses

SysUtils;

Label lb1, 1b2;

var L:integer;s:real;

Begin

s:= 0;

i:= 1;

lb1:s:= s+l/sqr(i);

i:= i+1;

if l/sqr(i) < 0.001 then goto lb2 else goto lb1;

1b2:writeln('s=',s);

readln

End.

Результаты работы программы

s= 1.61319070032792Е+0000

Оператор перехода следует использовать в исключительных ситуациях, поскольку он затрудняет понимание программы, делает ее запутанной и сложной в отладке. Использование операторов if, case и операторов цикла позволяет реализовать любой тип вычислительного процесса.

Лекция 7.Строки

Строковые типы

Строка представляет собой набор символов, заключенный в апострофы (одинарные кавычки). Например,

'abcde', 'Иванов И.И.', '10.0', 'S='.

Константа типа char представляет собой символьную строку единичной длины. Используемые и Object Pascal типы строк приведены в таблице 1.13.

Типы строк. Таблица 1.13.

         
  Тип строки Максимальная длина Есть ли нулевой символ в конце  
  ShortString 255 байт нет  
  AnsiString 2 Гб есть  
  String 255 байт/2Гб есть/нет  
  WideString 2Гб есть  
         

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

Пример 1.

В строке 'Ivanov I:’ дописать полностью имя.

Решение Исходная строка имеет длину равную 9. Увеличим вначале эту длину до 12, а затем поместим в строку недостающие символы.

Программа

program 1;

{$APPTYPE CONSOLE)

Uses

SysUtils;

Var

s:shortstring;

Begin

s: = 'Ivanov I.’;

s [0 ]:= chr (12);

s[9]:=’v’;

s[10]:= 'a';

s[11]:= 'n’;

s[12]:= ‘.’;

writeln('s=',s);

readln

End.

Результат работы программы

s=Ivanov Ivan.

Заметим, что длина строки, хранящаяся в нулевом байте, представлена в символьном виде. Поэтому для преобразования в число следует пользоваться стандартной функцией ord, а обратно - функцией chr.

Короткая строка размещается компилятором в памяти компьютера до начала выполним программы, т.е. статически.

Строка типа AnsiString располагается в памяти иначе. Сама переменная типа AnsiString занимает в памяти 4 байта и является указателем, т.е. содержит адрес той ячейки памяти, начиная с которой будет фактически располагаться символьная строка. Выделение байта в программе происходит на этапе выполнения программы, т.е. динамически. Программа сама определить необходимую длину строки по заданному количеству символов, и операционная система выделяет нужный участок памяти. В конце строки размещается терминальный (завершающий) нуль-#0 и так называемый счетчик ссылок, занимающий 4 байта. Нумерация символов в строке типа AnsiString начинается с единицы т.е. первый символ такой строки имеет индекс 1.

Счетчик ссылок позволяет экономить память. Например,если в программе имеется фрагмент:

.......................

var s1,s2:ansistring;

.......................

s1:=’stroka’;

s2:=s1;

.......................

то память для размещения переменной s2 не выделяется, а в переменную s2 помещается значение указателя из переменной s1. Счетчик ссылок в области памяти, связанной переменной s1, увеличивает свое значение на 1 и станет равным 2. В общем случае в программе может быть несколько переменных, ссылающихся на одну и ту же строку. Счетчик ссылок равняется количеству ссылающихся на строку переменных. Если одна из ссылающихся на строку типа AnsiString переменных изменит свое значение, то в памяти будет выделено место для новой строки. Число ссылок в прежней строке уменьшается, а в новой строке становится равным 1. Если число ссылок на строку станет равным 0, то строка уничтожается и освобождает место в памяти.

Пример 2.

Составим программу по условию предыдущего примера, используя строку типа AnsiString.

Решение

Для установки длины строки будем использовать стандартную процедуру SetLength

Программа

Program 2;

($AРРТУРЕ CONSOLE}

Uses

SysUtils;

Var

s:ansistring;

Begin

s:= 'Ivanov I. ‘;

setlength(s,12);

s [ 9 ]: = ' v';

s [ 10 ]: = ' a';

s[ 11]:='n’;

s [ 12]: =’. ';

writeln('s=’,s);

readln

End.

Результаты работы программы

s=Ivanov Ivan.

Заметим, что нумерация символов в строке типа AnsiString начинается с 1.

Тип String интерпретируется компилятором Object Pascal по разному,в зависимости значения директивы компилятора $H. Если она включена-{$H+}-то тип String интерпретируется как AnsiString, если нет –{$H-}- то как ShortString. По умолчанию действует директива {$H+}.

Если в разделе type указано, например, String[10], то независимо от директив компилятора трактуется как ShortString с указанным числом символов.

Тип WideString также представляет собой динамически размещаемые в памяти компьютера строки, длина которых ограничена только объемом свободной памяти компьютера. Однако в отличие от строки типа AnsiString каждый символ является Unicode-символом, т.е. кодируется 2 байтами. Поэтому в строке типа WideString по сравнению со строкой типа AnsiString, имеющей такую же длину, количество символов вдвое меньше.



Поделиться:


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

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