«Сборник упражнений по языку Паскаль», упражнения №№:

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

№  1.4. Есть ли разница (с точки зрения языка Паскаль) между числами 100 и 100.0, между 20 и 2Е1? По какому признаку (величине или форме записи) целые числа отличаются от вещественных?

Есть; по форме записи.

№  1.7. Почему при записи формул на паскале их «вытягивают» в линию? Почему знак умножения всегда выписывают явно (например, пишут a*t, а не at)?

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

№  1.13. Почему в Паскале аргумент функции всегда записывают в скобках (например, пишут ln(5), а не ln5)?

По правилам грамматики. Иначе получается не выражение, а идентификатор.

№  1.14 а. Записать на Паскале формулу: (1+x)2

SQR(1+X)

№  1.14 в. Записать на Паскале формулу: | a + bx |

ABS(A+B*X)

№  1.15 в. Записать на Паскале формулу (x>0): x-2

1/SQR(X)

№  1.15 г. Записать на Паскале формулу (x>0): x5

EXP(5*LN(X))

№  1.19 а. Записать в общепринятой форме:

(-b+sqrt(sqr(b)-4*a*c))/(2*a);

№  1.19 б. Записать в общепринятой форме:

a/b*(c+d)-(a-b)/b/c+1E-8;

№  1.19 в. Записать в общепринятой форме: x1+arctan(y2-alpha)/2*abs(x4-ln(5)*y5)/exp(-1);

№  1.20 б. Записать на Паскале оператор присваивания: f=6,637.10-8. m1.m2/r2.

F:=6.637E-8 * M1 * M2 / SQR(R);

№  1.21 а. Записать оператор присваивания, который переменной d присваивает среднее арифметическое чисел x, y, z.

D:= (X+Y+Z)/3;

№  1.24. Чему равны значения переменных x и y после выполнения операторов x:=2; y:=5; x:=y; y:=x?

X=5,Y=5

№  1.26. Поменять местами значения переменных x, y и z так, чтобы в x оказалось значение переменной y, в y – значение переменной z, а в z – прежнее значение переменной x.

X_prejnee:=X; {ВВЕЛИ ДОП. БУФЕРНУЮ ПЕРЕМЕННУЮ X_prejnee}

X:=Y;

Y:=Z;

Z:=X_prejnee;

№  1.38. Присвоить целой переменной d первую цифру из дробной части положительного вещественного числа x (так, если x=32.597, то d=5).

{Шаги решения:

1. Выделяем дробную часть.

2. Умножаем её на 10, соответственно первая цифра дробной части становится единственной цифрой целой части «нового» числа.

3. Выделяем эту самую целую часть «нового» числа }

D := TRUNC((X-TRUNC(X))*10);

Логический тип.

№  2.5 б. Доказать тождество: a or (not a) = = true;

ТАК КАК РАВЕНСТВО ИМЕЕТ МЕСТО ПРИ ВСЕХ ЗНАЧЕНИЯХ ПЕРЕМЕННОЙ А (И ПРИ А=TRUE, И ПРИ A=FALSE). СЛЕДОВАТЕЛЬНО, ИМЕЕТ МЕСТО ТОЖДЕСТВО, Ч. Т.Д.

№  2.8 б. Указать порядок выполнения операций при вычислении выражения

(x>=0) or t and odd(x) or (y*y<>4);

№  2.9. Вычислить следующие выражения при a=true и b=false:

a or b and not a

TRUE OR (FALSE AND NOT(TRUE)) = TRUE OR FALSE = TRUE

(a or b) and not a (TRUE OR FALSE) AND NOT(TRUE) = FALSE

not a and b NOT(TRUE) AND FALSE = FALSE AND FALSE = FALSE

not (a and b) NOT(TRUE AND FALSE) = NOT(FALSE) = TRUE

№  2.10 а. Записать на Паскале выражение, истинное при выполнении указанного условия и ложное в противном случае: «x принадлежит отрезку [0,1]».

(X>=0)AND(X<=1)

№  2.10 з. Записать на Паскале выражение, истинное при выполнении указанного условия и ложное в противном случае: «только одно из чисел x, y, z положительно».

(X>0)AND(Y<=0)AND(Z<=0) OR

(X<=0)AND(Y>0)AND(Z<=0) OR

(X<=0)AND(Y<=0)AND(Z>0)

№  2.10 и. Записать на Паскале выражение, истинное при выполнении указанного условия и ложное в противном случае: «логическая переменная a имеет значение true, а логическая переменная b имеет значение false».

(A=TRUE)AND(B=FALSE)

№  2.15 в. Записать на Паскале выражение, истинное при выполнении указанного условия и ложное иначе: «только одна из логических переменных a, b и c имеет значение true».

A*NOT(B)*NOT(C)+NOT(A)*B*NOT(C) + NOT(A)*NOT(B)*C

№  2.20 а. Написать оператор присваивания, в результате выполнения которого логическая переменная t получает значение true, если выполняется указанное условие, и значение false иначе: «числа x, y,z равны между собой».

