Технический форум
Вернуться   Технический форум > Программирование > Форум программистов > Delphi, Kylix and Pascal


Ответ
 
Опции темы Опции просмотра
Старый 06.07.2014, 11:48   #1 (permalink)
Олеег
Member
 
Регистрация: 06.07.2014
Сообщений: 12
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
Unhappy TPU-модуль. Паскаль

Привет! подскажите как правильно запихнуть функцию в тпу модуль?

вот кусок проги с функцией, которую нужно описать в тпу модуле

uses crt;
type trg=record
x1,y1,x2,y2,x3,y3:real;//координаты
end;

function prin(t:trg):boolean;{принадлежность треугольника кругу}
begin
prin:=(sqr(t.x1)+sqr(t.y1)<1)//все 3 вершины в заданном круге
and(sqr(t.x2)+sqr(t.y2)<1)
and(sqr(t.x3)+sqr(t.y3)<1)
end;
Олеег вне форума   Ответить с цитированием

Старый 06.07.2014, 11:48
Helpmaster
Member
 
Аватар для Helpmaster
 
Регистрация: 08.03.2016
Сообщений: 0

Ранее на форуме были созданы похожие темы

Модуль матрицы
DC-DC модуль МПВ6А ИРБИС
Модуль памяти

Старый 06.07.2014, 13:31   #2 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Олеег Посмотреть сообщение
Привет! подскажите как правильно запихнуть функцию в тпу модуль?

вот кусок проги с функцией, которую нужно описать в тпу модуле

uses crt;
type trg=record
x1,y1,x2,y2,x3,y3:real;//координаты
end;

function prin(t:trg):boolean;{принадлежность треугольника кругу}
begin
prin:=(sqr(t.x1)+sqr(t.y1)<1)//все 3 вершины в заданном круге
and(sqr(t.x2)+sqr(t.y2)<1)
and(sqr(t.x3)+sqr(t.y3)<1)
end;
Как-то так:

Код:
Unit MyUnit;

Inteface

uses crt;
type 
trg=record
     x1,y1,x2,y2,x3,y3:real; //координаты
    end;

function prin(t:trg):boolean; {принадлежность треугольника кругу}

Implementation

function prin(t:trg):boolean;
begin
 prin:=((sqr(t.x1)+sqr(t.y1))<1)
   and ((sqr(t.x2)+sqr(t.y2))<1)
   and ((sqr(t.x3)+sqr(t.y3))<1)
end;

End.
(обратите внимание на исправленные ошибки расстановки скобок в теле функции). Сохраняете это дело в файл MyUnit.pas (для модулей соответствие его имени и имени файла строго обязательны!), затем транслируете его как обычную программу, в результате чего должен возникнуть файл MyUnit.tpu, а потом в основной программе не забываете указать
Uses MyUnit;
Тип trg описывать в программе уже не нужно, он задан в модуле.
Vladimir_S вне форума   Ответить с цитированием
Старый 06.07.2014, 14:07   #3 (permalink)
Олеег
Member
 
Регистрация: 06.07.2014
Сообщений: 12
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

Спасибо большое, Владимир!
Олеег вне форума   Ответить с цитированием
Старый 07.07.2014, 12:34   #4 (permalink)
Олеег
Member
 
Регистрация: 06.07.2014
Сообщений: 12
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
По умолчанию

подскажите что не правильно, программа не хочет запускаться.
Миниатюры
aacuiyiiue.png  
Олеег вне форума   Ответить с цитированием
Старый 07.07.2014, 12:52   #5 (permalink)
Олеег
Member
 
Регистрация: 06.07.2014
Сообщений: 12
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
Unhappy программа не хочет запускаться

Цитата:
Сообщение от Vladimir_S Посмотреть сообщение
Как-то так:

Код:
Unit MyUnit;

Inteface

uses crt;
type 
trg=record
     x1,y1,x2,y2,x3,y3:real; //координаты
    end;

function prin(t:trg):boolean; {принадлежность треугольника кругу}

Implementation

function prin(t:trg):boolean;
begin
 prin:=((sqr(t.x1)+sqr(t.y1))<1)
   and ((sqr(t.x2)+sqr(t.y2))<1)
   and ((sqr(t.x3)+sqr(t.y3))<1)
end;

