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


Автор: echmel 26.3.2010, 09:27
Заранее прошу прощения. С данным языком я просто не знаком. Знаю паскаль и Си.
Код такой:
Код

 Ntime=2190
 Nff=10001

 do i=1,nff
        signal(i)=R*solar(i)*trans(i)*refl(i)/3.141592592
         enddo

  do i=1,Ntime

        write(2,1001) (signal(i),i=1,nff)
        enddo
1001    format(5001(1x,e12.7))



Результатом является файл содержащий 50001 чисел в строке и 4380 строк. 
signal как я понял является одномерным массивом.
Что означает конструкция  (signal(i),i=1,nff) ? И почему очередная выводимая последовательность числе из массива signal отличается от предыдущей последовательности?

Автор: FCM 26.3.2010, 09:32
Цитата(echmel @  26.3.2010,  09:27 Найти цитируемый пост)
Что означает конструкция  (signal(i),i=1,nff) ?


Это так называемый неявный цикл, часто используемый в операциях вывода массивов.

Автор: echmel 26.3.2010, 10:13
Какой компилятор неизвестно. Дело в том, что это код не мой, а преподавателя, который дал его мне, что бы объяснить в каком порядке данные пишуться в файл, но вот незадача; фортрана то в учебной программе не было. Я его попросил перевести на паскалевский код или сишный, так он написал следующее:
Код

const
  str=4;{количество строк}
  col=4;{количество столбцов}
var
  a:array [1..str,1..col] of integer;
  i,j :integer;
begin

    for i:=1 to str do
  begin
    for j:=1 to col do
    begin
      write(a[i,j]:2,' ')
    end;
  end;


Здесь конечно все просто.
А вот с фортраном нет.
Мне тоже непонятно почему один и тот же индекс используется в двух местах. От препода добиться внятных объяснений вообще не получается!!! Учусь удаленно, так что вот такие проблемы и возникают

Автор: FCM 26.3.2010, 11:00
Думаю, преподавательский фортран-код неправильный из-за вышеуказанной проблемы -  подобный код в Intel Fortran (да и, я думаю, в др. компиляторах тоже) не компилируется.
Без компилятора под рукой изучать язык бессмысленно.
Да и зачем такие большие размеры в учебном примере?

В Фортране то же все просто, за исключением того, что матрицы хранятся в памяти по столбцам, а не по строкам.

Код

PROGRAM Q
   
   INTEGER, PARAMETER :: R = 2, C = 3 
   INTEGER :: I, J , A(R,C)

   DO I =1,R
      DO  J = 1,C
         A(I,J) = 10*I + J    ! инициализация
      ENDDO
   ENDDO

  ! 1 Вариант  вывода (линейно, как расположен в памяти - по столбцам)
   WRITE(*,*) A 
  ! 2 Вариант вывода линейно как расположен в памяти - по столбцам 
  ! с помощью двойного неявного цикла
   WRITE(*,*)  ((A(I,J), I=1,R), J = 1,C) 
  
   ! 3 Вариант вывода линейно по строкам матрицы с помощью двойного неявного цикла
   WRITE(*,*)  ((A(I,J), J=1,C), I = 1,R) 
   
  ! 4 Вариант вывода по строкам матрицы с помощью обычного и неявного цикла
   DO I = 1,R
      WRITE(*,*)  (A(I,J), J=1,C) 
   END DO

    ! 5 Вариант вывода по строкам матрицы с помощью обычного цикла и сечений
   DO I = 1,R
      WRITE(*,*)  A(I,:) 
   END DO
   
END PROGRAM Q


Возможно есть еще варианты вывода.
Также есть варианты с инициализацией (в т.ч. с применением неявных циклов).

Здесь для простоты рассмторен вывод на экран в свободном формате WRITE(*,*).
Для вывода в файл вместо первой * становится номер устройства вывода, связнного с конкретным файлом. При необходимости задания формата вместо второй * указывается формат.

Автор: milachka 17.12.2011, 15:13
Завдання
(метод та початкові наближення коренів)
відносна похибка у відсотках e = 10−5 %,
для ε -алгоритму: q =2, p = 2
Метод січних
(оберт.матриці
методом Гауса з
вибор. гол. ел-тів по
стовпцю )

0.1+x_1+x_2^2+0.1+x_1=0
2*x_1 〖*x〗_2+0.1+x_2=0

поч.наближення
x_1^0=0
x_2^0=0

Добавлено через 1 минуту и 57 секунд
помогите сделать выше напечатанное, а то ничего незнаю, а сдать надо. с подробным описанием если можно. спасибо.

Автор: Фантом 17.12.2011, 16:12
Цитата(milachka @  17.12.2011,  16:13 Найти цитируемый пост)

помогите сделать выше напечатанное, а то ничего незнаю, а сдать надо. с подробным описанием если можно. спасибо. 

Ви вважаєте, що людині, якій лінь перевести завдання на російську мову, хтось кинеться допомагати?

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