Название: Информатика и программирование(М. Г. Зайцев ,В. М. Неделько)

Жанр: Информатика

Просмотров: 1241


Практическое занятие 1

 

Последовательные ПОД

Тема

Последовательные процессы обработки данных

Цель

Сформировать практические навыки организации, описания и анализа последовательных процессов обработки данных с помощью управляющей структуры Sequence, оператора присваивания Object Pascal и трассировочной таблицы; изучить структуру программы Object Pascal (консольное приложение).

Изучаемые понятия

Работа с памятью на физическом уровне: область памяти, размер, адрес, содержимое, запись, чтение, ссылка на область памяти, ссылка на содержимое области памяти.

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

Состояние переменных программы.

Программная функция программы.

Данные целочисленных типов.

Основные сведения

Работа с памятью через идентификатор переменной.

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

 

 

Состояние переменных программы

Набор упорядоченных пар, в котором первым элементом является имя переменной, а вторым – её значение, называется состоянием переменных программы.

 

 

Так для программы, представленной блок-схемой состояние данных может иметь следующий вид: S = ((x, 0,785), (tg, 1)).

Если обозначить исходное состояние переменных программы через X, а результирующее состояние переменных через Y, то можно определить программную функцию программы:

Программная функция – это множество упорядоченных пар (X,Y). Программная функция связывает значение переменной tgY в результирующем состоянии Y со значением переменной xX в исходном состоянии X.

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

 

program Ptg;

 

{$APPTYPE CONSOLE}

 

uses

  SysUtils;

 

var

  x: real = 0;

  t: real = 0;

begin

  write(' X = '); readln(x);//X = ((x,0.785),(t,0))

  t:= sin(x)/cos(x);              //Y = ((x,0.785),(t,1))

  writeln('tg(',x:6:2,') = ', t:6:2);

  readln;

end.

 

Задачи

Обменять переменные x, y значениями, используя промежуточную переменную.

Обменять переменные x, y значениями, не используя промежуточную переменную, и построить трассировочную таблицу.

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

Вычислить котангенс угла, представленного в радианах, используя стандартные функции вычисления синуса и косинуса (sin, cos).

Примеры решений

Пример решения задачи № 1

Условие

Обменять переменные x, y значениями, используя промежуточную переменную.

Решение

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

 

Консольное приложение, реализующее предложенную задачу, представлено ниже.

 

program PLineDP;

 

{$APPTYPE CONSOLE}

 

uses

  SysUtils;

 

Var

  x,y,t: real;

begin

  write('x = '); readln(x);

  write('y = '); readln(y);

      //состояние переменных программы: ((x,x0),(y,y0))

      t:= x; // состояние переменных программы: ((t, x0),(x,x0),(y,y0))

      x:= y; // состояние переменных программы: ((t, x0),(x, y0),(y,y0))

      y:= t; // состояние переменных программы: ((x, y0),(y, x0))

      //программная функция программы: ((X,Y)| (x = y0 )^(y = x0))

  writeln('x = ',x:6:2);

  writeln('y = ',y:6:2);

  readln;

end.

 

Пример решения задачи № 2

Условие

Обменять переменные x, y значениями не используя промежуточную переменную.

Решение

Будем обменивать значениями переменные x, y, не используя промежуточную переменную. На первом шаге в переменную x заносим сумму значений x+y. На втором шаге в переменную y заносим разность x-y. На третьем шаге в переменную y заносим разность x-y. Описанная последовательность действий представлена на рисунке ниже.

Консольное приложение, реализующее предложенную задачу, представлено ниже.

 

program PLineDP;

 

{$APPTYPE CONSOLE}

 

uses

  SysUtils;

 

Var

  x,y: real;

begin

  write('x = '); readln(x);

  write('y = '); readln(y);

      //состояние переменных программы: ((x,x0),(y,y0))

      x:= x + y; // состояние переменных программы: ((x, x0 + y0),(y,y0))

      y:= x - y; // состояние переменных программы: ((x, x0 + y0),( x0, x0 + y0))

      x:= x - y; // состояние переменных программы: ((x, y0),(y, x0))

      //программная функция программы: ((X,Y)| (x = y) ^ (y = x))

  writeln('x = ',x:6:2);

  writeln('y = ',y:6:2);

  readln;

end.

 

Для формального доказательства правильности написанной нами программы можно воспользоваться трассировочной таблицей, представленной ниже. В ней индекс 0 переменных обозначает значения переменной перед выполнением первого оператора кода, индекс 1 обозначает значение переменной после выполнения первого оператора кода и т. д.

 

Трассировочная таблица для верификации линейных ПОД

Номер оператора

Код

x

y

1

x:= x + y

x1 = x0 + y0

y1 = y0

2

y:= x - y

x2 = x1

y2 = x1 + y1

3

x:= x - y

x3 = x2 + y2

y3 = y2

x3 = x2 + y2

      x1 – x1 + y1

      y0

y3 = y2

      x1 - y1

      x0 + y0 - y0

      x0