Технический форум

Технический форум (http://www.tehnari.ru/)
-   Помощь студентам (http://www.tehnari.ru/f41/)
-   -   Использовать данные из файла в программе (http://www.tehnari.ru/f41/t103779/)

Asya_inter 14.08.2015 21:12

Использовать данные из файла в программе
 
Здравствуйте,задача решена, но мне хотелось бы, чтобы координаты точек были записаны в файле, но я не знаю как можно из файла брать значения координат и вычислять в программе(через цикл наверное)? Подскажите, если знаете, а то примеры в интернете всё не подходящие. И ещё как исключить вероятность нахождения трёх точек на одной прямой?(просто это вроде в условии требуется, а в данном решении не выполняется) задача:На плоскости множество точек, любые три не лежат на одной прямой. Построить треугольник с наименьшей площадью.
Цитата:

program z3;
uses crt;
function Pl(x1,y1,x2,y2,x3,y3:integer):real;
begin
Pl:=abs((x1-x3)*(y2-y3)-(x2-x3)*(y1-y3))/2
end;
const nmax=19;
var t:array[1..2,1..nmax] of integer;
n,i,j,k,imn,imx,jmn,jmx,kmn,kmx,v:byte;
mn,mx:real;
begin
clrscr;
randomize;
repeat
write('Количество точек от 3 до ',nmax,' n=');
readln(n);
until n in [3..nmax];
for i:=1 to n do
begin
t[1,i]:=-10+random(21);
t[2,i]:=-10+random(21);
end;
writeln('Исходные координаты:');
write('X');
for i:=1 to n do
write(t[1,i]:4);
writeln;
write('Y');
for i:=1 to n do
write(t[2,i]:4);
writeln;
mx:=Pl(t[1,1],t[2,1],t[1,2],t[2,2],t[1,3],t[2,3]);
mn:=mx;
imn:=1;imx:=1;
jmn:=2;jmx:=2;
kmn:=3;kmx:=3;
v:=0;
for i:=1 to n-2 do
for j:=i+1 to n-1 do
for k:=j+1 to n do
begin
if(Pl(t[1,i],t[2,i],t[1,j],t[2,j],t[1,k],t[2,k])<mn) then
begin
mn:=Pl(t[1,i],t[2,i],t[1,j],t[2,j],t[1,k],t[2,k]);
imn:=i;
jmn:=j;
kmn:=k
end;
if Pl(t[1,i],t[2,i],t[1,j],t[2,j],t[1,k],t[2,k])>mx then
begin
mx:=Pl(t[1,i],t[2,i],t[1,j],t[2,j],t[1,k],t[2,k]);
imx:=i;
jmx:=j;
kmx:=k
end;
end;
writeln('Треугольник с минимальной площадью:');
writeln(imn,'(',t[1,imn],';',t[2,imn],')');
writeln(jmn,'(',t[1,jmn],';',t[2,jmn],')');
writeln(kmn,'(',t[1,kmn],';',t[2,kmn],')');
writeln('Площадь=',mn:0:2);
writeln('Треугольник с максимальной площадью:');
writeln(imn,'(',t[1,imx],';',t[2,imx],')');
writeln(jmn,'(',t[1,jmx],';',t[2,jmx],')');
writeln(kmn,'(',t[1,kmx],';',t[2,kmx],')');
writeln('Площадь=',mx:0:2);
readln
end.

Vladimir_S 15.08.2015 19:03

Фу, ну и головоломка!
В общем, сотворил.
1. Работа только с файлами, без массивов (использовать и то, и другое - IMHO некультурно :) ).
2. В выходной файл заносятся значения площадей и туда же - итоговый результат.
3. Имена файлов и пути к ним можно, естественно, поменять.
4. Критерием расположения трёх точек на одной прямой является непревышение площадью треугольника заранее заданного малого числа (Eps). Если сгенерированная точка легла на одну прямую с двумя уже имеющимися, то такая точка не записывается и координаты генерируются заново.
Код:

uses CRT;

Const
 Eps=0.0001;

var
 x,y,x_1,y_1,x_2,y_2,x_3,y_3,
 x1mn,y1mn,x2mn,y2mn,x3mn,y3mn,
 x1mx,y1mx,x2mx,y2mx,x3mx,y3mx:integer;
 N,i,j,k,q:byte;
 s,mn,mx:real;
 f1,f2:Text;
 B:boolean;

function Pl(x1,y1,x2,y2,x3,y3:integer):real;
begin
 Pl:=abs((x1-x3)*(y2-y3)-(x2-x3)*(y1-y3))/2;
end;

Begin
 clrscr;
 randomize;
 repeat
  write('Number of points exceeding 3, N = ');
  readln(N);
 until N>2;
 assign(f1,'D:\inp.txt');
 repeat
  rewrite(f1);
  for i:=1 to 3 do
  begin
    x:=-100+random(201);
    y:=-100+random(201);
    writeln(f1,x:4,y:14);
  end;
  close(f1);
  reset(f1);
  readln(f1,x_1,y_1);
  readln(f1,x_2,y_2);
  readln(f1,x_3,y_3);
  s:=Pl(x_1,y_1,x_2,y_2,x_3,y_3);
  mx:=s;
  mn:=s;
 until s>Eps;
 close(f1);
 assign(f2,'D:\out.txt');
 rewrite(f2);
 writeln(f2,s:12:5);
 i:=3;
 repeat
  x_3:=-100+random(201);
  y_3:=-100+random(201);
  j:=0;
  repeat
  inc(j);
  reset(f1);
  for q:=1 to j-1 do readln(f1);
  readln(f1,x_1,y_1);
  k:=j;
  repeat
    inc(k);
    reset(f1);
    for q:=1 to k-1 do readln(f1);
    readln(f1,x_2,y_2);
    s:=Pl(x_1,y_1,x_2,y_2,x_3,y_3);
    B:=(s<Eps);
    writeln(f2,s:12:5);
    if Not(B) then
    begin
      if s<mn then
      begin
        x1mn:=x_1;
        y1mn:=y_1;
        x2mn:=y_2;
        y2mn:=y_2;
        x3mn:=x_3;
        y3mn:=y_3;
        mn:=s;
      end;
      if s>mx then
      begin
        x1mx:=x_1;
        y1mx:=y_1;
        x2mx:=y_2;
        y2mx:=y_2;
        x3mx:=x_3;
        y3mx:=y_3;
        mx:=s;
      end;
    end;
  until B or (k=i);
  until B or (j=i-1);
 if Not(B) then
  begin
  inc(i);
  close(f1);
  append(f1);
  writeln(f1,x_3:4,y_3:14);
  writeln(f2,s:12:5);
  close(f1);
  end;
 until i=N;
 writeln(f2);
 writeln(f2,'Minimal square triange:');
 writeln(f2,'(',x1mn:3,',',y1mn:3,')');
 writeln(f2,'(',x2mn:3,',',y2mn:3,')');
 writeln(f2,'(',x3mn:3,',',y3mn:3,')');
 writeln(f2,'Square = ',mn:0:2);
 writeln(f2);
 writeln(f2,'Maximal square triangle:');
 writeln(f2,'(',x1mx:3,',',y1mx:3,')');
 writeln(f2,'(',x2mx:3,',',y2mx:3,')');
 writeln(f2,'(',x3mx:3,',',y3mx:3,')');
 writeln(f2,'Square = ',mx:0:2);
 close(f2);
End.


Asya_inter 25.08.2015 17:19

Vladimir_S, большое спасибо - теперь понятно как это делается!


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

Powered by vBulletin® Version 4.5.3
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.