Fortran Coder

查看: 17865|回复: 6
打印 上一主题 下一主题

[求助] 程序出问题

[复制链接]

5

帖子

2

主题

0

精华

新人

F 币
22 元
贡献
13 点
跳转到指定楼层
楼主
发表于 2014-2-19 10:44:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
新建文件夹.zip (2.14 KB, 下载次数: 2)
[Fortran] 纯文本查看 复制代码
01module typedef
02  type sm
03    real(kind=4) v,n1
04  end type
05end module
06 
07program main
08  use typedef
09  implicit none
10  type(sm)::s1(100),s2(100),s3(100),s4(100),s5(100),s6(100),s7(100),s8(100),s9(100),s10(100),s11(100),s12(100),s13(100)
11  character::file1="length.txt",file2="length(2).txt",file3="length(3).txt",file4="length(4).txt",file5="length(5).txt",file6="length(6).txt"
12  integer::i,status=0
13  real::d1(50),d2(50),d3(50),d4(50),d5(50),d6(50)
14 
15  forall(i=1:50)
16     d1(i)=0
17         d2(i)=0
18         d3(i)=0
19         d4(i)=0
20         d5(i)=0
21         d6(i)=0
22  end forall
23 
24  open(11,file="length1.txt",status="old")
25  do i=1,50
26    read(11,*,iostat=status) s1(i)%v,s1(i)%n1
27        if(status/=0) exit
28        d1(s1(i)%v)=s1(i)%n1
29                write(*,*) s1(i)%v,s1(i)%n1
30 
31  end do
32 
33 
34  open(12,file="length(2).txt",status="old")
35 do i=1,50
36    read(12,*,iostat=status) s2(i)%v,s2(i)%n1
37                d2(s2(i)%v)=s2(i)%n1
38        if(status/=0) exit
39 
40  end do
41 
42 
43    open(13,file="length(3).txt",status="old")
44  do i=1,50
45    read(13,*,iostat=status) s3(i)%v,s3(i)%n1
46                d3(s3(i)%v)=s3(i)%n1
47                if(status/=0) exit
48  end do
49 
50    open(14,file="length(4).txt",status="old")
51do i=1,50
52    read(14,*,iostat=status) s4(i)%v,s4(i)%n1
53                d4(s4(i)%v)=s4(i)%n1
54                if(status/=0) exit
55  end do
56 
57    open(15,file="length(5).txt",status="old")
58 do i=1,50
59    read(15,*,iostat=status) s5(i)%v,s5(i)%n1
60                d5(s5(i)%v)=s5(i)%n1
61                if(status/=0) exit
62  end do
63 
64    open(16,file="length(6).txt",status="old")
65do i=1,50
66    read(16,*,iostat=status) s6(i)%v,s6(i)%n1
67                d6(s6(i)%v)=s6(i)%n1
68                if(status/=0) exit
69  end do
70 
71 
72  open(17,file="length7.txt")
73do i=1,50
74   write(17,*) i, real(d1(i)+d2(i)+d3(i)+d4(i)+d5(i)+d6(i))/real(6)
75  end do
76 
77  end program


分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

5

帖子

2

主题

0

精华

新人

F 币
22 元
贡献
13 点
沙发
 楼主| 发表于 2014-2-19 11:08:41 | 只看该作者
越界问题,是因为先执行了
d6(s6(i)%v)=s6(i)%n1
然后再判断的是否文件结束了。所以上面这句代码越界。

742

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
726 元
贡献
371 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

板凳
发表于 2014-2-19 11:10:05 | 只看该作者
是的,你的代码其实可以很简单的用循环来实现。

一会吃完午饭我空闲的,可以帮你重写这个程序。

742

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
726 元
贡献
371 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

地板
发表于 2014-2-19 11:36:09 | 只看该作者
本帖最后由 chuxf 于 2014-2-19 11:37 编辑

你是想统计对应整数的数据的平均值。那么就不能统一除以 6,因为某些整数只出现了2次。

我为你重写了整个程序,并添加了注释

[Fortran] 纯文本查看 复制代码
01module typedef
02  type sm
03    real(kind=4) :: v !// 值
04    integer :: n !// 出现次数
05  end type
06end module typedef
07 
08program www_fcode_cn
09  use typedef
10  implicit none
11  Integer , parameter :: N_File = 6 !// 6 个文件
12  Integer , parameter :: N_Rec  = 50 !// 最多 50 个记录
13  character( len = 30 ) ::file( N_File + 1 ) = (/"length1.txt","length(2).txt","length(3).txt","length(4).txt","length(5).txt","length(6).txt","length(7).txt"/)
14  !// 上面是 6 个输入文件。加上一个输出文件 length(7).txt
15  Type ( sm ) :: d( N_Rec )
16  integer :: i , j , ierr
17  real :: rv
18  d( : )%v = 0.0 !// 所有值一开始为 0.0
19  d( : )%n = 0 !// 所有出现次数一开始为 0
20  Do i = 1 , N_File !// 循环读取 6 个文件
21    Open( 12 , File = Trim(file(i)) , status="old" )
22    Do !// 循环读取每个文件的每行
23      Read( 12 , * , ioStat = ierr ) j , rv
24      if( ierr /= 0 ) exit
25      d(j)%v = d(j)%v + rv  !// 值叠加上去
26      d(j)%n = d(j)%n + 1 !// 出现次数加1
27    End Do
28    Close( 12 )
29  End Do
30  open(17,file=Trim(file(N_File+1)))
31  Do i = 1 , N_Rec
32    if ( d(i)%n == 0 ) then !// 如果从未出现
33      rv = 0.0  !// 平均值取 0.0
34    else
35      rv = d(i)%v / d(i)%n !// 否则,叠加值除以出现次数
36    end if
37    write(17,*) i , rv ! , d(i)%n !// 可以输出 d(i)%n 出现次数确认没有问题
38  End do
39end program www_fcode_cn

98

帖子

5

主题

3

精华

专家

F 币
426 元
贡献
275 点

管理勋章新人勋章

5#
发表于 2014-2-19 11:47:03 | 只看该作者
77行代码变成39行,赞!

5

帖子

2

主题

0

精华

新人

F 币
22 元
贡献
13 点
6#
 楼主| 发表于 2014-2-19 13:06:41 | 只看该作者
chuxf 发表于 2014-2-19 11:36
你是想统计对应整数的数据的平均值。那么就不能统一除以 6,因为某些整数只出现了2次。

我为你重写了整个 ...

谢谢,这个可以运行的,:)

5

帖子

2

主题

0

精华

新人

F 币
22 元
贡献
13 点
7#
 楼主| 发表于 2014-2-19 13:07:12 | 只看该作者
lm_lxt 发表于 2014-2-19 11:47
77行代码变成39行,赞!

嗯,是的。厉害啊!
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2025-4-29 04:58

Powered by Discuz! X3.4

© 2013-2025 Comsenz Inc.

快速回复 返回顶部 返回列表