if <условие>

then <оператор, который нужно выполнить,

если условие справедливо>;

Найдем максимальное из двух чисел, используя краткий вариант условного оператора:

Program If_operator_2;

var

a, b,max:real;

begin

write('Эта программа находит максимальное ');

writeln('из двух действительных чисел.');

writeln('Введите два числа:');

write('a= ');

readln(a);

write('b= ');

readln(b);

max:=a;

if a<b

then max:=b;

writeln('max= ', max);

writeln;

end.

3.3. Операторные скобки begin ... end. Если ветви then или else должны содержать более одного оператора, в качестве <оператор 1> и/или <оператор 2> следует использовать составной оператор

begin

<операторы>

end

Служебные слова begin и end выполняют функцию операторных скобок, ограничивающих группу операторов.

Немного усложним задачу: найдем максимальное из двух чисел a и b, при этом, если максимальным окажется число a, его следует возвести в квадрат, если же максимальным окажется число b, его следует возвести в куб.

Program If_operator_1;

var

a, b,max:real;

begin

write('Эта программа находит максимальное ');

writeln('из двух действительных чисел.');

writeln('Введите два числа:');

write('a= ');

readln(a);

write('b= ');

readln(b);

if a>b

then begin

writeln('Максимальное число: ',a:5:2);

writeln('Результат: ',sqr(a):5:2);

end

else begin

writeln('Максимальное число: ',b:5:2);

writeln('Результат: ',b*sqr(b):5:2);

end

writeln;

end.

3.4. Задания по теме 3: Условный оператор.

НЕ нашли? Не то? Что вы ищете?

В следующих заданиях x, y, z - заданные действительные числа. Написать программу, которая вычисляет f, если

1) ;

2) ;

3) ;

4) ;

5)

6)

7)

8)

9)

10)

4. Операторы циклов

4.1. Оператор цикла for .. do. Общий вид оператора:

for <параметр цикла> := <начальное значение> to

<конечное значение> do <оператор>;

Здесь <параметр цикла> - переменная целого или порядкового типа; <оператор> - любой оператор, в том числе составной, т. е. группа операторов, заключенных в "операторные скобки" begin .. end. Начальное и конечное значения могут быть вычисляемыми выражениями.

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

Возможна другая форма оператора for .. do, когда при каждом исполнении цикла параметр цикла уменьшается на единицу:

for <параметр цикла> := <начальное значение> downto

<конечное значение> do <оператор>;

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

Чтобы проиллюстрировать использование операторов цикла, рассмотрим следующую задачу: нужно вычислить выражение

.

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

.

Для вычисления этого выражения можно организовать цикл, в качестве параметра которого выберем переменную k, она будет изменяться от начального значения 1 до конечного значения n. Внутри цикла последовательно вычислим числитель и знаменатель дроби, для чего нам понадобятся еще две переменные, скажем, p (числитель) и q (знаменатель). До входа в цикл присвоим этим переменным начальные (нулевые) значения. Вообще говоря, при запуске программы в системе программирования Pascal значения всех переменных зануляются (происходит инициализация), так что, казалось бы, присваивание нулевых значений можно было бы опустить, но с точки зрения логики программирования значения всех переменных, используемых внутри цикла, должны быть определены перед входом в цикл, ведь эти значения могут быть ненулевыми, или эти переменные могли быть использованы ранее в программе и получить другие (ненулевые) значения.

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

Внимание! Перед запуском программы, которая содержит циклы, настоятельно рекомендуется ее сохранить! Если в программе есть ошибки, она может "зациклиться" (выполнение цикла никогда не прекратится), и выполнение программы придется завершить средствами Windows, при этом программа не будет сохранен в памяти компьютера, и ее придется набирать заново.

Program Cycles_1;

var

n, k:integer;

p, q,r:real;

begin

writeln('Программа находит значение выражения.');

write('Задайте целое число n: ');

readln(n);

p:=0;

q:=0;

for k:=1 to n

