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