Просьба помочь: нужно было написать программу на фортране
используя обычные средства и рядом для проверки используя новые возможности 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 )
Может кто сможет помочь ее исправить, а то я уже замучился…
Последние комментарии
- OlegL, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
так ’sum’ — это что? переменная, или всё же функция?
Sum — это оператор из новых возможностей фортран90
Хотя наводит на мысль о смене имени переменной sum. Вроде так нельзя…
так что же именно нельзя?
по мне, так второй вариант, если нет показаний из документации по языку, представляется куда как более вероятным, чем первый ;)))
Конечно же нельзя делать второй вариант :). Просто я с оператором Sum впервые столкнулся, а без него в программе и перемененная sum работала…
Исправил и все заработало!!!
Огромнейшее тебе спасибо!!!
А то я двое суток над этой проблемой мучался…
Мой преподаватель прямо лютует!!!
Показал я ему эту прогу, все идеально!
А потом берет и говорит: а теперь переделай мне эту программу так, чтобы выводился наибольший элемент среди отрицательных элементов…
Ну я умудреный опытом вставляю в программу строчку:
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 цикла, следующих друг за другом… Первый цикл находит первый отрицательный элемент, второй цикл находит максимальный элемент среди последующих отрицательных элементов…
Но как это организовать, ума не приложу…
Может поможете, а?
хмм. что ж тут непонятного-то?
у тебя есть 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
Но тогда зачем организовывать первый цикл, ведь этот все выполнит и сам?
Может я мыслю не так, что можешь предложить сюда вставить?
ну и вставляй
я так понимаю, что от тебя просто требуется уметь разбивать задачу на части
и уметь алгоритмизировать оные.
а это хороший вопрос преподавателю. :D
правда, ничего более путного, чем: «Я сказал делай, вот и делай!», ты врядли получишь :)
Ну раз даже гении не могут ничего лучше предложить, придется с преподом на эту тему спорить, доказывая, что и с одним циклом неплохо жить… :)
и не в том дело, что можно обойтись одним циклом.
от тебя требуется что? что при возникновении необходимости в том, сможешь разбить на циклы по смыслу.
что от тебя и требует преподаватель.
а что эффективнее — это уже твоя собственная инициатива ;)
а она, как известно, бывает наказуема, чрезмерная-то :)
Значит предлагаешь сделать то, что раньше предлагал
Прямо так и принести? Меня просто немного коробит, когда в программе есть лишние действия, но если посмотреть на это так как ты смотришь, то возможно действительно лучше принести ему 2 цикла…
Спасибо за просветительскую деятельность…
У меня скоро еще возникнут вопросы с двумерными массивами, если самому не удастся разобраться (там с вводом из файла проблемы)…
принести так, как сказано в задании… ;)
а то ссылка на меня быдет выглядеть несколько нелепо. так ведь?
избыточность кода не всего является ненужной.
есть такое понятие, к примеру, как «избыточное кодирование». правда, применяется оно в процессах хранения/передачи данных, но — вещь полезная.
если парой (десятков) строк кода достигается более лёгкая читаемость, и, как следствие, лёгкость изменения — то это уже не является таким уж и избыточным.
Сходил называется :(
Там первый цикл вообще такой должен был быть:
Do i=1,12,1
If (M(i)<0) Exit
EndDo
8(
Но сейчас уже из этого всего вылилась другая проблема:
нужно нарисовать блок схему конструкции цикла:
DO i=начало, конец, шаг
операторы
EndDo
Развилось это из вопроса, а что делает EndDo?
Ну он увеличивает i на шаг, перенаправляет опять на Do.
А что-то должно быть еще…
Как ни странно, нигде не смог найти этой самой блок-схемы, в которой бы подробно рассматривалась работа цикла DO
Может поможете? ;)
А я уже и сам справился :)