TURBO PASCAL

Новости       

Программы

Turbo Pascal

Игры

Документация

"Странности"

FAQ

Ссылки

Благодарности 

Гостевая книга

Спонсор

От автора

 

ПРИЛОЖЕНИЕ  1

пример выполнения контрольной работы № 8

Рассмотрим поэтапное выполнение контрольной работы № 8.

ЦЕЛЬ РАБОТЫ. Создать массив записей  (базу данных) в соответствии с заданной структурой. Количество записей не больше 10.

 

            

                           Рис. П.1.1.  Структура записи «ТОВАР».

 

1.     Реализовать редактирование записей (изменение, добавление, удаление).

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

?       по номеру записи;

?       по наименованию товара;

?       по стоимости  товара;

?       по году поступления товара.

3.     Вычислить общее количество товаров за определенный год (запрос).

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

п.1.1. Структура записи «ТОВАР»

На алгоритмическом языке Pascal структура, изображенная на рис. П.1.1, может быть описана следующим образом:

data=     { дата поступления товара }

    record

       day      : byte;      {день}

       year    : word;     {год}

       month : byte;      {месяц}

    end;

  RecType=       {Запись «товар»}

    record

        naimt  : string[LenNaimt];      {наименование товара}

        kolt     : longint;                         {количество товара}

        stoimt : real;                              {стоимость товара}

        dmg    : data;                              { дата поступления товара }

    end;

п.1.2. Структура базы данных «ТОВАРы»

 

 

 

 


Рис. П.1.2.  Массив записей  Mas : Array [1.. ColRec] of RecType

 

В программе предусмотрен жесткий контроль ввода исходных данных (символьных, целочисленных и вещественных) - см. Процедуры  InputString, InputNumber, InputReal. Вывод информационных и аварийных сообщений  оформлен единообразно - через процедуру OutMessageXY. Для ориентации пользователя в количестве допустимых символов для каждого поля записи введена процедура OutPutString.  В данной программе задействованы такие понятия, как атрибут вывода (переменная TextAttr),  позиция курсора (WhereX, WhereY, GotoXY), а также обработка обычных (ESC, ENTER, пробел, символы псевдографики) и расширенных ASCII-кодов (стрелки  ? ? ) - см. Прил. 4, 5 настоящего пособия и прил. 6 [5].

п.1.3. ЛИСТИНГ ПРОГРАММЫ Work8.pas                                                                                                                                                           

{$A+,B-,D+,E+,F-,G-,I+,L+,N+,O-,P-,Q-,R-,S+,T-,V+,X+}

{$M 16384,0,655360}

program Work8;

{                                                         Вариант № 40.

       Создать массив записей  в соответствии с заданной структурой. Количество записей            не больше 10. Реализовать редактирование записей (изменение, добавление, удаление). Исходные данные должны вводиться с проверкой на область допустимых значений. Реализовать в соответствии со своим вариантом запрос: «Определить общее количество товара, поступившего за определенный год»  и вывод содержимого записи по определенным ключам. Предусмотреть вывод всей базы данных на экран. Вся обработка базы данных должна происходить путем выбора соответствующего пункта из меню.   

}

Uses Crt;

Const

      ColRec=10;    {Максимальное количество записей}

      LenNaimt=27;{Максимальная длина наименования товара}

      ErrMes=' Ошибка ввода!!!  ';

      Err1='Число записей больше максимального - операция НЕВОЗМОЖНА!!!!';

      MesNumb='Численное значение должно быть в диапазоне ';

      Enter='Нажмите ENTER...';

      EnterOrSpace='Нажмите ENTER или ПРОБЕЛ...';

      EmptyStr='                                                                         ';

      Empty='';

      EmptyArr='Массив записей пуст. ';

      Continue='Для окончания операции введите ESC, для продолжения - Enter';

      CaseStr='Выберите курсором нужный режим. ';

      RecNotFound='Запись НЕ найдена!!!! ';

      Shure='Вы уверены, что это нужная запись? (Y/N)';

      Inv1='Создать массив записей';

      Inv2='Вывести данные на экран';

      Inv3='Вычислить общее количество товаров за определенный год';

      Inv4='Вывести содержимое записи по ключу';

      Inv5='Добавить запись';

      Inv6='Изменить запись';

      Inv7='Удалить запись';

      Color=Yellow; {желтый цвет символов}

      Fon  =Blue;   {голубой цвет фона}

      TaOld=15; {Стандартный атрибут: белые символы на черном фоне}

      YearMin=1990;  {Минимальный год}

      YearMax=2000;  {Максимальный год}

 

