Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Обработка текстовой и графической информации
.pdf
Пример 3. Поиск данных вфайле стаблицами
character(1)simQ
datasimQ/"Q"/
cЗадаемзначенияискомыхпараметровпоумолчанию,
cеслионипозднеенебудутнайденыврассматриваемомфайле
cЗадалиограничение(100элементов)
ntonowAl=100
ntonow=100
do777i=1,100
alpha(i)=0.0d0
wMach0(i)=0.0d0
Re0(i)=1.0d0
wq0(i)=1.0d0
Pst0(i)=1.0d0
P0(i)=1.0d0
TF0(i)=15.0d0
777continue
cИзфайла13считываемимявходногофайладанныхв
cпеременнуюnameinAl
read(13,'(a40)')nameinAl
write(2,*)'Введеноимявходногофайла=',nameinAl
cОткрываемфайлданных20сименем,заданномвпеременной
cnameinAl
open(unit=20,le=nameinAl,form='formatted',
*status='old',access='sequential',iostat=iche)
if(iche.eq.0)goto5558
write(2,*)'Ненайденфайл',nameinAl
write(2,*)'Принимаемпараметрыпоумолчанию'
goto5557
5558continue
31
cПечатаемномертребуемогопротоколаиспытаний
write(2,1300)Nomprot
1300format('Номерпротокола',i5)

32 Глава 1. Обработка текстовой информации
cОчисткастрокитекста(заполняемпробеламивсюстроку)
do11612jjj=1,1000
stroka(jjj)=''
11612continue
cСоздаемкопиюпустойстроки
sstroka000=sstroka
cИщемнужныйпротоколвфайле20(сименем,заданномв
cпеременнойnameinAl)
cПереборвсехстрокфайла20(задали1000000строк)
do11501iii=1,1000000
cОчисткастроки
sstroka=sstroka000
cСчитываниестрокиизфайла20
read
*(20,'(1000a1)',advance='no',end=15000,err=11601,
*iostat=iche)(stroka(jjj),jjj=1,1000)
11601continue
cСчитываемсимволыпоформату1000a1.Строкунепродвигаем,
cприобнаруженииконцафайлапереходимкоператорусметкой
c15000,приобнаруженииошибкисчитыванияпереходимк
cоператорусметкой11601.
cИщемвстрокеслово«Протокол»
do11602jjj=1,992
do11603j8=1,8
sim8(j8)=stroka(jjj+j8)
11603continue
if(simwol.ne.simprot)goto11602
do11605j5=1,5
sim5(j5)=stroka(jjj+8+j5)
11605continue

Пример 3. Поиск данных вфайле стаблицами
goto11604
11602continue
11604continue
cНашливстрокеслово«Протокол».Определяемномер
cпротокола
if(simwol.ne.simprot)goto11501
read(simnomprot,'(i5)')nom
write(2,*)'Найденпротокол№',nom
cСравниваемнайденныйвфайленомерпротокола
cстребуемымномеромпротокола
if(Nomprot.ne.nom)goto11501
goto11511
11501continue
write(2,*)'Протокол№',Nomprot,'вфайледанных',
*nameinAl,'ненайден'
cИдемнавыход,таккакнужногопротоколавфайледанных
cнеоказалось
goto5557
33
11511continue
write(2,*)'Протокол№',Nomprot,'вфайледанных
*',nameinAl,
*'найден'
cОпределениевременисозданиямассиваданных
c(оно,вэтомпримере,хранитсявфайлепротокола)
do12602jjj=1,992
do12603j4=1,4
sim4(j4)=stroka(jjj+j4)
12603continue
if(simd4.ne.simdata)goto12602
do12605j20=1,20

34 Глава 1. Обработка текстовой информации
sim20(j20)=stroka(jjj+4+j20)
12605continue
goto12604
12602continue
12604continue
write(2,*)
*'Моментсозданиямассиваданных'
write(2,*)simdata,(sim20(j20),j20=1,20)
write(2,*)
read(sim20(20),*)i1
read(sim20(19),*)i2
read(sim20(17),*)i3
read(sim20(16),*)i4
read(sim20(14),*)i5
read(sim20(13),*)i6
t=i1+i2*10+i3*60+i4*600+i5*3600+i6*36000
write(2,*)'T(c)=',t
cПропускаемстрокиспостороннейинформациейвфайле20
read(20,*)
read(20,*)
cСчитываемстроки,вкоторыхможетсодержатьсятребуемая
cинформация
read
*(20,'(1000a1)',advance='no',end=15000,err=15000,
*iostat=iche)(stroka(jjj),jjj=1,1000)
jjj=jjj-1
cПоискномерстолбцаснужнымиданными(начало).
cЗадаемначальныйномерстолбцаданных(поумолчанию)
nomstolb=0
nomAlpha=1
nomAlphaC=1
nomBetta=1

