Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы программирования на FORTRAN (ФОРТРАН)

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329

Открыть новую тему     Написать ответ в эту тему

akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Обсуждаются все вопросы, связанные с программированием на ФОРТРАН, как общего так и конкретного характера.
Постарайтесь дать как можно больше информации о возникшей проблеме -- это в конце концов в ваших же интересах чтобы вам помогли...

прежде чем просить помощи в задании
платное решение задач

ресурсы этого топика
ссылка на подборку ресурсов, собранных посетителями этого форума
 
то, чем мы решили поделиться
ссылка на страничку программ etc собственного изготовления, которыми любезно делятся наши форумчане


если вам вдруг не отвечают или ответ вас не устраивает
и вообще полезно прочитать всем спрашивающим
 
просьба к пишущим и отвечающим все большие листинги оформлять тегом more
и отключать графические смайлики при размещении фортран-кода

Всего записей: 24056 | Зарегистр. 06-12-2002 | Отправлено: 18:11 14-01-2007 | Исправлено: akaGM, 09:47 01-03-2020
Andrew10

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
KChernov

Цитата:
Конечно 77 фортраном тут точно не пахнет  

Код писался когда про 77-й в обсуждении еще не было речи.
 

Цитата:
Навскидку: уж в таком навороченном варианте использовать статические массивы точно моветон

Это, на самом деле, на любителя
 

Цитата:
И пример с выводом наглядно показывает, насколько проблематично в фортране организовать читабельный вывод - приходится всё форматировать вручную с точностью до позиции каждого символа

Здесь полностью согласен
 

Всего записей: 780 | Зарегистр. 26-02-2005 | Отправлено: 23:49 26-11-2010
KChernov



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Andrew10

Цитата:
Это, на самом деле, на любителя  

Да неужели?
Ну то, что в первых 10000 чисел простых 1200 - это я верю (ломы проверять).
Но вот что делать, если n > 10000?
Править программу и перекомпилировать (ища при этом новое значение npmax)
С динамическими массивами такой проблемы нет, разве что желательна оценка доли простых чисел (думаю она есть).
Кстати откуда уверенность, что результат уложится в 128 символов (при больших n точно не уложится)?
 
А если n << 10000 - получаем серьёзный перерасход памяти.
 

Цитата:
Мой код, конечно не оптимальный, но уж что получилось  

Ну раз уж начинать оптимизировать (а Решето - оптимизация), то по крайней мере оптимизировать то, что "на поверхности":
Зачем программе знать все простые числа, не превышающие n, если ей достаточно знать лишь все простые числа, не превышающие корень из n ?
Если только для того, чтобы убедиться, является ли n простым - уж это элементарно проверяется по пустоте массива powers после
Цитата:
Подсчет степеней простых чисел, являющихся делителями n
.

Всего записей: 2471 | Зарегистр. 20-04-2004 | Отправлено: 08:43 27-11-2010 | Исправлено: KChernov, 08:51 27-11-2010
Andrew10

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
KChernov
Я сам могу указать несколько мест в программе, где можно пооптимизировать. Например, массив prime вовсе не нужен, информация о простых числах хранится в номерах элементов массива tmp, которые .true. И так далее
 
Меня не требуется убеждать в том, что динамически распределяемые массивы - это хорошо, просто эта программа была написана в качестве отдыха от основной муторной деятельности по написанию отчета под влиянием вопроса в топике. Разлагать произвольные числа на множители я, например, с ее помощью не собирался. Поэтому сначала вопрос, работает ли сам алгоритм, а оптимизация - это дело второе. Хотя и увлекательное.
 

Цитата:
разве что желательна оценка доли простых чисел (думаю она есть).  

 
Оценка Эйлера NPrime(N)~ N/Ln(N).  
 

Цитата:
Зачем программе знать все простые числа, не превышающие n, если ей достаточно знать лишь все простые числа, не превышающие корень из n ?  

Оно конечно так, но тогда нужно предусмотреть обработку случая, когда после деления на все такие простые множители получается не единица. Например n=34=2*17. В результате программа станет чуть-чуть посложнее.  Что лучше - простой, но не оптимальный алгоритм или оптимальный, но менее понятный? Еще раз - дело вкуса
Особенно в процессе обучения.

Всего записей: 780 | Зарегистр. 26-02-2005 | Отправлено: 10:17 27-11-2010
XPEHOMETP

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
galina23

Цитата:
а в фортране 77 есть функция while я как знаю нету

Тут уже ответили и KChernov, и akaGM... Действительно, сильно зависит от конкретного компилятора. B g77, насколько помню, эта фишка была. Но я сейчас им не пользуюсь, снес вместе с документацией, а в сети теперь этой инфы не найти. По всем ссылкам говорят прямым текстом: а не лучше ли Вам посмотреть на g95? Ну, в конце концов, KChernov абсолютно прав. В языке BASIC некогда вообще не было оператора цикла (пока дядюшка Билл Гейтс не довел этот язык программирования до ума), и всем приходилось конструировать цикл из подручных операторов. Примерно так, как показал KChernov. Оно несколько напрягает, зато условие выхода из цикла можно сделать абсолютно любым, даже таким, которое в число стандартных вариантов не входит!  

