第五讲 Matlab程序设计基础.ppt

上传人:s****8 文档编号:82777039 上传时间:2023-03-26 格式:PPT 页数:76 大小:728.50KB
返回 下载 相关 举报
第五讲 Matlab程序设计基础.ppt_第1页
第1页 / 共76页
第五讲 Matlab程序设计基础.ppt_第2页
第2页 / 共76页
点击查看更多>>
资源描述

《第五讲 Matlab程序设计基础.ppt》由会员分享,可在线阅读,更多相关《第五讲 Matlab程序设计基础.ppt(76页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、sin 正弦函数正弦函数 asin 反正弦函数反正弦函数 cos 余弦函数余弦函数 acos 反余弦函数反余弦函数 tan 正切函数正切函数 atan 反正切函数反正切函数 cot 余切函数余切函数 acot 反余切函数反余切函数 sec 正割函数正割函数 asec 反正割函数反正割函数 csc 余割函数余割函数 acsc 反余割函数反余割函数 sinh 双曲正弦函数双曲正弦函数 asinh 反双曲正弦函数反双曲正弦函数 cosh 双曲余弦函数双曲余弦函数 acosh 反双曲余弦函数反双曲余弦函数 tanh 双曲正切函数双曲正切函数 atanh 反双曲正切函数反双曲正切函数 sech 双曲正割

2、函数双曲正割函数 asech 反双曲正割函数反双曲正割函数 csch 双曲余割函数双曲余割函数 acsch 反双曲余割函数反双曲余割函数 coth 双曲余切函数双曲余切函数 acoth 反双曲余切函数反双曲余切函数 MATLAB的函数的函数MATLAB 常用函数常用函数abs(x)绝对值绝对值sqrt(x)开平方开平方conj(z)共轭复数共轭复数round(x)四舍五入四舍五入floor(x)舍去正小数舍去正小数rat(x)化为分数表示化为分数表示gcd(x,y)最大公因数最大公因数exp(x)自然指数自然指数log(x)e为底的对数为底的对数Log10(x)10为底的对数为底的对数angl

3、e(z)复数复数z的相角的相角real(z)复数复数z的实部的实部imag(z)复数复数z的虚部的虚部fix(x)舍去小数取整舍去小数取整ceil(x)加入正小数取整加入正小数取整sign(x)符号函数符号函数rem(x,y)求求x除以除以y的余数的余数lcm(x,y)最小公倍数最小公倍数pow2(x)以以2为底的指数为底的指数log2(x)以以2为底的对数为底的对数MATLAB 常用函数介绍常用函数介绍取整和求余函数取整和求余函数当当X与与Y同号时,同号时,mod(X,Y)=rem(X,Y)当两操作数异号时,当两操作数异号时,rem(X,Y)=mod(X,Y)-YMatlab程序设计基础程序

4、设计基础第五讲第五讲Matlab 编程入门q Matlab 编程简介编程简介u Matlab 作为一种广泛应用于科学计算的工具软件,不仅作为一种广泛应用于科学计算的工具软件,不仅具有强大的数值计算、符号计算、矩阵运算能力和丰富的具有强大的数值计算、符号计算、矩阵运算能力和丰富的绘图功能,同时也具有和绘图功能,同时也具有和 C、FORTRAN 等高级语言一样等高级语言一样进行程序设计。进行程序设计。u 在在 Matlab 程序设计中,要充分利用程序设计中,要充分利用 Matlab 数据结构数据结构的特点,提高编程效率。的特点,提高编程效率。u 利用利用 Matlab 的程序控制功能,可以将有关的

5、程序控制功能,可以将有关 Matlab 命命令编成程序存储在一个文件中(令编成程序存储在一个文件中(M 文件文件),然后在命令窗),然后在命令窗口中运行该文件,口中运行该文件,Matlab 就会自动依次执行文件中的命就会自动依次执行文件中的命令,直到全部命令执行完毕。令,直到全部命令执行完毕。q 用用 Matlab 语言编写的程序称为语言编写的程序称为 M 文件文件。u M 文件是由若干文件是由若干 Matlab 命令组合在一起构成的,它命令组合在一起构成的,它可以完成某些操作,也可以实现某种算法。事实上,可以完成某些操作,也可以实现某种算法。事实上,Matlab 提供的内部函数以及各种工具箱

6、,都是利用提供的内部函数以及各种工具箱,都是利用 Matlab 语言开发语言开发的的 M 文件。大家也可以结合自己的工作需要,开发自己的文件。大家也可以结合自己的工作需要,开发自己的程序或工具箱。程序或工具箱。q M 文件根据调用方式的不同可以分为两类:文件根据调用方式的不同可以分为两类:u Script:脚本文件脚本文件/命令文件命令文件(Matlab scripts)u Function:函数文件函数文件 M 文件 M 文件以文件以.m 为扩展名。为扩展名。M文件分类文件分类qM文件可分为脚本文件(文件可分为脚本文件(MATLAB scripts)和)和函数文件(函数文件(MATLAB f

7、unctions)。)。u脚本文件是包含多条脚本文件是包含多条MATLAB命令的文件;命令的文件;u函数文件可以包含输入变量,并把结果传送给输函数文件可以包含输入变量,并把结果传送给输出变量。出变量。两者的简单介绍及区别如表所示。两者的简单介绍及区别如表所示。q M 文件是一个文本文件,可以用任何文本编辑器来建文件是一个文本文件,可以用任何文本编辑器来建立和编辑,通常使用立和编辑,通常使用 Matlab 自带的自带的 M 文件编辑器。文件编辑器。M 文件的建立与打开(1)新建一个新建一个 M 文件文件u 菜单操作菜单操作 (File New M-File)u 命令操作命令操作 (edit M

8、文件名文件名 )u 命令按钮命令按钮 (快捷键快捷键 )(2)打开已有的打开已有的 M 文件文件u 菜单操作菜单操作 (File Open)u 命令操作命令操作 (edit M 文件名文件名 )u 命令按钮命令按钮 (快捷键快捷键 )u 双击双击 M 文件文件 u 在命令窗口中输入在命令窗口中输入 f2cs,即可执行该即可执行该 M 文件。文件。例:例:编写一个脚本文件将华氏温度转化为摄氏温度编写一个脚本文件将华氏温度转化为摄氏温度脚本文件举例clear;%清除当前工作空间中的变量清除当前工作空间中的变量f=input(Please input Fahrenheit temperature:)

9、;c=5*(f-32)/9;fprintf(The centigrade temperature is%gn,c);u 新建一个新建一个 M 文件文件 f2cs.m,内容如下:内容如下:脚本文件运行后,文件中所产生的脚本文件运行后,文件中所产生的所有变量都驻留所有变量都驻留在在 Matlab 当前工作空间当前工作空间,可以用,可以用 whos 查看。查看。脚本文件练习【例例】脚本文件编辑与调用示例:求圆的面积脚本文件编辑与调用示例:求圆的面积%脚本示例脚本示例 且圆形面积且圆形面积 r_area.mr=3.33;%r为圆形面积为圆形面积s=(r2)*pi%s为圆形面积为圆形面积函数文件 相对于

10、脚本文件来说,函数文件稍显复杂。相对于脚本文件来说,函数文件稍显复杂。从外观上看来,函数文件只是在对应脚本文件的基从外观上看来,函数文件只是在对应脚本文件的基础上,在文件中代码开始处多添加了一行函数定义础上,在文件中代码开始处多添加了一行函数定义行,行,函数文件都是以函数声明行函数文件都是以函数声明行“function”作为开始,其实质是:用户往作为开始,其实质是:用户往MATLAB函数库里边函数库里边添加的子函数,即函数添加的子函数,即函数M文件中的变量都是局部变文件中的变量都是局部变量,而非全局变量(除非使用特别形式声明),但量,而非全局变量(除非使用特别形式声明),但是在函数运行期间失效

11、,函数运行完毕之后,其定是在函数运行期间失效,函数运行完毕之后,其定义的变量将从工作区间中清除,对于这一点,大家义的变量将从工作区间中清除,对于这一点,大家要注意和脚本文件的区别。要注意和脚本文件的区别。函数文件 脚本文件只是将一系列相关代码结合封装,脚本文件只是将一系列相关代码结合封装,没有输入参数和输出参数,即不自带参数,也不没有输入参数和输出参数,即不自带参数,也不一定要返回结果。而对于函数文件,尽管有一些一定要返回结果。而对于函数文件,尽管有一些函数文件不带参数,文件中一般使用一些全局变量函数文件不带参数,文件中一般使用一些全局变量来实现与外界和其他函数之间的数据交换,多数函来实现与外

12、界和其他函数之间的数据交换,多数函数文件一般都有输入变量和输出变量,即自带参数文件一般都有输入变量和输出变量,即自带参数,并见有返回结果,这样可以更好地把整个程序数,并见有返回结果,这样可以更好地把整个程序连为整体连为整体.function 输出形参列表输出形参列表=函数名函数名(输入形参列表输入形参列表)%注释说明部分注释说明部分(可选可选)函数体语句函数体语句(必须必须)u 第一行为第一行为引导行引导行,表示该,表示该 M 文件是函数文件文件是函数文件u 函数名的命名规则与变量名相同函数名的命名规则与变量名相同(必须以字母开头必须以字母开头)u 当输出行参多于一个时,用当输出行参多于一个时

13、,用方括号方括号括起来括起来u 函数必须是一个函数必须是一个单独的单独的 M 文件文件u 函数函数文件名必须与函数名一致文件名必须与函数名一致u 以以百分号百分号开始的语句为开始的语句为注释语句注释语句函数文件q 函数文件由函数文件由 function 语句引导语句引导【例例】编写函数文件求小于任意自然数编写函数文件求小于任意自然数n的的Fibonacci数列各项。数列各项。function f=ffib(n)%用于求用于求Fibonacci数列的函数文件数列的函数文件%f=ffib(n)f=1,1;i=1;while f(i)+f(i+1)ffib(2000)函数文件举例function y

14、=myfliplr(x)%returns X with row preserved and columns%flipped in the left/right direction%X=1 2 3 becomes 3 2 1%4 5 6 6 5 4%num_col=size(x,2);%取取 x 的列数的列数y=x(:,num_col:-1:1);函数文件举例myfliplr.m函数文件与脚本文件(1)函数文件与脚本文件在编写格式、取名规则、调用方法)函数文件与脚本文件在编写格式、取名规则、调用方法等方面基本类似,不同的是函数文件被调用时,等方面基本类似,不同的是函数文件被调用时,matlab会