Пример 3. Поиск данных вфайле стаблицами
nomMach=1
nomRe=1
nomCy=1
nomQ=1
nomPst=1
nomP0=1
nomTF0=1
cЗаменавстрокесимволовтабуляциисимволамипробела.
cПереборвсехсимволовстроки
do81j=1,jjj
sj=stroka(j)
if(sj.eq.tabul)stroka(j)=probel
81continue
cПереборвсехсимволовстроки
do801j=1,jjj
cВыделяемэлементстрокивотдельнуюпеременную
sj=stroka(j)
if(sj.eq.probel)kkk=1
if(sj.eq.probel)goto802
cВстрокеобнаруженсимвол,отличныйотпробела.
cНашлиновыйзаголовок,новыйстолбецсданными.
cЕгономерnomstolb
if(kkk.eq.1)nomstolb=nomstolb+1
kkk=0
35
cИщемстолбцыснужныминазваниямизаголовков
cНаходимстолбецсназванием"AL"
if(stroka(j-1).eq.probel.
*and.sj.eq.simAlpha(1).and.stroka(j+1).eq.simAlpha(2).
*and.stroka(j+2).eq.probel)nomAlpha=nomstolb
cНаходимстолбецсназванием"AL_C"

36 Глава 1. Обработка текстовой информации
if(stroka(j-1).eq.probel.
*and.sj.eq.simAlpha(1).and.stroka(j+1).eq.simAlpha(2)
*.and.stroka(j+2).eq.simpodch.and.stroka(j+3).eq.simC.
*and.stroka(j+4).eq.probel)nomAlphaC=nomstolb
cНаходимстолбецсназванием"BE"
if(stroka(j-1).eq.probel.
*and.sj.eq.simBetta(1).and.stroka(j+1).eq.simBetta(2).
*and.stroka(j+2).eq.probel)nomBetta=nomstolb
cНаходимстолбецсназванием"BEC"
if(stroka(j-1).eq.probel.
*and.sj.eq.simBetta(1).and.stroka(j+1).eq.simBetta(2).
*and.stroka(j+2).eq.simC.and.stroka(j+3).eq.probel)
*nomBetta=nomstolb
cНаходимстолбецсназванием"M"
if(stroka(j-1).eq.probel.
*and.sj.eq.simMach.and.stroka(j+1).eq.probel)
*nomMach=nomstolb
cНаходимстолбецсназванием"MC"
if(stroka(j-1).eq.probel.and.sj.eq.simMach.and.
*stroka(j+1).eq.simC.and.stroka(j+2).eq.probel)
*nomMach=nomstolb
cНаходимстолбецсназванием"Re"
if(stroka(j-1).eq.probel.
*and.sj.eq.simRe(1).and.stroka(j+1).eq.simRe(2).and.
*stroka(j+2).eq.probel)nomRe=nomstolb
cНаходимстолбецсназванием"ReC"
if(stroka(j-1).eq.probel.
*and.sj.eq.simRe(1).and.stroka(j+1).eq.simRe(2).and.

Пример 3. Поиск данных вфайле стаблицами
*stroka(j+2).eq.simC.and.stroka(j+3).eq.probel)
*nomRe=nomstolb
cНаходимстолбецсназванием"Cy"
if(stroka(j-1).eq.probel.
*and.sj.eq.simCy(1).and.stroka(j+1).eq.simCy(2).and.
*stroka(j+2).eq.probel)nomCy=nomstolb
cНаходимстолбецсназванием"CyC"
if(stroka(j-1).eq.probel.
*and.sj.eq.simCy(1).and.stroka(j+1).eq.simCy(2).and.
*stroka(j+2).eq.simC.and.stroka(j+3).eq.probel)
*nomCy=nomstolb
cНаходимстолбецсназванием"Q"
if(stroka(j-1).eq.probel.
*and.sj.eq.simQ.and.stroka(j+1).eq.probel)nomQ=nomstolb
cНаходимстолбецсназванием"Pst"
if(stroka(j-1).eq.probel.
*and.sj.eq."P".and.stroka(j+1).eq."s".and.
*stroka(j+2).eq."t".and.stroka(j+3).eq.probel)
*nomPst=nomstolb
37
cНаходимстолбецсназванием"P0"
if(stroka(j-1).eq.probel.
*and.sj.eq."P".and.stroka(j+1).eq."0".and.
*stroka(j+2).eq.probel)nomP0=nomstolb
cНаходимстолбецсназванием"TF"
if(sj.eq."T".and.stroka(j+1).eq."F")nomTF0=nomstolb
802continue
801continue
cПечатаемрезультатпоиска(номерстолбцасискомой
cинформацией)

