Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
practikumporesheniyuzadachnaibm (1).doc
Скачиваний:
6
Добавлен:
14.07.2019
Размер:
665.6 Кб
Скачать

Структуры данных

Демонстрация работы стека

Пример 1.

Сформировать стек из N натуральных чисел, просмотреть его и уменьшить нечетные его элементы на 1.

Пример 2.

Сформировать очередь из N натуральных чисел, просмотреть ее и найти сумму второго и четвертого элементов очереди. Результат поместить с очередь.

 

Пример 1.

Сформировать стек из N натуральных чисел, просмотреть его и уменьшить нечетные его элементы на 1.

    Работа стека моделируется с помощью одномерного массива S[1..N]. Для стека определены операции: инициализация стека, добавление элемента в стек, извлечение элемента из стека, просмотр стека. Операции оформлены в программе как процедуры. St - передаваемый или извлекаемый из стека элемент, i - номер последнего элемента в стеке.

Program Stek;

     Var

            s: array[1..100] of integer;

             i, j, n, st: integer;

Procedure IniSt; {инициализация стека}

    Begin

             Write('Емкость стека'); Readln(n); i:=0;

    End;

Procedure DobSt (st: integer); {добавление элемента в стек}

   Begin

         If    i<n    then

               begin

                   i:=i+1; s[i]:=st;

               end

                      else write('Стек переполнен');

  End;

Procedure IsvSt (Var st:integer);   {извлечение элемента из стека}

     Begin

          If    i<>0    then

               begin

                     st:=s[i]; i:=i-1;

               end

                         else   write('Стек пуст');

End;

Procedure ProsmSt; {просмотр стека}

    Var

           k: integer;

   Begin

          Writeln('ПРОСМОТР СТЕКА');

           If   i<>0   then   For k:=i downto 1 do Writeln(k,' -й элемент: ', s[k])

                         else    Writeln('-----СТЕК ПУСТ---');

          Readln;

  End;

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

BEGIN

       IniST;      {инициализация стека}

      {заполнение стека введенными элементами}

      For j:=1 to n do

            Begin

                  write('Ввод', j,'-го элемента'); readln(st); DobSt(st);

           End;

     ProsmSt;     {просмотр стека}

    {извлечение и проверка элементов стека}

     Repeat

               IsvSt(st); If st mod 2 =1 then st:=st-1; Writeln(st);

     until i=0;

END.

Пример 2.

    Сформировать очередь из N натуральных чисел, просмотреть ее и найти сумму второго и четвертого элементов очереди. Результат поместить с очередь.

    Работа очереди моделируется с помощью одномерного массива О[1..N]. Для очереди определены операции: инициализация очереди, добавление элемента в очередь, извлечение элемента из очереди, просмотр очереди, которые оформлены в программе как процедуры. t - передаваемый или извлекаемый из стека элемент, Ob - номер первого элемента в очереди, Oe - номер последнего элемента в очереди.

Program Ochered;

      Var

           O: array[1..100] of integer;

           t, S, Ob, Oe, n, j: integer;

Procedure IniO; {инициализация очереди}

   Begin

          Write('Емкость очереди'); Readln(n);

           Ob:=0; Oe:=0;

   End;

Procedure DobO(t: integer); {добавление элемента в очередь}

     Begin

          If    Oe<>N    then

                begin

                      Oe:=Oe+1; o[Oe]:=t;

                end

                             else   write('Переполнение');

    End;

Procedure IsvO(Var t:integer); {извлечение элемента из очереди}

    Begin

          If    Ob<>Oe    then

               begin

                    Ob:=Ob+1;   t:=o[Ob];

               end

                                else   write('Очередь пуста');

   End;

Procedure ProsmO; {просмотр очереди}

     Var

           k: integer;

  Begin

          Writeln('ПРОСМОТР ОЧЕРЕДИ');

          For    k:=Ob+1 to Oe do writeln(k,' -й элемент ',o[k]);

          Writeln('-----------------------------------------------------');

          Readln;

  End;

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

        IniO;

       { заполнение очереди}

        For   j:=1 to n do

              begin

                   Write('Ввод', j,'-го элемента '); Readln(t);  DobO(t);

              end;

       ProsmO;

       S:=0;    IsvO(t);            {извлечение первого элемента очереди}

       IsvO(t);  S:=S+t;         {извлечение и суммирование второго элемента}

       IsvO(t);                      {извлечение третьего элемента очереди}

       IsvO(t); S:=S+t;          {извлечение и суммирование четвертого элемента}

       t:=S; DobO(t);           {добавление суммы в очередь}

       ProsmO; Readln

END.

Построение графических изображений

 

Основные графические процедуры и функции

1. INITGRAPH ( “драйвер” , “режим” , “путь” ) - инициирует графический режим работы адаптера .

“драйвер” , “режим” - переменные типа integer

“путь” - string

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

Uses Graph;

......

Var Dr , Reg : integer ;

.....

Begin

