• Добро пожаловать на компьютерный форум Tehnari.ru. Здесь разбираемся с проблемами ПК и ноутбуков: Windows, драйверы, «железо», сборка и апгрейд, софт и безопасность. Форум работает много лет, сейчас он переехал на новый движок, но старые темы и аккаунты мы постарались сохранить максимально аккуратно.

    Форум не связан с магазинами и сервисами – мы ничего не продаём и не даём «рекламу под видом совета». Отвечают обычные участники и модераторы, которые следят за порядком и качеством подсказок.

    Если вы у нас впервые, загляните на страницу о форуме и правила – там коротко описано, как задать вопрос так, чтобы быстро получить ответ. Чтобы создавать темы и писать сообщения, сначала зарегистрируйтесь, а затем войдите под своим логином.

    Не знаете, с чего начать? Создайте тему с описанием проблемы – подскажем и при необходимости перенесём её в подходящий раздел.
    Задать вопрос Новые сообщения Как правильно спросить
    Если пришли по старой ссылке со старого Tehnari.ru – вы на нужном месте, просто продолжайте обсуждение.

TPU-модуль. Паскаль

Олеег

Новые
Регистрация
6 Июл 2014
Сообщения
12
Реакции
0
Баллы
0
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;
 
Привет! подскажите как правильно запихнуть функцию в тпу модуль?

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

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 описывать в программе уже не нужно, он задан в модуле.
 
Спасибо большое, Владимир!
 
подскажите что не правильно, программа не хочет запускаться.
 

Вложения

  • Безымянный.webp
    Безымянный.webp
    29.9 KB · Просмотры: 126
программа не хочет запускаться

Как-то так:

Код:
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 описывать в программе уже не нужно, он задан в модуле.




прога не запускается, что не так?
 

Вложения

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

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

Кроме того, могут возникнуть проблемы, связанные с размещением TPU-файла. Проверьте, что он находится именно в той директории, которая прописана в свойствах транслятора для модулей.

все сделал, находятся в одной директории , пишет
syschestvovanie_treygolnika.pas : Встречено 'Inteface', а ожидалось begin
 
все сделал, находятся в одной директории , пишет syschestvovanie_treygolnika.pas : Встречено 'Inteface', а ожидалось begin
Не понимаю. Выложите листинги программы и модуля, причем в текстовом режиме (чтобы можно было скопировать) - я посмотрю.
 
С этой проблемой разобрался, спасибо) но появился новый баг о основной программе.

Выложите листинги программы и модуля


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


Создать файл 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.
 
Сходу не отвечу, ошибок ОЧЕНЬ много, полная путаница с типами, не говоря уж о таких перлах:
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 БЫТЬ НЕ ДОЛЖНО!

Сам алгоритм посмотрю позже.
 
с типами полный ужас!

да я сам не пойму, если не напишу в каждом модуле это, то основа выдает вечно, что пременные не объявлены.

Код:
trg=record      
       x1,y1,x2,y2,x3,y3:real;        
       s, p: real; //площадь, периметр     
      end;

как так, я уже по всякому записывал
и, как вы сказали

Во втором и третьем модуле в разделе Interface поставьте
Uses Suschetstvovanie_treugolnika;
и всё!

тоже делал, выдавал ошибку вечно
 
В общем, так.
Могу лишь предложить своё решение Вашей задачки, полностью отлаженное и оттестированное. Надеюсь, что поможет.

1. Основная программа:
Код:
uses
  CRT,Sus_tre,Ploshad,Perimetr;
var
  f1,f2:file of trg;
  z:trg;
  n,i,k,kl:integer;
  r1,r2:real;

begin
  clrscr;
  randomize;
  assign(f1,'input');
  rewrite(f1);
  assign(f2,'output');
  rewrite(f2);
  write('Enter the number of triangles ');
  readln(n);
  for i:= 1 to n do
   with z do
    begin
     x1:= -1.2+2.4*random;
     y1:= -1.2+2.4*random;
     x2:= -1.2+2.4*random;
     y2:= -1.2+2.4*random;
     x3:= -1.2+2.4*random;
     y3:= -1.2+2.4*random;
     a:=Sqrt(Sqr(x1-x2)+Sqr(y1-y2));
     b:=Sqrt(Sqr(x1-x3)+Sqr(y1-y3));
     c:=Sqrt(Sqr(x2-x3)+Sqr(y2-y3));
     p:=perm(z);
     s:=plos(z);
     write(f1,z)
    end;
  Close(f1);
  Reset(f1);
  writeln('File F1 content:');
  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:= kl+1;
      write(f2, z);
    end;
  end;
  close(f1);
  close(f2);
  if kl=0 then
   writeLn('No triangulas lying inside the circle')
  else
   begin
    repeat
     write('Enter the perimeter search range r1<r2 ');
     readln(r1,r2);
    until r1<r2;
    reset(f2);
    writeln('Result of perimeter search:');
    k:=0;
    while not eof(f2) do
     begin
      read(f2,z);
      if (z.p>=r1) and (z.p<=r2) then
       begin
        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;
       end;
     end;
    writeln('Number of triangles with perimeter inside the given range is ',k);
    writeln;
    repeat
     write('Enter the square search range r1<r2 ');
     readln(r1,r2);
    until r1<r2;
    reset(f2);
    writeln('Result of square search:');
    k:=0;
    while not eof(f2) do
     begin
      read(f2,z);
      if (z.s>=r1) and (z.s<=r2) then
       begin
        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;
       end;
     end;
    writeln('Number of triangles with square inside the given range is ',k);
    close(f2);
   end;
  ReadKey
end.
Первый модуль:
Код:
Unit sus_tre;

Interface

uses crt;
type
trg=record
     x1,y1,x2,y2,x3,y3:real;
     a,b,c,p,s: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.
Второй модуль:
Код:
unit Perimetr;

interface

uses
 sus_tre;
function perm(t:trg):real;

implementation

function perm(t:trg):real;
 begin
  perm:=t.a+t.b+t.c;
 end;

End.
Третий модуль:
Код:
unit Ploshad;

interface

uses  sus_tre;
function plos(t:trg):real;

implementation

function plos(t:trg):real;
var p2:real;
begin
 p2:=(t.a+t.b+t.c)/2;
 plos:=Sqrt(p2*(p2-t.a)*(p2-t.b)*(p2-t.c));
end;

End.
Пользуюсь DOS Free-Паскалем, поэтому с кириллицей и длинными именами файлов - напряженка. Поправьте, если надо.
Кроме того, я, извините, напрочь не понял, как это Вы так лихо считаете площади треугольников. Я - по старой доброй формуле Герона.
 
а площадь по этой формуле)
 

Вложения

  • l2_image001.gif
    l2_image001.gif
    1,008 байт · Просмотры: 368
а площадь по этой формуле)
Хм... забавно. Не знал. Вот ведь - век живи, век учись - дураком помрёшь...
P.S. Одна поправка: в этом методе следует брать не сам определитель (он может оказаться и отрицательным), а его абсолютную величину.
 
Назад
Сверху