Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конструирование программ.doc
Скачиваний:
12
Добавлен:
05.05.2019
Размер:
12.37 Mб
Скачать

2.3.2 Выполните трассировку и определите результаты работы программы

1. Пользователь ввел с клавиатуры значения 3 и 5. Определите, какое значение выведет компьютер на дисплей.

program exam2_1;

var

f, x, y : integer;

max, min: integer;

begin

readln(x,y);

if x>=y then begin

max:= x;

min:= y;

end

else begin

max:= y;

min:= x;

end;

if xy>0 then

f:=max

else

f:=min;

writeln(f);

end.

2. Нарисуйте область на плоскости, при попадании в которую точки с координатами x, y программа выводит значение True.

program exam2_2;

var

x, y : integer;

b:boolean;

begin

readln(x,y);

b:= (abs(x-y)<=1) and (abs(x+y)<=1);

writeln(b);

end.

3. Определите, в какие интервалы должно «попасть» значение х, чтобы программа выводила значение 0.

program exam2_3;

var

f, x : integer;

begin

readln(x);

if (x>=-1) and (x<=4) or (x>=5) and (x<=10) then

f:= 1

else

f:= 0;

writeln(f);

end.

4. Пользователь ввел с клавиатуры значение переменной х. Определите, какое значение выведет компьютер на дисплей, если х равно: 3; 4; -2; -4; 15.

program exam2_4;

var

f, x: integer;

begin

readln(x);

case x of

1, 3, 5, 7, 9 : f:=2x+1;

2, 4, 6, 8 : f:=2x;

10..100 : f:=x10;

-3..-1 : f:=-1;

else

f:=0;

end;

writeln(f);

end.

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

program exam2_5;

var

s, i, k: integer;

begin

s:= 0;

k:= 1;

for i:=1 to 5 do begin

s:=s+i;

k:=k*i;

end;

writeln(s+k);

end.

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

program exam2_6;

var

s, i, k: integer;

begin

s:= 0;

k:= 1;

for i:=1 to 5 do begin

s:=s+i;

k:=ki;

if s+k>25 then

break;

end;

writeln(s:5, k:5);

end.

7. Выполните трассировку программы и определите результат, если пользователь ввел с клавиатуры значения: 1, 7, 2.

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

program exam2_7;

var

s, x, x0, x1, d: integer;

n : integer;

begin

readln(x0, x1, d);

n:= (x1-x0) div d;

x:= x0;

s:= 0;

while n>0 do begin

s:=s+dx;

x:=x+d;

n:=n-1;

end;

writeln(s:5);

end.

8. Пользователь ввел с клавиатуры значение переменной х. Выполните трассировку программы и определите результат, если х равно: 5; 8.

Можно ли использовать программу для определения, простое число или нет?

program exam2_8;

var

n, f, i: integer;

begin

readln(n);

i:=2;

f:=1;

while i<=sqrt(n) do begin

if n mod i = 0 then begin

f:=0;

break;

end;

i:=i+1;

end;

writeln(f);

end.

9. Программа должна вычислять значение наибольшего общего делителя.

Выполните трассировку и проверьте работу программы для значений m и n: 4, 2; 12, 8.

program exam2_9;

var

m, n, p: integer;

begin

readln(m, n); {m>n}

repeat

p:= m mod n;

if p<>0 then begin

m:= n;

n:= p;

end;

until p=0;

writeln(n);

end.

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

program exam2_10;

var

s, i, k, n, p: integer;

begin

p:= 1;

k:= 1;

n:= 1;

for i:=1 to 4 do begin

s:=0;

while k<=n do begin

s:= s+k;

k:= k+1;

end;

n:=i+k;

p:=p*s;

end;

writeln(p);

end.

Советы профессионала

Упрощайте логические выражения в операторах if

  • Избегайте вызова «лишних» функций и сравнений

Вместо (not(x>x_left)) or (not(x<x_right)) следует написать выражение:

(x<=x_left) or (x>=x_right)

Если Вы хотите выяснить, равно ли значение логической переменной b истина – НЕ пишите в операторе if: not(Ord(b)=0) или Ord(b)=1 или b=True. Напишите просто: if b then

    • Используйте дополнительные логические переменные для понимания и упрощения кода

Например, оператор if имеет вид:

If (elementIndex<0) or (elementIndex>MAX_ELEMENT) or

(elementIndex = LAST_ELEVENT) then

Добавим в программу две логических переменных violation (нарушение), и completion (завершение) и определим их следующим образом:

violation := (elementIndex<0) or (elementIndex>MAX_ELEMENT);

completion:= (elementIndex = LAST_ELEVENT);

Тогда оператор if можно записать так:

If violation or completion then…

Упрощайте структуру цикла

  • Используйте оператор цикла for, если известно число повторений, и оператор while в других случаях

  • Не изменяйте в «теле» цикла for значение показателя цикла!

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

Например, переменная value вычисляется следующим образом:

for i:=0 to Count-1 do begin

value:= (i+1) BaseValue DELTA;

. . .

end;

Видно, что значение произведения BaseValueDELTA не зависит от показателя цикла (переменная i) и не изменяется в цикле. Добавим в код переменную increment (приращение) и перепишем цикл следующим образом:

increment:= BaseValue DELTA;

for i:=0 to Count-1 do begin

value:= (i+1) increment;

. . .

end;

  • Заменяйте умножение сложением

В рассмотренном выше примере переменная value на каждом шаге цикла увеличивается на значение переменной increment, поэтому цикл можно организовать так:

increment:= BaseValue DELTA;

value:=0;

for i:=0 to Count-1 do begin

value:= value + increment; //Сравните с первоначальным вариантом!

. . .

end;

  • Используйте «размыкание» цикла

Вам необходимо выполнять в цикле похожие действия, которые отличаются небольшой частью, которая выполняется только один раз в начале цикла:

for i:=1 to Count do begin

if i = 1 then begin

{операторы 1}

end

else begin

{операторы 2}

end; . . .

end;

«Размыкание» цикла заключается в том, что действия, выполняемые в цикле один раз (в примере это {операторы 1}), следует выполнить за его пределами перед началом цикла:

i:= 1;//если это необходимо!

{операторы 1}

for i:= 2 to Count do begin

{операторы 2}

end;

  • Тщательно анализируйте задание перед конструированием цикла

Рассмотрим вычисление ex с заданной точностью tolerance по формуле:

При решении «в лоб» в цикле придется выполнять не только вычисление суммы слагаемых, но и возведение x в целую степень, а также вычисление факториала (2!, 3!, …).

Однако при выполнении простого анализа исходной формулы (разделите последующее слагаемое на предыдущее!) можно определить, что каждое слагаемое, начиная с x, может быть получено умножением предыдущего слагаемого на коэффициент x / i, где i = 1, 2,… – номер слагаемого в исходном выражении (слагаемое x имеет номер 1). Тогда вычисление ex можно сконструировать так:

i:=1; // номер слагаемого

summa:=1; // значение суммы

increment:=1; // значение слагаемого

while increment > tolerance do begin

increment:= incrementx/i;

summa:= summa + increment;

i:= i + 1;

end;