do begin

p:=p+sqrt(2*k+1);

q:=q+sqrt(2*k)

end;

r:=p/q;

writeln('Значение выражения равно ',r:7:4);

end.

Ту же самую программу можно написать, используя вторую форму цикла (for .. do .. downto):

Program Cycles_2;

var

n, k:integer;

p, q,r:real;

begin

writeln('Программа находит значение выражения.');

write('Задайте целое число n: ');

readln(n);

p:=0;

q:=0;

for k:=n downto 1

do begin

p:=p+sqrt(2*k+1);

q:=q+sqrt(2*k)

end;

r:=p/q;

writeln('Значение выражения равно ',r:7:4);

end.

4.2. Оператор цикла while .. do. Общий вид оператора:

while <условие> do <оператор>;

Указанный здесь оператор (в том числе составной) циклически выполняется, пока справедливо указанное условие. Условие проверяется до выполнения оператора. Внутри цикла необходимо предусмотреть оператор, изменяющий значение переменной цикла, так как, в отличие от цикла for .. do, в данном случае параметр цикла не меняется автоматически. Шаг изменения параметра цикла не обязательно равен 1. До входа в цикл переменной цикла необходимо присвоить начальное значение.

Приведем вариант рассмотренной выше программы с использованием оператора цикла while .. do:

Program Cycles_3;

var

n, k:integer;

p, q,r:real;

begin

writeln('Программа находит значение выражения.');

write('Задайте целое число n: ');

readln(n);

p:=0;

q:=0;

k:=1;

while k<=n

do begin

p:=p+sqrt(2*k+1);

q:=q+sqrt(2*k);

k:=k+1

end;

r:=p/q;

writeln('Значение выражения равно ',r:7:4);

end.

4.3. Оператор цикла repeat .. until. Общий вид оператора:

repeat <операторы> until <условие>;

Указанные здесь операторы выполняются, после чего проверяется указанное условие. Операторы повторяются до тех пор, пока не выполнено условие. При необходимости циклического повторения нескольких операторов, оператор repeat .. until не требует использования составного оператора (т. е. "операторные скобки" begin .. end можно не писать). Так же, как и в случае цикла while .. do, внутри цикла необходимо предусмотреть оператор, изменяющий значение переменной цикла, а до входа в цикл – присвоить переменной цикла начальное значение.

Приведем вариант рассмотренной выше программы с использованием оператора цикла repeat .. until:

Program Cycles_3;

var

n, k:integer;

p, q,r:real;

begin

writeln('Программа находит значение выражения.');

write('Задайте целое число n: ');

readln(n);

p:=0;

q:=0;

k:=1;

repeat

p:=p+sqrt(2*k+1);

q:=q+sqrt(2*k);

k:=k+1

until k>n;

r:=p/q;

writeln('Значение выражения равно ',r:7:4);

end.

4.4. Задания по теме 4: Операторы циклов.

В следующих заданиях n - заданное натуральное число, x - заданное действительное число. Написать три различных варианта программы, используя, соответственно, операторы циклов for .. do, while .. do, repeat .. until. В программе необходимо вычислить:

1) ;

2) ;

3) ;

4) ;

5) ;

6) ;

7) ;

8) ;

9) ;

10) .

5. Целочисленные типы данных

5.1. Типы данных и диапазон значений. В языке Pascal имеется 5 целочисленных типов данных. В зависимости от типа переменная может принимать тот или иной диапазон значений.

byte

байт - длина 8 бит (без знака), диапазон значений -
0 .. +255;

shortint

короткое целое - длина 8 бит (1 бит - знак числа + 7 бит - двоичные цифры), диапазон значений - -+127;

word

слово - длина 16 бит (без знака), диапазон значений -
0 .. +65 535;

integer

целое - длина 16 бит (1 бит - знак числа + 15 бит - двоичные цифры), диапазон значений - +32 767;

longint

длинное целое - длина 16 бит (1 бит - знак числа + 31 бит - двоичные цифры), диапазон значений -
-2 +2

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

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

