Файл: Курсовая работа по дисциплине вычислительная техника и программирование.doc
Добавлен: 10.01.2024
Просмотров: 39
Скачиваний: 2
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Министерство связи Российской Федерации по связи и информации
Санкт-Петербургский государственный университет телекоммуникаций
им. проф. М.А. Бонч-Бруевича
Курсовая работа по дисциплине
«ВЫЧИСЛИТЕЛЬНАЯ ТЕХНИКА И ПРОГРАММИРОВАНИЕ»
Расчет характеристик электрических цепей
Выполнил: Волков А. (гр. МИ-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
Таблица идентификаторов
Обозначение в программе | Обозначение в задаче | Назначение |
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;
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.