Как получить первое значение по алфавиту из массива или упорядочить этот массив по алфавиту? - PullRequest
0 голосов
/ 29 мая 2019

У меня есть массив символов с фамилиями

character(SNAME_LEN, kind=CH_) :: Surnames(SNAME_AMOUNT) = ""

, и я должен написать в файл минимальную фамилию по алфавиту.


Я не могу найти функцию для своей задачи,Fortran имеет обычную функцию MINVAL, но массив для него должен быть только INTEGER или REAL.

Спасибо за все идеи: -)

UPD: 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

1 Ответ

1 голос
/ 29 мая 2019

Отсутствующее MINVAL для типа символа было отслежено в ошибке https://gcc.gnu.org/bugzilla/show_bug.cgi?id=36313 Это новая функция 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 
 ď  

Особенно с учетом того, чтофайл, который вы сейчас разместили, использует кириллицу.Я понятия не имею, правильно ли расположены нужные вам символы в Юникоде.Возможно, вам придется использовать ОСК-4 в Фортране, и даже тогда порядок может оказаться неподходящим.

...