Type

  data=

    record

       day      : byte;

       year     : word;

       month : byte;

    end;

  RecType=

    record

        naimt  : string[LenNaimt];

        kolt     : longint;

        stoimt : real;

        dmg    : data;

    end;

  MasType=array[1..ColRec] of RecType;

var

  Rec: RecType;

  Mas: MasType;

  ch: char;

  flag: boolean;

  MaxElem: integer;

 

{Процедура вывода верхней части шапки таблицы }

Procedure TopT;

begin

  writeln('??? ?? ?? ????????????????????? ??');

  writeln('?       Наименование        ?  Кол-во  ? Стоимость? Год ? Месяц? День?');

  writeln('??? ?? ?? ??????????????????????? ??');

end;

 

{Процедура вывода нижней части шапки таблицы}

Procedure EndT;

begin

  write('??? ?? ?? ?????????????????? ???? ?');

end;

 

{Вывод сообщений Str1, Str2, начиная с позиции курсора X ,Y}

Procedure OutMessageXY(X,Y:Byte;Str1,Str2:String);

Var Xcur, Ycur: byte;

Begin

  Xcur:=WHereX;  {запоминание текущей позиции курсора}

  Ycur:=WHereY;

  GotoXY(X, Y);

  TextAttr:=Red+16*LightGray+Blink;{красный цвет на сером фоне с мерцанием}

  Write(Str1,Str2);

  TextAttr:=TaOld;

  GotoXY(Xcur, Ycur);  {восстановление позиции курсора}

End;

 

  {Вывод Width символов # цветом Color на фоне Fon с восстановлением прежних

        атрибутов вывода TaOld  и возвратом в начальную позицию курсора}

Procedure OutPutString(Color, Fon, TaOld, Width: Byte);

Var Str: String;

    i, Xcur, Ycur, TaNew: byte;

Begin

  Xcur:=WHereX;  {запоминание текущей позиции курсора}

  Ycur:=WHereY;

  Str:='';

  TextAttr:=Color+16*Fon;   {установка атрибута для вывода пробелов}

  for i:=1 to Width do

    Str:=Str + '#';

  Write(Str);

  TextAttr:=TaOld;   {восстановление прежних атрибутов}

  GotoXY(Xcur, Ycur);  {восстановление позиции курсора}

End;

 

    {Функция выдачи сообщений об ошибках Message при нарушении диапазона

[NumberMin .. NumberMax] на вводе целочисленных значений элементов полей записи}

Function error(Message: string; NumberMin, NumberMax: LongInt):boolean;

Var Mes: string;

begin

  error:=true;

  if flag then

    begin

       Mes:=ErrMes + Message;

       writeln(Mes, '[', NumberMin, '..', NumberMax, ']');

       error:=false;

    end;

end;

 

                    {Функция выдачи сообщения об ошибке Mes

         при вводе вещественных значений элементов полей записи}

Function error1:boolean;

Var Mes: string;

begin

  error1:=true;

  if flag then

    begin

       Mes:=ErrMes +' Введено НЕ число....';

       writeln(Mes);

       error1:=false;

    end;

end;

             {Ввод строки символов S с проверкой количества введенных символов

                   в диапазоне [1..LenNaimt]  и со строкой приглашения Inv}

Procedure InputString(Var S: String; LenNaimt: byte; Inv: String);

Begin

   repeat

     flag:=false;

     Write(Inv,'===>');

     OutPutString(Color, Fon, TaOld, LenNaimt);

     Readln(S);

     if length(S)>LenNaimt then flag:=true;

   until error('Количество символов в строке должно быть в диапазоне ',1,LenNaimt);

End;

 

          {Ввод целочисленных данных Number (ширина поля Width)

                с проверкой диапазона [NumberMin .. NumberMax]

                                     и со строкой приглашения Inv}

Procedure InputNumber(Var Number: Real; NumberMin, NumberMax: LongInt;

                      Width: Byte; Inv: String);

Begin

   repeat

     flag:=false;

     Write(Inv,'===>');

     OutPutString(Color, Fon, TaOld, Width);

     {$I-}

     Readln(Number);

     {$I+}

     if IOResult<>0 then flag:=true

      else

        if (Number<NumberMin) or (Number>NumberMax) then flag:=true;

   until error(MesNumb, NumberMin, NumberMax);

End;

 

                   {Ввод вещественных данных R (ширина поля Width)

     с проверкой на допустимый символ и со строкой приглашения Inv}

