fortran第5章(循环).ppt

上传人:牧羊曲112 文档编号:6505890 上传时间:2023-11-07 格式:PPT 页数:63 大小:600.50KB
返回 下载 相关 举报
fortran第5章(循环).ppt_第1页
第1页 / 共63页
fortran第5章(循环).ppt_第2页
第2页 / 共63页
fortran第5章(循环).ppt_第3页
第3页 / 共63页
fortran第5章(循环).ppt_第4页
第4页 / 共63页
fortran第5章(循环).ppt_第5页
第5页 / 共63页
点击查看更多>>
资源描述

《fortran第5章(循环).ppt》由会员分享,可在线阅读,更多相关《fortran第5章(循环).ppt(63页珍藏版)》请在三一办公上搜索。

1、第1页,第五章 循环结构的实现,5.1 GOTO语句实现循环,GOTO语句的一般形式为:GOTO(语句标号)在一个基本结构内部可以使用GOTO语句。如果在逻辑IF语句中使用GOTO语句就可以实现有条件的循环,循环操作能够在一定条件下结束。,在程序中存在两类循环:无条件的循环:无条件循环是无休止地执行一个程序段,有条件的循环:有条件的循环是在满足一定条件时才执行循环。,GOTO语句实现无条件的循环:,第2页,FORTRAN程序中有条件的循环的3种循环类型:1.DO型循环(用循环语句实现)2.当型循环(用DO WHILE语句)3.直到型循环(用IF语句),第3页,5.2 用DO语句实现循环(循环次

2、数已知的循环),当需要执行的循环次数为已知时,用DO语句实现循环比较方便。它的一般形式为:,例如:DO 10 N=1,100,1 T=N/2.0 10 PRINT*,T,DO 标号,循环变量初值式E1,终值式E2,增量式E3,第4页,循环变量的初值、终值和步长可以为正或负。初值、终值可以为零。但步长不应为0,否则循环变量的值永远不会超过终值,从而陷入死循环。,说明:,循环变量是整型的例:D0 I1.5,3.6,1.2 循环次数不应该是 1.2)/1.2)2,而应当先将实型量转化为整型量,即变成相当的循环语句 DO I1,3,1 其循环次数为3次而不是2次。,例:对于D0 k-1,-3,-1 其

3、 循环次数INT(31-1)(1)3次 k按序分别取值为:-1,-2,-3。,如果循环变量的类型和初值、终值和步长的类型不一致,则按赋值的规则处理,即需先将初值、终值和步长的类型转化成循环变量的类型,然后进行处理。,第5页,循环变量是实型的,例:D0 X0.0,50.0,0.1 理论循环次数INT(50.1/0.1)501 但实际上在许多计算机上它只执行500次循环。原因是实数在内存中的误差使得增量值不是准确的0.1,由于循环的误差积累,到执行完500次循环后X的值可能已超过50.0,因而停止执行循环。改用整型循环变量时,则循环改写为:D0 I0,500;X=I/10。,例:D0 X1.5,3

4、.6,1.2 它的循环次数应为 1.2)/1.2)2次 X取值分别是1.5,2.7。,由于实型数在运算和存储时有一些误差,因而循环次数的理论值与实际值之间会有一些差别。所以应该避免使用实型的循环变量,用整型循环变量计算出的循环次数是绝对准确的。,第6页,DO循环的执行过程为:,(1)计算表达式E1,E2,E3的值,并将它们转换成循环变量的类型。,(2)循环变量的初值取E1的值。,(3)循环次数 r=INT(E2-E1+E3)/E3).如:DO 10 I=2,20,2 r=(20-2+2)/2=10 r为0的情况:E1E2,E30 如:DO 10 K=10,5,2 E1E2,E30 如:DO 1

5、0 K=5,10,-2,(4)检查循环次数.(5)循环变量增值(6)r-1=r(7)返回(4),第7页,例:,DO 20 I=1,5,2 N=I*I20 PRINT*,I,N,经计算:r=(5-2+2)/2=3,各有关变量的值在各次循环中变化的情况如下表:,终止循环的条件:循环变量的值超过终值。,第8页,继续语句(CONTINUE语句),它是一个可执行语句,但它不产生任何机器操作。一般把它用做循环的终端语句。,注意:循环的终端语句不能是GOTO,块IF,ELSE IF,END IF,STOP等语句。,它的形式为:CONTINUE,第9页,循环终端语句循环终端语句为一般的执行语句。F90规定:循

