学生宿舍管理系统设计(C语言)
更新时间:2024-04-12 13:15:01 阅读量: 综合文库 文档下载
计算机程序设计基础(C语言)课程设计
题目:学生宿舍管理系统设计
班 级: 计 121
学 号: 120502 120504 120506 120505
姓 名: 贾 文 超 杨 晓 红 张 永 康 陆 秀 和
指导教师 : 刘 喜 梅 孙 强 范 周 瑜
2013 年 7 月 1 日·北京
信息工程学院
信息技术教学与实验中心
学生宿舍管理系统设计
功能:实现简单的学生宿舍基本信息管理,宿舍的
1
基本信息包括楼号、房间号、面积、所容纳人数、已入住人数等。
基本要求:
1.设计简单的菜单,能够进行系统功能选择。
2.实现信息的录入功能。
3.在已有信息的基础上添加新的纪录。
4.删除指定房间号的记录。
5.修改指定房间号的记录。
6.实现信息的浏览功能。
7.按房间号查询功能。
8.按已入住人数排序功能。
1.学生宿舍管理系统概述?????????????????????? 4 1.1需求分析 ??????????????????????????4 1.2基本功能 ??????????????????????????4
2
2.学生宿舍管理系统总体设计???????????????????? 5 1.1管理流程图 ?????????????????????????5 1.2管理员操作 ?????????????????????????5
3.模块划分????????????????????????????6 1.1第一选择模块 ????????????????????????6 1.2第二录入模块 ????????????????????????7 1.3第三添加模块 ????????????????????????8 1.4第四删除模块 ????????????????????????8 1.5第五修改模块 ????????????????????????9 1.6第六浏览模块 ????????????????????????9 1.7第七查询模块 ????????????????????????10 1.8第八排序模块???????????????????????? 11
4.算法说明????????????????????????????11
5.各函数模块功能?????????????????????????11 1.1各自定义函数功能?????????????????????? 11
6.程序测试????????????????????????????12
7.结论??????????????????????????????14 1.1对调试中主要问题进行总结??????????????????14
8.体会及建议???????????????????????????14 1.1对自己设计进行评价,指出合理和不足之处,提出改进的方案 ???14
9.学生宿舍管理系统设计参与者???????????????????14 1.1 小组成员信息????????????????????????14
1.学生宿舍管理系统概述
3
1.1需求分析
高校学生宿舍管理系统是典型的信息管理系统(MIS),其开发主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面。对于前端应用程序的开发则要求应用程序能提供强大的数据操纵功能,界面友好、使用简单方便等特点。旧的手工纪录的宿舍管理方式已经不能适应高速发展的信息化时代,新的宿舍管理系统开发出来之后,学校的现有的宿舍信息管理将有很大的改观,由过去的人工方式转变为计算机方式,由效率低、数据冗余、易产生错误转变为检索迅速、查找方便、可靠性高、存储量大。这些优点能够极大地提高效率,也是学校科学化、正规化管理的重要条件。
学生宿舍管理系统对于一个学校来说是必不可少的组成部分。对于学生信息量比较庞大,需要记录存档的数据比较多的高校来说,人工记录是相当麻烦的,而且当查找某条记录时,只能靠人工去一条条地查找,这样不但麻烦而且效率非常低。当今社会是飞速进步的世界,计算机化管理正是适应时代的产物。21世纪的今天,信息社会占着主流地位,计算机在各行各业中的运用已经得到普及。我们针对此,设计了一套学生宿舍管理系统。学生宿舍管理系统采用的是计算机化管理,系统做的尽量人性化,使用者会感到操作非常方便,管理人员需要做的就是将数据输入到系统的数据库中去。由于数据库存储容量相当大,而且比较稳定,适合较长时间的保存,也不容易丢失。这无疑是为信息存储量比较大的学校提供了一个方便、快捷的操作方式。本系统具有运行速度快、安全性高、稳定性好的优点,还具有修改功能,能够快速的查询学校所需的住宿信息。
1.2基本功能
高校学生宿舍管理系统的开发主要包括后台数据库的建立和维护以及前端应用程序的开发两个方面,但本课题要实现的是前端应用程序的开发。在设计该系统时,会尽可能地贴近我们学生,便于管理者操作。系统在实现上具有如下功能:
1.设计简单的菜单,能够进行系统功能选择。 2.实现信息的录入功能。
3.在已有信息的基础上添加新的记录。 4.删除指定房间号的记录。 5.修改指定房间号的记录 6.实现信息的浏览功能 7.按房间号查询功能 8.按已入住人数排序功能
2.学生宿舍管理系统总体设计
1.1管理流程图
4
对系统可划分为三层流程图: 第一层流程图: 输入宿舍信息(房 学生宿舍 间号、楼号、容纳 管理系统 人数、手机号等) 第二层流程图: 添加 宿舍管理 选择操作 删除 系统记录 修改 第三层流程图: 房间号对应的宿舍信息 学生宿舍 选择查询信息原则 管理系统 按已入住 人数排序 3.模块划分 1.1选择功能模块图
5
主 函 数 1.2第二录入模块 输入 插入 录入存储 删除 修改 数据操作 查询 统计 输出信息 排序 显示 开始 6 输入宿舍信息 p->room p->area p->livenumber count1++ 1.3第三添加模块
count2++ count3++ end 开始 7
插入宿 舍信息 输入宿 用sort() 舍信息 函数排序 将其入栈 结束 1.4第四删除模块 开始 输入删 除房间号 for循环, 扫描存储 学生信息 p->room:room m != = 删除对应 学生信息 1.5第五修改模块 结束
8
开始 输入修改 房间号room for循环,扫描 存储学生信息 p->room; room = 修改对应 学生信息 结束 1.6第六浏览模块(与下图1.7类似) 1.7第七查询模块 开始
= 9 ! 按宿舍 选择查 按宿舍号查询 长查询 询方式 开始循环,扫描 输入要查找 输入查找 存储的宿舍信息 宿舍长姓名 的宿舍号 p->dormitoryleader: != != p->room: dormitoryleader room = = 输出宿舍信息 输出宿舍信息 结束 1.8第八排序模块 开始 10
开始循环,扫描存储信息 选出居住人数最小的宿舍与第一个宿舍交换 在余下居住人数中选出最少的与第二个宿舍交换 以此类推,直至排序完成 结束
4.算法说明
数据类型(整形、实型、字符型、指针、数组、结构等);运算类型(算术运算、逻辑运算、自增自减运算、赋值运算等);程序结构(顺序结构、判断选择结构、循环结构);大程序的功能分解方法(即函数的调用与使用)等,利用数组对宿舍的记录进行循环输入输出,利用冒泡法记录进行排序,利用循环查找数组中某个数据,对其进行显示,删除,读入和写入文档等操作。
5.各函数模块功能 1.1各自定义函数功能
1、void insert()(录入系统所需的数据;将录入的数据存储在文件中) 2、void seek()(按要求对数据进行查询) 3、void modify()(对数据进行更新操作) 4、void del()(对数据进行删除操作)
5、void save()(对指定数据进行统计并输出)
11
6、void sort()(对指定数据排序并输出) 7、void reveal()(对指定数据产生报表输出) 8、void menu()(功能目录)
6.程序测试
显示 请选择菜单编号 请输入待增加的宿舍数 请输入第1个宿舍的房间号 输入 4 1 1316
??????????????????????????????????????? 请输入第1个宿舍的宿舍长 请输入第1个宿舍的楼号 请输入第1个宿舍的宿舍面积
贾文超 1 40
??????????????????????????????????
请输入第1个宿舍的房间容纳人数 请输入第1个宿舍的宿舍成员
6 贾文超/陆秀和/杨晓红/张永康/李正明/伟力
??????????????????????????????????
请输入第1个宿舍的手机号 请输入第1个宿舍的居住人数
??????????????????????????????????????? 13476731421 6
??????????????????????????????????????? 录入完毕! 请选择菜单编号 6
??????????????????????????????????
结果:所有宿舍信息为:
房间号 宿舍长 楼号 宿舍面积 房间容纳人数
??????????????????????????????????
1316 贾文超 1 40 6
********************************************************************
宿舍成员 手机号 居住人数
?????????????????????????????????? 贾文超/陆秀和/杨晓红/张永康/李正明/伟力 13476731421 6
显示 请选择菜单编号 输入 2
?????????????????????????????????? --------------1.按房间号查询--------------
--------------2.按宿舍长查询-------------- --------------3.退出本菜单---------------- 请选择子菜单编号:
1
??????????????????????????????????
请输入要查询的宿舍的房间号: 1316
??????????????????????????????????
12
结果:
房间号 宿舍长 楼号 宿舍面积 房间容纳人数
??????????????????????????????????
1316 贾文超 1 40 6
********************************************************************
宿舍成员 手机号 居住人数
?????????????????????????????????? 贾文超/陆秀和/杨晓红/张永康/李正明/伟力 13476731421 6
显示 请选择菜单编号 请输入要修改的宿舍的房间号 输入 3 1316
??????????????????????????????????????? ------------------------------ 请输入新的宿舍面积 1.修改宿舍长 2.修改楼号 3.修改宿舍面积 4.修改房间容纳人数 5.修改宿舍成员 6.修改手机号号码 7.修改居住人数 8.退出本菜单
------------------------------- 请选择子菜单编号:
3 50
?????????????????????????????????? 请选择子菜单编号: 请选择菜单编号 8 6
??????????????????????????????????
结果:
房间号 宿舍长 楼号 宿舍面积 房间容纳人数
??????????????????????????????????
1316 贾文超 1 50 6
********************************************************************
宿舍成员 手机号 居住人数
?????????????????????????????????? 贾文超/陆秀和/杨晓红/张永康/李正明/伟力 13476731421 6
7.总结
1.1对调试中主要问题进行总结
调试过程中,经常会出现输入或显示为乱码的情况,这往往是上下定义的数
13
据类型不同或定义数组长度不够所造成的。有时候程序中还会出现录入五个数据而只显示四个的情况,这也往往是由于定义的结构体数组长度过低所造成的。像这类问题只要把数据类型都定义成字符型,并且定义一个合理的数组长度往往都能解决。在调试过程中我遇到最大的问题出现在删除模块。在运用“dormitory.txt”打开文件并对某一数据进行删除后,往往显示会多显示一行数据。这是由于“dormitory.txt”写数据时只会覆盖数据而不会清除原文件数据,因此文件最后一行数据总会保留在原文件中。后来我先用“dormitory.txt”打开文件并读取文件中的数据,然后再用“r”打开原文件将删除后的数据重新写入
文件,最终检测运行成功。
8.体会及建议
1.1对自己设计进行评价,指出合理和不足之处,提出改进的方案
本程序拥有很多的优点:第一,它具有作为一个宿舍管理系统的各个功能,包括录入信息、添加信息、修改信息、删除信息、查询信息、统计信息六大主要功能。可以方便的进行住宿学生信息的管理。第二,它的各个功能模块在实现时非常方便,例如:录入和添加学生信息可以自己控制录入和添加的人数;统计学生信息可以分学号、班级、专业等进行统计等等。。 “万事开头难”这句话在我编写程序的过程中得到了真正的体现。在最初编写的几天里出现了这样那样的错误一大堆,这主要是由于我对基础知识掌握不扎实所造成的。但是随后几天里,我对课本知识进行了回顾并不时的向老师和同学进行请教,慢慢的对编写程序也开始得心应手起来。程序的编写总归是一件费时费力的事情,但只要我们认真编写和调试最后总能成功。 短短的两周实习时间我收获颇多,我相信经过这次实习必将为我以后的深入学习打下扎实的基础。 9.学生宿舍管理系统设计参与者 1.1小组成员信息 姓名 贾文超 陆秀和 杨晓红 张永康
参考文献:1.《软件工程导论》 第四版 清华大学出版
14
院系 信息工程学院 信息工程学院 信息工程学院 信息工程学院 班级 机121 机121 机121 机121 学号 120502 120506 120504 120505 2.《C#开发实战宝典》 王小科 编著 清华大学出版社 3.《C#开发大全》 刘丽霞 编著 清华大学出版
4.百度知道
5.C#与.net开发网 http://developer.51cto.com/net/
附录:源程序清单
#include
#define BUFLEN 100 /* 缓冲区最大字符数 */
#define LEN 100 /* 房间号和宿舍长最大字符数,实际请更改 */ #define N 1000 /* 最大宿舍人数,实际请更改*/ struct apartment /*结构体*/ {
char room[LEN+1]; /* 房间号 */
char dormitoryleader[LEN+1]; /* 宿舍长 */ int dormitory; /* 楼号 */ char area[3]; /* 宿舍面积 */
char hold[LEN+1]; /* 房间容纳人数 */ char member[1000]; /* 宿舍成员 */ char tel[LEN+1]; /* 手机号号码 */ char livenumber[30]; /* 居住人数 */ }stu[N];
int k=1,n,m; /* 定义全局变量 */ void readfile();/* 函数声明 */ void seek(); void modify(); void insert(); void del(); void reveal(); void save(); void menu(); int main() { while(k) menu();
system(\); return 0; }
void help() {
printf(\欢迎使用宿舍系统帮助!\\n\);
15
printf(\进入系统后,先刷新宿舍信息,再查询;\\n\); printf(\按照菜单提示键入数字代号;\\n\); printf(\增加宿舍信息后,切记保存按7;\\n\); printf(\谢谢您的使用!\\n\); }
void readfile()/* 建立信息 */ {
char *p=\; FILE *fp; int i=0;
if ((fp=fopen(\,\))==NULL) {
printf(\,p); system(\); exit(0); }
while(fscanf(fp,\,stu[i].room,stu[i].dormitoryleader,&stu[i].dormitory,
stu[i].area,stu[i].hold,stu[i].member,stu[i].tel,stu[i].livenumber)==8) { i++; i=i; }
fclose(fp); n=i;
printf(\录入完毕!\\n\); }
void seek() /*查找*/ {
int i,item,flag;
char s1[21]; /* 以宿舍长和房间号最长长度+1为准 */ printf(\); printf(\按房间号查询-----\\n\); printf(\按宿舍长查询-----\\n\); printf(\退出本菜单-----\\n\); printf(\); while(1) {
printf(\请选择子菜单编号:\); scanf(\,&item); flag=0; switch(item) {
16
case 1:
printf(\请输入要查询的宿舍的房间号:\\n\); scanf(\,s1); for(i=0;i if(strcmp(stu[i].room,s1)==0) { flag=1; printf(\房间号 宿舍长 楼号 宿舍面积 房间容纳人数 \\n\); printf(\-\\n\); printf(\,stu[i].room,stu[i].dormitoryleader,stu[i].dormitory, stu[i].area,stu[i].hold); printf(\*\\n\); printf(\宿舍成员 手机号 居住人数\\n\); printf(\-\\n\); printf(\,stu[i].member,stu[i].tel,stu[i].livenumber); } if(flag==0) printf(\该房间号不存在!\\n\); break; case 2: printf(\请输入要查询的宿舍的宿舍长:\\n\); scanf(\,s1); for(i=0;i if(strcmp(stu[i].dormitoryleader,s1)==0) { flag=1; printf(\房间号 宿舍长 楼号 宿舍面积 房间容纳人数 \\n\); printf(\-\\n\); printf(\,stu[i].room,stu[i].dormitoryleader,stu[i].dormitory, stu[i].area,stu[i].hold); printf(\*\\n\); printf(\宿舍成员 手机号 居住人数\\n\); printf(\-\\n\); printf(\,stu[i].member,stu[i].tel,stu[i].livenumber); } if(flag==0) printf(\该宿舍长不存在!\\n\); break; case 3:return; default:printf(\请在1-3之间选择\\n\); 17 } } } void modify() /*修改信息*/ { int i,item,num; char area1[3],s1[LEN+1],s2[LEN+1]; /* 以宿舍长和房间号最长长度+1为准 */ printf(\请输入要修改的宿舍的房间号:\\n\); scanf(\,s1); for(i=0;i if(strcmp(stu[i].room,s1)==0) /*比较字符串是否相等*/ num=i; printf(\); printf(\修改宿舍长\\n\); printf(\修改楼号\\n\); printf(\修改宿舍面积\\n\); printf(\修改房间容纳人数\\n\); printf(\修改宿舍成员\\n\); printf(\修改手机号号码\\n\); printf(\修改居住人数\\n\); printf(\退出本菜单\\n\); printf(\); while(1) { printf(\请选择子菜单编号:\); scanf(\,&item); switch(item) { case 1: printf(\请输入新的宿舍长:\\n\); scanf(\,s2); strcpy(stu[num].dormitoryleader,s2); break; case 2: printf(\请输入新的楼号:\\n\); scanf(\,&stu[num].dormitory);break; case 3: printf(\请输入新的宿舍面积:\\n\); scanf(\,area1); strcpy(stu[num].area,area1); break; case 4: printf(\请输入新的房间容纳人数:\\n\); scanf(\,s2); strcpy(stu[num].hold,s2); break; case 5: 18 printf(\请输入新的宿舍成员:\\n\); scanf(\,s2); strcpy(stu[num].member,s2); break; case 6: printf(\请输入新的手机号号码:\\n\); scanf(\,s2); strcpy(stu[num].tel,s2); break; case 7: printf(\请输入新的居住人数:\\n\); scanf(\,s2); strcpy(stu[num].livenumber,s2); break; case 8:return; default:printf(\请在1-8之间选择\\n\); } } } void sort()/*按居住人数排序*/ { int i,j,*p,*q,s; char temp[100]; for(i=0;i for(j=n-1;j>i;j--) if(strcmp(stu[j-1].livenumber,stu[j].livenumber)>0) { strcpy(temp,stu[j-1].room); strcpy(stu[j-1].room,stu[j].room); strcpy(stu[j].room,temp); strcpy(temp,stu[j-1].dormitoryleader); strcpy(stu[j-1].dormitoryleader,stu[j].dormitoryleader); strcpy(stu[j].dormitoryleader,temp); strcpy(temp,stu[j-1].area); strcpy(stu[j-1].area,stu[j].area); strcpy(stu[j].area,temp); strcpy(temp,stu[j-1].hold); strcpy(stu[j-1].hold,stu[j].hold); strcpy(stu[j].hold,temp); strcpy(temp,stu[j-1].member); strcpy(stu[j-1].member,stu[j].member); strcpy(stu[j].member,temp); strcpy(temp,stu[j-1].tel); strcpy(stu[j-1].tel,stu[j].tel); strcpy(stu[j].tel,temp); strcpy(temp,stu[j-1].livenumber); 19 strcpy(stu[j-1].livenumber,stu[j].livenumber); strcpy(stu[j].livenumber,temp); p=&stu[j-1].dormitory; q=&stu[j].dormitory; s=*q; *q=*p; *p=s; } } } void insert() /*插入函数*/ { int i=n,j,flag; printf(\请输入待增加的宿舍数:\\n\); scanf(\,&m); do { flag=1; while(flag) { flag=0; printf(\请输入第 %d 个宿舍的房间号:\\n\,i+1); scanf(\,stu[i].room); for(j=0;j if(strcmp(stu[i].room,stu[j].room)==0) { printf(\已有该房间号,请检查后重新录入!\\n\); flag=1; break; /*如有重复立即退出该层循环,提高判断速度*/ } } printf(\请输入第 %d 个宿舍的宿舍长:\\n\,i+1); scanf(\,stu[i].dormitoryleader); printf(\请输入第 %d 个宿舍的楼号:\\n\,i+1); scanf(\,&stu[i].dormitory); printf(\请输入第 %d 个宿舍的宿舍宿舍面积(m^2):\\n\,i+1); scanf(\,stu[i].area); printf(\请输入第 %d 个宿舍的房间容纳人数:\\n\,i+1); scanf(\,stu[i].hold); printf(\请输入第 %d 个宿舍的宿舍成员(注:人员之间加/):\\n\,i+1); scanf(\,stu[i].member); printf(\请输入第 %d 个宿舍的手机号:\\n\,i+1); scanf(\,stu[i].tel); printf(\请输入第 %d 个宿舍的居住人数:\\n\,i+1); 20 scanf(\,stu[i].livenumber); if(flag==0) { i=i; i++; } } while(i printf(\录入完毕!\\n\\n\); sort(); } void del() { int i,j,flag=0; char s1[LEN+1]; printf(\请输入要删除宿舍的房间号:\\n\); scanf(\,s1); for(i=0;i if(strcmp(stu[i].room,s1)==0) { flag=1; for(j=i;j if(flag==0) printf(\该房间号不存在!\\n\); if(flag==1) { printf(\删除成功,显示结果请选择菜单6\\n\); n--; } } void reveal() { int i; printf(\所有宿舍的信息为:\\n\); printf(\房间号 宿舍长 楼号 宿舍面积 房间容纳人数 \\n\); printf(\\); for(i=0;i printf(\,stu[i].room,stu[i].dormitoryleader,stu[i].dormitory, stu[i].area,stu[i].hold); 21 } printf(\; printf(\宿舍成员 手机号 居住人数\\n\); printf(\-\\n\); for(i=0;i printf(\,stu[i].member,stu[i].tel,stu[i].livenumber); } } void save() { int i; FILE *fp; fp=fopen(\,\); /*写入*/ for(i=0;i fprintf(fp,\,stu[i].room,stu[i].dormitoryleader,stu[i].dormitory, stu[i].area,stu[i].hold,stu[i].member,stu[i].tel,stu[i].livenumber); } fclose(fp); } void menu()/* 界面 */ { int num; printf(\宿舍系统功能菜单************************ \\n\); printf(\友情提醒:查询前请先刷新系统! \\n\); printf(\); printf(\); printf(\系统帮助及说明 * * 1.刷新宿舍信息 * \\n\); printf(\); printf(\查询宿舍信息 * * 3.修改宿舍信息 * \\n\); printf(\); printf(\增加宿舍信息 * * 5.按房间号删除信息* \\n\); printf(\); printf(\显示当前信息 * * 7.保存当前宿舍信息* \\n\); printf(\); printf(\退出系统 * \\n\); printf(\); printf(\\\n\); printf(\请选择菜单编号:\); 22 scanf(\,&num); switch(num) { case 0:help();break; case 1:readfile();break; case 2:seek();break; case 3:modify();break; case 4:insert();break; case 5:del();break; case 6:reveal();break; case 7:save();break; case 8:k=0;break; default:printf(\请在0-8之间选择\\n\); }} 23
正在阅读:
学生宿舍管理系统设计(C语言)04-12
微观信息管理教学大纲扩充12-05
美丽的小公园作文200字07-07
2017内部资料练习题(华图)06-06
乡村道路建设与养护之我见-李雪峰10-23
管理的寓言小故事11-20
城市化的内涵包括哪些内容03-11
中学生民防知识竞赛复习大纲(2014年)11-24
数字图像处理实验三:图像的频域处理07-02
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 管理系统
- 宿舍
- 语言
- 学生
- 设计
- 《桂花雨》教案
- 广东石油化工学院高分子物理期末考试复习资料三 简答题答案 - 图
- 医院医疗工作管理制度(门诊工作制度、病历书写制度、各科室工作
- 词根词缀学 学生印发版
- 河北省石家庄市2018届高三第一次模拟考试语文试题
- 小学科学教学如何做到板书升华
- 初一学生家长会教师发言稿 共五篇
- 关于联想昭阳E47A冷机开机时间过长技术通报--KF201203180001 -
- 18课中国社会主义经济建设的曲折发展1
- 2016江西农村信用社考试:行测定义判断解题捷径
- 第三章 砌体工程综合练习题
- 高等代数与解析几何第七章(1-3习题) 线性变换与相似矩阵答案
- 人教版四年级下册第四单元语文园地四(口语交际)
- 某塑料制品厂总配变电所及配电系统设计
- 2017年思品中考模拟命题比赛试题--沥林塘角学校杨士林
- 人教版小学数学五年级下册电子教案 - 图文
- 化粪池清掏方案
- 企业物料搬运系统设计论文 - 图文
- 中小学音乐教师招聘考试三套试题及答案
- 2010年3月计算机二级考试VF笔试试题及答案