感谢《[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.