15、专会专门分配一个临时空间,称为函数工作空间(门分配一个临时空间,称为函数工作空间(Function work-space),用于存储函数执行过程中的中间变量,当函数文件),用于存储函数执行过程中的中间变量,当函数文件被调用完成时,这个空间将被被调用完成时,这个空间将被matlab收回,显然空间中的中收回,显然空间中的中间变量也被擦出,函数空间是独立和临时的,间变量也被擦出,函数空间是独立和临时的,matlab允许分允许分配任意多个这样的空间给任意多个函数文件使用,这与脚本文配任意多个这样的空间给任意多个函数文件使用,这与脚本文件存在着本质区别。件存在着本质区别。(2)如果函数文件中调用脚本文件

16、,那么脚本文件产生的所有)如果函数文件中调用脚本文件,那么脚本文件产生的所有变量都存储与此函数工作空间,而非变量都存储与此函数工作空间,而非matlab基本工作空间基本工作空间(3 3)不论是函数文件还是脚本文件,其中的变量都必须遵守)不论是函数文件还是脚本文件,其中的变量都必须遵守前面所讲的有关变量的规定,函数文件中的变量除特别声明外,前面所讲的有关变量的规定,函数文件中的变量除特别声明外,都是局部变量。都是局部变量。(4 4)函数)函数文件名必须与函数名一致文件名必须与函数名一致(5)函数文件)函数文件包含输入参数和输出参数,但在调用函数文件时,包含输入参数和输出参数,但在调用函数文件时,

