![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Взываю к вашей помощи Боги кодирования и новички!
В общем и целом сложных вопросов у меня нет, застопорился на мелочах в программе основой которой служит алгоритм величайшего кодера Дейкстры. Вот код: Код:
procedure TForm1.Button1Click(Sender: TObject);
var
f: textfile;
temp, i, j: integer;
tempstr: string;
begin
assignfile(f, 'Valuesmatrix.txt');
reset(f);
readln(f, temp);
GrafVal.colcount := temp;
readln(f, temp);
GrafVal.rowcount := temp;
for i := 0 to GrafVal.colcount -1 do
for j := 0 to GrafVal.rowcount -1 do
begin
readln(F, tempstr);
GrafVal.cells[i, j] := tempstr;
end;
closefile(f);
end;
Код:
procedure InitialConditions; //Начальные условия
var f: text;
i, j: integer;
begin
Assign(f, 'Valuesmatrix.txt');
Reset(f);
for i:=1 to n do
begin
for j:=1 to n do
Read(f, GrafVal[i,j])
end;
//Ввод завешён
start:=strtoint(Form2.Edit1.text);
For i:=1 to n do
Begin
done[i]:=False; //Все вершины не просмотрены
Ves_verhin[i]:=GrafVal[Start, i]; //Смотри строку #start
N_pred_versh[i]:=Start
End;
N_pred_versh[Start]:=0;
done[Start]:=True
End;
Function Possible: Boolean; //Возможность
Var i: integer;
Begin
Possible:=True;
For i:=1 to n do If not done[i] then Exit; //если вершина не рассмотрена, то possible = true
Possible:=False //если вершина рассмотрена, то possible = false
End;
Function Min: Integer; //# min вершины
Var i, MinVes, CurrentMin: integer; // текущий min
Begin
MinVes:=Infinity; //бесконечность
For i:=1 to n do
If not done[i] then //если не рассмотрена, то
If Ves_verhin[i]<MinVes then
Begin
CurrentMin:=i; //текущий min = vershina #i
MinVes:=Ves_verhin[i]
End;
min:=CurrentMin
End;
procedure TForm2.Button1Click(Sender: TObject);
begin
if Form2.Edit1.text:= 'A' then start:=GrafVal(1);
if Form2.Edit1.text:= 'B' then start:=(i[2],j[2]);
if Form2.Edit1.text:= 'C' then start:=(i[3],j[3]);
if Form2.Edit1.text:= 'D' then start:=(i[4],j[4]);
if Form2.Edit1.text:= 'E' then start:=(i[5],j[5]);
if Form2.Edit1.text:= 'F' then start:=(i[6],j[6]);
if Form2.Edit1.text:= 'G' then start:=(i[7],j[7]);
if Form2.Edit1.text:= 'H' then start:=(i[8],j[8]);
if Form2.Edit1.text:= 'I' then start:=(i[9],j[9]);
if Form2.Edit1.text:= 'J' then start:=(i[10],j[10]);
if Form2.Edit1.text:= 'K' then start:=(i[11],j[11]);
end;
Begin
InitialConditions;
While Possible do //пока вершина не рассмотрена делать:
Begin
last:=min; //LAST - последняя рассмотренная вершина
done[last]:=True; //вершина last рассмотрена
For i:=1 to n do
If Ves_verhin[i]>Ves_verhin[last]+GrafVal[i, last] then
Begin
Ves_verhin[i]:=Ves_verhin[last]+GrafVal[i, last];
N_pred_versh[i]:=last
End
End;
Finish:=strtoint(Edit2.text);
Label3.Caption:=inttostr(Finish);
Finish:=N_pred_versh[Finish];
Label7.Caption:=IntToStr(Ves_verhin[Finish]);
While Finish<>0 do
Begin
Label3.Caption:=Label3.Caption+'<-'+ inttostr(Finish);
Finish:=N_pred_versh[Finish];
End;
End;Все файлы программы прикреплены. Если кто то знает как это реализовать или же у кого то в голове есть свежие интересные идеи на этот счёт, прошу Вас подскажите. Благодарю за внимание. Последний раз редактировалось Brain Fucker, 01.04.2012 в 23:48. |
|
#2
|
||||
|
||||
|
И Вы хотите сказать, что этот код у Вас компилировался?
|
|
#3
|
||||
|
||||
|
Цитата:
|
|
#4
|
||||
|
||||
|
Не знаю, что у Вас компилировалось, но, то что находится в архиве, в принципе не может быть скомпилировано по причине массы ошибок.
Вот это никогда не пройдёт: Код:
procedure TForm2.Button1Click(Sender: TObject);
begin
if Form2.Edit1.text:= 'A' then start:=GrafVal(1);
if Form2.Edit1.text:= 'B' then start:=(i[2],j[2]);
if Form2.Edit1.text:= 'C' then start:=(i[3],j[3]);
if Form2.Edit1.text:= 'D' then start:=(i[4],j[4]);
if Form2.Edit1.text:= 'E' then start:=(i[5],j[5]);
if Form2.Edit1.text:= 'F' then start:=(i[6],j[6]);
if Form2.Edit1.text:= 'G' then start:=(i[7],j[7]);
if Form2.Edit1.text:= 'H' then start:=(i[8],j[8]);
if Form2.Edit1.text:= 'I' then start:=(i[9],j[9]);
if Form2.Edit1.text:= 'J' then start:=(i[10],j[10]);
if Form2.Edit1.text:= 'K' then start:=(i[11],j[11]);
end; |
|
#5
|
||||
|
||||
|
Цитата:
именно об этом я и говорил, именно в этом помощь мне и нужна, если удалить эту чущь - то программа компилируется =) Всё что в этом проекте собрано я обирал сам и насколько позволяют мои навыки вникал. Хочу заметить, что не ставлю своей целью кого либо обмануть или показать себя умнее чем являюсь, совершенно согласен что я полнейший нуб в программировании и именно по этому я прошу помощи. Последний раз редактировалось Brain Fucker, 02.04.2012 в 00:43. |
|
#6
|
||||
|
||||
|
Для начала, выложите архив с рабочим (собираемым) кодом, а не эту муру. Править ваши недоделки мало кому интересно.
|
|
#7
|
||||
|
||||
|
Цитата:
Извиняюсь за неудобства. К сожалению или к радости, но если бы моя программа была полностью рабочей я бы не стал её сюда выкладывать вовсе. Выложил компилирующийся вариант, который зависает по вполне понятной ошибке (ищет текстовое значение в численном массиве). Надеюсь Вы сможете мне подсказать как мне реализовать поиск в массиве. Работаю над вкладкой Graf values, вкладка Relations пока не нужна. Последний раз редактировалось Brain Fucker, 02.04.2012 в 00:56. |
|
#8
|
||||
|
||||
|
Смотрим ValuesMatrix:
Цитата:
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
F : TextFile;
Temp,
I, J : Integer;
TempStr : String;
begin
AssignFile(F, 'Valuesmatrix.txt');
Reset(F);
ReadLn(F, Temp);
GrafVal.ColCount := Temp;
ReadLn(F, Temp);
GrafVal.RowCount := temp;
for I := 0 to GrafVal.ColCount - 1 do
for j := 0 to GrafVal.RowCount - 1 do
begin
ReadLn(F, TempStr);
GrafVal.Cells[I, J] := TempStr;
end;
CloseFile(F);
end;Читаем вторую строку, а там: Цитата:
|
| Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
Brain Fucker (05.04.2012)
| ||
|
#9
|
|||
|
|||
|
И что же Вы всё таки имели ввиду, когда писали TForm2.Button1Click?
Что там должно, по Вашему, делаться? |
| Этот пользователь сказал Спасибо icWasya за это полезное сообщение: | ||
Brain Fucker (05.04.2012)
| ||
|
#10
|
||||
|
||||
|
Цитата:
Честно говоря, я предполагал что Код:
assignfile(f, 'Valuesmatrix.txt'); reset(f); readln(f, temp); GrafVal.colcount := temp; readln(f, temp); GrafVal.rowcount := temp; вот в этой части кода выставляется размерность StringGrid. Очень надеюсь на подсказку, в чём моя ошибка. |
|
#11
|
||||
|
||||
|
Цитата:
Должен выполняться алгоритм рассчитывающий возможный и найкратчайший маршрут |
|
#12
|
||||
|
||||
|
Цитата:
Код:
AssignFile(F, 'Valuesmatrix.txt');
try
Rewrite(F);
WriteLn(F, GrafVal.ColCount);
WriteLn(F, GrafVal.RowCount);
for Row := 0 to GrafVal.RowCount - 1 do
for Col := 0 to GrafVal.ColCount - 1 do
WriteLn(F, GrafVal.cells[Col, Row]);
finally
CloseFile(F);
end; |
| Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
Brain Fucker (05.04.2012)
| ||
|
#13
|
||||
|
||||
|
Цитата:
Спасибо, действительно глупая ошибка. Следующая, наверное, не умнее, но я не вижу её в упор. При чтении из файла заполняет только первый ряд. Код:
begin
assignfile(f, 'Valuesmatrix.txt');
reset(f);
readln(f, temp);
GrafVal.rowcount := temp;
readln(f, temp);
GrafVal.colcount := temp;
for i := 1 to GrafVal.colcount -1 do
for j := 1 to GrafVal.rowcount -1 do
begin
readln(F, tempstr);
GrafVal.cells[i, j] := tempstr;
end;
closefile(f);
end;
|
|
#14
|
||||
|
||||
|
Вы считываете в TempStr :
Код:
10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 |
| Этот пользователь сказал Спасибо angvelem за это полезное сообщение: | ||
Brain Fucker (05.04.2012)
| ||
|
#15
|
||||
|
||||
|
Цитата:
попытался решить проблему так: Код:
var k,s,n:TStringList;i,j:integer;
begin
s:=TStringList.Create;k:=TStringList.Create;
k.LoadFromFile('Valuesmatrix.txt');
s.Delimiter:=' ';
n.Delimiter:='#13#10';
GrafVal.Rows[i].Delimiter:=s.Delimiter;
GrafVal.RowCount:=12;
GrafVal.ColCount:=12;
for i:=1 to k.Count-1 do
for j:=1 to k.Count-1 do
begin
s.DelimitedText:=k[i];
GrafVal.Rows[i].DelimitedText:=s.DelimitedText;
GrafVal.Cols[j].DelimitedText:=n.DelimitedText;
end;
s.free;k.Free;n.Free;
end;не проходит разделитель '#13#10', подскажите как обозначить перенос строки в таком коде или может я где то ещё напутал ? |