Стандартные функции для символьных величин



Имя Описание Результат Пояснения
ord Порядковый номер символа Целый ord('b') даст в результате 98 ord('ю') даст в результате 238
chr Преобразование в символ Символьный chr(98) даст в результате 'b' chr(238) даст в результате 'ю'
pred Предыдущий символ Символьный pred('b') даст в результате 'a '
succ Последующий символ Символьный succ('b') даст в результате 'c '
upcase Перевод в верхний регистр (только для символов из диапазона 'a ' … 'z ') Символьный upcase('b') даст в результате 'B '

5) Порядковые типы

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

· все возможные значения порядкового типа представляют собой ограниченное упорядоченное множество;

· к любому порядковому типу может быть применена стандартная функция Ord, которая в качестве результата возвращает порядковый номер конкретного значения в данном типе;

· к любому порядковому типу могут быть применены стандартные функции Pred и Succ, которые возвращают предыдущее и последующее значения соответственно;

· к любому порядковому типу могут быть применены стандартные функции Low и High, которые возвращают наименьшее и наибольшее значения величин данного типа.

При изучении операторов Паскаля можно убедиться, что в некоторых из них допускается использовать только величины порядковых типов.

Приведение типов

Иногда при программировании требуется явным образом преобразовывать величину одного типа в величины другого. Для этого служит операция приведения типа, которая записывается так:

имя_типа (преобразуемая_величина).

Например: integer ('A') или byte(500).

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

3.2.2. Линейные программы

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

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

Ниже рассмотрены примеры линейных программ.

Пример 1

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

Program Example_1;

Var a1, d, n:integer; s:real;

Begin

writeln('Введите первый элемент, разность и число элементов арифм. прогрессии');

readln(a1, d, n);

s:=(2*a1+d*(n-1))*n/2;

writeln('Сумма арифметической прогрессии =', s);

end.

Пример 2

Написать программу вычисления площади треугольника по трем сторонам, пользуясь формулой Герона.

Program Example_2;

Var a, b, c, p, s: real;

Begin

Writeln('Введите длины сторон треугольника');

readln(a, b, c);

p:=(a+b+c)/2;

s:=sqrt(p*(p-a)*(p-b)*(p-c));

Writeln('Площадь треугольника=',s);

end.

3.2.3. Программирование разветвляющихся вычислительных процессов

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

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

1. При помощи оператора if … then … else .

2. При помощи оператора case.

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

Условный оператор if

Условный оператор if используется для разветвления процесса вычислений на два направления. Структурная схема оператора приведена на рисунке.

 


Рис. 27. Структурная схема условного оператора

Общая форма записи:

if логическое выражение then серия команд_1 [else серия команд _2;]

если условие то серия команд_1 [иначе серия команд _2;]

Квадратные скобки в записи общего вида оператора означают, что эта часть может отсутствовать. В случае если ветки else нет, такая форма называется сокращенным условным оператором.

Правила работы оператора if:

1. Вычисляется значение логического выражения.

2. Если оно имеет значение true, выполняется оператор_1, иначе — оператор_2.

3. После этого управление передается на оператор, следующий за условным.

В сокращенной форме оператора if управление также передается на оператор, следующий за условным.

Если в серии команд более одного оператора он обрамляется ключевыми словами begin и end (их иногда называют операторными скобками (или блоком)). Блок применяют в том случае, когда по какой-либо ветви требуется выполнить несколько операторов: ведь иначе компилятор не сможет понять, где заканчивается ветвь и начинается следующая часть программы. Одна из ветвей может отсутствовать.

Внимание! Отсутствие ключевых слов begin и end в ветви else компилятор как ошибку не распознает!

Примеры условных операторов:

if a < 0 then b := 1;               {1}

if (a < b) and ((a >d) or (a = 0)) then inc(b)

Else begin

b := b * a; a := 0

end;                                 {2}

 

if a < b then

if a < c then m := a else m := c

Else

if b < c then m := b else m := c; {3}

В примере 1 отсутствует ветвь else.

