过程调用范文

2024-06-21

过程调用范文(精选7篇)

过程调用 第1篇

scanf的功能是从标准输入设备读取输入的任何固有类型的数据自动转换成机内格式并把数据输入到指定的变量之中, 返回正确读入数值的个数。函数原型主要代码如下:

2 scanf函数调用

2.1 调用格式

scanf (格式控制, 地址表列) ;“格式控制”为格式字符串, 将用户输入的数据转换为指定格式;“地址表列”由若干个地址组成的参数表列, 可以是变量的地址或字符串首地址。原型中_cdecl是c中的默认函数调用方式, 调用函数参数自右向左入栈, 因此scanf函数左边的第一个参数format被放于栈顶。

2.2 参数入栈

C调用协议下, 为遵循对齐原则, 要求每个变量地址都是sizeof (int) 的倍数, 因此参数入栈都是整数字节。同时调用不带原型声明的函数时, 调用者会对每个参数执行“默认实际参数提升”。从scanf函数调用格式中, 可变参数是若干个地址列表 (指针) , C中为每个指针变量统一分配4个字节, 即可变参数入栈时都占用4个字节, 满足了对齐原则, 与指针指向的变量类型没有关系。这与printf函数调用时参数入栈不一样。

2.3 格式字符串与标准输入流的匹配

参数入栈后, 编译器先获取格式字符串, 对照字符串中的各项, 从内存缓冲区中取数据, 若没有数据, 则等待用户输入。用户通过键盘输入数据, 数据回显于显示器上, 同时数据被存入内存缓冲区 (不是键盘缓冲区) 中。为什么?scanf源码中, 函数功能的实现依靠vscanf函数调用_input_l, 而_input_l的函数功能是把键盘输入数据写入stdin (标准输入流) 来创建一个临时交换文件的缓冲区, 只有当用户输入回车后, scanf函数开始从内存缓冲区取数据。在接收数据时, 对照字符串的各项, 并按匹配规则, 逐一取数:内存缓冲区中, 读取时顺序读取写入的数据, 即先读先写入的数据再读后写入的数据, 这与对字符串中从左到右匹配顺序一致, 匹配规则如下:C99中, 格式字符串有如下三种类型字符:

⑴格式说明符:遇到格式说明符去读取缓冲区时, 匹配分两步, 首先是格式字符与缓冲区数据类型匹配, 然后格式字符与对应参数指向的变量类型匹配。匹配时先将缓冲区中一个或多个连续的空白字符 (格式字符为字符型除外) 移出并去掉, 再将格式符与缓冲数据进行匹配 (见 (四) ) , 若类型匹配, 则读取缓冲区中直到遇到非法字符 (与指定类型不匹配的字符) 或者达到输出宽度要求前的数据, 再将数据送到与格式字符类型匹配的变量中去 (借助三个宏va_start;va_arg;va_end访问后面每个参数) 。若格式字符类型与缓冲区数据不匹配, stdin流被阻塞, scanf函数不在读取后面的部分。若格式字符与后面的参数类型不一致, 则丢弃数据。

因此匹配格式字符时, 输入流中开始读取到的空白字符 (尤其对字符串中多个数值型格式字符紧挨着时, 需要输入的一个或多个空白字符) 对匹配没有任何影响, 自动略去。也就是匹配格式字符时, 输入流中可以输入任意多个空白字符。如scanf (“%d”, &a) ;输入时可以直接输入整数, 也可以输入一个或者多个空白字符再输入整数, 结果一样。

⑵空白符:可以是空格、制表符和新行符。字符串中的空白字符的作用是使scanf函数在读操作中略去输入流中的一个或多个空白字符。因此, 空白符是使scanf在输入流中读, 但不保存结果, 直到发现非空白字符为止, 同时将栈中字符串位置指向下一个非空白字符。

因此匹配空白字符时, 入栈的空白字符与输入流中不一定匹配, 因为这时候字符串中的空白字符对字符串来说就是一个分隔符, 输入数据时用户即可以输入相同个或更多个空白字符也可以不输入 (当多个数值型格式字符由空白字符隔开时, 在输入时必须输入空白字符) , 对读取数据没有任何影响, 因为字符串中空白字符可以略去输入流中的多个连续空白字符。

