第4 章 程序设计(7年制)_第1页
第4 章 程序设计(7年制)_第2页
第4 章 程序设计(7年制)_第3页
第4 章 程序设计(7年制)_第4页
第4 章 程序设计(7年制)_第5页
已阅读5页,还剩164页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第四章程序设计基础程序是为了完成一项任务而编写的指令的集合。在VFP中可以同时应用面向过程和面向对象两种编程方法,面向对象的程序设计是其主要特色。本章主要介绍的是面向过程的编程方法。程序设计基础命令的执行方式交互执行(命令窗口)程序执行(程序文件)程序:是能够完成一项任务的相关命令的有序集合;程序执行的最大好处:可重复修改可重复执行一个程序可调用另一个程序可完成复杂的数据处理,实现对数据综合性的管理及应用程序的模块结构主模块子模块1子模块2子模块3子模块11子模块12子模块21子模块22子模块31子模块13子模块23子模块24程序逻辑的描述叙述框:判断框:连接框:流程线:基本流程图符号一个简单程序实例SETTALKOFFCLEARUSESTUDENTDOWHILE!EOF()

IF总成绩>360

?学号,姓名,总成绩

ENDIF

SKIPENDDOCLOSEALLRETURN初始化不是表末打开表总成绩>360显示当前记录移动指针结束NNYY程序的建立、修改与执行程序文件:程序以文本文件形式保存在磁盘上,扩展名为:“.PRG”;可通过任何文本编辑器建立;程序的建立与修改可视操作通过“文件”菜单/“新建”/“程序”;“打开”、或“保存”或“另存为”命令通过“常用”工具栏上的“新建”/“程序”;“打开”或“保存”按钮命令操作:MODIFYCOMMAND

[FileName|?]

程序的执行可视操作“程序”菜单的“运行”命令或“常用”工具栏上的“运行”按钮命令方式:DO

ProgramName

程序结束、返回命令命令格式:

RETURNCANCELQUIT格式1:终止程序的运行,并将控制权返回给调用程序或命令窗口格式2:终止程序运行,并将控制权返回命令窗口。格式3:结束程序运行,关闭所有文件,退出VFP,返回控制到操作系统。4.1程序设计概念4.1.1程序设计与算法简介程序设计是根据算法步骤把命令、函数、变量、常量、表达式以逻辑的方组合为程序文件或系统的过程。其一般步骤是:第一步,根据问题要求拟定用计算机求解的策略和步骤,称之为算法。第二步,根据拟定的算法,按照编程语言约定的规则,编写程序代码,即编程。第三步,不断运行、修改程序,即调试程序。

算法是指为解决一个问题而采取的方法和步骤,或者说解决步骤的精确描述。算法分为数值运算算法和非数值运算算法。描述实现算法的逻辑步骤,一般采用流程图方式。流程图分传统流程图;N-S流程图等。传统流程图是用一些图框,流程线以及文字说明来描述操作过程,这样的表示算法,直观,形象,容易理解。一、算法举例:交换两个变量X和Y中所存储的数据。分析:要交换两个变量的数据,需要一个中间媒介的变量,例如T。首先,将X的值赋给T;再将Y的值赋给X,最后,将T的值赋给Y,就完成了交换。根据这个思路,可写出如下算法:

X→TY→XT→Y根据此算法,写VFP程序如下:

T=XX=YY=T123算法的特点与要求特点:1.表达较为自由,表述一个算法,可有多种方式。2.算法与语言无关。3.程序语言与自然语言可以混合使用。要求:1.保证算法的正确性。2.通用性、可扩展性。程序的逻辑性与通用性

1.程序的逻辑性:

要完成数据处理过程,通常应包括三个部分:(1)输入原始数据及其处理要求;(2)按指定要求进行数据处理;(3)输出结果。

2.程序的通用性:

程序应可反复执行,使程序的应用范围更广。通常可采用:

(1)参数传替(2)键盘输入4.2常用命令和语句4.2.1基本输入、输出语句程序最基本的操作就是输入、输出。输入是从键盘或鼠标等设备中接收数据。输出是指将计算机所做的运算结果输出到屏幕或打印机。4.2.1.1输入命令1.键盘输入命令(ACCEPT)格式:

ACCEPT[<提示信息>]TO<内存变量>功能:从键盘接收字符型数据存入内存变量中。说明:(1)<提示信息>表示命令执行时显示的内容。<提示信息>为字符常量、字符变量或字符表达式。(2)<内存变量>表示存储字符数据的字符变量或数值元素。(3)输入的数据作为字符型数据处理,不需要定界符括起来。若使用定界符,则定界符成为输入字符的一部分,并以回车结束输入。例12.1用ACCEPT命令输入某生姓名与性别,STUDENT.DBF中查找该学生并显示。ACCE"姓名:"TOXMACCE"性别:"TOXBUSESTUDENTLISTFOR

姓名=XMAND

性别=XB例:显示STUDENT.DBF中,不同专业学生的姓名,籍贯,专业ACCE"专业:"TOZYSELE姓名,籍贯,专业

FROMSTUDENTWHERE专业=ZY