38 Глава 1. Обработка текстовой информации
write(2,301)nomMach,nomAlpha,nomstolb,nomTF0
write(2,302)nomAlphaC,nomBetta,nomRe,nomCy,
*nomQ,nomPst,nomP0
301format('nomMach,nomAlpha,nomstolb,nomTF0',4i5)
302format('nomAlphaC,nomBetta,nomRe,nomCy,nomQ,
*nomPst,nomP0',7i5)
cКонецпоисканомерастолбцасискомойинформацией
cПереборвсехстрокданныхнайденногопротокола
c(впроведенныхэкспериментахбылозаписанонеболее100
cстрокданных)
do805i=1,100
read(20,'(1000a1)',end=15000,err=15005,iostat=iche)
*(stroka(j),j=1,jjj)
15005continue
cПослестрокданныхкаждогопротоколавфайле20
cзаписанастрокасозвездочками,котораяслужитпризнаком
cконцаданныхэтогопротокола.
cПроверяемусловиезавершениясчитываниястрокданных
if(stroka(3).eq.zwezda)goto15000
cСчитываемнужныеданныеизстрокивмассивrab
read(sstroka,*,end=15000,err=15000,iostat=iche)
*(rab(j),j=1,nomstolb)
cЗаполняемрезультатыпоискасодержаниястолбцов
wq0(i)=rab(nomQ)
if(nomQ.eq.1)write(2,*)'НенайденQ!!!'
wMach0(i)=rab(nomMach)
if(nomMach.eq.1)write(2,*)'НенайденM!!!'
Re0(i)=rab(nomRe)
if(nomRe.eq.1)write(2,*)'НенайденRe!!!'
Cy0(i)=rab(nomCy)

Пример 3. Поиск данных вфайле стаблицами
if(nomCy.eq.1)write(2,*)'НенайденCy!!!'
alpha(i)=rab(nomAlpha)
if(nomAlpha.eq.1)write(2,*)'Ненайденalpha!!!'
betta0(i)=rab(nomBetta)
if(nomBetta.eq.1)write(2,*)'Ненайденbetta!!!'
Pst0(i)=rab(nomPst)
if(nomPst.eq.1)write(2,*)'НенайденPst!!!'
P0(i)=rab(nomP0)
if(nomP0.eq.1)write(2,*)'НенайденP0!!!'
TF0(i)=rab(nomTF0)
if(nomTF0.eq.1)write(2,*)'НенайденTF0!!!'
cПечатаемрезультатпоисканужнойинформации
write(2,355)
*i,alpha(i),wMach0(i),wq0(i),Pst0(i),P0(i),TF0(i)
355format('i,alpha,Mach0,q0,Pst0,P0,TF0',i3,7g13.5)
805continue
cКонецпереборастрокданныхнайденногопротокола
39
15000continue
ntonow=i-1
write(2,321)ntonow
321format
*(/'Числоточекизмеренийвпротоколе',i5)
ntonowAl=ntonow
cВыходизподпрограммы
5557continue
return
end
Аналогичным образом могут быть построены другие процедуры об-
работки текстовой информации. Заметим, что при обработке сложных
имен полезным оказывается оператор equivalence, который иногда называют устаревшим ипредлагают удалить из языка FORTRAN.

40 Глава 1. Обработка текстовой информации
Операция сравнения может выполняться сиспользованием конкретных символов:
if(sj.eq."T".and.stroka(j+1).eq."F")
или символьных переменных, значения которых должны быть заранее
определены:
if(sj.eq.simMach)
Второй вариант оказывается удобнее, если параметр сравнения
(вданном случае simMach) сам изменяется входе выполнения программы.
Впримерах показаны переходы от цифровых данных ксимвольным
переменным иобратно:
—переход от символьной переменной (stroka(j+2)) кцифре (a)
read(stroka(j+2),*)a
—переход от цифры (nnn) ксимвольной переменной (nomer)
write(nomer,30)nnn
Здесь 30— метка формата, по которому переменная nnn записывается всимвольную переменную nomer.
Эти переходы открывают широкие возможности по организации вычислений, обработке исистематизации данных ссозданием иудалением
файлов идиректорий программными средствами.
Например, формируем, задаем или считываем имя директории
(namedir):
character(100)sstroka,lm,namedir
cСчитываемизсимвольнойпеременной(sstroka)
cимядиректории(namedir)
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