Procedure InputReal(Var R: Real; Width: Byte; Inv: String);

Begin

   repeat

     flag:=false;

     Write(Inv,'===>');

     OutPutString(Color, Fon, TaOld, Width);

     {$I-}

     Readln(R);

     {$I+}

     if IOResult<>0 then flag:=true;

   until error1;

End;

 

          {Процедура ввода значений элементов полей записи}

Procedure InputFields(var rec: RecType);

Var a: real;

       s: String;

begin

   InputString(S, LenNaimt, 'Наименование');

   Rec.naimt:=s;

   InputNumber(a,0,2147483647,10,'Количество');

   Rec.kolt:=trunc(a);

   InputReal(a,11,'Стоимость');

   rec.stoimt :=a;

   InputNumber(a,YearMin,YearMax,4,'Год');

   rec.dmg.year :=trunc(a);

   InputNumber(a,1,12,2,'Месяц');

   rec.dmg.month :=trunc(a);

   InputNumber(a,1,31,2,'День');

   rec.dmg.day :=trunc(a);

end;

 

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

Procedure OutputRec(rec: RecType);

begin

   Write('?',Rec.naimt);

   Gotoxy(29,Wherey);

   Write('?',Rec.kolt:10);

   Gotoxy(40,Wherey);

   Write('?',Rec.stoimt:11:2);

   Gotoxy(52,Wherey);

   Write('?',Rec.dmg.year:5);

   Gotoxy(58,Wherey);

   Write('?',Rec.dmg.month:3);

   Gotoxy(64,Wherey);

   Write('?',Rec.dmg.day:3);

   Gotoxy(69,Wherey);

   Writeln('?');

end;

 

{Процедура ввода и формирование массива записей mas}

Procedure InputRecord;

Var  i: Word;

      ch: Char;

begin

   i:=0;

   repeat

      clrscr;

      inc(i);

      if i>ColRec then

        begin

          OutMessageXY(12,23,Err1,Empty);

          exit;

        end;

      InputFields(mas[i]);

      OutMessageXY(12,23,Continue,Empty);

      ch:=Readkey;

   until ch=#27; {ESC - признак окончания ввода}

   MaxElem:=i;

end;

 

        {Процедура вывода массива записей mas}

Procedure OutRecord(MaxElem: integer);

Var i : Word;

begin

   clrscr;

   if MaxElem<>0 then

      begin

        TopT;

        for i:=1 to MaxElem do   OutputRec(mas[i]);

        EndT;

        OutMessageXY(20,24,Empty,Enter);

      end

   else OutMessageXY(20,24,EmptyArr,Enter);

   readln;

 end;

 

            {Процедура организации запроса}

Procedure Zapros1;

Var a, Sum: Real;

       god, i: Word;

begin

   Clrscr;

   Writeln('Вычислить общее количество товаров за определенный год');

   InputNumber(a,YearMin,YearMax,4,'Год');

   god:=trunc(a);

   sum:=0;

   TopT;

   for i:=1 to MaxElem do

      if mas[i].dmg.year=god  then

        begin

          sum:=sum + mas[i].kolt;

          OutputRec(mas[i]);

        end;

   EndT;

   Writeln;

   if sum<>0 then

     begin

       Writeln('Суммарное количество товара за ',god,' год составляет ',sum:12:0);

       OutMessageXY(20,24,Empty,Enter);

     end

   else OutMessageXY(10,24,RecNotFound,Enter);

   readln;

  end;

 

            {Процедура вывода содержимого записи по ключу }

Procedure KeyRec;

var ch: char;

    r, st : Real;

    f,f1 : Boolean;

    Num, J, god : Word;

    Str: String;

Label 1;

