Главная страница
Библиотека (скачать книги)
Скачать софт
Введение в программирование
Стандарты для C++
Уроки по C#
Уроки по Python
HTML
Веб-дизайн
Ассемблер в среде Windows
ActiveX
Javascript
Общее о Линукс
Линукс - подробно
Линукс - новое
Delphi
Паскаль для начинающих
Турбопаскаль
Новости
Партнеры
Наши предложения
Архив новостей





Трассировка

Для понимания чужой программы и для проверки правильности написания своей используют метод пошагового выполнения программы с отслеживанием значений всех переменных.

Пример 6.4.
Вычисление суммы чисел от 6 до 10

Program Test.4;
var
N: integer; { Это будет счетчик цикла for }
S: integer; { В этой переменной будем накапливать сумму }
begin
S:=0; { Вначале обнулим сумматор }
for N:=6 to 10 do
S:=S + N; {Эта строка - тело цикла. При его выполнении каждый раз к S прибавляется очередное N. Переменную S можно сравнить с аккумулятором, в котором накапливается сумма }
writeln('Сумма чисел=', S:6);
readln
end.

 

Рис. 6.3. Блок-схема алгоритма вычисления суммы чисел от 6 до 10

Для проверки правильности работы программы рекомендуется пошагово отслеживать изменение всех переменных после выполнения каждого оператора программы.
Такой процесс называется трассирввкой. Продемонстрируем этот прием (табл. 6.1).
В результате работы программы на экране получим число 40.

Таблица 6.1. Трассировка программы из примера 6.4


Оператор

Условие

N

S

Примечание

S:=0

 

 

0

 

for N:= 6 to 10 do

Да

6

 

 

S:=S + N

 

 

6

0+6-6

For N:= 6 to 10 do

Да

7

 

 

S:= S + N

 

 

13

6 + 7 = 13

For N:= 6 to 10 do

Да

8

 

 

S:= S + N

 

 

21

13 + 8 = 21

For N:= 6 to 10 do

Да

9

 

 

S:= S + N

 

 

30

21 + 9 = 30

For N:= 6 to 10 do

Да

10

 

 

S:= S + N

 

 

40

30 + 10 = 40

For N:=6 to 10 do

Нет

11

 

 

writeln ('Сумма чисел',S:3)

 

???

 

На экране: Сумма чисел=40

 

Для операторов, выполняющих проверку условий (if, for и т. п.) в столбце «Условие» принято указывать результат проверки. В данном случае в цикле for проверяется условие продолжения цикла.
Символы «???» подчеркивают, что значение счетчика цикла по выходе из цикла считается неопределенным.

Метод трассировки очень помогает при отладке программы, когда программа выдает не тот результат, который должна выдать. Осуществляя пошаговую трассировку, мы вникаем в логику работы программы и на каждом шаге проверяем, правильны ли были наши рассуждения при ее написании.

 

Вычисление суммы ряда

Рассмотрим задачу вычисления суммы ряда:
1/(1*1) + 1/(2*2) + 1/(3*3) + 1/(4*4) + 1/(5*5)

Здесь мы имеем ряд дробей, у которых в знаменателях записаны квадраты чисел от 1 до 5.
Рассмотрим каждую дробь как произведение двух дробей, например:
1/(3*3) = 1/3 * 1/3

В общем виде это можно записать так:
1/(N * N) = 1/N * 1/N

Блок-схема алгоритма решения задачи представлена на рис. 6.4.

Рис. 6.4. Блок-схема алгоритма вычисления суммы ряда

Пример 6.5.
Вычисление суммы ряда

Program Test5;
var
N: integer; { Это будет счетчик цикла for }
S: real; { В этой переменной будем накапливать сумму. Выбрали для нее тип real, так как искомая сумма будет нецелым числом }
A: real; { Для записи очередной дроби 1/N (тоже число не целое) }
begin
S:=0; { Первоначально сумматор обнулим }
for N:=1 to 5 do
begin
A:=l / N; { Эти строки - тело цикла. В цикле необходимо выполнить два оператора, поэтому объединяем их в блок begin ... end }
S:=S + A*A
end;
writeln('Сумма чисел=', S:6:4);
readln
end.

 

Задание 6.5.
Написать программу вычисления n! (факториал числа n), где n положительно. Определение факториала:

0! = 1
1! = 1
2! = 1*2
3! = 1*2*3
n! = 1 * 2 * 3 *.... * (n - 1) * n

Другими словами, n! — это произведение первых n натуральных чисел.

Каждый следующий результат (обозначим его Р) получается путем умножения предыдущего результата (предыдущего Р) на счетчик, который пробегает значения от 1 до n.
Обозначим значение счетчика буквой k.

Получаем общий вид выражения: Р = Р * k (то есть воспользуемся рекуррентной формулой вычисления факториала: n! = (n - 1)! * n).

Программа должна быть организована так: с клавиатуры вводится число n (n— положительно), а затем на экран выдается таблица факториалов чисел до n включительно.

 

Задание 6.6.
Написать программу вычисления суммы ряда S=1 + 2 + 3 + 4 + 5 + 6. Нарисовать блок-схему и заполнить таблицу трассировки. Убедиться при трассировке, что сумма равна 21.

 

