Помощь - Поиск - Пользователи - Календарь
Полная версия: Программа расчета харак-тик выходного сигнала электроцепи
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
Shadow83
Есть программа:

Program Kursovic;
uses crt;
const
maxind=160;
type
ArrayType=array [1..maxind] of real;
{---------------------------------------------------------}
{Процедура ввода исходной информации}
Procedure DATA(var n:integer;
kl:byte;
tn, tm, tk, Um, Uin2, Uin3, at, bt:real);
begin
Writeln('Введите нужное количество отсчетов сигнала');
Write('n=');
Readln(n);

Writeln('Введите признак kl=1, если хотите вывести результат на монитор');
Writeln('или признак kl=0, если хотите записать результаты в файлы f1 и f2');
Write('kl=');
Readln(kl);

Writeln('Введите ваши исходные данные');
Writeln('Начальный момент наблюдения входного сигнала');
Write('tn=');
Readln(tn);

Writeln('Момент времени, разделяющий две ветви алгоритма');
Writeln('расчета входного сигнала');
Write('tm=');
Readln™;

Writeln('Конечный момент времени наблюдения входного сигнала');
Write('tk=');
Readln(tk);

Writeln('Значение входного напряжения соответствующему моменту времени tm');
Write('Um=');
Readln(Um);

Writeln('Заданный параметр передаточной характеристики');
Write('Uin2=');
Readln(Uin2);
Write('Uin3=');
Readln(Uin3);
Write('a=');
Readln(at);
Write('b=');
Readln(bt);
End;
{---------------------------------------------------------}
{Описание процедуры формирования массива входных отсчетов}
procedure UIN1(var n:integer;
kl:byte;
tn, tm, tk, Um:real;
Uin:ArrayType);
var t, a, b, del:real;
i:integer;
begin
t:=tn;
del:=(tk-tn)/(n-1);
a:=Um/(tm-tn);
b:=Um/(tk-tm);
for i:=1 to n do
begin
if t>tm then Uin[i]:=b*(tk-t)
else Uin[i]:=a*(t-tn);
t:=t+del;
end;
end;
{---------------------------------------------------------}
{Описание процедуры формирования массива выходных отсчетов}
procedure Uout1(var n:integer;
kl:byte;
Uin2, Uin3, at, bt:real;
Uin, Uout:ArrayType);
var i:integer;
begin
for i:=1 to n do
if Uin[i]<=Uin2 then Uout[i]:=(at*Uin2)+bt
else if (Uin2<Uin[i]) and (Uin[i]<=Uin3) then Uout[i]:=(at*Uin[i])+bt
else if Uin[i]>Uin3 then Uout[i]:=(at*Uin3)+bt;
end;
{---------------------------------------------------------}
{Описание функции нахождения макс. значения выходного сигнала}
procedure MAXI(var n:integer;
Uout:Arraytype);
var
max:real;
i:integer;
begin
max:=Uout[i];
for i:=2 to n do
if Uout[i]>max then max:=Uout[i];
max:=MaxInt;
end;
{---------------------------------------------------------}
{Описание процедуры записи массивов входного и выходного сигнала}
{на диск в файлы с именами f1.prn и f2.prn}
procedure WRITEINFO(var n:integer;
uin,uout:ArrayType);
var
f1, f2:text;
i:integer;
begin
assign(f1,'f1.prn');
assign(f2,'f2.prn');
rewrite(f1);
rewrite(f2);
for i:=1 to n do
begin
WriteLn(f1,uin[i]:7:3);
WriteLn(f2,uout[i]:7:3);
end;
close(f1);
close(f2);
end;
{---------------------------------------------------------}
{Процедура вывода на экран результатов работы программы}
procedure REZULT(var n:integer;
kl:byte;
uin, uout:ArrayType);
var
i:integer;
begin
if kl=1 then
begin
WriteLn('Отсчеты входного сигнала');
for i:=1 to n do
WriteLn('uin[',i,']=',uin[i]:7:3);
WriteLn('Отсчеты выходного сигнала');
for i:=1 to n do
WriteLn('uout[',i,']=',uout[i]:7:3);
WriteLn('Макс. значение вых. сигнала=',MAXI(n,uout):7:3);
end
else
begin
WriteLn;
WriteLn;
WriteLn('Программа закончила свою работу. Массивы');
WriteLn('входных и выходных отсчетов сформированы');
WriteLn('и записаны в файлы f1.prn и f2.prn соответственно');
end;
end;
{---------------------------------------------------------}
var
n:integer;
kl:byte;
tn, tm, tk, Um, Uin2, Uin3, at, bt:real;
Uin, Uout:ArrayType;
begin {Main}
Clrscr;
Data(n, kl, tn, tm, tk, Um, Uin2, Uin3, at, bt);
Uin1(n, kl, tn, tm, tk, Um, Uin);
Uout1(n, kl, Uin2, Uin3, Uin, Uout);
Writeinfo(n, uin, uout);
Rezult(n, kl, uin, uout);
Readln;
end.


