⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit_gz_bus.~pas

📁 广州公交车查询程序
💻 ~PAS
字号:
unit Unit_GZ_BUS;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  TFlatButtonUnit, StdCtrls, TFlatEditUnit, TFlatHintUnit, ExtCtrls,
  TFlatPanelUnit, TFlatGroupBoxUnit, TFlatTitlebarUnit,
  TFlatSpeedButtonUnit, TFlatCheckBoxUnit, TFlatRadioButtonUnit, Mask,
  TFlatMaskEditUnit, TFlatSpinEditUnit, TFlatMemoUnit, TFlatProgressBarUnit;

const BusNumMAX=30;
      SearchResultMax=30;
type
  BUSType=record
    BusID:String;
    Num:Byte;
    ZH:array [1..BusNumMAX] of string;
  end;
  SearchResultType=array[1..SearchResultMax] of
    record
      BusIndex,ZHIndex:integer
    end;
  SearchNonstopType=array[1..SearchResultMax] of
    record
      BusIndex,Start,Over:integer
    end;
  SearchTurntType=array[1..SearchResultMax] of
    record
      FromBus,FromStart,FromOver:integer;
      GoalBus,GoalStart,GoalOver:integer;
    end;
  SearchThriceType=array[1..SearchResultMax] of
    record
      FromBus,FromStart,FromOver:integer;
      TrainsBus,TrainsStart,TrainsOver:integer;
      GoalBus,GoalStart,GoalOver:integer;
    end;

type
  TForm1 = class(TForm)
    FlatPanel1: TFlatPanel;
    FlatEdit1: TFlatEdit;
    FlatEdit2: TFlatEdit;
    Label1: TLabel;
    Label2: TLabel;
    FlatButton1: TFlatButton;
    FlatButton2: TFlatButton;
    FlatEdit3: TFlatEdit;
    Label3: TLabel;
    OpenDialog1: TOpenDialog;
    FlatButton3: TFlatButton;
    FlatButton4: TFlatButton;
    FlatButton5: TFlatButton;
    FlatEdit4: TFlatEdit;
    FlatButton6: TFlatButton;
    FlatMemo1: TFlatMemo;
    FlatMemo2: TFlatMemo;
    procedure FlatButton3Click(Sender: TObject);
    procedure FlatButton5Click(Sender: TObject);
    procedure FlatButton4Click(Sender: TObject);
    procedure FlatButton6Click(Sender: TObject);
    procedure FlatButton1Click(Sender: TObject);
    procedure FlatButton2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const strDiv=',';
      strOver=';';
var
  Form1: TForm1;
  Bus:array [1..500] of BUSTYPE;
  BusNumber:Integer=0;

implementation

{$R *.DFM}

//procedure ShowBusOne(BusIndex:integer; LightOne:integer=0; LightTwo:integer=0);
procedure ShowBusOne(SROK:SearchNonstopType; SROKNum:integer);
Var t:string;
    h,i:integer;
begin
  for h:=1 to SROKNum do
  begin
    with Bus[SROK[h].BusIndex] do
    begin
      t:='第 '+BusID+' 路车  ';
      for i:=1 to Num do   t:=t+ZH[i]+' , ';
      Form1.FlatMemo2.Lines.Add(t);
    end;
  end;
  Form1.FlatMemo2.Lines.Add('');
end;

procedure ShowBusTwo(SROK:SearchTurntType; SROKNum:integer);
Var t:string;
    h,i:integer;
begin
  for h:=1 to SROKNum do
  begin
    with Bus[SROK[h].FromBus] do
    begin
      t:='第 '+BusID+' 路车  ';
      for i:=1 to Num do   t:=t+ZH[i]+' , ';
      Form1.FlatMemo2.Lines.Add(t);
    end;
    with Bus[SROK[h].GoalBus] do
    begin
      t:='转第 '+BusID+' 路车  ';
      for i:=1 to Num do   t:=t+ZH[i]+' , ';
      Form1.FlatMemo2.Lines.Add(t);

      t:='中转站名:'+ZH[SROK[h].GoalStart];
      Form1.FlatMemo2.Lines.Add(t);
    end;
    Form1.FlatMemo2.Lines.Add('');
  end;
  Form1.FlatMemo2.Lines.Add('');
  
end;

function Explode(Var target:String):String;
var h:integer;    temp:String;
begin
  h:=pos(strDiv,target);
  if h>0 then
   begin
    temp:=copy(target,1,h-1);
    delete(target,1,h);
    Explode:=temp;
   end
  else
   begin
    h:=pos(strOver,target);
    if h>0 then
     begin
      temp:=copy(target,1,h-1);
      delete(target,1,Length(target));
      Explode:=temp;
     end;
   end;
end;

procedure ExplodeBus(target:String; Var B:BusType);
var h:integer;
    T:array [1..BusNumMAX] of string;
begin
   B.BusID:=Explode(target);
   Form1.FlatMemo1.Lines.Add(B.BusID);
   h:=1;
   Repeat
     T[h]:=Explode(target);
//     Form1.FlatMemo1.Lines.Add(t[h]);
     Inc(h);
   until target='';
   B.Num:=h-1;
   for h:=1 to B.Num do  B.ZH[h]:=T[h];
end;


procedure Bus_Init;
var fp:TEXT;
    Temp:String;
    h:integer;
