Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Обработка текстовой и графической информации
.pdf
Пример 1. Сортировка строк текста (вданном случае списка литературы)
if(bukwa.eq.'A')kod=59
if(bukwa.eq.'B')kod=60
if(bukwa.eq.'C')kod=61
if(bukwa.eq.'D')kod=62
if(bukwa.eq.'E')kod=63
if(bukwa.eq.'F')kod=64
if(bukwa.eq.'G')kod=65
if(bukwa.eq.'H')kod=66
if(bukwa.eq.'I')kod=67
if(bukwa.eq.'J')kod=68
if(bukwa.eq.'K')kod=69
if(bukwa.eq.'L')kod=70
if(bukwa.eq.'M')kod=71
if(bukwa.eq.'N')kod=72
if(bukwa.eq.'O')kod=73
if(bukwa.eq.'P')kod=74
if(bukwa.eq.'Q')kod=75
if(bukwa.eq.'R')kod=76
if(bukwa.eq.'S')kod=77
if(bukwa.eq.'T')kod=78
if(bukwa.eq.'U')kod=79
if(bukwa.eq.'V')kod=80
if(bukwa.eq.'W')kod=81
if(bukwa.eq.'X')kod=82
if(bukwa.eq.'Y')kod=83
if(bukwa.eq.'Z')kod=84
21
cЦифрывтексте
if(bukwa.eq.'0')kod=-10
if(bukwa.eq.'1')kod=-9
if(bukwa.eq.'2')kod=-8
if(bukwa.eq.'3')kod=-7
if(bukwa.eq.'4')kod=-6
if(bukwa.eq.'5')kod=-5
if(bukwa.eq.'6')kod=-4

22 Глава 1. Обработка текстовой информации
if(bukwa.eq.'7')kod=-3
if(bukwa.eq.'8')kod=-2
if(bukwa.eq.'9')kod=-1
cДругиесимволывтексте
cКириллица
if(bukwa.eq.'.')kod=-11
if(bukwa.eq.',')kod=86
if(bukwa.eq.':')kod=87
if(bukwa.eq.';')kod=88
if(bukwa.eq.'/')kod=89
cЛатинскийалфавит
if(bukwa.eq.'.')kod=-11
if(bukwa.eq.',')kod=91
if(bukwa.eq.':')kod=92
if(bukwa.eq.';')kod=93
if(bukwa.eq.'/')kod=94
return
end
При необходимости аналогичным образом можно задать коды идругих символов, например скобки, табуляции идр. Изменив номер кода
символа в подпрограмме kodd, можно изменить порядок сортировки
текстов. Например, вначале списка могут быть представлены строки
сзаглавными буквами, вконце— со строчными; строки сцифровой информацией могут быть выделены вотдельную группу ит.п. Отметим, что
эта программа использует свои, задаваемые программистом коды символов. Их не следует путать сдругими кодами, например со стандартными кодами клавиатуры, которые рассмотрены вследующих примерах.
На первый взгляд смысл разработки такого рода программ невелик,
так как существуют коммерческие программы (Microsoft Word и др.) со

Пример 1. Сортировка строк текста (вданном случае списка литературы)
23
встроенными процедурами сортировки. Однако если требуется назначить свой специфический порядок сортировки, записать полученную
информацию в нужные файлы в нужные директории (тексты в одни
файлы, цифры — вдругие), то эффективность применения коммерческих программ оказывается невысокой. Такая же проблема возникает
вслучае обработки большого количества файлов. Например, требуется
отсортировать списки студентов всех групп вуза. Число групп может достигать нескольких сотен. Сортировка файлов вручном режиме спомощью коммерческих программ потребует нескольких дней работы и не
гарантирует от появления ошибок. Сортировка спомощью специальной
программы потребует нескольких нажатий кнопок инескольких минут
работы.
Пример организации процедуры обработки группы файлов с систе-
матизированными именами:
character(1)nameinnn(20)
character(20)namein
character(10)nomer
cЗадаемначальноезначениесимвольнойпеременнойnamein
datanamein/"Группа№"/
cСвязываеммассивсимвольныхпеременныхnameinnn(20)с
cсимвольнымипеременнымиnameinиnomerчерезобщиеячейки
cпамятиоператоромequivalence.
cЭтотприемпозволяетпосимвольноформировать
cсложныеимена
equivalence(nameinnn(1),namein)
equivalence(nameinnn(11),nomer)
cПеребираемспискигрупп
cПеребор.Номерфакультета(впримерерассматриваетсядо10
cфакультетов)
do1nomfak=1,10
cПеребор.Номеркурса(впримерерассматривается6курсов)
do2kurs=1,6
cПеребор.Номергруппынакурсе

