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

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в 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 330

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

akaGM

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

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

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


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

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



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Что делает вот этот блок?
 
         READ(1,*) A
      READ(1,*) (ar(k),k=A,1,-1)
      READ(1,*) B
      READ(1,*) (ar2(k), k=B,1,-1)  
 
Или иначе спрошу - как выглядит инпут.тхт внутри?

Всего записей: 652 | Зарегистр. 05-12-2003 | Отправлено: 19:24 06-10-2007
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DeadVillage
читает число А
потом читает A элементов в аr()
читает число B
потом читает B элементов в аr2()
 
Aspirine22
твою последнюю строчку следует написать вот так:
 WRITE(2,*) (ar3(k), k=N,1,-1)
или вот так:
 WRITE(2,10) (ar3(k), k=N,1,-1)
10 format (I3)
 
+
 
файлы после использования неплохо бы закрывать:
в конце
  close(1)
  close(2)

Всего записей: 24112 | Зарегистр. 06-12-2002 | Отправлено: 20:13 06-10-2007 | Исправлено: akaGM, 20:18 06-10-2007
XPEHOMETP

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Aspirine22
Почему не работает? Для начала - мелкие придирки: маленькие идентификаторы для ввода-вывода в Фортране зарезервированы (вроде бы до 10), поэтому 1 и 2 лучше не использовать, а написать, к примеру,  
 
OPEN(12,FILE='output.txt')
 
- и т.п.  
 
INTEGER A,B,C ar(300), ar2(800), ar3(800),k,N - после С нет запятой (компилятор может расценить как объявление массива Car(300) ) - но это мелочи.
 
Основная проблема в чем? В файл записывается длинное-длинное число, например,
 
48547658930398575859430033837672950095458567653038436
 
И второе такое же. Вся соль в том, что прочитать его как целое нельзя - не влезет в память, отводимую на целые числа. И прочитать его как массив целых значений, в каждом из которых по одной циферке (а именно на это рассчитана программа), тоже не получится: между циферками нет никаких знаков, показывающих, что ввод окончен, число будет впихиваться в одно целое значение до тех пор, пока не произойдет переполнение. Как выйти из ситуации? Типичный паскалевый способ: объявить строковую переменную и загнать в нее это число. На Фортране90 примерно так:
 
character*(*) chislo1
......
Read (11,*) chislo1
 
Это то, что я предлагал. Потом определяем реальную длину строки, и в цикле перебираем символы с конца, переводя их в целое, затем суммируем с тем, что есть из второго числа.
 
Однако, предложенный тобой способ - читать в массив целых чисел - более "фортранистый", на самом деле. Чтобы он работал, надо поправить программку:
 
1. Сказать программе, что надо читать по одному знаку на каждый элемент массива - это нужно задать через FORMAT, свободное чтение (через *) здесь не катит;
 
2. Мы не знаем, сколько знаков в нашем числе; задан предел в 300 знаков (судя по размерности массива), а их может быть 40. Поэтому в программе делается финт ушами: в файл исходных данных в явном виде пишется количество разрядов в числах (переменные А и В), и от этого везде исходится. Это сильно упрощает задачу, но, наверно, лучше было бы без подсказки обойтись. Но как первое приближение очень удобно.
 
3. ar3(K)=ar3(k)+ar(k)+ar2(k) - строго говоря, для такой записи нужно сначала (перед циклом) обнулить весь массив ar3 (в Фортране90 просто ar3 =0, в Ф77 придется цикл писать)
 
Да, и как написать формат? Значит, идентификаторы файлов мы повысим на 10, и тогда будет как-то так:
 
        OPEN(11,FILE='input.txt')  
        READ(11,*) A  
      READ(11,1) (ar(k),k=A,1,-1)  
      READ(11,*) B  
      READ(11,1) (ar2(k), k=B,1,-1)
1    FORMAT(I1)   ! - в смысле буковка i и единица - целое из одного символа
 
Вроде тогда заработает

Всего записей: 2485 | Зарегистр. 21-06-2005 | Отправлено: 00:37 07-10-2007
akaGM

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

Цитата:
character*(*) chislo1

такая фигня доступна только в сабах, как не крути, а длину в головной надо указывать явно...
 

Цитата:
маленькие идентификаторы для ввода-вывода в Фортране зарезервированы (вроде бы до 10)

