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

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

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
☆
Пример 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 datanamein/"Группа№"/ cСвязываеммассивсимвольныхпеременныхnameinnn(20)с cсимвольнымипеременнымиnameinиnomerчерезобщиеячейки cпамятиоператоромequivalence. cЭтотприемпозволяетпосимвольноформировать cсложныеимена equivalence(nameinnn(1),namein) equivalence(nameinnn(11),nomer) cПеребираемспискигрупп cПеребор.Номерфакультета(впримерерассматриваетсядо10 cфакультетов) do1nomfak=1,10 cПеребор.Номеркурса(впримерерассматривается6курсов) do2kurs=1,6 cПеребор.Номергруппынакурсе
24 Глава 1. Обработка текстовой информации
c(впримерерассматриваетсядо20группнакурсе) do3ngrupp=1,20 cОпределяемномергруппы nnn=1000*nomfak+100*kurs+ngrupp 30format(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)goto3 cВызвалиподпрограммусортировкитекста(спискастудентов cгруппы) callSortText cЗакрылифайл5 close(5) 3continue 2continue 1continue
Если имена входных файлов не систематизированы и каждое имя имеет оригинальный вид, то можно организовать последовательное счи­тывание таких имен (имен входных файлов) из отдельного файла дан­ных (например, из файла 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!!!File10.txt *отсутствует!' if(iche.ne.0)goto5 cФайл10успешнооткрылся,продолжаемработу. cПеребираемназваниягруппстудентов c(вданномслучаеограничилиськоличествомгрупп, cравным1000) do4ngrupp=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)goto4 cФайл5открыт.Вызвалиподпрограммусортировкитекста callSortText cЗакрылифайл5 close(5) 4continue 5continue
25
Измененный список может быть вновь записан в имеющийся файл
со старым названием. Для этого можно закрыть файл 5 после считыва­ния всех строк текстового файла и, не меняя его имени, снова его от­крыть, после чего записать вэтот файл обновленный список:
cПечатаемсписок(сномеромстроки)вфайл5 c(впримере1меняемоператор
26 Глава 1. Обработка текстовой информации
cwrite(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оператора rewind5 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) 101continue j100=jj-1 write(*,*)'j100=',j100 write(*,*)stroka j98=j100-2 cПеребираемсимволывстроке do1j=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 1continue 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. Поиск данных в файле с таблицами
Рассматривается вариант поиска нужной информации вфайле, содер­жащем таблицы данных. Таблицы истолбцы этих таблиц могут распола­гаться в файле в произвольном порядке, но они имеют заголовки, по которым осуществляется поиск исчитывание данных.
SubroutineParm(ntonow,Nomprot,nameinAl) cПоумолчаниюиспользуемданныевещественноготипа cдвойнойточности
Пример 3. Поиск данных вфайле стаблицами
implicitreal*8(a-h,o-z) real*8rab(500),alpha,betta0,wMach0,Re0,Cy0,wq0,Pst0,P0 cИспользуемименованнуюобщуюобластьпамяти ccommon/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),nl31(3) character(1)zwezda,tabul,probel,tchk,zpt,apo character(1)stroka19(1400) character(3)nle3,nle30 cСвязываемсимвольныепеременныеимассивысимвольных cпеременных,размещаяихвобщейобластипамяти.Это cпозволяетпрограммнымисредствамисоздаватьсложные cимена,работаясотдельнымипростымисимволами equivalence(stroka(1),sstroka) equivalence(nl31(1),nle3) cЗадаемзначениясимвольныхпеременных datatchk/"."/ datazpt/","/ datatabul/" "/ dataprobel/""/ datazwezda/"*"/ datanle30/"000"/
29
integer*4istroka(23) character(8)simprot datasimprot/"Протокол"/
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 datasimdata/"Дата"/ character(4)simd4 character(1)sim4(4) equivalence(sim4(1),simd4) character(1)sim20(20) cЧислоМ character(1)simMach datasimMach/"M"/ cУголAlpha character(1)simAlpha(2) datasimAlpha(1)/"A"/ datasimAlpha(2)/"L"/ character(1)simpodch,simC datasimpodch/"_"/ datasimC/"C"/ cУголBetta character(1)simBetta(2) datasimBetta(1)/"B"/ datasimBetta(2)/"E"/ cЧислоRe character(1)simRe(2) datasimRe(1)/"R"/ datasimRe(2)/"e"/ character(1)simCy(2) datasimCy(1)/"C"/ datasimCy(2)/"y"/
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]