⑶非空白符:使scanf () 根据栈中字符在流中读匹配的字符并放弃。如“a=%d”, 使scanf读取流中a=并放弃, 如未发现匹配, scanf () 返回。若字符串中非空白字符前面没有空白字符, 在输入数据时, 一定不要输入空白字符。例:scanf (“a=%d”, &a) ;输入时第一字符只能是a, 若是空格则结果不对。栈中的a与输入流中的空格不匹配, 因为空白字符不会自动略去。

2.4 格式字符匹配输入流中的数据

如f, 则告诉scanf接收数据的变量是float类型, 需从输入流中读取一个单精度数, 再放入float类型变量中;如果将L/l放在前面, 则告诉scanf接收数据的变量为double。可以看出输入时区别%f, %lf的, 这与printf函数不同。使用printf时, f遵循提升规则表示double类型。而scanf匹配时首先是根据格式字符类型读取数据, 再将数据输入对应变量。假如scanf中f代表double, 表示从输入流读取双精度数, 若%f对应的变量是单精度, 那不能保证将一个double型的数放到一个float类型中, 原因是定义变量时float, double分别分配4个字节, 8个字节, 向变量输入数据时是受字节限制的。因此输入数据时要区分float, double, %f代表两种类型不行。

3 总结

scanf函数在C中应用比较频繁, 本文详细分析了scanf函数调用过程, 重点分析了格式字符串中三种类型的字符与内存缓冲区匹配的过程, 希望对使用scanf函数有正确指导意义。

摘要:scanf函数是C语言中最基本的输入函数, 本文通过分析scanf函数调用过程中的实现机制, 以帮助正确使用scanf函数。

关键词:C,scanf函数调用,实现机制

参考文献

[1]谭浩强.C语言程序设计[M].北京.清华大学出版社.2011.

过程调用 第2篇

分类: PL/SQL系列 2009-09-24 15:08 253人阅读 评论(0)收藏 举报

声明:

以下的例子不一定正确,只是为了演示大概的流程。

一:无返回值的存储过程 存储过程为:

CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2)AS BEGIN

INSERT INTO HYQ.B_ID(I_ID,I_NAME)VALUES(PARA1, PARA2);END TESTA;

然后呢,在java里调用时就用下面的代码: package com.hyq.src;

import java.sql.*;import java.sql.ResultSet;

public class TestProcedureOne {

public TestProcedureOne(){

}

public static void main(String[] args){

String driver = “oracle.jdbc.driver.OracleDriver”;

String strUrl = “jdbc:oracle:thin:@127.0.0.1:1521: hyq ”;

Statement stmt = null;

ResultSet rs = null;

Connection conn = null;

CallableStatement cstmt = null;

try {

Class.forName(driver);

conn = DriverManager.getConnection(strUrl, “ hyq ”, “ hyq ”);

CallableStatement proc = null;

proc = conn.prepareCall(“{ call HYQ.TESTA(?,?)}”);

proc.setString(1, “100”);

proc.setString(2, “TestOne”);

proc.execute();

}

catch(SQLException ex2){

ex2.printStackTrace();

}

catch(Exception ex2){

ex2.printStackTrace();

}

finally{

try {

if(rs!= null){

rs.close();

if(stmt!=null){

stmt.close();

}

if(conn!=null){

conn.close();

}

}

}

catch(SQLException ex1){

}

}

} }

二:有返回值的存储过程(非列表)

当然了,这就先要求要建张表TESTTB,里面两个字段(I_ID,I_NAME)。

存储过程为: CREATE OR REPLACE PROCEDURE TESTB(PARA1 IN VARCHAR2,PARA2 OUT VARCHAR2)AS BEGIN

SELECT INTO PARA2 FROM TESTTB WHERE I_ID= PARA1;END TESTB;

在java里调用时就用下面的代码: package com.hyq.src;