Насколько я помню, безболезненно можно начинать с 7
вообще лучше так (тогда явно видно откуда читается и куда пишется):

Код:
 
  integer FPin, FPout
  parameter (FPin=100)
  parameter (FPout=101)
...
  open(FPin, 'input.txt')
  open(FPout, 'output.txt')
 

Всего записей: 24112 | Зарегистр. 06-12-2002 | Отправлено: 13:44 07-10-2007 | Исправлено: akaGM, 16:53 07-10-2007
DeadVillage



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

Цитата:
OPEN(11,FILE='input.txt')  
      READ(11,*) A  
      READ(11,1) (ar(k),k=A,1,-1)  
      READ(11,*) B  
      READ(11,1) (ar2(k), k=B,1,-1)
1    FORMAT(I1)   ! - в смысле буковка i и единица - целое из одного символа
 
Вроде тогда заработает

 
... не заработает. При таком раскладе прога добежит до конца файла ещё при чтении первого слогаемого.
 
Не совсем понятно для чего ar(k),k=A,1,-1? Запись числа задом наперёд?
 
Не совсем понятно для чего А и В, если сказано, что слогаемые одинаковой длины?
 
Может лучше считывать число как символьную строку и потом перегнать в числовые массивы и их уже суммировать поэлементно? (кажется такое уже упоминалось выше)
 
        character*300 string1, string2
        ................
        ar(1)=0
        ar2(1)=0
        do k=1, A-1
          ar(k+1) = ichar(string1(k:k))-48
          ar2(k+1) = ichar(string2(k:k))-48
        end do

Всего записей: 652 | Зарегистр. 05-12-2003 | Отправлено: 22:34 07-10-2007 | Исправлено: DeadVillage, 22:47 07-10-2007
akaGM

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

Цитата:
Не совсем понятно для чего ar(k),k=A,1,-1? Запись числа задом наперёд?  

 
число 1234
считываем посимвольно 1234, а размещаем в массиве как 4321 -- старшая цифра на старшем адресе, вроде верно...
 

Цитата:
k=A,1,-1

нисходящий цикл от А до 1 с шагом 1
это на всякий случай, если вдруг кто не знает...

Всего записей: 24112 | Зарегистр. 06-12-2002 | Отправлено: 23:29 07-10-2007
XPEHOMETP

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DeadVillage
Да, я потом понял - фигню посоветовал! Поскольку попытка чтения с фиксированным форматом числа, в этот формат не попадающего, дает ошибку ввода. Значит, читаем как строку, перегоняем в массив. Значит, строку берем фиксированной длины (спасибо akaGM, напомнил), той же, что и верхний индекс массива. Не помню я, есть в Фортране ограничения на длину строки (256 символов) или нет, рыться в книжках некогда. Поскольку число вроде до 100 знаков, то 250 символов и элементов массива хватит за глаза. На результат даем 251 символ: при сложении может появиться новый разряд. Подсказка на количество знаков уже не потребуется: числа А и В не задаем в исходном файле, но они нужны для расчетов.  
 
Распихивание строк в массивы - поразрядная запись чисел в массив в обратном порядке, не с головы, а с хвоста. Тогда складываем все нормально как в столбик. И выводим на печать тоже в виде строки.
 
Lab_F1  #1152  
      ! Mashkov K.V.  
      ! 1102  
      !      
   
      Program Prim1  
      Implicit NONE  
 
        INTEGER A,B,C, ar(250), ar2(250), ar3(251), k,j,N, m  
        CHARACTER chislo1*250, chislo2*250, rezultat*250
 
        OPEN(12,FILE='output.txt')  
      WRITE(12,*) '#1152'        ! пример вывода текста на экран  
      WRITE(12,*) 'Mashkov K.V.'      
      WRITE(12,*) '1102'      
      WRITE(12,*)      
      WRITE(12,*)      
 
 
        OPEN(11,FILE='input.txt')  
      READ(11,*) chislo1
        A = LENGTH(chislo1)  ! Смотрим длину строки - функция описана ниже
      READ(11,*) chislo2  
        B = LENGTH(chislo1)  
       
      N = max(A,B)
 
     ar = 0  
     ar2 = 0  
     ar3 = 0   ! Для полной уверенности сначала обнулим массивы
 