24 Глава 1. Обработка текстовой информации
c(впримерерассматриваетсядо20группнакурсе)
do3ngrupp=1,20
cОпределяемномергруппы
nnn=1000*nomfak+100*kurs+ngrupp
30format(i5)
cЗаписываемвычисленныйномергруппыnnnвсимвольную
cпеременнуюnomer
write(nomer,30)nnn
cБлагодаряприменениюоператоровequivalenceэтотномер
cавтоматическиопределяетзначениеименифайлаnamein.
cДляконтролявыводимнапечатьновоеимяфайла5-namein
write(2,*)namein
cОткрыливходнойфайл№5сименем,хранящимсявпеременной
c namein
c(старыйсписокстудентовгруппы)
open(unit=5,le=namein,status='old',iostat=iche)
cЕслиненайденфайлстакимименем,переходим
cкпоискуфайласоспискомследующейгруппыстудентов
if(iche.ne.0)write(2,*)'Ненайденфайл',namein
if(iche.ne.0)goto3
cВызвалиподпрограммусортировкитекста(спискастудентов
cгруппы)
callSortText
cЗакрылифайл5
close(5)
3continue
2continue
1continue
Если имена входных файлов не систематизированы и каждое имя
имеет оригинальный вид, то можно организовать последовательное считывание таких имен (имен входных файлов) из отдельного файла данных (например, из файла 10):
cОткрываемle=10—файлданныхсименамигрупп
open(unit=10,le='10.txt',form='formatted',

Пример 1. Сортировка строк текста (вданном случае списка литературы)
*status='old',access='sequential',iostat=iche)
cНеудалосьоткрытьфайл10,идемнавыход
if(iche.ne.0)write(2,*)'Stop!!!File10.txt
*отсутствует!'
if(iche.ne.0)goto5
cФайл10успешнооткрылся,продолжаемработу.
cПеребираемназваниягруппстудентов
c(вданномслучаеограничилиськоличествомгрупп,
cравным1000)
do4ngrupp=1,1000
cСчитываемимягруппыстудентовизфайла10
read(10,*)namein
cДляконтроляработыпрограммызаписываемсчитанноеимя
cвфайл2
write(2,*)namein
cОткрылифайл5сименемгруппыnamein
open(unit=5,le=namein,status='old',iostat=iche)
cЕслинеудалосьоткрыть,идемвконеццикла
if(iche.ne.0)write(2,*)'Ненайденфайл',namein
if(iche.ne.0)goto4
cФайл5открыт.Вызвалиподпрограммусортировкитекста
callSortText
cЗакрылифайл5
close(5)
4continue
5continue
25
Измененный список может быть вновь записан в имеющийся файл
со старым названием. Для этого можно закрыть файл 5 после считывания всех строк текстового файла и, не меняя его имени, снова его открыть, после чего записать вэтот файл обновленный список:
cПечатаемсписок(сномеромстроки)вфайл5
c(впримере1меняемоператор

26 Глава 1. Обработка текстовой информации
cwrite(6,'(i3,a2,1000a1)')nomer,'.',(text(i,j),j=j1,jk)
cнаоператор
write(5,'(i3,a2,1000a1)')nomer,'.',(text(i,j),j=j1,jk)
cДругойвариант-вернутьсявначалофайла5спомощью
cоператора
rewind5
cпослесчитываниявсехстроктекстовогофайла
cизаписатьвэтотжефайл(5)обновленныйсписокстудентов
cгруппы.
write(5,'(i3,a2,1000a1)')nomer,'.',(text(i,j),j=j1,jk)
Как показано впримере 1, работа стекстовыми файлами заключается
впоиске исчитывании информации из этих файлов, всравнении считанных символов или групп символов сдругими символами, ввыполнении некоторых операций по результатам этих сравнений. Обработка
текстовой информации, хотя итребует некоторых затрат, намного проще, чем организация процедур, типичных для большинства вычислительных программ, написанных на FORTRANе. Вэтом случае не требуется прикладывать большие усилия по обеспечению устойчивости вычислений, обеспечению сходимости решения, нет проблем, связанных
свыбором шага по времени, спостроением сеток, свыбором числа итераций, сошибками округления. Не нужно решать вопросы, связанные
сзагрузкой больших матриц вограниченную память ЭВМ, так как информация вэтом случае легко может извлекаться ианализироваться по
частям, и т.п. Таким образом, создание программ обработки текстовых
файлов на языке FORTRAN не ставит завышенные требования кквалификации программиста, хотя приемы написания таких программ специфичны. Они несколько отличаются от типовых приемов написания
вычислительных программ. В частности, арифметические операции
с символьными переменными напрямую не могут выполняться, хотя
никто не мешает программисту устранить это ограничение своими средствами. Вкачестве примера ниже приведен фрагмент одного из возможных вариантов решения подобной задачи.

Пример 2. Выполнение арифметических операций
Пример 2. Выполнение арифметических
операций
character(1)stroka(100)
a=10.
b=2.
c=0.
cСчитываемтекстовуюстроку,вкоторойзадается
cарифметическоедействие
read(7,'(100a1)',err=101,iostat=iche)
*(stroka(jj),jj=1,100)
101continue
j100=jj-1
write(*,*)'j100=',j100
write(*,*)stroka
j98=j100-2
cПеребираемсимволывстроке
do1j=1,j98
cОпределяемзаданноеарифметическоедействие,например:
cНаходимвстрокесочетаниесимволов"a+b"
cивыполняемзаданноеарифметическоедействиеспеременными
if(stroka(j).eq."a".and.stroka(j+1).eq."+"
*.and.stroka(j+2).eq."b")c=a+b
cНаходимвстрокесочетаниесимволов"a-b"
cивыполняемзаданноеарифметическоедействиеспеременными
if(stroka(j).eq."a".and.stroka(j+1).eq."-"
*.and.stroka(j+2).eq."b")c=a-b
1continue
cПечатаемрезультатвычислений,видипоследовательность
cкоторыхбылизаданывтекстовойстроке
write(*,*)‘c=’,c
27
Аналогичным образом могут быть созданы программы, предназна-
ченные для обработки более сложных выражений. Естественно, в них

28 Глава 1. Обработка текстовой информации
должны быть включены процедуры анализа выражений, анализа переменных, определения последовательности выполнения операций.
Если возникла потребность ввода данных из символьной строки (например, а=1), то это желание может быть реализовано спомощью применения различных приемов, например спомощью оператора присваивания:
if(stroka(j).eq."a".and.stroka(j+1).eq."="
*.and.stroka(j+2).eq."1".and.stroka(j+3).eq."")a=1
или считыванием данных из символьной переменной:
read(stroka(j+2),*)a
Этот вариант считывания данных более подробно представлен вследующем примере. Проверки вида stroka(j+3).eq." " воператоре if()
нужны для того, чтобы различать команды а=1 и а=10, 11,… ит.п.
Замечание. Наряду собработкой символьных данных аналогичным
образом может быть организована обработка играфической информации. Например, в таблицах данных каждому рисунку с изображением
эмблемы автомобиля присваивается свой номер. Тогда сортировка данных может быть произведена как по цифровым параметрам, указанным
в таблицах (масса, мощность, год выпуска атомобиля и т.п.), так и по
маркам автомобилей.
Пример 3. Поиск данных в файле с таблицами
Рассматривается вариант поиска нужной информации вфайле, содержащем таблицы данных. Таблицы истолбцы этих таблиц могут располагаться в файле в произвольном порядке, но они имеют заголовки, по
которым осуществляется поиск исчитывание данных.
SubroutineParm(ntonow,Nomprot,nameinAl)
cПоумолчаниюиспользуемданныевещественноготипа
cдвойнойточности

Пример 3. Поиск данных вфайле стаблицами
implicitreal*8(a-h,o-z)
real*8rab(500),alpha,betta0,wMach0,Re0,Cy0,wq0,Pst0,P0
cИспользуемименованнуюобщуюобластьпамяти
ccommon/oglawl/дляхраненияипередачиданных
common/oglawl/
*alpha(100),betta0(100),wMach0(100),Re0(100),Cy0(100)
*,wq0(100),Pst0(100),P0(100),TF0(100)
cОписаниесимвольныхпеременных
character(40)nameinAl
character(80)zagolowok,zagolowok0,kt
character(103)zagolowok000
character(1)kttt,sj
character(1000)sstroka,sstroka000
character(1)stroka(1400),nl31(3)
character(1)zwezda,tabul,probel,tchk,zpt,apo
character(1)stroka19(1400)
character(3)nle3,nle30
cСвязываемсимвольныепеременныеимассивысимвольных
cпеременных,размещаяихвобщейобластипамяти.Это
cпозволяетпрограммнымисредствамисоздаватьсложные
cимена,работаясотдельнымипростымисимволами
equivalence(stroka(1),sstroka)
equivalence(nl31(1),nle3)
cЗадаемзначениясимвольныхпеременных
datatchk/"."/
datazpt/","/
datatabul/" "/
dataprobel/""/
datazwezda/"*"/
datanle30/"000"/
29
integer*4istroka(23)
character(8)simprot
datasimprot/"Протокол"/

30 Глава 1. Обработка текстовой информации
character(8)simwol
character(1)sim8(8)
equivalence(sim8(1),simwol)
character(45)strokannn
character(5)simnomprot
character(1)sim5(5)
equivalence(sim5(1),simnomprot)
cДатапроведенияиспытаний
character(4)simdata
datasimdata/"Дата"/
character(4)simd4
character(1)sim4(4)
equivalence(sim4(1),simd4)
character(1)sim20(20)
cЧислоМ
character(1)simMach
datasimMach/"M"/
cУголAlpha
character(1)simAlpha(2)
datasimAlpha(1)/"A"/
datasimAlpha(2)/"L"/
character(1)simpodch,simC
datasimpodch/"_"/
datasimC/"C"/
cУголBetta
character(1)simBetta(2)
datasimBetta(1)/"B"/
datasimBetta(2)/"E"/
cЧислоRe
character(1)simRe(2)
datasimRe(1)/"R"/
datasimRe(2)/"e"/
character(1)simCy(2)
datasimCy(1)/"C"/
datasimCy(2)/"y"/
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