2.任意类型键盘输入命令(INPUT)格式:INPUT[<提示信息>]TO<内存变量>功能:从键盘接收任意类型的数据存入内存变量。说明:提示用户使用键盘输入数据,数据类型可以是数值型、字符型、逻辑型或日期型,以回车结束输入。(2)提示信息可以时字符型常量、变量或表达式(3)输入字符串时必须加定界符,输入逻辑型常量时要用圆点定界符,输入日期型数据时要用转换函数。例14.2

已知圆半径r,计算圆面积s,球体积v和球表面积

f,其公式为:s=r^2f=4r^2v=4/3r^3INPUT“输入半径R=”TORs=pi()*r^2f=4*pi()*r^2v=4/3*pi()*r^3?“圆面积为:”,s?"球表面积为:",f?“球体积为:",v3.程序暂停、等待接收单字符命令(WAIT)格式:WAIT[<提示信息>][TO<内存变量>][WINDOW[AT<行坐标,列坐标>]][TIMEOUT<等待秒数>]

功能:显示提示并暂停程序运行,按任意键或单击鼠标后程序才继续执行。说明:(1)<提示信息>表示要显示提示的内容,省略提示信息,系统给出“按任意键继续”。(2)TO<内存变量>表示键盘的输入以字符形式存入指定的内存变量。内存变量类型为字符型,宽度为1。(3)WINDOW表示在VFP主窗口右上角的系统消息窗口的位置中显示消息。(4)AT<行坐标,列坐标>指消息窗口在主窗口中的位置坐标。CLEARA="WWW"WAITWAITATOB?B,TYPE('B'),LEN(B)T="WhereistheWindow"waitTwindowswaitTwindowsAT15,10waitTwindowsAT20,10timeout24.2.2注释语句和续行语句

4.2.2.1注释语句注释语句用来给程序加注释,以提高程序的可读性。有以下两种注释语句注释整行格式:*<注释内容>或NOTE<注释内容>行末注释格式:<执行语句>&&<注释内容>4.2.2.2续行标志续行标志“;”,表示本语句尚未结束。

指定缺省驱动器和目录命令格式:SETDEFAULT

TO[<路径>]或者用“工具”菜单的“文件位置”命令4.3控制结构

VFP的程序结构,与其他高级语言一样,分为三种控制结构,各个结构可以实现不同的功能。

VFP程序设计语言的三种控制结构是:

顺序结构、选择结构、循环结构。思考:1.实体之间的三种联系是什么? 2.数据库管理系统采用的三种数据模型是什么?

3.关系数据库有哪三种关系操作?4.3.1顺序结构顺序结构是程序设计中最简单,最常用,最基础的基本结构。该结构命令的排列顺序就是命令的执行顺序,其间既没有分支跳转,也没有重复。开始语句语句语句结束顺序结构流程图例:顺序结构程序设计显示STUDENT.DBF表中所有男性记录USESTDUENTLISTFOR性别=“男”USERETURN选择结构流程图条件Yes条件命令序列ENDIF的下一条命令NoYes命令序列2命令序列1ENDIF的下一条命令No无分支结构分支结构4.3.2选择结构选择结构是指程序执行过程中,需要先对某个条件进行计算,再根据计算结果决定执行哪个语句。常用的选择结构有无分支选择结构、分支选择结构、多分支选择结构。1.无分支选择结构命令格式:IF<条件>

<命令组1>

ENDIF功能:计算条件,若结果为.T.,则执行命令组1。否则执行ENDIF下面的语句。2.分支选择结构分支结构的执行逻辑是:条件满足,执行命令组1。否则执行命令组2。命令格式:IF〈条件〉<命令组1>

ELSE<命令组2>

ENDIFINPUT“X=“TOXIFX>=0?”X的绝对值是:“,ABS(X)ELSE?”X的绝对值是:“,

ABS(X)ENDIFRETURN思考:1.如何使输出结果为确定值X的绝对值?2.能否用IIF()函数编程?CLEARINPUT"输入一个数:"TOXY=IIF(X>0,X,-X)?X,"的绝对值是:",YRETURN说明:

(1)条件可为关系或逻辑表达式,根据〈条件〉的逻辑值进行判断:若逻辑值为T,就执行命令组1,完成后转到ENDIF之后的命令。若逻辑值为F时,执行命令2,完成之后转去执行ENDIF之后命令。(2)IF—ENDIF结构命令可以通过多层嵌套以实现多条件的选择。流程控制命令—IF输入三角形的三个边长A、B、C:(1)若A、B、C能构成三角形,则计算出三角形面积;否则提示“不能构成三角形!”。(2)若构成的三角形为直角三角形,给出“构成直角三角形”的提示。提示:三个数能构成三角形的三条边长的充分必要条件是:三个数均大于0。任意两条边长的和大于第三边.。式中:S:面积W:周长/2SETTALKOFFCLEAR(计算三角形.PRG)?"计算三角形面积,请输入三角形的三个边长:"INPUT"A="TOAINPUT"B="TOBINPUT"C="TOCIFA+B>C.AND.

B+C>A.AND.

C+A>B W=(A+B+C)/2 S=SQRT(W*(W-A)*(W-B)*(W-C))

IFA^2+B^2=C^2.OR.B^2+C^2=A^2