public class TestProcedureTWO {

public TestProcedureTWO(){

}

public static void main(String[] args){

String driver = “oracle.jdbc.driver.OracleDriver”;

String strUrl = “jdbc:oracle:thin:@127.0.0.1:1521:hyq”;

Statement stmt = null;

ResultSet rs = null;

Connection conn = null;

try {

Class.forName(driver);

conn = DriverManager.getConnection(strUrl, “ hyq ”, “ hyq ”);

CallableStatement proc = null;

proc = conn.prepareCall(“{ call HYQ.TESTB(?,?)}”);

proc.setString(1, “100”);

proc.registerOutParameter(2, Types.VARCHAR);

proc.execute();

String testPrint = proc.getString(2);

System.out.println(“=testPrint=is=”+testPrint);

}

catch(SQLException ex2){

ex2.printStackTrace();

}

catch(Exception ex2){

ex2.printStackTrace();

}

finally{

try {

if(rs!= null){

rs.close();

if(stmt!=null){

stmt.close();

}

if(conn!=null){

conn.close();

}

}

}

catch(SQLException ex1){

}

}

} }

}

注意,这里的proc.getString(2)中的数值2并非任意的,而是和存储过程中的out列对应的,如果out是在第一个位置,那就是proc.getString(1),如果是第三个位置,就是proc.getString(3),当然也可以同时有多个返回值,那就是再多加几个out参数了。

三:返回列表

由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了.所以要分两部分,1,建一个程序包。如下:

CREATE OR REPLACE PACKAGE TESTPACKAGE AS

TYPE Test_CURSOR IS REF CURSOR;end TESTPACKAGE;

2,建立存储过程,存储过程为:

CREATE OR REPLACE PROCEDURE TESTC(p_CURSOR out TESTPACKAGE.Test_CURSOR)IS BEGIN

OPEN p_CURSOR FOR SELECT * FROM HYQ.TESTTB;END TESTC;

可以看到,它是把游标(可以理解为一个指针),作为一个out 参数来返回值的。在java里调用时就用下面的代码: package com.hyq.src;import java.sql.*;

import java.io.OutputStream;import java.io.Writer;

import java.sql.PreparedStatement;import java.sql.ResultSet;import oracle.jdbc.driver.*;

public class TestProcedureTHREE {

public TestProcedureTHREE(){

}

public static void main(String[] args){

String driver = “oracle.jdbc.driver.OracleDriver”;

String strUrl = “jdbc:oracle:thin:@127.0.0.1:1521:hyq”;

Statement stmt = null;

ResultSet rs = null;

Connection conn = null;

try {

Class.forName(driver);

conn = DriverManager.getConnection(strUrl, “hyq”, “hyq”);

CallableStatement proc = null;

proc = conn.prepareCall(“{ call hyq.testc(?)}”);

proc.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR);

proc.execute();

rs =(ResultSet)proc.getObject(1);

while(rs.next())

{

System.out.println(“” + rs.getString(1)+ “”+rs.getString(2)+“”);

}

}

catch(SQLException ex2){

ex2.printStackTrace();

}

catch(Exception ex2){

ex2.printStackTrace();

}

finally{

try {

if(rs!= null){

rs.close();

if(stmt!=null){

stmt.close();

}

if(conn!=null){

conn.close();

}

}

}

catch(SQLException ex1){

}

}

} }

四。Hibernate调用存储过程

Connection con = session.connect();

CallableStatement proc = null;

con = connectionPool.getConnection();

proc = con.prepareCall(“{ call set_death_age(?, ?)}”);proc.setString(1, XXX);

proc.setInt(2, XXx);...proc.execute();

session.close();

在Hibernate中调用存储过程的示范代码--

如果底层数据库(如Oracle)支持存储过程,也可以通过存储过程来执行批量更新。存储过程直接在数据库中运行,速度更加快。在Oracle数据库中可以定义一个名为batchUpdateStudent()的存储过程,代码如下:

create or replace procedure batchUpdateStudent(p_age in number)as begin update STUDENT set AGE=AGE+1 where AGE>p_age;end;以上存储过程有一个参数p_age,代表学生的年龄,应用程序可按照以下方式调用存储过程: tx = session.beginTransaction();Connection con=session.connection();String procedure = “{call batchUpdateStudent(?)}”;CallableStatement cstmt = con.prepareCall(procedure);cstmt.setInt(1,0);//把年龄参数设为0 cstmt.executeUpdate();tx.commit();在以上代码中,我用的是Hibernate的 Transaction接口来声明事务,而不是采用JDBC API来声明事务。

存储过程中有一个参数p_age,代表客户的年龄,应用程序可按照以下方式调用存储过程:

