Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Обработка текстовой и графической информации
.pdf
ГЛАВА 1
ОБРАБОТКА ТЕКСТОВОЙ
ИНФОРМАЦИИ
Обработка текстовой информации стала актуальной всвязи сразвитием
сетевых технологий. Программы поиска файлов, текстов, ключевых
слов нашли широкое применение. Обработка, сравнение и сортировка
текстовых данных не являются типичными задачами, решаемыми средствами языка FORTRAN. Однако это не означает, что он не позволяет
решать подобные задачи. При желании программиста перечисленные
процедуры могут быть реализованы ина FORTRANе. Это можно продемонстрировать на следующих примерах.
Пример 1. Сортировка строк текста
(в данном случае списка литературы)
character (40) namein
cОткрыливыходнойфайл2сименем"SpisokLiteratuti.res"
OPEN(UNIT=2,FILE='SpisokLiteratuti.res')
cОткрыливходнойфайл5(списоклитературы)сименем"5.txt"
namein='5.txt'
open(unit=5,le=namein,status='old',iostat=iche)
if(iche.eq.0)write(2,*)'Найденфайл',namein
if(iche.ne.0)write(2,*)'Stop!Ненайденфайл',namein
cЕслифайлненайден,тоидемнавыход
if(iche.ne.0)goto1000
cОткрыливыходнойфайл6сименем"6.txt"
OPEN(UNIT=6,FILE='6.txt')

12 Глава 1. Обработка текстовой информации
cВызвалиподпрограммусортировкитекста
callSortText
cВыходизпрограммы
1000continue
stop
end
cПодпрограммасортировкитекста
subroutineSortText
cВыделилимассивыдляобработкитекста
c(до2000строкпо1000символов)
character(1)text(2000,1000)
character(1)stroka(1000)
character(1)probel,bukwa1,bukwa2
cЗадализначениесимвольнойпеременнойprobel
dataprobel/""/
cОграничиличислостроктекста
nstrok=2000
cСчитываниетекстаизфайла(впримереизфайла№5)
cПереборстрокданных
do50i=1,nstrok
cСчитываниеоднойстрокиизфайладанных(5).
cПоочередносчитываемсимволыстроки.
read
*(5,'(1000a1)',advance='no',end=5557,err=101,iostat=iche)
*(stroka(j),j=1,1000)
101continue
cВслучае,есликоличествосимволоввстрокеменьшезаданной
cвеличины(вданномслучае1000),выходимизцикла
cсчитываниясимволовиидемкоператору(101continue).
cВслучае,есливфайлечислострокменьшезаданногозначения,
cвыходимизцикласчитываниястрокиидемкоператору
c(5557continue).

Пример 1. Сортировка строк текста (вданном случае списка литературы)
cОпределилидлинусчитаннойстрокиjstr
jstr=j
cЗаписалисчитаннуюстрокувмассивtext(i,j)
do2j=1,jstr
2text(i,j)=stroka(j)
cОчистили"хвост"строкиотпостороннихсимволов
c(заполнилипробелами)
jstrp1=jstr+1
do22j=jstrp1,1000
22text(i,j)=probel
cРаспечаталисчитаннуюстрокутекставфайле2(дляконтроля)
write(2,*)(text(i,j),j=1,jstr)
50continue
cКонецсчитываниятекстаизфайла(5)
5557continue
nst=i-1
write(2,*)
write(2,*)'Числостроктекста=',nst
write(2,*)
13
cСортировкатекста
nstrokm1=nst-1
cПерваястрока(stroka1).Переборпервыхстрок
do3i=1,nstrokm1
ip1=i+1
cВтораястрока(stroka2).Переборвторыхстрок,
cрасположенныхнижепервойстроки
do103i1=ip1,nst
cПереборпервых10столбцовстроки№1(пример).
cПропускаемцифры(старыйномерстроки№1

14 Глава 1. Обработка текстовой информации
cвспискелитературы).
cИщемномерпозициипервойбуквывтекстовойстроке
j1=0
do14j=1,10
bukwa1=text(i,j)
callkodd(bukwa1,kod1)
if(kod1.ge.1)j1=j
if(kod1.ge.1)goto114
14continue
114continue
if(j1.eq.0)goto3
j2=0
cПереборпервых20столбцовстроки№2.
cПропускаемстарыйномерстроки№2вспискелитературы.
cИщемпервуюбукву
do15j=1,20
bukwa2=text(i1,j)
callkodd(bukwa2,kod2)
if(kod2.ge.1)j2=j
if(kod2.ge.1)goto115
15continue
115continue
if(j2.eq.0)goto103
cЗадаемметкуповторениястрок
metkapowt=0
cСравниваемсодержаниястрок№1и№2.
cПоследовательноперебираембуквывстроках
c(впримерепроверяемпервые500символов)
do4j=1,500
bukwa1=text(i,j+j1-1)
bukwa2=text(i1,j+j2-1)
callkodd(bukwa1,kod1)
callkodd(bukwa2,kod2)

