感谢《[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]                k:=n;  //就把在本次循环中,本次比较的较大元素的列标值赋给k,
                     //直到循环结束在本行中找到的最大值数组元素的列标最终赋值给k
        for j:=1 to 3 do  ////嵌套型内循环二:从第1行到第3行
            if arr34[j,k]               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]                k:=n;  //就把在本次循环中,本次比较的较大元素的列标值赋给k,
                     //直到循环结束在本行中找到的最大值数组元素的列标最终赋值给k
        for j:=1 to 3 do  ////嵌套型内循环二:从第1行到第3行
            if arr34[j,k]               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.