Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 12.05.2008, 12:21
Cathrinka Cathrinka вне форума
Прохожий
 
Регистрация: 23.04.2008
Сообщения: 9
Репутация: 10
По умолчанию Проблемы с задачей

Спасибо тем, кто откликнулся на мою первую мольбу о помощи, задачка сдалась только с небольшими изменениями... Очень-очень благодарна!!!! Вот только опять попала, массивы-это явно не моя тема, утонула в ней, две задачки покорились, а эта опять зависла!!!!!! Помогите, пожалуйста!

используя следующий фрагмент программы, найдите наибольшее расстояние d между точками, рассматривая элементы массива М, как координаты точек плоскости:
type точка=array [(x,y)] of real; var M: array [1..40] of точка; d:real
Ответить с цитированием
  #2  
Старый 12.05.2008, 12:59
Ozerich Ozerich вне форума
Новичок
 
Регистрация: 11.04.2008
Адрес: В городе-герой Минск
Сообщения: 69
Репутация: 10
По умолчанию

Волновой алгоритм используй
Ответить с цитированием
  #3  
Старый 12.05.2008, 14:22
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Какой алгоритм???
Тут тупое вычисление расстояний между всеми точками и выбор максимального значения. Расстояние высчитывается по формуле пифагора: d := sqrt(sqr(x1-x2) + sqr(y1-y2));

Дальше перебираешь все точки массива попарно и считаешь расстояние между ними.

Код:
uses math;

var
 i, j : integer;
begin
 d := 0;
 for i := 1 to 39 do
   for j := i+1 to 40 do
     d := max(d,sqrt(sqr(M[i][x]-M[j][x]) + sqr(M[i][y]-M[j][y])));
end;
Ответить с цитированием
  #4  
Старый 12.05.2008, 16:14
Cathrinka Cathrinka вне форума
Прохожий
 
Регистрация: 23.04.2008
Сообщения: 9
Репутация: 10
По умолчанию

Спасибочки за идею, только там еще элемент Delphi надо использовать: StringGrid с двумя строками и 20 столбцами, я потом с его элементами сделать ничего не могу, там столько ошибок выдается: и real не подходит, и элементы введены неправильно...
Ответить с цитированием
  #5  
Старый 12.05.2008, 17:50
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,015
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

За место real используй double.
Не совсем понятно зачем именно такой StringGrid. Даже если вводить через него данные, то все-равно нужно либо 2 столбца и 40 строк, либо 40 столбцов и 2 строки.

вообще, когда писал код думал что это некоторая абстрактная задача, т.к. ни Дельфи, ни Паскаль НЕ ПОНИМАЮТ ИДЕНТИФИКАТОРОВ на русском языке.

для начала я бы постановку задачи переписал следующим образом:
Код:
type
  TDblPoint = record
    x : double;
    y : double;
  end;
 
var
  M : Array [1..40] Of TDblPoint;
  d : double;

Тогда мой код надо немного поменять:

Код:
uses math;

var
 i, j : integer;
begin
 d := 0;
 for i := 1 to 39 do
   for j := i+1 to 40 do
     d := max(d,sqrt(sqr(M[i].x-M[j].x) + sqr(M[i].y-M[j].y)));
end;

И вот это вполне скомпилится и должно работать.
Здесь нет задачи значений для точек. Его как раз можно сделать через StringGrid.

Предполягаем, что в StringGrid 3 колонки (1 фиксированная с названиями кординат - х и у) и 41 строка (1 фиксированая с номерами точек). Тогда считывание значений будет выглядеть так:

Код:
var
  i : integer;
begin
  For i := 1 To 40 Do
    Try
       M[i].x := StrToFloat(StringGrid1.Cells[1,i]);
       M[i].y := StrToFloat(StringGrid1.Cells[2,i]);
    Except
       // Если не удалось конвертировать из строки в число.
       M[i].x := 0;
       M[i].y := 0;
    End;
end;
Ответить с цитированием
  #6  
Старый 13.05.2008, 00:35
Cathrinka Cathrinka вне форума
Прохожий
 
Регистрация: 23.04.2008
Сообщения: 9
Репутация: 10
По умолчанию