代码内容

tx = session.beginTransaction();Connection con=session.connection();

String procedure = “{call batchUpdateCustomer(?)}”;

CallableStatement cstmt = con.prepareCall(procedure);

cstmt.setInt(1,0);//把年龄参数设为0

cstmt.executeUpdate();

tx.commit();

CREATE procedure selectAllUsers DYNAMIC RESULT SETS 1 BEGIN

DECLARE temp_cursor1 CURSOR WITH RETURN TO CLIENT FOR

SELECT * FROM test;

OPEN temp_cursor1;END;

映射文件中关于存储过程内容如下

............

{ ? = call selectAllUsers()}

{ ? = call selectAllUsers()} 也可以写成{ call selectAllUsers()},如果有参数就写成

{ ? = call selectAllUsers(?,?,?)}

代码中对query设置相应位置上的值就OK Java调用关键代码如下

Session session = HibernateUtil.currentSession();

Query query = session.getNamedQuery(“selectAllUsers”);

List list = query.list();

System.out.println(list);

要求你的存储过程必须能返回记录集,否则要出错

如果你的存储过程是完成非查询任务就应该在配置文件用以下三个标签

{call createPerson(?, ?)}

{? = call deletePerson(?)}

{? = call updatePerson(?, ?)} 有一点不好的地方就是调用存储过程获取记录集时,不能对Query使用

快速调用常用的手机应用 第3篇

A:这里推荐安装一款名为Arrow Launcher的应用,它是微软出品的一款Android系统桌面。这款应用安装完成后,首先会自动扫描系统里面已经安装的应用,接着要求用户设置五款自己最常用的应用。设置完成后在“应用”界面的最上方,显示的就是设定的五款应用,另外在“最近”界面中还可以显示出刚刚使用过的应用。

一键检测Android系统存在的漏洞

Q:现在Android系统的安全问题层出不穷,所以Google几乎每月都要推送安全补丁。但是我们知道国内的手机不能及时更新这些补丁,那么有没有什么方法可以第一时间检测出漏洞呢?

A:首先推荐用户安装一款名为“VTS for Android”的应用,接着开启应用就可以在界面显示出设备的型号、系统版本号等信息。点击右下方查找漏洞的FAB浮动按钮,即可开始寻找Android系统中存在的漏洞,并很快显示出漏洞的详细列表。如果某个漏洞已经被修复,就会显示为绿色,如果没有修复就显示为红色。

如何输入货币符号

Q:现在网购流行,所以我们经常会在网上进行询价,这时就需要输入一些货币符号,但是我找来找去都没有在iOS系统里面发现。请问是不是需要第三方输入法才可以解决这个问题啊?

A:其实你所说的这个问题根本不需要第三方的输入法,利用系统里面默认的输入法就可以做到。首先点击键盘左下角中的“123”按钮,将键盘切换到数字内容,这时在键盘的第二行可以看到一个“¥”的图标。将手指按在这个键上不放,然后滑动到相应国家的货币符号上面就可以了。

iOS系统如何进行大写锁定

Q:苹果公司要求用户的账号密码,需要有数字和英文的组合,而且还需要有大写字母。但是每次输入大写字母的时候又比较麻烦,有没有什么方法可以进行大写锁定啊?

A:首先在键盘上找到Shift键,接着快速连按它两次,这时你会发现在Shift键的底部出现了一条黑色的水平线,这就表示此时键盘输入已经处于大写锁定的状态了。如果用户快速按Shift键没有效果的话,那么首先打开设置窗口,点击“通用”中的“键盘”选项,找到“启用大写字母锁定键”项启用它就可以了。

X浏览器怎么过滤广告信息

Q:我现在使用的是X浏览器的Android版,这款浏览器启动运行都非常快速。最近听说这款浏览器有广告过滤的功能,找来找去都没有发现。请问这一功能在哪里?

过程调用 第4篇

