Программа


PROGRAM VoltTest;
USES Crt;                            { Подключение модуля Crt }
FUNCTION Question(S:string):boolean; { Функция получения ответа на вопрос }
  Var Ch,ChPred:char; { Переменная для ввода символа и
       предыдущий введенный символ для контроля расширенных кодов клавиатуры }
  Begin
    Ch:=' '; { Начальное определение переменной }
    while KeyPressed do Ch:=ReadKey; { Сброс буфера клавиатуры }
    Write(S,' [Y/N] ');   { Вывод вопроса }
    repeat { Цикл опроса клавиатуры }
      ChPred:=Ch;   { Сохранение предыдущего значения }
      Ch:=ReadKey;  { Чтение нажатия клавиши }
    until (Ch in ['Y','y','N','n','Н','н','Т','т'])and(ChPred<>#0);
                           { Выход из цикла при получении корректного ответа }
    Question:=Ch in ['Y','y','Н','н']; { Определение значения функции }
    WriteLn(Ch)                 { Вывод ответа }
  End;
FUNCTION Stringer(N:integer):string;  { Функция преобразования числа в строку }
  Var St:string;  { Переменная для преобразования числа в строку }
  Begin
    Str(N,St);  { Преобразование }
    Stringer:=St  { Определение значения функции }
  End;
CONST ININame='078.INI';
      InFName='_LPT2';
      OutFName='_LPT3';
      PRNName='_PRN';
      MaxQuantPoint=10;
      MaxQuantLim=10;
      MaxQuantVoltmeter=4;
TYPE Point=record
             Point,Reading,NormalDif,Dif:real;
           end;
     PointList=record
                 Quant:0..MaxQuantPoint;
                 Voltage:real;
                 List:array [1..MaxQuantPoint] of Point
               end;
     LimList=record
               Quant:0..MaxQuantLim;
               List:array [1..MaxQuantLim] of PointList
             end;
     Voltmeter=record
                 Model:string;
                 Number:string;
                 Outward:boolean;
                 OnTest:boolean;
                 Addend:real;
                 Multiplier:real;
                 LimTest:LimList;
                 Result:boolean
               end;
     VoltmeterList=record
                     Quant:1..MaxQuantVoltmeter;
                     List:array[1..MaxQuantVoltmeter] of Voltmeter
                   end;
VAR Bench:VoltmeterList;
PROCEDURE Val(S:string; var N:real);
  Var Code:integer;
  Begin
    System.Val(S,N,Code)
  End;
FUNCTION ReadINI(FileName:string; Model:string):boolean;
  Var F:text;
      Exit:boolean;
      S:String;
      i:0..MaxQuantVoltmeter;
  Begin
    Assign(F,FileName);
    Reset(F);
    Exit:=FALSE;
    while not EOF(F) and not Exit do
    begin
      ReadLn(F,S);
      Exit:=S='Модель '+Model
    end;
    ReadINI:=not EOF(F);
    if not EOF(F) then
    begin
      Bench.List[1].Model:=Model;
      ReadLn(F,S);
      Val(Copy(S,Length('Слагаемое основной погрешности измерения '),20),Bench.List[1].Addend);
      ReadLn(F,S);
      Val(Copy(S,Length('Множитель основной погрешности измерения '),20),Bench.List[1].Multiplier);
      ReadLn(F);
      ReadLn(F,S);
      with Bench.List[1].LimTest do
      begin
        Quant:=0;
        while S<>'Конец списка пределов и описания вольтметра' do
        begin
          Inc(Quant);
          Val(Copy(S,Length('Предел измерения '),20),List[Quant].Voltage);
          ReadLn(F);
          with List[Quant] do
          begin
            Quant:=0;
            ReadLn(F,S);
            while S<>'Конец списка проверяемых точек на перделе измерения' do
            begin
              Inc(Quant);
              Val(Copy(S,1,Pos(' ',S)-1), List[Quant].Point);
              Val(Copy(S,Pos(' ',S)+1,20),List[Quant].NormalDif);
              ReadLn(F,S);
            end;
          end;
          ReadLn(F,S)
        end;
      end
    end;
    Close(F);
    Bench.Quant:=MaxQuantVoltmeter;
    for i:=2 to Bench.Quant do Bench.List[i]:=Bench.List[i-1]
  End;
PROCEDURE SetVoltage(var F:text; V:real);
  Begin
    WriteLn(F,'Установка калибратора ',V:8:1,' В')
  End;
PROCEDURE SetVoltmeter(var F:text; N:byte);
  Begin
    WriteLn(F,'Переключение на вольтметр ',N)
  End;
PROCEDURE Test;
  Var i:0..MaxQuantVoltmeter;
      j:0..MaxQuantLim;
      k:0..MaxQuantPoint;
      InF,OutF:text;
  Begin
    with Bench do
    begin
      Write('Введите количество установленых на стенде вольтметров: ');
      ReadLn(Quant);
      for i:=1 to Quant do
      begin
        Write('Введите серийный номер ',i,'-го вольтметра: ');
        with List[i] do
        begin
          ReadLn(List[i].Number);
          Outward:=Question('Проведите внешний осмотр '+Stringer(i)+'-го вольтметра. Вольтметр годен?');
          OnTest:=Question('Проведите опробование '+Stringer(i)+'-го вольтметра. Вольтметр годен?');
          Result:=OnTest and Outward
        end;
      end;
      Assign(InF,InFName);
      Assign(OutF,OutFName);
      Reset(InF);
      Rewrite(OutF);
      for j:=1 to List[1].LimTest.Quant do
      begin
        Write('Установите на вольтметрах предел ',List[1].LimTest.List[j].Voltage:5:0,'  Нажмите <Enter>');
        ReadLn;
        for k:=1 to List[1].LimTest.List[j].Quant do
        begin
          SetVoltage(OutF,List[1].LimTest.List[j].List[k].Point);
          for i:=1 to Bench.Quant do
          begin
            SetVoltmeter(OutF,i);
            with List[i].LimTest.List[j].List[k] do
            begin
              ReadLn(InF,Reading);
              Dif:=(Reading/Point-1)*100;
              List[i].Result:=List[i].Result and (Abs(Dif)<NormalDif)
            end
          end;
        end;
      end;
      Close(OutF);
      Close(InF);
    end;
  End;
PROCEDURE WriteProtocol;
  Var F:text;
      i:0..MaxQuantVoltmeter;
      j:0..MaxQuantLim;
      k:0..MaxQuantPoint;
  Begin
    Assign(F,PRNName);
    Rewrite(F);
    with Bench do
      for i:=1 to Quant do with List[i] do
      begin
        WriteLn(F,'Протокол испытания вольтметра ',Model,'  номер ',Number);
        WriteLn(F);
        if Outward then WriteLn(F,'Внешний осмотр - годен')
                   else WriteLn(F,'Внешний осмотр - не годен');
        if OnTest then WriteLn(F,'Опробование - годен')
                  else WriteLn(F,'Опробование - не годен');
        WriteLn(F,'╔═══════════╦═════════════╦═══════════╦═══════════════╦════════════╗');
        WriteLn(F,'║  Предел   ║ Проверяемые ║ Показания ║  Допускаемое  ║ Отклонение ║');
        WriteLn(F,'║ измерения ║  точки, В   ║ прибора,В ║ отклонение, % ║      %     ║');
        with LimTest do
        for j:=1 to Quant do with List[j] do
        begin
          WriteLn(F,'╠═══════════╬═════════════╬═══════════╬═══════════════╬════════════╣');
          for k:=1 to Quant do with List[k] do
          if k=1
          then WriteLn(F,'║',Voltage:8:0,'   ║ ',Point:8:2,'    ║',Reading:8:2,'   ║  ',NormalDif:8:2,'     ║ ',Dif:8:2,'   ║')
          else WriteLn(F,'║', '        ','   ║ ',Point:8:2,'    ║',Reading:8:2,'   ║  ',NormalDif:8:2,'     ║ ',Dif:8:2,'   ║')
        end;
          WriteLn(F,'╚═══════════╩═════════════╩═══════════╩═══════════════╩════════════╝');
        WriteLn(F);
        if Result then WriteLn(F,'Вольтметр - годен')
                  else WriteLn(F,'Вольтметр - не годен');
        WriteLn(F); WriteLn(F); WriteLn(F);
      end;
    Close(F)
  End;
VAR Model:string;
BEGIN
  WriteLn;
  Write('Введите тип вольтметра: ');
  ReadLn(Model);
  if ReadINI(ININame,Model)
  then begin
         Test;
         WriteProtocol;
       end
  else WriteLn('Указанная модель не определена')
END.

Бесплатные примеры программ
Примеры написанных программ
Помощь студентам по программированию