На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > помогите с програмкой на Fortran , не понимаю что не так..
      задание:Дан файл f, компоненты которого являются действительными числами. Найти при помощи подпрограммы общего вида
      А) сумму компонет файла
      Б) модуль суммы и квадрат произведения компонент файла

      ExpandedWrap disabled
        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
        Во-первых, где у тебя задаются n, i1, i2?
        Во-вторых, зачем ты открываешь файл? Он у тебя нигде не используется.
        В-третьих, зачем ты вообще вызываешь subr, она все равно результат не возвращает, и, подозреваю, вернуть не может, потому что некуда.
          1 - какой компилятор используется?
          2 - какие ключи при компиляции?
          3 - какие ошибки при компиляции?
          4 - какие ошибки при выполнении?

          Общий совет: разбить программу на подпрограммы (не обязательно модули), написать код и вставлять комментарии для каждой исполняемой строчки кода, как результат сразу поймете где и что не так.
          Сообщение отредактировано: NetVir -
            Вообще, программа выглядит нормальной. Просто она делает не то, что должна бы делать.
              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)

              вот попробывал без подпрограммы, все работает, теперь только осталось грамотно написать Подпрограмму..
              ExpandedWrap disabled
                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
              Сообщение отредактировано: Jeremy -
                Цитата Jeremy @
                нам данный брать из файла надо.
                Почему тогда не брал?

                С open вроде порядок, не знаю правда, что означал blank='null' в первом посте

                Цитата Jeremy @
                Warning: In the call to SUBR, actual argument #2 does not match
                Правильно, ты передаешь целое (и должен передавать), а описываешь его (а также третий параметр) в подпрограмме как вещественное.

                Цитата Jeremy @
                Warning: Variable N is used before

                Количество вводимых данных надо или при их чтении определить, или ввести перед циклом.

                В подпрограмму надо передать ссылку на массив, индекс первого/последнего суммируемого элемента, и ссылку на переменную, куда будешь писать результат.

                что-то вроде
                ExpandedWrap disabled
                  ...
                  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
                  Еее получилось, работает, спасибки тебе за помощь с подпрограммой. Вот, если хочешь взглянуть на "творение":
                  ExpandedWrap disabled
                    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
                  Сообщение отредактировано: Jeremy -
                    Цитата Jeremy @
                    я в файле прописал цифру, и ее читает программа
                    Также можно ловить конец файла и подсчитывать количество прочитанных чисел. Но это если только весь файл только эти числа и содержит.
                      Цитата amk @
                      Цитата Jeremy @
                      я в файле прописал цифру, и ее читает программа
                      Также можно ловить конец файла и подсчитывать количество прочитанных чисел. Но это если только весь файл только эти числа и содержит.

                      а как это ловить?
                      а то препод сказал, что так, как я сделал нельзя
                        Цитата Jeremy @
                        а как это ловить?

                        http://www.oc.nps.edu/~bird/oc3030_online/fortran/io/io.html
                        или вообще погуглить на тему EOF (end-of-file) in fortran
                        Сообщение отредактировано: NetVir -
                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,0414 ]   [ 15 queries used ]   [ Generated: 1.05.24, 01:13 GMT ]