Рефераты. Программирование на языке Турбо Паскаль )

     buf используется при обмене значений двух элементов}

begin

  for i:=1 to 10 do begin

    write('Введите элемент номер ',i,' -> ');

    readln(a[i]);

  end;


  for i:=1 to n-1 do begin

    jmin:=i;

    for j:=i+1 to n do

      if a[j]<jmin then jmin:=j;

      buf:=a[i];

      a[i]:=a[jmin];

      a[jmin]:=buf;

  end;


  write('Результат: ');

  for i:=1 to 10 do write(a[i],' ');

  readln;

end.

Другой способ — пузырьковая сортировка, он работает чуть быстрее, чем предыдущий. На первом этапе двигаемся от n-го элемента до 2-го и для каждого из них проверяем, не меньше ли он предыдущего; если меньше, то меняем местами текущий и предыдущий. В итоге первый элемент будет наименьшим в массиве. На втором этапе также проходим элементы от n-го до 3-го, на третьем — от n-го до 4-го, и т. д. В итоге массив будет отсортирован по возрастанию.

program BubbleSort;

...

var i,j: integer;

    buf: integer;

begin

  ...

  for i:=2 to n do

    for j:=n downto i do

      if a[j]<a[j-1] then begin

        buf:=a[j];

        a[j]:=a[j-1];

        a[j-1]:=buf;

      end;

end.


Лекция 8. Тип запись

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

type tPerson = record

        Name,Surname,SecondName: string[30];

        Male: boolean;

        Address: string;

        Phone: longint;

     end;


Объявление переменной типа запись выполняется стандартно, с помощью var. Части записи (в нашем случае: Name, Surname, SecondName, Male, Address, Phone) называются полями. Обращение к полю записи в программе производится с помощью знака ‘.’ (точка). Пример обращения к полям:


var p: tPerson;

...

begin

  ...

  p.Surname:=’Иванов’;

  p.Name:=’Иван’;

  p.SecondName:=’Иванович’;

  ...

  if (p.Phone<0) or (p.Phone>999999)

    then writeln(‘Ошибка’);

  ...

end.


Заметим, что в этом примере постоянно приходится обращаться к полям одной и той же переменной типа запись, и, следовательно, постоянно писать её имя. Есть возможность избавиться от этого неудобства. В Турбо Паскале есть оператор присоединения (with), который позволяет один раз указать, какой записью мы пользуемся и в дальнейшем писать только имена полей. Обычно этот оператор выглядит так:

with <имя_записи> do <оператор>;

Чаще всего в качестве оператора используется составной оператор.

Пример:

with p do begin        

  Surname:=’ Иванов’;

  Name:=’Иван’;

  ...

end;


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


const N = 30;

type  tStaff = array [1..N] of tPerson;


Рассмотрим другой пример, где иллюстрируется использование вложенных записей. Пусть прямоугольник определяется координатами точки, являющейся его левым верхним углом, шириной, высотой и цветом линий. На Турбо Паскале эти сведения можно объединить в такую запись:


type  tPoint = record

         x,y: integer;

      end;

 

      tRectangle = record

         LeftTop: tPoint;

         Width, Height: integer;

         Color: integer;

      end;


Для такой записи можно применять ещё одну форму оператора with, которая может «присоединять» несколько имён записей, например:


var rect: tRect;

with rect, LeftTop do begin

  x:=100;

  y:=150;

  Color:=11;

  ...

end;


Без использования with появились бы выражения вида rect.Color, rect.LeftTop.x, rect.LeftTop.y и т. п.

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


const MaxVertex = 200;


type  tPolygon = record

         size: integer;

         V: array [1..MaxVertex] of tPoint;

         Color: tColor;

      end;


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

type tFKind = (fCir,fRect,fSqr);

     tFigure = record

         Color: integer;

         case kind: tFKind of

           fCir:  (Center: tPoint; r: integer);

           fRect: (LeftTop,RightBottom: tPoint);

           fSqr:  (LT: tPoint; size: integer);

     end;

В этой записи  имеется одно обычное поле (Color), а остальные 6 и представляют собой вариантную часть. Для окружности в ней имеются поля Center и r, для прямоугольника — LeftTop и RightBottom, для квадрата — LT и size. Фраза kind: tFKind не является обязательной, она служит для понимания того, какие поля к каким фигурам относятся. Можно написать просто case integer of ... и нумеровать варианты целыми числами. Заметим также, что в объявлении нашей записи нет слова end, относящегося к case.

 



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

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


Лекция 9. Процедуры и функции

Процедура – последовательность действий (записанных на Паскале), названная каким-либо именем. Для того чтобы выполнить эту последовательность, нужно в соответствующем месте программы указать её имя (так, например, для очистки экрана при работе с графикой мы указываем ClearDevice;). Кроме того, что программа становится при использовании процедур короче и понятнее, процедуры можно вызывать из разных мест программы (в противном случае пришлось бы повторять в тексте программы одинаковые последовательности действий несколько раз).

Те действия, которые входят в процедуру, записываются до начала основной программы в следующем виде:


program ...

const ...

type ...

var ...

procedure MyProc;

begin

  {действия}

end;

begin

  {основная программа}

end.


Рассмотрим пример нахождения максимума из трёх чисел:

program Max1;

var a,b,c,m: integer;

begin

  write('Введите a: '); readln(a);

  write('Введите b: '); readln(b);

  write('Введите c: '); readln(c);

  if a>b then m:=a else m:=b;

  if c>m then m:=c;

  writeln('Максимум = ',m);

  readln;

end.

Перепишем его с использованием процедуры:

program Max2;

var a,b,c,m: integer;

procedure FindMax;

begin

  if a>b then m:=a else m:=b;

  if c>m then m:=c;

end;

begin

  write('Введите a: '); readln(a);

  write('Введите b: '); readln(b);

  write('Введите c: '); readln(c);

  FindMax;

  writeln('Максимум = ',m);

  readln;

end.

Этот вариант можно улучшить. Пока наша процедура может искать минимум только среди значений конкретных переменных a, b и c. Заставим её искать минимум среди любых трёх целых чисел и помещать результат в нужную нам переменную, а не всегда в m.

Чтобы была видна польза от такой процедуры, рассмотрим пример программы для поиска максимума среди чисел a+b, b+c и a+c:

program Max3;

var a,b,c,m: integer;

procedure FindMax(n1,n2,n3: integer; var max: integer);

begin

  if n1>n2 then max:=n1 else max:=n2;

  if n3>max then max:=n3;

end;

begin

  write('Введите a: '); readln(a);

  write('Введите b: '); readln(b);

  write('Введите c: '); readln(c);

  FindMax(a+b,b+c,a+c,m);

  writeln('Максимум из сумм = ',m);

  readln;

end.

В скобках после имени процедуры (в её описании) записаны так называемые параметры. Эта запись обозначает, что внутри процедуры можно использовать целые числа, обозначенные n1, n2 и n3, а также заносить значения в переменную типа integer, которая внутри процедуры называется max (а реально во время работы программы все действия производятся над переменной m). Параметры, в которых хранятся числа (n1,n2,n3) называются параметрами-значениями; а те, которые обозначают переменные (max) – параметрами-переменными, перед ними в описании ставится слово var. Параметры, на которые имеются ссылки внутри процедуры (n1, n2, n3, max), называются формальными, а те, которые реально используются при вызове (a+b, b+c, a+c, m) — фактическими.

Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11



2012 © Все права защищены
При использовании материалов активная ссылка на источник обязательна.