Считайте ввод, пока значение не станет <0 - PullRequest
1 голос
/ 05 мая 2020

Существует множество реализаций для любого другого языка, кроме Фортрана, и я не смог перенять их.

Sample Input:
5 10 15 20 25 0
Output:
Array: [5, 10, 15, 20, 25]

Sample Input:
5
10
15
20
25
0
Output:
Array: [5, 10, 15, 20, 25]

Оба типа ввода должны работать (однострочный и многострочный).

Итак, то, что я пробовал, подразумевает do l oop (потому что я точно знаю, что могу прочитать до N значений); однако я не смог найти способ прекратить чтение, если на входе 0 или любое другое значение.


То, что я уже пробовал

Этот фрагмент кода явно не читает значения из одной строки:

do while (.not.input<0)
    read *, input
end do

И это не продолжается до тех пор, пока подразумеваемый do-l oop не закончится

do while (.not.input<0)
    read *, (x(i), i=1, 10)
    input = x(i)
end do

1 Ответ

0 голосов
/ 05 мая 2020

Эта программа принимает ввод от стандартного ввода. Вы можете поместить более одного целого числа в строку, разделенную пробелом. Строка может заканчиваться на 0, например, 10 20 30 0. Вы также можете ввести 1 целое число в каждой строке, причем последняя строка будет равна 0. Пустая строка не допускается.

   program foo
   character(len=3) :: fmt = '(A)'
   character(len=80) s, t
   integer :: m=0
   integer, allocatable :: n(:)
   allocate(n(0))
   do
   read(*,fmt) s
5  call get_token(s,t)
   if (len_trim(s) == 0 .and. len_trim(t) == 0) goto 30
   read(t,*,err=15) i
   if (i == 0) goto 20
   n = [n,i]
   m = m + 1
   if (len_trim(s) /= 0) goto 5
   end do
15 write(*,fmt) 'conversion issue'
   goto 40
30 write(*,fmt) 'blank line'
   goto 40
20 if (m == 0) then
   write (*,fmt) 'no elements'
   goto 40
   end if
   write(s,'(I0)') m
   s = '(' // trim(s) // '(I0,1X))'
   write(*,s) n
40 if (allocated(n)) deallocate(n)
   contains
   subroutine get_token(str, token)
   character(len=*), intent(inout) :: str
   character(len=*), intent(out) :: token
   j = scan(trim(str), ' ');
   if (j /= 0) then
   token = str(1:j)
   str = adjustl(str(j:len_trim(str)))
   else
   token = trim(str)
   str = ''
   end if
   end subroutine get_token
   end program foo

Может быть ошибка или два. Ах, это ошибка! Ничего похожего на небольшую мелочь в последнюю минуту, чтобы добавить гаечного ключа в смесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...