2014-01-06 2 views
0

В настоящее время я пытаюсь написать программу в Fortran 77, которая вычисляет количество слов в текстовом файле. Текстовые файлы выглядят так:Проблема с операциями if/then с символьными переменными в Fortran 77

Hello world. Привет мир. Привет мир. Привет мир. Привет мир. Привет мир. Привет мир. Привет мир. Привет мир. Привет мир. Привет мир. Привет мир. Привет мир.

Моя программа в настоящее время выглядит следующим образом:

 program COUNT 
     implicit none 

     character text*100000 
     integer i, a, nw 
     nw=1 !number of words              

     open(9, FILE='file.txt', STATUS='old') 
     read(9, '(A)') text 

     a=0 
    10 do i=1, LEN_TRIM(text) 
      if (text(i:i) .ne. " ") then 
      if (a .eq. 0) then 
       goto 10 
      else 
       a=0 
       nw=nw+1 
       goto 10 
      endif 
      else 
      if (a .eq. 0) then 
       a=a+1 
       goto 10 
      else 
       goto 10 
      endif 
      endif 
     enddo 

     print *, "Number of words: ", nw 

     end 

Я сделал это на бумаге, и она должна работать, однако, моя программа застрять в сделай петлю. Я думаю, что это может быть как-то связано с этим утверждением:

 if (text(i:i) .ne. " ") then 

Могу ли я написать логическое выражение таким образом? Если нет, есть ли у кого-нибудь намеки на то, как я могу переписать этот код? Извините, если моя программа немного беспорядочна; Я относительно новичок в этом. Я пытаюсь улучшить свои навыки кодирования, чтобы делать вычислительную химию. Большое спасибо за помощь!

+0

Предлагаю изучить Fortran 95. Вы уже использовали некоторые из них: 'len_trim'. Макет источника свободной формы проще в использовании, и язык обладает многими дополнительными возможностями. См. Http://en.wikipedia.org/wiki/Fortran_95_language_features –

+0

Вам не нужен какой-либо из ваших 10-ти минут. В качестве альтернативы, если вы хотите их, измените их на цикл (что означает переход на следующую итерацию). – cup

+0

Я не предлагал 'cycle', bucause из Fortran 90. –

ответ

2

Все ваши ветки, если ветви, отправляются в goto 10, который указывает на начало цикла. Нет конца, потому что это приведет к перезапуску цикла с самого начала. Не используйте goto для запуска новой итерации end do s для этого.

Смежные вопросы