Если требуется проверить несколько условий, их объединяют знаками логических операций. Так, выражение в примере 2 будет истинно в том случае, если выполнится одновременно условие a < b и хотя бы одно из условий a > d и a = 0. Скобки, в которые заключены операции отношения, обязательны, потому что приоритет у логических операций выше, чем у операций отношения. Поскольку по ветви else требуется выполнить два оператора, они заключены в блок.

В примере 3 вычисляется наименьшее из значений трех переменных a, b и с.

Внимание! Частая ошибка при программировании условных операторов — неверная запись проверки на принадлежность диапазону. Например, условие 0 < x < 1 нельзя записать непосредственно. Правильный способ: if (0 < x) and (x < 1) then…, поскольку фактически требуется задать проверку выполнения одновременно двух условий: x > 0 и x < 1.

Ниже рассмотрены примеры программ с условными операторами.

 

Пример 1

Написать программу, проверяющую, принадлежит ли число, введенное с клавиатуры, интервалу (0;5) .

Решение

Обозначим через х число, вводимое с клавиатуры пользователем (это переменная целого типа). х принадлежит заданному интервалу лишь в том случае, если одновременно выполняются оба условия: (х>0) и (х<5).

Program Example_1;

Var x: Integer;

Begin

Writeln('Введите число х');

Readln(х);

If (x>0) and (x<5) Then Writeln (х,' принадлежит (0,5)')

          Else Writeln(x,' не принадлежит (0,5)');

End.

Пример 2

Программа, которая по введенному значению аргумента вычисляет значение функции, заданной в виде графика (рис. 26).

 


Рис. 28. Функция, заданная в виде графика

Составим описание алгоритма в неформальном словесном виде.

1. Ввести значение аргумента х.

2. Определить, какому интервалу из области определения функции оно принадлежит, и вычислить значение функции y по соответствующей формуле.

3. Вывести значения х и y.

Второй пункт алгоритма следует детализировать. Сначала запишем определение функции в виде формул.

Теперь в соответствии с формулами опишем словами последовательность действий второго пункта алгоритма:

· Если x < –2 , присвоить переменной y значение 0

· Если –2 <= x < –1 , присвоить переменной y значение –x – 2.

· Если –1 <= x < 1 , присвоить переменной y значение x .

И так далее.

Теперь шаги алгоритма представлены максимально подробно, поэтому можно приступать к написанию программы.

program Example_2;

var x, y : real;

Begin

writeln(' Введите значение аргумента'); readln(x);

if x < –2        then y := 0;

if (x >= –2) and (x < –1) then y := –x – 2;

if (x >= –1) and (x < 1) then y := x;

if (x >= 1) and (x < 2) then y := –x + 2;

if x >= 2          then y := 0;

writeln('Для x = ', x:6:2, ' значение функции y = ', y:6:2);

end.

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

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

const eps = 1e-6; { Требуемая точность вычислений }

var x, y : real;

...

if (x = y) then writeln('Величины x и y равны'); { Плохо! Ненадежно! }

if (abs(x - y) < eps) then writeln('Величины x и y равны'); { Рекомендуется }

Большого количества вложенных условных операторов также следует избегать, потому что они делают программу совершенно нечитабельной.

Оператор варианта case

Оператор варианта (множественного выбора) предназначен для разветвления процесса вычислений на несколько направлений. Структурная схема оператора приведена на рис. 27. Формат оператора:

 case выражение of

константы_1 : оператор_1;

константы_2 : оператор_2;

константы_n : оператор_n;

[ else : оператор ]

end;

 

 

Рис. 29. Структурная схема оператора выбора

Эта конструкция предназначена для замены конструкций из вложенных условных операторов и применяется для обработки ситуаций с несколькими исходами.

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

Если значение выражения не совпадает ни с одной константой, то выполняется оператор, стоящий после Else, если он есть, либо управление передается на оператор, следующий за End, например:

Если по какой-либо ветви требуется записать не один, а несколько операторов, они заключаются в блок с помощью ключевых слов begin и end .

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

Примечания

1. Тип константы должен совпадать с типом выражения.

2. Ветвь Else заключена в квадратные скобки, что гово­рит о том, что эта часть оператора выбора необязательна.

3. В конструкции выбора, в отличие от условного опера­тора, перед Else ставится точка с запятой.

