«Сборник упражнений по языку Паскаль», упражнения №№:
Числовые типы. Оператор присваивания.№ 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 (хоть он и вспомогательный – цикл ввода массива исходных данных)!