begin

    repeat

        f:=true;

        clrscr;

        if MaxElem=0 then

           begin

             OutMessageXY(20,24,EmptyArr,Enter);

             Readln;

             Exit;

           end;

        writeln('Вывести содержимое записи по ключу');

        writeln('1:   номер записи');

        writeln('2:   наименование товара');

        writeln('3:   стоимость товара');

        writeln('4:   год поступления товара');

        Writeln;

        Writeln('Введите нужный ключ');

        ch:=Readkey;

        case ch of

          '1': begin

                 InputNumber(r,1,MaxElem,2,' Введите номер записи');

                 Num:=trunc(r);

               end;

          '2': InputString(Str, LenNaimt,' Введите наименование товара');

          '3': InputReal(st,11,' Введите стоимость товара');

          '4': begin

                 InputNumber(r,YearMin,YearMax,4,' Введите год поступления товара');

                 god:=trunc(r);

               end

         else

            begin

              Clrscr;

              Writeln('Неизвестное значение ключа');

              OutMessageXY(20,24,Empty,Enter);

              readln;

              f:=false;

            end;

       end;

    until f;

    f:=false;   {Логический признак нормального завершения работы}

    f1:=false;  {Логический признак выдачи нужной записи}

    ClrScr;

    TopT;

    if ch='1' then

      begin

        OutputRec(mas[num]);

        f:=true;

        goto 1;

      end;

    for j:=1 to MaxElem do

     begin

      case ch of

       '2': if str=mas[j].naimt then

              begin

                f:=true;

                f1:=true;

              end;

       '3': if st=mas[j].stoimt then

              begin

                f:=true;

                f1:=true;

              end;

       '4': if god=mas[j].dmg.year then

              begin

                f:=true;

                f1:=true;

              end;

      end;

      if f1 then

        begin

          OutputRec(mas[j]);

          f1:=false

        end

     end;

    1:    EndT;

    if f then  OutMessageXY(20,24,Empty,Enter)

     else OutMessageXY(10,24,RecNotFound,Enter);

    Readln

end;

           {Процедура изменения (Flag=True) или удаления (Flag=False) записи}

Procedure ChangeDel(flag: boolean);

Var ch: char;

       i, j: Word;

begin

   if MaxElem=0 then

      begin

         OutMessageXY(1,24,EmptyStr,Empty);{Очистка строки сообщения}

         OutMessageXY(10,24,EmptyArr,Enter);

         Readln;

         Exit

      end;

   repeat

       clrscr;

       if flag then writeln('Введите номер изменяемой записи')

       else writeln('Введите номер удаляемой записи');

       {$I-}

       Readln(i);

       {$I+}

   until (IOResult=0)and(i>0) and (i<=MaxElem);

   TopT;

   OutputRec(mas[i]);

   EndT;

   writeln;

   OutMessageXY(20,24,Shure,Empty);

   ch:=ReadKey;

   if (ch='y')or(ch='Y')then

     begin

       if flag then InputFields(mas[i]) {Ввод всех полей заново}

       else

         begin

           for j:=i to MaxElem-1 do

              mas[j]:=mas[j+1];

           MaxElem:=MaxElem-1;

         end;

       if not flag then OutMessageXY(20,24,'Запись удалена. ',Enter)

       else OutMessageXY(20,24,'Запись изменена. ',Enter);

       readln;

     end

end;

                {Процедура добавления записи}

Procedure AddRecord;

Var i, j: Word;

begin

       repeat

          clrscr;

          Writeln('Введите номер добавляемой записи');

          {$I-}

          readln(i);

          {$I+}

       until (IOResult=0)and (i>0) and (i<=MaxElem+1);

       MaxElem:=MaxElem+1;

       if MaxElem>ColRec then

        begin

          OutMessageXY(2,23,Err1,Enter);

          MaxElem:=MaxElem-1;   {Игнорируем запись}

          Readln;

          exit;

        end;

       for j:=MaxElem downto i+1 do

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

       InputFields(mas[I]);

       OutMessageXY(20,24,'Запись добавлена. ',Enter);

       readln;

end;

  

      {Процедура коррекции положения курсора при его движении вверх-вниз}

Procedure UpDown(var Vari: integer; Im: byte);

begin

    if ch=#0 then ch:=readkey;

    case ch of

       #72: begin                      {стрелка вверх ?}

                   if vari=1 then vari:=im  else vari:=vari-1;

                  gotoxy(1,vari);

               end;

       #80: begin                      {стрелка вниз ?}

                   if vari=im then vari:=1 else vari:=vari+1;

                   gotoxy(1,vari);

                end;

    end;

end;

 

                      {Функция организации главного меню}

Function MainMenu :boolean;

const i: integer=1; {начальное положение курсора}