End.
(обратите внимание на исправленные ошибки расстановки скобок в теле функции). Сохраняете это дело в файл MyUnit.pas (для модулей соответствие его имени и имени файла строго обязательны!), затем транслируете его как обычную программу, в результате чего должен возникнуть файл MyUnit.tpu, а потом в основной программе не забываете указать
Uses MyUnit;
Тип trg описывать в программе уже не нужно, он задан в модуле.



прога не запускается, что не так?
Миниатюры
aacuiyiiue.png  
Олеег вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Старый 07.07.2014, 12:56   #6 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Олеег Посмотреть сообщение
подскажите что не правильно, программа не хочет запускаться.
Потому что неправильно задано обращение к модулю! Я же Вам написал, что в основной программе это делается оператором Uses, т.е у Вас должно быть:
Uses CRT, suschestvovanie_treugolnika;
А Вы что написали?

Кроме того, могут возникнуть проблемы, связанные с размещением TPU-файла. Проверьте, что он находится именно в той директории, которая прописана в свойствах транслятора для модулей.
Vladimir_S вне форума   Ответить с цитированием
Старый 07.07.2014, 13:29   #7 (permalink)
Олеег
Member
 
Регистрация: 06.07.2014
Сообщений: 12
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
Unhappy

Цитата:
Сообщение от Vladimir_S Посмотреть сообщение
Потому что неправильно задано обращение к модулю! Я же Вам написал, что в основной программе это делается оператором Uses, т.е у Вас должно быть:
Uses CRT, suschestvovanie_treugolnika;
А Вы что написали?

Кроме того, могут возникнуть проблемы, связанные с размещением TPU-файла. Проверьте, что он находится именно в той директории, которая прописана в свойствах транслятора для модулей.
все сделал, находятся в одной директории , пишет
syschestvovanie_treygolnika.pas : Встречено 'Inteface', а ожидалось begin
Олеег вне форума   Ответить с цитированием
Старый 07.07.2014, 15:54   #8 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от Олеег Посмотреть сообщение
все сделал, находятся в одной директории , пишет syschestvovanie_treygolnika.pas : Встречено 'Inteface', а ожидалось begin
Не понимаю. Выложите листинги программы и модуля, причем в текстовом режиме (чтобы можно было скопировать) - я посмотрю.
Vladimir_S вне форума   Ответить с цитированием
Старый 07.07.2014, 16:51   #9 (permalink)
Олеег
Member
 
Регистрация: 06.07.2014
Сообщений: 12
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 10
Post С этой проблемой разобрался, спасибо) но появился новый баг о основной программе.

Цитата:
Сообщение от Vladimir_S Посмотреть сообщение
Выложите листинги программы и модуля

С этой проблемой разобрался, спасибо) но появился новый баг о основной программе.
Проверьте пожалуйста правильность оформления


Создать файл F1, содержащий заданное число треугольников, описываемых координатами своих вершин. Координаты вершин получить с помощью датчика случайных чисел Random в интервале [-1.2 , 1.2]. Найти все треугольники, лежащие целиком внутри круга с центром в точке (0,0) радиуса 1.0. Сведения о треугольниках (координаты вершин, площадь и периметр) попавших внутрь круга, поместить в файл F2. Получить из файла F2 данные о количестве треугольников, площадь которых или периметр лежат в заданном интервале.

Код:
program Osnova;

uses
  crt, Syschestvovanie_treygolnika, Ploshad, Perimetr;
  type 
trg=record
     x1,y1,x2,y2,x3,y3:real; 
      s, p: real;//площадь, периметр
    end;
var
  f1, f2: file of trg;
  z: trg;
  n, i, k, kl: integer;
  a, b: real;

