Главная страница

Ответы на задачи 24 (С1)


Скачать 1.92 Mb.
НазваниеОтветы на задачи 24 (С1)
Дата26.03.2018
Размер1.92 Mb.
Формат файлаdoc
Имя файлаansw24-C1.doc
ТипПрограмма
#39513
страница18 из 18
1   ...   10   11   12   13   14   15   16   17   18
12 будет выведено значение 5.

Замечаем, про цикл заканчивается, когда s  k, а нам нужно строгое неравенство. Поэтому необходимо поменять условие цикла на s  a. Кроме того, программа выводит следующее значение k, потому что k увеличивается после того, как увеличились переменные p и s. Поэтому нужно выводить значение k-1, меньшее на единицу.

3) в программе нужно исправить две ошибки

  1. Неверное условие цикла:

Было: while s < A do begin

Исправление: while s <= A do begin

  1. Неверный вывод результата:

Было: writeln(k);

Исправление: writeln(k-1); {вернуться на шаг назад}

Остается ответить на вопрос 2 – найти значение A, при котором программа выдаёт правильный ответ. Во-первых, подбором сразу находим, что при A = 1 программа выдаёт правильный ответ 2. Кроме того, есть и другие варианты. Из-за неверного условия цикл останавливается на шаг раньше, если s = A, при этом выводится следующее, то есть правильное значение k. Такая ситуация происходит при A = 1, A = 1 + (1+2) = 4, A = 1 + (1+2) + (1+2+3) = 10 и т.д.

2) при А = 1 программа выводит правильный ответ 2.

  1. С помощью ручной трассировки убеждаемся, что при вводе числа 12 программа выдаёт ответ 4.




k

p

s

A

read(A)










12

s := 0







0




p := 0




0







k := 1

1










s <= A  да













k := k + 1

2










p := p + k




2







s := s + p







2




s <= A  да













k := k + 1

3










p := p + k




5







s := s + p







7




s <= A  да













k := k + 1

4










p := p + k




9







s := s + p







16




s <= A  нет













1) при вводе числа 12 будет выведено значение 4.

Замечаем, про цикл заканчивается, когда значение k = 1 не учитывается при суммировании, так как в начале тела цикла k сразу увеличивается на 1. Поэтому необходимо поменять начальное значение k на 0. Кроме того, программа выводит следующее значение k, потому что цикл заканчивается тогда, когда нарушается условие s  A, а нам нужно найти последнее k, при котором это условие истинно. Поэтому нужно выводить значение k-1, меньшее на единицу.

3) в программе нужно исправить две ошибки

  1. Неверное начальное значение k:

Было: k := 1;

Исправление: k := 0;

  1. Неверный вывод результата:

Было: writeln(k);

Исправление: writeln(k-1); {вернуться на шаг назад}

Остается ответить на вопрос 2 – найти значения A, при котором программа выдаёт ответ 4. Построим таблицу, связывающую соответствующие значения переменных k, p и s:

k

1

2

3

4

p

0

2

5

9

s

0

2

7

16

Цикл завершается, когда s > A, поэтому программа выдаёт ответ 4 для всех 7  A  15.

2) для всех 7  A  15 программа выводит ответ 4.

  1. С помощью ручной трассировки определяем результат работы программы при вводе чисел 5 и 15:




k

s

A

B

read(A, B)







5

15

s := 1




1







k := A

5










s <= B  да













k := k + 1

6










s := s + k




7







s <= B  да













k := k + 1

7










s := s + k




14







s <= B  да













k := k + 1

8










s := s + k




22







s <= B  нет













1) при вводе чисел 5 и 15 будет выведено значение 8.

Замечаем, что вместо первого числа (5) в сумму добавляется 1. Поэтому первое необходимое исправление – начальное значение переменной s должно быть равно A, а не 1. Кроме того, цикл останавливается, когда сумма становится строго больше B, а нам нужно, чтобы остановка произошла при s  B, поэтому нужно изменить условие цикла:

3) в программе нужно исправить две ошибки

  1. Неверное начальное значение s:

Было: s := 1;

Исправление: s := A;

  1. Неверное условие цикла:

