程序设计基础专题一.docx
《程序设计基础专题一.docx》由会员分享,可在线阅读,更多相关《程序设计基础专题一.docx(21页珍藏版)》请在冰豆网上搜索。
![程序设计基础专题一.docx](https://file1.bdocx.com/fileroot1/2022-11/26/f3957f12-9546-4643-96bb-1e2f2b6efa4b/f3957f12-9546-4643-96bb-1e2f2b6efa4b1.gif)
程序设计基础专题一
程序设计基础——专题
(一)
第一部分数学问题
一、基本算法:
数学数值问题的基本运算主要涉及到的算法有:
累加、累乘、整除和求余数。
1、累加
主要是通过循环变量来控制循环结构,一般有两个变量,一是循环变量I和累加值变量S。
主要语句有:
S=0&&为累加合值初始化
FORI=[初始值]TO[终止值]STEP[步长]&&或DOWHILE<条件表达式>
循环体内语句系列
S=S+F(I)
ENDFOR&&或ENDDO
?
S&&输出累加合值S
2、累乘
主要是通过循环变量来控制循环结构,一般有两个变量,一是循环变量I和累乘值变量S。
T=1&&为累乘值初始化
FORI=[初始值]TO[终止值]STEP[步长]&&或DOWHILE<条件表达式>
循环体内语句系列
T=T*F(I)
ENDFOR&&或ENDDO
?
T&&输出累加合值S
3、整除
主要采用取整函数INT()、求余函数MOD()和求余运算符%。
设X,Y均为整型数值表达式,判断X是否被Y整除的表达式的常用方法有:
(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、求一组数的最大值和最小值
设在数组A有10个元素,且都已赋值,现要求这10个元素中的最大值,可采用两两相互比较后再使用两变量值置换的语句来完成。
其主要算法有:
MAX=A
(1)&&创建最大值变量MAX,并将A
(1)赋值给MAX
MIN=A
(1)&&创建最大值变量MAX,并将A
(1)赋值给MAX
FORI=2TO10&&将数组的每一个变量与MAX或MIN比较后,改变MAX和MIN的值
IFA(I)>MAX
MAX=A(I)
ENDIF
IFA(I)<=MIN
MIN=A(I)
ENDIF
ENDFOR
?
MAX,MIN&&输出最大值和最小值
7、求两个数的最大公约数和最小公倍数
用2至这两个数的最小值之内任何一个数作为一个循环变量去除这两个数,若能找到一个数能同时被这两个数整除。
则这个数就是他们的最大公约数,而这两个的乘积除以最大公约数后得到的值就是这两个数的最小公倍数。
设有两个变量X,Y,中间变量I,主要的算法有:
N=MIN(X,Y)
FORI=NTO1STEP–1
IFX/I=INT(X/I)ANDINT(Y/I)=Y/I
GYS=I
EXIT
ENDIF
ENDFOR
?
”最大公约数为:
”,GYS
?
”最小公倍数为:
”,X*Y/GYS
8、判断X是否是素数(质数、完数)
素数:
除被1和本身整除外不能被其他数整除。
用2至X之内的任一数去除X,若找到一个数能被X整除,则表示X不是素数,否则X是一个素数。
常用算法:
FORI=2TOX-1
IFX%I=0或INT(X/I)=X/I或MOD(X,I)=0
EXIT
ENDIF
ENDFOR
IFI=X
?
X,“是一个素数”
ELSE
?
X,“不是一个素数”
ENDIF
9、从十进制整数中取出数码
将该数值除10后取余数,可得到该数值中的个位数码,然后用该数值除以10后的商去替代该数值,再除以10取其余数,得到十位数数码,依次类推,直到得到的商为零为止。
设X是一个整数,其常用的得法有:
I=1
DOWHILEN>0
P=MOD(N,10)取某位的数码
?
”该数值从右往左第”+STR(I)+”位的数码为:
”,P
N=INT(N/10)
IFN=0
EXIT
ENDIF
ENDDO
10、判断一个数是否是一个正整数、奇数或偶数
(1)正整数
IFINT(X)=XANDABS(X)=X
?
X,“是一个正整数!
”
ELSE
?
X,“不是一个正整数!
”
ENDIF
(2)奇、偶数
IFINT(X)=XANDINT(X/2)=X/2
?
X,“是一个偶数!
”
ESLE
?
X,“是一个奇数!
”
ENDIF
二、典型例题
1、求1到10所有自然数之和(程序运行后的结果是否是55)
SETTALKOFF
S=0
FORI=1TO10
S=S+I
ENDFOR
?
"1到10之和为:
",S&&改成?
"1到10之和为:
",S行吗?
请说明理由
CLEAR
SETTALKON
问题:
(1)求从1到100的所有奇数(或偶数)之和
(2)求从1到X的所有自然数之和,其中X的值可由用户通过键盘输入。
(3)求出从1到N之间所有整数的平方和并输出结果。
(4)上述程序采用DOWHILE……ENDDO应如何编写?
2、求10!
SETTALKOFF
CLEAR
T=0
FORI=1TO10
T=T*I
ENDFOR
?
"10!
为:
",T
SETTALKON
3、求从正整数K到M值的阶乘之和,其中K和M值均由用户通过键盘输入。
SETTALKOFF
CLEAR
INPUT"K="TOK&&改成ACCEPT"K="TOK行吗,请说明理由
S=0
FORI=KTOM
T=1
FORJ=1TOI
T=T*J
ENDFOR
S=S+T
ENDFOR
INPUT"M="TOM
?
STR(K,2)+"!
+…"+STR(M,2)+"!
=",S
SETTALKON
4、给定程序:
Y=X-X3/3!
+X5/5!
-X7/7!
+……
其中表达式的项目有10项
X值由用户通过键盘中输入,请求出Y的值
SETTALKOFF
S=0
P=1
FORI=1TO10
K=2*I-1
FZ=X^K
FM=1
FORJ=1TOK
FM=FM*J
ENDFOR
S=S+P*FZ/FM
P=-P
ENDFOR
?
"Y的值为:
",S
INPUT"X="TOX
SETTALKON
问题:
(1)利用公式SIN(X)=X-X3/3!
+X5/5!
-X7/7!
+……,直到最后一项的绝对值小于等于10-5为止。
(2)利用公式ex=1+x+x2/2!
+x3/3!
+……+xn/n!
,输入x和N,计算ex的近似值
5、素数问题
输出从3到10以内的自然数中所有素数
SETTALKOFF
M=3
DOWHILEM<10
N=2FORN=2TOM-1
DOWHILENIFINT(M/N)=M/NEXIT
EXITENDIF
ENDIFENDFOR
N=N+1IFN=M
ENDDO?
M
IFN=MENDIF
?
M
ENDIF
M=M+1
ENDDO
SETTALKON
问题:
(1)求出从1到100的所有素数的个数。
(2)求出从1到100的所有素数之和。
6、对输入的正整数,判别其中包含指定数码的个数(如2312132中包含数码2的个数为3)。
SETTALKOFF
INPUT“M=”TOM&&输入正整数
INPUT“N=”TON&&输入在正整数中包含的数码
S=0&&采用累加
DOWHILE.T.&&采用永真循环方式
Y=MOD(M,10)
IFY=N
S=S+1
ENDIF
M=INT(M/10)
IFM=0
EXIT
ENDIF
ENDDO
?
S
SETTALKON
7、从键盘中输入10个数,去掉一个最大数和最小数,然后求平均值
SETTALKOFF
CLEAR
INPUT“N=”TON
STORENTOMAX,MIN,S
FORI=1TO9
INPUT“N=”TON
IFMAXMAX=N
ENDIF
IFMIN>N
MIN=N
ENDIF
S=S+N
ENDFOR
?
”平均值=”,(S-MAX-MIN)/8
SETTALKON
问题:
(1)从键盘中输入A,B,C3个数值,将它们从小到大排列后输出。
(2)对任意输入20个数,按从小到大进行排列。
8、数组问题:
该程序主要实现对矩阵的转置
SETTALKOFF
INPUT“N=”TON
DIMEA(N,N)
FORI=1TON
FORJ=1TON
INPUT“A(“+STR(I,1)+”,”+STR(J,1)+”)=”TOA(I,J)
ENDFOR
ENDFOR
FORI=1TON
FORJ=1TOI
T=A(I,J)
A(I,J)=A(J,I)
A(J,I)=T
ENDFOR
ENDFOR
SETTALKON
问题:
(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”字符串&&由用户输入初始化的字符串
S=””或S=SPACE(0)
L=LEN(C)
FORI=1TOL
S=S+SUBSTR(C,I,1)&&改成S=SUBSTR(C,I,1)+S有何不同,
ENDFOR
?
C+”--”+S
3、阿拉伯数字转换为中文大写数字
INPUT“N=”TON
L=LEN(ALLTRIM(STR(N)))
C=”o一二三四五六七八九”&&C=”零壹贰叁肆伍陆柒捌玖”
S=””
FORI=1TOL
P=MOD(N,10)
S=SUBSTR(C,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)进行不同字符的输出,尤其是英文字母的输出。
例:
采用正直角三角形的形式输入九九乘法表
FORI=1TO9
?
SPACE(6*(9-I))
FORJ=1TOI
?
?
STR(I,1)+”*”+STR(J,1)+”=”+STR(I*J,2)
ENDFOR
ENDFOR
二、典型例题
1、编写一个程序,显示输出给定的字符串表达式倒置字符串(包含数字字符串、英文字母字符串和汉字字符串)。
SETTALKOFF
CLEAR
ACCEPT"请输入字符串"TOC
S=""
L=LEN(C)
FORI=1TOL
S=SUBSTR(C,I,1)+S
ENDFOR
?
C+"---->"+S
SETTALKON
2、编写一个口令验证程序,要求有三次输入口令的机会,输入正确,显示“欢迎使用本系统”,否则显示“你无权使用本系统”。
口令可采用固定字符串,也可以采用在已有的表文件读取相关的字段值。
SETTALKOFF
CLEAR
I=1
DOWHILEI<=3
ACCEPT"请输入口令"topass
IFALLTRIM(PASS)=="ABCD"
?
"欢迎使用本系统!
"
EXIT
ELSE
?
"口令错误!
请重输"
ENDIF
I=I+1
IFI>3
?
"你无权使用本系统!
"
ENDIF
ENDDO
SETTALKON
3、编写一个程序,将数字日期转换成中文大写形式
SETTALKOFF
CLEAR
INPUT"请输入日期"toRIQI
Y=YEAR(RIQI)
M=MONTH(RIQI)
D=DAY(RIQI)
C="O一二三四五六七八九"
S=""
FORI=1TO4
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+"月"
DOCASE
CASED<10
S=S+SUBSTR(C,2*D+1,2)
CASED=10
S=S+"十"
CASED<=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
SETTALKON
4、编写一个程序,将输入的金额采用中文大写形式输出。
SETTALKOFF
CLEAR
INPUT"请输入金额"TOJINER
P=JINER*100
M=ROUND(P,0)
C1="零壹贰叁肆伍陆柒捌玖"
C2="分角元拾佰仟万拾佰仟亿拾佰仟"
I=0
C=SPACE(0)
DOWHILE.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)
IFM=0
EXIT
ENDIF
ENDDO
?
STR(JINER,19,4)+"---->"+C
SETTALKON
5、阅读程序,写出程序运行的结果:
主要是图案的输出,
(1)数字图案的输出:
采用数组形式。
SETTALKOFF
CLEAR
INPUT"N="TON
DIMEA(N,N)
P=N
DOWHILEN>0
A(N,N)=1
A(N,1)=1
N=N-1
ENDDO
FORI=3TOP
FORJ=2TOI-1
A(I,J)=A(I-1,J-1)+A(I-1,J)
ENDFOR
ENDFOR
FORI=1TOP
?
SPACE(3*(P-I+1))
FORJ=1TOI
?
?
STR(A(I,J),3)
ENDFOR
?
ENDFOR
SETTALKON
(2)字母图案的输出:
采用CHR(ASC(C)+N)函数。
SETTALKOFF
CLEAR
INPUT"N="TON
FORI=1TON
?
SPACE(N-I+1)
FORJ=1TO2*I-1
?
?
CHR(ASC('A')+I-1)
ENDFOR
ENDFOR
FORP=N-1TO1STEP-1
?
SPACE(N-P+1)
FORK=1TO2*P-1
?
?
CHR(ASC('A')+P-1)
ENDFOR
ENDFOR
SETTALKON
第三部分表文件信息处理
一、基本函数
1、宏替换:
&
2、名称表达式:
(变量名)
3、FILE(S):
判断文件是否存在,若存在,该函数返回.T.,否则返回.F.。
4、FOUND()函数一般与记录查找命令结合使用。
5、FCOUNT():
表示当前表的字段数
6、FSIZE:
表示当前表的字段总长度
7、RECNO():
返回当前表的当前记录号
8、RECCOUNT():
返回当前表的总记录数
9、DELETE():
若当前记录已作删除标记,该函数返回.T.,否则返回.F.
10、BOF()或EOF():
用来测试表文件开始状态或结束状态。
11、SETFILTERTO逻辑表达式
二、基本算法与典型例题
1、文件的查询、打开、关闭和删除
SETTALKOFF
CLEAR
DOWHILE.T.
ACCEPT”请输入要删除的表文件名(扩展名略):
”TOFILENAME
FILENAME=TRIM(LTRIM(FILENAME))+”.DBF”
IF!
FILE(FILENAME)&&判断文件是否存在
ACCEPT“该文件不存在!
继续吗?
(Y/N)”TOYN
IFUPPER(YN)=”N”
EXIT
ENDIF
ELSE
USE(FILENAME)&&打开表文件
LIST
WAIT“是这个文件吗?
(Y/N)”TOYN
IFLOWER(YN)=”y”
USE&&关闭表文件
DELETEFILE&FILENAME&&删除表文件
EXIT
ELSE
WAIT”继续吗?
(Y/N)”TOYN
IFLOWER(Y/N)=”n”
USE
EXIT
ENDIF
ENDIF
ENDIF
ENDDO
SETTALKON
问题:
阅读和理解课本P103中的程序
2、表文件内的字段的添加、删除和查询
(1)添加新记录
SETTALKOFF
CLEAR
DOWHILE.T.
ACCEPT"请输入学生学号:
"TOXH
ACCEPT"请输入学生姓名:
"TONAME
INPUT"请输入性别(逻辑型):
"TOXB
INPUT"请输入出生年月"TODATE
INPUT"请输入学生奖学金"TOJXJ
USE学生
APPENDBLANK
REPLACE学号WITHXH,姓名WITHNAME,性别WITHXB,出生年月;
WITHDATE,奖学金WITHJXJ
WAIT"是否继续输入学生信息(Y/N)"TOYN
IFUPPER(YN)="Y"
LOOP
ELSE
EXIT
ENDIF
ENDDO
SETTALKON
(2)删除指定的记录
SETTALKOFF
CLEAR
DOWHILE.T.
ACCEPT"请输入要删除的学号"TOXH
USE学生
LOCAFOR学号=XH
IF!
FOUND()
?
"你指定的学生并不存在!
"
ELSE
DELE
SETDELETEON
ENDIF
WAIT"是否继续(Y/N)"TOYN
IFLOWER(YN)="Y"
LOOP
ELSE
EXIT
ENDIF
ENDDO
SETDELETEOFF
USE
SETTALKON
(3)查询记录
SETTALKOFF
CLEAR
ACCEPT"请输入学生学号"TOXH
USE成绩
LOCAFOR学号=XH
DOWHILE!
EOF()
DISP
CONTINUE
ENDDO
SETTALKON
3、统计字段数、显示字段名。
SETTALKOFF
CLEAR
ACCEPT"请输入表文件名(扩展名略)"TOFILENAME
FILENAME=FILENAME+".DBF"
IF!
FILE(FILENAME)
?
"你所指定的表文件在当前文件夹内并不存在!
"
ELSE
USE(FILENAME)
FORI=1TOFCOUNT()
?
FIELDS(I)
ENDFOR
?
”该表文件共有”+STR(RECCOUNT())+”条记录”
ACCEPT"请输入查询条件"TOEXPR
SETFILTERTO&EXPR
DISPALL
COUNTTOPFOR!
DELETE()
?
”共查询到”+STR(P)+”到符合条件的记录”
SETFILTERTO
USE
ENDIF
SETTALKON
4、录中某字段值的改变(REPLACE…WITH…)
为指定的学生的奖学金增加50元
SETTALKOFF
CLEAR
YN="Y"
USE学生
DOWHILEUPPER(YN)="Y"&&采用永真循环结构
ACCEPT"请输入学生学号"TOXH
LOCAFOR学号=XH
REPL奖学金WITH奖学金+50&&使用REPLACE…WITH语句
修改指定记录的字段。
DISP
WAIT"是否继续(Y/N)"TOYN
ENDDO
SETTALKON
5、制表结构、表内容的复制和大量数据追加
SETTALKOFF
CLEAR
USE学生IN1
IFFILE("STUDENT.DBF")
DELEFILESTUDENT.DBF
ENDIF
COPYSTRUTOSTUDENT
USESTUDENTIN2
SELE2
APPENFROM学生FOR性别
DISPALL
USE
SELE1
USE
SETTALKON
6、用SCATTERTO和GATHERFROM命令对表进行操作。
SETTALKOFF
CLEAR
DIMEA(7)&&定义一个一维七元素的数组变量
IFFILE("STUD.DBF")&&判断文件是否存在,若存在则删除该文件
DELEFILESTUD.DBF
ENDIF
USE学生IN1&&在第一个工作区打开表文件学生.DBF
SELE1
LOCAFOR奖学金>=50&&查找奖学金在50元以上的记录
COPYSTRUTOSTUD&&将学生表结构复制到STUD.DBF中.
USESTUDIN2&&在第二个工作区中打开表文件STUD.DBF
DOWHILE!
EOF()
SELE1
SCATTERTOA&&将学生.DBF中的记录读到数组A中.
SELE2
APPENDBLANK
GATHERFROMA&&将数组A中各元素的值写到STUD.DBF对应的字段中
SELE1
CONTINUE
ENDDO
SELE2
DISPALL
USE
SELE1
U