Таблица 6.2. Заготовка для таблицы трассировки алгоритма из задания 6.6

Оператор

Условие

S

K (счетчик)

Примечание

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 






Задание 6.6.
Написать программу вычисления суммы ряда для n слагаемых (n вводится с клавиатуры):
1/(1*2*3) + 1/(2*3*4) + 1/(3*4*5) + 1/(4*5*6) + …

Задание 6.7.
Используя возможности модуля Crt для работы с экраном в текстовом режиме, написать программу, которая 16 раз меняет цвет экрана и выводит любой текст на новом фоне в центр экрана.
Пояснение: разумно, если цвет фона и параметр цикла будут одной переменной (палитра цветов изменяется в диапазоне 0-15).

Задание 6.8.
Используя возможности модуля Crt, напишите программу, в которой символ «звездочка» (*) пробегает по всему периметру экрана из верхнего левого угла.
Пояснение: в программе организуйте 4 цикла. В качестве счетчика используйте координаты X и Y. Нарисуйте блок-схему алгоритма.
Попробуйте изменить программу, используя всего два цикла: в одном цикле звездочки бегут сразу по верхней и нижней строкам экрана, в другом — сразу по левому и правому краю. Пусть каждая следующая звездочка выводится случайным цветом.

Задание 6.9.
По экрану разбросайте 1000 звездочек в случайном месте случайным цветом с небольшой задержкой. Не забудьте инициализировать датчик случайных чисел в начале программы — один раз! Нарисуйте блок-схему алгоритма.

 

Выводы

1. Для организации многократно повторяющихся действий с заранее известным числом повторений используется оператор цикла for.
2. Счетчик цикла всегда имеет порядковый тип.
3. Счетчик цикла изменяется с шагом +1, если оператор имеет форму
for ...: = ... to .... do
4. Счетчик цикла изменяется с шагом -1, если оператор имеет форму
for ...:=... downto .... do
5. Чтобы узнать, сколько раз выполнится тело цикла for, нужно найти разность между крайними значениями счетчика (по модулю) и прибавить к результату 1.
6. Не рекомендуется изменять счетчик цикла в теле цикла.
7. Если внутри цикла for поставить еще один цикл for, то количество раз, которое выполнится тело внутреннего цикла, равно произведению числа повторений внешнего цикла на число повторений внутреннего.
8. Для проверки правильности работы алгоритма его выполняют вручную, шаг за шагом, отслеживая изменения всех переменных. Это называется трассировкой.

Контрольные вопросы

1. Какой оператор нужно использовать, чтобы вывести в каждой строке экрана слово «Привет»?
2. Чем отличаются формы «to» и «downto» оператора for?
3. Переменные какого типа должны использоваться в качестве счетчика цикла for?
4. Сколько раз выполнится тело внутреннего цикла:
for i:=2 to 6 do
for j:=5 downto 3 do
writeln('*').
5. Написанная программа выдает странный результат. Вероятно, программа написана с ошибкой. Как понять, где содержится ошибка?
6. Требуется последовательно присвоить переменной N значения всех трехзначных чисел. Напишите оператор, присваивающий переменной N нужные значения.




 

Комментарии:

2014-11-13 ответил Оля Зуева

А что такое трассировка алгоритма?



2015-06-23 ответил миля

Что будет выведено на экран после выполнения программы, если с клавиатура ввести числа 12,52,48,65,78,18,49,15,8,52,84,14,28,91,37 const N=15; var a: array [1..N] of integer; i, j, min: integer; begin for i:=1 to N do readln(a[i]); min := 100; { не забыть начальные условия! } for i:=1 to N do if (a[i] >= 20) and (a[i] < min) then min := a[i]; writeln ( min ); end. Нужна таблица трассировки



2015-06-23 ответил миля

Что будет выведено на экран после выполнения программы, если с клавиатура ввести числа 12,52,48,65,78,18,49,15,8,52,84,14,28,91,37 const N=15; var a: array [1..N] of integer; i, j, min: integer; begin for i:=1 to N do readln(a[i]); min := 100; { не забыть начальные условия! } for i:=1 to N do if (a[i] >= 20) and (a[i] < min) then min := a[i]; writeln ( min ); end. Нужна таблица трассировки



2016-04-25 ответил Отсосал у Гитлера

Та вы ввсе ебнутые, а сабака ебёт вас



2016-04-25 ответил Лазурный пончик

Хожу сюда только для того что бы у меня сосали



2016-11-15 ответил николай

всем привет, подскажите пожалуйста, Для чего предназначена таблица трассировки алгоритма?



2016-11-21 ответил Саня

Вы все хавно!!



2016-11-21 ответил Сабака

В рот вас ебал!11



2017-08-26 ответил Лорд Нефрит

Где админы сайта?, Почему комментарии неадекватов свободно проходят на страницу.



2023-09-23 ответил Тима

Спасибо, все понял. Все ебланы, которые не понимают это ваши проблемы! Сосите мой большой стек



2023-09-23 ответил Лол

<script>alert(1)</script>



2023-09-23 ответил <<<

<<<




Добавить свой комментарий:


Введите значение:
 









   
 

Библиотека программиста. 2009.
Администратор: admin@programmer-lib.ru