begin
  clrscr;
  randomize;
  assign(f1, 'input');
  rewrite(f1);
  assign(f2, 'output');
  rewrite(f2);
  writeln('Введите число треугольников:');
  readln(n);
  for i := 1 to n do
  begin
    z.x1 := (-1.2 + 2.4) * random;
    z.y1 := (-1.2 + 2.4) * random;
    z.x2 := (-1.2 + 2.4) * random;
    z.y2 := (-1.2 + 2.4) * random;
    z.x3 := (-1.2 + 2.4) * random;
    z.y3 := (-1.2 + 2.4) * random;
    write(f1, z)
  end;
  writeln('Содержание файла F1');
  seek(f1, 0);
  k := 0;
  kl := 0;
  while not eof(f1) do
  begin
    read(f1, z);
    k := k + 1;
    writeln(k:2, ')   A (', z.x1:5:2, ' ', z.y1:5:2, ')   B (', z.x2:5:2, ' ', z.y2:5:2, ')'
                 '    C (', z.x3:5:2, ' ', z.y3:5:2, ')');
    if k mod 20 = 0 then
    begin
      writeLn('Press Enter');
      readln
    end;
    if prin(z) then
    begin
      kl := 1;
      z.s := plos(z);
      z.p := perm(z);
      write(f2, z);
    end;
  end;
  close(f1);
  if kl = 0 then
  begin
    writeLn('Нет треугольников, целиком лежащих в данном круге');
    close(f2);
    exit
  end;
  repeat
    writeln('Введите интервал для поиска a < b');
    readln(a, b);
  until a < b;
  seek(f2, 0);
  writeln('Содержание файла F2');
  k := 0;
  kl := 0;
  while not eof(f2) do
  begin
    read(f2, z);
    k := k + 1;
    writeln(k:2, ')   A (', z.x1:5:2, ' ', z.y1:5:2, ')   B (', z.x2:5:2, ' ', z.y2:5:2, ')'
                 '    C (', z.x3:5:2, ' ', z.y3:5:2, ')');  
    writeln( 'S = ', z.s:5:2, '   P = ', z.p:5:2);
    if k mod 20 = 0 then
    begin
      writeLn('Press Enter');
      readln
    end;
    if ((z.s >= a) and (z.s <= b)) or ((z.p >= a) and (z.p <= b)) then kl := kl + 1;
  end;
  writeln('Количество треугольников, у которых площадь или периметр');
  writeln('попадают в заданный интервал=', kl);
  close(f2);
end.
и 3 модуля

1)
Код:
Unit syschestvovanie_treygolnika;

Interface

uses crt;
type 
trg=record
     x1,y1,x2,y2,x3,y3:real; //координаты
    end;

function prin(t:trg):boolean; {принадлежность треугольника кругу}

Implementation

function prin(t:trg):boolean;
begin
 prin:=((sqr(t.x1)+sqr(t.y1))<1)
   and ((sqr(t.x2)+sqr(t.y2))<1)
   and ((sqr(t.x3)+sqr(t.y3))<1)
end;

End.
2)
Код:
unit Ploshad;

interface

uses  crt,syschestvovanie_treygolnika;
type 
trg=record
     x1,y1,x2,y2,x3,y3:real; 
      s, p: real;//площадь, периметр
    end;
function plos(t: trg): real;

implementation

function plos(t: trg): real;
begin
  plos := ((t.x1 - t.x3) * (t.y2 - t.y3) - (t.x2 - t.x3) * (t.y1 - t.y3)) / 2
end;
End.
3)
Код:
unit Perimetr;

interface

uses
  crt,syschestvovanie_treygolnika;
  type 
  trg=record
     x1,y1,x2,y2,x3,y3:real; 
      s, p: real;//площадь, периметр
    end;
function perm(t: trg): real;
implementation

function perm(t: trg): real;
begin
  perm := sqrt(sqr(t.x1 - t.x2) + sqr(t.y1 - t.y2))
       + sqrt(sqr(t.x2 - t.x3) + sqr(t.y2 - t.y3))
       + sqrt(sqr(t.x3 - t.x1) + sqr(t.y3 - t.y1))
end;
End.
Олеег вне форума   Ответить с цитированием
Старый 07.07.2014, 17:09   #10 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Сходу не отвечу, ошибок ОЧЕНЬ много, полная путаница с типами, не говоря уж о таких перлах:
z.x1 := (-1.2 + 2.4) * random;
Очевидно, имеется в виду
z.x1 := -1.2 + 2.4*random;
Начните с этих исправлений, но главное, повторяю - с типами полный ужас! Советую ввести ОДИН РАЗ полный тип
Код:
trg=record      
       x1,y1,x2,y2,x3,y3:real;        
       s, p: real; //площадь, периметр     
      end;
например, в модуле Suschetstvovanie_treugolnika и дальше нигде (ни в основной программе, ни в модулях) никаких типов не вводить. Во втором и третьем модуле в разделе Interface поставьте
Uses Suschetstvovanie_treugolnika;
и всё! Больше ни в модулях, ни в программе повторного описания типа trg БЫТЬ НЕ ДОЛЖНО!

Сам алгоритм посмотрю позже.
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070
Ответ

Метки
паскаль, помощь студентам


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.




Часовой пояс GMT +4, время: 07:46.

Powered by vBulletin® Version 6.2.5.
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.