Курсовая работа по дисциплине вычислительная техника и программирование
Скачать 104.5 Kb.
|
Министерство связи Российской Федерации по связи и информации Санкт-Петербургский государственный университет телекоммуникаций им. проф. М.А. Бонч-Бруевича Курсовая работа по дисциплине «ВЫЧИСЛИТЕЛЬНАЯ ТЕХНИКА И ПРОГРАММИРОВАНИЕ» Расчет характеристик электрических цепей Выполнил: Волков А. (гр. МИ-19) Проверила: Груздева Л. А. Санкт-Петербург 2002 Постановка задачи Необходимо по заданной передаточной характеристике электрической цепи и известному входному сигналу Uвх(t) построит выходной сигнал Uвых(t), а затем определить длительность импульса на уровне 0.5 Uвых max Входной сигнал ( А – 35 ) U tn t1 t2 tk U = 30 В tn = 12 с t1 = 20 с t2 = 60 с tk = 70 с Передаточная характеристика ( Б – 01 ) Uвых(t) = a Uвх(t) Определить длительность импульса на уровне 0.5 Uвых max ( В - 07 ) Блок-схема Графики полученные в среде MathCad Графики полученные в среде Turbo Pascal Таблица идентификаторов
Описание процедур и функций 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; Const U=30; tn=12; tk=70; t1=20; t2=60; a=3.5; Type ArrayType=Array[1..800]of Real; (****************************************************************************) (****************************************************************************) (****************************************************************************) Procedure Logo; Var f:Text; s:String; Begin Window(1,1,80,25); TextBackGround(2); ClrScr; Assign(f,'logo.txt'); Reset(f); While Not EOF(f) Do Begin ReadLn(f,s); WriteLn(s) End; Close(f); ReadKey End; {----------------------------------------------------------------------------} Procedure Time(n:Integer; Var Tm:ArrayType); Var h,t:Real; i:Integer; Begin h:=(tk-tn)/(n-1); t:=tn-h; For i:=1 To n Do Begin t:=t+h; Tm[i]:=t End End; {----------------------------------------------------------------------------} Procedure U_In(n:Integer; Tm:ArrayType; Var U_InP:ArrayType); Var i:Integer; Begin For i:=1 To n Do Begin If (Tm[i]>tn) and (Tm[i] Then U_inp[i]:=U/(t1-tn)*(Tm[i]-tn) Else If (Tm[i]>=t1) and (Tm[i]<=t2) Then U_inp[i]:=U Else If (Tm[i]>t2) and (Tm[i] Then U_inp[i]:=U/(t2-tk)*(Tm[i]-tk) End End; {----------------------------------------------------------------------------} Procedure U_Out(n:Integer; U_InP:ArrayType; Var U_OutP:ArrayType); Var i:Integer; Begin For i:=1 To n Do U_OutP[i]:=a*U_InP[i] End; {----------------------------------------------------------------------------} Procedure Out(n:Integer; Tm,U_InP,U_OutP:ArrayType); Var i:Integer; sym,k:Char; Begin Window(1,1,80,25); TextBackGround(Black); TextColor(White); ClrScr; Repeat GoToXY(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') Then Begin ClrScr; 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 Do Begin If i mod 21=0 Then Begin WriteLn(i:3,Tm[i]:9:2,U_InP[i]:9:2,U_OutP[i]:11:2); k:=ReadKey End Else WriteLn(i:3,Tm[i]:9:2,U_InP[i]:9:2,U_OutP[i]:11:2) End; k:=ReadKey End; 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 < e Then Begin WriteLn('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); WriteLn End Else If n >= 801 Then WriteLn('Trebuemaya tochnost ne dostignuta'); WriteLn('Press any key to continue...'); ReadKey End. |