Всего записей: 2485 | Зарегистр. 21-06-2005 | Отправлено: 12:47 27-11-2010 | Исправлено: XPEHOMETP, 12:53 27-11-2010
KChernov



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Andrew10

Цитата:
Например, массив prime вовсе не нужен, информация о простых числах хранится в номерах элементов массива tmp, которые .true.  

Ну вот не факт, что это оптимизация.
Ибо перебрать все числа и все простые числа - всё-таки второе должно быть быстрее.
 
XPEHOMETP

Цитата:
а в сети теперь этой инфы не найти

Вот вроде бы 77-й стандарт - там нет while.
Хотя в самом стандарте явный текст, что это именно 77-й не нашёл.

Всего записей: 2471 | Зарегистр. 20-04-2004 | Отправлено: 00:29 29-11-2010
XPEHOMETP

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Да вроде собственно в стандарте-то и нету, но в отдельных реализациях FORTRAN -77 оператор while добавлен сверх стандарта. Особенно запутанная ситуация с g77: некоторые функции, требуемые стандартом, в нем так и не были реализованы, и вместе с тем были добавлены расширения вроде Implicit None. Я, благодаря тому, что долго на g77 сидел, прямо-таки уверен был одно время, что Implicit None входит в стандарт F-77. Но пришлось убедиться в обратном... И другие расширения там были, кажись, оператор while среди них.

Всего записей: 2485 | Зарегистр. 21-06-2005 | Отправлено: 12:49 29-11-2010
bubanoid



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Всем доброго времени суток.
 
Есть  
 
1) программа в ней переменная n.
Программа использует модуль и процедуру из него: subra1(x). Переменная n передаётся через common блок.  
 
2) В subra1(x) переменная n изменяется и, естественно, после вызова subra1(x) из главной программы переменная n меняет своё значений, чего хотелось бы избежать. Подскажите пожалуйста способ.  
 
PS
Конечно, можно руками в коде снова присвоить первоначальное значение n после вызова  subra1(x), но это будет конкретный костыль. Передавать n как один из аргументов процедуры и устанавливать intent(in), в силу особенностей программы - нельзя.

Всего записей: 101 | Зарегистр. 22-11-2007 | Отправлено: 18:46 01-12-2010 | Исправлено: bubanoid, 18:47 01-12-2010
Andrew10

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
bubanoid
 
вроде бы решение очевидное:
В в начале подпрограммы subra1 присвоить локальной переменной значение n и работать с этой локальной переменной.
 
либо я не понимаю вопроса

Всего записей: 780 | Зарегистр. 26-02-2005 | Отправлено: 18:54 01-12-2010
terminat0r



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
bubanoid

Цитата:
Конечно, можно руками в коде снова присвоить первоначальное значение n после вызова  subra1(x), но это будет конкретный костыль. Передавать n как один из аргументов процедуры и устанавливать intent(in), в силу особенностей программы - нельзя.

Хм, что то у вас с основами не так. Если есть модуль, зачем там еще коммонблоки? Абсолютно непонятно что где и сколько переменных n у вас есть там. Давайте код в студию

Всего записей: 2084 | Зарегистр. 31-03-2002 | Отправлено: 19:19 01-12-2010
bubanoid



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Andrew10
Вообще-то я так и делаю. Неужели нельзя обойтись без этого "лишнего" присвоения?
 
terminat0r

Цитата:
Хм, что то у вас с основами не так.  

Определённо не так. Я освоил определённый набор команд и приёмов в принципе достаточный для создания простых программ. Уверен, что весь мой код можно переписать гораздо компактнее и красивее.

Цитата:
Если есть модуль, зачем там еще коммонблоки? Абсолютно непонятно что где и сколько переменных n у вас есть там. Давайте код в студию

Хм... Мне без коммонблоков в моём модуле не удаётся обойтись. Та "n" о которой я упоминаю - это одна и та же переменная.  
Код покажу завтра. Надо почистить его от всего лишнего.
 

Всего записей: 101 | Зарегистр. 22-11-2007 | Отправлено: 01:53 02-12-2010
TeXpert



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
bubanoid
Цитата:
Вообще-то я так и делаю. Неужели нельзя обойтись без этого "лишнего" присвоения?
Невозможно и капиталец приобрести, и невинность соблюсти. Если это непонятно, то действительно с основами не так
Цитата:
Мне без коммонблоков в моём модуле не удаётся обойтись
Так модуль --- это, грубо говоря, COMMON-блок (только изящнее, не надо лишний раз дублировать да и править легче в случае чего) плюс дополнительная функциональность, как нельзя обойтись?
Цитата:
Та "n" о которой я упоминаю - это одна и та же переменная
И что? Модуль такое не запрещает

----------
Майкудук, Пришахтинск не предлагать!:)
А на Пирогова приходит снова весенний гомон...