! Пихаем строки в массивы с проверкой на то,
! не зашли ли за конец строки (одна может быть короче)
 
     do K = 1,N          
        j = A - K + 1    ! Это К-тый знак числа с конца
        if (j>0) then  
         read (chislo1(K:K),'(I1)') ar(j)
        end if
        j = B - K + 1
        if (j<=0) then cycle  
         read (chislo2(K:K),'(I1)') ar2(j)
     end do
 
     Do K=1,N  
        m = ar3(k)+ar(k)+ar2(k)   ! Безопасней взять временную переменную
        If(m>9) Then  
          ar3(k+1)=1+ar3(k+1)  
          m=m-10  
        End If  
        ar3(k) = m
       End DO  
 
        C=N   !  Число знаков в результате - лучше уж по аналогии с А и В
     If (ar3(k+1)>0) Then  
        C=N+1  
     End If
 
! Формируем строку результата для вывода на печать:
 
      do K = 1,C          
        j = С - K + 1
         write (rezultat(K:K),'(I1)') ar3(j)
     end do
 
       WRITE(12,*) C  
       WRITE(12,*) rezultat
       close(11)  
       close(12)  
       
    END  
                           
---------------------------------------------------------
 
      INTEGER FUNCTION LENGTH(STRING)  
      ! Returns length of string ignoring trailing blanks
      ! Взято из книги: Clive G. Page, Professional Programmer's Guide to Fortran77
      ! Слегка подправлено под Fortran90
 
      CHARACTER*(*) STRING
      INTEGER J  
      DO J = LEN(STRING), 1, -1  
         IF(STRING(J:J) .NE. ' ') EXIT  
      END DO
 
      LENGTH = J  
      END

Всего записей: 2485 | Зарегистр. 21-06-2005 | Отправлено: 00:04 08-10-2007 | Исправлено: XPEHOMETP, 13:08 09-10-2007
DeadVillage



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
XPEHOMETP
 
Я понял, что порядок обратный. Только не сразу понял зачем. А потом вспомнил как когда-то на лабе считал факториал - тоже результат заполнял в массив в прямом порядке, а распечатывал "с хвоста".
 
Наверное в твоём коде в
ar(j) = ichar(chislo1(K:K))
и в
ar1(j) = ichar(chislo2(K:K))  
нужно таки отнять 48.
 
Зануление массивов так коротко не всюду попрёт. Цикл нужен чтобы наверняка.

Всего записей: 652 | Зарегистр. 05-12-2003 | Отправлено: 05:45 08-10-2007 | Исправлено: DeadVillage, 05:57 08-10-2007
XPEHOMETP

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
48 отнимать не нужно, преобразование из ACSII-кода в число сделает функция ichar. А массивы обнулить таким способом в Фортране90 вполне нормально.

Всего записей: 2485 | Зарегистр. 21-06-2005 | Отправлено: 06:47 08-10-2007
DeadVillage



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Результатом ichar('0') будет 48 ( ascii  код символа '0' ).
Результатом char(48) будет сомвол '0'.
 
Никто не упомянул для какого Ф прога пишется, потому и говорю, что такое обнуление:
  ar = 0
не везде попрёт, как и такая печать:
  WRITE(12,*) rezultat

Всего записей: 652 | Зарегистр. 05-12-2003 | Отправлено: 09:26 08-10-2007 | Исправлено: DeadVillage, 09:26 08-10-2007
XPEHOMETP

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DeadVillage
Да, был неправ с ichar, спутал с Васиком! Поправил в программке.
 
Прога по всем признакам под Фортран90, поскольку Implicit NONE и конструкция do ... end do в стандарт Фортрана77 не входят. Также как знаки <,> в операторах сравнения.
 
Печать со свободным форматом вывода - конечно, не очень хорошо, особенно если это распечатывается, а не пишется в файл, но длины чисел мы не знаем, так что...

Всего записей: 2485 | Зарегистр. 21-06-2005 | Отправлено: 10:59 08-10-2007
DeadVillage



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Договорившись, что файл входных данных имеет вид типа:
<длина первого слагаемого>
<первое слагаемое>
<длина второго слагаемого>
<второе слагаемое>
и считая, что слагаемые могут быть разной длины, я настрадал следующее:

Код:
 
        program prim4
 
        integer  len1,len2,length, StringLength
        character*301 str1, str2, answer
 