Пример 1. Сортировка строк текста (вданном случае списка литературы)
cЕслибуквыстрокразные,меняемметкуповторениястрок
if(kod1.ne.kod2)metkapowt=metkapowt+1
cСравниваембуквы(пономерамихкодов).
cИдемнаперестановкустрокместами,
cеслисравниваемыебуквырасположеныневзаданномпорядке
if(kod1.gt.kod2)goto5
cОбнаруженыодинаковыебуквы,переходимнасравнение
cследующихбуквстрок
if(kod1.eq.kod2)goto4
cСтрокирасположенывправильномпорядке,
cпереходимксравнениюследующейстроки
c(беремследующуюстроку№2)
goto13
4continue
cПереходимксравнениюследующейстроки
c(беремследующуюстроку№2)
goto13
15
cперестановкастрокместами(переставляемсимволы)
5continue
cwrite(2,*)'Переставляемстроки'
cwrite(2,*)(text(i,jj),jj=1,100)
cwrite(2,*)(text(i1,jj),jj=1,100)
cwrite(2,*)
do6j=1,1000
bukwa1=text(i,j)
text(i,j)=text(i1,j)
text(i1,j)=bukwa1
6continue
cwrite(2,*)'Строкипослеперестановки'
cwrite(2,*)(text(i,jj),jj=1,100)
cwrite(2,*)(text(i1,jj),jj=1,100)
cwrite(2,*)
cКонецперестановкистрок

16 Глава 1. Обработка текстовой информации
goto103
13continue
cЗаполняемпробеламиповторяющуюсякопиюстроки
if(metkapowt.ne.0)goto103
do16j=1,1000
text(i1,j)=probel
16continue
103continue
cКонецпереборастрок№2
3continue
cКонецпереборастрок№1
write(2,*)
write(2,*)
write(2,*)'Результатсортировки'
write(2,*)
cПереборстрокданных(впримерезаписьрезультатавфайл№6)
nomer=0
do60i=1,nst
cПропускаемстарыйномерстроки
j1=0
cПроверяемпервые10символовстроки
do1240j=1,10
bukwa1=text(i,j)
callkodd(bukwa1,kod1)
if(kod1.ge.1)j1=j
if(kod1.ge.1)goto1214
cСтираемстарыйномерстрокитекста(заполняемпробелами)
text(i,j)=probel
1240continue
1214continue

Пример 1. Сортировка строк текста (вданном случае списка литературы)
if(j1.le.0)j1=1
jk=0
kod1sum=0
cПеребираемсимволыстроки
do61j=j1,1000
bukwa1=text(i,j)
cОпределяемкодсимвола
callkodd(bukwa1,kod1)
if(kod1.ne.0)jk=j
if(kod1.ne.0)kod1sum=kod1sum+1
61continue
cКоличествосимволоввстрокебезучетапробелов(kod1sum)
if(kod1sum.le.0)goto60
cНовыйномерстрокивспискелитературы(nomer)
nomer=nomer+1
cДлинастрокиjk(увеличилидлинустрокина10
cсцельюучетавозможногоналичиядругих
cнеучтенныхсимволоввтексте)
jk=jk+10
cПечатаемполученныйсписок(безномеровстрок)вфайл2
write(2,*)(text(i,j),j=1,jk)
cЗаписываемстроку(сновымномеромстроки)вфайл6
write(6,'(i3,a2,1000a1)')nomer,'.',(text(i,j),j=j1,jk)
60continue
cКонецзаписитекставфайл6.txt
17
5000continue
stop
end
Заметим, что всовременных версиях FORTRANа имеются процеду-
ры, спомощью которых можно создать другие варианты программы, решающей поставленную задачу. Впредставленных примерах реализованы наиболее простые средства, которые используют традиционные

