Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Обработка текстовой и графической информации

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
☆
Пример 3. Поиск данных вфайле стаблицами
character(1)simQ datasimQ/"Q"/
cЗадаемзначенияискомыхпараметровпоумолчанию, cеслионипозднеенебудутнайденыврассматриваемомфайле cЗадалиограничение(100элементов) ntonowAl=100 ntonow=100 do777i=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 777continue
cИзфайла13считываемимявходногофайладанныхв cпеременнуюnameinAl read(13,'(a40)')nameinAl write(2,*)'Введеноимявходногофайла=',nameinAl cОткрываемфайлданных20сименем,заданномвпеременной cnameinAl open(unit=20,le=nameinAl,form='formatted', *status='old',access='sequential',iostat=iche) if(iche.eq.0)goto5558 write(2,*)'Ненайденфайл',nameinAl write(2,*)'Принимаемпараметрыпоумолчанию' goto5557 5558continue
31
cПечатаемномертребуемогопротоколаиспытаний write(2,1300)Nomprot 1300format('Номерпротокола',i5)
32 Глава 1. Обработка текстовой информации
cОчисткастрокитекста(заполняемпробеламивсюстроку) do11612jjj=1,1000 stroka(jjj)='' 11612continue cСоздаемкопиюпустойстроки sstroka000=sstroka
cИщемнужныйпротоколвфайле20(сименем,заданномв cпеременнойnameinAl) cПереборвсехстрокфайла20(задали1000000строк)
do11501iii=1,1000000
cОчисткастроки sstroka=sstroka000 cСчитываниестрокиизфайла20 read *(20,'(1000a1)',advance='no',end=15000,err=11601, *iostat=iche)(stroka(jjj),jjj=1,1000)
11601continue cСчитываемсимволыпоформату1000a1.Строкунепродвигаем, cприобнаруженииконцафайлапереходимкоператорусметкой c15000,приобнаруженииошибкисчитыванияпереходимк cоператорусметкой11601.
cИщемвстрокеслово«Протокол» do11602jjj=1,992 do11603j8=1,8 sim8(j8)=stroka(jjj+j8) 11603continue if(simwol.ne.simprot)goto11602 do11605j5=1,5 sim5(j5)=stroka(jjj+8+j5) 11605continue
Пример 3. Поиск данных вфайле стаблицами
goto11604 11602continue 11604continue
cНашливстрокеслово«Протокол».Определяемномер cпротокола if(simwol.ne.simprot)goto11501 read(simnomprot,'(i5)')nom write(2,*)'Найденпротокол№',nom cСравниваемнайденныйвфайленомерпротокола cстребуемымномеромпротокола if(Nomprot.ne.nom)goto11501 goto11511 11501continue
write(2,*)'Протокол№',Nomprot,'вфайледанных', *nameinAl,'ненайден' cИдемнавыход,таккакнужногопротоколавфайледанных cнеоказалось goto5557
33
11511continue write(2,*)'Протокол№',Nomprot,'вфайледанных *',nameinAl, *'найден'
cОпределениевременисозданиямассиваданных c(оно,вэтомпримере,хранитсявфайлепротокола) do12602jjj=1,992 do12603j4=1,4 sim4(j4)=stroka(jjj+j4) 12603continue if(simd4.ne.simdata)goto12602 do12605j20=1,20
34 Глава 1. Обработка текстовой информации
sim20(j20)=stroka(jjj+4+j20) 12605continue goto12604 12602continue 12604continue 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Переборвсехсимволовстроки do81j=1,jjj sj=stroka(j) if(sj.eq.tabul)stroka(j)=probel 81continue
cПереборвсехсимволовстроки do801j=1,jjj cВыделяемэлементстрокивотдельнуюпеременную sj=stroka(j) if(sj.eq.probel)kkk=1 if(sj.eq.probel)goto802 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
802continue 801continue
cПечатаемрезультатпоиска(номерстолбцасискомой cинформацией)
38 Глава 1. Обработка текстовой информации
write(2,301)nomMach,nomAlpha,nomstolb,nomTF0 write(2,302)nomAlphaC,nomBetta,nomRe,nomCy, *nomQ,nomPst,nomP0 301format('nomMach,nomAlpha,nomstolb,nomTF0',4i5) 302format('nomAlphaC,nomBetta,nomRe,nomCy,nomQ, *nomPst,nomP0',7i5) cКонецпоисканомерастолбцасискомойинформацией
cПереборвсехстрокданныхнайденногопротокола c(впроведенныхэкспериментахбылозаписанонеболее100 cстрокданных) do805i=1,100 read(20,'(1000a1)',end=15000,err=15005,iostat=iche) *(stroka(j),j=1,jjj) 15005continue
cПослестрокданныхкаждогопротоколавфайле20 cзаписанастрокасозвездочками,котораяслужитпризнаком cконцаданныхэтогопротокола. cПроверяемусловиезавершениясчитываниястрокданных if(stroka(3).eq.zwezda)goto15000
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) 355format('i,alpha,Mach0,q0,Pst0,P0,TF0',i3,7g13.5) 805continue cКонецпереборастрокданныхнайденногопротокола
39
15000continue ntonow=i-1 write(2,321)ntonow 321format *(/'Числоточекизмеренийвпротоколе',i5) ntonowAl=ntonow cВыходизподпрограммы 5557continue 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)
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]