6、环终端语句可以是除了GOTO、块IF、CASE、CYCLE、DO、ELSE、ELSE IF、END IF、END、END SELECT、EXIT、SELECT CASE、STOP和RETURN语句以外的任一可执行语句,如打印语句、赋值语句、输入语句、逻辑IF语句等都可以作为终端语句。特殊的循环终端语句是:END DO(常用于无语句标号时)CONTINUE(常用于有语句标号时)新编写的程序应该尽量使用以END DO结束的块DO构造。,第10页,例1.一球从100米高度自由落下,每次落地后反跳回原高度的一半,再落下,求它在第20次着地时,共经过了多少米?,90 H=100 S=0 DO I=1,2

7、0 S=S+H H=H/2.0 END DO WRITE(*,*)S=,S END,77 H=100 S=0 DO 10 I=1,20 S=S+H H=H/2.010 CONTINUE WRITE(*,*)S=,S END,第11页,有关DO循环的一些规定,1.循环变量在循环体内不能再被赋值.例如,下面用法是错误的:,DO K=10,100,2 K=K/2 WRITE(*,*)KEND DO,第12页,2.循环变量的初值E1,终值E2和增量E3在执行循环体期间不能改变.下面用法是错误的.,M2=100 DO I=1,M2 M2=50 END DO,3.循环的次数是根据循环变量的初值、终值和步长

8、值计算出来的,在执行循环体期间是确定不变的,第13页,4.可以用转移语句从循环体内转到循环体外,也可以在循环体内转移,但不允许从循环体外转到循环体内.,例2 判某一数M是否为素数的程序可以写成:,READ(*,*)MDO K=2,M-1IF(MOD(M,K).EQ.0)GOTO 40 END DOWRITE(*,*)M,IS A PRIME NUMBERSTOP40WRITE(*,*)M,IS NOT A PRIME NUMBEREND,(非正常出口)K=M-1,(正常出口)KM-1,5.从“非正常出口”转出时,循环变量保持“当前值”.从“正常出口”脱离循环时,循环变量保持它的最后的值,第14