文中采用JDK版本即JDK1.6版, JDK1.6官方下载地址:http://www.java.net/download/jdk6/6u10/promoted/b32/binaries/jdk-6u10-rc2-bin-b32-windows-i586-p-12_sep_2008.exe, 下载好后可以按默认路径安装, 然后进行Jdk环境变量的配置, 可以按以下步骤进行:首先找到jdk的bin目录, 例如默认路径安装为:C:Program FilesJavajdk1.6.0_18, 将其路径名复制, 然后打开“我的电脑”的“属性”窗口, 找到“高级”, 点击“环境变量”按钮, 找到系统变量中的“PATH”, 双击“PATH”记录, 弹出“编辑系统变量”窗口, 在变量值的最后加上分号和jdk的bin目录, 如:;C:Program FilesJavajdk1.6.0_18bin。然后新建变量CLASSPATH, 变量值为C:ProgramFilesJavajdk1.6.0_18jrelibrt.jar。最后新建变量JA-VA_HOME, 变量值为C:Program FilesJavajdk1.6.0_18。

(2) Oracle的简单介绍和oracle的jdbc驱动包 (classes12.jar) 的配置

Oracle的关系数据库, 目前是大客户首选的数据库, 所以在校计算机专业的大学生、社会在职计算机人员学习好掌握好Oracle数据库对以后就业、高薪是一个很好的敲门砖。文中采用的是Oracle10g, Oracle10g下载安装好后, 点击“开始”“运行”输入cmd后, 按“确定”。弹出MS-DOS窗口后, 输入:sqlplus scott/tiger, 出现“SQL>”提示符后输入:SQL>SE-LECT*FROM emp;看有没有记录, 有就代表Oracle安装成功了。Java程序要调用Oracle数据库还必须配置jdbc驱动包 (classes12.jar) , Oracle10g安装好后, jdbc驱动包 (classes12.jar一般在..jdbclib目录下, 如本文oracle10g的安装目录为E:oracleproduct10.2.0db_1jdbclib, 所以jdbc驱动包 (classes12jar) 的配置为双击前面所建的的变量CLASSPATH, 增加变量值:;E:oracleproduct10.2.0db_1jdbclibclasses12.jar。如果没配置好jdbc驱动包就会出现java.lang.ClassNotFoundException oracle.jdbc.driver.OracleDriver异常。

(3) 编写Oracle存储过程

首先建立一个返回游标, 用于返回记录集到Java程序中, 语句如下:

如图1所示。

然后创建一个存储过程, 主要功能是取出部门号小于某个值的员工信息, 当然在具体编程的时候用到的SQL语句要复杂得多, 但原理还是相同的。语句如下:

如图2所示。

(4) 编写一个Java程序并调用Oracle存储过程

下面是完整的Java程序代码, 文件名为JdbcOracleTest.java, 通过Javac JdbcOracleTest.java后, 再Java JdbcOracleTes可以输出相应的值。如图3所示。

在Flash中调用Date对象 第5篇

双击打开Flash的主界面,新建一个文件,设定影片大小为128×128像素。选择文本工具(图1),打开Text Optionsn属性面板,在面板的下拉列表中选择DynamicText(动态文本框),在画板中绘制一个无边的动态文本框。为了让Flash能够识别这一文本框,必须为其赋予一个变量名,如:dateTextField1,把该变量名填入Text Options的变量栏里,作为文本框的标识(图2)。

在图层1的第一关键帧里单击右键,从弹出的快捷菜单里选择Actions命令,打开Fra-me Actions面板,单击它的右上角,选择“专家模式”,这时就可以在动作编辑窗口中输入如下脚本:

myDate=newDate();//创建新的日期对象

dateTextField1=(mydate.getFullYear()+"年"+(mydate.getMonth()+1)+"月"+mydate.getDate()+"日" );

//根据本地机时间获取当前年、月、日,然后传递到动态文本框中输出

按同样的步骤新建图层2,在第一帧里绘制一个动态文本框,定位在dateTextField1的下方,命名为dateTextField2,在帧动作中输入如下脚本:

myDate=newDate();//创建新的日期对象

dateTextField2=mydate.getHours()+":"+mydate.get

Minutes()+":"+mydate.getSeconds();

//根据本地机时间获取当前小时、分钟、秒,然后在动态文本框中输出

需要注意的是,读取getHours()命令时,Flash MX以前的版本会出现把系统时间23默认为0的现象,针对这种现象我们可以把上面的脚本做一些修改:

dateTextField2=mydate.getHours()-1+":"+mydate. get

Minutes()+":"+mydate.getSeconds();

新建图层3,在第一帧绘制一个动态文本框,同样定位在dateTextField2的下方,命名为dateText-Field3,在帧动作中输入如下脚本:

myDate=newDate();//创建新的日期对象

myDay=myDate.getDay();

myHour=myDate.getHours();//分别把星期几、小时赋值给变量myDay、myHour中

if ( myDay < 1 ) {

myDay="日";

} else if ( myDay < 2 ) {

myDay="一";

} else if ( myDay < 3 ) {

myDay="二";

} else if ( myDay < 4 ) {

myDay="三";

} else if ( myDay < 5 ) {

myDay="四";

} else if ( myDay < 6 ) {

myDay="五";

} else {

myDay="六";

}

//判断当变量为星期几时,返还相对应的大写字符,改变日期的输入格式

if ( myHour <= 6 ) {

myHour="凌晨好! ";

} else if ( myHour <= 11) {

myHour="上午好! ";

} else if ( myHour <=13) {

myHour="中午好! ";

} else if ( myHour <= 18) {

myHour="下午好! ";

} else if ( myHour <= 21) {

myHour="晚上好! ";

} else if ( myHour <=24) {

myHour="晚安! ";

}

//判断当变量小于或等于什么时间,则反馈相对应的问候语

dateTextField3="星期"add myDay+" "+myHour;

//把字符“星期”及问候语与获得的日期数连接,然后在动态文本框中输出

最后,分别在三个图层中插入第二关键帧,在Actions命令中添加goto动作:

gotoAndPlay(1);//当程序运行到这里时,循环跳转执行第一帧

过程调用 第6篇

1 过程的定义

1.1 Sub过程

定义Sub过程的一般形式为:

1.2 Function过程

定义Function过程的一般形式为:

[Private|Public][Static]Function函数名([参数列表])[As数据类型]

“参数列表”的含义同上,过程中的“函数名=表达式”就是实现返回值的语句,“As数据类型”为返回值的数据类型[3]。

可见,子程序过程(Sub Procedure)和函数过程(Function Procedure)的区别为:Sub过程不返回值,而Function过程返回一个值。

2 调用方式

2.1 Sub过程调用

VB用两种方式调用Sub过程:一种是使用Call语句,一种是把过程名作为一个语句来使用[4]。

1)用Call语句调用Sub过程