......

Dr : = 0 ; INITGRAPH (Dr , Reg , ‘f:\turbo7\bgi’) ;

2. CLEARDEVICE - очищает графический экран .

3. CLOSEGRAPH - прекращает работу в графическом режиме и восстанавливает текстовый .

4. GETMAXX , GETMAXY - функции , возвращающие значения максимальных координат в текущем режиме .

5. MOVETO ( X , Y ) - устанавливает новое текущее положение указателя

   X , Y - координаты указателя (тип integer)

6. MOVEREL ( DX , DY ) - устанавливает новое положение указателя в текущих координатах .

   DX , DY - приращение координаты (тип integer)

7. PUTPIXEL( X , Y, “цвет” ) - выводит точку .

   X,Y- координаты точки (тип integer)

Пример 1.

Изображение   звёздного неба.

                    Количество звёзд - 200,  X, Y - координаты звезды, которые выбираются случайным образом .

Program Pr1;

     Uses Graph;

     Var

          X , Y :  integer ;

          I, Dr, Reg : integer ;

BEGIN

        Dr : = 0; Initgraph (Dr, Reg, ‘f:\tpas7\bgi’);  {установка  графического режима }

        Randomize;

        { изображение звезд в случайном месте случайным цветом}

       For  I : = 1 to 200 do

              Begin

                     X:= Random(GetMaxX); Y:= Random(GetMaxY);

                     Putpixel(X, Y, Random(16));

             end ;

      Readln {задержка до нажатия клавиши ENTER}

END.

8. LINE (X1,Y1, X2 Y2) - линия с концами в точках X1,Y1 и X2,Y2

9. LINETO (X , Y) - вычерчивает линию от текущего положения до положения заданного новыми координатами .

10. LINEREL (dX , dY) - вычерчивает линию от текущего положения до положения заданного приращением координат .

    dX, dY - приращения координат

11. SETLINESTYLE (“вид” , “образец” , “толщина”) - устанавливает новый стиль вычерчиваемых линий .

"Вид" : 0 - сплошная                                           "Толщина:"    1 - 1 пиксель

          1 - точечная                                                                     3 - 3 пикселя

           2 - штрих пунктирная

           3 - пунктирная

           4 - вид определяется пользователем

“Образец” - для линий, вид которых определяется пользователем. Два байта параметра образца определяет вид линии: 1-соответствует светящемуся пикселю , 0 - несветящемуся. Например, число 170 можно представить в двоичной системе       170 = 0000000010101010

Линия, заданная процедурой SETLINESTYLE(4,170,1) будет иметь вид  ....   ....   ....   ....    ....   ....  ....

Примечание: если “вид” принимает значения 0,1,2 или 3, параметру “образец” следует присвоить значение 0.

Следующий пример демонстрирует различные стили линий .

Пример 2.

       Программа строит 5 линий различного стиля. 

Вид линии (переменная I) меняется от 0 до 4. При I=4 стиль линии определяет пользователь, поэтому    образец (переменная Р) принимает значение, например, 170.

Program Pr2;

    Uses Graph ;

    Var

         Dr , Reg , I , P : integer ;

BEGIN

        Dr : = 0 ; Initgraph (Dr , Reg , ‘f:\tpas7\bgi’) ;

        For  I : =0 to 4 do

             Begin

                  If     i = 4    then p : = 170 else p : = 0;

                  Setlinestyle (i , p , 1);

                  Line (100 , 50 *(i + 1) , 400 , 50 *(i + 1)) ;

            End;

END.

12.RECTANGLE (x1 , y1 , x2 , y2) – изображает прямоугольник

x1 , y1 - левый верхний угол , x2 , y2 - правый нижний угол .

13. BAR3D (x1 , y1 , x2 , y2 , “глубина” , “верх.грань”) - трёхмерное изображение параллелепипеда с закрашенной передней гранью .

      x1 , y1 - левый верхний угол передней грани, x2 , y2 - правый нижний угол.

       “верх.грань” принимает два значения:  TopON - изображается верхняя грань или TopOFF - не изображается

14. CIRCLE (X , Y, R) – изображает окружность,

      X , Y - координаты центра, R - радиус выраженный в пикселях .

Пример 3.

     Изобразить множество окружностей, центры которых лежат на окружности большего радиуса .

     В программе X, Y - координаты центра маленькой окружности, которые определяются как координаты точки, лежащей на окружности с центром в точке (320,200) и радиуса 150. Угол поворота равен Pi/10.

Program Pr3;

    Uses Graph;

    Var

         F : real;

         I , X , Y , Dr , Reg : integer;

BEGIN

       Dr:=0; Initgraph(Dr, Reg,   'f:\tpas7\bgi');

       F:=0;   While    F<=2*Pi  do

                       Begin

               {вычисление координат точки, лежащей на окружности с центром (320,200) и радиусом 150} 

                            X:= Trunc(320 + 150*cos(F)) ;     

                            Y:= Trunc(200 - 150*sin(F)) ;     

                {построение маленькой окружности с центром (X,Y)}

                            Circle (x, y, 30) ;             

                            F:= F + Pi/10;      {увеличение угла поворота}

                      End;

      Readln;