begin

   MainMenu:=false;

   clrscr;

   Writeln(Inv1);

   Writeln(Inv2);

   Writeln(Inv3);

   Writeln(Inv4);

   Writeln(Inv5);

   Writeln(Inv6);

   Writeln(Inv7);

   Writeln('Выход');

   OutMessageXY(5,24,CaseStr,EnterOrSpace);

   Gotoxy(1,i);

   repeat

      ch:=readkey;

      if( ch=#32) or (ch=#13) then {реакция на пробел или ENTER}

        begin

           case i of

             1:  InputRecord;     {Создать массив записей}

             2:  OutRecord(MaxElem);  {Вывести данные на экран}

             3:  Zapros1; {Вычислить общее количество товаров за определенный год}

             4:  KeyRec;           {Вывести содержимое записи по ключу}

             5:  AddRecord;        {Добавить запись}

             6:  ChangeDel(true);  {Изменить запись}

             7:  ChangeDel(false); {Удалить запись}

             8: begin

                      Mainmenu:=true;

                      exit;

                end;

           end;   {case}

          exit;

        end

      else  UpDown(i,8);

   until false;

end;

                     {Главная программа}

begin

   clrscr;

   repeat  until MainMenu;

end.

п.1.4. Описание программы и алгоритмов

Описание главной программы

Сначала очищается экран, затем в цикле REPEAT - UNTIL выводится главное меню через обращение к функции MainMenu. Условие выхода из цикла -  MainMenu = TRUE.

Алгоритм выполнения функции MainMenu

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

В бесконечном цикле REPEAT...UNTIL FALSE анализируется код нажатой клавиши (Ch), если он равен #32 (код клавиши пробел) или  #13 (код клавиши ENTER), то в зависимости от того, на какой строке находится курсор (номер строки запоминается в переменной I, число выводимых строк меню равно 8), управление передается следующим процедурам, используя оператор CASE:

case i of

    1:  InputRecord;     {Создать массив записей}

    2:  OutRecord(MaxElem);  {Вывести данные на экран}

    3:  Zapros1; {Вычислить общее количество товаров за определенный год}

    4:  KeyRec;           {Вывести содержимое записи по ключу}

    5:  AddRecord;        {Добавить запись}

    6:  ChangeDel(true);  {Изменить запись}

    7:  ChangeDel(false); {Удалить запись}

    8: begin

            Mainmenu := true;

            exit;

        end;

Если курсор находится на 8 строке и нажата клавиша ENTER или пробел, функция Mainmenu получает значение true, управление передается в основную программу и программа завершает свою работу.

Алгоритм выполнения процедуры UpDown (var Vari: integer; Im: byte)

Процедура реализует коррекцию положения курсора при его движении по строкам меню (стрелки ?? ). Через переменную Im  в процедуру передается число выведенных строк на экран (в нашем случае 8),  переменная VarI фиксирует  строку, на которой находится курсор, - GotoXY (1,VarI).

В этой процедуре обрабатываются расширенные ASCII-коды  клавиш (см. Прил. 4).

Если курсор движется вверх (т.е. нажимаем клавишу ? - код #72) и находится на первой строке (vari=1), то переменной vari присваивается значение im. Тем самым, курсор перемещается на последнюю строку экрана.

Иначе номер строки уменьшается на единицу и курсор передвигается вверх на одну строку.

Аналогично, если курсор находится в последней строке меню и движется вниз (код клавиши ?  #80 и переменная vari равна Im),  переменной vari присваивается значение 1 (курсор перемещается в первую строку меню).

Иначе значение переменной vari увеличивается на единицу (vari := vari+1) и курсор передвигается вниз.

Описание процедур TopT и EndT

Процедуры выводят верхнюю или нижнюю часть «шапки» базы данных, для чего используются стандартные операторы вывода. Рамка таблицы выводится с помощью символов псевдографики (см. Табл. П.6.3. «кодировка символов по стандарту ASCII» - [5] ).

Описание процедуры  InputFields(var Rec: RecType)

Процедура осуществляет ввод значения элементов полей  записи Rec. Переменным Rec.naimt, Rec.stoimt, Rec.kolt, Rec.dmg.year, Rec.dmg.month, Rec.dmg.day присваиваются значения. Корректность вводимых значений обеспечивается следующими процедурами:

?       Procedure InputReal(Var R: Real; Width: Byte; Inv: String) контролирует  ввод вещественных данных R (ширина поля Width)  с проверкой на допустимый символ и со строкой приглашения Inv;

?       Procedure InputNumber(Var Number: Real; NumberMin, NumberMax: LongInt;  Width: Byte; Inv: String) контролирует ввод целочисленных данных Number (ширина поля Width)     с проверкой диапазона [NumberMin .. NumberMax]    и со строкой приглашения Inv;

?       Procedure InputString(Var S: String; LenNaimt: byte; Inv: String) контролирует  ввод строки символов S с проверкой количества введенных символов [1..LenNaimt] и со строкой приглашения Inv.

Все эти процедуры  предварительно выводят  максимальное количество возможных позиций для данного поля цветом Color на фоне Fon (процедура OutPutString).

Описание процедуры OutputRec(rec: RecType)

Процедура осуществляет  вывод значений элементов полей записи стандартными операторами вывода с использованием символов псевдографики (см. Табл. П.6.3. «кодировка символов по стандарту ASCII» - [5] ).

Описание процедуры InputRecord

Процедура формирует массив записей mas[i]. Окончание ввода контролируется нажатием клавиш: ESC (код #27) и ENTER (код #13). При нажатии клавиши ESC формирование массива записей заканчивается. В случае, если массив записей пустой или число записей i превышает заданное ColRec, процедура OutMessageXY(X, Y: byte; Str1, Str2:string) выводит сообщение об этом Str1, Str2 на экран дисплея,  начиная с позиции X, Y.

 

Описание процедуры OutRecord (MaxElem :integer)

Процедура реализует вывод значений элементов массива записей. В случае, если массив записей пустой или число записей превышает заданное, процедура OutMessageXY(x, y: byte; Str1, Str2:string) выводит сообщение об этом на экран дисплея.

Описание процедуры Zapros1

Процедура рассчитывает суммарное количество товара, поступившего за определенный год. В цикле по i, которое изменяется от 1 до MaxElem (количество элементов в массиве записей) проверяется значение переменной mas[i].dmg.year. Если оно равно заданному god, то определяется суммарное значение количества поступившего товара, которое запоминается в переменной Sum. Строки базы данных, соответствующие нужному году, выводятся на экран. В аномальных случаях через процедуру OutMessageXY(x, y: byte; Str1, Str2:string) выводятся аварийные сообщения.

Описание процедуры KeyRec

Процедура реализует поиск записи по нужному ключу. В цикле Repeat ... until f  на экран выводится меню. В зависимости от выбора производится ввод значения переменной ch:

?       по номеру записи (ch:=1),

?       по наименованию товара (ch:=2),

?       по стоимости товара (ch:=3),

?       по году поступления товара (ch:=4).

Условием выхода из цикла является значение TRUE логической переменной F. Переменная F  принимает значение FALSE, если введено неизвестное значение ключа.

При вводе значений полей элементов массива записей происходит их контроль соответствующими процедурами в зависимости от типа переменных (см. описание процедуры InputFields).

После этого в зависимости от ключа происходит поиск нужной информации, формирование логических признаков f, f1 и  вывод на экран записи. Если база данных пуста или нужная запись не найдена, то через процедуру OutMessageXY(x, y: byte; Str1, Str2:string) выводятся соответствующие  сообщения.

Алгоритм выполнения процедуры ChangeDel (flag: boolean)

Процедура реализует изменение (входной параметр FLAG = TRUE) или удаление (входной параметр FLAG = FALSE)  записи в массиве записей. 

По введенному номеру записи i удаляется или изменяется запись в массиве записей. При этом  эта  запись выводится и пользователь может удостовериться, та ли это запись. В случае утвердительного ответа происходит коррекция массива записей.

В случае удаления записи i  в цикле по j происходит переприсваивание каждого значения элемента массива записей, начиная с i до MaxElem-1 (каждому предыдущему значению  элемента массива  присваивается  последующее значение mas[j]:=mas[j+1]). Максимальное число элементов массива записей уменьшается на единицу (MaxElem:=MaxElem-1).

В случае изменения записи вводятся измененные (новые) значения всех полей элементов записи через процедуру InputFields (mas[i]).

Вывод нужных сообщений реализуется через процедуру OutMessageXY(x, y: byte; Str1, Str2:string).

Алгоритм выполнения процедуры AddRecord

Процедура реализует добавление i-ой записи в массив записей. Количество записей в массиве увеличивается на единицу (MaxElem:=MaxElem+1).  В цикле по j происходит переприсваивание  элементов массива записей (обратите внимание на то, что цикл «идет» в обратном порядке, начиная с MaxElem и заканчивая  i+1). Каждому последующему значению элемента массива присваивается предыдущее (mas[j]:=mas[j-1]).  Затем следует ввод добавляемой записи - через процедуру InputFields(mas[i]).

Вывод нужных сообщений реализуется через процедуру OutMessageXY(x, y: byte; Str1, Str2:string).

 

На первую страницу

Rambler's Top100 PROext: Top 1000
Rambler's Top100

(с) Все права защищены.

По всем интересующим вопросам прошу писать электронный адрес

Hosted by uCoz