|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Проблемы с задачей
Спасибо тем, кто откликнулся на мою первую мольбу о помощи, задачка сдалась только с небольшими изменениями... Очень-очень благодарна!!!! Вот только опять попала, массивы-это явно не моя тема, утонула в ней, две задачки покорились, а эта опять зависла!!!!!! Помогите, пожалуйста! используя следующий фрагмент программы, найдите наибольшее расстояние d между точками, рассматривая элементы массива М, как координаты точек плоскости: type точка=array [(x,y)] of real; var M: array [1..40] of точка; d:real |
#2
|
|||
|
|||
Волновой алгоритм используй
|
#3
|
|||
|
|||
Какой алгоритм???
Тут тупое вычисление расстояний между всеми точками и выбор максимального значения. Расстояние высчитывается по формуле пифагора: 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
|
|||
|
|||
Спасибочки за идею, только там еще элемент Delphi надо использовать: StringGrid с двумя строками и 20 столбцами, я потом с его элементами сделать ничего не могу, там столько ошибок выдается: и real не подходит, и элементы введены неправильно...
|
#5
|
|||
|
|||
За место 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
|
|||
|
|||
Что значит сообщение "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
|
||||
|
||||
Это значит, что в той строке где ты пыталась преобразовать строковое значение в число с помощью функции StrToInt произошла ошибка т.к. функции было передано неверное значение. На примере кода это выглядит так:
Код:
var S:string; I:integer; begin S:='123'; I:=StrToInt(S); //<--- Ошибки нет, конвертация успешна S:='123.45'; I:=StrToInt(S); //<--- EConvertError, по причине того что 123,45 не целое число end; |
#8
|
|||
|
|||
я понимаю, просто не представляю где эта ошибка именно, ведь преобразовать строковое значение real в число можно с помощью функции StrToFloat???
Последний раз редактировалось Cathrinka, 13.05.2008 в 13:11. |
#9
|
||||
|
||||
Код:
function realtoint( x: real ): integer; begin result:= strtoint( floattostr( round( x ) ) ); end; Aristarh Dark: Читай в справке как правильно использовать тэги Как тьма ищет без солнца свет, Так свет ищет без мрака тьму... Как жаль, что весь этот бред Понятен лишь мне одному... |
#10
|
|||
|
|||
эх.... может и поможет... чувствую, что с задачей не расстанусь еще долго....
|
#11
|
|||
|
|||
Может кто найдет ошибочку: "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: Используй тэги. Второе замечание в одной теме, еще раз - бан на неделю |