Вылазят ошибки и не могу их исправить. Помогите пожалуйста! unsure.gif Её уже сдавать надо, а я никак её сделать не могу. Если не использовать процедуру MAXI в процедуре вывода результатов на экран, то вылазит 26 ошибка на 153:32. А если использовать то 143 ошибка на 133:54.
Client
ты выводишь на экран процедуру wacko.gif
WriteLn('Макс. значение вых. сигнала=',MAXI(n,uout):7:3);

Описание - 8 параметров (советую переименовать параметр и переменную at)
procedure Uout1(var n:integer;
kl:byte;
Uin2, Uin3, at, bt:real;
Uin, Uout:ArrayType);

а вызов - 6 параметров
Uout1(n, kl, Uin2, Uin3, Uin, Uout);

Убрав это, хотя бы компилируется
Shadow83
Цитата(Client @ 9.04.2010 23:39) *

ты выводишь на экран процедуру wacko.gif
WriteLn('Макс. значение вых. сигнала=',MAXI(n,uout):7:3);

Описание - 8 параметров (советую переименовать параметр и переменную at)
procedure Uout1(var n:integer;
kl:byte;
Uin2, Uin3, at, bt:real;
Uin, Uout:ArrayType);

а вызов - 6 параметров
Uout1(n, kl, Uin2, Uin3, Uin, Uout);

Убрав это, хотя бы компилируется

Как хорошо что есть свежая пара глаз, спс!
Uout1(n, kl, Uin2, Uin3, Uin, Uout);

Тут исправил!
WriteLn('Макс. значение вых. сигнала=',MAXI(n,uout):7:3);

У меня не компилируется из-за этого огрызка. Это я выдерал из методички, должно выводится макс. значение. Но оно не проходит! Может я не правильно ищу макс. значение и в методичке ошибка? HELP!
А если просто убрать MAXI(n,uout):7:3, то 200 ошибка.
Ozzя
Тебе же сказали ошибку.
{---------------------------------------------------------}
{Описание функции нахождения макс. значения выходного сигнала} {В описании - функция!}
{procedure MAXI(var n:integer;Uout:Arraytype); А здесь процедура!}
function MAXI(var n:integer; Uout:Arraytype):real;
var
max:real;
i:integer;
begin
max:=Uout[1]; {Здесь была ошибка! ДОлжно быть Uout[1]!}
for i:=2 to n do
if Uout[i]>max then max:=Uout[i];
{ max:=MaxInt;} {Это зачем?}
MAXI:=max;
end;



2 Ozzя:
использовать тэги внутри кода - bad idea ))
Shadow83
Тут
MAXI:=max;
говорит не хватает скобки.
Client
причем там скобки? единственная пара скобок в описании заголовка
volvo
Цитата
Тут исправил!
Не говоришь, КАК исправил - ищи ошибку (которая приводит к RunTime Error 200 в результате) сам. Здесь тебе никто помочь не в силах. Чтобы понять, что у тебя неправильно - надо не только иметь ПОЛНЫЙ текст программы со всеми исправлениями, но еще и входные данные, которыми ты пользуешься. А гадать на киселе - это не сюда, для гадалок есть другие форумы. Гугл знает...

Цитата
говорит не хватает скобки.
Нормальный компилятор такого не говорит. А чем ты пользуешься - ты не рассказал.
Shadow83
Turbo Pascal 7.1, брал отсюда tp7.info
Ой, простите unsure.gif я просто не заменил procedure на function.
Ну теперь хоть компилируется, вот исходные данные Тнач=0,5 с, Тм=2,5 с, Ткон=6 с, Uм=20,5 В, Uвх1=10 В, Uвх2=30 В, а=2,5 1/В, b=10 В.
После не долгих махинаций выяснил что в:

a:=Um/(tm-tn);
b:=Um/(tk-tm);


ошибка. Только не пойму откуда здесь берется ноль, что вылазит 200 ошибка.
По химичав снова:

Data(n, kl, tn, tm, tk, Um, Uin2, Uin3, at, bt);
Writeln(n, kl, tn, tm, tk, Um, Uin2, Uin3, at, bt); {Подставил строку}


Результатом её стало, что значение n=4 все же остальные результаты переменных равны 0.0000Е+00
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.