第6章 Visual FoxPro程序设计练习一 项目管理器基本操作和程序文件的建立
【实验目的】
掌握项目管理器基本操作;
熟练掌握程序文件的建立、修改、运行;
熟练掌握键盘输入命令;
熟练掌握顺序结构基本操作。
【知识要点】
一、项目管理器简介在Visual FoxPro系统中,使用项目组织、集成数据库应用系统中所有相关的文件,形成一个完整的应用系统。所谓项目是Visual FoxPro中相关数据、文档和各类文件、对象的集合,也即项目是与一个应用有关的所有文件的集合。项目管理器是Visual FoxPro系统创建、管理项目的工具,用来创建、修改、组织项目中各种文件,对项目中程序进行编译和连编,形成一个可以运行的应用程序系统。
1.创建项目创建项目就是创建一个项目文件(扩展名为.PJX)
(1)“文件/新建”-(类型)选“项目” -,新建文件”钮 - 输入项目文件名并确定存放位置。
(2)CREATE PROJECT <项目文件名>
2.打开项目打开项目就是打开项目管理器
(1)创建项目后,系统自动进入项目管理器
(2)”文件/打开” -(类型)选,项目” - 选定文件 -,确定”钮
3.项目管理器的选项卡
 
项目管理器有6个选项卡
(1)数据:数据库(视图),自由表、查询
(2)文档:表单、报表、标签
(3)类库:
(4)代码:程序、API库、应用程序
(5)其它:文本文件、菜单、其它文件
(6)全部:以上五类
4.使用项目管理器
(1)创建文件
① 选定类型-,新建”钮-进入相应的设计器
② 选定类型-,项目/新建文件” -进入相应的设计器
(2)添加文件
① 选定类型-,添加”钮-选择要添加的文件-“确定”
② 选定类型-,项目/添加文件” -选择要添加的文件-“确定”
注意:新建和添加的文件并不是成为“项目”的一部分,而是此文件与项目间建立了一种“关联”。
(3)修改文件
① 选定文件-,修改”钮-进入相应的设计器,进行修改
② 选定文件-,项目/修改文件” -进入相应的设计器
(4)移去文件
① 选定文件-,移去”钮-选择“移去”(或“删除”)
② 选定文件-,项目/移去文件” -选择“移去”(或“删除”)
移去:将文件从“项目管理器”中移出
删除:将文件从磁盘中删除,要谨慎操作
(5)其它按钮
①,浏览” 显示选定“表”的内容
②,运行” 运行选定的“程序”或“表单”
③,预览” 显示选定的“报表”或“标签”
二、程序文件的建立、修改和运行
1.建立程序:
(1)MODIFY COMMAND 程序名
(2)“文件/新建”-(类型)选“程序”-“新建文件”-输入程序内容
2.修改程序:
(1)MODIFY COMMAND 程序名
(2)“文件/打开”- (类型)选“程序”- 选定程序
3.运行程序:
(1)DO 程序名
(2)“程序/运行”- 选定程序
(3)(程序编辑状态中)单击“运行”钮三、交互式输入命令:
1.ACCEPT命令:
格式:ACCEPT[提示信息]TO 内存变量功能:先显示提示信息,然后等待键盘上录入的字符型数据并存入内存变量说明:输入的字符型数据可不用加引号。只能输入字符型数据。
2.INPUT命令:
格式:INPUT[提示信息]TO 内存变量功能:先显示提示信息,然后等待从键盘上录入的数据(C、N、L、D型)并存入指定的内存变量。常用于输入数值型数据。输入的字符型数据要加引号。
3.WAIT命令:
格式:WAIT[提示信息][TO 内存变量]
功能:暂停程序的运行,在屏幕上显示提示信息,然后等待从键盘上录入的任一字符并存入指定的内存变量。常用于暂停。
四、顺序结构
1.功能:顺次、逐条地执行程序中的命令。
2.要点:
(1)弄清要解决的问题
(2)设计出解决问题的方法、步骤
(3)针对每个步骤选择适当的命令
(4)严格按照次序把命令记录下来
3.程序中常用的开头部分:
CLEAR 清屏
SET DATE YMD 设置日期格式为年月日
SET TALK OFF 关闭人机对话
SET DEFAULT TO [盘符:\路径] 设置默认路径
SET SAFETY OFF 关闭文件或数据重写时出现的对话框
4.程序中常用的结尾部分:
SET TALK ON 打开人机对话
CANCEL 清除变量,返回到交互方式状态
RETURN 返回调用程序处
QUIT 退出VFP
USE 关闭已打开的表
【实验内容】
一、项目管理器基本操作
1.新建一个项目DEMO.PJX:
(1)在里面新建一个自由表DEMO.DBF(学号,C,6;姓名,C,6);
(2)新建一个数据库学生基本信息.DBC;
(3)将学生表和成绩表添加到学生基本信息.DBC里;
(4)新建一个程序文件:在屏幕上输出“你好,欢迎学习VF程序设计!”。
二、程序文件的建立、修改和运行
1.编写一个程序:从键盘输入一个正数,求以此数为半径的圆面积。
2.编一个程序:任意输入两个数,计算它们的和、差、积、商并输出到屏幕上。
3.在学生表.DBF中,输入学号,查找该学号的记录,并为该记录做上删除标记。
【高手进阶】
在“学生表”和“成绩表”中,输入学生姓名,则可查出该生的成绩。
编一个根据学生的计算机分数自动确定其等级的程序。
【自我测试】( 5分钟 )
1.为程序中每条语句加以注释,说明该语句的的作用。
SET TALK OFF
SET DEFA TO D:\VFP程序设计\表
CLEAR
SELECT 1
USE 成绩表
INDEX ON 学号 TAG XH
SELECT 2
USE 学生表
SET RELATION TO 学号 INTO 1
GO 4
DISPLAY 学号,姓名,成绩.英语,成绩.计算机
【实验过程】
一、项目管理器基本操作
1.新建一个项目DEMO.PJX:
(1)在里面新建一个自由表DEMO.DBF(学号,C,6;姓名,C,6);
(2)新建一个数据库:学生基本信息.DBC;
(3)将学生表和成绩表添加到学生基本信息.DBC里;
(4)新建一个程序文件:在屏幕上输出“你好,欢迎学习VF程序设计!”。
[解答]
新建项目:
① 命令方式:CREATE PROJECT DEMO.PJX
② 菜单方式:“新建”-“文件类型”选择“项目”-“新建文件”
(1)在里面新建一个自由表DEMO.DBF(学号,C,6;姓名,C,6);
在“数据”里选择“自由表”-单击“新建”
(2)新建一个数据库:学生基本信息.DBC;
,数据”-“数据库”-单击“新建”
(3)将学生表和成绩表添加到学生基本信息.DBC里;
展开“数据库”-单击“表”-选择“添加”
(4)新建一个程序文件:在屏幕上输出“你好,欢迎学习VF程序设计!”。
在“代码”里选择“程序”-选择“新建”
代码:SET TALK OFF
CLEAR
“你好,欢迎学习VF程序设计!”
SET TALK ON
RETURN
二、程序文件的建立、修改和运行
1.编写一个程序:从键盘输入一个正数,求以此数为半径的圆面积。
[解答]
CLEAR
SET TALK OFF
INPUT,请输入一个正数:” TO R
S=R*R*3.14
,以”+R+”为半径的圆的面积为:”,S
SET TALK ON
RETURN
2.编一个程序:任意输入两个数,计算它们的和、差、积、商并输出到屏幕上。
[解答]
CLEAR
SET TALK OFF
INPUT,请输入第一个数:” TO A && 用户从键盘输入一个数到变量A
INPUT,请输入第二个数:” TO B && 用户从键盘输入一个数到变量B
S1=A+B
S3=A-B
S3=A*B
S4=A/B
,此两个数的和为:”+STR(S1,7,2) && 函数STR()是将数值型转为字符型
,此两个数的差为:”+STR(S2,7,2) && 限定只有4位数,及2位小数
,此两个数的积为:”+STR(S3)
,此两个数的商为:”+STR(S4,7,2)
SET TALK ON
RETURN
3.在学生表.DBF中,输入学号,查找该学号的记录,并为该记录做上删除标记。
[解答]
CLEAR
SET TALK OFF
CLOSE ALL
USE 学生
ACCEPT,请输入学生学号:” TO XH
LOCATE FOR 学号=XH
DISPLAY
DELETE
USE
SET TALK ON
RETURN
【高手进阶解答】
在“学生”和“成绩”表中,输入学生姓名,则可查出该生的成绩。
[解答] 因要用两个表,故要建关联
CLEAR
SET TALK OFF
SELECT 1
USE 成绩
INDEX ON 学号 TAG XH && 为成绩表(对学号)建立索引(名叫XH)
SELECT 2
USE 学生
*INDEX ON 学号 TAG XH && 父表可不建索引
*SET ORDER TO XH
SET RELATION TO 学号 INTO 1 && 按“学号”对1区的成绩表建立关联
ACCEPT,请输入学生的姓名:” TO AA
BROWSE FIELDS 学号,姓名,成绩.高数,成绩.大语,;
成绩.邓论,成绩.英语,成绩.计算机,成绩.总分 FOR 姓名=AA
&&子表记录前要加前缀:“别名->”或“别名.”
  RETURN
