![]() |
|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
![]() Помогите написать скрипт. Объясню, что именно мне нужно получить.
Есть некая база городов. Расстояние между ними известно. Есть два раскрывающихся списка. Открываешь первый список и выбираешь город. Открываешь второй список и выбираешь город. Нажмаешь кнопку "Рассчитать" и расстояние показывается в label1=) Думаю это элементарно, но я уже все забыл и прошу помощи в решении этой простой задачки. Спасибо. |
#2
|
||||
|
||||
![]() Ну как известно из города А в город Я можно попасть разными путями.
Нужно собирать действующий граф из тех городов, которые лежат между А и Я. И смотреть расстояние (я так понимаю наименьшее) А если решать задачу, сидя на цистерне с бензином, то выглядеть это будет простым циклическим перебором всех городов. Только есть вероятность приехать в город-тупик, который не связан с другими. |
#3
|
||||
|
||||
![]() label1.caption := StrToFloat(ComboBox2.text) - StrToFloat(ComboBox1.text);
Как ты сам не мог додуматся? |
#4
|
||||
|
||||
![]() FacePalm.
Ответом будет являться ошибка: Код:
E2010 Incompatible types: 'string' and 'Extended' Но даже если: Код:
Caption := FloatToStr(StrToFloat(ComboBox1.Text) - StrToFloat(ComboBox2.Text)); Код:
First chance exception at $75AC812F. message ''СаратовМосква' is not a valid floating point value'. Код:
StrToFloatDef(string,default_value); Читайте внимательнее задачи =\ Последний раз редактировалось Uniq!, 24.09.2013 в 12:26. |
#5
|
||||
|
||||
![]() Код:
if (ComboBox1.text = "Масква") then gorod1 := 100; if (ComboBox2.text = "Саратов") then gorod2 := 300; Label1.Caption := IntToStr(gorod2 - gorod1) Так должно работать |
#6
|
|||
|
|||
![]() Как вы представляете себе свой код, когда там будет 50 городов?
|
#7
|
||||
|
||||
![]() Где хранятся данные? и в каком виде?
|
#8
|
||||
|
||||
![]() Код:
if ((ComboBox1.text = "Масква") or (ComboBox2.text = "Масква")) then begin gorod1 := 100; a := 1; end; if ((ComboBox1.text = "Саратов") or (ComboBox2.text = "Саратов")) then begin gorod2 := 300; a := 2; end; if ((ComboBox1.text = "Питер") or (ComboBox2.text = "Питер")) then begin gorod2 := 400; a := 3; end; if (a = 1) then Label1.Caption := IntToStr(gorod2 - gorod1); if (a = 2) then Label1.Caption := IntToStr(gorod3 - gorod2); if (a = 3) then Label1.Caption := IntToStr(gorod4 - gorod3); Ну дальше сами... |
#9
|
||||
|
||||
![]() Цитата:
|
Этот пользователь сказал Спасибо Aristarh Dark за это полезное сообщение: | ||
junk1114 (24.09.2013)
|
#11
|
|||
|
|||
![]() xdessx Жжет=)
Данные думаю хранить в БД SQL, создать таблицу: Первая колонка ID (числовой тип) - id Вторая Колонка city_1 (символьный тип) Третья Колонка city_2 (символьный тип) Четвёртая колонка rast (числовой тип) - расстояние между городами Еще бы сюда каким то образом страну прицепить. Или предложите другую структуру пожалуйста. |
#12
|
||||
|
||||
![]() Код:
var a : variant; a = Table1.LookUp("city_1;city_2",VarArrayof([ComboBox1.text, ComboBox2.text]),"city_1;city_2;rast"); label1.caption := a[3]; Вроде так ![]() |
#13
|
||||
|
||||
![]() Ну базы - это, конечно, круто. Но для графа достаточно и текстового файлика. Сначала названия, дальше - строки по 2 id и расстоянием. Пример:
Цитата:
После читаем про графы, к примеру - алгоритм Дейкстры (см. Гугл и Википедию, там даже гифка-иллюстрация есть). Можно просто из каждой вершины двигаться по всем путям, начиная с кратчайшего, и запоминать длину пути; если зашли в тупик - откат на вершину назад, а если дошли до нужной вершины - это и есть кратчайший путь. Если же есть прямой путь из каждого города в каждый - то просто Код:
select length from table where id1 = index1 and id2 = index2 А еще у нас, похоже, появился новый тролль. И кстати, xdessx, убери ссылку из подписи, а то рискуешь банхаммером получить. Правила форума надо читать. jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 24.09.2013 в 14:34. |