4. В качестве операторов могут использоваться и составные операторы.

5. Можно задавать не только одну константу, но и список и диапазон констант. Соответствующие примеры приведены далее.

Пример 3.

Для натурального числа k от 1 до 99 напечатать фразу "мне k лет", учитывая, что при некоторых значениях k слово "лет" надо заменить на слово "год" или "года".

Решение

Ключевое слово ("лет", "год", или "года") в описании возраста человека зависит только от последней цифры в числе прожитых лет, исключением из общего правила является возраст от 11 до 14 лет.

program Example_3;

var k: 1..99;

Begin

writeln('Введите возраст в годах');

readln(k);

write('мне ',k);

if k in [11..14] then write('лет') else

case k mod 10 of

0, 5..9: write('лет');

1: write('год');

2..4: write('года');

end {case}

end.

Пример 4.

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

Решение

Program Example_4;

var century, year, c: word;

Begin

write('Введите номер года==>');

readln(year);

century:=(year-1) div 100+1;

{если номер года делится на сто, то это конец предыдущего века, а не начало нового, поэтому из номера года вычитается 1}

if century>=11 then

    begin

         write('x');

         century:=century mod 10;

    end; {if}

case century of

    1..3: for c:=1 to century do write ('I');

    4: write(IV');

    5..8:begin

         write('V');

         for c:=1 to century-5 do write ('I')

         end;

    9:write('IX');

    0, 10: write('X')

end; {case}

end.

Оператор безусловного перехода. Описание меток

Общий вид оператора: Goto <метка>,

где Goto (иди к…) − служебное слово, метка − целое число без знака, определяемое в разделе Label как метка оператора.

Раздел (подраздел) описания меток (Label) располагается в разделе описания. Любой оператор в программе можно выделить, поставив перед ним метку − целое число без знака, содержащая не более четырех цифр. Метка от оператора отделяется двоеточием. Появление меток в программе дает возможность сослаться на эти метки для изменения хода выполнения программы. Все метки должны быть перечислены в разделе описания меток, например: Label 1,12, 999.

Оператор перехода Goto производит передачу управления к оператору, помеченному указанной меткой.

Применение оператора безусловного перехода является необязательным и нежелательным, так как его присутствие в программе нарушает ее структурную целостность и наглядность, такую программу становится трудно читать, отлаживать и модифицировать. Используют операторы Goto лишь в исключительных случаях, например, для выхода из структурного (составного) оператора при возникновении особой ситуации в программе.

Пример 5

Найти количество целых четных чисел, вводимых с клавиатуры. Выход из программы по вводу 0.

Program Example_5;

Label 1;

var a,k: integer;

Begin

k:=0;

1: Writeln('Введите число');

Readln(a);

If a<>0 then

    Begin

         If a mod 2=0 then k:=k+1;

         Goto 1;

    End;

Writeln('количество четных чисел= ',k);

End.

С помощью оператора безусловного перехода нельзя выйти из подпрограммы, так как метки действуют только в том блоке, в котором они описаны. Для того, чтобы прервать выполнение процедуры или функции, можно воспользоваться стандартными процедурами Halt и Exit. Подробно они описаны в разделе про циклы.

Задача для самостоятельного решения

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

Примечание. Эту хорошо известную задачу иногда называют тестом Г. Майерса на профессиональную пригодность (он приведен в его книге "Искусство тестирования программ"). Если вы сможете в своей программе проверить порядка 10 различных случаев, то вам следует выбрать программирование своей специальностью.

3.2.4. Программирование циклических процессов

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

Для того чтобы правильно программировать работу циклов необходимо знать следующие термины:

Тело цикла - последовательность команд, предназначенная для многократного исполнения.

Итерация - разовое выполнение тела цикла (один «проход»).

Условие выхода или условие окончания цикла (либо условие продолжения в зависимости от того, как интерпретируется его истинность — как признак необходимости завершения или продолжения цикла) - логическое выражение определяющее, будет в очередной раз выполняться итерация, или цикл завершится.

Параметр цикла - переменная, которая используется при проверке условия цикла и принудительно изменяется на каждой итерации, причем, как правило, на одну и ту же величину. Если параметр цикла целочисленный, он называется счетчиком цикла. Количество повторений такого цикла можно определить заранее. Параметр есть не у всякого цикла.

Цикл не обязательно содержит счётчик, счётчик не обязан быть один — условие выхода из цикла может зависеть от нескольких изменяемых в цикле переменных, а может определяться внешними условиями (например, наступлением определённого времени), в последнем случае счётчик может вообще не понадобиться.

Для организации цикла необходимо выполнить следующие действия:

· перед началом цикла задать начальное значение параметра;

· внутри цикла изменять параметр цикла с помощью оператора присваивания;

· проверять условие повторения или окончания цикла;

· управлять циклом, т.е. переходить к его началу, если он не закончен, или выходить из цикла в противном случае.

Виды циклов:

1. Определенные – количество повторений тела цикла известно до начала цикла. Такой цикл называется циклом с параметром.

Рис 30. Блох – схема цикла с параметром (M - начальное значение счетчика, N - конечное значение счетчика, шаг цикла -1).

2. Неопределенные:

a. Цикл с предусловием (цикл ПОКА) – выполнение команд тела цикла повторяется до тех пор пока условие истинно. Если на момент начала цикла условие ложно, тело цикла не выполнится ни разу.

 

Рис 31. Блох – схема цикла с предусловием

b. Цикл с постусловием (цикл ДО) – сначала выполняются команды тела цикла, затем проверяется условие и если оно ложно, то происходит повтор выполнения команд тела цикла. Т.е. выполнение команд тела цикла повторяется при ложном условии.

Рис 32. Блох – схема цикла с постусловием

В Паскале реализуются все три вида циклов: цикл с предусловием while, цикл с постусловием repeat и цикл с параметром for.

Цикл с параметром for

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

For <параметр>:= А То В Do <тело цикла>;

For <параметр>:=А Downto В Do <тело цикла>;

где А − начальное значение параметра, В − конечное значение параметра.

Начальное и конечное значения параметра цикла могут быть представлены константами, переменными или арифметическими выражениями,

Правило выполнения оператора цикла с То: сначала вычисляются значения выражений А и В. Если А<В, то <параметр> последовательно принимает значения, равные А, А+1,..., В-1, В и для каждого из этих значений выполняется <тело цикла>. Если А>В, то <тело цикла> не выполняется ни разу.

Оператор цикла с Downto выполняется аналогичным образом, но значение <параметра> изменяется с шагом, равным -1.

Если <тело цикла> состоит из нескольких операторов, то операторы тела цикла заключаются в операторные скобки Begin-End.

Пример 1. Программа выводит на экран числа от 10 до 1 и подсчитывает их сумму:

Program Example_1;

var i, sum : integer;

Begin

sum := 0;

for i := 10 downto 1 do begin

   writeln(i); inc(sum, i)

end;

writeln('Сумма чисел: ', sum);

end.

В этом цикле переменная i автоматически уменьшается на 1.

Пример 2. Вывести все двузначные числа, сумма цифр которых равна s.

Обозначим через k очередное число, p1 − старшую цифру числа k, р2 − младшую цифру числа k, s1 − сумму цифр числа k. Число k будем печатать только в том случае, когда сумма р1 и р2 будет равна s.

Program Example_2;

Var k, s1, p1, p2, s:Integer;

Begin

Writeln('введите целое число ');

Readln(s); {вводим целое число}

For k:=10 To 99 Do

Begin

p1:=k div 10; {выделяем старшую цифру}

p2:=k mod 10; {выделяем младшую цифру}

s1:=p1+p2; {находим сумму цифр}

If s=s1 Then Writeln(k);

End;

End.

Пример 3. Фрагмент программы, которая выводит на экран символы от 'a' до 'z':

 var ch : char;

Begin

for ch := 'a' to 'z' do write(ch:2)

end.

Здесь счетчик цикла ch символьного типа поочередно принимает значение каждого символа от 'a' до 'z'.

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

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

for i := 1 to 10 do i:=i+3;    { не рекомендуется ! }

Это может привести к зацикливанию программы.

Цикл с предусловием while

Формат оператора: while выражение do оператор

Выражение должно быть логического типа. Например, это может быть операция отношения или просто логическая переменная. Если результат вычисления выражения равен true, выполняется расположенный после служебного слова do простой или составной оператор (напомним, что составной оператор заключается между begin и end ). Эти действия повторяются до того момента, пока результатом выражения не станет значение false. После окончания цикла управление передается на следующий за ним оператор. Если в теле цикла необходимо выполнить более одного оператора, необходимо заключить их в блок с помощью ключевых слов begin и end.

Пример 4. Программа, печатающая таблицу значений функции:

Для аргумента, изменяющегося в заданных пределах с заданным шагом.

Алгоритм в словесной форме:

1. Ввести исходные данные.

2. Взять первое значение аргумента.

3. Определить, какому из интервалов оно принадлежит.

4. Вычислить значение функции по соответствующей формуле.

5. Вывести строку таблицы.

6. Перейти к следующему значению аргумента.

7. Если оно не превышает конечное значение, повторить шаги 3–6, иначе закончить.

Шаги 3–6 повторяются многократно, поэтому для их выполнения надо организовать цикл. Назовем необходимые нам переменные так: начальное значение аргумента — Xn, конечное значение аргумента — Xk, шаг изменения аргумента — dX, параметр — t. Все величины вещественные. Программа выводит таблицу, состоящую из двух столбцов — значений аргумента и соответствующих им значений функции.

program Example_4;

var Xn, Xk:real;{начальное и конечное значение аргумента}

dX:real; {шаг изменения аргумента}

x, y:real;{текущие значения аргумента и функции}

t:real; {параметр}

Begin

writeln('Введите Xn, Xk, dX, t');

readln(Xn, Xk, dX, t);

 writeln('--------------------------- ');

{заголовок таблицы}

writeln('| X | Y |');

writeln(' --------------------------- ');

x := Xn; {первое значение аргумента = Xn – шаг 2}

while x <= Xk do begin {заголовок цикла – шаг 7}

if x < 0 then y := t; {вычисление значения функции - шаг 4}

if (x >= 0) and (x < 10) then y := t * x; {шаг 4}

if x >= 10 then y:=2* t; { шаг 4 }

writeln('|', x:9:2,' |', y:9:2,' |');{вывод строки табл. – шаг 5 }

x := x + dX; {переход к следующему значению аргумента - шаг 6}

end;

writeln(' --------------------------- ');

end.

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

Пример 5. Подсчитать количество цифр заданного натурального числа n.

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

Program Example_5;

Var m, n:Longint; k:Integer; {счетчик цифр}

Begin

Writeln('Введите натуральное число');

Readln(n);

m:=n; k:=0;

While m<>0 Do {пока (While) число m<>0 делать (Do)}

Begin

Inc(k); {k:=k+1;}

m:=m div 10; {"выбрасываем" из числа последнюю цифру}

 End;

Writeln('В числе ',n,' - ' , k,' цифр'); {вывод количества цифр}

End.

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

Цикл с постусловием repeat

Тело цикла с постусловием заключено между служебными словами repeat и until, поэтому заключать его в блок не требуется.

 repeat

тело цикла

until выражение

В отличие от цикла while, этот цикл будет выполняться, пока логическое выражение после слова until ложно. Как только результат выражения станет истинным, произойдет выход из цикла. Вычисление выражения выполняется в конце каждой итерации цикла.

Этот вид цикла применяется в тех случаях, когда тело цикла необходимо обязательно выполнить хотя бы один раз: например, если в цикле вводятся данные и выполняется их проверка.

Пример 6. Составить программу планирования закупки товара в магазине на сумму, не превышающую заданной величины.

Решение. Обозначим через х и k цену и количество товара, через р − заданную предельную сумму, через s − стоимость покупки. Начальное значение общей стоимости покупки s равно нулю. Значение предельной суммы считывается с клавиатуры. Необходимо повторять запрос цены и количества выбранного товара, вычислять его стоимость, суммировать ее с общей стоимостью и выводить результат на экран до тех пор, пока стоимость не превысит предельной суммы р.

 

Program Example_6;

Var x, k, p, s: Integer;

Begin

Writeln('Предельная сумма');

Readln(p);

s:=0;

Repeat

Writeln('Введите цену товара и его количество');

Readln(x, k);

s:=s+x*k;

Writeln('Стоимость покупки равна ',s);

Until s>p;

Writeln('Суммарная стоимость покупки превысила предельную сумму');

End.

Пример 7. Программа, вычисляющая квадратный корень вещественного аргумента X с заданной точностью eps по итерационной формуле: ),

где yn –1 — предыдущее приближение к корню (в начале вычислений выбирается произвольно), yn — последующее приближение. Процесс вычислений прекращается, когда приближения станут отличаться друг от друга по абсолютной величине менее, чем на eps — величину заданной точности.

program Example_7;

var X, eps,  { аргумент и точность }

Yp, Y:real;{ предыдущее и последующее приближение }

Begin

Repeat

writeln('Введите аргумент и точность (больше нуля): ');

   readln(X, eps);

until (X > 0) and (eps > 0);

Y := 1;

Repeat

   Yp := Y;

   Y := (Yp + X / Yp) / 2;

until abs(Y - Yp) < eps;

 writeln('Корень из ', X:6:3, ' с точностью ', eps:7:5, 'равен ', Y:9:5);

end.

Пример 8. Программа запроса пароля для входа в программу.

Program Example_8;

Var S, S1:String;

Begin

S:=’1A2B3C4D’;{значение пароля}

Repeat {выполнять}

Write(‘Введите пароль:’);

Readln(S1);

Until S=S1;{до тех пор, пока вводимый пароль не совпадет с эталонным программа дальше не продолжится}

{Здесь команды выполняющиеся в случае правильного пароля}

End.

Рекомендации по использованию циклов

Часто встречающимися ошибками при программировании циклов являются использование в теле цикла переменных, которым не были присвоены начальные значения, а также неверная запись условия продолжения цикла. Нужно помнить и о том, что в операторе while истинным должно являться условие повторения вычислений, а в операторе repeat — условие их окончания.