编一个根据学生的计算机分数自动确定其等级的程序。
[解答]
CLEAR
SET TALK OFF
SET DEFA TO C:\VFP程序设计\表
USE 成绩
REPLACE ALL 等级 WITH,不及格” FOR 计算机<60 && 替换操作
REPLACE ALL 等级 WITH,及格” FOR计算机>=60 AND计算机<75
REPLACE ALL 等级 WITH,良” FOR计算机>=75 AND计算机<90
REPLACE ALL 等级 WITH,优” FOR S计算机>=90 AND计算机<=100
LIST
RETURN
【自我测试解答】
1.为程序中每条语句加以注释,说明该语句的的作用。
[解答]
SET TALK OFF && 关闭人机对话
SET DEFA TO D:\VFP程序设计\表 && 设置默认路径
CLEAR && 清屏
SELECT 1 && 指定工作区1为当前工作区
USE 成绩 && 在工作区1中打开表成绩
INDEX ON 学号 TAG XH && 为表成绩(对学号)建立索引
SELECT 2 && 指定工作区2为当前工作区
USE 学生 && 打开父表“学生”
SET RELATION TO 学号 INTO A && 按“学号”对1区的表建立关联
GO 4 && 在“学生”表中移指针到第4条记录
DISP 学号,姓名,成绩.英语,成绩.计算机 && 显示当前记录(两个表中的值)
练习二 程序基本结构:分支结构(一)
【实验目的】
掌握单分支语句的使用;
重点掌握双分支语句的使用。
【知识要点】
分支结构,根据一定的条件,来判断程序的执行方向
1.单分支语句:
(1)格式:IF 条件
命令序列 &&满足条件,则执行命令序列
ENDIF &&不满足条件,则执行ENDIF后面的语句
(2)功能:满足条件,执行“命令序列”。
(3)说明:IF与ENDIF必须配对出现。
2.双分支语句
(1)格式:IF 条件
命令序列1 &&满足条件,则执行命令序列1
[ELSE
命令序列2] &&不满足条件,则执行命令序列2
ENDIF
(2)功能:满足条件,执行“命令序列1”;不满足条件,则执行“命令序列2”
(3)说明:
① 若省略ELSE项,则成为单分支(不满足条件就退出分支语句);
② IF与ENDIF必须配对出现。
3.几种常用条件
(1)FOUND():测试用LOCATE、CONTINUE、FIND、SEEK等命令查找是否成功(常用于“IF┉ENDIF”中)。
(2)NOT EOF():测试是否未到文件尾。即要对所有记录进行操作,一般应加“SKIP”以移动指针。
【实验内容】
编写程序:输入一个数,如果是正数,计算以该正数为半径的圆面积,否则退出程序。
在“学生表”里,编写一个输入姓名,就可显示该记录(若查不到,则显示“查无此人”
的程序。
3.编写一密码校验程序(假设密码为ABC)。[密码正确,显示“欢迎使用本系统!”;不正确,显示“密码错误!”,并退出]
4.编程求Z的值(X、Y的值由键盘输入)
X + Y (当 x > y 时 )
z = X * Y (当 x = y 时 )
X-Y (当 x < y 时 )
5.编写程序:从键盘输入一个数,如果能被3整除,则输出,否则输出“该数不能被3整除!”
【高手进阶】
编写程序,求ax2+bx+c=0的根。
编写程序,其功能是根据键盘输入a、b、c的值,判断它们能否构成三角形的三条边,
若能构成一个三角形,则计算三角形的面积。
【自我测试】( 5分钟 )
1,判断某年是否是闰年,如果是闰年则能被4整除但不能被100整除,或能被400整除。
【实验过程】
1.输入一个数,如果是正数,计算以该正数为半径的圆面积,否则退出程序。
[解答]
CLEAR
SET TALK OFF
INPUT,请输入一个数:” TO R
IF R>0
S=R*R*3.14
ENDIF
SET TALK ON
RETURN
2.学生表”里,编写一个输入姓名,就可显示该记录(若查不到,则显示“查无此人”)的程序。
[解答]
CLEAR
SET TALK OFF
USE 学生
ACCEPT "请输入姓名:" TO NA
LOCATE FOR 姓名=NA
IF FOUND() && 条件:找到此记录
DISPLAY
ELSE && 不满足条件,执行ELSE后面的语句
"查无此人!"
ENDIF
RETURN
编写一密码校验程序(假设密码为ABC)。[密码正确,显示“欢迎使用本系统!”;不正确,显示“密码错误!”,并退出]
[解答]
SET TALK OFF
CLEAR
ACCEPT "请输入您的密码:" TO AAA
IF AAA="ABC"
"欢迎使用本系统!"
ELSE
WAIT "密码错误!"
QUIT
ENDIF
SET TALK ON
RETURNL
编程求Z的值(X、Y的值由键盘输入)
X + Y (当 x > y 时 )
z = X * Y (当 x = y 时 )
X-Y (当 x < y 时 )
[解答]
SET TALK OFF
CLEAR
INPUT "请输入X的值:" TO X
INPUT "请输入Y的值:" TO Y
IF X>Y
Z=X+Y
ELSE
IF X<Y
Z=X*Y
ELSE
Z=X-Y
ENDIF
ENDIF
Z
RETURN
编写程序:从键盘输入一个数,如果能被3和7整除,则输出,否则输出“该数不能被3
和7整除!”
[解答]
SET TALK OFF
CLEAR
INPUT "请输入A的值:" TO A
IF MOD(A,3)=0 AND MOD(A,7)=0
&& 能被N整除的数M的表示方法一共有三种:
&&MOD(M,N)=0;INT(M/N)=M/N;M%N=0
A
ELSE
"该数不能被3和7整除!"
ENDIF
RETURN
【高手进阶解答】
编写程序,求ax2+bx+c=0的根。
[解答]
本题是求方程的根的问题。a、b、c的值是由键盘输入的,可用INPUT命令来实现;另一个问题是求方程的根的问题,涉及到算法的设计。当a=0时,方程是一次根,x=-c/b;当a<>0时,方程是二次方程,及b^2-4*a*c>=0时,方程有实根x=(-b±aqrt(b^2-4*a*c))/(2*a);当b^2-4*a*c<0时,方程有实根x=(-b±aqrt(4*a*c- b^2))/(2*a)。这些判断可用IF…ELSE…ENDIF语句来实现。
SET TALK OFF
CLEAR
INPUT "请输入方程的系数a:" TO a
INPUT "请输入方程的系数b:" TO b
INPUT "请输入方程的系数c:" TO c
IF a=0 AND b<>0
x=-c/b
ELSE
disc=b^2-4*a*c
IF disc>0
x1=(-b+sqrt(disc))/(2*a)
x2=(-b-sqrt(disc))/(2*a)
"方程的根x1、x2分别是",x1,x2
ELSE
xx=-b/(2*a)
xy=sqrt(abs(disc))/(2*a)
"方程的根x1是:",str(xx,4)+ "+i+"+str(xy,2)
"方程的根x1是:",str(xx,4)+ "-i+"+str(xy,2)
ENDIF
ENDIF
RETURN
编写程序,其功能是根据键盘输入a、b、c的值,判断它们能否构成三角形的三条边,若能构成一个三角形,则计算三角形的面积。
[解答]
题目要求三角形的面积由a、b、c的值来决定,并且a、b、c的值又是通过键盘输入的,即要用到INPUT命令;要构成三角形,必须满足两边之和大于第三边的条件,可通过IF…ELSE…ENDIF语句来实现;另一个知识点就是三角形面积的计算s=sqrt(p*(p-a)*(p-b)*(p-c)),p=(a+b+c)/2。
SET TALK OFF
CLEAR
INPUT "请输入三角形的边长a:" TO a
INPUT "请输入三角形的边长b:" TO b
INPUT "请输入三角形的边长c:" TO c
IF a+b>c AND a+c>b AND b+c>a
p=1.0/2*(a+b+c)
area=sqrt(p*(p-a)*(p-b)*(p-c))
"三角形的面积是:"+str(area)
ELSE
"不能构成三角形!"
ENDIF
RETURN
【自我测试解答】
1,判断某年是否是闰年,如果是闰年则能被4整除但不能被100整除,或能被400整除。
[解答]
SET TALK OFF
CLEAR
INPUT "请输入年份:" TO Y
IF Y/4=INT(Y/4),AND,Y/100<>INT(Y/100),OR,Y/400=INT(Y/400)
*IF Y%4=0,AND,Y%100<>0,OR,Y%400=0
*IF MOD(Y,4)=0,AND,MOD(Y,100)<>0,OR,MOD(Y,400)=0
Y,"是闰年!"
ELSE
Y,"不是闰年!"
ENDIF
SET TALK ON
RETURN
练习三 程序基本结构:分支结构(二)
【实验目的】
1.掌握多分支选择语句的使用
【知识要点】
多路分支语句:
(1)格式:DO CASE <变量>
  CASE 条件1
命令系列1 &&满足条件1时,则执行命令系列1
CASE 条件2
命令系列2 &&满足条件2时,则执行命令系列2
  ……
[OTHERWISE
命令系列N+1] &&条件都不满足时,则执行语句系列N+1;
ENDCASE &&分支结束
(2)功能:满足什么条件,就执行其后的“命令系列”;所有条件都不满足,则执行“命令系列n+1”;
(3)说明:
① 若省略OTHERWISE项,则退出分支语句;
② 使用多分支语句,比用多个IF语句更有效。
【实验内容】
1.编程求Z的值(X、Y的值由键盘输入)
X + Y (当 x>y 时 )
z = X * Y (当 x=y 时 )
X-Y (当 x<y 时 )
2.建一个多分支语句的程序,当输入一个学生成绩时,当分数在90以上,则评为“优等”;75-89为“良好”;60-74为“及格”;60分以下为“不及格”。
3.假设收入(P)与税率(R)的关系如下表,编程求税金(=P*R)。
0 P<800
R= 0.05 800 ≤ P<2000
0.08 2000≤P<5000
0.1 P≥5000
【高手进阶】
1.编程计算:
X(X+5) X≥6
(X+5)2 5≤X<6
Y = 1-X 2≤X<5
X*X 0≤X<2
2X X<0
【自我测试】( 5分钟 )
1.执行下程序后Y的值为多少。
SET TALK OFF
CLEAR
STORE 0 TO X,Y
DO WHILE,T.
X = X+1
DO CASE
CASE INT(X/2)=X/2
LOOP
CASE X>=10
EXIT
OTHERWISE
Y=Y+X
ENDCASE
ENDDO
Y
SET TALK ON
RETURN
【实验过程】
1.编程求Z的值(X、Y的值由键盘输入)
X + Y (当 x>y 时 )
z = X * Y (当 x=y 时 )
X-Y (当 x<y 时 )
[解答]
SET TALK OFF
CLEAR
INPUT,请输入X的值:” TO X
INPUT,请输入Y的值:” TO Y
DO CASE
CASE X > Y
Z = X + Y
CASE X = Y
Z = X*Y
CASE X < Y
Z = X-Y
ENDCASE
Z
RETURN
2.建一个多分支语句的程序,当输入一个学生成绩时,当分数在90以上,则评为“优等”;75-89为“良好”;60-74为“及格”;60分以下为“不及格”。
[解答]
CLEAR
SET TALK OFF
INPUT,请输入学生的成绩:” TO GR
DO CASE
CASE GR>=90
,优秀”
CASE GR>=75 AND GR<90
,良好”
CASE GR>=60 AND GR<74
,及格”
CASE GR<60
,不及格”
ENDCASE
RETURN
3.假设收入(P)与税率(R)的关系如下表,编程求税金(=P*R)。
0 P<800
R= 0.05 800 ≤ P<2000
0.08 2000≤P<5000
0.1 P≥5000
[解答]
SET TALK OFF
CLEAR
INPUT,请输入收入:” TO P
DO CASE
CASE P<800
R=0
CASE P<2000
R=0.05
CASE P<5000
R=0.08
OTHERWISE
R=0.1
ENDCASE
TAX=P*R
,税金为:”,TAX
SET TALK ON
RETURN
【高手进阶解答】
1.编程计算:
X(X+5) X≥6
(X+5)2 5≤X<6
Y = 1-X 2≤X<5
X*X 0≤X<2
2X X<0
[解答]
SET TALK OFF
INPUT,请输入自变量X的值:” TO X
DO CASE
CASE X>=6
Y = X*(X+5)
CASE X>=5 AND X<6
Y = (X+5)^2
CASE X>=2 AND X<5
Y = 1-X
CASE X>=0 AND X<2
Y = X*X
CASE X<0
Y = 2*X
ENDCASE
X,Y
SET TALK ON
【自我测试解答】
1.执行下程序后Y的值为多少。
SET TALK OFF
CLEAR
STORE 0 TO X,Y
DO WHILE,T.
X = X+1
DO CASE
CASE INT(X/2)=X/2
LOOP
CASE X>=10
EXIT
OTHERWISE
Y=Y+X
ENDCASE
ENDDO
Y
SET TALK ON
RETURN
[解答]
X = 10,Y = 1+3+5+7+9 = 25
练习四 程序基本结构:循环结构(一)
【实验目的】
1.掌握条件循环语句:DO WHILE的基本使用。
【知识要点】
DO WHILE…ENDDO循环:
(1)格式:DO WHILE 条件表达式
语句序列
[LOOP]
[EXIT]
ENDDO
LOOP语句:强行返回到循环开始语句。
EXIT语句:强行跳出循环,接着执行ENDDO后的语句
(2)功能:进入循环后,先判断<条件>是否成立,成立,则执行一遍循环体,当遇到ENDDO时回到循环头,再次判断<条件>,如仍成立,则又执行循环体,如此反复进行,直到<条件>不成立为止。
(3)说明:重复执行DO与ENDDO间的循环语句,直到不满足条件为止。知道循环条件应使用 DO WHILE 结构。
【实验内容】
用DO WHILE循环,求S=1+2+3…+N。
用DO WHILE循环,求S=1*2*3…*N。
用DO WHILE循环,求出1-100之间不能被3或7整除的数之和,从1开始,知道和大于678为止。
用DO WHILE循环,逐条显示在学生表中,性别为“男”的所有记录。
【高手进阶】
1.求任意两个数的最大公约数。
【自我测试】( 5分钟 )
1.执行下程序后Y的值为多少?
SET TALK OFF
CLEAR
STORE 0 TO X,Y
DO WHILE,T,
X = X+1
DO CASE
CASE INT(X/2)=X/2
LOOP
CASE X>=10
EXIT
OTHERWISE
Y=Y+X
ENDCASE
ENDDO
Y
SET TALK ON
RETURN
【实验过程】
1,用DO WHILE循环,求S=1+2+3…+N。
[解答]
SET TALK OFF
CLEAR
INPUT,请输入一个数:” to N
S=0
I=1
DO WHILE I<=N
S=S+I
I=I+1
ENDDO
S
RETIRN
2.用DO WHILE循环,求S=1*2*3…*N。
[解答]
SET TALK OFF
CLEAR
INPUT,请输入一个数:” to N
S=1
I=1
DO WHILE I<=N
S=S*I
I=I+1
ENDDO
S
RETIRN
用DO WHILE循环,求出1-100之间不能被3或7整除的数之和,从1开始,知道和大于678为止。
[解答]
SET TALK OFF
CLEAR
S=0
I=1
DO WHILE I<=100
IF NOD(I,3)=0 OR MOD(I,7)=0
I=I+1
LOOP
ENDIF
S=S+I
IF S>678
EXIT
ENDIF
I=I+1
ENDDO
”I=”,I,”S=”,S
RETURN
4.用DO WHILE循环,逐条显示在学生表中,性别为“男”的所有记录。
[解答]
SET TALK OFF
CLOSE ALL
CLEAR
USE 学生
DO WHILE,NOT,EOF()
IF 性别=”男”
DISPLAY
ENDIF
SKIP
ENDDO
SET TALK ON
RETURN
【高手进阶解答】
求任意两个数的最大公约数。
[解答]
SET TALK OFF
CLEAR
STORE 0 TO MAX,MIN
INPUT,请输入第一个数” TO MAX
INPUT,请输入第二个数” TO MIN
*如果MAX小于MIN,通过交换,使MAX成为两数中较大的数
IF MAX<MIN
TEMP=MIN
MIN=MAX
MAX=TEMP
ENDIF
*通过求余数运算得到最大公约数
DO WHILE MIN <>0
TEMPMIN=MIN
MIN=MAX%MIN &&用MIN存储每次求得的余数
MAX=TEMPMIN
ENDDDO
,最大公约数是:”,MAX
SET TALK ON
RETURN
【自我测试解答】
1.执行下程序后Y的值为多少?
SET TALK OFF
CLEAR
STORE 0 TO X,Y
DO WHILE,T,&& 条件是永远为真,要用“EXIT”强制退出
X = X+1
DO CASE
CASE INT(X/2)=X/2 && 或:X%2=0 或:MOD(X,2)=0 表示X是2 的倍数
LOOP
CASE X>=10
EXIT
OTHERWISE
Y=Y+X
ENDCASE
ENDDO
Y
SET TALK ON
RETURN
[解答] Y=1+3+5+7+9=25
练习五 程序基本结构:循环结构(二)
【实验目的】
1.掌握条件循环语句:DO WHILE的熟练使用
【知识要点】
(1)格式:DO WHILE 条件表达式
语句序列
[LOOP]
[EXIT]
ENDDO
LOOP语句:强行返回到循环开始语句。
EXIT语句:强行跳出循环,接着执行ENDDO后的语句
(2) 功能:进入循环后,先判断<条件>是否成立,成立,则执行一遍循环体,当遇到ENDDO时回到循环头,再次判断<条件>,如仍成立,则又执行循环体,如此反复进行,直到<条件>不成立为止。
(3)说明:重复执行DO与ENDDO间的循环语句,直到不满足条件为止。知道循环条件应使用 DO WHILE 结构。
【实验内容】
求数列“0,1,1,2,3,5,。。。。。。”的前30个数。
在学生表中,用“DO WIHLE循环语句”编写一个输入姓名,就可显示该记录,
并可继续进行查询的程序。
对成绩表,编一个可显示前十名学生的学号和总分的程序。
在成绩表中,按平均分来统计人数:统计90分(含90分)以上、80-90分(含80分)、70-80分(含70分)、60-70分(含60分)和60分以下的学生人数。
【高手进阶】
用FOR循环,输入一个数N,求1!+2!+3!+…….+N!
打印乘法九九表。
【自我测试】( 5分钟 )
1.下面程序执行的结果是什么?
SET TALK OFF
CLEAR
STORE,天长地久” TO CH
I = 1
DO WHILE I<8
SUBSTR(CH,I,2)
I = I+2
ENDDO
SUBSTR(CH,5,4)
SUBSTR(CH,1,4)
RETURN
SET TALK ON
【实验过程】
1.求数列“0,1,1,2,3,5,。。。。。。”的前30个数。
[解答]
CLEAR
SET TALK OFF
S1=0
S2=1
I=3
S1
S2
DO WHILE I <= 30
S3 = S1 + S2
S3
S1=S2
S2=S3
I=I+1
ENDDO
RETURN
在学生表中,用“DO WIHLE循环语句”编写一个输入姓名,就可显示该记录,
并可继续进行查询的程序。
[解答]
SET TALK OFF
CLEAR
USE 学生
AA="Y"
DO WHILE UPPER(AA)="Y"
ACCEPT "请输入姓名:" TO NA
LOCATE FOR 姓名=NA
IF FOUND()
DISPLAY
ELSE
"查无此人!"
ENDIF
ACCEPT "还要继续查找吗(Y/N)?" TO AA
ENDDO
SET TALK ON
USE
RETURN
3.对成绩表,编一个可显示前十名学生的学号和总分的程序。
[解答]
SET TALK OFF
CLEAR
USE 成绩
REPLACE ALL 总分 WITH 高数+大语+邓论+英语+计算机
INDEX ON 总分 TAG SC DESCENDING && 按总分降序排列
* INDEX ON -总分 TAG SC && 或这样来进行降序
N=1
DO WHILE N<=10 && 循环条件:从1到10
N = N+1
DISPLAY 姓名,总分 && 显示两个字段
SKIP && 移动指针
ENDDO
SET TALK ON
USE
RETURN
4.在成绩表中,按平均分来统计人数:统计90分(含90分)以上、80-90分(含80分)、70-80分(含70分)、60-70分(含60分)和60分以下的学生人数。
[解答]
SET TALK OFF
CLOSE ALL
CLEAR
STORE 0 TO S1,S2,S3,S4,S5
USE 成绩
DO WHILE,NOT,EOF()
DO CASE
CASE 平均>=90
S1=S1+1
CASE 平均<90 AND 平均>=80
S2=S2+1
CASE平均<80 AND平均>=70
S3=S3+1
CASE平均<70 AND平均>=60
S4=S4+1
OTHER WISE
S5=S5+1
ENDCASE
ENDDO
"90分(含90分)以上的学生人数为:",S1
"80-90分(含80分)的学生人数为:",S2
"70-80分(含70分)的学生人数为:",S3
"60-70分(含60分)的学生人数为:",S4
"60分以下的学生人数为:",S5
USE
SET TALK ON
RETURN
【高手进阶解答】
1.用DO WHILE循环,输入一个数N,求1!+2!+3!+…….+N!
[解答]
SET TALK OFF
CLEAR
INPUT,请输入一个数:” to N
I=1
DO WHILE,T.
K=1
J=1
DO WHILE J<I+ 1 && 条件是J<=N(见下IF语句)
K=K*J && 计算阶乘:每循环一次,K乘一个增大的数
J=J+1
ENDDO
k
I=I+1 && 当 循环一次,I的值增加1
IF I>N && 当 I>N 时,退出循环
EXIT
ENDIF
ENDDO
RETURN
2.打印乘法九九表。
[解答]
CLEAR
I=1
DO WHILE I<=9
J=1
DO WHILE J<=I
STR(I,1)+”*”+STR(J,1)+”=”+STR(I*J,2)+SPACE(2)
J=J+1
ENDDO
I=I+1
ENDDO
RETURN
【自我测试解答】
1.下面程序执行的结果是什么?
SET TALK OFF
CLEAR
STORE,天长地久” TO CH
I = 1
DO WHILE I<8
SUBSTR(CH,I,2) && I为1、3、5、7时,分别截取天、长、地、久
I = I+2
ENDDO
SUBSTR(CH,5,4) && 截取地久两字,并显示
SUBSTR(CH,1,4) && 截取天长两字,并显示
RETURN
SET TALK ON
[解答]
先竖向显示“天长地久”四个字,再横向显示“地久天长”这四个字。
练习六 程序基本结构:循环结构(三)
【实验目的】
1.掌握步长循环:FOR循环的使用
【知识要点】
步长循环FOR:
(1)格式:FOR 循环变量 = 初值 TO 终值 [STEP 步长]
命令语句序列
[LOOP]
[EXIT]
ENDFOR
(2)功能:重复执行FOR与ENDFOR间的循环语句,重复次数取决于内存变量的初值、终值和步长。
(3)说明:
① 若步长为1,则可省去STEP子句;
② 常用于已知循环次数的情况。
【实验内容】
1.输出-5000到5000中能被7整除的偶数。
2.用FOR循环计算1-100之间的偶数和。
3.用FOR循环计算1-100之间的奇数的累乘。
4.输入一个数,求1到此数的和,并可不断输入数,反复运算。
【高手进阶】
1.用FOR循环,输入一个数N,求1!+2!+3!+…….+N!
2.求解世界数学史上有名的“百鸡问题”:鸡公一,值钱五;鸡母一,值钱三;鸡雏三,值钱一,百钱买百鸡,问鸡公、母、雏各几何?
【自我测试】( 5分钟 )
执行下程序后I和S的值为多少。
SET TALK OFF
S=0
FOR I=1 TO 4
S=S+I*I
ENDFOR
I,S
SET TALK ON
【实验过程】
1.输出-5000到5000中能被7整除的偶数。
[解答]
CLEAR
SET TALK OFF
P = -5000
FOR Q = P TO 5000 STEP 2
IF Q%7 = 0
Q
ENDIF
ENDFOR
RETURN
2.用FOR循环计算1-100之间的偶数和。
[解答]
CLEAR
SET TALK OFF
S=0
FOR I=0 TO 100 STEP2
S=S+I
ENDFOR
S
SET TALK ON
RETURN
3.用FOR循环计算1-100之间的奇数的累乘。
[解答]
CLEAR
SET TALK OFF
S=0
FOR I=1 TO 100 STEP2
S=S*I
ENDFOR
S
SET TALK ON
RETURN
4.输入一个数,求1到此数的和,并可不断输入数,反复运算。
[解答]
SET TALK OFF
CLEAR
AA=”Y”
DO WHILE UPPER(AA)=”Y” && 条件:变量AA值为“Y”。
&& UPPER()小写转换大写
INPUT,求1到某数之和,请输入此数:” TO N
P = 0
K = 0
FOR P=0 TO N
P = P+1
K = K+P
ENDFOR
,1到”,N,”之和等于:”,K
ACCEPT "还要继续做吗(Y/N)?" TO AA && 输入的值给变量AA
ENDDO
SET TALK ON
RETURN
【高手进阶解答】
用FOR循环,输入一个数N,求1!+2!+3!+…….+N!
[解答]
SET TALK OFF
CLEAR
INPUT,请输入一个数:” to N
S=0
FOR I=1 TO N
T=1
FOR J=1 TO I
T=T*J
ENDFOR
S=S+T
ENDFOR
S
RERURN
2.求解世界数学史上有名的“百鸡问题”:鸡公一,值钱五;鸡母一,值钱三;鸡雏三,值钱一,百钱买百鸡,问鸡公、母、雏各几何?
[解答] 此题是:公鸡每只五个钱,母鸡每只三个钱,小鸡每三只一个钱,现用100个钱买100只鸡,问各买多少只?
设买公鸡x只、母鸡y只、小鸡z只
则有 x+y+z=100
5x+3y+z/3=100
解之得 5x+3y+(100-x-y)/3=100
因x、y、z只能为正整数,且x<=20、y<=33(因不能全是公鸡或母鸡),则将x从0到20及y从0到33的值代入方程中就可解出方程。
SET TALK OFF
CLEAR
FOR X=0 TO 20
FOR Y=0 TO 33
IF 5*X+3*Y+(100-X-Y)/3=100
,公鸡 母鸡 小鸡”
X,Y,100-X-Y
ENDIF
ENDFOR
ENDFOR
RETURN
【自我测试解答】
执行下程序后I和S的值为多少。
SET TALK OFF
S=0
FOR I=1 TO 4
S=S+I*I
ENDFOR
I,S
SET TALK ON
[解答]
I = 5,S = 12+22+32+42 = 30
练习七 程序基本结构:循环结构(四)
【实验目的】
掌握表扫描循环:SCAN的使用
【知识要点】
表扫描循环SCAN:
(1)格式:SCAN[范围][FOR 条件式]
命令语句序列
[LOOP]
[EXIT]
ENDSCAN
(2)功能:在指定范围内寻找满足条件的记录,并执行循环体中的语句。
(3)说明:常用于对表中全体记录作相同的操作。
【实验内容】
1.用SCAN循环,逐条显示学生表中,所有男生的记录。
2.对学生表,编一个可统计21岁以上有多少人的程序。
3.用“SCAN循环语句”和“DO CASE分支语句” 对成绩表,编“按学生平均分数确定其等级”的程序。
4.编一个统计Xscj表中,平均分的各分数段人数的程序(用SCAN循环)。
5,在成绩表中,找出指定等级的学生记录并统计该等级的学生人数。
【高手进阶】
在学生表和成绩表中查找平均分在80分以上的学生,并逐个显示学号、姓名及平均分。
【自我测试】( 5分钟 )
1.在学生表中查找所有计算机系学生的记录并统计人数。
【实验过程】
用SCAN循环,逐条显示学生表中,所有男生的记录。
[解答]
SET TALK OFF
CLEAR
USE学生
SCAN FOR 性别=”男”
DISPLAY
ENDSCAN
SET TALK ON
RETURN
对学生表,编一个可统计21岁以上有多少人的程序。
[解答]
SET TALK OFF
CLEAR
USE 学生
S=0
SCAN FOR 年龄>21
S = S+1 && 循环一次,变量S增加1
ENDSCAN
,年龄大于21岁的人有:”+STR(S)+”人”
RETURN
用“SCAN循环语句”和“DO CASE分支语句” 对成绩表,编“按学生平均分数确定其等级”
的程序。
[解答]
SET TALK OFF
CLEAR
USE 成绩
REPLACE ALL 平均 WITH (高数+大语+邓论+英语+计算机)/5
SCAN
DO CASE
CASE 平均<60
REPLACE 等级 WITH,不及格”
CASE 平均>=90
REPLACE 等级 WITH,优”
CASE 平均>=75
REPLACE 等级 WITH,良”
CASE 平均>=60
REPLACE 等级 WITH,及格”
ENDCASE
ENDSCAN
RETURN
4.编一个统计Xscj表中,平均分的各分数段人数的程序(用SCAN循环)。
[解答]
SET TALK OFF
CLEAR
USE Xscj
S=0
S60=0
S75=0
S90=0
SCAN
DO CASE
CASE 平均<60
S=S+1
CASE平均>=60 AND平均<75
S60=S60+1
CASE平均>=75 AND平均<90
S75=S75+1
CASE平均>=90 AND平均<=100
S90=S90+1
ENDCASE
ENDSCAN
,60分以下的有”+STR(S)+”人”
,60分到75分有”+STR(S60)+”人”
,75分到90分有”+STR(S75)+”人”
,90分以上的有”+STR(S90)+”人”
RETURN
在成绩表中,找出指定等级的学生记录并统计该等级的学生人数。
[解答]
SET TALK OFF
CLOSE ALL
CLEAR
USE 成绩
S=0
ACCEPT "请输入要查询的学生等级:" TO DJ
SCAN
IF 等级=DJ
DISPLAY
S=S+1
ENDIF
ENDSCAN
S
USE
SET TALK ON
RETURN
【高手进阶解答】
1.在学生表和成绩表中查找平均分在80分以上的学生,并逐个显示学号、姓名及平均分。
[解答]
SET TALK OFF
CLEAR
SELECT 1
USE 成绩
INDEX ON 学号 TAG NO
SET ORDER TO NO
SELECT 2
USE 学生
SET RELATION TO 学号 INTO 成绩
SCAN
IF成绩.平均>=80
?”学号是”+学号+" 的"+姓名+” 同学各科平均为”+ ;
STR(成绩.平均,5,2)+”分”
ENDIF
ENDSCAN
RETURN
【自我测试解答】
在学生表中查找所有计算机系学生的记录并统计人数。
[解答]
SET TALK OFF
CLOSE ALL
CLEAR
USE 学生
S=0
SCAN FOR 系别="计算机系"
DISPLAY
S=S+1
ENDSCAN
"计算机系人数为:",S
USE
SET TALK ON
RETURN