![]() |
|
|
Регистрация | << Правила форума >> | 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; Все файлы программы прикреплены. Если кто то знает как это реализовать или же у кого то в голове есть свежие интересные идеи на этот счёт, прошу Вас подскажите. Благодарю за внимание. If you're afraid to fail - you'll keep failing forever. Последний раз редактировалось Brain Fucker, 01.04.2012 в 23:48. |
#2
|
||||
|
||||
![]() И Вы хотите сказать, что этот код у Вас компилировался?
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#3
|
||||
|
||||
![]() Цитата:
If you're afraid to fail - you'll keep failing forever. |
#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; Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#5
|
||||
|
||||
![]() Цитата:
именно об этом я и говорил, именно в этом помощь мне и нужна, если удалить эту чущь - то программа компилируется =) Всё что в этом проекте собрано я обирал сам и насколько позволяют мои навыки вникал. Хочу заметить, что не ставлю своей целью кого либо обмануть или показать себя умнее чем являюсь, совершенно согласен что я полнейший нуб в программировании и именно по этому я прошу помощи. If you're afraid to fail - you'll keep failing forever. Последний раз редактировалось Brain Fucker, 02.04.2012 в 00:43. |
#6
|
||||
|
||||
![]() Для начала, выложите архив с рабочим (собираемым) кодом, а не эту муру. Править ваши недоделки мало кому интересно.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#7
|
||||
|
||||
![]() Цитата:
Извиняюсь за неудобства. К сожалению или к радости, но если бы моя программа была полностью рабочей я бы не стал её сюда выкладывать вовсе. Выложил компилирующийся вариант, который зависает по вполне понятной ошибке (ищет текстовое значение в численном массиве). Надеюсь Вы сможете мне подсказать как мне реализовать поиск в массиве. Работаю над вкладкой Graf values, вкладка Relations пока не нужна. If you're afraid to fail - you'll keep failing forever. Последний раз редактировалось 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; Читаем вторую строку, а там: Цитата:
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо 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. Очень надеюсь на подсказку, в чём моя ошибка. If you're afraid to fail - you'll keep failing forever. |
#11
|
||||
|
||||
![]() Цитата:
Должен выполняться алгоритм рассчитывающий возможный и найкратчайший маршрут If you're afraid to fail - you'll keep failing forever. |
#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; Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо 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; If you're afraid to fail - you'll keep failing forever. |
#14
|
||||
|
||||
![]() Вы считываете в TempStr :
Код:
10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 10000 Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
Этот пользователь сказал Спасибо 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', подскажите как обозначить перенос строки в таком коде или может я где то ещё напутал ? If you're afraid to fail - you'll keep failing forever. |