调用Sub过程的形式如下:

Call<过程名>[(实参表)]

实参表中实参的个数可以为多个,若有多个参数时各实参之间用逗号分隔。若被调用的过程是个无参过程,则括号可省略。

2)把过程名作为一个语句来用

调用过程的形式为:

<过程名>[实参1[,实参2,…]]

与第一种方法相比,它有两点不同:一是不需要关键词Call;二是实参表不需要加括号。

2.2 Function过程

1)调用Function过程的形式如下:

Function<过程名>([实参表])

若被调用的过程是个无参过程,则括号不能省略。

2)用Call语句调用Function过程

Call<过程名>[(实参表)]

3)把过程名作为一个语句来用

过程名[实参1[,实参2,…]]

后两种方法调用函数时,会放弃函数的返回值。

3 参数和参数的传递

3.1 参数

3.1.1 形参

Sub过程和Function过程定义中参数列表里的参数称为形式参数,简称形参。形参表中的各变量之间要用逗号分隔,形参可以是:

1)除定长字符串变量之外的合法变量名。

2)后面跟有左、右圆括号的数组名。

3.1.2 实参

实参是调用Sub或Function过程时传递给相应过程的变量名、数组名、常数或表达式,它们包含在过程调用的实参表中。

3.2 参数的传递

3.2.1 按地址传递

按地址传递参数时,过程所接受的是实参变量(简单变量、数组元素、数组以及记录等)的地址。即,形参和实参共用内存的“同一”地址,即共享同一个存储单元。形参值在过程中一旦被改变,相应的实参值也跟着被改变。实现地址传递有下面两种方法:

1)形参前加“By Ref”关键词或缺省

例1:运行下面的程序,单击命令按钮,输出的结果是()

由于形参x前加了By Ref关键词,则表示是按地址传递;形参y前没有任何关键词,也表示是按地址传递。

2)数组作为形参

数组作为形参时是按地址传递参数。对应实参必须是数组名,且数据类型必须和形参数组的数据类型相一致。