9、页,数值积分,求一个函数f(x)在a,b上的定积分,其几何意义是求曲边梯形面积。,近似求小曲边梯形面积常用方法:(1)矩形法(2)梯形法(3)辛普生法(用一条小抛物线代替f(x),求小曲边梯形面积),第15页,底的起点),第16页,源程序:,READ(*,*)N,A,B X=A H=(B-A)/N F0=X*X+X+1.0 S=0.0 DO I=1,N SI=F0*H S=S+SI X=X+H F0=X*X+X+1 END DO WRITE(*,*)N,A,B,S END,第17页,例 正直角柱体如图所示.已知5组a,b和h,要求分别求出对应的d.,DIMENSION A(5),B(5),H(

10、5),D(5)DIAG(X,Y)=SQRT(X*X+Y*Y)DO 1 I=1,51 READ(*,*)A(I),B(I),C(I)DO 2 I=1,5 C=DIAG(A(I),B(I)2 D(I)=DIAG(C,H(I)WRITE(*,100)100 FORMAT(9X,A,8X,B,8X,H,8X,D)WRITE(*,110)(A(I),B(I),H(I),D(I),I=1,5)110 FORMAT(5X,4F9.3)END,第18页,例:利用公式 ex=1+x/1!+x2/2!+x3/3!+xn/n!+计算ex展开式的前20项的近似值。分析:ex的展开式中第i项是第i-1项乘以x/i的积。

11、例如:t1=t0 x/1(t0=1)t2=t1 x/2 t3=t2 x/3 ti=ti-1 x/i 这种表示方式可用循环实现。设t代表每项值的变量,i是循环控制变量,则下面的语句中,for语句的每一次循环都产生ex展开式中前n项的t值(除开始一项以外):t=1.0 DO I=1,N t=t*x/i END DO,第19页,ex是展开式的各项之和,这种有规律的求和正好可以用循环来实现。假设ex代表两项之和的变量,将前面for循环中求出的每一项t累加起来,可表示为:ex=1.0 t=1.0 DO I=1,N t=t*x/i ex=ex+t END DO,第20页,例:,计算多项式y=0.6+3.5

12、x+5.0 x2+0.3x3+5.1x4+2.1x5+x6在x=1.3时的值,REAL A(6),F DATA A/0.6,3.5,5.0,0.3,5.1,2.1,1.0/DATA N,X/6,1.3/TOLY=A(1)F=1.0 DO 10 K=2,N F=F*X10 TOLY=TOLY+A(K)*F END,第21页,循环嵌套的概念和执行过程 一个循环体内又包含另一个完整的循环,称为循环的嵌套,例1 一个学校有40个班,每班30人.要求将全校每个学生的分数累加,并求全校总平均成绩和每班的平均成绩.,第22页,DO J=1,30 READ(*,*)G TOTAL2=TOTAL2+G END

13、DO AVER2=TOTAL2/30 WRITE(*,*)I,AVER2 TOTAL1=TOTAL1+TOTAL2,TOTAL2=0,TOTAL1=0,AVER1=TOTAL1/(40*30)WRITE(*,*)ALL:,AVER1 END,DO I=1,40,END DO,第23页,例:打印九九表的程序,说明:1.外循环执行9次,内循环执行了9*9=81次 2.外循环变量(I)比内循环变量(K)变化慢,1*1=1 1*2=2。1*9=9 2*1=2 2*2=4。2*9=18。9*1=9 9*2=18。9*9=81,DO I=1,9 END DO,DO K=1,9 L=I*K END DO,E

14、ND,100 FORMAT(9(1X,I2,*,I2,=,I2),PRINT 100,I,K,L,第24页,二重循环的执行过程:,3.遇内循环的DO语句,计算出内循环应执行次数r2,使内循环变量取初值.,2.如果r10,执行外循环体(顺序执行外循环体中的执行语句).如果r1=0,则结束循环的执行.,1.先计算出外循环的循环体应执行的次数r1,外循环变量取初值.,4.如果r20,执行内循环体各语句,直到内循环的终端语句.如此共执行内循环体r2次,然后从正常出口脱离内循环.此时,r2=0.,5.接着执行外循环体中其它执行语句,直到外循环的终端语句.,6.外循环变量增值,r1-1=r1.返回2.,应

15、注意:(1)循环次数.(2)内外循环变量值的变化.,第25页,有关循环嵌套的规定,1.各种循环都可以互相嵌套.例如两个DO循环可以嵌套成为双重循环,一个当型循环和一个DO循环也可以嵌套.无论哪种循环的嵌套,内循环都必须完整地出现在外循环体内.,I=15IF(I.LE.N)THENDO J=1,I PRINT*,J END DO PRINT*I=I+1 GOTO 5ENDIF,DO 10 I=1,NDO 20 J=1,M PRINT*,I,J10CONTINUE20CONTINUE,如:,第26页,2.并列的循环可以用一个变量名作循环变量,而嵌套的循环不能用同一变量名作循环变量。,DO k=1,

16、5 DO k=1,10 END DO END DO,DO I=1,5 END DODO I=1,10END DO,3.嵌套的DO循环可以共用一个终端语句.,如:,4.可以从内循环体转到外循环体或外循环之外,反之不行,5.除了循环的嵌套以外,DO循环和块IF连用时应注意:如果在IF块等中包含DO循环,则该循环必须完整地包含在上述一个块中.如果DO循环中包含一个块IF语句,也应完全包含.,第27页,*循环嵌套中循环控制变量的选择,例:求下式之和ISUM=0DO I=1,20 DO J=1,3 ISUM=ISUM+(I+1)*2*(J+2)END DO PRINT*,ISUM END DOEND,问

17、题:I与J那个做外循环好,DO J=1,3 K=J+2 DO I=1,20 ISUM=ISUM+K*(I+1)*(I+1)END DO END DO,1.I赋初值1次,判断循环是否终了20次,为J赋初值20*1次,判断是否终了为20*3次,总共101次.,若I,J位置互换:,2.J赋初值1次,判断终了3次,给内层I赋初值3*1次,判断终了3*20次,总共67次,3.j+2共计算20*3=60次,若将其搬到内循环外,就减少了57次,第28页,多重循环遵守的原则:1.变化范围大的循环变量要放在内层循环 2.尽量减少内循环中的运算,凡与循环无关的运算均移到 循环体外,第29页,例:求方程I3+J3+

18、K3=3的全部解 其中I为-5,11,J为-10,9,K为-6,18,程序举例,N=0 DO I=-5,11 ICUB=I*3 END DO END,DO K=-6,18 IF(ICUB+JCUB+KCUB.EQ.3)THEN N=N+1 PRINT*,N,I,J,K ENDIF END DO,KCUB=K*3,DO J=-10,9 JCUB=J*3 END DO,第30页,补充:百鸡问题。公鸡每只5元,母鸡3元,小鸡一元3只.100元买100只鸡.,INTEGER X,Y,Z DO X=1,20 DO Y=1,33 DO Z=1,99,3 IF(X+Y+Z.EQ.100)THEN IF(5*

19、X+3*Y+Z/3.EQ.100)THEN PRINT*,X,Y,Z ENDIF ENDIF END DO END DO END DO END,第31页,INTEGER X,Y,ZDO X=1,20 DO Y=1,33 z=100-x-y IF(5*X+3*Y+Z/3.EQ.100)THEN PRINT*,X,Y,Z ENDIF END DOEND DO END,优化后:,第32页,例2 求100到200之间的全部素数。,LOGICAL L DO M=101,200,210 IF(K.LE.SQRT(M).AND.L)THEN IF(MOD(M,K).EQ.0)L=.FALSE.K=K+1 G

20、OTO 10 ENDIF IF(L)WRITE(*,*)M,IS A PRIME NUMBER END DOEND,L=.TRUE.K=2,第33页,5.3当型循环的实现(循环次数未知)一般形式:,DO 标号,WHILE 逻辑表达式,当逻辑表达式 的值为“真”时,反复执行循环体。当逻辑表达式 的值为“假”时,结束循环。,第34页,【例】利用辗转相除法,求两个正整数的最大公约数,求M和N的最大公约数算法:若N=0,则M为最大公约数 若N!=0 将M 除以N,余数为R M=N;N=R 转,即欧几里德算法:gcd(i,j)=gcd(j,i%j)。,例:求42和24的最大公约数gcd(42,24)=g

21、cd(24,42%24)=gcd(24,18)=gcd(18,6)=gcd(6,0)42和24的最大公约数是6。,第35页,INTEGER M,N,R READ*,M,N DO 10 WHILE(N.NE.0)R=MOD(M,N)M=N N=R10 CONTINUE PRINT*,THE GREATEST COMMON DIVISOR IS,M END,例:MNR12181218126126060(退出循环),第36页,F90的DO WHILE语句在F90增强的功能中,增加了DO WHILE语句以支持当型循环。因此,DO构造不仅仅能完成循环次数已知的循环,而且能够完成此数未知的循环。,例:do

22、 while(input.ne.n).and.(input.ne.y)write(*,(a)Enter y or n:;read(*,(a)input end do,它的一般形式为:构造名 DO WHILE(逻辑表达式)DO WHILE语句的规则和块IF语句所需满足的的块规则类似。,第37页,例:对一个大于或等于3的正整数,判断它是不是一个素数。,read*,nj=int(sqrt(n*1.);i=2do while()i=i+1end doif(ij)then print*,不是素数,可被,i,整除else print*,是素数end ifend,一、,(mod(n,i)/=0).and.(

23、i=j),第38页,read*,nj=int(sqrt(n*1.);i=2;k=0do_while:do while(i=j)i=i+1end do do_whileif(k/=0)then print*,不是素数,可被,k,整除else print*,是素数end ifend,二、,if(mod(n,i)=0)then k=i exit do_whileend if,第39页,例:求正弦函数的近似值。,!正弦函数用泰勒级数展开:sinx=x-x3/3!+x5/5!-x7/7!+.。计算有限精度范围内的值。real,parameter:pi=3.141592,err=1.e-6integer,

24、parameter:max_terms=10read*,x;x=x*pi/180k=1;term=x;sin_=termdo while(abs(term)err).and.(k=max_terms)term=-term*x*x/(2*k*(2*k+1)k=k+1sin_=sin_+term;print*,k,sin_end doprint*,sin(x)end,第40页,F77“当型”循环,S1 IF(逻辑表达式)THEN 块1 GOTO S1 END IF,其中S1是语句标号。如果没有GOTO S1,就是一个选择结构。,可以用块IF和GOTO语句来实现当型循环。它的一般形式如下:,第41页

25、,READ(*,*)N T=0.0 I=110 IF(I.LE.N)THEN A=1.0/I T=T+A I=I+1 GOTO 10 END IF WRITE(*,*)T=,T END,运行记录如下:20T=3.597740,第42页,第43页,READ(*,*)NY=1.0I=110IF(I.LE.N)THENAI=4.0*I*I/(4.0*I*I-1.0)Y=Y*AII=I+1GOTO 10ENDIFWRITE(*,*)N=,N,Y=,YEND,第44页,例3读入一批整数,分别累加奇数和偶数之和。,INTEGER ODD,EVEN,N10 READ(*,*)N IF(N.NE.0)THEN

26、 IF(MOD(N,2).EQ.0)THEN EVEN=EVEN+N ELSE ODD=ODD+N END IF GOTO 10END IF100WRITE(*,*)ODD=,ODD,EVEN=,EVENEND,0,第45页,5.4 直到型循环的实现(循环次数未知)一般形式:,标号S 循环体 IF(逻辑表达式)GOTO S,当逻辑表达式 的值为“真”时,反复执行循环体。当逻辑表达式 的值为“假”时,结束循环。在compaq visual fortran 中不能使用UNTIL语句,第46页,例如:直到N大于20就不再执行循环不应该写出:IF(N.GT.20)GOTO 10而应该写成:IF(N.L

27、E.20)GOTO 10 或:IF(.NOT.(N.GT.20)GOTO 10,第47页,(1)迭代法(2)弦截法求方程(3)二分法,解一元方程,近似求一元方程f(x)的根方法,第48页,一、迭代法:,(2)大致估计出一个根x的范围,给x一个初值x0,把它代入上式等号的右边,求出x的第一次近似值 x1,(1)将f(x)改写成求 x的式子:x=g(x)形式.,(3)再将 x1代入g(x)得x2.这样一次一次地将求出的新值又作为下一次的初值代入g(x).即迭代:x0=g(x0)=x1=g(x1)=x2=g(x2)=.g(x4)=x5.直到前后两次求出的x值很接近,即,这时 就是所求的近似值,用迭代

28、法求一元方程f(x)的根,其基本方法如下:,第49页,read(*,*)x,m do 20 i=1,m,1 x1=(-x*3-2.0*x*x-1.0)/2.0 write(*,100)i,x1 if(abs(x-x1).ge.1e-6)then x=x1 else stop end if continue print*,comput hast converged100 format(1x,sqrt(,i2,)=,f12.5)end,例 用迭代法求方程f(x)=x3+2x2+2x+1=0的一个解,直到满足:,改写为:x=g(x)形式 X=(-x3-2x2-1)/2,第50页,牛顿迭代公式为:,在

29、几何意义上:,所以,二、牛顿迭代法,第51页,已知:,求出:,READ(*,*)X N=110 X1=X F=X1*3-6*X1-1 F1=3*X1*X1-6 X=X1-F/F1 WRITE(*,100)N,X1,X N=N+1 IF(ABS(X-X1).GT.1E-6)GOTO 10100 FORMAT(1X,N=,I3,5X,X1=,F13.8,5X,X=,F13.8)END,例 用牛顿迭代法求方程f(x)=x3-6x-1=0在2.5附近的一个实根,直到满足:,第52页,三、弦截法 弦截法的算法思想如下:,(1)先取两个不同的点x1和x2,需使f(x1)和f(x2)的符号相反,否则,重新取

30、x1和x2。但x1与x2相差不宜太大,以免在(x1,x2)区间出现多根。(2)连接f(x1)与f(x2)得一弦线交x轴于x,可求得x点的坐标为:x=x1*(f(x2)-x2*f(x1)/(f(x2)-f(x1)将x代入方程可求出f(x)。(3)判别f(x)与f(x1),若符号相同,则根在(x,x2)区间内,可将x作为新的x1;若符号相异,则根在(x1,x)区间内,可将x作为新的x2。(4)重复上述(2)、(3)步骤,直到|f(x)|为止。这里为一个很小的数,若设=0.000001,则可以认为|f(x)|0,x为该方程的近似根。,第53页,第54页,10 read*,x1,x2 y1=(x1-2

31、.0)*x1+8.0)*x1-16.0 y2=(x2-2.0)*x2+8.0)*x2-16.0 if(y1*y2=0)goto 1020 x=x1*(f2-x2*f1)/(f2-f1)y=(x-2.0)*x+8.0)*x-16.0 if(y*y10)then y1=y x1=x else x2=x y2=y end if if(abs(y).gt.1E-6)goto 20 Print*,The root of equation is:,x end,例:用弦截法求方程 x3-2x2+8x-16=0 的近似根。,第55页,5.5无循环变量的DO构造 一般形式:构造名:DO 块 END DO注意:对

32、于不带控制变量的DO构造,DO块中必须有EXIT语句,使它停止循环,否则循环将无休无止地一直进行下去,形成死循环。,第56页,DO构造也可在自身中再嵌DO构造,例如:FIRST:DO 块1的第一部分 SECOND:DO 块2 END DO SECOND 块1的第二部分END DO FIRST,第57页,EXIT语句EXIT语句的作用是停止循环,使控制退出循环结构,因此又称出口语句。它的一般形式是:EXIT DO构造名 执行EXIT语句,其功能是导致循环终止。注意:1 如果语句引用了DO构造名,则它属于该构造,否则属于它所出现的最内层DO构造。2对于多层嵌套的DO构造,尤为需要指明是从哪一个构造

33、名的DO构造中退出。如当EXIT指明从第三层结构退出,则第三层与第三层内各层嵌套的DO构造都将被停止执行。3通常将EXIT语句与IF语句结合使用,即在DO构造内使用:IF(逻辑表达式)EXIT。当逻辑表达式为真时,EXIT语句被执行,循环终止,否则循环将继续进行。,第58页,例如:implicit none integer i,j real y,term y=0 xx:do j=1,1000 ww:do i=1,1000 term=1./(i*(i+1)y=y+term if(abs(term)=1.e-5)exit xx end do ww print*,ok end do xx print

34、*,sum,y,term=,i,j end,第59页,implicit noneinteger:i,nreal:y=0,termread*,ndo i=1,nterm=1./(i*(i+1)y=y+termif(abs(term)=1.e-5)exitend doprint*,sum,y,term=,iend,例:求级数的前n项和,但当某项绝对值10-5时,虽未满n项,也因满足精度而不再加入下一项。,第60页,CYCLE语句CYCLE语句的一般形式为:CYCLE DO构造名CYCLE语句的功能是在循环中跳过它下面那部分的DO块,重新返回到块的第一个语句开始执行。运用CYCLE语句,可以在执行循

35、环中某一次迭代时不执行下面的部分语句,使DO结构更为灵活。CYCLE语句与EXIT语句一样属于特定的DO构造。如果语句引用了DO构造名,则它属于该构造,否则属于它所出现的最内层DO构造。,第61页,parameter(n=10)write(*,(a)Loop:1st 2nd 3rdloop_1:do i=1,n if(i.gt.3)exit loop_1 write(*,1)i loop_2:do j=1,nif(j.gt.2)cycle loop_2 if(i.eq.2.and.j.gt.1)exit loop_2 write(*,2)j loop_3:do k=1,n if(k.gt.2)

36、cycle loop_3 if(i.eq.1.and.j.gt.1)exit loop_2!跳出最内2层循环 write(*,3)kend do loop_3 end do loop_2end do loop_11 format(10 x,i2)2 format(16x,i2)3 format(22x,i2)end,例:,第62页,隐DO循环 隐DO循环实际上是带控制循环变量的DO循环,但简化成只有DO循环的第一句,且把关键字DO隐去,成为I=m1,m2,m3形式。它不是独立语句,只是用作为读写语句的输入输出表中一个组成部分,用来控制重复读写的次数。例如:READ*,(VALUE(I),I=1,20)表示读入VALUE(1),VALUE(2),VALUE(20)的值。WRITE(*,*)(A,B,N=1,5)表示在当前设备用默认格式重复输出A、B的值5次。,第63页,作业和上机题,P126 三、九、十四,P145 一、二、五、八,P192 一、四、五,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号