Файл: Курсовая работа по дисциплине вычислительная техника и программирование.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.