Чтобы избежать ошибок, рекомендуется:

· не забывать о том, что если в теле циклов while и for требуется выполнить более одного оператора, нужно заключать их в блок;

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

· проверить, изменяется ли в теле цикла хотя бы одна переменная, входящая в условие продолжения цикла;

· предусматривать аварийный выход из итеративного цикла по достижении некоторого предельно допустимого количества итераций.

Процедуры передачи управления

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

· break— завершает выполнение цикла, внутри которого записана;

· continue— выполняет переход к следующей итерации цикла;

· exit— выполняет выход из программы или подпрограммы, внутри которой записана;

· halt— немедленно завершает выполнение программы.

Кроме того, для передачи управления используется оператор перехода goto.

Перечисленные процедуры очень помогают при программировании сложных задач с циклами.

Контрольные вопросы

1. Опишите алфавит и лексическую структуру языка Паскаль.

2. Из каких разделов состоит программа на Паскале?

3. Может ли раздел описания переменных располагаться до раздела описания типов?

4. Как работает оператор присваивания?

5. Перечислите правила использования операторов ввода – вывода.

6. Что такое форматированный вывод?

7. Как обеспечить ввод символьных строк?

8. В каких случаях предпочтительнее использовать оператор case а в каких if.. then .. else?

9. Каков шаг изменения параметра в цикле for?