Было: while s <= B do begin;

Исправление: while s < B do begin

Теперь остается найти пару значений A и B, при которых программа выдаёт правильный ответ. Для этого нужно определить, что же действительно считает эта программа. Как мы видели, она находит сумму

s = 1 + (A+1) + (A+2) + …

и заканчивает работу, когда эта сумма станет строго больше, чем B. За счёт того, что первое слагаемое равно 1 вместо A, сумма получается меньше, чем нужно, на A-1. С другой стороны, цикл в некоторых случаях (когда получается сумма, строго равная B) продолжается лишний шаг из-за неверного условия цикла. Эти две ошибки могут скомпенсировать друг друга. Построим таблицу значений s для различных k при некотором A:

k

A

A+1

A+2

A+3

s

1

A+2

2A+4

3A+7

Цикл заканчивается, когда s > B, то есть для всех A  B  A+1 получаем результат A+1, для A+2  B  2A+3 получаем значение A+2 и т.д. Сравним эти результаты с правильными:

k

A

A+1

A+2

A+3

s

A

2A+1

3A+3

4A+6

Результат A+1 мы должны получить для A+1< B  2A+1, результат A+2 – для 2A+2  B  3A+3 и т.д. Таким образом, при B = A+1 мы всегда получаем правильный ответ A+1. Аналогично для B = 2A+2 и B = 2A+3 программа выдаёт правильный ответ A+2. Поэтому для ответа на второй вопрос можно взять, например, пару A = 3 и B = 4:

2) для A = 3 и B = 4 программа выводит правильный ответ 4.

  1. Эта задача очень похожа на предыдущую, поэтому приведём только краткий ответ:


1) при вводе чисел 13 и 18 будет выведено значение 15.

2) для A = 3 и B = 3 программа выводит правильный ответ 4.

3) в программе нужно исправить две ошибки

  1. Неверное начальное значение s:

Было: s := 0;

Исправление: s := A;

  1. Неверное условие цикла:

Было: while s < B do begin;

Исправление: while s <= B do begin

  1. С помощью трассировки определяем, что при вводе числа 9532 программа выдаёт ответ 32:




A

n2

read(A)

9532




n2 := 0




0

A > 100  да







A mod 100 > n2  да







n2 := A mod 100




32

A := A div 100

95




A > 100  нет







1) при вводе числа 9532 будет выведено значение 32.

При трассировке мы заметили, что пары цифр 53 и 95, которые присутствуют в десятичной записи числа, не проверялись. Во-первых, цикл закончился, когда число стало меньше 100, из-за этого не проверялась пара цифр 95. Поэтому нужно изменить условие цикла на A > 0. Во-вторых, делением на 100 отсекаются сразу две цифры, из-за этого не проверялась пара цифр 53. Поэтому нужно делить не на 100, а на 10.

3) в программе нужно исправить две ошибки

  1. Неверное условие цикла:

Было: while A > 100 do begin

Исправление: while A > 0 do begin

  1. Неверное изменение переменной A:

Было: A := A div 100;

Исправление: A := A div 10;

Из проведённого выше анализа видно, что программа выдаст верное значение, если наибольшее двузначное число составляют последние 2 цифры или 3 и 4 цифры с конца, и т.д.

2) программа выводит верное значение 95 при вводе числа 3295.

  1. Эта задача полностью аналогична предыдущей задаче, поэтому приведём только краткий ответ.

1) при вводе числа 1245 будет выведено значение 10.

2) программа ни для одного числа не выводит верное значение (всегда выводит 10).

3) в программе нужно исправить три ошибки

  1. Неверное начальное значение переменной n2:

Было: n2 := 10;

Исправление: n2 := 100;

  1. Неверное условие цикла:

Было: while A > 100 do begin

Исправление: while A > 10 do begin

  1. Неверное изменение переменной A:

Было: A := A div 100;

Исправление: A := A div 10;



1 Аналогичная ситуация возникает при решении уравнения методом деления отрезка пополам (кто помнит :-).

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

http://kpolyakov.spb.ru
1   ...   10   11   12   13   14   15   16   17   18


написать администратору сайта