выкладываю то,что у меня получилось. делала на Delphi... если нужно,могу создать аналогичную тему в соответсвующем разделе.
очень большая просьба посмотреть то,что у меня получилось... там есть ошибка плана компилирования в delphi и я не знаю,как ее исправить(( посмотрите,пожалуйста... в архиве есть и файл для тестирования... на мой взгляд,вроде всё логично...проверьте,пожалуйста... исправьте или укажите на ошибку там,где считаете нужным....
Чтобы программа компилировалась, нужно добавить один End, ты его упустила...
procedure TForm1.N5Click(Sender: TObject); var popal,max,xp,x1,x2,x3,x1_max,x2_max,x3_max,i:byte; begin max:=0; x1_max:=1; x2_max:=2; x3_max:=3; for x1:=1 to kol-2 do for x2:=x1+1 to kol-1 do for x3:=x2+1 to kol do begin popal:=0; for xp:=1 to kol do if posession(xp,x1,x2,x3)=true then inc(popal);
// Проверку на максимум надо бы делать ВНУТРИ циклов ... if popal>max then begin max:=popal; x1_max:=x1; x2_max:=x2; x3_max:=x3; end; end;
// Начальное значение I присвой, и изменение добавь в конце цикла while i<>kol do begin if i=x1_max then begin x1_res:=point[i].x; y1_res:=point[i].y; end; if i=x2_max then begin x2_res:=point[i].x; y2_res:=point[i].y; end; if i=x3_max then begin x3_res:=point[i].x; y3_res:=point[i].y; end; end; // <--- Вот этого End-а не было у тебя ... end;
Проверь, у меня нет кириллицы, а все переделывать на транслит неохота... Должно работать.
и еще у меня что-то не то с процедурой удаления (ради которой я ,собственно,и сделала считывание из файла в список)
//ввод-правка-удаление procedure TForm1.N7Click(Sender: TObject); begin Label3.Caption:='Введите номер точки'; edit.Visible:=false; del.Visible:=true; add.Visible:=false; end;
procedure TForm1.delClick(Sender: TObject); var ne:byte; t:t_ptr; begin ne:=strtoint(n_edit.Text);
pos := first; {ищем в списке точку с нужным номером} while (pos<>nil) and (ne>0) do begin dec(ne); if ne=0 then begin t:=pos^.next; pos^.next:=t^.next; dispose(t); end else pos := pos^.next; end; {сохраняем в файл} if SaveDialog1.Execute then assignfile(f,SaveDialog1.FileName); rewrite(f); pos := first; while pos<>nil do begin writeln(f,pos^.infx:8:2,pos^.infy:8:2); pos:=pos^.next; end; closefile(f);
я понимаю,что я вас уже достала...( но я очень надеюсь на вашу помощь...
вот еще проблема вылезла... здесь я пытаюсь добавить еще один элемент... но не получается...может лучше через список?
procedure TForm1.addClick(Sender: TObject); var i:byte; xe,ye:real; begin xe:=strtofloat(x_edit.Text); ye:=strtofloat(y_edit.Text); inc(kol); point[kol].x:=xe; point[kol].y:=ye;
{сохраняем в файл} if SaveDialog1.Execute then assignfile(f,SaveDialog1.FileName); rewrite(f); i:=1; while i<kol do begin writeln(f,point[i].x:8:2,point[i].y:8:2); inc(i); end; closefile(f); end;
с удалением и изменением я разобралась. только вот точки треугольника находятся явно неправильно.
что-то не то либо в процедуре поиска точек нужного координат:
var popal,max,xp,x1,x2,x3,x1_max,x2_max,x3_max,i:byte; begin max:=0; x1_max:=1; x2_max:=2; x3_max:=3; for x1:=1 to kol-2 do {точка 1} for x2:=x1+1 to kol-1 do {точка 2} for x3:=x2+1 to kol do {точка 3} begin popal:=0; for xp:=1 to kol do {перебор всех точек} if posession(xp,x1,x2,x3)=true then inc(popal); if popal>max then begin max:=popal; x1_max:=x1; x2_max:=x2; x3_max:=x3; end; end; i:=1; while i<>kol do begin if i=x1_max then begin x1_res:=point[i].x; y1_res:=point[i].y; end; if i=x2_max then begin x2_res:=point[i].x; y2_res:=point[i].y; end; if i=x3_max then begin x3_res:=point[i].x; y3_res:=point[i].y; end; inc(i); end; end;
либо в проверке условия принадлежности точки треугольнику:
//принадлежность точки треугольнику function posession(x,t1,t2,t3:byte):boolean; begin if square(line(t1,t2),line(t2,t3),line(t3,t1))=square(line(x,t1),line(t1,t2),line(t 2,x))+square(line(x,t2),line(t2,t3),line(t3,x))+square(line(x,t1),line(t1,t3),li ne(t3,x)) then posession:=true else posession:=false; end;
ура)всё получилось...всем большое спасибо за помощь)) плюс ко всему этому я сделала масштабирование рисунка. если нужно,могу выложить конечную версию программы.