【问题标题】:Check if a character exists in an array in fortran在fortran中检查一个字符是否存在于数组中
【发布时间】:2019-05-17 05:59:24
【问题描述】:

所以,我想编写一些代码,以便用户无法输入不在城市列表中的城市,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

所以我使用了我在另一篇文章中看到的 ANY 函数,但我不能很好地使用它,它似乎没有按照我的要求做

【问题讨论】:

  • 不清楚你想让你的程序做什么,无论是在你的描述还是你的代码中。回答这些问题:(i) 你希望你的代码做的第一件事是什么? (ii) 如果用户输入其中一个城市的名称会发生​​什么? (iii) 如果用户输入的不是城市名称,会发生什么?不,不要告诉我这些问题的答案,在你的程序中实现它们。顺便说一句,如果需要真正的帮助,请发布真实代码。
  • 哦,嗨,马克 (:P),我会发布实际代码,但它不是英文的(至少是变量的名称,虽然这可能是你不关心的东西)我认为我认为我所问的没有必要,我可能没有正确表达自己,对不起。我只希望 do while 循环继续循环,直到您输入的“city1”是 city_list 数组上的字符串,所以我正在寻找一个函数,它将数组中的所有值与“city1”进行比较,这就是为什么我使用了 ANY(我在另一篇文章中看到),我真的应该在这里做任何事情吗?
  • 欢迎,我们真的确定了确切的代码 (minimal reproducible example)。变量不必是英文的,或者您可以为我们重命名它们。最重要的是看看你在做什么。请注意,您似乎对什么是 Fortran 字符串和什么是字符数组感到困惑。 这些非常不同。 ANY 仅适用于字符数组,对于字符串使用 SCAN。见stackoverflow.com/questions/33415590/…

标签: arrays fortran fortran90


【解决方案1】:

所以我想通了,

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

这里:

  • 在进入DO循环之前将测试变量设置为.FALSE.
  • 将逻辑与 .TRUE..FALSE. 进行比较会使我们看起来像脚本小子,真正的程序员知道逻辑本身具有其中一个值;
  • 我们不需要编写循环来将数组中的每个元素与输入的值进行比较,使用 ANY 函数将这种繁重的工作留给编译器;
  • 由于ANY 返回一个逻辑,我们可以将其结果直接分配给测试变量。

【讨论】:

    【解决方案2】:

    另一种方法可能是使用带有条件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
    

    【讨论】:

      【解决方案3】:

      !对于现代 Fortran,您可以使用 FINDLOC 函数:

      program TestFindLocinStringArray
          implicit none
          character:: city_list(5), city1
          integer::ip(1)
          city_list = ["A", "B", "C", "D", "E"]
              print*, "Introduce a city that is on the list"
              read *, city1
              ip=findloc(city_list,city1)
              if(ip(1)>0)then
               type*,"city1 is on No#",ip
               exit
              else
               type*, "Your city1 is NOT in the list!"
              end if
          enddo
      end program
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-05-09
        • 2010-11-07
        • 1970-01-01
        • 2020-07-06
        • 2021-12-27
        • 2019-07-06
        相关资源
        最近更新 更多