nixp.ru v3.0

18 января 2017,
среда,
04:45:07 MSK

DevOps с компанией «Флант»
anonymous написал 16 марта 2005 года в 16:04 (806 просмотров) Ведет себя неопределенно; открыл 1814 темы в форуме, оставил 5575 комментариев на сайте.

Просьба помочь: нужно было написать программу на фортране

используя обычные средства и рядом для проверки используя новые возможности fortran90…

Сама то прога написана, но ошибку идентифицировать не могу, почитал уже справку, кое-какие книжки почитал, но понять все равно не могу…

Помогите, кто может…

Вот текст программы:

Program ART

Implicit None

Real M(1:12), A, B, C, sum, pr, F

Integer i,n

Open(1,FILE=’In.txt’) ! файл с исходным массивом

Open(2,FILE =’Out.txt’) ! результирующий файл

Read(1,*)M ! ввод массива

Write(2,11) M ! вывод массива для контроля

! поиск наименьшего элемента c четным номером

n=2

Do i=4,12,2

If(M(i)

EndDo

A=M(n)

Write(2,1) A, MINVAL(M(2:12:2))

! Сумма элементов больших 0 с нечетным номером

sum=0

Do i=1,11,2

If(M(i)>0) sum=sum+M(i)

EndDo

B=sum

Write(2,2) B, SUM(M, mask = M(1:11:2)>0)

!Произведение модулей отрицательных элементов

Pr=1

Do i=1,12,1

If(M(i)<0) Pr=Pr*Abs(M(i))

EndDo

C=pr

Write(2,3) C, Abs(product(M, mask = M<0))

!Выражение

F=(A+B)*C/(B+C+4)

Write(2,4) F

!Форматный вывод

11 format(’Исходный массив в 2 колонки:’/&

2x,’Нечетные:’,1x,’Четные:’/&

2(2x,F7.2))

1 format(2(1x,’A =’,F7.2),' (Наименьший элемент с четным номером)’)

2 format(2(1x,’B =’,F7.2),' (Сумма элементов больших 0 с нечетным номером)’)

3 format(2(1x,’C =’,F7.2),' (Произведение модулей отрицательных элементов)’)

4 format(1x,’F =’,F7.2,' (Выражение)’)

End

Выводится ошибка:

E:\Art\Учеба\информатика\2 семестр\inf_lab6_28\ART\Text1.f90(27): error FOR3351: inconsistent usage of SUM detected between 0 and )

Может кто сможет помочь ее исправить, а то я уже замучился…

Genie
! Сумма элементов больших 0 с нечетным номером

sum=0

Do i=1,11,2

If(M(i)>0) sum=sum+M(i)

EndDo

B=sum

Write(2,2) B, SUM(M, mask = M(1:11:2)>0)

так ’sum’ — это что? переменная, или всё же функция?

anonymous
Genie
так ’sum’ — это что? переменная, или всё же функция?

Sum — это оператор из новых возможностей фортран90

Хотя наводит на мысль о смене имени переменной sum. Вроде так нельзя…

Genie
Вроде так нельзя…

так что же именно нельзя?

  • дать переменной имя, отличное от имени встроенной функции?


  • или использовать имя встроенной функции как имя переменной?

по мне, так второй вариант, если нет показаний из документации по языку, представляется куда как более вероятным, чем первый ;)))

anonymous
Genie
так что же именно нельзя?
  • дать переменной имя, отличное от имени встроенной функции?
  • или использовать имя встроенной функции как имя переменной?

    по мне, так второй вариант, если нет показаний из документации по языку, представляется куда как более вероятным, чем первый ;)))


Конечно же нельзя делать второй вариант :). Просто я с оператором Sum впервые столкнулся, а без него в программе и перемененная sum работала…

Исправил и все заработало!!!

Огромнейшее тебе спасибо!!!

А то я двое суток над этой проблемой мучался…

anonymous

Мой преподаватель прямо лютует!!!

Показал я ему эту прогу, все идеально!

А потом берет и говорит: а теперь переделай мне эту программу так, чтобы выводился наибольший элемент среди отрицательных элементов…

Ну я умудреный опытом вставляю в программу строчку:

Write(2,*)MaxVal(M,mask=M<0)

Говорит: не так, сделай это циклами…

