Файл: Курсовая работа по дисциплине вычислительная техника и программирование.doc
Добавлен: 10.01.2024
Просмотров: 139
Скачиваний: 2
| Обозначение в программе | Обозначение в задаче | Назначение |
| U | U | Максимальное значение входного сигнала |
| U1 | | Половина максимального значение выходного сигнала |
| tn | tнач | Время начала импульса |
| tk | tкон | Время окончания импульса |
| t1, t2 | t1,t2 | Точки перегиба |
| a | A | Коэффициент передачи |
| s | | Переменная для вывода текста из файла на экран |
| n | N | Количество точек |
| Tm[i] | T | Массив времени |
| h | | Шаг изменения времени |
| t | | Вспомогательная переменная времени |
| i | | Счетчик цикла |
| U_InP[i] | Uвх(t) | Массив входного сигнала |
| U_OutP[i] | Uвых(t) | Массив выходного сигнала |
| sym | | Переменная для определения нажатой клавишы |
| k | | Вспомогательная переменная для задержки вывода |
| Gd, Gm | | Переменные для инициализации графичиского режима |
| f, f1, f2, f3 | | Переменные файлового типа |
| m | | Вспомогательная переменная для нахождения максимального значения в массиве |
| a | | Вспомогательная переменная |
| v, w | | Переменные для расчета погрешности |
| e | E | Требуемая точность |
| p | p | Погрешность расчета |
Описание процедур и функцийProcedure Logo - Процедура вывода заставкиProcedure Time - Процедура формирования массива времениProcedure U_In - Процедура формирования массива UвхProcedure U_Out - Процедура формирования массива UвыхProcedure Out - Процедура вывода таблицы результатовProcedure Pic - Процедура вывода графиковProcedure Save - Процедура сохранения массива в файлFunction Max - Функция определения максимального элемента массиваFunction GT - Функция определения времениТекст программыProgram KypcoBuK;Uses CRT,Graph;ConstU=30;tn=12;tk=70;t1=20;t2=60;a=3.5;TypeArrayType=Array[1..800]of Real;(****************************************************************************)(****************************************************************************)(****************************************************************************)Procedure Logo;Varf:Text;s:String;BeginWindow(1,1,80,25);TextBackGround(2);ClrScr;Assign(f,'logo.txt');Reset(f);While Not EOF(f) DoBeginReadLn(f,s);WriteLn(s)End;Close(f);ReadKeyEnd;{----------------------------------------------------------------------------}Procedure Time(n:Integer; Var Tm:ArrayType);Varh,t:Real;i:Integer;Beginh:=(tk-tn)/(n-1);t:=tn-h;For i:=1 To n DoBegint:=t+h;Tm[i]:=tEndEnd;{----------------------------------------------------------------------------}Procedure U_In(n:Integer; Tm:ArrayType; Var U_InP:ArrayType);Vari:Integer;BeginFor i:=1 To n DoBeginIf (Tm[i]>tn) and (Tm[i]Then U_inp[i]:=U/(t1-tn)*(Tm[i]-tn)ElseIf (Tm[i]>=t1) and (Tm[i]<=t2)Then U_inp[i]:=UElseIf (Tm[i]>t2) and (Tm[i]Then U_inp[i]:=U/(t2-tk)*(Tm[i]-tk)EndEnd;{----------------------------------------------------------------------------}Procedure U_Out(n:Integer; U_InP:ArrayType; Var U_OutP:ArrayType);Vari:Integer;BeginFor i:=1 To n DoU_OutP[i]:=a*U_InP[i]End;{----------------------------------------------------------------------------}Procedure Out(n:Integer; Tm,U_InP,U_OutP:ArrayType);Vari:Integer;sym,k:Char;BeginWindow(1,1,80,25);TextBackGround(Black);TextColor(White);ClrScr;RepeatGoToXY(25,13);Write('Do you want to see a table ? (Y/N) ');Sym:=ReadKey;Write(sym);Until (sym='y')or(sym='n')or(sym='Y')or(sym='N');If (sym='y')or(sym='Y') ThenBeginClrScr;Window(20,1,55,2);TextBackGround(LightGray);TextColor(Blue);ClrScr;WriteLn(' # Tm(i) U_InP(i) U_OutP(i)');Window(20,2,55,23);TextBackGround(Black);TextColor(Yellow);ClrScr;For i:=1 To n DoBeginIf i mod 21=0ThenBeginWriteLn(i:3,Tm[i]:9:2,U_InP[i]:9:2,U_OutP[i]:11:2);k:=ReadKeyEndElseWriteLn(i:3,Tm[i]:9:2,U_InP[i]:9:2,U_OutP[i]:11:2)End;k:=ReadKeyEnd;Window(1,1,80,25);
TextBackGround(Black);
TextColor(White);
ClrScr
End;
{---------------------------------------------------------------------------}
Procedure Pic(n:Integer; Tm,U_InP,U_OutP:ArrayType);
Var
Gd,Gm,i:Integer;
k,sym:Char;
Begin
Repeat
GoToXY(25,13);
Write('Do you want to see graphics? (Y/N) ');
Sym:=ReadKey;
Write(sym);
Until (sym='y')or(sym='n')or(sym='Y')or(sym='N');
If (sym='y')or(sym='Y') Then
Begin
Gd:=Detect;
InitGraph(Gd, Gm, 'c:\utils\pascal\bgi');
If GraphResult <> grOk Then
Halt(1);
ClearDevice;
SetColor(Green);
SetTextStyle(2,0,6);
OutTextXY(595,423,'t, c');
OutTextXY(15,25,'U, B');
SetColor(Yellow);
OutTextXY(300,80,'U output');
SetColor(White);
OutTextXY(300,305,'U input');
SetColor(Red);
Line(5,420,610,420); {oX}
Line(5,420,5,30); {oY}
Line(5,30,3,40); {Arrows}
Line(5,30,7,40);
Line(600,418,610,420);
Line(600,422,610,420);
SetTextStyle(2,0,5);
Line(Round(5+tn*8),417,Round(5+tn*8),424); {tn}
OutTextXY(Round(5+tn*8)-6,430,'12'); {tn}
Line(Round(5+t1*8),417,Round(5+t1*8),424); {t1}
OutTextXY(Round(5+t1*8)-6,430,'20'); {t1}
Line(Round(5+t2*8),417,Round(5+t2*8),424); {t2}
OutTextXY(Round(5+t2*8)-6,430,'60'); {t2}
Line(Round(5+tk*8),417,Round(5+tk*8),424); {t3}
OutTextXY(Round(5+tk*8)-6,430,'70'); {t3}
Line(2,Round(420-U*a*3),8,Round(420-U*a*3)); {U_Out}
OutTextXY(15,Round(412-U*a*3),'105');
Line(2,420-U*3,8,420-U*3); {U_In}
OutTextXY(15,Round(412-U*3),'30');
For i:=1 To n-1 Do
Begin
SetColor(White);
Line(5+Round(Tm[i]*8),420-Round(U_InP[i])*3,5+Round(Tm[i+1]*8), 420-Round(U_InP[i+1])*3);
SetColor(Yellow);
Line(5+Round(Tm[i]*8),420-Round(U_OutP[i])*3,5+Round(Tm[i+1]*8),420-Round(U_OutP[i+1])*3)
End;
SetColor(Red);
Line(5,420,610,420); {oX}
k:=ReadKey;
CloseGraph
End
End;
{----------------------------------------------------------------------------}
Procedure Save(n:Integer; Tm,U_InP,U_OutP:ArrayType);
Var
i:Integer;
f1,f2,f3:Text;
Begin
Assign(f1,'Tm.txt');
Assign(f2,'U_in.txt');
Assign(f3,'U_out.txt');
Rewrite(f1);
Rewrite(f2);
Rewrite(f3);
For i:=1 To n Do
Begin
WriteLn(f1,Tm[i]:7:2);
WriteLn(f2,U_InP[i]:7:2);
WriteLn(f3,U_OutP[i]:7:2)
End;
Close(f1);
Close(f2);
Close(f3)
End;
{----------------------------------------------------------------------------}
Function Max(n:Integer; U_OutP:ArrayType):Real;
Var
i:Integer;
m:Real;
Begin
m:=U_OutP[1];
For i:=2 To n Do
If U_OutP[i] > m Then m:=U_OutP[i];
max:=m;
End;
{----------------------------------------------------------------------------}
Function GT(n:Integer; a:Char; m:Real; Tm,U_OutP:ArrayType):Real;
Var
i:Integer;
t:Real;
Begin
Case a Of
'U' :
For i:=1 To (n div 2) Do
If U_OutP[i] < m
Then
Begin
If abs(U_OutP[i]-m) < abs(U_OutP[i+1]-m)
Then t:=Tm[i]
Else t:=Tm[i+1]
End;
'D' :
For i:=n DownTo n-(n div 2) Do
If U_OutP[i] < m
Then
Begin
If abs(U_OutP[i]-m) < abs(U_OutP[i-1]-m)
Then t:=Tm[i]
Else t:=Tm[i-1]
End
End;
GT:=t
End;
(****************************************************************************)
(****************************************************************************)
(****************************************************************************)
Var
U_Inp,U_OutP,Tm:ArrayType;
k:Char;
w,e,p,v:Real;
i,n:Integer;
Begin
ClrScr;
Logo;
v:=100000;
e:=0.1;
n:=12;
Time(300,Tm);
U_In(300,Tm,U_InP);
U_Out(300,U_InP,U_OutP);
Out(300,Tm,U_InP,U_OutP);
Pic(300,Tm,U_InP,U_OutP);
Save(300,Tm,U_InP,U_OutP);
ClrScr;
Repeat
Time(n,Tm);
U_In(n,Tm,U_InP);
U_Out(n,U_InP,U_OutP);
w:=U_OutP[1];
For i:=2 To (n div 2) Do
If (U_OutP[i] > w) and (U_OutP[i] < Max(n,U_OutP)/2)
Then w:=U_OutP[i];
p:=abs(w-v);
n:=n*2;v:=w;Until (p < e) or (n >= 801);ClrScr;If p < eThenBeginWriteLn('Impulse Time = ', GT(n div 2,'D',Max(n div 2,U_OutP)/2,Tm,U_OutP)- GT(n div 2,'U',Max(n div 2,U_OutP)/2,Tm,U_OutP):7:2,'sec');WriteLn('Pogreshnost = ',p:6:4,' pri n = ',n div 2);WriteLnEndElseIf n >= 801 ThenWriteLn('Trebuemaya tochnost ne dostignuta');WriteLn('Press any key to continue...');ReadKeyEnd.