begin
  fillchar(Bus,sizeof(Bus),0);
  assign(fp,Form1.FlatEdit3.Text);
  reset(fp);
  h:=1;
  Repeat
    Readln(fp,Temp);
    if Temp<>'' then
    begin
      ExplodeBus(Temp,BUS[h]);
      Inc(h);
    end;
  Until Eof(fp) or (h>500);
  BusNumber:=h-1;
  close(fp);
end;

//搜索给定的 第BusIndex路车 是否有一站名为s ,返回ZHindex为第几站
function  SearchZHOne(s:string; BusIndex:integer; var ZHIndex:integer):Boolean;
var i:integer;
begin
  SearchZHOne:=False;    ZHIndex:=0;
  for i:=1 to Bus[BusIndex].Num do
  begin
    if Bus[BusIndex].ZH[i]=s then
    begin
      ZHIndex:=i;
      SearchZHOne:=True;
    end;
  end;
end;

//搜索所有包含 站名为 S 的线路
procedure SearchZHAll(s:string; var SR:SearchResultType; var SearchResultNumber:integer);
var h,i,p:integer;
begin
  fillchar(SR,sizeof(SR),0);
  p:=1;
  for h:=1 to BusNumber do
  begin
    for i:=1 to Bus[h].Num do
    begin
      if Bus[h].ZH[i]=s then
      begin
        SR[p].BusIndex:=h;     //第几路车
        SR[p].ZHIndex:=i;      //第几站
        Inc(p);
      end;
    end;
  end;
  SearchResultNumber:=p-1;
end;

//搜索直达班次
Function SearchNonstopBus(inner,outter:String; var SROK:SearchNonstopType; var SROKNum:integer):Boolean;
var SR:SearchResultType;     SRNum:integer;
    h,j,p:integer;
begin
   SearchNonstopBus:=False;
   fillchar(SROK,sizeof(SROK),0);   SROKNum:=0;  p:=1;
   SearchZHAll(inner,SR,SRNum);
   for h:=1 to SRNum do
   begin
     if SearchZHOne(outter,SR[h].BusIndex,j) then
     begin
       SROK[p].BusIndex := SR[h].BusIndex;
       SROK[p].Start    := SR[h].ZHIndex;
       SROK[p].Over     := j;
       Inc(p);
     end;
   end;
   SROKNum:=p-1;
   if SROKNum>0 then SearchNonstopBus:=True;
end;

//搜索换乘一次,
Function SearchTurntBus(inner,outter:String; var SROK:SearchTurntType; var SROKNum:integer):Boolean;
var SR:SearchResultType;     SRNum:integer;
    SRN:SearchNonstopType;  SRNNum:integer;
    h,i,j,k,p:integer;
begin
   SearchTurntBus:=False;
   fillchar(SROK,sizeof(SROK),0);   SROKNum:=0;
   SearchZHAll(inner,SR,SRNum);

   for h:=1 to SRNum do   //总共有多少路车包含有出发站
   begin
     /////////////////////////////////////////
     ///★★★★★
     ///for i:=1 to Bus[SR[h].BusIndex].Num
     k:=SR[h].BusIndex;
     p:=Bus[k].Num;
     for i:=3 to p do             ///以该路车的每一站为inner,搜索直达路线
     if SearchNonstopBus(Bus[k].ZH[i],outter,SRN,SRNNum) then
     begin
       SROKNum := SROKNum + SRNNum;
       for j:=1 to SRNNum do
         with SROK[SROKNum] do
         begin
           FromBus   := k;
           FromStart := SR[h].ZHIndex;
           FromOver  := i;
           GoalBus   := SRN[j].BusIndex;
           GoalStart := SRN[j].Start;
           GoalOver  := SRN[j].Over;
         end;
     end;

   end;


  if SROKNum>0 then SearchTurntBus:=True;
end;

procedure SearchBus(inner,outter:String);
//var h,i,j:integer;
begin


end;


procedure TForm1.FlatButton3Click(Sender: TObject);
begin
  OpenDialog1.Execute;
  if OpenDialog1.FileName<>'' then
    FlatEdit3.Text:=OpenDialog1.FileName;
end;

procedure TForm1.FlatButton5Click(Sender: TObject);
begin
  Bus_Init;
end;

procedure TForm1.FlatButton4Click(Sender: TObject);
begin
  Close;
end;

procedure TForm1.FlatButton6Click(Sender: TObject);
var i:integer;
begin
  FlatMemo1.Clear;
  with Bus[StrToInt(FlatEdit4.Text)] do
  begin
    FlatMemo1.Lines.Add('BusID: '+BusID);
    for i:=1 to Num do  FlatMemo1.Lines.Add(ZH[i]);
    FlatMemo1.Lines.Add('Total: '+InttoStr(Num));
  end;
end;

procedure TForm1.FlatButton1Click(Sender: TObject);
var SROK:SearchNonstopType;
    SROKNum:integer;
begin
  if SearchNonstopBus(FlatEdit1.Text,FlatEdit2.Text,SROK,SROKNum)
  then   ShowBusOne(SROK,SROKNum);

end;

procedure TForm1.FlatButton2Click(Sender: TObject);
var SROK:SearchTurntType;
    SROKNum:integer;
begin
 if SearchTurntBus(FlatEdit1.Text,FlatEdit2.Text,SROK,SROKNum)
 then   ShowBusTwo(SROK,SROKNum);

end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -