国家二级(C语言)机试模拟试卷173附答案解析

国家二级(C语言)机试模拟试卷173

选择题

1.以下叙述中正确的是( )。(C)

A. C程序的基本组成单位是语句

B. C程序中的每一行只能写一条语句

C. 简单C语句必须以分号结束

D. C语言必须在一行内写完

解析:C程序的基本组成单位是函数,A项错误;C程序以分号作为每个语句结尾,一行能写多条语句,也可以将一条语句分几行书写,BD两项错误;而简单C语言语句必须以分号结束,所以C项正确。

2.软件设计中模块划分应遵循的准则是( )。(B)

A. 低内聚低耦合

B. 高内聚低耦合

C. 低内聚高耦合

D. 高内聚高耦合

解析:软件设计中模块划分应遵循的准则是高内聚低偶合、模块大小规模适当、模块的依赖关系适当等。模块的划分应遵循一定的要求,以保证模块划分合理,并进一步保证以此为依据开发出的软件系统可靠性强,易于理解和维护。模块之间的耦合应尽可能的低,模块的内聚度应尽可能的高。

3.面向对象方法中,继承是指( )。(D)

A. 一组对象所具有的相似性质

B. 一个对象具有另一个对象的性质

C. 各对象之间的共同性质

D. 类之间共享属性和操作的机制

解析:继承是面向对象的方法的一个主要特征,是使用已有的类的定义作为基础建立新类的定义技术。广义地说,继承是指能够直接获得已有的性质和特征,而不必重复定义它们,所以说继承是指类之间共享属性和操作的机制。

4.以下叙述中正确的是( )。(A)

A. char c1, c2, *c3, c4[40];是合法的变量定义语句

B. 数组下标的下限由数组中第一个非零元素的位置决定

C. 数组下标的下限由数组中第一个被赋值元素的位置决定

D. 数组下标的下限是1

解析:A)正确,char c1, c2, *c3, c4[40]表示定义了两个字符变量c1、c2,一个字符指针c3,一个字符数组c4。数组的下限永远为0,选项B)、C)、D)错,答案选A)。

5.以下叙述中正确的是( )。(B)

A. 函数调用时,不必区分函数名称的大小写

B. 调用函数时,函数名必须与被调用的函数名完全一致

C. 函数名允许用数字开头

D. 在函数体中只能出现一次return语句

解析:调用函数的时候只有保证调用语句的函数名和被调函数的函数名、参数列表一致才能保证调用的正确性,选项B正确。C语言对大小写敏感,选项A错。用户自定义的函数名需要遵循用户标识符的命名规则,由字母、数字、下画线组成并且第一个字符不能为数字,选项C错。一个函数每次只能使用一个return语句,但是该函数体中可以有多个返回点,也就是有多条return语句,每次只从其中一点返回,选项D错。答案选B。

6.有以下程序:

void ss(char*s,char t)

{while(*s)

{ if(*s==t)*s=t-’a’+’A’;

s++;

}

}

main()

