回 帖 发 新 帖 刷新版面

主题:怎么退出循环?exit?goto?

我有个程序段,算了好久了 ,发现下面这个地方缺东西了,没有退出循环就进行下一次运算了。
  ea=0.0
  eb=0.0
  ec=0.0
  ed=0.0

do p=1,450000
    do i=1,4*m*n-1
    if((eigenvalue(i)<=Ef(p)).and.(eigenvalue(i+1)>Ef(p))) then
       do temp=1,i
         do j=i+1,4*m*n
    ea=matmul(traneigv(temp,:),hx)
    ec=matmul(traneigv(temp,:),hy)
    eb=matmul(traneigv(j,:),hx)
    ed=matmul(traneigv(j,:),hy)

      conduc=conduc+(dot_product(ea,eigenvector(:,j))*dot_product(ed,eigenvector(:,temp))    
        end do       
       end do
   conr=2*pi*aimag(conduc)/S   
    end if    
   end do
 end do

eigenvalue是矩阵特征值,Ef是能量。
  上面这个片段好像第一次是ea,eb,ec,ed都从0开始,i=1,开始第一次运算,内部循环以后给他们赋值,然后第二次运算就从这个值开始,不是从0开始了吧?我想仍然让它从0开始,在哪个地方加exit?或者goto语句呢?在end if前面加exit到底是退出if语句还是整个循环啊?
  关于运算大家看下这样行不?我想把每个i得到的conduc都放在conr里,会不会后面的数据把前面的数据覆盖掉?

回复列表 (共25个回复)

21 楼

太感激了

22 楼

首先感谢老师您在百忙中,在凌晨1点给我指导。谢谢您!
  根据我的要求,我又思考了下,应该是每个p对应一个conr(p),而不是每个i对应一个conr(i)。根据您的指导,再结合我的程序我做了修改:
q=1
  do i=1,4*m*n-1
   conduc=0.0
   k=0
   do p=q,450000 
     if((eigenvalue(i)<=Ef(p)).and.(eigenvalue(i+1)>Ef(p))) then !如果p满足条件,就执行下面的操作,再看下满足这个条件的p有几个
        q=p+1
        k=k+1
         do temp=1,i
         do j=i+1,4*m*n
          ea=matmul(traneigv(temp,:),hx)
          ec=matmul(traneigv(temp,:),hy)
          eb=matmul(traneigv(j,:),hx)
          ed=matmul(traneigv(j,:),hy)
          conduc=conduc+(dot_product(ea,eigenvector(:,j))*dot_product(ed,eigenvector(:,temp))    
        end do       
       end do  
  conr(p)=2*pi*aimag(conduc)/S
       end if    
    end do
     
  end do

23 楼

[quote]首先感谢老师您在百忙中,在凌晨1点给我指导。谢谢您!
  根据我的要求,我又思考了下,应该是每个p对应一个conr(p),而不是每个i对应一个conr(i)。根据您的指导,再结合我的程序我做了修改:
q=1
  do i=1,4*m*n-1
   conduc=0.0
   k=0
   do p=q,450000 
     if((eigenvalue(i)<=Ef(p)).and.(eigenvalue(i+1)>Ef(p))) then !如果p满足条件,就执行下面的操作,再看下满足这个条件的p有几个
        q=p+1
        k=k+1
         do temp=1,i
         do j=i+1,4*m*n
          ea=matmul(traneigv(temp,:),hx)
          ec=matmul(traneigv(temp,:),hy)
          eb=matmul(traneigv(j,:),hx)
          ed=matmul(traneigv(j,:),hy)
          conduc=conduc+(dot_product(ea,eigenvector(:,j))*dot_product(ed,eigenvector(:,temp))    
        end do       
       end do  
  conr(p)=2*pi*aimag(conduc)/S
       end if    
    end do
     
  end do[/quote]

    你一会儿每个p对应一个conr(p),一会儿每个i对应一个conr(i)?!每个p对应一个conr(p),又回到了我第17楼的贴子,用那段程序即可!
    每个i找满足的p,就先对i循环,每个p找对应的i,就先对p循环,这样程序可读性强一些!
    关键就是到底是每个p对应一个conr(p),还是i对应一个conr(i)?从一开始我就揣摩你到底要哪一个,你自己似乎对这个都捉摸不定!

24 楼

哈哈,是每个p对应一个conr(p)

25 楼

用17楼的帖子吧。哈哈

我来回复

您尚未登录,请登录后再回复。点此登录或注册