17、Matlab只允许比文件标定的个数少的输入、输出函数。只允许比文件标定的个数少的输入、输出函数。q 函数调用的一般格式函数调用的一般格式输出实参列表输出实参列表=函数名函数名(输入实参列表输入实参列表)u 函数调用时,函数调用时,实参的顺序实参的顺序应与函数定义时的应与函数定义时的形参的顺序形参的顺序一致。一致。u 函数可以函数可以嵌套调用嵌套调用,即一个函数可以被其它函数调用,即一个函数可以被其它函数调用,甚至可以被它自身调用,此时称为甚至可以被它自身调用,此时称为递归调用递归调用。u 函数所传递的参数具有可调性,函数所传递的参数具有可调性,Matlab 用两个永久变用两个永久变量量 nar

18、gin 和和 nargout 分别记录调用该函数时的输入实分别记录调用该函数时的输入实参和输出实参的个数。参和输出实参的个数。函数调用变量检测函数 为了提高用户传递参数的效率和进一步优化程序设计的流程,为了提高用户传递参数的效率和进一步优化程序设计的流程,MATLAB提供了多种函数,用于变量检测、传递以及变长度提供了多种函数,用于变量检测、传递以及变长度输入输出变量。函数的调用格式和功能如下。输入输出变量。函数的调用格式和功能如下。nargin:获取函数体内实际输入变量个数。:获取函数体内实际输入变量个数。nargout:获取函数体内实际输出变量个数。:获取函数体内实际输出变量个数。nargi