! открываем файл и читаем данные
        open(unit=10, file='input.txt', err=1)
        read(unit=10, fmt=*, end=2, err=2) len1, str1, len2, str2
        close(unit=10, status='keep')
 
! на случай, если указанные в файле длины слагаемые оказались, намеренно или случайно, разными
        if(len1.ne.len2) then
          len1 = StringLength(str1)
          len2 = StringLength(str2)
        end if
        length = max(len1,len2) + 1
 
! вызываем подпрограмму суммирования
        call Plus(length, str1, str2, answer)
 
! вывод ответа в файл        
        open(unit=20, file='output.txt', err=4)
        do i=1,length
          write(unit=20, fmt='(A,$)', err=5) answer(i:i)
        end do
        close(unit=20, status='keep'); stop 'Done!'
 
! печать разных сообщений на случай, если что-то при работе с файлом пошло не так
! с последующей остановкой программы        
1       write(unit=*,fmt='(A)') 'Cannot open input file'; stop
2       write(unit=*,fmt='(A)') 'Not enough data in input file'; stop
3       write(unit=*,fmt='(A)') 'Cannot read from input file'; stop
4       write(unit=*,fmt='(A)') 'Cannot open output file'; stop
5       write(unit=*,fmt='(A)') 'Cannot write in output file'; stop
 
        end
         
        subroutine Plus(length, str1, str2, answer)
        integer length,i , k, shift
        integer num1(length), num2(length), num3(length)
        character str1, str2, answer
 
! раскидываем символьные переменные по числовым массивам
        num1(1)=0
        num2(1)=0
        do i=length,2,-1
          k = i-1
          num1(i) = ichar(str1(k:k))-48
          num2(i) = ichar(str2(k:k))-48
        end do
 
! выполняем суммирование        
        shift = 0
        do i = length,1,-1
          num3(i) = num1(i) + num2(i) + shift
          if(num3(i).ge.10) then
            num3(i) = mod(num3(i),10)
            shift = 1
          else
            shift = 0
          end if
        end do
 
! переносим значения численного массива в символьную переменную
        do i=1,length
          answer(i:i) = char(num3(i)+48)
        end do
        end
 
! возвращает длину символьной переменной до первого пробела
        integer function StringLength(string)        
        character*(*) string
        integer i
          StringLength = 0
          do i=1,250
            if(string(i:i).eq.' ') exit
              StringLength = StringLength + 1
          end do
        end
 

Всего записей: 652 | Зарегистр. 05-12-2003 | Отправлено: 11:34 08-10-2007 | Исправлено: DeadVillage, 21:11 08-10-2007
KChernov



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

Цитата:
Но ведь удобство то осталось.

В чем удобство-то?
Разве что в привычности.
 
Не люблю себя ограничивать, поэтому мне не нравится фиксированный формат.
 

Цитата:
В современном Фортране одно и тоже действие можно осуществлять разными операторами, но меня в детстве учили, что чем примитивнее набор операторов, тем эффетивней работает программа. Поэтому я пользуюсь GO TO и  CONTINUE вместо DO и While. Все словеса разработчиков трансляторов о том, что они за меня оптимизируют мой код - фуфло!

Я не работаю с системами реального времени, поэтому мне оптимизации компиляторов хватает (10-20% не считаю критичным, в крайнем случае можно оптимизировать самый критичный код).
Я не использую старые системы форматирования и устаревшие операторы по нескольким причинам:
1. Я пишу не только на Фортране и стараюсь, чтобы структура кода была похожа для разных языков - мне так проще контролировать код. Зачем загружать мозг принципиально разными структурами, если это ничего не дает?
2. Мне "в детстве" говорили, что если как-то можно простым способом уменьшить шанс потенциальной ошибки, стоит это использовать. Старые форматы и операторы бывают в этом смысле хуже. Например фиксированный формат Фортрана плохо сочетается с форматированием кода отступами;
3. Я не люблю изобретать велосипед, когда их давно выпускают серийно, поэтому я предпочитаю, чтобы мне было доступно как можно больше фич, чтобы для решения конкретной задачи выбрать оптимальную (в том числе это относится и к ООП). Если это понижает эффективность выполнения не в разы, а на проценты - ну и ладно - производительность компов постоянно растет, а личное время на ручную оптимизацию выделять жалко - лучше я напишу больше
 

