版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
VisualBasic
'程序选id
第八章过程
武小川xiaochuan_wu@163.com
中国药科大学计算机教研室
VisualBasic
教学要求'程序:
今掌握函数和过程的使用
今掌握参数的传递—按值传递和按地址传递
“掌握变量的作用域(局部变量和全局变量)
今掌握递归算法
今会创建多窗体应用程序
2中国药科大学
计算机教研室
VisualBasic
教学内容'程序选id
8.1Sub过程
8.2Function过程
8.3过程调用
8.4参数传递
8.5递归过程
8.6变量的作用域
8.7程序示例
8.8多窗体程序设计
.念.中国药科大学
3侬计算机教研室
模块化程序设计VisualBasic
今基本思想:将一个大的程序按功能分割成一些小模块
”特点:
A各模块相对独立、功能单一、结构清晰、接口简单
»控制了程序设计的复杂性
A提高元件的可靠性
»缩短开发周期
A避免程序开发的重复劳动
»易于维护和功能扩充
今开发方法:自上向下,逐步分解,分而治之
京东中国药科大学
4侬计算机教研室
VisualBasic
VB中过程的分类'程序选id
京东中国药科大学
y计算机教研室
VisualBasic
8.1Sub过程'程序:
8.1.1事件过程
•当对象识别某事件后,进行的操作处理——以代码的形式存
储在事件过程中。
•分类:
A窗体事件过程
A控件事件过程
京东中国药科大学
学计算机教研室
VisualBasic
1定义事件过程'程序:
•[形式]:
PrivateSubForm_事件名([参数列表])
[局部变量木常数声明]完全由系统
决定,用户
语句块___________________无权修改
EndSub窗体的事件过程名
中不使用其具体名
称,而固定用Form
窗体事件固定有“Private”
关键字,说明它是模块级的
,裕品中国药科大学
7
U计算机教研室
VisualBasic
2窗体的Initialize、Load、Activate、Gotfocus事中'程序山J
•Initialize(初始化)事件——配置窗体时触发
•Load(加载)事件——窗体装入内存时触发
•Activate(激活)事件——窗体被激活时触发
•Gotfocus事件(得到焦点)事件——窗体成为当前焦点时触发
“窗体上无可视控件时,触发窗体的Gotfocus事件;
“窗体上有可视控件时,触发控件的Gotfocus事件;
•执行次序:
Initialize-►Load-►Activate-►Gotfocus
8循相中国药科大学
以计算机教研室
VisualBasic
注意'程序:
•窗体的Initialize、Load事件发生在窗体被显示之前,其中可
放置系统初始化命令,但其中语句有所限制;
•窗体加载后,只要不被卸载,就不会再执行Initialize、Load
事件,但Activate事件会多次发生;
•当访问另一窗体上的“非可视”数据或调用其中定义的全局过
程时,只会触发该窗体的Initialize事件,而Load事件不触发;
•当访问另一窗体上的“可视”数据时,会同时触发该窗体的
Initialize和Load事件。
.漓卜中国药科大学
9
U计算机教研室
VisualBasic
3定义控件的事件过程'程序:
•[一般形式]:
PrivateSub控件名一事件名([参数列表])
[局部变量和常数声明]由系统决定,
语句块用户无权修改
EndSub
控件的事件过程名中必须
使用其具体名称
控件事件固定有“Private”
关键字,说明它是模块级的
ro,裕品中国药科大学
y计算机教研室
VisualBasic
4建立事件过程'程序:
•打开“代码编辑器”窗口;
•先选定某对象,再选定事件过程;
•编辑代码;FJ■工程1-Forml(Code)IT5网
Load三]
Activate
Click
DblClick
Deactivate
DragDrop
Di-agOver
GotFocus
Initialize
KeyDown
KeyPress
KeyUp
对象LinkClose过程
EndSub
VisualBasic
PrivateSubCommand1Click。'程序:
使用函数DimmAsInteger,nAsInteger
DimiAsInteger,kAsInteger
DimtAsLong,sAsLong
函数调用(三次)n=Val(Textl.Text)
m=Val(Text2.Text)
~~~fact(n)/(fact(m)*fact(n-m))
Text3.Text=Str(s)
<、EndSub
函数定义PrivateFunctionfact(kAsInteger)AsLong
计算k!DimiAsInteger
fact=1
Fori=1Tok
fact=fact*i
Nexti
EndFunction科大学
0计算机教研室
过程的引入VisualBasic
在以下两种情况下,经常使用自定义过程:
(1)应用程序中出现较频繁的处理,仅仅是每次处理的数据不
同而已;
(2)程序中比较复杂的算法,独立出来,增强程序的可读性;
“过程”的引入使得整个程序的结构更加清晰,模块化更强。
,裕品中国药科大学
14
以计算机教研室
VisualBasic
8.1.2通用过程'程序:
•完成某一特定功能的程序段
——通用过程(自定义)
•必须显式调用方可执行;
•分为:
今公有过程(Public)
今私有过程(Private)
京东中国药科大学
15学计算机教研室
VisualBasic
1通用Sub过程的定义'程序:
。[一般形式]:
[PrivateIPublic][static]Sub<过程名>([<参数列表>])
<过程体)
EndSub
♦:♦[说明]:
(1)以Sub开头,EndSub结束,,中间是过程体——包括变量声明
和语句块;
(2)以Private为前缀的过程是模块级的,以Public为前缀的过程
是应用程序级的,缺省默认是Public;
(3)Static选项说明过程中的局部变量是静态变量;
(4)过程名的命名规则和变量名相同,在同一个模块中,过程名
京东中国药科大学
必须是唯一的;16学计算机教研室
VisualBasic
说明(续)'程序:
(5)参数列表中的参数称为形式参数,可以没有,但无参数时圆
括号不能省略;有多个参数时,参数之间用逗号间隔;
(6)参数说明格式:
[Optional][ByVaiIByRef]<变量名>[()][As<数据类型>]
a)若参数是数组,则在变量名后面加一对圆括号,但无维界定义
b)ByVai:指明参薮传递方式是传殖;
c)ByRef:指明参数传递方式是传地址,为缺省值;
d)若参数是字符型的,必须是不定长字符串;
e)Optional:参数是可选的,必须定义在必选参数后面。
(7)当过程调用结束,即执行到EndSub语句,系统自动返回调用
程序的调用语句处,执行调用语句的下一条语句;
(8)过程不能嵌套定义,但可嵌套调用;
(9)ExitSub语句的功能是提前退出过程调用,返回调用语句。
17临'中国药科大学
母计算机教研室
VisualBasic
'程序:
伤J:PrivateSubExchange(xAsInteger,yAsInteger)
DimTempAsInteger
Temp=x:x=y:y=Temp
EndSub
该通用过程实现交换功能,包含两
个参数,均是ByRef形式的参数。
,裕品中国药科大学
18
以计算机教研室
VisualBasic
2建立通用Sub过程F'程序:
方法一:在“代码编辑窗口”的“通用”中自行输入;
方法二:进入代码编辑器窗口,执行“工具”菜单的“添加
过程”,在“添加过程”对话框中输入定义过程的名称、类型
和范围后单击“确定”按钮,系统会自动在代码窗口添加自定
义过程的框架。
应.中国药科大学
U计算机教研室
8.2Function过程定义VisualBasic
Function过程的特点是返回一个值,因此我们通常也称之
为自定义函数。通常我们利用Function过程得到一个数值或一
个字符串或一个逻辑值。
函数返回值的类型
[格式]:\
[Private|Public]Function<函数名>([参数列表])LAs<数
据类型>]
《函数体>
EndFunction函数名=表达式
,念.中国药科大学
20
U计算机教研室
VisualBasic
说明'程序:
(1)以Function开头,以EndFunction结束,中间是函数体;
(2)函数名命名规则、参数列表的表示都和Sub过程相同;
(3)As数据类型:函数过程修由函数名返回一个值,值的类型
由[As数据类型]定义;★
(4)函数体中一定要有对函数名赋值的语句——函数名=表达式,
否则返回相应类型的初值;★(见例8T)
(5)函数体内可有ExitFunction语句---无条件退出函数过程,
返回主程序。
(6)Function过程不能嵌套定义,但可嵌套调用。
.漓卜中国药科大学
21
U计算机教研室
VisualBasic
'程序:
例:定义函数:f(x)=3x3—2x2+6x—1
函数返回值的类型
PrivateFunctionf(ByvalxAsInteger)AsInteger
f=3*x'3・2*xA2+6*x・l__________
EndFunction函数名=表达式
22商中国药科大学
垓计算机教研室
传值的参数E
例8・1:编写一个求n!的函数。
23中国药科大学
计算机教研室
VisualBasic
8.3过程调用'程序:
8.3.1事件过程的调用
事件过程由一个发生在VB中的事件来自动调
用或由同一个模块中的其他过程显式调用。
例见P163
总之,事件过程可以由发生的事件自动激活以响
应系统或用户的活动,也可以被其他过程调用而
激活。
.漓卜中国药科大学
24
U计算机教研室
VisualBasic
8.3.2Sub过程调用'程序:
必须在事件过程或其它通用过程中显示调用。
PrivateSubsubl()PrivateSubsub2(形参表)
......I①■③
CallSub2(实参表口过程语句
■"■"I5I■■的
EndSub1-EndSub
主调程序被调过程
注意:一个过程或函数可以被调用多次
「中国药科大学
25
«计算机教研室
VisualBasic
'程序:
[格式一]:Call<过程名>[(<实参表))]
[格式二]:<过程名>[<实参表>]
[功能]:对已定义的过程进行调用。
如:
1.CallFact(x)
2.Factx
P165
26(福『中国药科大学
学计算机教研室
VisualBasic
说明'程序:
(1)调用的过程必须是已经定义的,否则系统会出现“子程
序或函数未定义”的信息提示;
(2)实在参数可以是常量、变量或表达式;
(3)实在参数的数目及类型要和定义时必选参数保持一致,
否则系统会出现“参数不可选”的信息提示,参数之间用逗号
间隔;
(4)若子程序没有参数,则格式一中的括号可以省略;
(5)格式一和格式二的区别在于:格式二的参数表无须括号,
而是和过程名之间用空格隔开;
27中国药科大学
计算机教研室
VisualBasic
'程序选id
例8-2试编写一个找出任意一个正整数的因子的程序
P165
应.中国药科大学
28
U计算机教研室
产序毁学程匿r
OptionExplicit
PrivateSubCommandl_Click()求因子,该子程序定义
DimintaAsInteger,stAsString
了两个参数,来传递求
inta=Textl
Callfactorfinta^st)因子实现前的原始数据
Text2=st过程factorI和返回功能实现后的结
EndSub,果数据;
PrivateSubfactor/ByValnAsInteger,iAsString)
DimiAsInteger定义过程
Fori=1Ton-1
IfnModi=0Thens=s&Str(i)
Nexti
EndSub
优点:程序即Sub过程的使用不仅可以缩短程序的长度,还能
够使程序的结构更加清楚。
VisualBasic
'程序:
例:定义一个通用过程用以求一维数组中的最小值
PrivateSubvalue(a()AsInteger,minAsInteger)
DimiAsInteger
min=a(l)
Fori=2ToUBound(a)
Ifa(i)<minThenmin=a(i)
Nexti
EndSub
,裕云中国药科大学
30
以计算机教研室
VisualBasic
8.3.3调用Function过程'程序:
[格式]:V函数名〉([实参表])
♦:♦[功能]:返回一个函数值。
♦:♦[说明]:
(1)一般情况下,函数的调用出现在赋值语句中,并且在赋值
号的右侧;
(2)若函数没有参数,函数名后的括号不能省略;
(3)虽然VB允许象调用Sub过程那样调用Function过程,但这样
调用时系统不返回函数值,建议大家不要使用这种调用方法。
例Callfact(x)
如:FactX这两种方法均放弃函数的返回值
31/密鼠中国药科大学
a计算机教研室
VisualBasic
例:用函数实现求一维数组中的最小值,对比前例(Sub)
PrivateFunctionmin(a()AsInteger)AsInteger
DimiAsInteger
min=a(l)函数类型
Fori=2ToUBound(a)
Ifa(i)<minThenmin=a(i)
函数名=表达式
Nexti
EndSub
应.中国药科大学
32
母计算机教研室
VisualBasic
'程序:
例:定义函数用以判断一个数是否是素数一.
PrivateFunctionPrime(NAsInteger)AsBoolean
DimiAsInteger
Prime=False
可省略,因Prime的初始值就是false
Fori=2ToN-l
IfNModi=0ThenExitFor
Nexti
Ifi=NthenPrime=True
函数名=表达式
EndFunction
「中国药科大学
33
«计算机教研室
[例]:
VisualBasic
例8-3:利用函数过程编写一个求两个正整数的最大公约数的程序
P166
PrivateFunctionGcd(ByValAAsInteger,ByVaiBAsInteger)AsInteger
DimRAsInteger
R=AModB
DoWhileR<>0PrivateSubForm_Click(),上调过程
A=BDimNAsInteger,MAsInteger,GAsInteger
输入
B=RN=InputBoxC'N")
M=InputBoxC'输入M")
R=AModB
G=Gcd(N,M)
LoopPrintN;"和";M;”的最大公约数是:";G
Gcd=BEndSub
EndFunction
35,•滴除中国药科大学
母计算机教研室
VisualBasic
8.3.4调用其他模块中的过程_________'程序:
1、调用其他窗体模块中的公有过程
[格式]:Call〈窗体名>.<过程名>[(〈实在参数表>)]
[功能]:调用其他窗体模块中定义的公有过程。
PrivateSubForm_Click()在Form2
中调用
DimaAsInteger
a=10
PrintFurml.Fact(a)
EndSub
,裕品中国药科大学
b计算机教研室
VisualBasic
2、调用标准模块中的公有过程'程序:
[格式]:Call[<标准模块名>.]<过程名>[(<实参表>)]
[功能]:调用其他标准模块中定义的公有过程。
[说明]:
(a)若公有过程唯一,则直接调用,不加模块名。
(b)若存在同名的公有过程,贝I:
A调用本模块中过程:直接调用,不加模块名
A调用其它模块中过程:必须加模块名。
(c)被调用的函数和过程必须是公有的;
(d)函数也可以这样调用。
37循除中国药科大学
以计算机教研室
VisualBasic
3.调用类模块中的过程'程序:
♦:♦[格式]:^受哀)
dimdemoclassasnewclassl/
calldemoclass,clssub([实参表])]
♦:♦[注意]:
调用类模块中的共有过程,须用该类的某一实例修饰过程。
,念.中国药科大学
38
U计算机教研室
VisualBasic
8.4参数的传递'程序:
8.4.1形参和实参
①形参:
米过程定义时,在过程名后面的圆括号里的一系列变量;
*过程被调用执行时,系统才给形参分配存储空间;
*可以是除定长字符串外的任一简单变量;
*可以是数组,变量名后接括号;
StAsString*3X
St()AsString^37
StAsString<
,念.中国药科大学
39
U计算机教研室
VisualBasic
'程序:
®实参
米主调程序中,调用语句中,出现在过程名后面圆括号里的变
量,是实参,可以是常量、变量或表达式;
*过程调用传递参数时,实参按“位置”和形参结合;
*实参和形参,要求个数一样,位置对应,类型一致,否则
会出错;
*定长字符串变量可以作为实参;
健去中国药科大学
40
计算机教研室
VisualBasic
参数结合P168'程序选id
形参实参
变量变量、常量、表达式、数组元素
数组数组
,裕品中国药科大学
41
a计算机教研室
VisualBasic
举例'程序:
VisualBasic
举例:写出下列程序执行的结果'程序选id
PrivateSubExamSubf\asinteger,y^asinteger)
x=x+10:y=y-10
过程的先
EndSub后顺序无
PrivateSubForm-click()
o
Dimxasinteger,yasinteger
x=10:y=100—
CallExamSub(y,x)--------------
调用子过程时,进行的实
Print“x=”;x;"y=”;y际操作是丫=丫+10双=乂-10
EndSub
,裕品中国药科大学
43
a计算机教研室
VisualBasic
8.4.2按值传递参数'程序:
[格式]:ByVaiv变量说明》
[传递方式]:
调用时,系统为形参分配一个临时存储单元,并修实参
的值存储到该临时单元中。
若在被调用的过程体中改变了形参的值,只是改变了临时
存储单元中的数据,对实参的值无任何影响。
,裕品中国药科大学
44
以计算机教研室
VisualBasic
[参数传值传递]举例'程序:
PrivateSubForm_Click()
DimMAsInteger,NAsInteger
M=15:N=20
CallValue_change(M,N)
Print,,M金;MJ,N=,,;N
EndSub
PrivateSubValue_change(ByValxAsInteger,ByVaiyAsInteger)
x=x+20
y=y+20
PrintnX=n;x,"Y=";y
EndSub
,念.中国药科大学
45
b计算机教研室
传值是单向的VisualBasic
'程序选id
实在参数
形式参数
调用时,实参将值传递给形参,两者就无任何关联。过
程中形参的值发生变化,对实参无任何影响。
扁中国药科大学
y计算机教研室
VisualBasic
8・4・3按地址传递参数'程序:
[格式]:ByRefv变量说明,
[传递方式]:
系统在调用执行过程时,为形参分配临时存储单元,并修实
参的内存单元地址传送给形参,存储在临时存储单元中
在被调用的过程体中一切对形参的操作,都是直接对地址保
存在形参中的内存单元中的数据进行的,而实参就是保存在此内
存单元中的数据,所以任何对形参的操作也就是对实参的操作;
按地址传递时,形式参数和实在参数共用同一“内存单元”。
,裕品中国药科大学
47
以计算机教研室
[参数传址传递]举例:(对比前例)VisualBasic
'程序选id
PrivateSubForm_Click()
DimMAsInteger,NAsInteger
M=15:N=20
CallValue(M9N)
PrintMM=M;M,nN=M;N
EndSub
PrivateSubValue(xAsInteger,yAsInteger)
x=x+20
y=y+20
PrintnX=n;x,nY=n;y
EndSub
应.中国药科大学
48
U计算机教研室
传地址是双向的VisualBasic
'程序选id
实在参数
形式参数
,谕中国药科大学
49
以计算机教研室
举例:计算VisualBasic
5!+4!+3!+2!+1!P171'程序选id
PrivateSubForm_Click()
DimSumAsInteger,IAsInteger
ForI=5To1Step-1
Sum=Sum+Fact(I)M回昭
NextISum-120
PrintnSum=n;Sum
EndSub
PrivateFunctionFact(nAsInteger)AsInteger
Fact=1
DoWhilen>0修改:
Fact=Fact*n方法一:在形参n前加ByVai
n=n-1
Loop方法二:将调用语句中fact⑴改为
EndFunctionfact((i)):
1*4儿的C叨逮
注意VisualBasic
'程序:
参数有两种传递方式:传值(ByVai)和传地址(ByRef)o
若调用时实参为常量或表达式,这两种方式没有区另山无论形
参定义的是按值传递还是按地址传递,系统都是按传值方式传递
系统在调用时为形参分配一个临时存储单元,圈表达式的值
计算出来,存储到该临时单元;调用结束,系统收回临时单元。
调用函数或过程时,将单个变量转换成表达式的方法:将变
量放在一对括号中。如用Fact((I))的方式调用函数,系统会按传
值来处理。
中国药科大学
51信.
U计算机教研室
注意VisualBasic
♦按地址传递时,当实参是变量时,实参与形参必须类型完
全一致;
♦按地址传递时,当实参是常量或表达式时,VB会自动进
行类型转换,然后再传递相应的值(即类型无须完全一致);
♦在算术表达式中,函数的优先级最高,若表达式中有函数
的实参,而函数的参数又是按地址传递的,则函数中有可能改变
了实参的值,即改变了表达式中变量的值,会引起混淆。
,念.中国药科大学
52
U计算机教研室
VisualBasic
'程序:
PrivateSubForm_Click()
DimSAsSingle
S=125.5
CallConvert(⑸,”12笛.5”)
EndSub
实际的参数传递方式是按
Sing=Sing+23值传递,强制转换后,
Print“Inx=";Inx,"Sing=";Singinx=126sing=12・5
EndSub
T产1
'计算
练习
4
(1)写出程序运行结果(2)若改为按值传递,结果又如何?
DimpAsinteger,qAsinteger,rAsinteger
PrivateSubForm_Click()
p=2:q=3
Printp9q,r
Callpq(p,q,r)
Printp,q,r
EndSub
PrivateSubpq(xAsinteger,yAsinteger,zAsinteger)
x=p+q
y=p-q
z=x+y
EndSub
A学
练习VisualBasic
'程序选id
写程序运行的结果-------
OptionExplicit*gorml|-||n||X
PrivateSubcommandl_click()
工二11产2K=43
DimiAsInteger,jAsInteger
DimkAsInteger
i=l:j=2
k=fun(i,fun(i,j))+i+j.笄逋
PrintnI=n;i;j;"K='';k
EndSub
PrivateFunctionfun(aAsInteger,ByVaibAsInteger)AsInteger
a=a+b
b=b+a
fun=a+b
EndFunction
VisualBasic
8.4.4数组参数'程序:
VB允许把数组作为形式参数,声明数组的格式是:
v数组名〉()Asv数据类型,
[注意]:
(1)数组参数只能按地址传递,即不能用ByVa]来4变饰数组参数
(2)定义数组参数时无须说明数组的维数和下标变化范围;
(3)调用过程时,对应的实在参数也必须是数组,但只需要数
组名,无须后跟括号,且数据类型也要一致。、
(4)在过程体或函数体中无须对数组参数再次说明;
(5)若实参是动态数组,在过程体或函数体中可以使用重定义
语句修改数组的维界;
京东中国药科大学
57学计算机教研室
举例VisualBasic
PrivateSubForm_Click()PrivateSubPrintArray(x()AsInteger)
Dima()AsInteger,iAsIntegerDimiAsInteger
DimnAsIntegerFori=LBound(x)ToUBound(x)
n=InputBox("请输入数组的初始大小,Printx(i);
ReDima(n)Nexti
Fori=1TonPrint
a(i)=iEndSub
NextiPrivateSubArrayl(a()AsInteger)
CallPrintArray(a)DimmAsInteger,nAsInteger
CallArrayl(a)n=UBound(a)
CallPrintArray(a)m=InputBox—请输入新大小”)
EndSubReDimPreservea(m)
输入5和8,程序执行结果为:DimiAsInteger
Fori=n+1Tom
a(i)=0
Nexti
EndSub
举例:自定义一个将一维数组按从小到大排序的通用过程。
PrivateSubsort(a()AsInteger)PrivateSub
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年塔吊施工安全防护合同
- 2024年度互联网金融服务平台合作合同
- 2024年度广告位代理销售合同(新媒体广告)
- 胶带分配器机器市场发展预测和趋势分析
- 贵金属制钱包市场发展现状调查及供需格局分析预测报告
- 2024年度旅游活动赞助合同:旅游赛事赞助与合作协议
- 2024年度智能硬件产品代理销售合同
- 2024年度储藏室保险服务合同
- 洁厕凝胶市场发展预测和趋势分析
- 2024年度办公楼智能化升级合同:某智能化公司与某办公楼物业管理公司关于智能化升级的合同
- 2023-2024学年广东省深圳市南山区八年级(上)期末英语试卷
- 2023~2024学年第一学期高一期中考试数学试题含答案
- 非遗漆扇扇子科普宣传
- GB/T 15822.1-2024无损检测磁粉检测第1部分:总则
- 2024广西专业技术人员继续教育公需科目参考答案(100分)
- MOOC 马克思主义民族理论与政策-广西民族大学 中国大学慕课答案
- 一种基于STM32的智能门锁系统的设计-毕业论文
- 音乐教师职业生涯发展报告
- 人员编制及岗位调整表.doc
- (推荐)浅谈初中学生英语写作中存在的问题、原因及解决策略
- 七年级历史教案:林则徐的教学设计
评论
0/150
提交评论