Что значит сообщение "ProjectProject1.exe raised exception class EConvertError winh message "is not a valid integer value". Process stopped. Use step or Run to continue.".

Admin: Не стоит выделять жирным/курсивом и т.п. все подряд, и без этого все прекрасно читается.

Последний раз редактировалось Admin, 13.05.2008 в 11:16.
Ответить с цитированием
  #7  
Старый 13.05.2008, 05:44
Аватар для Aristarh Dark
Aristarh Dark Aristarh Dark вне форума
Модератор
 
Регистрация: 07.10.2005
Адрес: Москва
Сообщения: 2,906
Версия Delphi: Delphi XE
Репутация: выкл
По умолчанию

Это значит, что в той строке где ты пыталась преобразовать строковое значение в число с помощью функции StrToInt произошла ошибка т.к. функции было передано неверное значение. На примере кода это выглядит так:
Код:
var
  S:string;
  I:integer;
begin
  S:='123';
  I:=StrToInt(S); //<--- Ошибки нет, конвертация успешна
  S:='123.45';
  I:=StrToInt(S); //<--- EConvertError, по причине того что 123,45 не целое число
end;
Ответить с цитированием
  #8  
Старый 13.05.2008, 12:49
Cathrinka Cathrinka вне форума
Прохожий
 
Регистрация: 23.04.2008
Сообщения: 9
Репутация: 10
По умолчанию

я понимаю, просто не представляю где эта ошибка именно, ведь преобразовать строковое значение real в число можно с помощью функции StrToFloat???

Последний раз редактировалось Cathrinka, 13.05.2008 в 13:11.
Ответить с цитированием
  #9  
Старый 13.05.2008, 13:39
Аватар для SedmoiDemon
SedmoiDemon SedmoiDemon вне форума
Прохожий
 
Регистрация: 11.05.2008
Сообщения: 14
Репутация: 10
По умолчанию

Код:
function realtoint( x: real ): integer;
begin
result:= strtoint( floattostr( round( x ) ) );
end;
может поможет?

Aristarh Dark: Читай в справке как правильно использовать тэги
__________________
Как тьма ищет без солнца свет,
Так свет ищет без мрака тьму...
Как жаль, что весь этот бред
Понятен лишь мне одному...
Ответить с цитированием
  #10  
Старый 13.05.2008, 13:45
Cathrinka Cathrinka вне форума
Прохожий
 
Регистрация: 23.04.2008
Сообщения: 9
Репутация: 10
По умолчанию

эх.... может и поможет... чувствую, что с задачей не расстанусь еще долго....
Ответить с цитированием
  #11  
Старый 13.05.2008, 13:48
Cathrinka Cathrinka вне форума
Прохожий
 
Регистрация: 23.04.2008
Сообщения: 9
Репутация: 10
По умолчанию

Может кто найдет ошибочку: "ProjectProject1.exe raised exception class EConvertError winh message "is not a valid integer value". Process stopped. Use step or Run to continue." Я изменила размеры массива и взяла абциссу в первой строке StringGrid'a, а ординату во второй!
Код:
procedure TForm1.Button1Click(Sender: TObject);
type s=array [(x,y)] of real;
var H: array [1..10] of s;
   d,max:real; i,j:integer;
begin
for i:=1 to n do
for j:=1 to m do
a[i,j]:=StrToFloat(StringGrid1.Cells[j-1,1]);
for i:=1 to n do
for j:=1 to m do
b[i,j]:=StrToFloat(StringGrid1.Cells[j-1,1]);
for i:=1 to n do
for j:=1 to m do
c[i,j]:=StrToFloat(StringGrid1.Cells[j-1,2]);
for i:=1 to n do
for j:=1 to m do
e[i,j]:=StrToFloat(StringGrid1.Cells[j-1,2]);
for j:=1 to m do d:=0;
d:=sqrt(sqr(a[i,j]-b[i,j])+sqr(c[i,j]-e[i,j]));
 for i:=1 to n do
 begin
 max:=0;
 for j:=1 to m do
 if d>max then max:=d;
 end;
ShowMessage('расстояние=' +FloatToStr(max));
end;

end.

Aristarh Dark: Используй тэги. Второе замечание в одной теме, еще раз - бан на неделю
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

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

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter