Ошибка кода генерации матрицы Фортрана - PullRequest
1 голос
/ 02 апреля 2012

Этот код Фортрана должен копировать данные из простой матричной таблицы в текстовый файл, а затем вычислять оценку и среднее значение на основе предыдущих оценок для каждой строки и столбца.По какой-то причине я не могу получить оценку или средние значения для печати, они отображаются пустыми или с нулями или звездами.Программа аварийно завершает работу после того, как она печатает матричную таблицу из txt-файла, она говорит, что ошибка является нарушением прав доступа, поэтому она не сильно помогает.Вот мой код:

program calculate1
real,dimension(:,:),allocatable :: a
character(200)::line
print *,'How many rows are there?'
read *,n !amount of rows
print *,'How many columns are there?'
read *,m !amount of columns
allocate (a(n+1,m+1))
open(1, file='in1.txt')
call print_out (a,n+1,m+1)
Close(1);

contains
subroutine print_out(b,n,m)
real,dimension(:,:):: b
character(200)::line(n)
character(1)::g
write(*,'(10x)',advance='no')
do j=2,m-1
write(*,100,advance='no'),'hw',j-1
enddo
100 format(a2,i2,3x)
print '(a6,a6)','exam  ','grade  '
do i=1,n-1 !makes rows from data
read(1,'(a)') line(i)  !read from in1.txt
write(*,'(a)') line(i) !write to screen
enddo
do i=1,n         !makes (m+1)th column
b(i,m+1)= sum(b(i,1:m-1))+3*b(i,m)
enddo
do j=1,m+1             !makes (n+1)th row
b(n+1,j)= sum(b(1:n,j))/n
enddo
101 format(a8,4x,20f8.2)  ! format for average print
print 101, 'averages', b(n+1,j)
endsubroutine
endprogram 

, а вот что находится в файле in1.txt:

jackson     4.    4.    4.2   8.
johnson     4.    2.    2.11  3.
sugimoto    1.    0.    1.5   0.
wong        3.5   3.    3.    2.    

1 Ответ

5 голосов
/ 02 апреля 2012

Поскольку это домашнее задание, я могу только намекнуть: ваш код читает строку из файла в символьную переменную и игнорирует ее. Затем он выполняет некоторые операции с матрицей b, которой не было присвоено никаких значений. Программы на фортране часто аварийно завершают работу, если в операторе записи задан неверный тип переменной, например символьная переменная, когда в операторе формата задано действительное число.

Так как это домашнее задание:

  • всегда используйте IMPLICIT NONE;
  • сделают ваш код более легким для чтения и более легким для SO;
  • ваши матричные суммы, используя циклы, могут быть гораздо более легко запрограммированы с использованием синтаксиса массива Фортрана; если вы учитесь программировать на Фортране, изучите синтаксис массива;
  • избегайте глобальных переменных и магических чисел, в вашем коде есть хотя бы одна из них.
...