ВУЗ:
Составители:
Рубрика:
92
формуле получается ответ s=55. Выполнив программу для N=10, получаем тот же
ответ.
Заметим далее, что программа позволит ввести только целое значение N,
отвергнув данные других типов, например вещественные, строковые и т.д.
Теперь попробуем проверить работу программы для N=300. С удивлением
обнаруживаем, что компьютер выдал ответ: s=-20386. Почему было получено
отрицательное число, ведь складывались
положительные числа? Попробуем
выполнить программу для N=200. Получим ответ 20100. Попробуем выполнить
программу для N=400. Получим ответ 14662. Почему сумма для меньшего
значения N превосходит сумму для большего значения N? Оказывается, все дело в
переполнении. Значения суммы для N=300 и N=400 больше максимально
допустимого значения для типа integer (здесь maxint=32767). Поэтому для этих
значений программу использовать нельзя. Установим максимальное значение N,
для которого программа еще может выдать правильный ответ. Для этого найдем
решения неравенства N·(N+1)/2≤32767. Данное неравенство сводится к
квадратному: N
2
+N-65534≤0. Решением этого неравенства будет интервал -
256.5≤N≤255.5. Следовательно, разработанная программа будет верна для всех N
от 1 до 255. Если необходимо получать суммы для больших значений N, то
необходимо перейти к другим типам данных, например longint или real, и внести
соответствующие исправления в программу.
Установив границы применимости программы, можно закончить тестирование.
Заметим, что тот
же цикл можно было записать с помощью оператора for:
s:=0; или s:=0;
for i:=1 to N do s:=s+1; for i:=N downto 1 do s:=s+i;
Записи в этом случае получились более короткими, потому что оператор for
специально предназначен для записи арифметических циклов. Запись с помощью
цикла repeat until может быть такой:
s:=0;
i:=1;
repeat s:=s+i;
i:=i+1
until i>N
Упражнения (Во всех упражнениях n - натуральное число):
1. Выполните трассировку программы PR2.
2. Выполните трассировку приведенного ниже фрагмента прграммы и ответьте
на вопрос: «Какую задачу он решает?»
s:=0;
i:=n;
while i>0 do
begin s:=s+i;
i:=i-1
end;
Запишите данный фрагмент с помощью операторов for и repeat until.
3. Выполните трассировку приведенного ниже фрагмента прграммы и ответьте
на вопросы:
92
формуле получается ответ s=55. Выполнив программу для N=10, получаем тот же
ответ.
Заметим далее, что программа позволит ввести только целое значение N,
отвергнув данные других типов, например вещественные, строковые и т.д.
Теперь попробуем проверить работу программы для N=300. С удивлением
обнаруживаем, что компьютер выдал ответ: s=-20386. Почему было получено
отрицательное число, ведь складывались положительные числа? Попробуем
выполнить программу для N=200. Получим ответ 20100. Попробуем выполнить
программу для N=400. Получим ответ 14662. Почему сумма для меньшего
значения N превосходит сумму для большего значения N? Оказывается, все дело в
переполнении. Значения суммы для N=300 и N=400 больше максимально
допустимого значения для типа integer (здесь maxint=32767). Поэтому для этих
значений программу использовать нельзя. Установим максимальное значение N,
для которого программа еще может выдать правильный ответ. Для этого найдем
решения неравенства N·(N+1)/2≤32767. Данное неравенство сводится к
квадратному: N2+N-65534≤0. Решением этого неравенства будет интервал -
256.5≤N≤255.5. Следовательно, разработанная программа будет верна для всех N
от 1 до 255. Если необходимо получать суммы для больших значений N, то
необходимо перейти к другим типам данных, например longint или real, и внести
соответствующие исправления в программу.
Установив границы применимости программы, можно закончить тестирование.
Заметим, что тот же цикл можно было записать с помощью оператора for:
s:=0; или s:=0;
for i:=1 to N do s:=s+1; for i:=N downto 1 do s:=s+i;
Записи в этом случае получились более короткими, потому что оператор for
специально предназначен для записи арифметических циклов. Запись с помощью
цикла repeat until может быть такой:
s:=0;
i:=1;
repeat s:=s+i;
i:=i+1
until i>N
Упражнения (Во всех упражнениях n - натуральное число):
1. Выполните трассировку программы PR2.
2. Выполните трассировку приведенного ниже фрагмента прграммы и ответьте
на вопрос: «Какую задачу он решает?»
s:=0;
i:=n;
while i>0 do
begin s:=s+i;
i:=i-1
end;
Запишите данный фрагмент с помощью операторов for и repeat until.
3. Выполните трассировку приведенного ниже фрагмента прграммы и ответьте
на вопросы:
Страницы
- « первая
- ‹ предыдущая
- …
- 88
- 89
- 90
- 91
- 92
- …
- следующая ›
- последняя »