var

b:integer;

begin

b:=1000; (* Это значение не превосходит 32767 *)

b:=50*b; (* b=50000, что больше 32767 *)

writeln('b=',b:5)

end.

В результате получим неправильное значение b=–15536. Для того, чтобы объяснить такой результат, нужно вспомнить, что компьютер работает с числами в двоичном представлении. Число 50000 в двоичной системе счисления есть 100. Поскольку это число типа integer, первый бит - 1 - указывает на знак числа, это число воспринимается как отрицательное. Отрицательные числа записываются в так называемом дополнительном двоичном коде, в котором 100 соответствует числу -15536.

Иногда ошибки, вызванные тем, что значение числа превосходит допустимый диапазон, приводят к прерыванию работы программы и сообщению о переполнении, например, в случае вычисления факториала числа n (факториал числа – произведение всех целых чисел от 1 до n), если соответствующая переменная не описана как longint.

5.3. Стандартные функции, применимые к целочисленным типам данных. К данным целых типов применимы все арифметические операции, в частности, целочисленное деление div, получение остатка от деления mod, а также стандартные функции:

abs(i)

вычисляет модуль i, i - выражение любого целого типа;

chr(i)

возвращает символ, соответствующий коду i, i - выражение типа byte (имеет значение от 0 до 255), результат имеет тип char;

dec(i)

уменьшает значение переменной i на 1, i - переменная любого целого типа;

dec(i, j)

уменьшает значение переменной i на целое число j, i - переменная любого целого типа;

inc(i)

увеличивает значение переменной i на 1, i - переменная любого целого типа;

inc(i, j)

увеличивает значение переменной i на целое число j, i - переменная любого целого типа;

hi(i)

возвращает старший байт аргумента, i - выражение типа integer или word, результат имеет тип byte;

lo(i)

возвращает младший байт аргумента, i - выражение типа integer или word, результат имеет тип byte;

odd(i)

принимает значение true (типа boolean), если i - нечетное число, и false - в противном случае;

pred(i)

возвращает предшествующее значение (i-1), i - выражение любого целого типа;

random(i)

возвращает псевдослучайное число из диапазона
0 .. (i-1), i - выражение типа byte;

sqr(i)

возводит в квадрат выражение i любого целого типа;

swap(i)

меняет местами байты в значении выражения i, i - выражение типа integer или word;

succ(i)

возвращает следующее значение (i+1), i - выражение любого целого типа.

5.4. Пример: вычисление суммы цифр числа. Как пример работы с данными целого типа, приведем короткую программу, которая вычисляет сумму чисел целого числа n. Чтобы программа могла работать с числами, состоящими из цифр, используется тип longint. Сумма цифр числа накапливается в переменной s. Она наверняка не превосходит 255, поэтому используется тип byte. При нахождении суммы чисел используются операции целочисленного деления div и получения остатка от целочисленного деления mod (см. раздел 2). Нахождение остатка от деления целого числа на 10 с помощью операции mod позволяет определить последнюю цифру числа, например,

1234 mod 10 = 4.

Эта последняя цифра добавляется к сумме s. Целочисленное деление числа на 10 с помощью операции div позволяет отбросить последнюю цифру числа, например,

1234 div 10 = 123,

после чего цикл повторяется, пока вспомогательная переменная i не станет равной нулю.

Program Integer_types;

var

n, i:longint;

s:byte;

begin

write('Введите любое целое число, которое ');

writeln('по модулю не превосходит 2 ');

readln(n);

i:=n;

s:=0;

while i<>0

do begin

s:=s+abs(i mod 10);

i:=i div 10

end;

writeln('Сумма цифр ', n:9, ' равна ', s:3)

end.

5.5. Задания по теме 5: Целочисленные типы данных.

