如何从数组中按字母顺序获取第一个值或按字母顺序排列该数组?
How to get first value by alphabet from array or order that array by alphabet?
我有带姓氏的字符数组
character(SNAME_LEN, kind=CH_) :: Surnames(SNAME_AMOUNT) = ""
而且我必须将最少的姓氏按字母顺序写入文件。
我找不到解决我的问题的函数。 Fortran 有常规函数 MINVAL,但他的数组只能是 INTEGER 或 REAL。
感谢任何想法:-)
更新:
GFortran 显示错误
src/main.f90:73:22:
write (*,*) MINVAL(Surnames(:))
1
Error: ‘array’ argument of ‘minval’ intrinsic at (1) must be INTEGER or REAL
UPD2:
节目主体
lr1.f90
program lr1_1
implicit none
integer, parameter :: CH_= Selected_Char_Kind("ISO_10646")
character(*), parameter :: E_ = "UTF-8"
integer, parameter :: SNAME_AMOUNT = 23, SNAME_LEN = 15, TEL_LEN = 10
character(:), allocatable :: input_file, output_file
character(SNAME_LEN, kind=CH_) :: Surnames(SNAME_AMOUNT) = ""
character(TEL_LEN, kind=CH_) :: Tel(SNAME_AMOUNT) = ""
integer :: In, Out, IO, i, j
input_file = "input.txt"
output_file = "output.txt"
open (file=input_file, encoding=E_, newunit=In)
read (In, '(3(a), 3(a))', iostat=IO) (Surnames(i), Tel(i), i = 1, SNAME_AMOUNT)
close (In)
write (*,*) MINVAL(Surnames(:))
end program lr1_1
input.txt
Дудиков 9111630001
Тихонов 9111630002
Степин 9111630003
Садовникова 9111630004
Воробъёва 9111630005
Дудиков 9111630006
Тихонов 9111630007
Степин 9111630008
Садовникова 9111630009
Воробъёва 9111630010
Петров 9111630011
Фёдоров 9111630012
Петров 9111630013
Воробъёва 9111630014
在错误 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=36313 中跟踪了字符类型缺失的 MINVAL
这是 Fortran 2003 的新功能,在 Fortran 95 中这些函数仅适用于实数和整数。将您的编译器更新到 GCC 版本 8 或更新版本。
> cat minvalchar.f90
print *,minval(["a"])
end
> gfortran-8 minvalchar.f90
> ./a.out
a
请注意,此方法可能不会使用您的语言可能需要的整理顺序:
print *,maxval([character(4) :: "a","b","c","č","d","ď","e","é","f"])
end
> ./a.out
ď
特别是考虑到您现在发布的文件使用西里尔字母。我不知道您需要的字符是否在 Unicode 中正确排序。您可能需要在 Fortran 中使用 USC-4,即使这样顺序也可能不合适。
我有带姓氏的字符数组
character(SNAME_LEN, kind=CH_) :: Surnames(SNAME_AMOUNT) = ""
而且我必须将最少的姓氏按字母顺序写入文件。
我找不到解决我的问题的函数。 Fortran 有常规函数 MINVAL,但他的数组只能是 INTEGER 或 REAL。
感谢任何想法:-)
更新: GFortran 显示错误
src/main.f90:73:22:
write (*,*) MINVAL(Surnames(:))
1
Error: ‘array’ argument of ‘minval’ intrinsic at (1) must be INTEGER or REAL
UPD2: 节目主体
lr1.f90
program lr1_1
implicit none
integer, parameter :: CH_= Selected_Char_Kind("ISO_10646")
character(*), parameter :: E_ = "UTF-8"
integer, parameter :: SNAME_AMOUNT = 23, SNAME_LEN = 15, TEL_LEN = 10
character(:), allocatable :: input_file, output_file
character(SNAME_LEN, kind=CH_) :: Surnames(SNAME_AMOUNT) = ""
character(TEL_LEN, kind=CH_) :: Tel(SNAME_AMOUNT) = ""
integer :: In, Out, IO, i, j
input_file = "input.txt"
output_file = "output.txt"
open (file=input_file, encoding=E_, newunit=In)
read (In, '(3(a), 3(a))', iostat=IO) (Surnames(i), Tel(i), i = 1, SNAME_AMOUNT)
close (In)
write (*,*) MINVAL(Surnames(:))
end program lr1_1
input.txt
Дудиков 9111630001
Тихонов 9111630002
Степин 9111630003
Садовникова 9111630004
Воробъёва 9111630005
Дудиков 9111630006
Тихонов 9111630007
Степин 9111630008
Садовникова 9111630009
Воробъёва 9111630010
Петров 9111630011
Фёдоров 9111630012
Петров 9111630013
Воробъёва 9111630014
在错误 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=36313 中跟踪了字符类型缺失的 MINVAL
这是 Fortran 2003 的新功能,在 Fortran 95 中这些函数仅适用于实数和整数。将您的编译器更新到 GCC 版本 8 或更新版本。
> cat minvalchar.f90
print *,minval(["a"])
end
> gfortran-8 minvalchar.f90
> ./a.out
a
请注意,此方法可能不会使用您的语言可能需要的整理顺序:
print *,maxval([character(4) :: "a","b","c","č","d","ď","e","é","f"])
end
> ./a.out
ď
特别是考虑到您现在发布的文件使用西里尔字母。我不知道您需要的字符是否在 Unicode 中正确排序。您可能需要在 Fortran 中使用 USC-4,即使这样顺序也可能不合适。