.OR.C^2+A^2=B^2 ?"构成直角三角形."

ENDIF ?"三角形面积=",SELSE ?"输入的三个边长不能构成三角形!"ENDIFSETTALKON闰年问题一个年份满足以下条件之一即为闰年:能被4整除且不能被100整除能被4整除也能被400整除INPUT“输入年号:”TOnYearIFMOD(nYear,4)=0

AND(MOD(nYear,100)<>0ORMOD(nYear,400)=0)

?nYear,”是闰年“ELSE

?nYear,”不是闰年”ENDIFRETURN流程控制命令—IF编写程序由键盘输入A,B,C三个数,按值的大小顺序显示出来。分析:先比较任意两个数,并将其中的大数存入内存变量M,小数存入N。再将第三个数与M及N比较得到三个数的大小顺序。CLEAR?"对三个数排序,请输入三个数:"INPUT"A="TOAINPUT"B="TO

BINPUT"C="TO

CIFA>B

M=A

n=BELSEM=BN=AENDIFIFC>M?C,M,NELSE

IFC<N?M,N,C

ELSE?M,C,N

ENDIFENDIF格式:&<字符型变量>功能:替换出字符型变量的内容,即&的值是变量中的字符串。宏替换可以嵌套使用。注意:1.&函数后的变量必须是字符型;2.字符变量的值可以是数字,也可以是字母或汉字,如果是数字,&函数的结果是数值型数字;如果变量的值是字母或汉字,&函数的结果就是以该字母或汉字命名的变量,那么,此变量必须先赋值。例如:宏替换函数A=“123”B=“456”?A+B,&A+&B?&A+B(出错,为什么?)下面程序运行的结果为______:

x='1‘

y='2‘

c='x+y‘

?&c例12.10建立一个在任意表中查询学号的程序(学号查询-IF.PRG)clearaccept"输入表的名字:"tobmUse

&bmaccept"输入要查询的学号:"tommmLOCATEFOR

学号=mmmifFOUND()

dispelse?“查无此人!"endifUsereturn4.3.3.多分支选择命令DOCASE当供选择的结果多于两个时,使用多分支选择结构更方便。格式:DOCASE

CASE〈条件1〉 〈命令组1〉

CASE〈条件2〉〈命令组2〉 …

[OTHERWISE 〈命令组n+1〉]

ENDCASE功能:执行第一个满足条件的命令集合。说明:(1)DOCASE

与ENDCASE

