Помощь - Поиск - Пользователи - Календарь
Полная версия: Программа расчета харак-тик выходного сигнала электроцепи
Форум «Всё о Паскале» > 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
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.