19、n(fun):获取函数:获取函数“fun”中标称的输入变量个数。中标称的输入变量个数。nargout(fun):获取函数:获取函数“fun”中标称的输出变量个数。中标称的输出变量个数。%函数文件函数文件 factor.mfunction f=factor(n)if(n B=1 2 3;4 5 6;7 8 9;disp(B)数据输出数据输出 dispu 数据的输出:数据的输出:disp A=Hello,Tom!;disp(A)例例【例例2】输入输入x,y的值,并将它们的值互换后输出。的值,并将它们的值互换后输出。程序如下:程序如下:x=input(Input x please.);y=input

20、(Input y please.);z=x;x=y;y=z;disp(x);disp(y);【例例3】求一元二次方程求一元二次方程ax2+bx+c=0的根。的根。程序如下:程序如下:a=input(a=?);b=input(b=?);c=input(c=?);d=b*b-4*a*c;x=(-b+sqrt(d)/(2*a),(-b-sqrt(d)/(2*a);disp(x1=,num2str(x(1),x2=,num2str(x(2);数据输出数据输出 fprintffprintf(fid,format,variables)按指定的按指定的格式格式将变量的值输出到指定的将变量的值输出到指定的文件

21、文件u 数据的输出:数据的输出:fprintfl fid 为文件句柄,若缺省,则将变量的值输出到屏幕上为文件句柄,若缺省,则将变量的值输出到屏幕上l format 用来指定数据输出时采用的格式,常见的有用来指定数据输出时采用的格式,常见的有%e(采用科学计算形式采用科学计算形式 )%f(采用浮点数形式采用浮点数形式 )%g(由系统自动选取上述两种格式之一由系统自动选取上述两种格式之一)%s(输出字符串输出字符串)l format 中还可以使用一些特殊格式,如:中还可以使用一些特殊格式,如:n(换行换行 )t(制表符制表符 )b(退格退格 )(反斜杆反斜杆 )%(百分号百分号 )数据输出数据输出

22、 fprintf a=Hello;b=2.4;c=100*pi;fprintf(a=%s,b=%f,c=%en,a,b,c)例:例:l format 中的输出格式要与输出变量一一对应中的输出格式要与输出变量一一对应l 可以没有输出变量可以没有输出变量 fprintf(Today is Mondayn)例:例:pauseu 程序的暂停程序的暂停:pause pause指令可以暂停或者终止程序的运行。执行指令可以暂停或者终止程序的运行。执行pause指令时,系统暂停执行之前的操作,等待用户按任意键继指令时,系统暂停执行之前的操作,等待用户按任意键继续执行。续执行。pause指令常用于程序的调试过程

23、中和用户需要指令常用于程序的调试过程中和用户需要查看程序执行的中间结果的时候,其调用格式和功能如下:查看程序执行的中间结果的时候,其调用格式和功能如下:pause 或或 pause(n)若想强行终止程序的运行,可以使用若想强行终止程序的运行,可以使用 Ctrl+c其中其中 n 是延迟时间,以秒为单位;是延迟时间,以秒为单位;若缺省,则将暂停程序,直到用户按任意键后继续若缺省,则将暂停程序,直到用户按任意键后继续l pause off 屏蔽程序中所有屏蔽程序中所有 pause 的作用的作用l pause on 打开打开 pause 的作用的作用pause使用示例使用示例for n=8:11 me

24、sh(magic(n)pauseend选择结构选择结构:是根据给定的条件成立或不成立,分别执是根据给定的条件成立或不成立,分别执行不同的语句行不同的语句,Matlab 用于实现选择结构的语句有用于实现选择结构的语句有 if 语句语句和和 switch 语句语句。(二)选择结构(二)选择结构l 单分支结构单分支结构if expression(条件)条件)statements(语句组)语句组)endif 条件语句条件语句If语句语句 if语句称为条件执行语句。语句称为条件执行语句。其关键字包括其关键字包括if、else、elseif和和end。if expression (条件)条件)statem

25、ents1(语句组语句组1 1)else statements2(语句组语句组2 2)endl 双分支结构双分支结构条件语句组条件语句组语句组语句组1 1语句组语句组2 2是是否否if expression1(条件条件1 1)statements1(语句组语句组1 1)elseif expression2(条件条件2 2)statements2(语句组语句组2 2).elseif expressionm(条件条件m)statementsm(语句组语句组m)else statements(语句组语句组)endl 多分支结构多分支结构if 条件语句条件语句条件条件1语句组语句组1条件条件2是是语句

26、组语句组2是是否否条件条件n语句组语句组n语句组语句组n+1否否否否是是q简单说明:简单说明:if else end 大致可以分为三个步骤:大致可以分为三个步骤:1)判断表达式紧跟在关键字判断表达式紧跟在关键字 if 后,使它可首先被计算。后,使它可首先被计算。2)判断表达式结果,若为判断表达式结果,若为0,则值假;若为则值假;若为1,则值为真。,则值为真。3)若值为真,则执行其后的语句;否则跳过,不予执行。若值为真,则执行其后的语句;否则跳过,不予执行。选择结构选择结构注注意意:语语句句中中的的end是是决决不不可可少少的的,没没有有它它,在在逻逻辑辑表表达达式为式为0 0时,就找不到继续执

27、行程序的入口。时,就找不到继续执行程序的入口。【例例4 4】输入三角形的三条边,求三角形的面积。输入三角形的三条边,求三角形的面积。A=input(请输入三角形的三条边:请输入三角形的三条边:);if A(1)+A(2)A(3)&A(1)+A(3)A(2)&A(2)+A(3)A(1)p=(A(1)+A(2)+A(3)/2;s=sqrt(p*(p-A(1)*(p-A(2)*(p-A(3);disp(三角形的面积是:三角形的面积是:);disp(s);else disp(不能构成一个三角形。不能构成一个三角形。)end运行:运行:请输入三角形的三条边:请输入三角形的三条边:4 5 6 9.9216

28、【练习练习1】编写程序:编写程序:输入一元二次方程输入一元二次方程ax2+bx+c=0的系数,的系数,输出它的实数根。输出它的实数根。【练习练习2】编写程序:编写程序:使用选择结构编写程序,求分段函数使用选择结构编写程序,求分段函数的值的值【练习练习3】编写程序:编写程序:判断随机输入的一个年份是否为闰年?判断随机输入的一个年份是否为闰年?【分析分析】闰年的概念,从纯数学角度上,可以用一句话闰年的概念,从纯数学角度上,可以用一句话概括,即概括,即“闰年是能被闰年是能被4 4整除,但不能被整除,但不能被100100整除;整除;如能被如能被100100整除,同时能被整除,同时能被400400整除的

29、年份。整除的年份。”【练习练习1 1】【例例5 5】输入一个字符,若为大写字母,则输出输入一个字符,若为大写字母,则输出其后继字符,若为小写字母,则输出其前导字符,其后继字符,若为小写字母,则输出其前导字符,若为其他字符则原样输出。若为其他字符则原样输出。c=input(,s);if c=A&c=a&c=A&c=a&c=0&c60n”);break;.说明:说明:Value 1,Value 2,Value n是是常量表达式常量表达式,且值必须互不相同且值必须互不相同语句标号作用,必须用语句标号作用,必须用break跳出跳出case后可包含多个可执行语句,且不必加后可包含多个可执行语句,且不必加

30、 switch可嵌套可嵌套多个多个case可共用一组执行语句可共用一组执行语句l Matlab 首先计算首先计算 expression 的值,然后将它依次与的值,然后将它依次与各个各个 case 指令后的检测值进行比较,当比较结果为真时,指令后的检测值进行比较,当比较结果为真时,就执行相应的语句组,然后跳出就执行相应的语句组,然后跳出 switch 结构。结构。l switch 后面的表达式后面的表达式 expression 的值可以是一个的值可以是一个标量或字符串。标量或字符串。switch 语句l otherwise 指令可以不出现。指令可以不出现。l 如果所有的比较结果都为假,则执行如果

31、所有的比较结果都为假,则执行 otherwise 后后面的语句组,然后跳出面的语句组,然后跳出 switch 结构。结构。【例例6 6】根据变量根据变量 num 的值来决定显示的内容。的值来决定显示的内容。num=input(请输入一个数请输入一个数);switch num case-1 disp(I am a teacher.);case 0 disp(I am a student.);case 1 disp(You are a teacher.);otherwise disp(You are a student.);end【例例7】某商场对顾客所购买的商品实行打折销售,某商场对顾客所购买的

32、商品实行打折销售,标准如下标准如下(商品价格用商品价格用price来表示来表示):price200 没有折扣没有折扣 200price500 3%折扣折扣 500price1000 5%折扣折扣 1000price2500 8%折扣折扣 2500price1 EPS=EPS/2;num=num+1;end【练习练习】用用while循环体计算循环体计算1-100之间整数的和之间整数的和 Sum_1=0;i=1;while i 0)sum mean=sum/cnt endu break 和和 continuel break 语句用于语句用于终止循环终止循环的执行,即跳出最内层循环的执行,即跳出最内

33、层循环 l continue 语句用于结束语句用于结束本次循环本次循环,进行下一次循环,进行下一次循环 l break 和和 continue 一般与一般与 if 语句配合使用语句配合使用其它流控制语句u returnl return 语句用于语句用于退出退出正在运行的脚本或函数,通常用正在运行的脚本或函数,通常用在函数文件中。在函数文件中。循环的嵌套循环的嵌套如果一个循环结构的循环体又包括一个循环如果一个循环结构的循环体又包括一个循环结构,就称为循环的嵌套,或称为多重循环结结构,就称为循环的嵌套,或称为多重循环结构。构。多多重重循循环环的的嵌嵌套套层层数数可可以以是是任任意意的的。可可以以按

34、按照照嵌嵌套套层层数数,分分别别叫叫做做二二重重循循环环、三三重重循循环环等等。处处于于内内部部的的循循环环叫叫作作内内循循环环,处处于于外外部部的的循循环环叫作外循环。叫作外循环。【例例】若一个数等于它的各个真因子之和,则称若一个数等于它的各个真因子之和,则称该数为完数,如该数为完数,如6=1+2+36=1+2+3,所以,所以6 6是完数。是完数。求求1,5001,500之间的全部完数。之间的全部完数。for m=1:500for m=1:500 s=0;s=0;for k=1:m/2 for k=1:m/2 if if rem(m,krem(m,k)=0)=0 s=s=s+ks+k;end end end end if m=s if m=s disp(mdisp(m););end endendend【例例7 7】求求100,1000100,1000以内的全部素数。以内的全部素数。n=0;for m=100:1000 flag=1;j=m-1;i=2;while i=j&flag if rem(m,i)=0 flag=0;end i=i+1;end if flag n=n+1;prime(n)=m;endend prime%变量变量prime存放素数存放素数Wh_密码:密码:123456123456

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 生活常识

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com