1、程序设计基础——专题(一) 第一部 分 数学问题 一、基本算法: 数学数值问题的基本运算主要涉及到的算法有:累加、累乘、整除和求余数。 1、 累加 主要是通过循环变量来控制循环结构,一般有两个变量,一是循环变量I和累加值变量S。 主要语句有: S=0 && 为累加合值初始化 FOR I=[初始值] TO [终止值] STEP [步长] && 或DO WHILE <条件表达式> 循环体内语句系列 S=S+F(I) ENDFOR && 或ENDDO ?S &
2、输出累加合值S 2、 累乘 主要是通过循环变量来控制循环结构,一般有两个变量,一是循环变量I和累乘值变量S。 T=1 && 为累乘值初始化 FOR I=[初始值] TO [终止值] STEP [步长] && 或DO WHILE <条件表达式> 循环体内语句系列 T=T*F(I) ENDFOR && 或ENDDO ?T &&输出累加合值S 3、 整除 主要采用取整函数INT()、求余函数MOD()和求余运算符%。设X,Y均为整型数值表达式,判断X是否被Y整除的
3、表达式的常用方法有: (1)INT(X/Y)=X/Y (2)MOD(X,Y)=0 (3)X%Y=0 (4)X-Y*INT(X/Y)=0 4、 求余数 主要采用取整函数INT()、求余函数MOD()和求余运算符%。设X,Y均为整型数值表达式,求X被Y整除后余数的表达式的常用方法有: (1)X-INT(X/Y) (2)MOD(X,Y) (3)X%Y 5、 两个变量值的置换 对两个数的置换,主要处理的是将两个变量的值进行互换。设有两个变量X,Y,通过中间变量T和赋值语句后,将X和Y变量值互换。 T=X X=Y Y=T 6、 求一组数的最大值和最小值
4、设在数组A有10个元素,且都已赋值,现要求这10个元素中的最大值,可采用两两相互比较后再使用两变量值置换的语句来完成。其主要算法有: MAX=A(1) && 创建最大值变量MAX,并将A(1)赋值给MAX MIN=A(1) && 创建最大值变量MAX,并将A(1)赋值给MAX FOR I=2 TO 10 &&将数组的每一个变量与MAX或MIN比较后,改变MAX和MIN的值 IF A(I)>MAX MAX=A(I) ENDIF IF A(I)<=MIN MIN=A
5、I) ENDIF ENDFOR ? MAX,MIN &&输出最大值和最小值 7、 求两个数的最大公约数和最小公倍数 用2至这两个数的最小值之内任何一个数作为一个循环变量去除这两个数,若能找到一个数能同时被这两个数整除。则这个数就是他们的最大公约数,而这两个的乘积除以最大公约数后得到的值就是这两个数的最小公倍数。设有两个变量X,Y,中间变量I,主要的算法有: N=MIN(X,Y) FOR I=N TO 1 STEP –1 IF X/I=INT(X/I)AND INT(Y/I)=Y/I GYS=I EXIT
6、 ENDIF ENDFOR ?”最大公约数为:”,GYS ? ”最小公倍数为:”,X*Y/GYS 8、 判断X是否是素数(质数、完数) 素数:除被1和本身整除外不能被其他数整除。 用2至X之内的任一数去除X,若找到一个数能被X整除,则表示X不是素数,否则X是一个素数。 常用算法: FOR I=2 TO X-1 IF X%I=0 或 INT(X/I)=X/I 或 MOD(X,I)=0 EXIT ENDIF ENDFOR IF I=X ?X,“是一个素数” ELSE ?X,“不是一个素数” ENDIF 9、 从十进制整数中取出数码
7、将该数值除10后取余数,可得到该数值中的个位数码,然后用该数值除以10后的商去替代该数值,再除以10取其余数,得到十位数数码,依次类推,直到得到的商为零为止。设X是一个整数,其常用的得法有: I=1 DO WHILE N>0 P=MOD(N,10) 取某位的数码 ?”该数值从右往左第”+STR(I)+”位的数码为:”,P N=INT(N/10) IF N=0 EXIT ENDIF ENDDO 10、判断一个数是否是一个正整数、奇数或偶数 (1)正整数 IF INT(X)=X AND ABS(X)=X
8、 ?X,“是一个正整数!” ELSE ?X,“不是一个正整数!” ENDIF (2)奇、偶数 IF INT(X)=X AND INT(X/2)=X/2 ?X,“是一个偶数!” ESLE ?X,“是一个奇数!” ENDIF 二、 典型例题 1、 求1到10所有自然数之和(程序运行后的结果是否是55) SET TALK OFF S=0 FOR I=1 TO 10 S=S+I ENDFOR ?"1到10之和为:",S &&改成 ?"1到10之
9、和为:",S 行吗?请说明理由 CLEAR SET TALK ON 问题:(1)求从1到100的所有奇数(或偶数)之和 (2)求从1到X的所有自然数之和,其中X的值可由用户通过键盘输入。 (3)求出从1到N之间所有整数的平方和并输出结果。 (4)上述程序采用DO WHILE ……ENDDO应如何编写? 2、 求10! SET TALK OFF CLEAR T=0 FOR I=1 TO 10 T=T*I ENDFOR ?"10!为:",T SET TALK ON 3、 求从正整数K到M值的阶乘之和,其中K和M值均由用户通过键盘输入。
10、 SET TALK OFF CLEAR INPUT "K=" TO K && 改成 ACCEPT "K=" TO K 行吗,请说明理由 S=0 FOR I=K TO M T=1 FOR J=1 TO I T=T*J ENDFOR S=S+T ENDFOR INPUT "M=" TO M ? STR(K,2)+"!+…"+STR(M,2)+"!=",S SET TALK ON 4、 给定程序: Y=X-X3/3!+X5/5!-X7/7!+…… 其中表达式的项目有10项 X值由用户通过键盘中输入,
11、请求出Y的值 SET TALK OFF S=0 P=1 FOR I=1 TO 10 K=2*I-1 FZ=X^K FM=1 FOR J=1 TO K FM=FM*J ENDFOR S=S+P*FZ/FM P=-P ENDFOR ? "Y的值为:",S INPUT "X=" TO X SET TALK ON 问题:(1)利用公式SIN(X)= X-X3/3!+X5/5!-X7/7!+……,直到最后一项的绝对值小于等于10-5为止。 (2)利用公式ex=1+x+x2/2!+x3/3!+……+xn/n!,
12、输入x和N,计算ex的近似值
5、 素数问题
输出从3到10以内的自然数中所有素数
SET TALK OFF
M=3
DO WHILE M<10
N=2 FOR N=2 TO M-1
DO WHILE N 13、ENDIF
ENDIF ENDFOR
N=N+1 IF N=M
ENDDO ?M
IF N=M ENDIF
?M
ENDIF
M=M+1
ENDDO
SET TALK ON
问题:(1)求出从1到100的所有素数的个数。
(2)求出从1到100的所有素数之和。
14、 6、对输入的正整数,判别其中包含指定数码的个数(如2312132中包含数码2的个数为3)。
SET TALK OFF
INPUT “M=” TO M &&输入正整数
INPUT “N=” TO N &&输入在正整数中包含的数码
S=0 &&采用累加
DO WHILE .T. &&采用永真循环方式
Y=MOD(M,10)
IF Y=N
S=S+1
ENDIF
M=INT(M/10)
IF M=0
EXIT
ENDIF
ENDDO
15、
?S
SET TALK ON
7、从键盘中输入10个数,去掉一个最大数和最小数,然后求平均值
SET TALK OFF
CLEAR
INPUT “N=” TO N
STORE N TO MAX,MIN,S
FOR I=1 TO 9
INPUT “N=” TO N
IF MAX 16、们从小到大排列后输出。
(2)对任意输入20个数,按从小到大进行排列。
8、数组问题:
该程序主要实现对矩阵的转置
SET TALK OFF
INPUT “N=” TO N
DIME A(N,N)
FOR I=1 TO N
FOR J=1 TO N
INPUT “A(“+STR(I,1)+”,”+STR(J,1)+”)=” TO A(I,J)
ENDFOR
ENDFOR
FOR I=1 TO N
FOR J=1 TO I
T=A(I,J)
A(I,J)=A(J,I)
A(J,I)=T
E 17、NDFOR
ENDFOR
SET TALK ON
问题:(1)课本P155页的程序阅读题第4题
(2)
第二部分 字符信息处理
一、 基本算法:
1、 常用的字符处理函数
(1) SPACE(N)
(2) LEN(S)
(3) SUBSTR(S,N1,N2)
(4) C=C+P && C,P均为字符型变量
(5) CHR(ASC(C)+N)
(6) ALLTRIM(STR(N1,N2,N3))
(7) STR(N1,N2,N3)
(8) IIF(条件表达式,C1,C2)
2、 字符串的粘合
C=”ABCDE”字符 18、串 &&由用户输入初始化的字符串
S=”” 或 S=SPACE(0)
L=LEN(C)
FOR I=1 TO L
S=S+SUBSTR(C,I,1) &&改成 S=SUBSTR(C,I,1)+S 有何不同,
ENDFOR
? C+”--à”+S
3、 阿拉伯数字转换为中文大写数字
INPUT “N=” TO N
L=LEN(ALLTRIM(STR(N)))
C=”o一二三四五六七八九” &&C=”零壹贰叁肆伍陆柒捌玖”
S=””
FOR I=1 TO L
P=MOD(N,10)
S=SUBSTR(C, 19、2*I+1,2)+S
N=INT(N/10)
ENDFOR
? ALLTRIM(STR(N))+”--à”+S
4、 图案的输出
主要采用SPACE(N)来控制每行中的首字符在屏幕中的位置和字符间的间隔。采用STR(N)函数将数值型数据转换为字符型;采用SUBSTR(C,N1,N2)函数对字符串进行取子串。特殊图案采用CHR(ASC(C)+N)进行不同字符的输出,尤其是英文字母的输出。
例:采用正直角三角形的形式输入九九乘法表
FOR I=1 TO 9
?SPACE(6*(9-I))
FOR J=1 TO I
??STR(I,1)+”*”+STR(J,1)+”=”+ 20、STR(I*J,2)
ENDFOR
ENDFOR
二、 典型例题
1、 编写一个程序,显示输出给定的字符串表达式倒置字符串(包含数字字符串、英文字母字符串和汉字字符串)。
SET TALK OFF
CLEAR
ACCEPT "请输入字符串" TO C
S=""
L=LEN(C)
FOR I=1 TO L
S=SUBSTR(C,I,1)+S
ENDFOR
?C+"---->"+S
SET TALK ON
2、 编写一个口令验证程序,要求有三次输入口令的机会,输入正确,显示“欢迎使用本系统”,否则显示“你无权使用本系统”。口令可采用固定 21、字符串,也可以采用在已有的表文件读取相关的字段值。
SET TALK OFF
CLEAR
I=1
DO WHILE I<=3
ACCEPT "请输入口令" to pass
IF ALLTRIM(PASS)=="ABCD"
?"欢迎使用本系统!"
EXIT
ELSE
?"口令错误!请重输"
ENDIF
I=I+1
IF I>3
?"你无权使用本系统!"
ENDIF
ENDDO
SET TALK ON
3、 编写一个程序,将数字日期转换成中文大写形式
SET T 22、ALK OFF
CLEAR
INPUT "请输入日期" to RIQI
Y=YEAR(RIQI)
M=MONTH(RIQI)
D=DAY(RIQI)
C="O一二三四五六七八九"
S=""
FOR I=1 TO 4
P=MOD(Y,10)
S=SUBSTR(C,2*P+1,2)+S
Y=INT(Y/10)
ENDFOR
S=S+"年"
S=S+IIF(M<10,SUBSTR(C,2*M+1,2),"十"+SUBSTR(C,2*MOD(M,10)+1,2))
S=S+"月"
DO CASE
CASE D<10
S= 23、S+SUBSTR(C,2*D+1,2)
CASE D=10
S=S+"十"
CASE D<=19
S=S+SUBSTR(C,2*MOD(D,10)+1,2)
OTHERWISE
S=S+SUBSTR(C,2*INT(D/10)+1,2)+"十"+;
IIF(MOD(D,10)=0,"",SUBSTR(C,2*MOD(D,10)+1,2))
ENDCASE
S=S+"日"
?DTOC(RIQI)+"---->"+S
SET TALK ON
4、 编写一个程序,将输入 24、的金额采用中文大写形式输出。
SET TALK OFF
CLEAR
INPUT "请输入金额" TO JINER
P=JINER*100
M=ROUND(P,0)
C1="零壹贰叁肆伍陆柒捌玖"
C2="分角元拾佰仟万拾佰仟亿拾佰仟"
I=0
C=SPACE(0)
DO WHILE .T.
N=MOD(M,10)
C=SUBSTR(C1,2*N+1,2)+SUBSTR(C2,2*I+1,2)+C
I=I+1
M=INT(M/10)
IF M=0
EXIT
ENDIF
ENDDO
? STR(JINER 25、19,4)+"---->"+C
SET TALK ON
5、阅读程序,写出程序运行的结果:主要是图案的输出,
(1) 数字图案的输出:采用数组形式。
SET TALK OFF
CLEAR
INPUT "N=" TO N
DIME A(N,N)
P=N
DO WHILE N>0
A(N,N)=1
A(N,1)=1
N=N-1
ENDDO
FOR I=3 TO P
FOR J=2 TO I-1
A(I,J)=A(I-1,J-1)+A(I-1,J)
ENDFOR
ENDFOR
FOR I=1 TO P
26、
?SPACE(3*(P-I+1))
FOR J=1 TO I
??STR(A(I,J),3)
ENDFOR
?
ENDFOR
SET TALK ON
(2) 字母图案的输出:采用CHR(ASC(C)+N)函数。
SET TALK OFF
CLEAR
INPUT "N=" TO N
FOR I=1 TO N
?SPACE(N-I+1)
FOR J=1 TO 2*I-1
??CHR(ASC('A')+I-1)
ENDFOR
ENDFOR
FOR P=N-1 TO 1 STEP 27、1
?SPACE(N-P+1)
FOR K=1 TO 2*P-1
??CHR(ASC('A')+P-1)
ENDFOR
ENDFOR
SET TALK ON
第三部分 表文件信息处理
一、 基本函数
1、 宏替换:&
2、 名称表达式:(变量名)
3、 FILE(S):判断文件是否存在,若存在,该函数返回.T.,否则返回.F.。
4、 FOUND()函数一般与记录查找命令结合使用。
5、 FCOUNT():表示当前表的字段数
6、 FSIZE:表示当前表的字段总长度
7、 RECNO():返回当前表的当前记录号
8、 RECCOU 28、NT():返回当前表的总记录数
9、 DELETE():若当前记录已作删除标记,该函数返回.T.,否则返回.F.
10、 BOF()或EOF():用来测试表文件开始状态或结束状态。
11、 SET FILTER TO 逻辑表达式
二、 基本算法与典型例题
1、 文件的查询、打开、关闭和删除
SET TALK OFF
CLEAR
DO WHILE .T.
ACCEPT ”请输入要删除的表文件名(扩展名略):” TO FILENAME
FILENAME=TRIM(LTRIM(FILENAME))+”.DBF”
IF !FILE(FILENAME) & 29、判断文件是否存在
ACCEPT “该文件不存在!继续吗?(Y/N)” TO YN
IF UPPER(YN)=”N”
EXIT
ENDIF
ELSE
USE (FILENAME) &&打开表文件
LIST
WAIT “是这个文件吗?(Y/N)” TO YN
IF LOWER(YN)=”y”
USE &&关闭表文件
DELETE FILE &FILENAME &&删除表文件
EXIT
ELSE
WAIT ” 30、继续吗?(Y/N)” TO YN
IF LOWER(Y/N)=”n”
USE
EXIT
ENDIF
ENDIF
ENDIF
ENDDO
SET TALK ON
问题:阅读和理解课本P103中的程序
2、 表文件内的字段的添加、删除和查询
(1)添加新记录
SET TALK OFF
CLEAR
DO WHILE .T.
ACCEPT "请输入学生学号:" TO XH
ACCEPT "请输入学生姓名:" TO NAME
INPUT "请输入性别(逻辑型):" TO XB
INPUT "请输入出生年月" T 31、O DATE
INPUT "请输入学生奖学金" TO JXJ
USE 学生
APPEND BLANK
REPLACE 学号 WITH XH,姓名 WITH NAME,性别 WITH XB,出生年月;
WITH DATE,奖学金 WITH JXJ
WAIT "是否继续输入学生信息(Y/N)" TO YN
IF UPPER(YN)="Y"
LOOP
ELSE
EXIT
ENDIF
ENDDO
SET TALK ON
(2)删除指定的记录
SET TALK OFF
CLEAR
DO WHILE .T.
ACCEPT "请输 32、入要删除的学号" TO XH
USE 学生
LOCA FOR 学号=XH
IF !FOUND()
?"你指定的学生并不存在!"
ELSE
DELE
SET DELETE ON
ENDIF
WAIT "是否继续(Y/N)" TO YN
IF LOWER(YN)="Y"
LOOP
ELSE
EXIT
ENDIF
ENDDO
SET DELETE OFF
USE
SET TALK ON
(3)查询记录
SET TALK OFF
CLEAR
AC 33、CEPT "请输入学生学号" TO XH
USE 成绩
LOCA FOR 学号=XH
DO WHILE !EOF()
DISP
CONTINUE
ENDDO
SET TALK ON
3、 统计字段数、显示字段名。
SET TALK OFF
CLEAR
ACCEPT "请输入表文件名(扩展名略)" TO FILENAME
FILENAME=FILENAME+".DBF"
IF !FILE(FILENAME)
?"你所指定的表文件在当前文件夹内并不存在!"
ELSE
USE (FILENAME)
FOR I=1 TO FCOUN 34、T()
?FIELDS(I)
ENDFOR
?”该表文件共有”+STR(RECCOUNT())+”条记录”
ACCEPT "请输入查询条件" TO EXPR
SET FILTER TO &EXPR
DISP ALL
COUNT TO P FOR !DELETE()
?”共查询到”+STR(P)+”到符合条件的记录”
SET FILTER TO
USE
ENDIF
SET TALK ON
4、 录中某字段值的改变(REPLACE…WITH…)
为指定的学生的奖学金增加50元
SET TALK 35、 OFF
CLEAR
YN="Y"
USE 学生
DO WHILE UPPER(YN)="Y" &&采用永真循环结构
ACCEPT "请输入学生学号" TO XH
LOCA FOR 学号=XH
REPL 奖学金 WITH 奖学金+50 &&使用REPLACE…WITH语句
修改指定记录的字段。
DISP
WAIT "是否继续(Y/N)" TO YN
ENDDO
SET TALK ON
5、 制表结构、表内容的复 36、制和大量数据追加
SET TALK OFF
CLEAR
USE 学生 IN 1
IF FILE("STUDENT.DBF")
DELE FILE STUDENT.DBF
ENDIF
COPY STRU TO STUDENT
USE STUDENT IN 2
SELE 2
APPEN FROM 学生 FOR 性别
DISP ALL
USE
SELE 1
USE
SET TALK ON
6、 用SCATTER TO 和GATHER FROM命令对表进行操作。
SET TALK OFF
CLEAR
DIME A(7) 37、 &&定义一个一维七元素的数组变量
IF FILE("STUD.DBF") &&判断文件是否存在,若存在则删除该文件
DELE FILE STUD.DBF
ENDIF
USE 学生 IN 1 &&在第一个工作区打开表文件学生.DBF
SELE 1
LOCA FOR 奖学金>=50 &&查找奖学金在50元以上的记录
COPY STRU TO STUD &&将学生表结构复制到STUD.DBF中.
USE STUD IN 2 &&在第二个工作区中打开表文件STUD.DBF
DO WHILE !EOF()
SELE 1
SCATTER TO A &&将学生.DBF中的记录读到数组A中.
SELE 2
APPEND BLANK
GATHER FROM A &&将数组A中各元素的值写到STUD.DBF对应的字段中
SELE 1
CONTINUE
ENDDO
SELE 2
DISP ALL
USE
SELE 1
USE
SET TALK ON






