二維靜態數組的“鞍點”

感謝《[Delphi.7應用教程].童愛紅.文字版.pdf》提供的題目、解題方法及文字源程序!本文作者據此轉換爲Delphi源程序(爲方便愛好者學習,程序界面略有修改,並且源代碼作了註釋,水平有限,若有錯漏,請大家指正! 源程序包請見附件):

題目:二維數組的“鞍點”
    所謂二維數組的“鞍點”是指在本行中最大但在本列中最小的數組元素,有的數組有“鞍點”,有的數組沒有。編程尋找一個從鍵盤上輸入的3 行4 列數組的“鞍點”。

源代碼如下:

unit SL422;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, jpeg, ExtCtrls, StdCtrls;

type
  TForm1 = class(TForm)
    GroupBox1: TGroupBox;
    Image1: TImage;
    GroupBox2: TGroupBox;
    Memo1: TMemo;
    GroupBox3: TGroupBox;
    Button1: TButton;
    Button2: TButton;
    GroupBox4: TGroupBox;
    Memo2: TMemo;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation
var
  Arr34:Array[1..3,1..4] of integer;   //定義單元級二維靜態數組變量arr34

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);     //輸入數組元素按鈕
var m,n:integer;
begin
  Canvas.FillRect(form1.clientRect);  //清除先前產生的隨機數組;
  for m:=1 to 3 do      //嵌套型外循環m:第1行~第3行
    for n:=1 to 4 do      //嵌套型內循環n:第1列~第4列
        begin
          Arr34[m,n]:=StrToInt(InputBox('輸入數賦值給二維數組',
             '輸入第'+IntToStr(m)+'行第'+IntToStr(n)+'個數','0')); //輸入數組元素
             //InputBox()格式:InputBox('標題文本',提示操作文本','默認值')
          Canvas.TextOut(100+70*n,10+25*m,IntToStr(Arr34[m,n]));     //顯示數組元素
            //格式 Canvas.TextOut(列標,行標,'顯示文本內容');,類似Excel單元格名稱 }
        end;
       { 注意: "100+70*n,10+25*m"是Arr34[m,n]先在第1行按順序顯示第1~4列數組元素
                                              再在第2行按順序顯示第1~4列數組元素
                                              後在第3行按順序顯示第1~4列數組元素
          若改成 "100+70*m,10+25*n"會造成行列錯亂:
                                              先在第1行第1列顯示數組元素
                                                在第2行第1列顯示數組元素
                                                ......
                                              再在第1行第2列顯示數組元素
                                                在第2行第2列顯示數組元素
                                                ......
                                              後在第1行第3列顯示數組元素
                                                在第2行第3列顯示數組元素
                                                ......
      //原因: 格式 Canvas.TextOut(列標,行標,'文本顯示內容');,類似Excel單元格名稱 }
end;

procedure TForm1.Button2Click(Sender: TObject);  //顯示鞍點按鈕
var
  m,n,k,j,f:integer;
begin
  for m:=1 to 3 do  //嵌套型外循環,從第1行到第3行
      begin
        f:=1;  //f標記該行是否有鞍點,這裏給f賦初值爲1先假設有鞍點
        k:=1; //這裏給k賦初值爲1先假設本行第1列數組元素是最大值
            //k用來記錄本行中最大值數組元素的列標
        for n:=2 to 4 do //嵌套型內循環一:因循環前預設k:=1,故n:=2 to 4,而不用n:=1 to 4
                      //本行第2~4列各元素先後與第1列元素比較,
            if Arr34[m,k]<Arr34[m,n] then  //若本次循環第m行k列元素值小於同行的第n列元素值
               k:=n;  //就把在本次循環中,本次比較的較大元素的列標值賦給k,
                     //直到循環結束在本行中找到的最大值數組元素的列標最終賦值給k
        for j:=1 to 3 do  ////嵌套型內循環二:從第1行到第3行
            if arr34[j,k]<Arr34[m,k] then  //如果第j行k列的元素值小於第m行同列元素值
              begin
                f:=0;  //本行中最大值元素不是該列最小值,故行沒有鞍點(注意前面假設f:=1)
                break; //終止循環
              end;
        //注意:嵌套型內循環一和//嵌套型內循環二屬於順序結構關係
        if f=1 then  //注意如果沒有這個if語句終止循環,將非常可能顯示 '沒有鞍點'
           break; //因爲如果找到一個鞍點後不終止循環的話,後面的循環可能再找不到鞍點
      end;
  if f=1 then
     Canvas.TextOut(220*k,10*m,'第一個鞍點座標爲('+IntToStr(m)+','+IntToStr(k)+')')
  else
    Canvas.TextOut(220*k,10*m,'沒有鞍點');
    // 格式:Canvas.TextOut(列標,行標,'文本顯示內容');,類似Excel單元格名稱
end;

{ procedure TForm1.Button2Click(Sender: TObject);  //顯示鞍點按鈕 代碼修改
var
  m,n,k,j,f:integer;
  x:integer;
begin
  x:=0;
  for m:=1 to 3 do  //嵌套型外循環,從第1行到第3行
      begin
        f:=1;  //f標記該行是否有鞍點,這裏給f賦初值爲1先假設有鞍點
        k:=1; //這裏給k賦初值爲1先假設本行第1列數組元素是最大值
            //k用來記錄本行中最大值數組元素的列標
        for n:=2 to 4 do //嵌套型內循環一:因循環前預設k:=1,故n:=2 to 4,而不用n:=1 to 4
                      //本行第2~4列各元素先後與第1列元素比較,
            if Arr34[m,k]<Arr34[m,n] then  //若本次循環第m行k列元素值小於同行的第n列元素值
               k:=n;  //就把在本次循環中,本次比較的較大元素的列標值賦給k,
                     //直到循環結束在本行中找到的最大值數組元素的列標最終賦值給k
        for j:=1 to 3 do  ////嵌套型內循環二:從第1行到第3行
            if arr34[j,k]<Arr34[m,k] then  //如果第j行k列的元素值小於第m行同列元素值
              begin
                f:=0;  //本行中最大值元素不是該列最小值,故行沒有鞍點(注意前面假設f:=1)
                break; //終止循環
              end;
        //注意:嵌套型內循環一和//嵌套型內循環二屬於順序結構關係
        if f=1 then
          begin
            x:=x+1;
            Canvas.TextOut(x+10,30*m,'第'+IntToStr(x)+'個鞍點座標爲('+IntToStr(m)+','+IntToStr
(k)+')')
          end
        else
          Canvas.TextOut(x+10,30*m,'第'+IntToStr(m)+'行沒有鞍點');
      end;
end;  }

end.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章