资源描述
5.1 While语句
While语句属于前测型循环结构。首先判断条件,根据条件决定是否执行循环,执行循环的最少次数为0。
其流程图如图所示。
While条件 {条件判断}
循环体 {条件成立时所执行的语句}
5.1.1 While语句的语法
WHILE语句常用在不能预先确定重复次数的情况。
WHILE语句的语法格式:
While <条件> Do
[<循环体>];
说明:
(1) <条件>是一个具有Boolean值的条件表达式,为循环的条件。
(2) <循环体>可以是简单语句、复合语句和其他结构语句。
(3) While循环的执行过程:首先计算<条件>的值,如果<条件>为真(True),则执行Do后面的循环体,执行完后,再开始一个新的循环;如果<条件>为假(False),则终止循环,执行<循环体>后面的语句。
(4) 可以在<循环体>中的任何位置放置Break语句来强制终止While循环——随时跳出While循环。Break语句通常用于If语句之后。
(5) 可以在<循环体>中的位置放置Continue语句,在整个循环体执行完就重新判断<条件>,以决定是否开始新的循环。Continue语句通常用于If语句之后。
语义:
WHILE语句是在循环体执行之前判断重复终止条件:当布尔表达式为false,跳过循环体执行WHILE语句的下一条语句;当布尔表达式值为true时,重复执行循环体,直到布尔表达式的值为false时才终止。一般来说,在循环体内应有修改布尔表达式中的变量的语句。如果布尔表达式的值在开始时就为false,则此循环体中的语句一次也不执行。循环语句中有多个语句时,必须构成复合语句。
WHILE语句逻辑功能如下图:
5.1.2 While语句的应用
【例5-1】求累加和1+2+3+…+100
【例5-2】输入一个正整数,判断是否是素数。
【例5-1】求累加和1+2+3+…+100
分析:采用累加的方法,用变量s来存放累加的和(开始为0),用变量n来存放“加数”(加到s中的数)。这里n又称为计数器,从1开始到100为止。
根据以上分析画出流程图,如图所示。
s ← 0 {累加器赋初值}
n ← 1 {计数器赋初值}
While n <= 100 {当计数器的值不超过100时}
s←s +n {累加}
n← n+1 {计数器增1}
输入 s {输出累加和}
设计步骤如下:
(1)窗体界面的设计
(2)编写按钮OnClick事件代码:
procedure TForm1.Button1Click(Sender: TObject);
var
s,n: Integer;
begin
s:= 0;
n:= 1;
While n<=100 Do
Begin
s:= s+n;
n:= n+1;
End;
Panel2.Caption := '1+2+3+ ... +100 = ' + IntToStr(s);
end;
程序下载
【例5-2】输入一个正整数,判断是否是素数。
分析:所谓“素数”是指除了1和该数本身,不能被任何整数整除的数。判断一个自然数(n≥3)是否素数,只要依次用2--SQRT(2)作除数去除n,若n不能被其中任何一个数整除,则n即为素数,如图所示。
根据以上分析画出流程图,如图所示
输入n
I ← 2, s ← 0
当I <= and s = 0
如果 n 被 l 整除
真
s ← 1
假
I ← I+1
如果s = 0
真
输出: n 是素数
假
输出:n 不是素数
设计步骤如下:
(1)窗体界面的设计
(2)编写代码
按钮Button1的OnClick事件代码:
procedure TForm1.Button1Click(Sender: TObject);
var
N,M,I,s: integer;
F: single;
Begin
for N:=1 to 50 do
begin
M:= 2*N+1;
S:= 0;
I:= 2;
F:= StrToFloat(IntToStr(M));
while (I <= Sqrt(F)) and (S=0) do
begin
If M mod I=0 Then s:= 1
else I:= I+1;
end;
If S=0 then Memo1.Lines.Add(inttostr(M));
end;
end;
为了防止编辑框Edit1输入非法字符,编写Edit1的OnKeyPress事件代码:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
B:Boolean;
begin
B:=(Key<#8)OR(Key>#8)and(Key<#45)or(Key>#46)and(Key<#48)or(Key> #57);
if B then Key:= #0;
end;
另外,编写按钮Button2的OnClick事件代码:
procedure TForm1.Button2Click(Sender: TObject);
begin
Close;
end;
编写窗体的OnActivate事件代码:
procedure TForm1.FormActivate(Sender: TObject);
begin
Edit1.SetFocus;
end;
5.2 Repeat语句
Repeat 语句属于后测型循环结构。首先执行循环体,然后判断条件,根据条件决定是否继续执行循环,因此执行循环的最少次数为1.
其流程图如图所示。
循环体 {条件成立时所重复执行的语句}
Unit1 条件 {条件不成立或成立时}
5.2.1 Repeat语句的语法
Repeat 语句的语法格式为:
Repeat
[<循环体>]
Unit1 <条件>;
说明:
(1) <条件>是一个具有Boolean值的条件表达式,为循环的条件。
(2) <循环体>可以是一条语句,也可以是多条语句。多条语句无须用Begin…End括起来,而由保留字Repeat与Unitl将其括起。
(3) Repeat循环的执行过程:首先执行<循环体>,然后计算<条件>的值,如果<条件>为假(False),则开始一个新的循环;如果<条件>为真(True),则终止循环,执行Unit1 <条件>后面的语句。
(4)可以在〈循环体〉中的任何位置放置Break语句来强制终止循环——随时跳出Repeat循环。Break语句通常用于If语句之后。
(5)可以在循环体中的任何位置放置Continue语句,在整个循环体没有执行完就重新判断〈条件〉,以决定是否开始新的循环。Continue语句通常用于If语句之后。
REPEAT语句的逻辑功能图如下:
5.2.2 Repeat语句的应用
【例5-3】输入有效数字的位数,利用下述公式计算圆周率∏的近似
值:
【例5-4】输入两个正整数,求他们的最大公约数,
【例5-3】输入有效数字的位数,利用下述公式计算圆周率∏的近似
值:
分析:首先找到公式中无穷乘积各项的规律:设第n项的分母为Pn ,则地第n+1项的分母为Pn+1 =Sqrt(2+Pn )。若设前 n项的乘积为Sn,则前n项乘积为Sn+1=2 Sn/ Pn+1 。
据此,画出流程图所示。
输入小数点后有效数字位数k
S ← 2, p ← 0
直到∣t-S∣<0.1
t ← S
p ← Sqrt(2+p)
S←2*S/p
输出圆周率 Pi = S
设计步骤:
(1)应用程序用户界面的建立与属性设置如下图。
(2)、编写程序代码:
根据流程图,可以写出编辑框Edit1的OnKeyPress事件代码为:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
k : integer;
p,t,s,e : Double;
m: string;
begin
if key = #13 then
begin
k:= StrToInt(Edit1.Text);
p:= 0; s:= 2;
e:= Exp(k*Ln(0.1));
repeat
t:= s;
p:= Sqrt(2+p);
s:= s*2/p;
Until Abs(t-s) < e;
m:= Format('%20.18f', [s]);
Edit2.Text:= Copy(m,0,k+2);
Edit1.SelStart:= 0;
Edit1.SelLength:= Length(Edit1.Text);
Edit1.SetFocus;
end;
end;
程序下载
【例5-4】输入两个正整数,求他们的最大公约数,
如图所示。
分析:求最大公约数可以用“辗转相除法”,方法如下:
(1) 以大数m做被除数,小数n做除数,相初后余数为r。
(2) 若r≠0,则m←n,n←r,继续相除得到新的r。若仍有r≠0,则重复此过程,直到r=0为止。
(3) 最后的n就是最大公约数。
根据这个分析画出流程图如下:
输入m, n
大数放入m,小数放入n
直到r = 0
求 m/n 的余数r
m ← n
n ← r
输出 m {输出最大公约数}
(1)应用程序用户界面的建立与属性设置如下图。
(2)、编写程序代码:
按钮Button1的OnClick事件代码:
procedure TForm1.Button1Click(Sender: TObject);
var
M,N,T,R: LongWord;
S1, S2: string;
begin
S1:= InputBox('请输入', '第1个正整数:', '1');
if S1 = '' then S1:= '1';
M:= StrToInt(S1);
S2:= InputBox('请输入', '第2个正整数:', '1');
If S2 = '' then S2:= '1';
N:= StrToInt(S2);
If M <= N then
begin
T:= M; M:= N; N:= T;
end;
Repeat
R:=M mod N;
M:= N;
N:= R;
Until R = 0;
Label1.Caption:= format('%s与%s的最大公约数是:'+#13+#13 + '%d',[S1,S2,M]);
end;
5.3 For语句
在不知道需要执行多少次循环时,应该用While 或Repeat循环。但是,若知道要执行多少次循环时,则最好使用For循环结构。
For循环要使用一个循环变量,每重复一次循环之后,循环变量的值就会自动增加或者减少。
其流程图如图所示。
循环变量 从 初值 到终值 {循环控制器}
循环体 {循环体 }
5.3.1 For语句的语法
For循环语句有两种形式:
For <循环变量>:= <初值> TO <终值> DO <循环体>;
For <循环变量>:= <初值> DOWNTO <终值> DO <循环体>;
说明:
(1) 〈循环变量〉为必要参数,用做循环计数器,只能是顺序类型。
(2) 〈初值〉和<终值>表示〈循环变量〉的初值和终值,可以是表达式,但应与〈循环变量〉的类型相同,若为表达式,则在进入循环之前已被计算确定,在循环体中改变初值或终值表达式中变量的值,并不影响循环的次数。
(3) To表示计数器递增,DownTo表示计数器递减。
(4) 〈循环体〉可以是简单语句,复合语句和其他结构语句。
(5) For循环的执行过程:首先判断循环变量的值是否“超过”终值,若已超过则跳出循环执行〈循环体〉后的语句;若未超过则执行Do后的〈循环体〉,然后循环变量自动增量并开始一个新的循环。
(6) 可以在〈循环体〉中的任何位置放置Break语句来强制终止循环——随时跳出For循环。Break语句通常用于If语句之后。
(7) 可以在循环体中的任何位置放置Continue语句,在整个循环体没有执行完就重新判断〈条件〉,以决定是否开始新的循环。Continue语句通常放于If语句之后。
我们用FOR语句的逻辑功能图来说明TO,DOWNTO的执行步骤。如下图:
5.3.2 For语句的应用
【例5-5】:利用循环显示4000以内所有能被97整除的自然数。
【例5-6】: 斐波那契(Fibonacci)数列问题。
【例5-5】:利用循环显示4000以内所有能被97整除的自然数。
其流程图为:
n从 1 开始 到 4000
如果 n 被 97 整除
真
输出 n
设计步骤:
(1)应用程序用户界面的建立与属性设置如下图。
(2) 程序设计
编写按钮Button1的OnClick事件代码:
procedure TForm1.Button1Click(Sender: TObject);
var
N: integer;
begin
for N:= 1 To 4000 do
If N mod 97 =0 then
Memo1.Lines.Add( IntToStr(N));
end;
另外,编写按钮Button2的OnClick事件代码:
procedure TForm1.Button2Click(Sender: TObject);
begin
Close;
end;
程序下载
【例5-6】: 斐波那契(Fibonacci)数列问题。
Fibonacci数列问题来源于一个古老的有关兔子繁殖的问题:假设在第1个月时有一对小兔子,第2个月时成为大兔子,第3个月时成为老兔子,并生出一对小兔子(一对老,一对小)。
第4个月时成为老兔子又生出一对小兔子,上个月的小兔子变成大兔子(一对老,一对大,一对小)。第5个月时上个月的大兔子变成老兔子,上个月的小兔子变成大兔子,两对老兔子生出两对小兔子(两对老,一对中,两对小)……
这样,各月的兔子对数为:1,1,2,3,5,8,……
这就是Fibonacci数列,其中第n项的计算公式为:
为了避免定义许多的变量,采用“迭代”的算法:即只定义少量的变量,如f1,f2,f3,在每一次的循环计算中它们代表不同的数,不断以新的值来取代原有的值。
其流程图为:
n ← 15
f1 ← 1; f2 ← 1
k 从 3 到 n
f3 ← f1+ f2
输出 f3
f1 ← f2
f2 ← f3
设计步骤:
(1) 应用程序用户界面的建立与属性设置如下图。
(2)、编写程序代码:
按钮Button1的OnClick事件代码:
procedure TForm1.Button1Click(Sender: TObject);
var
K,F1,F2,F3:integer;
begin
Memo1.Lines.Clear;
Memo1.Lines.Add('1 1');
Memo1.Lines.Add('2 1');
F1:= 1;
F2:= 1;
for K:= 3 To 15 do
begin
F3:= F1+F2;
Memo1.Lines.Add(Format('%2d %3d', [K,F3]));
F1:= F2;
F2:= F3;
end;
end;
5.4 循环的嵌套
5.5 列表框和组合框
列表框(ListBox)、组合框(ComboBox)和备注框(Memo)都可用来处理多行文本的输入与输出。与备注框(Memo)不同的是,列表框和组合框为用户提供了更为方便的多项选择和信息输入。
列表框和组合框二者的不同在于:组合框不仅提供选项供用户选择,而且还允许用户通过键盘输入数据,相当于编辑框EditBox和列表框ListBox的结合。
5.5.1 列表框ListBox控件
1、列表框ListBox的常用属性
2、列表框ListBox的使用
3、选择和移动数据
【例5-9】:将【例5-7】中的备注框改为列表框:
【例5-11】:小学生做加减法的算术练习程序。计算机连续到随机到给出两位数的加减法算术题,要求学生回答,答对的打“√”,答错的打“╳”。将作过的题目存放在列表框中备查,并随机地给出答题的正确率
【例5-12】:利用循环结构和列表框控件,设计的“选项移动”窗体
1、列表框ListBox的常用属性
当列表框不能同时显示所有数据时,将自动加上一个垂直的滚动条,是用户可以上下滚动列表框,以查阅所有的选项。列表框的主要属性见表:
属性名
属性类型
意义
Items
TStrings
以行为单位,列表框中选项的集合,组合框也有
ItemsIndex
Integer
选项的索引值,组合框夜也有
Sorted
Boolean
决定选项是否排序,组合框也有
Columns
Integer
决定列表框的列数,列表框独有
MultiSelect
Boolean
是否可以选择多项,列表框独有
SelCount
Integer
表示被选中项的数目,只读,列表框独有
Selected
Boolean
用来设置或返回某选项是否被选中
说明
在代码中可以调用TStrings类的相应方法来处理Items 中的数据:
ListBox1.Lines.Add(‘增加一个新行。’); //在最后增加一个新行
ListBox1.Lines.Delete(5); //删除第六行
ListBox1.Lines.Insert(3,’插入一行’) //在第四行处插入一个新行
ListBox1.Lines.Move(2,4); //将第三行移至第五行
2、列表框ListBox的使用
【例5-9】:将【例5-7】中的备注框改为列表框:
设计步骤:
(1) 建立应用程序用户界面。
选择“新建”工程,进入窗体设计器,在窗体中增加1个列表框。
(2) 程序设计
编写按钮Button1的OnClick事件代码:
procedure TForm1.Button1Click(Sender: TObject);
var
N,M,I,s: integer;
F: single;
Begin
for N:=1 to 50 do
begin
M:= 2*N+1;
S:= 0;
I:= 2;
F:= StrToFloat(IntToStr(M));
while (I <= Sqrt(F)) and (S=0) do
begin
If M mod I=0 Then s:= 1
else I:= I+1;
end;
If S=0 then ListBox1.Items.Add(inttostr(M));
end;
end;
程序下载
【例5-11】:小学生做加减法的算术练习程序。计算机连续到随机到给出两位数的加减法算术题,要求学生回答,答对的打“√”,答错的打“╳”。将作过的题目存放在列表框中备查,并随机地给出答题的正确率
分析:随机函数Random(n)返回一个0--n之间的随机实数为了生成某个范围内的随机整数,可以使用以下公式:
Trunc(Random(最大值 - 最小值 + 1)+最小值)
(1) 建立应用程序用户界面。
选择“新建”工程,进入窗体设计器,在窗体中做如下设计。
(2) 程序设计
出题部分由窗体的激活(OnActive)事件代码:
procedure TForm1.FormActivate(Sender: TObject);
var
A,B,P,T: integer;
begin
Randomize;
A:= Trunc(10+Random(90));
B:= Trunc(10+Random(90));
P:= Trunc(Random(2));
if P = 0 then
begin
Edit1.Text:= Format('%3d + %3d = ', [A,B]);
Edit1.Tag:= A+B;
end
else Begin
if A < B then
begin
T:=A; A:=B; B:=T;
end;
Edit1.Text:= format('%3d - %3d = ', [A,B]);
Edit1.Tag:= A-B;
end;
Edit2.Selstart:= 0;
Edit2.Text:= '';
Edit2.SetFocus;
end;
答题部分由编辑框Edit2的按键(OnKeyPress)事件代码:
procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
var
X: single;
S: string;
begin
if Key=#13 then
begin
Form1.Tag:= Form1.Tag+1;
if StrToInt(Edit2.Text) = Edit1.Tag then
begin
ListBox1.Items.Insert(0, format(Edit1.Text+'%3s √',[Edit2.TExt]));
Listbox1.Tag:=ListBox1.Tag+1;
end
else
ListBox1.Items.Insert(0,format(Edit1.Text+'%3s ╳', [Edit2.TExt]));
Form1.FormActivate(Sender);
X:= ListBox1.Tag*100/(Form1.Tag);
S:= '共做%d题'+#13+#13+#13+'正确率为:'+#13+#13+'%f%%';
Label1.Caption:= Format(S,[Form1.Tag,X]);
end;
end;
编写“清除”按钮Button1的OnClick事件代码:
procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.Tag:= 0;
ListBox1.Tag:= 0;
ListBox1.clear;
Label1.Caption:= Format(#13+'start again!'#13+#13+#13+'正确率为:'+
#13+#13+'%f%%', [0.00]);
Edit2.SetFocus;
end;
程序下载
3、选择和移动数据
【例5-12】:利用循环结构和列表框控件,设计的“选项移动”窗体。
所谓“选项移动”窗体是指由两个列表框和四个按钮构成的界面,在程序中常见到此类窗口
设计步骤:
(1) 建立应用程序用户界面。
选择“新建”工程,进入窗体设计器,设计如下窗体。
(2) 程序设计
编写“>”按钮Button1的OnClick事件代码:
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
i:= 0;
while i < ListBox1.Items.Count do
begin
if listbox1.selected[i] then
begin
Listbox2.Items.Add(ListBox1.Items[i]);
Listbox1.Items.Delete(i);
end
else
i:= i+1;
end;
end;
编写“>>”按钮Button2的OnClick事件代码:
procedure TForm1.Button2Click(Sender: TObject);
var
i: integer;
begin
for i:= 0 to Listbox1.Items.Count-1 do
Listbox2.Items.Add(Listbox1.Items[i]);
Listbox1.Items.clear;
end;
编写“<”按钮Button3的OnClick事件代码:
procedure TForm1.Button3Click(Sender: TObject);
var
i: integer;
begin
i:= 0;
while i < ListBox2.Items.Count do
begin
if listbox2.selected[i] then
begin
Listbox1.Items.Add(ListBox2.Items[i]);
Listbox2.Items.Delete(i);
end
else
i:= i+1;
end;
end;
编写“<<”按钮Button4的OnClick事件代码:
procedure TForm1.Button4Click(Sender: TObject);
var
i: integer;
begin
for i:= 0 to Listbox2.Items.Count-1 do
Listbox1.Items.Add(Listbox2.Items[i]);
Listbox2.Items.clear;
end;
5.5.2 组合框ComboBox控件
组合框(ComboBox)同时具有编辑框Edit和列表框ListBox两者的功能,用户可以通过键盘输入文本数据,或者选择列表中的项目
1、组合框ComboBox控件特有的属性
2 、下拉列表框
3、 简单组合框
4、 下拉组合框
【例5-13】:修改【例5-11】,将例5-11算术练习中的列表框改为组合框(下拉列表框)。
【例5-14】:“简易抽奖机”,在组合框中输入号码,按“开始”按钮可以得到中奖号码。
【例5-15】:在【例5-14】中使用下拉组合框,可以更加节省空间。
1、组合框ComboBox控件特有的属性
其主要特有的属性见表:
属性名
属性类型
意义
DropDownCount
Integer
组合框的下拉列表所能显示选项的最大个数
Seltext
String
用来存储显示于编辑区中被选中的内容
Style
决定组合框的风格
其中:Style属性的取值
(1) csDropDownList: 下拉列表框,
(2) cSDropDown:下拉组合框, 将文本框和下拉列表框组合在一起,用户可以通过单击向下按钮来显示可滚动的选项列表,还可以输入列表中所没有的新项目
(3)csSimple:简单组合框, 将文本框和下拉列表框简单地组合在一起
2 、下拉列表框
下拉列表框与其说是组合框,还不如说是一种列表框。 和列表框一样,为用户提供了一些选项和信息的列表。在列表框中,任何时候都能看到多个选项,而在下拉列表框中,一般只能看到一个选项,用户可以通过按钮来显示可滚动的下拉列表框。它的好处是能比通常的列表框少占地方。
【例5-13】:修改【例5-11】,将例5-11算术练习中的列表框改为组合框(下拉列表框)。
设计要求:
设计步骤:
(1) 修改应用程序用户界面与属性设置。修改例5-11,在窗体中增加一个ComboBox1,如下图。
其中对象属性的设置见下表:
对象
属性
属性值
说明
ComboBox1
Style
csDropDownList
下拉列表框
DropDownCount
7
下拉列表框的项数
(2) 修改程序代码:
修改答题部分编辑框Edit2的按键(OnKeyPress)事件代码:
procedure TForm1.Edit2KeyPress(Sender: TObject; var Key: Char);
var
X: single;
S: string;
begin
if Key=#13 then
begin
Form1.Tag:= Form1.Tag+1;
if StrToInt(Edit2.Text) = Edit1.Tag then
begin
ComboBox1.Items.Insert(0,format(Edit1.Text+'%3s √',[Edit2.TExt]));
ComboBox1.Tag:= ComboBox1.Tag+1;
end
else
ComboBox1.Items.Insert(0,format(Edit1.Text+'%3s ╳',[Edit2.TExt]));
ComboBox1.ItemIndex:= 0;
Form1.FormActivate(Sender);
X:= ComboBox1.Tag*100/(Form1.Tag);
S:= '共做%d题'+#13+#13+#13+'正确率为:'+#13+#13+'%f%%';
Label1.Caption:= Format(S,[Form1.Tag,X]);
end;
end;
修改“清除”按钮Button1的OnClick事件代码:
procedure TForm1.Button1Click(Sender: TObject);
begin
Form1.Tag:= 0;
ComboBox1.Tag:= 0;
ComboBox1.clear;
Label1.Caption:= Format(#13+'start again!'#13+#13+#13+'正确率为:'+
#13+#13+'%f%%', [0.00]);
Edit2.SetFocus;
end;
程序下载
3、 简单组合框
简单组合框中的列表框总是被显示出来,上面为一个可供输入的文本框,下面为一个普通的列表框,这与列表框相差不多,只多了一个文本框可供输入。
【例5-14】:“简易抽奖机”,在组合框中输入号码,按“开始”按钮可以得到中奖号码。
(1) 建立应用程序用户界面。
选择“新建”工程,进入窗体设计器,在窗体中做如下设计。将ComboBox1的Style属性改为:csSimple。
(2) 程序设计
编写组合框ComboBox1的按键(OnKeyPress)事件代码:
procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char);
begin
if (Key = #13) and (Combobox1.Text <> '') then
begin
Combobox1.Items.Insert(0, Combobox1.Text);
Combobox1.SelStart:= 0;
Combobox1.Text:= '';
end;
if Key=#27 then
If Combobox1.ItemIndex <> -1 then
Combobox1.Items.Delete(Combobox1.ItemIndex);
end;
按钮Button1的OnClick事件代码,使之可以随机到抽取奖号:
procedure TForm1.Button1Click(Sender: TObject);
var
N,A: word;
begin
Randomize;
N:= Combobox1.Items.Count;
A:= Trunc(Random(n));
Combobox1.ItemIndex:= A;
Showmessage('中奖的号码是:'+#13+Combobox1.Text);
end;
程序下载
4、 下拉组合框
下拉组合框看起来像是在标准的文本框右边加了个下拉箭头,用鼠标单击该箭头就在文本框下打开一个列表。用户从中选择一个选项,该选项就会进入文本框
展开阅读全文