Проверьте, существует ли символ в массиве в Фортране - PullRequest
0 голосов
/ 16 декабря 2018

Итак, я хочу написать некоторый код, чтобы пользователь не мог вводить город, которого нет в списке городов, а массив city_list - это одномерный массив размера 5, значениями которого являются A, B, C, D иE. Так что я сделал это

character, dimension(5) :: city_list 

do i=1,5
    city_list(i)= achar(i+64)         !To give the array a,b,c values to its first five components
end do

character :: City1, ...

do while(ANY(City_list == City1) )
    READ*, City1
    PRINT*, "IT'S GOT TO BE A,B,C,D,E"
end do

Так что я использовал ЛЮБУЮ функцию, которую я видел в другом посте, но я не могу использовать ее хорошо, похоже, она не выполняет то, что я просилэто делать

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Другой подход может заключаться в использовании бесконечного цикла с условным кодом exit (чтобы сделать код немного проще ...)

program main
    implicit none
    character :: city_list( 5 ), city1
    city_list = ["A", "B", "C", "D", "E"]

    do
        print*, "Introduce a city that is on the list"
        read *, city1
        if ( any( city1 == city_list ) ) exit
    enddo

    print *, "Your city1 is ", city1
end
0 голосов
/ 17 декабря 2018

Итак, я понял,

do while(is_in_list .eqv. .FALSE.)
    print*, "Introduce a city that is on the list"
    READ*, Ciud1
    do i=1, 5
        if(city_list(i) == city1) then      
            is_in_list = .TRUE.
            PRINT*, "It's in the list"
        end if
    end do
end do

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

Мы можем немного привести в порядок этот код и использовать функцию ANY:

  is_in_list = .FALSE.

  DO WHILE(.NOT.is_in_list)
     PRINT*, "Introduce a city that is on the list"
     READ*, city1
     is_in_list = ANY(city_list==city1)
     IF (is_in_list) PRINT*, "It's in the list"     
  END DO

Здесь:

  • установить тестовую переменную на .FALSE. перед входом в цикл DO;
  • , сравнивая логическое значение с .TRUE. или .FALSE., что делает нас похожими на скрипт-детишекнастоящие программисты знают, что само логическое имеет одно из этих значений;
  • нам не нужно писать цикл для сравнения каждого элемента в массиве с введенным значением, использование функции ANY оставляет такой видгрубой работы для компилятора;
  • , поскольку ANY возвращает логическое значение, мы можем присвоить его результат непосредственно тестовой переменной.
...