18 Глава 1. Обработка текстовой информации
формы языка. Применение расширенных версий языка минимизировано всвязи стем, что они чаще подвержены изменениям ииногда различаются упроизводителей программного обеспечения.
cПодпрограммаопределенияпорядковогономерасимвола
c(дляпроведениясравненийтекстовиопределенияочередности
cрасстановкистрокзадаемкаждомусимволусвойномер)
subroutinekodd(bukwa,kod)
character(1)bukwa
kod=0
cКириллица
if(bukwa.eq.'а')kod=1
if(bukwa.eq.'б')kod=2
if(bukwa.eq.'в')kod=3
if(bukwa.eq.'г')kod=4
if(bukwa.eq.'д')kod=5
if(bukwa.eq.'е')kod=6
if(bukwa.eq.'ж')kod=7
if(bukwa.eq.'з')kod=8
if(bukwa.eq.'и')kod=9
if(bukwa.eq.'й')kod=10
if(bukwa.eq.'к')kod=11
if(bukwa.eq.'л')kod=12
if(bukwa.eq.'м')kod=13
if(bukwa.eq.'н')kod=14
if(bukwa.eq.'о')kod=15
if(bukwa.eq.'п')kod=16
if(bukwa.eq.'р')kod=17
if(bukwa.eq.'с')kod=18
if(bukwa.eq.'т')kod=19
if(bukwa.eq.'у')kod=20
if(bukwa.eq.'ф')kod=21
if(bukwa.eq.'х')kod=22
if(bukwa.eq.'ц')kod=23

Пример 1. Сортировка строк текста (вданном случае списка литературы)
if(bukwa.eq.'ч')kod=24
if(bukwa.eq.'ш')kod=25
if(bukwa.eq.'щ')kod=26
if(bukwa.eq.'ъ')kod=27
if(bukwa.eq.'ы')kod=28
if(bukwa.eq.'ь')kod=29
if(bukwa.eq.'э')kod=30
if(bukwa.eq.'ю')kod=31
if(bukwa.eq.'я')kod=32
if(bukwa.eq.'А')kod=1
if(bukwa.eq.'Б')kod=2
if(bukwa.eq.'В')kod=3
if(bukwa.eq.'Г')kod=4
if(bukwa.eq.'Д')kod=5
if(bukwa.eq.'Е')kod=6
if(bukwa.eq.'Ж')kod=7
if(bukwa.eq.'З')kod=8
if(bukwa.eq.'И')kod=9
if(bukwa.eq.'Й')kod=10
if(bukwa.eq.'К')kod=11
if(bukwa.eq.'Л')kod=12
if(bukwa.eq.'М')kod=13
if(bukwa.eq.'Н')kod=14
if(bukwa.eq.'О')kod=15
if(bukwa.eq.'П')kod=16
if(bukwa.eq.'Р')kod=17
if(bukwa.eq.'С')kod=18
if(bukwa.eq.'Т')kod=19
if(bukwa.eq.'У')kod=20
if(bukwa.eq.'Ф')kod=21
if(bukwa.eq.'Х')kod=22
if(bukwa.eq.'Ц')kod=23
if(bukwa.eq.'Ч')kod=24
if(bukwa.eq.'Ш')kod=25
19

20 Глава 1. Обработка текстовой информации
if(bukwa.eq.'Щ')kod=26
if(bukwa.eq.'Ъ')kod=27
if(bukwa.eq.'Ы')kod=28
if(bukwa.eq.'Ь')kod=29
if(bukwa.eq.'Э')kod=30
if(bukwa.eq.'Ю')kod=31
if(bukwa.eq.'Я')kod=32
cЛатинскийалфавит
if(bukwa.eq.'a')kod=33
if(bukwa.eq.'b')kod=34
if(bukwa.eq.'c')kod=35
if(bukwa.eq.'d')kod=36
if(bukwa.eq.'e')kod=37
if(bukwa.eq.'f')kod=38
if(bukwa.eq.'g')kod=39
if(bukwa.eq.'h')kod=40
if(bukwa.eq.'i')kod=41
if(bukwa.eq.'j')kod=42
if(bukwa.eq.'k')kod=43
if(bukwa.eq.'l')kod=44
if(bukwa.eq.'m')kod=45
if(bukwa.eq.'n')kod=46
if(bukwa.eq.'o')kod=47
if(bukwa.eq.'p')kod=48
if(bukwa.eq.'q')kod=49
if(bukwa.eq.'r')kod=50
if(bukwa.eq.'s')kod=51
if(bukwa.eq.'t')kod=52
if(bukwa.eq.'u')kod=53
if(bukwa.eq.'v')kod=54
if(bukwa.eq.'w')kod=55
if(bukwa.eq.'x')kod=56
if(bukwa.eq.'y')kod=57
if(bukwa.eq.'z')kod=58
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
