1、5.1 While语句 While语句属于前测型循环结构。首先判断条件,根据条件决定是否执行循环,执行循环的最少次数为0。 其流程图如图所示。 While条件 {条件判断} 循环体 {条件成立时所执行的语句} 5.1.1 While语句的语法 WHILE语句常用在不能预先确定重复次数的情况。 WHILE语句的语法格式: While <条件> Do [<循环体>]; 说明: (1) <条件>是一个具有Boolean值的条件表达式,为循环的条件。 (2) <循环体>可以是
2、简单语句、复合语句和其他结构语句。 (3) While循环的执行过程:首先计算<条件>的值,如果<条件>为真(True),则执行Do后面的循环体,执行完后,再开始一个新的循环;如果<条件>为假(False),则终止循环,执行<循环体>后面的语句。 (4) 可以在<循环体>中的任何位置放置Break语句来强制终止While循环——随时跳出While循环。Break语句通常用于If语句之后。 (5) 可以在<循环体>中的位置放置Continue语句,在整个循环体执行完就重新判断<条件>,以决定是否开始新的循环。Continue语句通常用于If语句之后。 语义: WHILE语句是在
3、循环体执行之前判断重复终止条件:当布尔表达式为false,跳过循环体执行WHILE语句的下一条语句;当布尔表达式值为true时,重复执行循环体,直到布尔表达式的值为false时才终止。一般来说,在循环体内应有修改布尔表达式中的变量的语句。如果布尔表达式的值在开始时就为false,则此循环体中的语句一次也不执行。循环语句中有多个语句时,必须构成复合语句。 WHILE语句逻辑功能如下图: 5.1.2 While语句的应用 【例5-1】求累加和1+2+3+…+100 【例5-2】输入一个正整数,判断是否是素数。
4、 【例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
5、 {计数器增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 := '
6、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
7、 真 输出: 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)); whi
8、le (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:
9、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
10、 Edit1.SetFocus; end; 5.2 Repeat语句 Repeat 语句属于后测型循环结构。首先执行循环体,然后判断条件,根据条件决定是否继续执行循环,因此执行循环的最少次数为1. 其流程图如图所示。 循环体 {条件成立时所重复执行的语句} Unit1 条件 {条件不成立或成立时} 5.2.1 Repeat语句的语法 Repeat 语句的语法格式为: Repeat [<循环体>] Unit1 <条件>; 说明: (1) <条件>是一个具有Boolean值的条
11、件表达式,为循环的条件。 (2) <循环体>可以是一条语句,也可以是多条语句。多条语句无须用Begin…End括起来,而由保留字Repeat与Unitl将其括起。 (3) Repeat循环的执行过程:首先执行<循环体>,然后计算<条件>的值,如果<条件>为假(False),则开始一个新的循环;如果<条件>为真(True),则终止循环,执行Unit1 <条件>后面的语句。 (4)可以在〈循环体〉中的任何位置放置Break语句来强制终止循环——随时跳出Repeat循环。Break语句通常用于If语句之后。 (5)可以在循环体中的任何位置放置Continue语句,在整个循环体没有执行完就重新
12、判断〈条件〉,以决定是否开始新的循环。Continue语句通常用于If语句之后。 REPEAT语句的逻辑功能图如下: 5.2.2 Repeat语句的应用 【例5-3】输入有效数字的位数,利用下述公式计算圆周率∏的近似 值: 【例5-4】输入两个正整数,求他们的最大公约数, 【例5-3】输入有效数字的位数,利用下述公式计算圆周率∏的近似 值: 分析:首先找到公式中无穷乘积各项的规律:设第n项的分母为Pn ,则地第n+1项的分母为Pn+1 =Sqrt(2+Pn )。若设前 n项的乘积为
13、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
14、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
15、]); 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
16、) 最后的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,
17、 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
18、 N:= R; Until R = 0; Label1.Caption:= format('%s与%s的最大公约数是:'+#13+#13 + '%d',[S1,S2,M]); end; 5.3 For语句 在不知道需要执行多少次循环时,应该用While 或Repeat循环。但是,若知道要执行多少次循环时,则最好使用For循环结构。 For循环要使用一个循环变量,每重复一次循环之后,循环变量的值就会自动增加或者减少。 其流程图如图所示。 循环变量 从 初值 到终值 {循环控制器} 循环体
19、 {循环体 } 5.3.1 For语句的语法 For循环语句有两种形式: For <循环变量>:= <初值> TO <终值> DO <循环体>; For <循环变量>:= <初值> DOWNTO <终值> DO <循环体>; 说明: (1) 〈循环变量〉为必要参数,用做循环计数器,只能是顺序类型。 (2) 〈初值〉和<终值>表示〈循环变量〉的初值和终值,可以是表达式,但应与〈循环变量〉的类型相同,若为表达式,则在进入循环之前已被计算确定,在循环体中改变初值或终值表达式中变量的值,并不影响循环的次数。 (3) T
20、o表示计数器递增,DownTo表示计数器递减。 (4) 〈循环体〉可以是简单语句,复合语句和其他结构语句。 (5) For循环的执行过程:首先判断循环变量的值是否“超过”终值,若已超过则跳出循环执行〈循环体〉后的语句;若未超过则执行Do后的〈循环体〉,然后循环变量自动增量并开始一个新的循环。 (6) 可以在〈循环体〉中的任何位置放置Break语句来强制终止循环——随时跳出For循环。Break语句通常用于If语句之后。 (7) 可以在循环体中的任何位置放置Continue语句,在整个循环体没有执行完就重新判断〈条件〉,以决定是否开始新的循环。Continue语句通常放于If语句之后。
21、 我们用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的OnClic
22、k事件代码: 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】: 斐波那
23、契(Fibonacci)数列问题。 Fibonacci数列问题来源于一个古老的有关兔子繁殖的问题:假设在第1个月时有一对小兔子,第2个月时成为大兔子,第3个月时成为老兔子,并生出一对小兔子(一对老,一对小)。 第4个月时成为老兔子又生出一对小兔子,上个月的小兔子变成大兔子(一对老,一对大,一对小)。第5个月时上个月的大兔子变成老兔子,上个月的小兔子变成大兔子,两对老兔子生出两对小兔子(两对老,一对中,两对小)…… 这样,各月的兔子对数为:1,1,2,3,5,8,…… 这就是Fibonacci数列,其中第n项的计算公式为: 为了避免定义许多的变量,采用“迭代”的算法:
24、即只定义少量的变量,如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:inte
25、ger; 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)、组合框(Comb
26、oBox)和备注框(Memo)都可用来处理多行文本的输入与输出。与备注框(Memo)不同的是,列表框和组合框为用户提供了更为方便的多项选择和信息输入。 列表框和组合框二者的不同在于:组合框不仅提供选项供用户选择,而且还允许用户通过键盘输入数据,相当于编辑框EditBox和列表框ListBox的结合。 5.5.1 列表框ListBox控件 1、列表框ListBox的常用属性 2、列表框ListBox的使用 3、选择和移动数据 【例5-9】:将【例5-7】中的备注框改为列表框: 【例5-11】:小学生做加减法的算术练习程序。计算机连续到随机到给出两位数的加减法算术题
27、要求学生回答,答对的打“√”,答错的打“╳”。将作过的题目存放在列表框中备查,并随机地给出答题的正确率 【例5-12】:利用循环结构和列表框控件,设计的“选项移动”窗体 1、列表框ListBox的常用属性 当列表框不能同时显示所有数据时,将自动加上一个垂直的滚动条,是用户可以上下滚动列表框,以查阅所有的选项。列表框的主要属性见表: 属性名 属性类型 意义 Items TStrings 以行为单位,列表框中选项的集合,组合框也有 ItemsIndex Integer 选项的索引值,组合框夜也有 Sorted Boolean 决定选项是否排序
28、组合框也有 Columns Integer 决定列表框的列数,列表框独有 MultiSelect Boolean 是否可以选择多项,列表框独有 SelCount Integer 表示被选中项的数目,只读,列表框独有 Selected Boolean 用来设置或返回某选项是否被选中 说明 在代码中可以调用TStrings类的相应方法来处理Items 中的数据: ListBox1.Lines.Add(‘增加一个新行。’); //在最后增加一个新行 ListBox1.Lines.Delete(5); //删除第六行
29、 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);
30、 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 ListBo
31、x1.Items.Add(inttostr(M)); end; end; 程序下载 【例5-11】:小学生做加减法的算术练习程序。计算机连续到随机到给出两位数的加减法算术题,要求学生回答,答对的打“√”,答错的打“╳”。将作过的题目存放在列表框中备查,并随机地给出答题的正确率 分析:随机函数Random(n)返回一个0--n之间的随机实数为了生成某个范围内的随机整数,可以使用以下公式: Trunc(Random(最大值 - 最小值 + 1)+最小值) (1) 建立应用程序用户界面。 选择“新建”工程,进入窗体设计器,在窗体中做如下设计。 (2) 程序设计
32、 出题部分由窗体的激活(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
33、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.Edit2KeyP
34、ress(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
35、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; 编写“清除”按钮Butto
36、n1的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】:利用循环
37、结构和列表框控件,设计的“选项移动”窗体。 所谓“选项移动”窗体是指由两个列表框和四个按钮构成的界面,在程序中常见到此类窗口 设计步骤: (1) 建立应用程序用户界面。 选择“新建”工程,进入窗体设计器,设计如下窗体。 (2) 程序设计 编写“>”按钮Button1的OnClick事件代码: procedure TForm1.Button1Click(Sender: TObject); var i: integer; begin i:= 0; while i < ListBox1.Items.Count do begin
38、 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 Listb
39、ox1.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 beg
40、in 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.
41、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-1
42、5】:在【例5-14】中使用下拉组合框,可以更加节省空间。 1、组合框ComboBox控件特有的属性 其主要特有的属性见表: 属性名 属性类型 意义 DropDownCount Integer 组合框的下拉列表所能显示选项的最大个数 Seltext String 用来存储显示于编辑区中被选中的内容 Style 决定组合框的风格 其中:Style属性的取值 (1) csDropDownList: 下拉列表框, (2) cSDropDown:下拉组合框, 将文本框和下拉列表框组合在一起,用户可以通过单击向下按钮来显示可滚动的选项列表,还可以
43、输入列表中所没有的新项目 (3)csSimple:简单组合框, 将文本框和下拉列表框简单地组合在一起 2 、下拉列表框 下拉列表框与其说是组合框,还不如说是一种列表框。 和列表框一样,为用户提供了一些选项和信息的列表。在列表框中,任何时候都能看到多个选项,而在下拉列表框中,一般只能看到一个选项,用户可以通过按钮来显示可滚动的下拉列表框。它的好处是能比通常的列表框少占地方。 【例5-13】:修改【例5-11】,将例5-11算术练习中的列表框改为组合框(下拉列表框)。 设计要求: 设计步骤: (1) 修改应用程序用户界面与属性设置。修改例5-11,在窗体
44、中增加一个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=#1
45、3 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
46、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: T
47、Object); 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、 简单组合框 简单组合框中的列表框总是被显示出来,上面为一个可供输入的文本框,下面为一个普通的列表框,这与列表框相差不多,只多了一个文本框可供
48、输入。 【例5-14】:“简易抽奖机”,在组合框中输入号码,按“开始”按钮可以得到中奖号码。 (1) 建立应用程序用户界面。 选择“新建”工程,进入窗体设计器,在窗体中做如下设计。将ComboBox1的Style属性改为:csSimple。 (2) 程序设计 编写组合框ComboBox1的按键(OnKeyPress)事件代码: procedure TForm1.ComboBox1KeyPress(Sender: TObject; var Key: Char); begin if (Key = #13) and (Combobox1.Text <> '')
49、 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.But
50、ton1Click(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、 下拉组合框 下拉组合框看起来像是在标准的文本框右边加了个下拉箭头,用鼠标单击该箭头就在文本框下打开一个列表。用户从中选择一个选项,该选项就会进入文本框
©2010-2025 宁波自信网络信息技术有限公司 版权所有
客服电话:4009-655-100 投诉/维权电话:18658249818