例2:对随机生成10个两位正整数进行升序排序。

3.2.2 按值传递

按值传递是将实参的值复制给形参,传递的只是实参的副本[5]。因此,过程对形参的任何改变不会影响实参的值。

1)形参前加“ByVal”关键词

例3:运行下面的程序,单击命令按钮,输出的结果是( )

首先,实参a和b分别将值123和253传给形参x和y。在S1过程中执行t=x:x=y:y=t后x和y的值进行了交换。但是x和y值的变化不会引起x和y值的变化。因此输出的结果是a=123 b=253。

2)变量转换为表达式

在VB中把变量转换成表达式的最简单的方法就是把它放在括号内。

例4:运行下面的程序,单击命令按钮,输出的结果是()

运行上述程序,执行Call S1((a),b*2)语句时,调用S1过程,VB首先将整型实参变量a转换为表达式,然后传递给形参x,这里是按值传递。接着计算表达式b*2的值,得到506,然后再按值传递给形参y。形实结合完成后,开始执行函数过程,程序的输出结果为:a=123 b=253。

4 结束语

在程序设计中,经常会遇到过程调用。该文结合实例分析了VB过程调用以及参数传递的两种方式。为了让学生更好地理解这个知识点,还应该在教学过程中深入研究,再配合实例形象地讲解这部分内容。

参考文献

[1]牛又奇,孙建国.Visual Basic程序设计教程[M].苏州:苏州大学出版社,2010.125-142.

[2]王杰华,郑国平.Visual Basic程序设计实验教程与习题选解[M].北京:中国铁道出版社,2009.118-128.

[3]宋俊荣,古秋婷,马丽芳.VB过程调用的参数传递问题[J].电脑知识与技术,2009,5(21):6060-6061.

[4]鲁松.基于等级考试的VB参数传递教学研究[J].廊坊师范学院学报:自然科学版,2011,11(5):92-93.

便捷调用ExcelVBA代码 第7篇

如图1所示的办公设备表, 现在要提取其中指定时间范围内的数据, 并且将提取出的数据复制到H5单元格区域内, 步骤如下:

1. 单击菜单栏-视图-宏-录制宏, 出现“录制新宏”对话框。

2. 在录制新宏对话框中, 单击确定按钮即可开始录制宏。

3. 保持宏录制开启状态下, 然后进行下一步操作。

4. 单击E菜单栏数据-筛选-高级, 弹出高级筛选对话框。

在高级筛选对话框中选择“将筛选结果复制到其他位置”。

5. 单击“列表区域”后面的按钮之后, 用鼠标选中办公设备表的A1至F10区域, 即整个数据区域。

6. 单击“条件区域”后面的按钮之后, 用鼠标选中办公

设备表的H2至I3区域, 即指定的生产日期范围。

7. 单击“复制到”后面的按钮之后。

8. 筛选出的数据将自动复制到H5单元格范围内。

9. 单击菜单栏-视图-宏-停止录制宏。

1 0. 录制好的宏可以在菜单栏-视图-宏-查看宏, 中进行查看, 修改和编辑 (快捷键Alt+F8) 。

1 1. 单击编辑按钮, 可以进入Visual Basic编辑器, 查看和修改我们录制好的VBA代码 (宏) 。

1 2. 如果获得的代码有多余的部分, 可以适当的进行整理和删改。

通过本例我们成功的录制了宏并且获得了有效的VBA代码, 提高EVBA技术的使用水平, 最有效的办法就是通过实例分析和在工作中的实际操作。而要真正掌握VBA编程, 不仅要熟悉VBA的基本语法和Excel, 在学习的过程中还应不断制定切实可行的学习目标, 就如同本案例一样, 利用VBA知识简化了实际工作中数据筛选的问题, 这样才能开发出适合自己本职工作的Excel应用程序, 激发学习VBA的热情和兴趣, 从而提高我们的实际工作效率。

参考文献

[1]沃肯·巴赫, 冉豪, 崔婕.中文版Excel2010高级VBA编程宝典.清华大学出版社.2012-01-01

[2]黎升洪.Access数据库应用与VBA编程.中国铁道出版社.2011-01-01

上一篇:广西非物质文化遗产下一篇:鼻内镜鼻息肉手术