回 帖 发 新 帖 刷新版面

主题:[讨论]求助:文件执行前一部分 后面执行不下去了,请问原因呢?

现在编辑一个程序时出现一个问题,整个程序是做“把两个存放有序输得文件归并成一个文件,此文件中的数仍有序存放”。
  
问题:执行时会出现只有前两个文件输出,第三个不能打印出来,我估计在标号30后的语句就执行不下去了,请帮忙看下谢谢,最好能分析下原因吧···
另外,标号100后的语句没什么问题,我照着老师的程序搞下来的。

回复列表 (共7个回复)

沙发

搞这么复杂干什么呢?这样不行么?
    PROGRAM MAIN 
    INTEGER NREC
    PARAMETER(NREC=10)
    INTEGER A(NREC),B(NREC),C(2*NREC)
    OPEN (UNIT=1,FILE='F1.DAT',STATUS='UNKNOWN')
    OPEN (UNIT=2,FILE='F2.DAT',STATUS='UNKNOWN')
    OPEN (UNIT=3,FILE='F3.DAT',STATUS='UNKNOWN')


    DO 5 I=1,NREC,1
        A(I)=INT(RAND()*9999)
5    CONTINUE    
    CALL  SORT(A, NREC)    
    DO 10 I=1, NREC,1
        WRITE(1,*) A(I)
10    CONTINUE 
    
    DO 15 I=1,NREC,1
        B(I)=INT(RAND()*9999)
15    CONTINUE 
    CALL  SORT(B,NREC)    
    DO 20 I=1, NREC,1
        WRITE(2,*) B(I)
20    CONTINUE 


      DO I=1,NREC,1
     C(I)=A(I)
       C(I+10)=B(I)
    ENDDO

    CALL  SORT(C, 2*NREC)    
    DO I=1, 2*NREC,1
        WRITE(3,*) C(I)
      ENDDO

    END
    
    
    SUBROUTINE SORT(A,N)
    INTEGER A(N), P
    WRITE(*,*) (A(I), I=1, N)
    DO 10 J=1,N-1
        P=J
        DO 20 I=J+1,N
            IF (A(I) .LT.A(P))THEN
                P=I
        ENDIF
20        CONTINUE 
        K=A(J)
        A(J)=A(P)
        A(P)=K
10    CONTINUE
    WRITE (*,*) (A(I),I=1,N)
    END





    FUNCTION RAND()
    SAVE SEED
    INTEGER SEED,C1,C2 ,C3
    PARAMETER (C1=29,C2=127,C3=1024)
    DATA SEED/0/
    SEED=MOD(SEED*C1+C2, C3)
    RAND=REAL(SEED)/C3
    END

板凳


再说了,你这每次得到一样的随机数,干什么用?有什么意义呢?

3 楼

[quote]
再说了,你这每次得到一样的随机数,干什么用?有什么意义呢?[/quote]
我在跟别人学做程序呢,一时搞不出来,所以问问的,请问,我的那个是哪里出问题了呢, 您改的这个是不是f90版本的啊?

4 楼

问题出在
600    READ (UNIT=3,END=500) I
    PRINT *, I
    GOTO 600
这段上,改成
    K=1
600    READ (UNIT=3,REC=K,IOSTAT=IO3) I
    K=K+1
    PRINT *, I
    IF(IO3.NE.0) THEN
           GOTO 500
    ELSE
           GOTO 600
    ENDIF
即可运行,问题是你这这种方式能达到合并的效果吗?合并的一段程序思维相当的混乱!不会是你老师的杰作吧?

5 楼

即可运行,问题是你这这种方式能达到合并的效果吗?合并的一段程序思维相当的混乱!不会是你老师的杰作吧?[/quote]
  

是按照徐红波老师的视频教程上面搞的,我只是想实践一下,我发现了,您就是高手,佩服!

6 楼

1. 首先,徐红波老师的视频教程 上提供的程序是一个很“老古董”,不符合现代程序设计的理念;
2. 就排序算法而言,其所用的是一个很简单的“冒泡法”,效率很低;用此排序算法,得到两个“良序”序列;
3. 然后用 mergesort 将两个“良序”序列排序,这个算法可比“冒泡法”效率高多了。

作为菜鸟,先学基本的未尝不可,但到一定的“高度”后,要熟悉点 算法。

7 楼

[quote]1. 首先,徐红波老师的视频教程 上提供的程序是一个很“老古董”,不符合现代程序设计的理念;
2. 就排序算法而言,其所用的是一个很简单的“冒泡法”,效率很低;用此排序算法,得到两个“良序”序列;
3. 然后用 mergesort 将两个“良序”序列排序,这个算法可比“冒泡法”效率高多了。

作为菜鸟,先学基本的未尝不可,但到一定的“高度”后,要熟悉点 算法。[/quote]
明白了,谢谢指教!看徐老师的教程,我是想熟悉一下Fortran编程的基本步骤,然后根据我自己的课题需求再编一些程序,有点困难啊,不过有了这个论坛,好多了···

我来回复

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