END.

15. ARC ( X , Y, “нач.угол” , “кон.угол” , “радиус”) - изображает дугу окружности

      X , Y – центр окружности, “радиус” –радиус окружности

       “нач.угол” , “кон.угол”- значение начального и конечного углов дуги, выраженные в градусах

16. ELLIPSE (X , Y, “нач.уг.” , “кон.уг.” , RX , RY ) - изображает дугу эллипса

      RX-горизонтальный радиус,  RY-вертикальный радиус

 

Пример 4. Построение изображения цилиндра.

 

Program Pr4;

Uses Graph;

Var

      Dr, Regim: integer;

BEGIN

     Dr:=0; Initgraph(Dr, Regim,'f:\tpas7\bgi');

     Ellipse(320,100,0,360,120,40);      {верхнее основание}

     Ellipse(320, 380, 0, 360, 120, 40); {нижнее основание}

     Line(200, 100, 200, 380);     Line(440, 100, 440, 380);

     Readln;

END.

 

17. SETCOLOR ( “цвет” ) – текущий цвет для вывода линий и символов .

       Значения цветов :

          0 – черный            1 – синий              2 – зелёный            3 – голубой       

          4 – красный           5 – фиолетовый    6 – коричневый    7 – св. серый

          8 – темно-серый   9 – ярко-синий     10 – ярко-зел.        11 – ярко-голубой

          12 – розовый        13 – малиновый     14 – желтый            15 – белый

18. SETBKCOLOR (“цвет”) - цвет фона .

19. SETFILLSTYLE ( “штриховка” , “цвет” ) - тип и цвет заполнения .

Типы штриховки :    0 - отсутствует (фоном)    1 - сплошная            2 - линиями

                                  3 - ///                                       4 - утолщён.////      5 -\\\

                                 6 - утолщён.\\\\                       7 - +++                     8 - ***

                                 9 - #                                       10 - редкие точки    11 - частые точки

                    12- опрределяется. пользователем

20. FLOODFILL ( X ,Y , С )- штрихует замкнутую область.

      X ,Y - координаты точки, лежащей внутри замкнутой области.

      С - цвет граничной линии.

     Тип штриховки должен быть определён предварительно процедурой SETFILLSTYLE, в которой параметр “цвет” может не совпадать с параметром  С процедуры FLOODFILL .

Пример 5.

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

     Иcпользуемые переменные:  X,Y - координаты центра окружности,    R -  радиус,   C - цвет, T - стиль штриховки.

Program Pr5;

     Uses Graph;

     Var

         Dr, Reg, I , X , Y , C , T, R : integer ;

BEGIN

  Randomize ; Dr : = 0 ; Initgraph (Dr , Reg, 'f:\tpas7\bgi');

  For   i : =1 to 20   do

      Begin

     {выбор координат цетра окружности таким образом,   чтобы самая большая окружность поместилась на экране}

          X:= Random(GetMaxX - 100) + 50;     

          Y:= Random(GetMaxY - 100) + 50 ;   

           R:= Random(40) + 10 ;   {выбор радиуса от 10 до 50}     

          C:= Random (15) + 1 ;     {выбор цвета от 1 до 15}

          T:= Random(10) + 1 ;       {выбор стиля штриховки от 1 до 10}

          Setcolor(C);                      {установка цвета изображения}

          SetFillStyle (T , C);         {установка стиля и цвета штриховки}

          Circle (X, Y, C);                  {построение окружности}

          Floodfill (X, Y, C) ;                {закраска окружности}

      End;

   Readln;

END.

21. PIESLISE (X , Y , “нач. угол” , “кон. угол” , R) - вычерчивает и штрихует сектор окружности . Удобно использовать при построении круговых диаграмм .

        X , Y – центр окружности, R –радиус окружности

       “нач.угол” , “кон.угол”- значение начального и конечного углов дуги, выраженные в градусах

22. BAR ( X1 , Y1 , X2 , Y2 ) - штрихует прямоугольную область экрана

Пример 6.

Пострение изображения:      

В программе построение окружностей происходит построчно. Переменная I определяет, в какой строке находится окружность, J - номер столбца. Если их сумма нечетна, то данная окружность закрашивается.

Program Pr6;

   Uses Graph;

   Var

      I, J, Dr, Reg: integer;

BEGIN

       Dr:=0; Initgraph(Dr, Reg, 'f:\tpas7\bgi');

       SetFillStyle(2,15); {выбор стиля закраски кругов}

       For I:=1 to 3 do

             For J:=1 to 4 do

                   Begin

                       Circle(60*j,60*i,30);

                       Iif    (I+J) mod 2=0 then FloodFill(60*J,60*I,15);

                   End;

     Readln;

END.