Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.146.255.127] |
|
Сообщ.
#1
,
|
|
|
задание:Дан файл f, компоненты которого являются действительными числами. Найти при помощи подпрограммы общего вида
А) сумму компонет файла Б) модуль суммы и квадрат произведения компонент файла program bio dimension a(100) Open (1,status='old', file='f.txt', blank='null') do i=1,n read*, a(i) end do call subr (a, i1, i2) do i=1,n print*, a(i) end do close(1) end subroutine subr (a, i1, i2) dimension a(100) real a,s,i1,i2 s=0 do i=i1,i2 s=s+a(i) end do end |
Сообщ.
#2
,
|
|
|
Во-первых, где у тебя задаются n, i1, i2?
Во-вторых, зачем ты открываешь файл? Он у тебя нигде не используется. В-третьих, зачем ты вообще вызываешь subr, она все равно результат не возвращает, и, подозреваю, вернуть не может, потому что некуда. |
Сообщ.
#3
,
|
|
|
1 - какой компилятор используется?
2 - какие ключи при компиляции? 3 - какие ошибки при компиляции? 4 - какие ошибки при выполнении? Общий совет: разбить программу на подпрограммы (не обязательно модули), написать код и вставлять комментарии для каждой исполняемой строчки кода, как результат сразу поймете где и что не так. |
Сообщ.
#4
,
|
|
|
Вообще, программа выглядит нормальной. Просто она делает не то, что должна бы делать.
|
Сообщ.
#5
,
|
|
|
amk, файл открываю, т.к. задание - "Дан файл f, компоненты которого являются действительными числами.", то есть нам данный брать из файла надо.
и subr тоже из зажания. "Найти при помощи подпрограммы". А нам пока ток Сабрутин объяснили на счет i1,i2,n я вообще неуверен. Препод в инсте сказал, что что-то не так с оператором OPEN. NetVir, компилятор - Compaq Visual Fortran Warning: In the call to SUBR, actual argument #2 does not match the type and kind of the corresponding dummy argument. call subr (a, i1, i2) ^ Warning: In the call to SUBR, actual argument #3 does not match the type and kind of the corresponding dummy argument. call subr (a, i1, i2) ^ Warning: Variable N is used before its value has been defined do i=1,n -------^ NIO.obj - 0 error(s), 3 warning(s) вот попробывал без подпрограммы, все работает, теперь только осталось грамотно написать Подпрограмму.. program nio dimension a(100) Open (1,status='old', file='f.txt') !Вводим данные do i=1,4 read (1,*), a(i) end do !печатаем данные do i=1,4 print*, a(i) end do !находим сумму s=0 do i=1,4 s=s+a(i) end do !печатаем сумму print*, s close(1) end |
Сообщ.
#6
,
|
|
|
Цитата Jeremy @ Почему тогда не брал?нам данный брать из файла надо. С open вроде порядок, не знаю правда, что означал blank='null' в первом посте Цитата Jeremy @ Правильно, ты передаешь целое (и должен передавать), а описываешь его (а также третий параметр) в подпрограмме как вещественное.Warning: In the call to SUBR, actual argument #2 does not match Цитата Jeremy @ Warning: Variable N is used before Количество вводимых данных надо или при их чтении определить, или ввести перед циклом. В подпрограмму надо передать ссылку на массив, индекс первого/последнего суммируемого элемента, и ссылку на переменную, куда будешь писать результат. что-то вроде ... call subr(a, 1, 4, s) ... subroutine subr(a, i1, i2, s) dimension a(1) !здесь размер не важен real s integer i1, i2 s=0 do i=i1,i2 s=s+a(i) enddo return |
Сообщ.
#7
,
|
|
|
Еее получилось, работает, спасибки тебе за помощь с подпрограммой. Вот, если хочешь взглянуть на "творение":
program nio dimension a(100) Open (1,status='old', file='f.txt') !Вводим данные read (1,*), n !я в файле прописал цифру, и ее читает программа, как количество элементов do i=1,n read (1,*), a(i) end do !печатаем данные print*, 'komponenti faila:' do i=1,n print*, a(i) end do call subr(a, 1, n, s, p) m=ABS(s) qw=p**2 !печатаем сумму print*, '' print*, 'summa komponent:' print*, s print*, '' print*, 'Modul summy:' print*, m print*, '' print*, 'kvadrat proizvedeniya komponent:' print*, qw close(1) end subroutine subr(a, i1, i2, s, p) dimension a(1) !здесь размер не важен real s,p integer i1, i2 s=0 p=1 do i=i1,i2 s=s+a(i) enddo do i=i1,i2 p=p*a(i) end do return end |
Сообщ.
#8
,
|
|
|
Цитата Jeremy @ Также можно ловить конец файла и подсчитывать количество прочитанных чисел. Но это если только весь файл только эти числа и содержит. я в файле прописал цифру, и ее читает программа |
Сообщ.
#9
,
|
|
|
Цитата amk @ Цитата Jeremy @ Также можно ловить конец файла и подсчитывать количество прочитанных чисел. Но это если только весь файл только эти числа и содержит.я в файле прописал цифру, и ее читает программа а как это ловить? а то препод сказал, что так, как я сделал нельзя |
Сообщ.
#10
,
|
|
|
Цитата Jeremy @ а как это ловить? http://www.oc.nps.edu/~bird/oc3030_online/fortran/io/io.html или вообще погуглить на тему EOF (end-of-file) in fortran |