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