Всего записей: 3604 | Зарегистр. 08-02-2003 | Отправлено: 10:41 02-12-2010
Andrew10

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
bubanoid

Цитата:
Andrew10
Вообще-то я так и делаю. Неужели нельзя обойтись без этого "лишнего" присвоения?  

 
Если пользуетесь COMMON-блоками или модулями для передачи параметров в подпрограмму, то не обойтись. Никакой "кривости", имхо, в этом нет. Более того, если бы Вы передавали переменную в подпрограмму через формальные и фактические параметры, то все равно это пришлось бы делать, так как по умолчанию в Фортране передача параметров происходит по ссылке. Хотя в этом случае можно, конечно, написать интерфейс для подпрограммы, где определить передачу параметра по значению, но стоит ли это делать в подобном случае? Проще написать одну строчку присваивания.

Всего записей: 780 | Зарегистр. 26-02-2005 | Отправлено: 10:45 02-12-2010 | Исправлено: Andrew10, 10:59 02-12-2010
KChernov



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
bubanoid

Цитата:
В subra1(x) переменная n изменяется и, естественно, после вызова subra1(x) из главной программы переменная n меняет своё значений, чего хотелось бы избежать.

Так зачем в подпрограмме изменяется значение, если оно меняться не должно?
Видимо вы одну и ту же переменную используете для 2 разных вещей: и как входной неизменяемый параметр, и как внутреннюю переменную.
В такой ситуации, как тут уже писали, надо вместо 1 переменной использовать 2 - на каждую роль по переменной.
Если же переменная меняется несанкционированно - надо искать ошибку.
А вообще современные средства Фортрана позволяют указывать возможность изменения переменных.
А мб это у вас вообще константа?

Всего записей: 2471 | Зарегистр. 20-04-2004 | Отправлено: 13:09 02-12-2010
plazmon



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Внесу своих 5 копеек.
Я думаю, что bubanoid путает понятие фортрановского модуля и единицы компиляции (которую часто называют тоже модулем)
Ну и как уже сказали, товарищ пытается 1 переменной выполнить 2 роли.

Всего записей: 107 | Зарегистр. 29-05-2007 | Отправлено: 15:54 02-12-2010 | Исправлено: plazmon, 16:37 02-12-2010
bubanoid



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Программа и модуль
 
Добавлено:
Пояснение есть в коде.
 

Цитата:
Я думаю, что bubanoid путает понятие фортрановского модуля и единицы компиляции (которую часто называют тоже модулем)

Очень даже может быть. Он эти два понятия не различает.

Всего записей: 101 | Зарегистр. 22-11-2007 | Отправлено: 19:55 02-12-2010
Andrew10

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
bubanoid
Вопросы:
1) Правильно ли я понимаю, что речь идет о переменной nf?
2) Если да, то где используется значение, которое присваивается этой переменной в подпрограмме Pho_subra в результате вызова функции func?
3) Из кода это не видно, но я подозреваю, что вычисленная величина необходима в функции Pho_my. Так ли это?

Всего записей: 780 | Зарегистр. 26-02-2005 | Отправлено: 20:39 02-12-2010
plazmon



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
bubanoid
Нет не путает. Но почему бы не сделать так?

Код:
 
module Rho  
implicit none  
integer n, nf
contains  
 
real(8) function Rho_my(xi)  
    implicit none  
    real(8), intent(in) :: xi  
    ...  
end function Rho_my      
 
subroutine Rho_subra(f,z)  
    implicit none  
    real(8) f,z  
    external f  
     
    nf=func(n)  
    z=f(0.0d0)  
     
    contains  
    integer function func(n)  
       ...  
    end function      
end subroutine Rho_subra      
end module Rho  
end
 

Без всяких комманов?

Всего записей: 107 | Зарегистр. 29-05-2007 | Отправлено: 20:45 02-12-2010
bubanoid



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Andrew10

Цитата:
1) Правильно ли я понимаю, что речь идет о переменной nf?
Да

Цитата:
2,3) Из кода это не видно, но я подозреваю, что вычисленная величина необходима в функции Pho_my. Так ли это?
Именно так.
 
plazmon
Вы вынесли integer n, nf вверх. Не совсем понимаю, что это даёт. Сейчас попробую разобраться.
 

Всего записей: 101 | Зарегистр. 22-11-2007 | Отправлено: 20:58 02-12-2010 | Исправлено: bubanoid, 21:00 02-12-2010
plazmon



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Это помещает эти переменные в модуль. И все программы ( и подпрограммы) которые включают этот модуль имеют свободный доступ к этим переменным

Всего записей: 107 | Зарегистр. 29-05-2007 | Отправлено: 21:09 02-12-2010
bubanoid



Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
plazmon
Это не совсем то, что мне надо.  
 
Ну да ладно. Буду делать именно так, декларируя nf наверху модуля и при этом буду контролировать её изменение. Спасибо.

Всего записей: 101 | Зарегистр. 22-11-2007 | Отправлено: 21:57 02-12-2010
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы программирования на FORTRAN (ФОРТРАН)


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru