Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Fortran > [General] Чайник vs Фортран


Автор: FortranTamer 10.12.2010, 09:41
Господа, здравствуйте! Надеюсь на вашу помощь!

Предыстория: нужно освоить фортран (FPS 4.0) на нормальном уровне, на нем никогда раньше не работал. 

Описание проблемы: Клепаю простые задачки просто в целях знакомства с языком и не заморачиваясь на красоту и стройность алгоритма. Написал следующую программулину: 

      Program Optimal Path
      Real :: k, V1=6, V2=4, x=0, t, deltat=10
      write (*, 100) "first velocity, m/s ", V1
      write (*, 100) "second velocity, m/s", V2
      100 format (A, //)
      t=((x**2+3**2)**0.5)/V1+(((10-x)**2+3**2)**0.5)/V2
      k=1  
      do while (abs (deltat) > 0.000001)
        x=x+k
        deltat=t-(((x**2+3**2)**0.5)/V1+(((10-x)**2+3**2)**0.5)/V2)
        t=((x**2+3**2)**0.5)/V1+(((10-x)**2+3**2)**0.5)/V2
        write (*,*) t, "  ", x
        if (x+k>8) then 
                k=k/10
                x=7.2
        end if    
      end do
      write (*,*) x
      write (*,"(A10)") t
      read (*,*)
      end

Условие задачи премерно такое (если это окажется важным, если нет - можно просто байпасировать): есть площадка 6*10 метров. половина (3*10) залита бетоном, другая половина засыпана песком. Агрегат премещается из одного угла в диагонально противоположный. Скорость движения по бетону - 6м/с, по песку - 4м/с. Определить, через какую точку границы бетон/песок должен пройти агрегат, чтобы время прохождения оказалось минимальным. 

Вопрос: Конечно, решение корявое и не совсем корректное, но это для меня  сейчас не важно. Больше смущает представление результата Фортраном. Он выдает непонятные загагулины (см.прикрепленный файл).
Т.е. возмущение вызывают следующие моменты: 
1) почему write (*, 100)  "first velocity, m/s ", V1  - выводит irst... - первый символ потерян! А 100 format (A, //) выводит какие-то кракозябры, вместо цифирок?
2) почему арифметика сбивается на цифирках 7,5 дальше: 7,599999; 7,699999 и т.п. до конца?
3) и опять же в конце кракозябры.
4) да и как перености формулу, если она превышает установленную длину строки?

Автор: FCM 10.12.2010, 13:32
Цитата(FortranTamer @  10.12.2010,  09:41 Найти цитируемый пост)
Предыстория: нужно освоить фортран (FPS 4.0) на нормальном уровне

Может лучше осваивать сразу современные фортран-компиляторы?

Цитата(FortranTamer @  10.12.2010,  09:41 Найти цитируемый пост)
1) почему write (*, 100)  "first velocity, m/s ", V1  - выводит irst... - первый символ потерян! А 100 format (A, //) выводит какие-то кракозябры, вместо цифирок?

В старинных фортранах 1-ая позиция записи  не выводится - поэтому обычно формат начинали с 1X, т.е. с переходом на 2-ую позицию.
Что касается формата, то он задан неправильно, поскольку не задан дескриптор формата для REAL-числа.

Цитата(FortranTamer @  10.12.2010,  09:41 Найти цитируемый пост)
2) почему арифметика сбивается на цифирках 7,5 дальше: 7,599999; 7,699999 и т.п. до конца?

Потому что аппаратно под каждое число отводится конечное число бит (это для всех языков программирования!) => не каждое число может быть представлено точно. Обычно в расчетах пользуются точностью REAL(8), а REAL(4) это что-то вроде "бесплатного приложения".

Цитата(FortranTamer @  10.12.2010,  09:41 Найти цитируемый пост)
4) да и как перености формулу, если она превышает установленную длину строки?

Если файл с расширением .f90, то поставь & после первой части формулы.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)