必须成对出现。(2)执行顺序:先计算表达式1,如为.T.,执行命令组1;如为.F.,继续判断表达式2……,直到找到条件为真者。如都不为真,则执行OTHERWISE后的语句(如果没有OTHERWISE,则直接执行ENDCASE后面的语句。(3)在多分支结构中,若有多个条件为真,只能执行第一个为真者。流程控制命令—DOCASE某班学生计算机考试成绩已登记到COMPUTER.DBF自由表的成绩(N型)字段中,另有评估(C6)字段。编程序对每个学生计算机的成绩进行评估:“优秀”(90-100)“良好”(80-89)“中等”(70-79)“及格”(60-69)“不及格”(0-59),写到评估字段中.CLEARUSECOMPUTER……DOCASE

CASE

成绩>=90

REPLACE

评估WITH“优秀”

CASE

成绩>=80

REPLACE

评估WITH“良好”

CASE

成绩>=70

REPLACE

评估WITH“中等”

CASE成绩>=60

REPLACE

评估WITH“及格”

OTHERWISEREPLACE

评估WITH

“不及格”ENDCASE……思考:如果程序中将CASE成绩>=60REPLACE评估WITH“及格”作为第一个判断条件,执行完程序后的结果是什么?流程控制命令—DOCASECLEARSTORE0TOX,S1,S2,S3DOWHILEX<10X=X+1DOCASECASEMOD(X,2)=0 S1=S1+X/2CASEINT(X/3)=X/3 S2=S2+X/3CASEINT(X/2)<>X/2 S3=S3+1ENDCASEENDDO?INT(S1),INT(S2),INT(S3)RETURN写出下列程序的结果4.2.4循环结构程序设计循环结构是指对某些语句通过条件判断决定是否重复执行,如果条件为.T.,则重复执行,否则终止循环。

VisualFoxpro中给出三种循环结构:“当型”(DOWHILE);“步长型”(FOR-NEXTfor-endfor);“表扫描型”(SCAN)。1.当型循环命令DOWHILE

结构:

DOWHILE〈条件表达式〉 [命令组]

[LOOP]

[EXIT]

ENDDO

功能:当给定的条件为真,就使DOWHILE…ENDDO之间的命令重复执行,实现程序循环。否则跳出循环,执行ENDDO后面的语句。CommandslExpressionYLOOPNEXIT说明:(1)如果条件为.T.,则执行DOWHILE和ENDDO之间的[命令组],当命令组包含的命令执行完后,程序自动返回到DOWHILE,每执行一遍就判断一次。如果条件为.F.,则跳过DOWHILEHE和ENDDO之间的命令组,结束循环,转去执行ENDDO之后的命令。(2)EXIT选项跳出循环,执行ENDDO后的语句。(3)DOWHILE…ENDDO必须成对出现,并且DOWHILE…ENDDO可进行嵌套,形成多重循环。例12.10在数据库Student·DBF中找出所有男性的学生。

USESTUDENTDOWHILE.T. IF性别=

‘男’

DISPLAY ENDIF SKIP

IFEOF()

EXIT ENDIF

ENDDO思考:去除程序中黄色命令后,要保持程序功能,如何修改程序?例:STUDENT.DBF是一个学生信息文件,其中包含学号、姓名等字段,而且已按“学号”建立了索引,索引文件名是XH.IDX;CJ1.DBF是成绩文件,其中包含学号、课程名、成绩字段,而且已按“课程名”建立了索引,索引文件名是CJ1.IDX。请编程显示输出选修“计算机基础”课程的学生姓名和成绩。

程序(xsxx)如下:SETTALKOFFSELECT1USESTUDENTINDEXXHSELECT2USECJ1INDEXCJ1locatefor课程名="计算机基础"DOWHILEFOUND() SELECTSTUDENT SEEKCJ1.学号

?姓名+“:”

SELECTCJ1 ??成绩

CONTINUEENDDOCANCEL思考:利用建立临时关系的方法,如何修改程序?(多表查询.Prg)有一职员数据库Stff_10。数据库中有YUANGONG、ZHIBAN表,YUANGONG的表结构是职工编码C(4)、姓名C(10)、夜值班天数Ⅰ昼值班天数Ⅰ加班费N(10,2)。ZHIBAN表的库结构是值班时间C(2),每天加班费N(7,2),ZHIBAN表中只有两条记录,分别记载了白天和夜里的每天加班费标准。请制作一个菜单,菜单上有两个菜单项,分别是“计算”和“关闭”,计算菜单应完成下列要求。:1.计算YUANGONG表的加班费字段值.计算方法是:加班费=夜值班天数*夜每天加班费+昼值班天数*昼每天加班费.根据上面的结果,将员工的职工编码、姓名、加班费存储到staff_d表中,并按加班费降序,如果加班费相等,则按职工编码的升序排列settalkoffopendatabasestaff_10select2

usezhibanselect1useyuangongindexon职工编码tobmdowhile!eof()select2GOTOPreplacea->加班费witha->夜值班天数*每天加班费

skip

replacea->加班费witha->加班费+a->昼值班天数*每天加班费

select1skipenddosorton加班费/d,职工编码/atostaff_dfields职工编码,姓名,加班费usestaff_dBROWSEclosedatabasesettalkon*统计按纽CLICK事件程序代码:SETTALKOFFCLOSEALLOPENDATASTU_7SELE1USEXUESHENGINDEXON学号TOXH1SELE2USECHENGJIINDEXON学号TOXH2TOTALON学号TOABCUSEABCINDEXON学号TOXH3SELE1SETRELATO学号INTOABCGOTOPDOWHILE

!EOF()REPLXUESHENG.平均分WITH

ABC.成绩/4

SKIPENDDOSORTON平均分,学号TOPINGJUNUSEPINGJUNBROW题目同第三章查询*统计按纽CLICK事件程序代码:SELECTXuesheng.学号,Xuesheng.姓名,AVG(Chengji.成绩)AS平均分;

FROMstu_7!xueshengINNERJOINstu_7!chengji;ONXuesheng.学号=Chengji.学号;

GROUPBYXuesheng.学号;

ORDERBY平均分,Xuesheng.学号;

INTOTABLEpingjun.dbfSELE

PINGJUNBROW题目同第三章查询例题:共有五个数据表文件std1.dbf-std5.dbf,下面程序的功能是删除每个表文件的末记录。请填空。(程序填空-3.prg)n=1DOWHILEn<=5 db=① USE&db

② DELETE PACK n=n+1ENDDOUSE 例11-15打印九九乘法表

A=1B=1 DowhileA<=9

DowhileB<=9 T=A*B ??T B=B+1

ENDDO A=A+1 ?

Enddo

Cancel思考:1.要打印九九表如何修改程序?2.要打印无重复值的九九表如何修改程序?P88例4.14有错误2.步长型循环命令FOR命令格式:FOR<内存变量>=<初值>

TO<终值>

[

STEP<步长值>][命令组][EXIT][LOOP]ENDFOR[或NEXT]循环次数=INT((终值-初值)/步长)+1功能:根据给定的循环次数重复执行一组命令,实现程序循环。Var

>or<

nFinalValueCommandsNYEXITLOOPVar=

nInitialValueVar=Var±nIncrement说明:(1)<内存变量>相当于一个计数器。(2)<初值>是计数器开始值;<终值>是计数器的终止值.(3)<步长值>是计数器值的增长或减少量,如果是负数,则计数器被减小,缺省STEP,步长值为1,<初值>、<终值>和<步长值>均为数值型表达式。(4)

FOR与NEXT必须成对出现。S=0FORI=1TO10S=S+IENDFOR?”S=“,SS=0FORI=1TO9STEP2S=S+IENDFOR?”S=“,SFORI=1TO9STEP2 ??SPACE(11-I)FORK=1TOI ??"*" ENDFOR ?ENDFOR例:写程序结果:I=I+1S=0FORI=9TO1STEP-2S=S+IENDFOR?”S=“,S例:输出Fibonacci(斐波纳契)数列的前20个数1,1,2,3,5,8,13,…。

算法:Fibonacci(斐波纳契)序列是一种整数数列,其中每一个数等于前两个数之和。

程序如下:clearf1=1f2=1?f1,f2forj=2to10

f1=f1+f2f2=f2+f1??f1,f2endforreturn 设:Fibonacci

序列数用变量f1,f2表示;首先f1=f2=1变量J由2~10每次+1当J=2f1=f1+f2(F1=1+1)f2=f2+f1(F2=1+2)??f1,f2当J=3f1=f1+f2(F1=2+3)f2=f2+f1(F2=3+5)??f1,f2…例:找出100~999之间的所有“水仙花数”。所谓“水仙花数”是指一个三位数,其中各位数字的立方和等于该数本身(如153=13+53+33)。设I

代表三位数,a,b,c分别代表该三位数在百位、十位和各位上的三个数字。 算法1:

a=int(I/100)

例如int(153/100)

等于1

b=int((I-100*a)/10)

例如int((153-100*1)/10)

等于5

c=I-int(I/10)*10

例如153-int(153/10)*10

等于3算法2:s=str(I,3)1将一个三位数转换成字符串

a=val(left(2,I))b=val(subs(s,2,1))c=val(right(s,1)ForI=100to999 a=int(I/100)b=int((I-100*a)/10)c=i-int(I/10)*10 IFI=A^3+B^3+C^3??IENDIFENDFOR作业:用算法2编程,找出100~999之间的所有“水仙花数”例题:写程序的运行结果

X=“计算机科学与计算机工程技术”

Y=""DOWHILELEN(X)>=2 FORP=15TO1STEP-12

Y=Y+SUBSTR(X,1,2)

X=SUBSTR(X,P) ENDFOR Y=Y+RIGHT(X,4)ENDDO?YRETURN作业题1.程序的最终结果是什么?2.循环的中间结果是什么?3.数据表扫描循环SCAN结构:

SCAN[范围>][FOR/WHILE<条件>][命令组][EXIT][LOOP]ENDSCAN

功能:对当前表中符合条件的记录按照命令组序列进行处理,SCAN表示循环开始,并按指定条件移动记录指针;ENDSCAN表示一次循环结束,使循环返回.

!EOF()CommandsNYEXITLOOPSKIP说明:(1)<范围>:指定记录的查找范围,只查找指定<范围>内的记录。若省略<范围>,则默认为ALL。(2)FOR<条件>]只对<条件>为·T·的记录执行命令组,利用FOR子句可以过滤掉用户不需要的记录;[WHILE<条件>]指定一个条件,只要<条件>的计算结果为真(·T·)就执行命令组。(3)[EXIT],[LOOP]用法同前面循环结构。(4)SCAN自动把记录指针移向下一个符合指定条件的记录,并执行同样的命令组。例12.15查询输出所有临床医学专业、五年学制学生的学号,姓名,专业,学制.SETTALKOFFCLEARUSESTUDENTSCANFOR专业=‘临床医学”·AND·学制=‘五’

DISPLAY学号,姓名,专业,学制ENDSCANUSECANCEL例:显示STUDENT.DBF中所有年龄小于22岁的女生的记录

(修改程序中的错误)USESTUDENTSCANFOR性别=“女”AND;YEAR(DATE())-YEAR(出生年月)<22

DISPLAYENDSCANUSE

条件循环

FOR-NEXT循环

I=1FORI=1TOnDOWHILE

i<=n<命令序列><命令序列>ENDFORI=I+1ENDDO

条件循环

扫描循环

GOTOPSCANDOWHILE!EOF()

处理一个记录

处理一个记录

ENDSCANSKIPENDDO条件、步长、扫描三种方式的比较

在循环语句的循环体中可以插入LOOP、EXIT语句,其命令功能是:

LOOP

能使执行转向循环语句头部继续循环。

EXIT

用来立即退出循环,转去执行ENDDO,ENDFOR或ENDSCAN后面的语句。

注意:在DO循环语句中执行LOOP语句,将直接将控制权转到DOWHILE

语句;在FOR循环语句中执行LOOP语句,将会先修改循环变量的值,然后转向FOR语句。在SCAN循环语句中执行LOOP语句,将会先移动记录指针,然后转去判断循环条件。

循环辅助语句1.数组的定义

数组是用一个内存变量名表示顺序排列的一组数据的有序集合。其中内存变量名为数组名,顺序号称为数组的下标值,它必须放在数组名后面的括号(圆括号或方括号)内。每一个数组名下标值表示一个数组元素。数组元素的使用与内存变量完全相同,所以数组元素也称为下标变量。要使用一个数组,必须事先定义。数组大小由下标值的上、下限决定,下限规定为1。4.4数组及其应用创建数组的命令格式是:

DIMENSION<数组名>(下标上限1>[,(下标下限2>)[,……]

DECLAR<数组名>(下标上限1>[,(下标下限2>)[,……]功能:定义一个或多个一维或二维数组。注意:1.以上两种格式功能完全相同。数组创建后,系统自动给每个数组元素赋以逻辑假(.F.)。2.下标值可为常数、变量或表达式,但必须大于0;4.4.1数组的创建例如,DIMENSIONX(5),Y(2,3)命令定义了两个数组:一维数组X含5个元素:

x(1)、x(2)、x(3)、x(4)、x(5)。二维数组y含6个元素:

y(1,1)、y(1,2)、y(1,3)、y(2,1)、y(2,2)、y(2,3)。可以用一维数组的形式访问二维数组。例如,数组Y中的各个元素用一维数组形式可依次为:

y(1)、y(2)、y(3)、y(4)、y(5)、y(6)

其中y(4)与y(2,1)是同一变量。例:用数组存储下列矩阵

1357911131517192123算法:1.用双重循环将矩阵存入数组X(3,4),外循环控制行,内循环控制列。2.矩阵系数用变量K赋值,K从1到23,每次递增2。3.输入数据的同时输出结果。解:使用下列语句

cleardimensionx(3,4)k=1fori=1to3forj=1to4x(i,j)=kk=k+2??x(i,j)endfor

?endfor例:STUDENT.DBF表的结构如右图,写出程序结果。dimea(4)usestudentcountfor性别=”男”toa(1)countfor成绩>70.and.成绩<80toa(2)averfor性别=”男”toa(3)countfor性别=”女”.and.成绩>60toa(4)I=1DowhileI<=4 ?”a(I)=”,a(I) I=I+1

Enddo

Return1.将数据表之间的数据传递给数组命令:格式:SCATTER[FIELDS<字段名表>]TO<数组名>[MEMO]功能:复制当前记录中指定字段的数据到数组或变量中。MEMO:指定备注字段可以参加复制。默认情况下,SCATTER命令不处理备注字段。4.4.3数组与数据表之间的数据传递格式:GATHERFROM<数组名>[FIELDS<字段名表>][MEMO]功能:用指定数组中的数据替换当前表当前记录中的数据。注意:数组与表文件各字段的类型必须一致。将数组中的数据传递给数据表的命令例:在STUDENT表的末尾增加一个空白记录,然后将首记录字段值复制到空白记录中。(注意:STUDENT表中不能建立主索引或者侯选索引)USESTUDENTAPPENDBLANKGOTOPSCATTERTORECODERMEMOGOBOTTOMGATHERFROMMEMO例:计算并输出第N个Fibonacci(斐波纳契)数算法:Fibonacci(斐波纳契)序列是一种整数数列,其中每一个数等于前两个数之和。

CLEARINPUT"N="TONDIMENF(N)STORE1TOF(1),F(2)??F(1),F(2)FORI=3TONF(I)=F(I-1)+F(I-2)??F(I)ENDFOR??“第”,N,“个Fibonacci数是",F(N)

程序设计的基本技巧记录的交换随机数的生成奇偶数的判定素数的判定一元二次方程的求解公式计算迭代运算求和求积计数求最大值求最大值两数组的加法两数组的乘法数组的转置排序程序的模拟运行写出程序的运行结果程序填空字符图形打印图形例:编写程序打印如下图形(图中第一行第一个*在第3列输出)。

fori=1to7 ??space(2*i) for_____________ ??"*" endfor

?endfor记录的交换将STUDENT表中的首记录与末记录交换USESTUDENTGOTOPSCATTERTO

FirstRecordGOBOTTOMSCATTERTOEndRecordGOTOPGATHER

FROM

EndRecordGOBOTTOMGATHER

FROM

FirstRecord思考题:如何交换任意两条记录?提示:这两条记录的记录号通过键盘输入指定。随机数的生成为了生成某个范围内(大于或等于小数而小于大数)的随机整数,可使用公式:INT(rand()*(upper-lower+1)+lower)随机生成20个大于或等于10小于100的随机整数DIMENSIONR(20)FORI=1TO20 R(I)=INT(RAND()*(100–10+1)+10)??R(I)ENDFOR随机生成20个大于或等于10小于100的随机数(保留两位小数)。DIMENSIONR(20)FORI=1TO20 R(I)=INT((RAND()*(100-10+1)+10)*100)/100??R(I)ENDFOR奇偶数的判定偶数的定义:能被2整除的数偶数的判定方法:

x/2=int(x/2)x%2=0MOD(x,2)=0思考:如何判定3的倍数?如何判定一个数同时被3和7整除?例:写出下列程序结果S=0J=1FORI=1TO5 J=J*I IF(I%2)=0 S=S+JENDIFENDFOR?"SUM=",SRETURN例:编程计算1~100

中奇数之和。CLEARCLEARI=1S=0

S=0FORI=1TO100DOWHILEI<=100 IFINT(I/2)<>I/2IFINT(I/2)<>I/2

S=S+IS=S+I

ENDIFENDIF

I=I+1ENDFOR

ENDDO?“1~1000中奇数之和是:”,SRETURN思考:怎样输出1-100之间的每个奇数?例12.14统计数0~100之间不是3的倍数的数,并求其累加和。SETTALKOFF(不是3的倍数.PRG)STORE0TOM,N fori=1to100

IFINT(i/3)*3<>I&&判断i是3的倍数吗?

LOOP

ELSE M=M+i &&求不是3的倍数的数之和

N=N+1&&统计不是3的倍数的个数

?N,I&&输出不是3的倍数的数

ENDIFENDFOR?“在0~100之间一共有”,N,“个不是3的倍数的数”,“其和为:”,MSETTALKON素数的判定素数,也称质数,就是一个大于2且只能被1或自身整除的数素数的判定(判别M是否是素数):用M从M=2,3,4,…到N-1各数整除,如果都除不尽,则x是素数。每次判断N/M余数是否为0,如果每次都不为0,则N必为素数。

素数的判定INPUT“请输入一个大于2的自然数:”TONK=.T.&&K的值为.T.表示输入的数是素数,为.F.表示不是素数.FORM=2TON-1 IFMOD(N,M)=0 K=.F. EXIT ENDIFENDFORIFK ?STR(N)+“是素数"ELSE ?STR(N)+“不是素数"

ENDIF3~100之间素数的判定CLEAR?FORI=3TO100J=2DOWHILEJ<I IF

mod(i,j)=0&&J能否整除i或者INT(I/J)=I/J EXIT ENDIF J=J+1ENDDOIFJ=I&&如果除数J=I为素数

??IENDIFENDFORRETURN思考:如何计算并输出3~100间有几个素数?一元二次方程的求解ax2+bx+c=0输入a,b,c(方程.prg)计算△=b2-4ac如果a=0输出X=-C/B否则:如果△>0输出两个不同的实根X1=(-b+sqrt(△))/(2a)X2=(-b-sqrt(△))/(2a)如果△=0输出一个实根X=(-b)/(2a)如果△<0输出“方程无实根”INPUT"Givecoefficientsa:"TOaINPUT"Givecoefficientsb:"TObINPUT"Givecoefficientsc:"TOcdelta=b*b-4*a*c&&计算判别式Δdocasecasea=0?"Onerootat",-C/BCASEdelta>0&&判别式Δ>0S=SQRT(discr)?"Therootare:"?"X1=",(-b+S)/(2*A)?"X2=",(-b-S)/(2*A)CASEdelta=0&&判别式Δ=0?"Therootis:"?"X=",(-b)/(2*A)OTHERWISE&&判别式Δ<0?"Norealroots."ENDCASE求和(迭代)直到最后一项小于10-4为止直到最后一项的绝对值小于10-4为止S=0FORN=1TO100S=S+NENDFOR迭代是指重复执行一组指令(或一定步骤),,每次执行这组指令时,都从变量的原值推出它的新值。求和S=11+12+13+…+20s=0s=s+11s=s+12s=s+13s=s+14s=s+15s=s+16s=s+17s=s+18s=s+19s=s+20s=0FORI=11TO

20

s=s+iENDFORs=0i=11Dowhile

i<=20

s=s+I

i=i+1ENDDOs=0FORI=20TO

11STEP-1

s=s+iENDFORs=0i=20Dowhile

i>=11

s=s+I

i=i-1ENDDO例:用π/4≈1-1/3+1/5-1/7+…公式求π的近似值,直到最后一项的绝对值小于10-4为止。T=1Pi=0N=1S=1Dowhileabs(t)>0.0001 pi=pi+t n=n+2&&计算分母

s=-s &&计算分子

t=s/nEnddoPi=pi*4?”最后一项的绝对值小于10-4时π=”,pireturn求积S=1*2*3*…*10s=1s=s*1s=s*2s=s*3s=s*4s=s*5s=s*6s=s*7s=s*8s=s*9s=s*10s=1FORI=1TO10 s=s*iENDFORs=1FORI=10TO1STEP-1 s=s*iENDFORs=1i=10Dowhile

i>=11 s=s*i

i=i-1ENDDOs=1i=1Dowhilei<=10 s=s*i

i=i+1ENDDOS=n!=n*(n-1)!作业:编程求1!+2!+3!+……+N!T=1&&T1=1S=T&&S1=1FORI=2TO100 T=T/I

&&T=(2-1)/2,1/2/3,1/2/3/4,… S=S+T&&S=1+1/2+1/6+1/24+…ENDFOR?“S=”,S用程序(求阶乘之和.prg)建立了迭代关系计数的基本方法统计数组A中的正数的个数a(1):37a(2):-37a(3):37a(4):-37a(5):-37a(6):37a(7):37a(8):-37a(9):37a(10):0a(11):37c=0FORI=1TO11 IFa(i)>0 c=c+1 ENDIFENDFORSTORE0TO

c1,c2FOR

I=1TO11 IFa(i)>0 c1=c1+1 ELSE IFa(i)<0 c2=c2+1ENDIF ENDIFENDFOR功能扩展统计数组A中的正、负数的个数求最大值、最小值假设A为一维数组,求值最大的元素maxs=a(1)FORi=2TO10 IFmaxs<a(i)

maxs=a(i) ENDIFENDFORmaxs=a(1)Position=1FORi=2

TO10 IFmaxs<a(i)

maxs=a(i) position=i ENDIFENDFOR功能扩展变量Position的作用是?例题:编程产生N个两位(10~100)随机整数,输出这些数中的最大、最小数。(程序填空)

INPUT"N="TON DIMENX(____) J=1 DOWHILEJ<=N

X(i)=int(rand()*90+10)

__________ ENDDO

mx=x(1) mi=x(1) FORI=2TON ifx(i)>mx mx=____

endif

ifx(i)<mi ____=x(i)

endif endfor

?"最大数是",MX,"最小数是",MI矩阵的加法完全相同的两个数组可作加法,如:其中:cij

=aij+bijFOR

i=1

TO4 FOR

j=1TO

3

c(i,j)=a(i,j)+b(i,j) ENDFORENDFORA矩阵59261037114812B矩阵235689101112矩阵的乘法要求:A矩阵的列数(n)与B矩阵的行数(m)相同。得到的乘积矩阵为M*N其中:cij=ai1*b1j+ai2*b2j+ai3*b3j+ai4*b4jFOR

i=1TO

3 FORj=1

TO3C(I,J)=0 FORK=1

TO

4 c(i,j)=c(i,j)+a(i,k)*b(k,j) ENDFOR ENDFORENDFOR其中I=1,2,3j=1,2,3矩阵的转置将m*n的矩阵A的行和列互换,得到n*m的矩阵AT,AT称为A的转置矩阵.其中:bij=ajiFORi=1

TO3 FOR

j=1

TO4 b(i,j)=a(j,i) ENDFORENDFOR矩阵A123456789101112AT矩阵59261037114812排序排序的方法冒泡法两两比较法选择法基排归并法堆排SHELL排序法…排序方法—冒泡法a(i)a(j)编号1#2#3#4#5#6#7#8#数据<降序52793684指示器i指示器j52指示器j75757指示器j99779指示器j3比较成立,则交换:指示器j6指示器j8指示器j4a(i)a(j)t123排序方法—冒泡法FORi=1TO7 FORj=i+1TO8 IFa(i)<a(j) t=a(i) a(i)=a(j) a(j)=t ENDIF ENDFORENDFORSETTALKOFFDIMENSIONa(8)CLEARFORi=1TO8 ii=ALLTRIM(STR(i)) p="Enter"+ii+"'thnumber:" INPUTpTOa(i)ENDFORFORi=1TO8 ?a(i)ENDFORSETTALKON按降序排序例:随机产生10个3位(100-999)整数,并按从小到大的顺序输出DIMENSIONA(10)FORI=1TO10 A(I)=INT(RAND()*900+100)&&循环产生10个3位随机整数ENDFORFORI=1TO9 FORJ=I+1TO10 IFA(I)>A(J)&&按从小到大的顺序排序

Q=A(I) A(I)=A(J) A(J)=Q ENDIF ENDFORENDFORFORI=1TO10&&循环输出排序后的数??A(I)ENDFORRETURN

思考:1.怎样按从大到小的顺序输出?2.

如果不要最后一个循环,怎样输出排序后的数?

按升序排序排序方法—选择法选择排序(SELECTSORT)的基本思想是:先在未排序的序列中选一个最小元素,作为已排序子序列;然后再重复地从未排序子序列中选取一个最小元素,把它加入已排序的数列,作为已排序子数列的最后一个元素,直到把未排序子数列中的元素处理完为止。排序方法—选择法FORi=1TO7 pos=i FORj=i+1TO8 IFa(pos)<a(j) pos=j ENDIF ENDFOR t=a(i) a(i)=a(pos) a(pos)=tENDFORSETTALKOFFDIMENSIONa(8)CLEARFORi=1TO8 a(i)=INT(RAND()*90)+10ENDFORFORi=1TO8 ??a(i)ENDFOR?SETTALKON按降序排序排序方法—两两比较法a(i)a(i+1)编号1#2#3#4#5#6#7#8#数据<降序52793684比较成立,则交换指示器i第一轮比较,…,共比较N-1轮。52指示器i277272指示器i299292指示器i233232指示器i266262指示器i288282指示器i244242排序方法—两两比较法FORj=1TOnum-1 FORi=1TOnum-1 IFa(i)>a(i+1) t=a(i) a(i)=a(i+1) a(i+1)=t ENDIF ENDFORENDFORSETTALKOFFINPUT"Enternumber:"TOnumDIMENSIONa(num)CLEARFORi=1TOnum a(i)=INT(RAND()*90)+10ENDFORFORi=1TOnum ??a(i)ENDFOR?SETTALKON按升序排序思考:如何加快排序速度?排序方法—基排5247952479数组a下标.f..f..f..f..f..f..f..f..f.值12345678911111要点:以数据值作为数组的下标在相应元素作一个标记,为输出排序结果做准备排序方法—基排SETTALKOFFDIMENSIONA(9)FORI=1TO7 INPUTTOx a(x)=1ENDFORFORi=1TO9 IF!EMPTY(a(i)) ?i ENDIFENDFORSETTALKONRETURN优点:排序速度最快缺点:只能对无重复的数据排序只能对正整数排序必须知道数据的范围所占空间大改良:对有重复的数据集排序?对具有小数的数据集排序?对具有负数的数据集排序?检测数据的范围?排序方法—基排法的改良SETTALKOFFDIMENSIONa(9)a

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论