VB资料3.docx
- 文档编号:28998183
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:30
- 大小:57.99KB
VB资料3.docx
《VB资料3.docx》由会员分享,可在线阅读,更多相关《VB资料3.docx(30页珍藏版)》请在冰豆网上搜索。
VB资料3
很多朋友对计算机三级考试上机考试十分茫然,参加这次考试的人有很大一部分是上次机试没有通过的朋友,甚至还有一些考了两次机试都没有通过的……这其中不乏一些C语言学的很不错的高手,大部分人到现在都不明白为什么自己亲手编的程序却是0分……
究竟是什么原因呢?
不就是那100道题目吗?
翻来覆去的看也没有发现自己的程序有什么错误啊,看资料,用模拟盘模拟也是满分啊,可为什么正式考试就是0分呢?
于是很多人甚至把通过上机考试当成一件运气的事了,甚至有的朋友对上机考试感到十分恐惧,然而这其中真正的原因……大家不妨和我一起看一下考试中心命题组的正确答案。
顺便提醒一下大家在考试的时候要注意的问题,希望对大家有所帮助。
第一条:
审题要仔细!
正式考试的时候会遇到很多面熟的题目,这些题目有的似乎和平常资料中看到的一样,然而,千万不要见到面熟的题目而沾沾自喜,因为有很多的“陷阱”会使你审题的时候就出错!
我们看一道所有人都做过的的“数字题目”。
考试中心命题组第23题:
已知在文件in.dat中存有N个实数,(N<200),函数readdat()是读取这N个实数并存入数组xx中。
请编制函数CalValue(),其功能要求:
1、求出这N个实数的整数部分平均值aver;
2、分别求出这N个实数中其整数部分值小于平均值ever的数的整数部分值之和sumint与小数部分之和sumdec
最后调用函数WriteDat()把所求的结果输出到文件OUT8.dat中。
这一题看起来很眼熟,然而你仔细看!
1、aver是整数部分的平均值!
不是普通的哦!
2、整数部分值小于平均值ever的数的整数部分值之和sumint与小数部分之和sumdec!
原来这么复杂!
稍不留心就错了,结果就想当然的0分
考试中心命题组第4题
函数ReadDat()实现从文件ENG.IN中读取一篇英文文章存入到字符
串数组xx中;请编制函数ComWord()分别计算出10个不区分大小写
的英文单词的首字母(b,c,f,s,n,r,u,e,o,p)的频数并依次存入
整型数组yy[0]至yy[9]中,最后调用函数WriteDat()把结果yy
输出到文件PS1.OUT中。
这题也很眼熟,然而你仔细看!
英文单词的首字母,不是平常的字母的个数,是作为单词的首字母的个数啊。
上面两道题目并没有在其他资料上见过,考试的时候也不一定会出,这里仅仅是给大家提个醒儿,正式考试一定要仔细审题,严格按照题目的要求去做,不要受以前做过的题目的影响。
第二条:
一定要考虑除零、溢出、类型转换、精度等细节问题!
虽然我们在平时学C语言的时候老师都提醒过,可是真正到了编程序的时候,却没有几个人会考虑。
这些细节问题似乎并不直接影响题目的输出结果,然而,因为溢出和类型转换错误而造成考试得不到满分的可是大有人在啊!
我们看下面一道最害人的题目!
,很多朋友考了这道题目都没有过。
下面来看看你为什么是0分!
考试中心命题组64题:
请编制函数encryptChar(),按给定的替代关系对数组xx中的所有字符进行替代,
仍存入数组xx的对应的位置上,最后调用函数WriteDat()把结果xx输出到文件PS8.DAT中。
替代关系:
f(p)=p*11mod256(p是数组中某一个字符的ASCII值,f(p)是计算后新字符的ASCII值),
如果原字符小于等于32或大于130,则该字符不变,否则将f(p)所对应的字符进行替代。
这道题目所有的人都做过,但几乎就没有人做对,包括南开无忧在内!
原因就在于这一句!
无忧:
intf;f=(xx[i][k]*11)%256;
南开:
char*pf;*pf=*pf*11%256;
表面看来,好象两个都对,
请你在TC下运行一下下面的代码,看一下结果你就知道了是怎么回事了:
main()
{
charnk='E',*nkp,wuyou='E';
intwy;
nkp=&nk;
*nkp=*nkp*11%256;
wy=wuyou*11%256;
printf("%c%c%c%c\n",nk,*nkp,wuyou,wy);
printf("%d%d%d%d\n",nk,*nkp,wuyou,wy);
}
看到结果了么?
是不是很吃惊啊?
≈≈E≈
-9-969247
大家看到了,南开的结果是负数,连原来的变量nk都变成了负数,这显然错了。
无忧的聪明一点,知道int比char大,定义了个int,对了。
南开错误原因就是在TC2.0中char型变量只有一个字节,根本容纳不下'E'*11,
所以产生了溢出,上次考这道题目没过的同学是不是有所启发呢?
这里给出考试中心命题组的答案:
voidencryptChar(){
inti,k,ch;
for(i=0;i for(k=0;k ch=xx[i][k]; ch=(ch*11)%256; if(! (ch<=32||ch>=130))xx[i][k]=ch; } } 似乎一个例子不能说明什么,那就把上面的数字题目的答案给大家看看: 考试中心命题组23题答案: inti; longval; floatdec; for(i=0;i val=(long)xx[i]; aver+=xx[i]-val; } aver/=(double)N; for(i=0;i val=(long)xx[i]; dec=xx[i]-val; if(dec>aver){ sumint+=val; sumdec+=(xx[i]-val); } } 看到了吧,首先,val的定义,不是我们习惯的int,而是能容纳更大数的long, 这样在求和的时候就不会溢出,无忧和南开的答案没有吧 再看,算aver平均值的细节,不是我们平常习惯的aver/=N,更不是无忧的1.0*sum/N, 而是aver/=(double)N,所以大家在考试的时候要时刻注意你的变量类型,特别是在一些求平均值的题目中,千万要注意,用sum/n的时候,sum的类型一定不要用整形。 第三条: 不要使用快捷键! 很多人在使用TC的时候习惯于用F9,CTRL+F9或者其他的热键,首先F9只是编译了,并没有运行程序,考试一定要运行一下你的程序才会有输出文件,否则一定是0分。 热键在考试的时候是很危险的,因为UCDOS的热键和TC的冲突,CTRL+F9变成了全角半角转换,如果不小心按了,会导致你的程序有中文字符,编译的时候出错,而且很难查找排除错误! 所以建议大家在考试的时候使用ALT+红色字母来调出菜单进行编译调试等步骤,建议步骤为: 写完代码后用ALT+F,S存盘,然后ALT+C,M编译,然后ALT+R,R运行,这样就万无一失了。 第四条: 不要加载任何输入法 上机考试用的DOS环境内存十分有限,如果你加载了任何一个输入法,都有可能造成编译程序的时候出现outofmemory内存不足的情况,到那时就麻烦了。 程序只要写的对就可以,不要画蛇添足的加注释,没有人看的! 第五条: 不要提前交卷! 考场一般使用NOVELL网络,有的时候存在网络状况不好而连接失败等问题。 这时,如果你已经提前交卷的话就不太好了。 另外也可以防止别人有意无意的改动你的程序。 第六条: 考试时候的一些技巧 1、进入TC以后如果想查看题干要求,不用退出TC,直接用F12就可以显示出来。 2、用F12显示题目之后可以通过CTRL+BACKSPACE把题目定在屏幕上。 3、编译运行之后,可以通过typeout.dat或editout.dat或tcout.dat查看输出文件。 (千万不要改动! 不然影响考试结果。 如果不小心改动,再重新编译运行一次你的程序就可以了) 4、如果考试的时候不小心改动了代码的主函数或其他部分,可以进入考生目录下的warn隐藏目录, 把里边的备份文件复制到考生目录。 步骤: 在考生目录下输入cdwarn 输入copy*.c..输入cd.. 就可以了 5、如果调试的时候不小心死循环了,可以通过CTRL+C或CTRL+BREAK来终止,如果连按多次都没反应,不要慌,立即找监考老师说明情况,可以重新启动机器继续答原题,你的程序还在,时间也是继续刚才的。 所以这也提醒大家,运行程序之前一定要先存盘。 1、“&”替换“+” 在很多人的编程语言中,用“+”来连接字符串,这样容易导致歧义。 良好的习惯是用“&”来连接字符串。 不正确: DimsMessageAsString sMessage="1"+"2" 正确: DimsMessageAsString sMessage="1"&"2" 注意: "&"的后面有个空格 2、变量命名大小写,语句错落有秩,源代码维护方面 下面大家比较一下以下两段代码: 读懂难度很大的代码: DimSNAMEAsString DimNTURNAsInteger IfNTURN=0Then IfSNAME="vbeden"Then DoWhileNTURN<4 NTURN=NTURN+1 Loop EndIf EndIf 容易读懂的代码: DimsNameAsString DimnTurnAsInteger IfnTurn=0Then IfsName="vbeden"Then DoWhilenTurn<4 nTurn=nTurn+1 Loop EndIf EndIf 3、请养成以下的“对象命名约定”良好习惯 应用程序频繁使用许多菜单控件,对于这些控件具备一组唯一的命名约定很实用。 除了最前面"mnu"标记以外,菜单控件的前缀应该被扩展: 对每一级嵌套增加一个附加前缀,将最终的菜单的标题放在名称字符串的最后。 下表列出了一些例子。 当使用这种命名约定时,一个特定的菜单组的所有成员一个接一个地列在VisualBasic的“属性”窗口中。 而且,菜单控件的名字清楚地表示出它们所属的菜单项。 为其它控件选择前缀 对于上面没有列出的控件,应该用唯一的由两个或三个字符组成的前缀使它们标准化,以保持一致性。 只有当需要澄清时,才使用多于三个字符的前缀。 常量和变量命名约定 除了对象之外,常量和变量也需要良好格式的命名约定。 本节列出了VisualBasic支持的常量和变量的推荐约定。 并且讨论标识数据类型和范围的问题。 变量应该总是被定义在尽可能小的范围内。 全局(Public)变量可以导致极其复杂的状态机构,并且使一个应用程序的逻辑非常难于理解。 全局变量也使代码的重用和维护更加困难。 在VisualBasic的应用程序中,只有当没有其它方便途径在窗体之间共享数据时才使用全局变量。 当必须使用全局变量时,在一个单一模块中声明它们,并按功能分组。 给这个模块取一个有意义的名称,以指明它的作用,如Public.bas。 较好的编码习惯是尽可能写模块化的代码。 例如,如果应用程序显示一个对话框,就把要完成这一对话任务所需要的所有控件和代码放在单一的窗体中。 这有助于将应用程序的代码组织在有用的组件中,并减小它运行时的开销。 除了全局变量(应该是不被传递的),过程和函数应该仅对传递给它们的对象操作。 在过程中使用的全局变量应该在过程起始处的声明部分中标识出来。 此外,应该用ByVal将参数传递给Sub过程及function过程,除非明显地需要改变已传递的参数值。 随着工程大小的增长,划分变量范围的工作也迅速增加。 在类型前缀的前面放置单字母范围前缀标明了这种增长,但变量名的长度并没有增加很多。 如果一个变量在标准模块或窗体模块中被声明为Public,那么该变量具有全局范围。 如果一个变量在标准模块或窗体模块中被分别声明为Private,那么该变量有模块级范围。 注意: 一致性是卓有成效地使用这种技术的关键;VisualBasic中的语法检查器不会捕捉以"p."开头的模块级变量。 常量 常量名的主体是大小写混合的,每个单词的首字母大写。 尽管标准VisualBasic常量不包含数据类型和范围信息,但是象i、s、g和m这样的前缀对于理解一个常量的值和范围还是很有用的。 对于常量名,应遵循与变量相同的规则。 例如: mintUserListMax'对用户列表的最大限制 '(整数值,本地到模块) gstrNewLine'新行字符 '(字符串,应用程序全局使用) 变量 声明所有的变量将会节省编程时间,因为键入操作引起的错误减少了(例如,究竟是aUserNameTmp,还是sUserNameTmp,还是sUserNameTemp)。 在“选项”对话框的“编辑器”标签中,复选“要求变量声明”选项。 OptionExplicit语句要求在VisualBasic程序中声明所有的变量。 应该给变量加前缀来指明它们的数据类型。 而且前缀可以被扩展,用来指明变量范围,特别是对大型程序。 用下列前缀来指明一个变量的数据类型。 描述变量和过程名 变量或过程名的主体应该使用大小写混合形式,并且应该足够长以描述它的作用。 而且,函数名应该以一个动词起首,如InitNameArray或CloseDialog。 对于频繁使用的或长的项,推荐使用标准缩略语以使名称的长度合理化。 一般来说,超过32个字符的变量名在VGA显示器上读起来就困难了。 当使用缩略语时,要确保它们在整个应用程序中的一致性。 在一个工程中,如果一会儿使用Cnt,一会儿使用Count,将导致不必要的混淆。 用户定义的类型 在一项有许多用户定义类型的大工程中,常常有必要给每种类型一个它自己的三个字符的前缀。 如果这些前缀是以"u"开始的,那么当用一个用户定义类型来工作时,快速识别这些类型是很容易的。 例如,ucli可以被用来作为一个用户定义的客户类型变量的前缀。 4、在简单的选择条件情况下,使用IIf()函数 罗索的代码: IfnNum=0Then sName="sancy" Else sName="Xu" EndIf 简单的代码: sName=IIf(nNum=0,"sancy","Xu") 5、尽量使用Debug.Print进行调试 在很多初学者的调试中,用MsgBox来跟踪变量值.其实用Debug.Print不仅可以达到同样的功效,而且在程序最后编译过程中,会被忽略.而MsgBox必须手动注释或删除. 通常: MsgBoxnName 应该: Debug.PrintnName 6、在重复对某一对象的属性进行修改时,尽量使用With....EndWith 通常: Form1.Height=5000 Form1.Width=6000 Form1.Caption="ThisisMyLabel" 应该: WithForm1 .Height=5000 .Width=6000 .Caption="ThisisMyLabel" EndWith 这种结构程序执行效率比较高,特别在循环语句里。 7、MsgBox中尽量使用消息图标,这样程序比较有规范 一般来说 vbInformation用来提示确认或成功操作的消息 vbExclamation用来提示警告的消息 vbCritical用来提示危机情况的消息 vbQuestion用来提示询问的消息 8、在可能的情况下使用枚举 枚举的格式为 [Public|Private]Enumname membername[=constantexpression] membername[=constantexpression] .... EndEnum Enum语句包含下面部分: 说明 所谓枚举变量,就是指用Enum类型定义的变量。 变量和参数都可以定义为Enum类型。 Enum类型中的元素被初始化为Enum语句中指定的常数值。 所赋给的值可以包括正数和负数,且在运行时不能改变。 例如: EnumSecurityLevelIllegalEntry=-1SecurityLevel1=0SecurityLevel2=1EndEnum Enum语句只能在模块级别中出现。 定义Enum类型后,就可以用它来定义变量,参数或返回该类型的过程。 不能用模块名来限定Enum类型。 类模块中的PublicEnum类型并不是该类的成员;只不过它们也被写入到类型库中。 在标准模块中定义的Enum类型则不写到类型库中。 具有相同名字的PublicEnum类型不能既在标准模块中定义,又在类模块中定义,因为它们共享相同的命名空间。 若不同的类型库中有两个Enum类型的名字相同,但成员不同,则对这种类型的变量的引用,将取决于哪一个类型库具有更高的引用优先级。 不能在With块中使用Enum类型作为目标。 Enum语句示例 下面的示例演示用Enum语句定义一个命名常数的集合。 在本例中是一些可以选择的颜色常数用于设计数据库的数据输入窗体。 PublicEnumInterfaceColors icMistyRose=&HE1E4FF& icSlateGray=&H908070& icDodgerBlue=&HFF901E& icDeepSkyBlue=&HFFBF00& icSpringGreen=&H7FFF00& icForestGreen=&H228B22& icGoldenrod=&H20A5DA& icFirebrick=&H2222B2& EndEnum 好处是加快编程速度 1、算法说明 累加形式: V=V+e 连乘形式: V=V*e 其中: V是变量,e是递增表达式。 累加和连乘一般通过循环结构来实现。 注意: 需在执行循环体前对变量V赋初值。 一般的,累加时置初值0;连乘时置初值为1. 举例 求N! 的结果。 PrivateSubCommand1_Click() Dimn%,i%,s& n=Val(InputBox("输入n")) s=1 Fori=1Ton s=s*i Nexti Prints EndSub 错误的写法: PrivateSubCommand1_Click() Dimn%,i%,s& n=Val(InputBox("输入n")) Fori=1Ton s=1 ‘赋初值语句位置不对! s=s*i Nexti Prints ‘输出s的值为n,而不是n! EndSub 应用举例 根据下列公式,求自然对数e的的近似值。 要求: 误差小于0.00001 PrivateSubCommand1_Click() Dimi%,n&,t! ,e! e=2 i=1 t=1 DoWhilet>0.00001 i=i+1 t=t/i e=e+t Loop Print"计算了";i;"项目和是: ";e PrintExp (1) ‘与上句输出值进行对比以证明算法的正确性 EndSub 解题技巧 1)由于这类题目往往是根据精度要求来求值,因此我们不能预知具体循环次数,所以这类题目一般用Do循环,很少用For循环。 设定循环变量和通项变量,注意各变量的初值; 2)分解通项表达式中各因子,并分别将各因子用循环变量表示; 3) 如果步骤2中有的因子比较复杂,难以直接用变量表示,此时可以考虑使用Function过程; 4) 根据步骤1、2、3,写出通项表达式; 5) 根据精度要求(往往是通项小于10负多少次方这样一个关系表达式),写出一条满足精度要求后跳出循环的语句。 通常是用: if 通项表达式>10^(-N)thenexitdo,注意这句话一般需放在累加或者连乘式之前。 实例说明 以2002年春上机试卷06编程题为例 根据X值计算: n=1,2,…… 要求: n项绝对值小于等于10-6为止。 1、由于循环次数不确定,因此确定用Do循环结构并定义循环变量用n表示(初值1);用户输入的值用x表示;通项用dblCos表示;累加值用sum表示,初值为0; 2、分解通项式的组成 可以分解为三部分: 可以表示为: (-1)^(n+1) 可以表示为: x^(2*(n-1)) 比较复
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VB 资料
![提示](https://static.bdocx.com/images/bang_tan.gif)