10. Чем цикл ДО отличается от цикла ПОКА?

Задачи и упражнения

Напишите программу на языке Паскаль:

1. Дано двузначное число. Получить число, образованное при перестановке цифр заданного числа.

2. Дано трехзначное число. В нем зачеркнули последнюю справа цифру и приписали ее в начале. Найти полученное число.

3. С начала суток прошло п секунд. Определить:

а) сколько полных часов прошло с начала суток;

б) сколько полных минут прошло с начала очередного часа;

в) сколько полных секунд прошло с начала очередной минуты.

4. Даны координаты (как целые от 1 до 8) двух различных полей шахматной доски. Если слон за один ход может перейти с одного поля на другое, вывести логическое значение True, в противном случае вывести значение False.

5. Проверить истинность высказывания: "Данные числа x, y являются координатами точки, лежащей в первой или третьей координатной четверти".

6. Единицы массы пронумерованы следующим образом: 1 — килограмм, 2 — миллиграмм, 3 — грамм, 4 — тонна, 5 — центнер. Дан номер единицы массы и масса тела M в этих единицах (вещественное число). Вывести массу данного тела в килограммах.

7. Робот может перемещаться в четырех направлениях ("С" — север, "З" — запад, "Ю" — юг, "В" — восток) и принимать три цифровые команды: 0 — продолжать движение, 1 — поворот налево, –1 — поворот направо. Дан символ C — исходное направление робота и число N — посланная ему команда. Вывести направление робота после выполнения полученной команды.