Делаю:

n=1

do i=1,12,1

if (M(i)<0) then

if (M(i)>M(n)) n=i

endif

enddo

Write(2,*)M(n)

И тут он заявляет: должно быть 2 цикла, следующих друг за другом… Первый цикл находит первый отрицательный элемент, второй цикл находит максимальный элемент среди последующих отрицательных элементов…

Но как это организовать, ума не приложу…

Может поможете, а?

Genie

хмм. что ж тут непонятного-то?

у тебя есть n элементов массива M.

первым циклом ищешь такое J, что M(J)<0.

а вторым циклом ищешь среди оставшихся M(J+1..N) максимальный отрицательный.

anonymous
Genie
хмм. что ж тут непонятного-то?

у тебя есть n элементов массива M.

первым циклом ищешь такое J, что M(J)<0.

а вторым циклом ищешь среди оставшихся M(J+1..N) максимальный отрицательный.

Первый цикл не вызывает проблем:

Do i=1,12,1

If(M(i)<0) n=i; Exit

EndDo

Но вот второй…:

Do i=n+1,12,1

???

EndDo

Здесь че то ступор наступает, ничего придумать не могу…

Туда так и хочется вставить:

if (M(i)<0) then

if (M(i)>M(n)) n=i

endif

Но тогда зачем организовывать первый цикл, ведь этот все выполнит и сам?

Может я мыслю не так, что можешь предложить сюда вставить?

Genie

ну и вставляй

я так понимаю, что от тебя просто требуется уметь разбивать задачу на части

и уметь алгоритмизировать оные.

Но тогда зачем организовывать первый цикл, ведь этот все выполнит и сам?

а это хороший вопрос преподавателю. :D

правда, ничего более путного, чем: «Я сказал делай, вот и делай!», ты врядли получишь :)

anonymous

Ну раз даже гении не могут ничего лучше предложить, придется с преподом на эту тему спорить, доказывая, что и с одним циклом неплохо жить… :)

Genie

и не в том дело, что можно обойтись одним циклом.

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

что от тебя и требует преподаватель.

а что эффективнее — это уже твоя собственная инициатива ;)

а она, как известно, бывает наказуема, чрезмерная-то :)

anonymous

Значит предлагаешь сделать то, что раньше предлагал

Genie
ну и вставляй

я так понимаю, что от тебя просто требуется уметь разбивать задачу на части

и уметь алгоритмизировать оные.

а это хороший вопрос преподавателю. :D

правда, ничего более путного, чем: «Я сказал делай, вот и делай!», ты врядли получишь :)

Прямо так и принести? Меня просто немного коробит, когда в программе есть лишние действия, но если посмотреть на это так как ты смотришь, то возможно действительно лучше принести ему 2 цикла…

Спасибо за просветительскую деятельность…

У меня скоро еще возникнут вопросы с двумерными массивами, если самому не удастся разобраться (там с вводом из файла проблемы)…

Genie
Прямо так и принести?

принести так, как сказано в задании… ;)

а то ссылка на меня быдет выглядеть несколько нелепо. так ведь?

Меня просто немного коробит, когда в программе есть лишние действия, но если посмотреть на это так как ты смотришь, то возможно действительно лучше принести ему 2 цикла…

избыточность кода не всего является ненужной.

есть такое понятие, к примеру, как «избыточное кодирование». правда, применяется оно в процессах хранения/передачи данных, но — вещь полезная.

если парой (десятков) строк кода достигается более лёгкая читаемость, и, как следствие, лёгкость изменения — то это уже не является таким уж и избыточным.

anonymous

Сходил называется :(

Там первый цикл вообще такой должен был быть:

Do i=1,12,1

If (M(i)<0) Exit

EndDo

8(

Но сейчас уже из этого всего вылилась другая проблема:

нужно нарисовать блок схему конструкции цикла:

DO i=начало, конец, шаг

операторы

EndDo

Развилось это из вопроса, а что делает EndDo?

Ну он увеличивает i на шаг, перенаправляет опять на Do.

А что-то должно быть еще…

Как ни странно, нигде не смог найти этой самой блок-схемы, в которой бы подробно рассматривалась работа цикла DO

Может поможете? ;)

anonymous

А я уже и сам справился :)

ecobeingecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.