{char strl[100]=\(B)

A. ABCDDEFEDBD

B. abcDDfefDbD

C. abcAAfefAbA

D. Abcddfefdbd

解析:函数ss(char*s,chart)的功能是将指针s所指向的字符串中存在的字符“t”均改写成大写字母;所以main函数中引用函数ss后使得数组str1中的小写字母“d”均变成了大写字母“D”,然后输出数组str1,结果为:abcDDfefDbD。

7.union dt

{

int a;char b;double c;

}data;

以下叙述中错误的是(C)

A. data的每个成员起始地址都相同

B. 变量data所占内存字节数与成员c所占字节数相等

C. 程序段:data.a=5;printf(\

D. data可以作为函数的实参

解析:输出不会是5.00000的,因为单精度浮点数和双精度浮点数在内存中的存储形式不一样。

8.fgets(str,n,fp)函数从文件中读入一个字符串,以下错误的叙述是( )。(C)

A. 字符串读入后会自动加入’\0’

B. fp是指向该文件的文件型指针

C. fgets函数将从文件中最多读入n个字符

D. fgets函数将从文件中最多读入n-1个字符

解析:字符串输入函数fgets()的调用形式为:fgets(s,n,fp);s可以是一个字符数组名,或是指向字符串的指针;n为要读取的最多的字符个数:fp是指向该文件的文件型指针;字符串输入函数的功能是:从fp所指向的文件中读取长度不超过n-1个字符的字符串,并将该字符串存放到字符数组s中。

9.以下叙述中正确的是( )。(A)

A. 在C语言中,预处理命令行都以“#”开头

B. 预处理命令行必须位于C源程序的起始位置

C. #include必须放在C程序的开头

D. C语言的预处理不能实现宏定义和条件编译的功能

解析:“编译预处理”就是在C编译程序对C源程序进行编译前,由编译预处理程序对这些编译预处理命令行进行处理的过程。A项正确,在C语言中,凡是以“#”号开头的行,都称为“编译预处理”命令行;B项错误,预处理命令行可以出现在程序的任何一行的开始部位,其作用一直持续到源文件的末尾;C项错误,#include可以出现在程序的任意一行的开始部位;D项错误,预处理可以实现宏定义、条件编译和文件包含。

10.有以下程序:

#include<stdio.h>

main()

{int a1,a2;char c1,c2;

scanf(\(D)

A. 12B. 12C. 12,a,34,b<CR>

D. 12a34b<CR>

解析:在输入多个数据时,若格式控制串中无非格式字符,则认为所有输入的字符均为有效字符。所以应按选项D的顺序输入数据。

11.若x=4,y=5,则x&y的结果是( )。(B)

A. 0

B. 4

C. 3

D. 5

解析:本题主要考查按位与运算的知识点。按位与是对两个运算量相应的位进行逻辑与,“&”的规则和逻辑与“&&”相同。x=4的二进制为00000100,v=5的二进制为00000101,x&y=00000100,转化为十进制即为4。

12.以下程序的输出结果是( )。

#include

#define F(x)2.84+x

#define w(y)printf(“%d”,(int)(y))

#define P(y)w(y)

main()

{ intx=2;

P(F(5)*x);

}(A)

A. 12

B. 13

C. 14

D. 16

解析:本题考查带参数的宏定义及相关运算。P(F(5)*x)=P(2.84+5*2)=P(12.84),调用w(12.84),输出(int)(12.84)=12.

13.可在C程序中用作用户标识符的一组标识符是 ( )。(B )

A. void define WORD

B. as—b3 —123 If

C. For —abc case

D. 2c DO SlG

解析:C语言规定,标识符是由字母、数字或下划线组成,并且它的第一个字符必须是字母或下划线,关键字不能用作用户标识符。

14.设x=061,y=016,则z=x|y的值是( )。(C)

A. 00001111

B. 11111111

C. 00111111

D. 11000000

解析:本题主要考查按位或运算,x=061(二进制为00110001),y=016(二进制为00001110),进行或运算后结果为00111111。

15.软件测试的目的是( )。(D)

A. 评估软件可靠性

B. 发现并改正程序中的错误

C. 改正程序中的错误

D. 发现程序中的错误

解析:软件测试是为了发现错误而执行程序的过程,测试要以查找错误为中心,而不是为了演示软件的正确功能。不是为了评估软件或改正错误。

16.以下叙述中正确的是( )。(C)

A. C语言比其他语言高级

B. C语言可以不用编译就能被计算机识别执行

C. C语言以接近英语国家的自然语言和数学语言作为语言的表达形式

D. C语言出现的最晚,具有其他语言的一切优点

解析:此题考查的是C语言的基本特点。C语言是一种高级编程语言,但并不是比其他语言高级; C语言源程序必须经过编译生成目标文件才能被计算机识别执行;C语言出现比较晚,它既有优点也有缺点,而并不是具有其他一切语言的优点。

17.若有以下程序段:

int r=8;

printf(\(C)

A. 16

B. 8

C. 4

D. 2

解析:本题考查位运算,属于基础知识。题目中将整型变量8二进制表达为00001000,右移一位为00000100,即4。故选项C正确。

18.以下函数按每行8个输出数组中的数据:

void fun(int*w,int n)

{ int i:

for(i=0;i<n;i++)

{

printf(\(C)

A. if(i/8==0)printf(\

B. if(i/8==0)continue;

C. if(i%8==0)printf(\

D. if(i%8==0)continue;

解析:每行输出8个数组数据后输入一个换行,应该采取对8取余的方法,余数循环一次便换行一次,所以语句为if(i%8==0)printf(\

19.定义如下变量和数组:

int i,x[3][3]={1,2,3,4,5,6,7,8,9};

则下面语句的输出结果是( )。

for(i=0;i<3;i++) printf(’’%d’’,x[i][2-i]);(C)

A. 159

B. 147

C. 357

D. 369

解析:本题主要考查二维数组的使用。题中利用for循环来输出x数组中的指定元素:①当i=0时,输出x[0][2]=3;②当i=1时,输出x[1][1]=5;③当i=2时,输出x[2][0]=7。

20.定义如下变量和数组:

int i,X[3][3]={1,2,3,4,5,6,7,8,9};

则下面语句的输出结果是( )。

for(i=0;i<3;i++)printf(\(C)

A. 159

B. 147

C. 357

D. 369

解析:本题主要考查二维数组的使用。题中利用for循环来输出x数组中的指定元素:①当i=0时,输出x[0][2]=3;②当i=1时,输出x[1][1]=5;③当i=2时,输出x[2][0]=7。

21.有以下计算公式

(C)

A. if(X>=0)y=sqrt(x);

if(X<0)y=sqrt(-x);

B. if(X>=0)y=sqrt(x);

else y=sqrt(-x);

C. y=sqrt(X);

if(X<0)y=sqrt(-x);

D. y=sqrt(x>=0?x:-x);

解析:本题重点考查的知识点是:sqrt()函数sqrt()函数的作用是计算平方根,要求输出的参数x必须大于等于0,题目公式的要求是无论x大于等于0还是小于0,y的值都为x绝对值的开方。选项C中调用了sqrt(x)函数,而没有判断x的正负,则v=sqrt(x)会出错

22.执行以下语句段后,xy的值是( )。

int*pt,xy;

xy=200;

pt=&xy;

xy=*pt+30;(D)

A. 200

B. 170

C. 260

D. 230

解析:本题考查指针的运用。通过pt=&xy,将pt指向xy所占的内存地址,而*pt是指针pt所指向内存单元中的内容,即200,所以最后xy的值为230。

23.下列关于C语言文件的叙述中正确的是(C)

A. 文件由一系列数据依次排列组成,只能构成二进制文件

B. 文件由结构序列组成,可以构成二进制文件或文本文件

C. 文件由数据序列组成,可以构成二进制文件或文本文件

D. 文件由字符序列组成,其类型只能是文本文件

解析:本题考查文件的概念,文件是由数据序列组成,可以构成二进制文件或文本文件,所以答案为C选项。

24.在软件设计中不使用的工具是( )。(C)

A. 系统结构图

B. PAD图

C. 数据流图(I)FD图)

D. 程序流程图

解析:系统结构图是对软件系统结构的总体设计的图形显示。在需求分析阶段,已经从系统开发的角度出发,把系统按功能逐次分割成层次结构,是在概要设计阶段用到的。PAD图是在详细设计阶段用到的。程序流程图是对程序流程的图形表示,在详细设计过程中用到。数据流图是结构化分析方法中使用的工具,它以图形的方式描绘数据在系统中流动和处理的过程,由于它只反映系统必须完成的逻辑功能,所以它是一种功能模型,是在可行性研究阶段用到的而非软件设计时用到,所以选择C。

25.结构化程序由顺序、选择、循环三种基本结构组成,以下相关叙述错误的是( )。(A)

A. 三种基本结构不可以嵌套使用

B. 顺序结构是按语句在程序中的先后顺序逐条执行,没有分支,没有转移

C. 选择结构是根据不同的条件执行不同分支中的语句

D. 循环结构是根据条件决定是否重复、重复执行多少次循环体语句

解析:结构化程序主要由3种基本控制结构组成,顺序结构是最基本的算法结构,当执行由这些语句构成的程序时,将按这些语句在程序中的先后顺序逐条执行,没有分支,没有转移,没有步骤之间的相互约束,没有对某一步骤的多次使用,B项正确;选择结构根据不同的条件去执行不同分支中的语句,C项正确;循环结构就是根据各自的条件,使同一组语句重复执行多次,D项正确。三种结构可以嵌套使用,A项错误。

26.若有定义语句:int a=3,b=2,c=1;以下选项中错误的赋值表达式是( )。(A)

A. a=(b=4):3;

B. a=b=c+l;

C. a=(b=4) +c;

D. a=1+(b=c=4);

解析:不能将变量或常量赋给一个表达式,所以A选项中(b=4)=3是错误的。

27.以下能正确定义字符串的语句是( )。

B

解析:C语言中,字符串是用一对双引号括起来的字符序列,并用字符型数组来存放,故C选项和D选项不属于字符串,A选项定义的是一个字符变量str,却用来存放字符串,显然也不正确,因此B选项正确。

28.以下程序段的输出结果为( )。

static char a[]=\(B)

A. programme

B. porm

C. 有语法错误

D. prog

解析:本程序首先定义了静态字符数组a,然后将指针p指向数组a的首地址,第一次for循环,p=a,p指向数组的第一个元素,*p是取指针p所指地址的内容,输出p;第二次for循环,p=p+2,则p指向数组的第三个元素,*p是取指针p所指地址的内容,输出o:第三次for循环,p=p+2,则p指向数组的第5个元素,*p是取指针p所指地址的内容,输出r;第四次for循环,p=p+2,则p指向数组的第7个元素,*p是取指针p所指地址的内容,输出m;结束循环。

29.有以下程序:

#include<stdio.h>

#include<string.h>

main()

{int i,len;

char b[]=\(A)

A. Beijing!

B. to Beijing!

C. Welcome you to Beijing!

D. you to Beijing!

解析:strcpy(char*dest,char*source)函数是将soure指向的字符串复制到dest指向的内存空间,所以for循环在遍历字符数组b的同时,查找b中的空格字符,将空格字符后的剩余字符串重新复制到字符数组b中,然后重新设置循环的索引下标为0,继续寻找空格字符,直到到达字符串的结尾空字符’\0’,由此可知整个程序是获取字符串“Welcome you Beijing!”的最后一个不包含空格亨符的子串,程序输出;“Beijing!”,答案选A。

30.若有定义语句:int x=10:则表达式x一=x+x的值为( )。(D)

A. 10

B. 一20

C. 0

D. 一10

解析:表达式x一=x+x等价于x=x一(x+x),x取值为10,所以结果为:10—20=一10,答案选D。

31.以下程序拟读取一个姓氏,查找其对应的年龄并输出:

#include<stdio.h>

#include<string.h>

#include<stdlib.h>

struct person{char name[10];int age;};

struet person group[6]={\(A)

A. gets(&p->name);

B. p=(struet person*)malloc(sizeof(struet person))

C. if((stremp(p->name,group[i].name)==0))

D. printf(\

解析:语句gets(&p->name)中,gets的参数应该是成员变量name数组的首地址,而&p->name是首先获取数组name的首地址,然后再对首地址取地址符,所以这是错误的,正确参数应该是:gets(p->name);,故答案选A。

32.有以下程序:

#include

main()

{int x=1,y;

V=x<<2:

printf(’’%d\n’’,y);

}

程序运行后的输出结果是( )。(C)

A. 1

B. 2

C. 4

D. 8

解析:<<是位运算符,1的二进制表示是00000001,向左移动2位后为00000100,为4。

33.以下叙述中正确的是(B)

A. a是实型变量,a=10在C语言中是允许的,因此可以说:实型变量中可以存放整型数

B.

C. 若有int a=4,b=9; 执行了a=b后,a的值已由原值改变为b的值,b的值变为0

D. 若有int a=4,b=9; 执行了a=b;b=a;之后,a的值为9,b的值为4

解析:A选项中a是实型变量,a=10在C语言中是允许的,但是实型变量中不可以存放整型数。C选项中执行a=b后,a的值变为b的值,为9,b的值不变,仍为9。D选项中执行a=b后,a的值为9,b的值为9,执行b=a后,a的值为9,b的值也为9,所以选择B。

34.有以下程序:

#include

main()

{int m,x=0,y=0,t;

do

{scanf(’’%d’’,&m);

t=m>0;

switch(t)

{case 0:break;

case 1:x+=m;continue;

}

y+=m;

}

while(m);

printf(’’%d,%d\n’’,x,y);

}

程序运行时输入:一1 1—2 2 0,则输出结果是( )。(C)

A. 0,0

B. 3,0

C. 3,一3

D. 0,一3

解析:在do…while循环中,嵌套了一个sWitch语句,switch语句中两个case语句分别执行break和continue,其中break语句是跳出switch语句,接着执行do…while循环体剩下的部分:而continue语句是直接进入do…while的下一次循环。当输入一1、一2、0时,y+=(一1一2+0)=一3;当输入1、2时,x值累加为3,所以输出x,y值分别为3、一3。

35.简单程序设计步骤中不包括(C)

A. 编码

B. 确定算法

C. 安装编译程序

D. 调试

解析:简单程序设计步骤为:确定数据结构、确定算法、编码、调试、整理文档,不包括安装编译程序,故答案为C选项。

36.若有定义:int a=0,b=0,c=0,d=0;,以下关于C语言表达式:(++a || ++b) : ++c : ++d 执行顺序的叙述正确的是(B)

A. 先执行++a,表达式++a的值为1;再执行++b,表达式++b的值为1,由此可确定(++a || ++b)值为1,因此执行++c

B. 先执行++a,表达式++a的值为1,由此可确定(++a || ++b)值为1,因此执行++c

C. 先执行++b,表达式++b的值为1;再执行++a,表达式++a的值为1,由此可确定(++a || ++b)值为1,因此执行++c

D. 先执行++b,表达式++b的值为1,由此可确定(++a || ++b)值为1,因此执行++c

解析:表达式1:表达式2:表达式3,若表达式1为真,则执行表达式2,否则执行表达式3,++a表示先将变量a+1,再执行其他操作,逻辑或运算符遵循\

37.有以下程序

#include <stdio.h>

main()

{ int x=10,y=11,z=12;

if( y< z )

x=y; y=z; z=x;

printf(\(A)

A. x=11 y=12 z=11

B. x=10 y=10 z=10

C. x=11 y=11 z=10

D. x=10 y=10 z=12

解析:if条件为真,执行x=y;此时x=11;y=11;z=12

再执行y=z;z=x;此时y=12;z=11;

最后x=11;y=12;z=11;故答案为A选项。

38.某二叉树共有530个结点,其中度为2的结点有250个,则度为1的结点数为(A)

A. 29

B. 30

C. 249

D. 251

解析:在树结构中,一个结点所拥有的后件个数称为该结点的度,所有结点中最大的度称为树的度。对任何一棵二叉树,度为0的结点总是比度为2的结点多一个。

二叉树结点总数为530,度为2的结点有250个,则度为0的结点有251个,那么度为1的结点个数为530-250-251=29。故选A选项

39.有以下程序

#include <stdio.h>

#define S(x) x*x/x

main( )

{ int k = 6, j = 3;

printf(\(B)

A. 11,11

B. 29,29

C. 26,29

D. 121,121

解析:#define命令是C语言中的一个宏定义命令,标识符一般使用大写,为了区分其他标识符,它用来将一个标识符定义为一个字符串,该标识符被称为宏名,被定义的字符串称为替换文本。宏定义不进行其他操作,仅仅只是替换标识符。S(k+j+2)=k+j+2*k+j+2/k+j+2,经计算可得29,S(j+k+2)=j+k+2*k+j+2/j+k+2,计算可得29。因此输出为29,29。答案为B选项。

40.有以下程序:

#include<stdio.h>

main()

{

int a=1,b=0:

for(;a<5;a++)

{

if(a%2==0)break;

continue;

b+=a:

}

printf("%d\n",b);

}

程序运行后的输出结果是( )。(A)

A. 0

B. 1

C. 10

D. 4

解析:第一次循环,a=1,a%2!=0所以执行break,整个循环结束,所以b=0。

程序填空题

41.使用VC++2010打开考生文件夹下blank1中的解决方案。此解决方案的项目中包含一个源程序文件blank1.c。在此程序中,函数fun的功能是:将形参n中,各位上为偶数的数取出,并按原来从高位到低位相反的顺序组成一个新数,作为函数值返回。

例如,输入一个整数27638496,函数返回值为64862。

请在程序的下画线处填入正确的内容并将下画线删除,使程序得出正确的结果。

注意:部分源程序给出如下。

不得增行或删行,也不得更改程序的结构!

试题程序:

#include<stdio.h>

unsigned long fun(unsigned long n)

{unsigned long x=0;int t;

while(n)

{t=n%10;

/*********found*********/

if(t%2==【1】)

/*********found*********/

x=【2】+t;

/*********found*********/

n=【3】

}

return x;

}

main()

{unsigned long n=-1;

while(n>99999999||n<0)

{printf(\

(1)0

(2)10*x

(3)n/10

解析:填空1:定义变量t用来存放某数的各个位数值,此处判断t是否为偶数,即对2求余结果是否为0。

填空2:将t作为x的个位数,原来x的各个位上升1位,即x=10*x+t。

填空3:每循环一次,通过除法运算,去掉数值最后一位。

程序修改题

42.使用VC++2010打开考生文件夹下modi1中的解决方案。此解决方案的项目中包含一个源程序文件modi1.c。在此程序中,函数fun的功能是:将长整型数中各位上为奇数的数依次取出,构成一个新数放在t中。高仍在高位,低位仍在低位。

例如,当s中的数为87653142时,t中的数为7531。

请改正程序中的错误,使它能得出正确的结果。

注意:不要改动main函数,不得增行或删行,也不得更改程序的结构!

试题程序:

#include<stdlib.h>

#include<stdio.h>

#include<conio.h>

void fun(long s,long*t)

{

int d;

long s1=1;

/*********found*********/

t=0;

while(s>0)

{

d=s%10;

/*********found*********/

if(d%2==0)

{

*t=d*s1+*=t;

s1*=10;

}

s/=10;

}

}

void main()

{

long s,t;

system(\

(1)*t=0;

(2)if(d%2!=0)或if(d%2==1)

解析:(1)由函数定义可知,变量t是指针变量,所以对t进行赋初值0是不对的。因为t指向的是存放新数的变量,所以此处应给新数赋初值0,即木t=0;

(2)变量d表示数s各位上的数,此处的if条件应为判断d是否为奇数。

程序设计题

43.请编写一个函数fun,它的功能是:比较两个字符串的长度,(不得调用C语言提供的求字符串长度的函数),函数返回较长的字符串。若两个字符串长度相同,则返回第一个字符串。

例如,输入beijingshanghai(为回车键),函数将返回shanghai。

注意:部分源程序存在文件PROGl.C中。

请勿改动主函数main和其他函数中的任何内容,仅在函数fun的花括号中填入你编写的若干语句。

#inoiude

char*fun(char*s,char * t)

{

}

main()

{ char a[20],b[2 0];

void NONO();

printf(“Input 1th string:”);

gets(a);

printf(“Input;2th string:”);

gets(b);

printf(“%s\n”,fun (a, b));

NONO();

}

void NONO()

{/*本函数用于打开文件,输入数据,调用函数,输出数据,关闭文件。 */

FILE *fp,*wf;

int i ;

char a[2 0],b[2 0];

fp=fopen(“in.dat”,“r”);

wf=fopen(“out.dat”,“w”);

for(i=0;i<10;i++) {

fscanf(fp,“%s%s”,a,b);

fprintf(wf,“%s\n”,fun(a,b));

}

fclose(fp);

fclose(wf);

}

int i:

char*p=s, *q=t;

int n=0,m=0 ;

while(*p) //计算串s的长度n,其中p为临时指针

{

n++;

p++;

}

while(*q) //计算串t的长度m,其中q为临时指针

{

m++;

q++;

}

if(n>=m) //比较m和n的值,设置p

指向较大的指针

p=s;

else

p=t;

return p;

解析:该程序功能是比较两个字符串的长度。解题过程是首先分别求得两个字符串的长度,然后对这两个值进行判断,实现两个字符串长度的比较。

[解题思路]

进入fun函数,根据前面的分析:

(1)首先求得字符串的长度,设变量n和m分别用来求字符串的长度,初值设为0,把字符串中的字符逐个访问,每访问一个字符,n和m分别加1,直到字符串结束。

(2)使用两个临时指针变量p、q分别作为访问字符串的变量。

(3)根据m和n的值返回串,设置指针p,指向返回串的开始地址。

资源下载《国家二级(C语言)机试模拟试卷173附答案解析.doc》 文档仅限注册用户下载,请先
将本套试题Word文档或文章下载到电脑,方便收藏和打印
资源下载
《国家二级(C语言)机试模拟试卷173附答案解析.doc》
试题含答案和解析word文档下载价格:免费
将本套试题Word文档或文章下载到电脑,方便收藏和打印
0

评论2

没有账号? 注册  忘记密码?