#python #loops #fortran #fortran90
#python #циклы #fortran #fortran90
Вопрос:
Мой профессор спросил меня, есть ли у меня время / желание этим летом выяснить, почему одна из его программ на fortran 90 не работает в версии без комментариев, но находится в версии с комментариями. Программа состоит из пары тысяч строк, поэтому я, очевидно, не буду искать ошибку вручную.
Моя идея заключается в следующем, поскольку я не опытный программист, но решил взять на себя эту задачу в качестве задания для развлечения / обучения, и одолжение профессору состояло в том, чтобы написать скрипт python для чтения каждой строки текстовых файлов и сохранения каждой строки в списке, исключая строки, которые являются комментариями (так чтоначните с ! COMMENT TEXT
) и строк, которые не содержат никакого кода (только строки)
Я скопировал и вставил исходный код fortran с комментариями и комментариями, удалив все отступы в два текстовых файла, вызываемых соответственно c.txt
и unc.txt
. Пока у меня есть следующее:
listCom = []
esclam = "!"
with open("c.txt") as f:
i=0
for line in f:
line = line.strip()
if line == "":
continue
if line.find(esclam) == -1:
listCom.append(line)
for e in listCom:
print e
Это было сделано для того, чтобы проверить, правильно ли сохранена каждая строка в текстовом файле с прокомментированной версией в списке, но она работает некорректно. Возможно, я делаю проблему более сложной, чем она есть на самом деле. Любые предложения приветствуются. Мой план состоял в том, чтобы повторить тот же процесс для раскомментированного текстового файла, а затем сравнить два списка запись за записью, используя переменную флага, чтобы сообщить мне, в какой записи 2 отличаются или что они вообще не отличаются.
Пример исходного кода fortran 90 для версии с комментариями, вставленной в c.txt
файл:
! When this subroutine is run at double precision,
! a good number is 7.
use constants
implicit none
complex(kind=double), intent(inout) :: A
complex(kind=double), intent(in) :: Q
integer, intent(in):: order,case_type,choice, comp_coeff
complex(kind=double), dimension(0:MAX_),intent(out) :: D_m
integer, intent(out):: k_max
complex(kind=double),intent(out):: norm
pi=acos(-one)
G_2=cmplx(zero,zero,double)
G_1=cmplx(zero,zero,double )
!FL=2.0D0**126
FL=D1mach(2)
Комментарии:
1. Помимо вопроса о программировании, я предлагаю вам взглянуть на tkdiff или тому подобное, и чтобы ваш профессор изучил систему управления версиями .
2. что вы подразумеваете под «некорректной работой».
Ответ №1:
with open('file.txt', 'r') as f:
f = f.read().splitlines()
lines = [x for x in f if x and not x.strip().startswith('!')]
lines
представляет собой список, содержащий все строки кода fortran без строк комментариев или пустых строк.
for line in lines:
print(line)
будет печатать
use constants
implicit none
complex(kind=double), intent(inout) :: A
complex(kind=double), intent(in) :: Q
integer, intent(in):: order,case_type,choice, comp_coeff
complex(kind=double), dimension(0:MAX_),intent(out) :: D_m
integer, intent(out):: k_max
complex(kind=double),intent(out):: norm
pi=acos(-one)
G_2=cmplx(zero,zero,double)
G_1=cmplx(zero,zero,double )
FL=D1mach(2)
для вашего примера файла.