В следующих заданиях i, k - заданные натуральные числа в диапазоне
0; l - заданное натуральное число в диапазоне 00; m, n - натуральные числа в диапазоне 1При описании переменных i, k, l, m, n выбрать один из целочисленных типов данных (byte, shortint, word, integer, longint), соответствующий заданному диапазону значений. Учесть, что

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

совершенным называется целое число, равное сумме своих делителей (при этом оно само не включается в число делителей). Например, 28 = 1+2+4+7+14.

1) Написать программу, которая находит все простые числа на интервале от i до k.

2) Написать программу, которая находит все совершенные числа на интервале от i до k.

3) Написать программу, которая находит все числа на интервале от i до k, которые делятся на 9.

4) Написать программу, которая проверяет, является ли сумма цифр натурального числа l простым числом.

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

6) Написать программу, которая находит все числа на интервале от m до n, все цифры которых различны.

7) Написать программу, которая находит все числа на интервале от m до n, которые содержат три одинаковые цифры.

8) Написать программу, которая находит все числа на интервале от m до n, которые содержат две одинаковые цифры.

9) Написать программу, которая находит все числа на интервале от m до n, которые являются перевертышами. Перевертышами называются такие четырехзначные числа, у которых две первые цифры совпадают с двумя последними в обратном порядке, например, 2222, 6116, 8558.

10) Написать программу, которая находит все числа на интервале от m до n, которые делятся на 7.

6. Вещественные типы данных

6.1. Типы данных и диапазон значений. В языке Pascal имеется 5 действительных типов данных.

single

длина 4 байт, 7 .. 8 значащих цифр, диапазон значений -
1EE+38;

real

длина 6 байт,значащих цифр, диапазон значений - 1EE+38;

double

длина 8 байт,значащих цифр, диапазон значений - 1E-E+308;

extended

длина 10 байт,значащих цифр, диапазон значений - 1E-4E+4932;

comp

длина 8 байт,значащих цифр, диапазон значений - 1E(-2*1063 +E(2*1

Возможность использования типов single, double, extended и comp требует наличия арифметического сопроцессора. Для обращения к арифметическому сопроцессору служит опция 8087/80287 (меню OPTIONS - COMPILER - NUMERIC PROCESSING - 8087/80287). При активной опции 8087/80287 (отмечается крестиком X) компилятор будет обращаться к арифметическому сопроцессору, и в программе можно использовать типы single, double, extended, comp. При неактивной опции 8087/80287 разрешается использовать в программе только тип real.

Если компьютер не имеет сопроцессора, то его работу можно эмулировать (воспроизводить) с помощью специальных подпрограмм. Для подключения этих подпрограмм имеется опция EMULATION (меню OPTIONS - COMPILER - NUMERIC PROCESSING - EMULATION). Когда опция EMULATION активна, программа становится независимой от наличия сопроцессора. Если сопроцессор имеется, будут использоваться все его возможности; если сопроцессора нет, его работа будет воспроизводиться с помощью подпрограмм, и все вещественные типы данных можно использовать. Однако подключение дополнительных подпрограмм увеличивает объем программы. Если опция 8087/80287 неактивна, опция EMULATION игнорируется.

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

{$N+}

директива использовать числовой сопроцессор (включает опцию 8087/80287);

{$N-}

директива не использовать числовой сопроцессор (отключает опцию 8087/80287);

{$E+}

директива включить режим эмуляции работы сопроцессора (включает опцию EMULATION);

{$E-}

директива отключить режим эмуляции работы сопроцессора (отключает опцию EMULATION).

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

.

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

.

Величина e определяет погрешность (точность) вычислений лишь приближенно. Действительно, условие того, что -ый член ряда по модулю меньше e,

,

не гарантирует того, что сумма членов ряда, начиная с -го, также будет меньше e. Тем не менее, значение e дает представление о точности вычислений по порядку величины. Поэтому в качестве значений e, как правило, выбираются числа 0.01, 0.001, 10-5, 10-8 и т. п. Например, абсурдно задавать значение e=3, так как всегда , и требование, чтобы очередной член ряда был меньше 3 по абсолютной величине, не обеспечит даже приблизительной точности вычислений.

В программе на языке Pascal нужно организовать цикл, при каждом исполнении которого очередной член ряда (его значение сохраняется в переменной s) добавляется к сумме ряда (сумма ряда накапливается в переменной sinus), после чего вычисляется следующий член ряда, и его абсолютная величина сравнивается с e. Перед входом в цикл выполняются начальные присваивания: s=x (s становится равным первому члену ряда), sinus=0 (сумма ряда первоначально равна 0). Переменная i определяет степень члена ряда и связана с его номером k соотношением . В ходе цикла она каждый раз увеличивается на 2. Очередной член ряда отличается от предшествующего тем, что меняется его знак, числитель умножается на x2, а знаменатель – на (чтобы накопить в знаменателе ). Чтобы при каждом выполнении цикла не возводить x в квадрат, для экономии ресурсов компьютера вводится вспомогательная переменная sqrx.

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

Program Real_types;

var

epsilon, x,sqrx, s,sinus:extended;

i:integer;

begin

write('Введите заданную точность: ');

readln(epsilon);

write('Введите аргумент функции: ');

readln(x);

s:=x;

sinus:=0;

i:=1;

sqrx:=sqr(x);

while abs(s)>epsilon

do begin

sinus:=sinus+s;

i:=i+2;

s:=-s*sqrx/((i-1)*i)

end;

write('Значение, вычисленное с помощью ');

writeln('суммирования ряда: ');

writeln(sinus:20:18);

write('Значение, вычисленное с помощью ');

writeln('стандартной функции: ');

writeln(sin(x):20:18)

end.

Приведем некоторые результаты вычислений.

1) Вычисление значения с различной точностью:

Введите заданную точность: 1e-3

Введите аргумент функции: 0.1

Значение, вычисленное с помощью суммирования ряда:

0.

Значение, вычисленное с помощью стандартной функции:

0.

Введите заданную точность: 1e-5

Введите аргумент функции: 0.1

Значение, вычисленное с помощью суммирования ряда:

0.

Значение, вычисленное с помощью стандартной функции:

0.

Введите заданную точность: 1e-9

Введите аргумент функции: 0.1

Значение, вычисленное с помощью суммирования ряда:

0.

Значение, вычисленное с помощью стандартной функции:

0.

Введите заданную точность: 1e-12

Введите аргумент функции: 0.1

Значение, вычисленное с помощью суммирования ряда:

0.

Значение, вычисленное с помощью стандартной функции:

0.

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

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

Введите заданную точность: 1e-7

Введите аргумент функции: 1

Значение, вычисленное с помощью суммирования ряда:

0.

Значение, вычисленное с помощью стандартной функции:

0.

Введите заданную точность: 1e-7

Введите аргумент функции: 10

Значение, вычисленное с помощью суммирования ряда:

-0.

Значение, вычисленное с помощью стандартной функции:

-0.

Введите заданную точность: 1e-7

Введите аргумент функции: 50

Значение, вычисленное с помощью суммирования ряда:

13.

Значение, вычисленное с помощью стандартной функции:

-0.

Введите заданную точность: 1e-7

Введите аргумент функции: 70

Значение, вычисленное с помощью суммирования ряда:

.

Значение, вычисленное с помощью стандартной функции:

0.

6.3 Задания по теме 6: Вещественные типы данных.

В следующих заданиях x, e - заданные действительные числа (e > 0). Вычислить бесконечную сумму с точностью e. Считать, что требуемая точность достигнута, если вычислена сумма нескольких первых слагаемых, и очередное слагаемое оказалось по модулю меньше, чем e, - тогда это и все последующие слагаемые можно уже не учитывать. Сравнить результат приближенного вычисления со значениями, полученными с помощью стандартных функций языка Turbo Pascal. Использовать тип данных extended.

1) ;

2) ;

3) ;

4) ;

5) ;

6) ;

7) ;

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4