T:=(X=Y)AND(Y=Z);

№  2.20 в. Написать оператор присваивания, в результате выполнения которого логическая переменная t получает значение true, если выполняется указанное условие, и значение false иначе: «x – положительное число».

T:=(X>0);

Простейшие программы.

№  3.3. Что будет напечатано программой

program less(input, output);

var x:real;

t:boolean;

begin

read(x);

t:=x<round(x);

read(x);

t:=t and (x<trunk(x));

writeln(t)

end.

TRUE

№  3.4. Написать программу, которая печатает true или false в зависимости от того, имеют три заданных целых числа одинаковую чётность или нет.

VAR X, Y,Z:INTEGER;

BEGIN

READLN(X, Y,Z);

WRITELN(((X MOD 2)=(Y MOD 2)) AND ((Y MOD 2)=(Z MOD 2)))

{ WRITELN( (ODD(X) * ODD(Y) * ODD(Z)) OR

(NOT(ODD(X)) * NOT(ODD(Y)) * NOT (ODD(Z)) )}

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

END.

№  3.9. Когда процедура вывода writeln(x1,…xn) осуществляет перевод строки: до печати первого параметра x1 или после печати последнего параметра xn?

ПОСЛЕ

№  3.16. Найти ошибки в программе:

program ошибки (input, output) НУЖНО ТРАНСЛИТЕРИРОВАТЬ!

const π=3.14159; π НЕ БУКВА ЛАТИНСКОГО АЛФАВИТА!

var a, b:integer;

begin read(A); d:=odd(π*0) and b>a; D НЕ ОПИСАНА! π НЕ БУКВА!

writeln(d) end. D НЕ ОПИСАНА!

№  3.17. Что будет напечатано следующей программой, если для ввода было задано число 31.7?

program time(input, output);

var fi:real;

h, m:integer;

begin

read(fi);

h:= trunk(fi/30);

m:=trunk((fi-30*h)/0.5);

writeln(h,’ ‘,m)

end.

1 _ 0

Операторы условный, составной.

№  4.1 е. Записать указанное действие в виде одного условного оператора: «переменной k присвоить номер четверти плоскости, в которой находится точка с координатами x и y (xy<>0)».

IF X>0

THEN IF Y>0

THEN K:=1

ELSE K:=4

ELSE IF Y>0

THEN K:=2

ELSE K:=3;

№  4.6. Указать ошибки:

if 1<x<2 then x:=x+1; y:=0; else x:=0; y:=y+1;

if 1<x and x<2 then begin x:=x+1; y:=0 end; else begin x:=0; y:=y+1 end

{Надо так:}

IF (1<X) AND (X<2)

THEN BEGIN

X:=X+1;

Y:=0

END

ELSE BEGIN

X:=0;

Y:=Y+1

END;

№  4.9. Записать оператор присваивания, эквивалентный условному оператору (все переменные – логического типа)

if a then x:=b else x:=c;

X:=(A * B) + (NOT(A) * C);

№  4.19. Программа. Дано целое n>0, за которым следует n вещественных чисел. Определить, сколько среди них отрицательных.

№  4.20. Программа. Дана непустая последовательность положительных целых чисел, за которой следует 0 (это признак конца последовательности). Вычислить среднее геометрическое этих чисел.

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

№  5.8. Программа. Дано 100 вещественных чисел. Вычислить разность между максимальным и минимальным из них.

№  5.10. Программа. Даны целое n>0 и последовательность из n вещественных чисел, среди которых есть хотя бы одно отрицательное число. Найти величину наибольшего среди отрицательных чисел этой последовательности.

№  5.18. var k, i:integer; x, y:real;

Найти ошибки в следующем фрагменте программы:

y:=0; for x;=0.1 to 0.9 do y:=y+sin(x);

k:=81; y:=1; for i:=1 to sqrt(k) do y:=2*y;

№  5.27. Программа. Дано 100 вещественных чисел. Определить, образуют ли они возрастающую последовательность.

№  5.28. Программа. Дана последовательность из 70 целых чисел. Определить, со скольких отрицательных чисел она начинается.

№  5.37. Программа. Дано 80 вещественных чисел. Найти порядковый номер того из них, которое наиболее близко к какому-нибудь целому числу.

№  5.38. Программа. Дано 100 целых чисел. Определить, сколько из них принимает наибольшее значение.

№  5.42. Программа. Дана последовательность из 100 целых чисел. Определить количество чисел в наиболее длинной последовательности из подряд идущих нулей.

№  5.44. Программа. Дано 200 вещественных чисел. Определить три наибольших числа среди них.

№  5.49. Программа. Дано 10 натуральных чисел. Найти их наибольший общий делитель.

------

№  5.41. ОБРАЗЕЦ.

Даны целые числа x1,x2,…x55.

Вычислить величину x1*(x2+x3)(x4+x5+x6)(x7+x8+x9+x10)…(x46+x47+…x55)

Программа вычисления:

program Primer5_41(output);

{ Содержательные переменные, }

{ для хранания исходных данных и результата:}

var x: array[1..55] of integer; { исходный массив целых чисел}

iskomaya_velichina, { искомая величина}

{ Вспомогательные переменные: }

ocherednoi_somnozhitel, { здесь накапливаем очередной сомножитель}

skolko_nuzhno_priplusovat, { из стольких слагаемых}

skolko_priplusoval, { а столько слагаемых уже приплюсовали на i-й итерации}

i: integer; { это просто счётчик итераций }

begin

{ поскольку в условии не уточняется, каким именно образом «даны» исходные числа }

{ (т. е. неизвестно, заданы они в виде констант, или записаны в каой-нибудь файл), }

{ введём-ка их с консоли в массив:}

for i:= 1 to 55 do

begin

write(‘Введите ‘,i,’-е число: ‘);

readln(x[i]);

end;

writeln(‘Ввод исходных данных закончен!’);

{Задачу решаем за один проход массива!}

iskomaya_velichina := 1; { нельзя задать исходное значение «0» - }

{ обнулим результат!}

skolko_nuzhno_priplusovat:=1; { потому что первый сомножитель состоит из одного}

{ элемента}

skolko_priplusoval:=0; { пока ничего ещё не плюсовал, поэтому - 0… }

ocherednoi_somnozhitel:=0; { в этом случае задаём начальное значение 0 – будет}

{ суммирование }

for i:=1 to 55 do

bedin

ocherednoi_somnozhitel:= ocherednoi_somnozhitel + x[i];

inc(skolko_priplusoval);

if skloko_priplusoval = skolko_nuzhno_priplusovat

then

begin

Inc(skolko_nuzhno_priplusovat); {следующий сомножитель будет на 1 длиннее!}

iskomaya_velichina:= iskomaya_velichina * ocherednoi_somnozhitel;

ocherednoi_somnozhitel:=0;

skolko_priplusoval:=0;

end;

end;

writeln(‘Искомая величина равняется: ’, iskomaya_velichina)

end.

КОММЕНТАРИЙ К РЕШЕНИЮ.

По условию искомая величина есть произведение сомножителей, каждый из которых представляет из себя сумму элементов массива с номерами, идущими по порядку и образующими строчку в пирамидке (нарисуем-ка пирамидку):

1

2 3

4 5 6

11

16

2228

2935 36

3743 44 45

4652

Исследуем её, не кривая ли (поскольку программа писалась в предположении, что пирамидка не кривая и последний сомножитель ровно на 1 длиннее предпоследнего).

Пирамидка получилась без «изъяна» в последней строке (если бы по условию длина массива равнялась не 55, а, к примеру, 53, был бы «изъян». Но мы убедились, что последний 10-й сомножитель не короче, чем должен быть, и по ходу цикла не надо делать специальную проверку «последний ли сомножитель?»).

«Втупую» эту задачу можно решить так:

PROGRAM Primer5_41vtupuju(output);

VAR x: array[1..55] of integer; { исходный массив целых чисел}

iskomaya_velichina, { искомая величина}

Somnojitel1, { вспомогательные переменные }

Somnojitel2,

Somnojitel3,

Somnojitel4,

Somnojitel5,

Somnojitel6,

Somnojitel7,

Somnojitel8,

Somnojitel9,

Somnojitel10: integer;

i: integer; { это просто счётчик итераций }

BEGIN

{ Ввод исходных данных }

for i:= 1 to 55 do

begin

write(‘Введите ‘,i,’-е число: ‘);

readln(x[i]);

end;

writeln(‘Ввод исходных данных закончен!’);

Somnojitel1 := x[1];

Somnojitel2 := x[2] + x[3];

Somnojitel3 := x[4] + x[5] + x[6];

Somnojitel4 := x[7] + x[8] + x[9] + x[10];

Somnojitel5 := x[11] + x[12] + x[13] + x[14] + x[15];

Somnojitel6 := x[16] + x[17] + x[18] + x[19] + x[20] + x[21];

Somnojitel7 := x[22] + x[23] + x[24] + x[25] + x[26] + x[27] + x[28];

Somnojitel8 := x[29] + x[30] + x[31] + x[32] + x[33] + x[34] + x[35] + x[36];

Somnojitel9 := x[37] + x[38] + x[39] + x[40] + x[41] + x[42] + x[43] + x[44] + x[45];

Somnojitel10 := x[46] + x[47] + x[48] + x[49] + x[50] + x[51] + x[52] + x[53] + x[54] + x[55];

iskomaya_velichina := Somnojitel1 * Somnojitel2 * Somnojitel3 * Somnojitel4 *

Somnojitel5 * Somnojitel6 * Somnojitel7 * Somnojitel8 *

Somnojitel9 * Somnojitel10;

writeln(‘Искомая величина равняется: ’, iskomaya_velichina)

END.

Что характерно, это «решение втупую» можно засчитать корректным.

Поскольку задачка – из раздела «операторы цикла», то предполагается, что обязательно должен быть цикл в тексте программы. И он таки есть J (хоть он и вспомогательный – цикл ввода массива исходных данных)!