Цитата:
Вы можете мне объяснить, зачем для задач, для решения которых предназначен Фортран, нужно ООП?  

Встречный вопрос - как такое сделать без ООП?
Пример:
Написан код для решения определенной вычислительной задачи (например задача решения системы лин уравнений с матрицей специфической структуры - по сути это задача оптимизации).
Нужно расширить область применимости (например добавить еще один класс матриц - например если матрица - дискретизация задачи по разностной схеме при разном кол-ве измерений).
 
На Фортране без ООП это можно сделать 2мя способами:
1. Скопировать код, внести в него изменения и получить для каждого случая свою прогу.
Плюсы: можно все вусмерть заоптимизировать. Минусы: большое дублирование кода, что в случае нахождения ошибки приведет к необходимости править оба варианта, а еще надо будет убедиться, что эта ошибка общая или нет для обоих вариантов; если расширение области применимости будет делаться не один раз - сложность его поддержки будет расти неприятно быстро.
 
2. Во всех местах, где нужен новый код понаделать if-ов и запускать прогу с параметром.
Плюсы: нет лишнего дублирования кода. Минусы: оптимальность по времени будет страдать; при поддержке необходимо хорошо понимать, где (и какой) общий код, а где вариантный; if-ов может получиться много и читабельность снизиться.
 
С ООП все гораздо проще:
Общая часть - отдельно, варианты реализации - каждый отдельно, сшивается все компилятором.
Плюсы: минимум лишнего кода, хорошая читабельность и дальнейшая расширяемость. Минусы: работать должно не так быстро (но и не в разы медленнее).
 
Конечно в данном случае идеальный вариант - с привлечением шаблонов (которых в Фортране вроде так пока и не ввели - или я не прав?), но это тоже относится к ООП.
 
Где я прощитался?

Всего записей: 2471 | Зарегистр. 20-04-2004 | Отправлено: 14:07 08-10-2007
akaGM

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ООП на Ф в массы не пойдёт...
те кто явл. апологетом ООП сделают всё на Сях, а старые фортранщики на ООП не переберутся...
 
поэтому изучайте и используйте "золотой фонд":
NAG, IMSL, PORT и другие библиотеки...
как правило, всё давным давно сделано, важно грамотно адаптировать это наследие под свои нужды...
 
DeadVillage
+
close(10)
для порядка...

Всего записей: 24112 | Зарегистр. 06-12-2002 | Отправлено: 15:04 08-10-2007
KChernov



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
akaGM
Я про массы и не говорю.
 

Цитата:
те кто явл. апологетом ООП сделают всё на Сях, а старые фортранщики на ООП не переберутся...

Я не "старый фортранщик", но приходится работать с большими объемами существующиего фортрановского кода - все переписывать не вариант.
 

Цитата:
поэтому изучайте и используйте "золотой фонд":
NAG, IMSL, PORT и другие библиотеки...
как правило, всё давным давно сделано, важно грамотно адаптировать это наследие под свои нужды...

Это все конечно так, но:
1. Мы работаем над новыми численными методами (которые еще не реализованы в принципе);
2. Бывает, что написать самому быстрее, чем найти и разобраться.

Всего записей: 2471 | Зарегистр. 20-04-2004 | Отправлено: 15:42 08-10-2007
akaGM

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

Цитата:
Я про массы и не говорю.

а я говорю...
и говорю в том смысле, как пошёл С/С++ (сколько денег в него вбухали!)
и теперь любой "программист" может написать программу существенно круче "хелловорда", вообще ничего не понимая...
 

Цитата:
1. Мы работаем над новыми численными методами (которые еще не реализованы в принципе);

например?
а то я, боюсь, что запутался в формулировке...
новые алгоритмы, физ- мат-модели -- да, а вот численные методы, что там нового,
кроме как модификаций, да нестандарного использования?
хочешь сказать, что _методы_, не приведённые в учебниках?
 

Цитата:
2. Бывает, что написать самому быстрее, чем найти и разобраться.

быстрее да, эффективнее -- не всегда
как правило, библиотеки эти вылизаны, а интерфейсы всегда прозрачны...

