Программа
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.
Бесплатные примеры программ
Примеры написанных программ
Помощь студентам по программированию