8. Написать программу, которая определяет, попадает ли точка с заданными коор­динатами в область, закрашенную на рисунке серым цветом. Результат работы программы вывести в виде текстового сообщения.

9. Вывести на экран таблицу перевода расстояния из милей в километры для значений от 1 до 10 км.

10. Назовем натуральное число палиндромом. Если его запись читается одинаково с начала и с конца (например, 4884,393,1). Найти все палиндромы меньшие заданного числа n.

11. Ивана Александровича Хлестакова пригласили управлять департаментом. В первый день ему прислали n (1000) курьеров, а в каждый последующий - в два раза больше, чем в предыдущий. Иван Александрович согласился тогда, когда к нему прибыло сразу не менее m(30 000) курьеров. На какой день Хлестаков согласился управлять департаментом?

12. Вывести на экран таблицу перевода расстояния из милей в километры для значений от 1 до 10 км.

13. Вычислить и вывести на экран в виде таблицы значения функции, заданной графически, на интервале от xнач до хкон с шагом dx. Интервал и шаг задать таким образом, чтобы проверить все ветви программы. Таблицу снабдить заголовком и шапкой.

14. Каждый месяц клиент банка делает вклад в 10 000 рублей на текущий счет. Банковский процент 3,2 % от вклада рассчитывается поквартально. Рассчитать величину общей суммы вклада и накопленной прибыли для каждого года 10-летнего периода.

15. Энергокомпания взимает плату с клиентов по следующему тарифу:

· 2р 20 коп за 1 Квт/ч для первых 300 кВт/ч,

· 3 р. 40 коп. за 1 Квт/ч для следующих 300 кВт/ч,

· 4 р. 20 коп. за 1 Квт/час для следующих 400 кВт/ч,

· 5 р. за 1 Квт/ч для всей электроэнергии потребляемой свыше 1000 кВт/ч,

Написать программу для вычисления платы за электроэнергию для введенной величины потребленной электроэнергии. Предусмотреть расчеты для N клиентов.

Упражнения для выполнения без компьютера

16. Выполнить трассировку и ответить на вопросы по заданному фрагменту программы:

for i:=l to n do

begin j:=2;

while j<=m do

begin write (i+j);

end;

writeln; end.

Сколько раз будет выполнен оператор write ( i+j )?

Сколько строчек будет напечатано?

17. Записать как можно проще на языке Паскаль:

ЕСЛИ а больше b

ТО ничего не делать

ИНАЧЕ ЕСЛИ 2d меньше 3 sin(x)

ТО ЕСЛИ а больше двух с половиной, умноженных на 10-3

ТО ничего не делать

ИНАЧЕ с присвоить 32

ВСЕ

ИНАЧЕ ничего не делать

ВСЕ

ВСЕ

18. Определить каким было значение переменной а до выполнения программы, если после его выполнения а=3.

A:=?;

If a<5 then a:=1

else

if a>5 then a:=2 else a:=3;

19. Объяснить ошибки в записях:

1) 1 and 0;

2) true+false;

3) true<0;

4) not 2=5;

5) x>0 or y=4;

6) not not b or or d;

7) true>’true’.

20. Исправить программу так, чтобы избавиться от вложенного цикла:

S:=0;

While i:=1 to n do

Begin p:=1;

For j:=1 to I do p:=p*j;

s:=s+p;

End.


Дата добавления: 2018-09-22; просмотров: 737; Мы поможем в написании вашей работы!

Поделиться с друзьями:






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