Всего записей: 24112 | Зарегистр. 06-12-2002 | Отправлено: 16:04 08-10-2007
Aspirine22

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Ну ребят прям большой спасиб, вот теперь начинаю более, мение разбираться в нём.
А другого способа кроме как забивать в массив  в обратном порядке.

Всего записей: 4 | Зарегистр. 04-10-2007 | Отправлено: 23:46 08-10-2007
XPEHOMETP

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Aspirine22
Cтрого говоря, массивы там вообще не нужны. Можно обойтись четырьмя целыми переменными: в две считываются циферки из исходных чисел (хранящихся в строке), в третьей они суммируются, в четвертой хранится единичка для следующего сложения, если результат > 9. И сумма сразу пишется в конечную строку. Все организуется в один цикл.

Всего записей: 2485 | Зарегистр. 21-06-2005 | Отправлено: 07:07 09-10-2007
af103

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Имеется программа на Фортране 77 с использованием двойной точности. Используется implicit double precision (a-h,o-z). При вычислениях с использованием CVF6.1 и G77 получаются существенно разные результаты. Я подозреваю, что компиляторы присваивают данным разные типы. Как можно узнать какой тип присвоен той или иной переменной в действительности?

Всего записей: 13 | Зарегистр. 21-08-2007 | Отправлено: 12:48 09-10-2007
XPEHOMETP

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Aspirine22
Как-то примерно так (поправив еще глюки в предыдущей версии):
 
      Program Prim1  
      Implicit NONE  
   
        INTEGER A,B,C,N, ch1, ch2, ch3, des, k, j1, j2, j3  
        CHARACTER chislo1*250, chislo2*250, rezultat*250  
   
        OPEN(12,FILE='output.txt')  
      WRITE(12,*) '#1152'        ! пример вывода текста на экран  
      WRITE(12,*) 'Mashkov K.V.'      
      WRITE(12,*) '1102'      
      WRITE(12,*)        
      WRITE(12,*)      
   
   
        OPEN(11,FILE='input.txt')  
      READ(11,*) chislo1  
        A = LENGTH(chislo1)  ! Смотрим длину строки - функция описана ниже  
      READ(11,*) chislo2  
        B = LENGTH(chislo1)  
       
      N = max(A,B)  
      C = N + 1     ! на всякий случай определим длину результата по максимуму
      des = 0        ! еще не считали - в десятках должен быть ноль
 
! В одном цикле читаем с конца по знакам введенные числа с проверкой на то,  
! не зашли ли за конец строки (одна может быть короче), и с конца же  
! формируем строку результата
 
     do K = 1,C            
        j1 = A - K + 1    ! Это К-тая цифра 1-го числа с конца  
        if (j1>0) then  
         read (chislo1(j1:j1),'(I1)') ch1  
          else
         ch1 = 0
        end if  
        j2 = B - K + 1  
        if (j2>0) then    
         read (chislo2(j2:j2),'(I1)') ch2
          else
         ch2 = 0
        end if
              ch3 = ch1 + ch2 + des
              des = int(ch3/10)
                 if (ch3>9) then
                   ch3 = ch3 - 10
                 end if  
   
! Формируем строку результата для вывода на печать:  
         j3 =  C - K + 1
         write (rezultat(j3:j3),'(I1)') ch3  
     end do  
   
       WRITE(12,*) rezultat  
       close(11)
       close(12)  
         
    END    
                             
---------------------------------------------------------  
 
      INTEGER FUNCTION LENGTH(STRING)  
      ! Returns length of string ignoring trailing blanks  
      ! Взято из книги: Clive G. Page, Professional Programmer's Guide to Fortran77  
      ! Слегка подправлено под Fortran90  
   
      CHARACTER*(*) STRING  
      INTEGER J  
      DO J = LEN(STRING), 1, -1  
         IF(STRING(J:J) .NE. ' ') EXIT  
      END DO  
   
      LENGTH = J  
      END  
 
Добавлено:
af103
Использование опции implicit как-то заставляет подозревать другое: что в программе есть маленькая опечатка, из-за которой компилятор объявляет непредусмотренную переменную.

Всего записей: 2485 | Зарегистр. 21-06-2005 | Отправлено: 13:05 09-10-2007 | Исправлено: XPEHOMETP, 13:11 09-10-2007
Открыть новую тему     Написать ответ в эту тему

Страницы: 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 330

Компьютерный форум 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