Содержание
Содержание
Введение ............................................................................................... 4
ГЛАВА 1. Обработка текстовой информации ..................................... 11
Пример 1. Сортировка строк текста (в данном случае
списка литературы) ............................................................ 11
Пример 2. Выполнение арифметических операций .................... 27
Пример 3. Поиск данных в файле с таблицами ........................... 28
ГЛАВА 2. Обработка графической информации ................................ 42
Пример 4. Определение координат точек графика ...................... 43
Пример 5. Подпрограммы рисования символов ......................... 56
Пример 6. Округление значений параметров .............................. 61
Пример 7. Выполнение функций под управлением
кнопок мыши ...................................................................... 62
Пример 8. Организация режима диалога ..................................... 68
Пример 9. Ввод цифровых данных с клавиатуры ........................ 96
Пример 10. Рисование графиков (фрагменты программы) ........ 101
Пример 11. Использование буфера для хранения
и повторного вывода на экран части рисунка ................... 140
Пример 12. Рисование поверхности объекта
(фрагменты программы) .................................................... 143
Пример 13. Просмотр фильма (серии готовых рисунков
в формате *.BMP) ............................................................... 165
Заключительные замечания ................................................................. 170
Литература ............................................................................................ 172
Введение
Развитие вычислительной техники и программного обеспечения
привело к широкому распространению коммерческих программ. Коли-
чество потребителей многократно выросло, а количество независимых
производителей сократилось. Многие перестали развивать собственные
разработки и превратились в обычных пользователей, тратя время на
поиски готовых программ и средств на их закупку, хотя в большинстве
случаев поставленные задачи могли бы быть решены с меньшими затра-
тами собственными силами. В этой связи в книге приведены примеры,
показывающие, что простыми средствами FORTRANа можно самостоя-
тельно получить требуемое решение, не прибегая к услугам сторонних
производителей. Аналогичным образом могут быть написаны програм-
мы и на других языках программирования.
Язык FORTRAN (FORmula TRANslation) многие годы используется
при создании вычислительных программ, в том числе комплексов про-
грамм, предназначенных для решения научных и технических задач
(прочности, аэрогидродинамики, аэроупругости и др.). Эти программы
развиваются, поддерживаются, регулярно обновляются и широко ис-
пользуются в инженерной практике.
FORTRAN имеет богатую историю. Он стал первым языком про-
граммирования высокого уровня. Его первая версия была разработана
еще в середине прошлого века, когда мир электронно-вычислительных
машин (ЭВМ) ограничивался единичными экземплярами ламповых
цифровых вычислительных машин. Существовал весьма узкий круг
специалистов, способных писать программы к этим машинам и прово-
дить расчеты. Создание FORTRANа стало большим шагом вперед с точ-
ки зрения программирования и внедрения цифровых ЭВМ в инженер-
ную практику, так как этот язык существенно упростил и ускорил про-
цедуры написания и отладки программ по сравнению с существующими
в те годы вариантами, использующими машинные коды. Заметим, что
в те времена, помимо цифровых машин, развивались и аналоговые
ЭВМ, которые обеспечивали высокую скорость вычислений, но были
ограничены в количестве преобразований, так как с каждой операцией
происходило быстрое накопление ошибок вычислений, возникали
и другие трудности при их использовании. С дальнейшим развитием
и совершенствованием цифровых ЭВМ, их распространением и расши-
рением области применения создавались новые версии FORTRANа, ко-
торые позволили адаптировать язык к новым условиям. Были разрабо-
таны и другие языки программирования, ориентированные на решение
различных прикладных задач.
С появлением новых языков высокого уровня делались заявления об
их «неоспоримых» преимуществах перед другими языками программи-
рования. Предлагалось прекратить использование «устаревших» язы-
ков, в том числе FORTRANа. Далее возникала типичная ситуация: сле-
дуя обещаниям, некоторые любознательные программисты предприни-
мали попытки переписывания уже существующих программ с языка
FORTRAN на новые языки, что само по себе связано с весьма значи-
тельными трудозатратами, особенно если речь идет о больших програм-
мах. В этой связи заметим, что крупные комплексы программ создаются
группами специалистов в течение многих лет и десятилетий. После на-
писания и отладки новых версий программ проводились сравнения. Как
правило, существенные преимущества у нового языка не обнаружива-
лись, обещания оставались обещаниями. Нередко старые программы на
FORTRANе оказывались более эффективными в вычислительном пла-
не, чем новые. Интерес к новинке пропадал. За прошедшие десятилетия
подобные ситуации повторялись неоднократно. Поэтому, несмотря на
некоторый прогресс в развитии языков программирования, FORTRAN
до сих пор используется при создании вычислительных программ.
Справедливости ради отметим, что, сохраняя основу языка,
FORTRAN регулярно обновлялся и обновляется. Он подвергался много-
численным изменениям, особенно в последние годы. Это связано с раз-
витием ЭВМ, изменением их архитектуры, изменением баланса между
объемами памяти и производительностью, с внедрением многопроцес-
сорных ЭВМ, с появлением новых периферийных устройств и адапта-
цией к новым операционным системам, программному обеспечению.
Одной из причин появления новых версий языка является программи-
рование графических приложений, без которых сегодня трудно предста-
вить работу ЭВМ.
Развитие методов построения и обработки графиков, обработки фо-
тографий, создания фильмов и компьютерных игр привело к разработке
специализированных программ и языков программирования. Они по-
зволяют эффективно решать подобные специфические задачи, в пол-
ной мере используя ресурсы графических процессоров, многочислен-
ные приемы упрощения геометрических построений и ускорений вы-
числений. Поэтому вряд ли имеет смысл пытаться использовать для этих
целей программы, написанные на языке FORTRAN. Вместе с тем нако-
пленный положительный опыт решения научных и технических задач
свидетельствует о целесообразности дальнейшего развития существую-
щих программ, их поддержки и адаптации к новым условиям.
Проблема визуализации данных, полученных с помощью программ,
написанных на языке FORTRAN, может быть решена следующим обра-
зом:
— подключением модулей, написанных на других языках програм-
мирования;
— написанием графических приложений на языке FORTRAN;
— передачей данных в специализированные программы обработки
графической информации.
Перечисленные способы имеют свои преимущества и недостатки.
Основными доводами в пользу применения графических модулей, на-
писанных на языке FORTRAN, являются соответствие форматов дан-
ных, передаваемых из расчетных модулей в графические, возможность
подключения графических модулей в любом месте вычислительной
программы, отображения данных в графическом виде в ходе выполне-
ния программы и при ее отладке, отсутствие необходимости углублен-
ного изучения одновременно нескольких языков программирования
и поддержки их многочисленных версий и обновлений, отсутствие не-
обходимости согласования исполняемых модулей, написанных на раз-
ных языках, поддержки нескольких библиотек одновременно, устране-
ния конфликтных ситуаций, связанных с совпадающими именами под-
ключаемых модулей различных библиотек, меньшие затраты при
переходе с одних ЭВМ на другие и на другие операционные системы.
Естественно, все эти трудности могут быть преодолены. Програм-
мист сам может выбирать способ решения проблемы: написать свою
полностью «независимую» программу или просто подключить свою вы-
числительную программу к набору «черных ящиков» сторонних произ-
водителей. Второй способ не требует больших усилий, но он ограничи-
вает свободу действий, затрудняет модернизацию и перенос программ,
так как это должно быть согласовано с производителями используемого
программного обеспечения. Обновления подобных программ нередко
связаны с покупками новых версий «черных ящиков». По существу,
программист превращается в потребителя услуг. Логическим продолже-
нием такого подхода являются отказ от собственных разработок и окон-
чательный переход на коммерческие продукты сторонних производите-
лей.
Основными недостатками применения графических модулей, напи-
санных на языке FORTRAN, являются некоторые ограничения языка
и менее высокая скорость выполнения графических приложений. Сле-
дует отметить, что графические приложения FORTRANа позволяют
управлять цветом и яркостью каждой отдельной точки (пикселя) экрана.
Это дает возможность при определенном опыте программирования соз-
давать и обрабатывать сколь угодно сложные рисунки. Таким образом,
вопрос о применении языка FORTRAN заключается лишь в удобстве
написания графических программ и времени их выполнения. Заметим,
что пользователей не интересует, на каком именно языке написана про-
грамма графической обработки, когда они рассматривают изображение
на экране. Не имеет значения, с помощью каких программ нарисовали
график или вывели текст на экран, важен сам график и сам текст.
Для предварительного ознакомления с особенностями языка
FORTRAN можно рекомендовать публикации, приведенные в списке
литературы. В данной книге вопросы программирования графических
приложений рассмотрены на примерах решения частных задач. Также
в книге приведены несколько простых примеров обработки текстовой
информации с целью демонстрации приемов применения языка
FORTRAN при создании такого рода приложений. Тексты программ со-
провождаются подробными комментариями. Для удобства изложения
тексты не оптимизированы. Они служат для демонстрации способов ре-
шения задач и могут быть улучшены. На основе типовых приемов, пред-
ставленных в этих примерах, достаточно просто могут быть реализова-
ны свои версии программ обработки текстовых и графических файлов.
Комментарии облегчают перевод текстов на другие языки. В случае не-
обходимости может быть повышена производительность программ.
В частности, могут быть применены более быстрые процедуры сорти-
ровки. При обработке большого количества файлов на многопроцессор-
ных ЭВМ каждому процессору может быть выделен свой файл; при об-
работке графиков медленная процедура последовательного рисования
линий от точки к точке может быть заменена более быстрой процедурой
рисования многоугольника; при обработке сложных рисунков каждый
процессор может обрабатывать свою часть рисунка. При создании мно-
гочисленных кадров фильма повторяющиеся элементы могут быть зане-
сены в буфер и извлекаться из него без повторного формирования. Это
касается и применения «медленных» процедур установки шрифтов.
Предложения, слова и отдельные символы при многократном вызове
иногда целесообразно запоминать в буфере и извлекать из него при не-
обходимости. Могут быть использованы и другие средства повышения
эффективности программ. Приемы и примеры оптимизации программ
изложены в специализированной литературе. В технических приложе-
ниях в большинстве случаев используются графики сравнительно про-
стого вида, не требующие больших вычислительных затрат. Эти графики
легко могут быть реализованы собственными средствами, без использо-
вания дополнительных коммерческих программ.
Заметим, что в отличие от вычислительных программ обработка
графической информации не всегда требует высокой производитель-
ности, так как обновление экрана происходит со сравнительно низкой
частотой (порядка 60 Гц), время реакции человека составляет от не-
сколько десятых долей секунды до нескольких секунд. В диалоговом
режиме работы с ЭВМ чаще всего «слабым звеном» оказывается чело-
век. При оформлении результатов уже после проведения исследований
основное время тратится на поиск нужных файлов с данными, а не на
построение графиков. В таких случаях длительность формирования
выводимого на экран кадра не столь важна. Быстродействие важно
в случаях включения графических модулей непосредственно в вычис-
лительную процедуру с целью обеспечения контроля сходимости ре-
шения в итерационном процессе. При наличии многих миллионов уз-
лов расчетной сетки и сотен тысяч итераций трудоемкость графиче-
ской обработки может оказаться существенной. В этих случаях имеет
смысл использовать графические построения с некоторым достаточно
большим шагом по итерациям, передачу данных в параллельно работа-
ющую независимую графическую программу через общие буферные
файлы. С развитием ЭВМ, с распространением версий FORTRANа,
поддерживающих многопроцессорную обработку, в том числе исполь-
зующих ресурсы графических процессоров, скорость обработки гра-
фиков растет, и можно ожидать, что задача ускорения вычислений ста-
нет менее актуальной.
Так как версии FORTRANа работают с файлами рисунков формата
*.BMP, которые занимают значительные объемы памяти, то при нали-
чии многочисленных файлов с рисунками целесообразно использовать
архиваторы, преобразующие их в другой, сжатый формат, например *.jpg.
Как правило, это позволяет многократно сократить требуемые объемы
памяти без существенной потери качества изображения. В случае необ-
ходимости повторной обработки таких файлов выполняется обратное
преобразование в формат *.BMP. Это замечание касается и подключе-
ния различных «заставок» в виде фотографий, рисунков, графиков, по-
лученных другими средствами и хранящихся в других форматах.
Алгоритмы обработки изображений, описания версий языка
FORTRAN и приемы программирования графических процедур доста-
точно подробно изложены в литературе [1—28]. Поэтому многие общие
вопросы, связанные с правилами написания программ на FORTRANе
и геометрическими построениями, в книге не затрагиваются. Внимание
уделено лишь некоторым особенностям программирования, которые
могут представлять интерес для разработчиков программного обеспече-
ния и студентов технических вузов.
В примерах приведены тексты программ в традиционном фиксиро-
ванном формате. Файлы имеют вид (расширение) *.f или *.for. Коммен-
тарии отмечены латинской буквой «c» в первой колонке. Они не влияют
на работу программы и могут быть удалены. Метки операторов распола-
гаются в первых пяти колонках. Строки продолжения отмечены симво-
лом «*» в шестой колонке. Тексты программ (операторы FORTRANа)
записаны в колонках 7—72. Примеры демонстрируют приемы обработ-
ки графической и текстовой информации простыми средствами языка
FORTRAN. Эти приемы могут быть применены и при использовании
других языков программирования.
ГЛАВА 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,file=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) go to 1000
c Открыли выходной файл 6 с именем "6.txt" OPEN (UNIT=6,FILE='6.txt')
c Вызвали подпрограмму сортировки текста call SortText
c Выход из программы 1000 continue
stop end
c Подпрограмма сортировки текста
subroutine SortText
c Выделили массивы для обработки текста c (до 2000 строк по 1000 символов)
c Задали значение символьной переменной probel data probel/" "/
c Ограничили число строк текста nstrok=2000
c Считывание текста из файла (в примере из файла №5) c Перебор строк данных
do 50 i=1,nstrok
c Считывание одной строки из файла данных (5). c Поочередно считываем символы строки.
read
*(5,'(1000a1)',advance='no',end=5557,err=101,iostat=iche)
* (stroka(j),j=1,1000)
101 continue
c В случае, если количество символов в строке меньше заданной c величины (в данном случае 1000), выходим из цикла
c считывания символов и идем к оператору (101 continue).
c В случае, если в файле число строк меньше заданного значения, c выходим из цикла считывания строк и идем к оператору
c (5557 continue).
c Определили длину считанной строки jstr jstr=j
c Записали считанную строку в массив text(i,j) do 2 j=1,jstr
2 text(i,j)= stroka(j)
c Очистили "хвост" строки от посторонних символов c (заполнили пробелами)
jstrp1=jstr+1
do 22 j=jstrp1,1000
22 text(i,j)= probel
c Распечатали считанную строку текста в файле 2 (для контроля) write (2,*) (text(i,j),j=1,jstr)
50 continue
cКонец считывания текста из файла (5)
5557 continue
nst=i-1 write (2,*)
write (2,*) 'Число строк текста =',nst write (2,*)
c Сортировка текста
nstrokm1= nst-1
c Первая строка (stroka1). Перебор первых строк do 3 i=1,nstrokm1
ip1=i+1
c Вторая строка (stroka2). Перебор вторых строк, c расположенных ниже первой строки
do 103 i1=ip1,nst
c Перебор первых 10 столбцов строки №1 (пример).
c Пропускаем цифры (старый номер строки №1
c в списке литературы).
c Ищем номер позиции первой буквы в текстовой строке j1=0
do 14 j=1,10 bukwa1= text(i,j)
call kodd(bukwa1,kod1) if(kod1.ge.1) j1=j if(kod1.ge.1) go to 114
14 continue
114 continue
if(j1.eq.0) go to 3
j2=0
c Перебор первых 20 столбцов строки №2.
c Пропускаем старый номер строки №2 в списке литературы. c Ищем первую букву
do 15 j=1,20 bukwa2= text(i1,j)
call kodd(bukwa2,kod2) if(kod2.ge.1) j2=j if(kod2.ge.1) go to 115
15 continue
115 continue
if(j2.eq.0) go to 103
c Задаем метку повторения строк metkapowt=0
c Сравниваем содержания строк №1 и №2.
c Последовательно перебираем буквы в строках c (в примере проверяем первые 500 символов)
do 4 j=1,500
bukwa1= text(i, j+j1-1) bukwa2= text(i1,j+j2-1) call kodd(bukwa1,kod1) call kodd(bukwa2,kod2)
c Если буквы строк разные, меняем метку повторения строк if(kod1.ne.kod2) metkapowt=metkapowt+1
c Сравниваем буквы (по номерам их кодов).
c Идем на перестановку строк местами,
c если сравниваемые буквы расположены не в заданном порядке if(kod1.gt.kod2) go to 5
c Обнаружены одинаковые буквы, переходим на сравнение c следующих букв строк
if(kod1.eq.kod2) go to 4
c Строки расположены в правильном порядке, c переходим к сравнению следующей строки
c (берем следующую строку №2) go to 13
4 continue
c Переходим к сравнению следующей строки c (берем следующую строку №2)
go to 13
c перестановка строк местами (переставляем символы)
5 continue
c write (2,*) 'Переставляем строки'
c write (2,*) (text(i,jj) ,jj=1,100)
c write (2,*) (text(i1,jj),jj=1,100)
c write (2,*) do 6 j=1,1000
bukwa1 =text(i,j) text(i,j) =text(i1,j) text(i1,j)=bukwa1
6 continue
c write (2,*) 'Строки после перестановки' c write (2,*) (text(i,jj) ,jj=1,100)
c write (2,*) (text(i1,jj),jj=1,100)
c write (2,*)
c Конец перестановки строк
13 continue
c Заполняем пробелами повторяющуюся копию строки if(metkapowt.ne.0) go to 103
do 16 j=1,1000
text(i1,j)=probel
16 continue
103 continue
c Конец перебора строк №2
3 continue
c Конец перебора строк №1
write (2,*) write (2,*)
write (2,*) ' Результат сортировки' write (2,*)
c Перебор строк данных (в примере запись результата в файл №6) nomer=0
do 60 i=1,nst
c Пропускаем старый номер строки j1=0
c Проверяем первые 10 символов строки do 1240 j=1,10
bukwa1= text(i,j)
call kodd(bukwa1,kod1) if(kod1.ge.1) j1=j if(kod1.ge.1) go to 1214
c Стираем старый номер строки текста (заполняем пробелами) text(i,j)=probel
1240 continue
1214 continue
if(j1.le.0) j1=1 jk=0
kod1sum=0
c Перебираем символы строки do 61 j=j1,1000 bukwa1= text(i, j)
c Определяем код символа
call kodd(bukwa1,kod1) if(kod1.ne.0) jk=j
if(kod1.ne.0) kod1sum=kod1sum+1
61 continue
c Количество символов в строке без учета пробелов (kod1sum) if(kod1sum.le.0) go to 60
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)
60 continue
cКонец записи текста в файл 6.txt
5000 continue stop
end
Заметим, что в современных версиях FORTRANа имеются процеду- ры, с помощью которых можно создать другие варианты программы, решающей поставленную задачу. В представленных примерах реализованы наиболее простые средства, которые используют традиционные формы языка. Применение расширенных версий языка минимизировано в связи с тем, что они чаще подвержены изменениям и иногда различаются у производителей программного обеспечения.
Развитие вычислительной техники и программного обеспечения
привело к широкому распространению коммерческих программ. Коли-
чество потребителей многократно выросло, а количество независимых
производителей сократилось. Многие перестали развивать собственные
разработки и превратились в обычных пользователей, тратя время на
поиски готовых программ и средств на их закупку, хотя в большинстве
случаев поставленные задачи могли бы быть решены с меньшими затра-
тами собственными силами. В этой связи в книге приведены примеры,
показывающие, что простыми средствами FORTRANа можно самостоя-
тельно получить требуемое решение, не прибегая к услугам сторонних
производителей. Аналогичным образом могут быть написаны програм-
мы и на других языках программирования.
Язык FORTRAN (FORmula TRANslation) многие годы используется
при создании вычислительных программ, в том числе комплексов про-
грамм, предназначенных для решения научных и технических задач
(прочности, аэрогидродинамики, аэроупругости и др.). Эти программы
развиваются, поддерживаются, регулярно обновляются и широко ис-
пользуются в инженерной практике.
FORTRAN имеет богатую историю. Он стал первым языком про-
граммирования высокого уровня. Его первая версия была разработана
еще в середине прошлого века, когда мир электронно-вычислительных
машин (ЭВМ) ограничивался единичными экземплярами ламповых
цифровых вычислительных машин. Существовал весьма узкий круг
специалистов, способных писать программы к этим машинам и прово-
дить расчеты. Создание FORTRANа стало большим шагом вперед с точ-
ки зрения программирования и внедрения цифровых ЭВМ в инженер-
ную практику, так как этот язык существенно упростил и ускорил про-
цедуры написания и отладки программ по сравнению с существующими
в те годы вариантами, использующими машинные коды. Заметим, что
в те времена, помимо цифровых машин, развивались и аналоговые
ЭВМ, которые обеспечивали высокую скорость вычислений, но были
ограничены в количестве преобразований, так как с каждой операцией
происходило быстрое накопление ошибок вычислений, возникали
и другие трудности при их использовании. С дальнейшим развитием
и совершенствованием цифровых ЭВМ, их распространением и расши-
рением области применения создавались новые версии FORTRANа, ко-
торые позволили адаптировать язык к новым условиям. Были разрабо-
таны и другие языки программирования, ориентированные на решение
различных прикладных задач.
С появлением новых языков высокого уровня делались заявления об
их «неоспоримых» преимуществах перед другими языками программи-
рования. Предлагалось прекратить использование «устаревших» язы-
ков, в том числе FORTRANа. Далее возникала типичная ситуация: сле-
дуя обещаниям, некоторые любознательные программисты предприни-
мали попытки переписывания уже существующих программ с языка
FORTRAN на новые языки, что само по себе связано с весьма значи-
тельными трудозатратами, особенно если речь идет о больших програм-
мах. В этой связи заметим, что крупные комплексы программ создаются
группами специалистов в течение многих лет и десятилетий. После на-
писания и отладки новых версий программ проводились сравнения. Как
правило, существенные преимущества у нового языка не обнаружива-
лись, обещания оставались обещаниями. Нередко старые программы на
FORTRANе оказывались более эффективными в вычислительном пла-
не, чем новые. Интерес к новинке пропадал. За прошедшие десятилетия
подобные ситуации повторялись неоднократно. Поэтому, несмотря на
некоторый прогресс в развитии языков программирования, FORTRAN
до сих пор используется при создании вычислительных программ.
Справедливости ради отметим, что, сохраняя основу языка,
FORTRAN регулярно обновлялся и обновляется. Он подвергался много-
численным изменениям, особенно в последние годы. Это связано с раз-
витием ЭВМ, изменением их архитектуры, изменением баланса между
объемами памяти и производительностью, с внедрением многопроцес-
сорных ЭВМ, с появлением новых периферийных устройств и адапта-
цией к новым операционным системам, программному обеспечению.
Одной из причин появления новых версий языка является программи-
рование графических приложений, без которых сегодня трудно предста-
вить работу ЭВМ.
Развитие методов построения и обработки графиков, обработки фо-
тографий, создания фильмов и компьютерных игр привело к разработке
специализированных программ и языков программирования. Они по-
зволяют эффективно решать подобные специфические задачи, в пол-
ной мере используя ресурсы графических процессоров, многочислен-
ные приемы упрощения геометрических построений и ускорений вы-
числений. Поэтому вряд ли имеет смысл пытаться использовать для этих
целей программы, написанные на языке FORTRAN. Вместе с тем нако-
пленный положительный опыт решения научных и технических задач
свидетельствует о целесообразности дальнейшего развития существую-
щих программ, их поддержки и адаптации к новым условиям.
Проблема визуализации данных, полученных с помощью программ,
написанных на языке FORTRAN, может быть решена следующим обра-
зом:
— подключением модулей, написанных на других языках програм-
мирования;
— написанием графических приложений на языке FORTRAN;
— передачей данных в специализированные программы обработки
графической информации.
Перечисленные способы имеют свои преимущества и недостатки.
Основными доводами в пользу применения графических модулей, на-
писанных на языке FORTRAN, являются соответствие форматов дан-
ных, передаваемых из расчетных модулей в графические, возможность
подключения графических модулей в любом месте вычислительной
программы, отображения данных в графическом виде в ходе выполне-
ния программы и при ее отладке, отсутствие необходимости углублен-
ного изучения одновременно нескольких языков программирования
и поддержки их многочисленных версий и обновлений, отсутствие не-
обходимости согласования исполняемых модулей, написанных на раз-
ных языках, поддержки нескольких библиотек одновременно, устране-
ния конфликтных ситуаций, связанных с совпадающими именами под-
ключаемых модулей различных библиотек, меньшие затраты при
переходе с одних ЭВМ на другие и на другие операционные системы.
Естественно, все эти трудности могут быть преодолены. Програм-
мист сам может выбирать способ решения проблемы: написать свою
полностью «независимую» программу или просто подключить свою вы-
числительную программу к набору «черных ящиков» сторонних произ-
водителей. Второй способ не требует больших усилий, но он ограничи-
вает свободу действий, затрудняет модернизацию и перенос программ,
так как это должно быть согласовано с производителями используемого
программного обеспечения. Обновления подобных программ нередко
связаны с покупками новых версий «черных ящиков». По существу,
программист превращается в потребителя услуг. Логическим продолже-
нием такого подхода являются отказ от собственных разработок и окон-
чательный переход на коммерческие продукты сторонних производите-
лей.
Основными недостатками применения графических модулей, напи-
санных на языке FORTRAN, являются некоторые ограничения языка
и менее высокая скорость выполнения графических приложений. Сле-
дует отметить, что графические приложения FORTRANа позволяют
управлять цветом и яркостью каждой отдельной точки (пикселя) экрана.
Это дает возможность при определенном опыте программирования соз-
давать и обрабатывать сколь угодно сложные рисунки. Таким образом,
вопрос о применении языка FORTRAN заключается лишь в удобстве
написания графических программ и времени их выполнения. Заметим,
что пользователей не интересует, на каком именно языке написана про-
грамма графической обработки, когда они рассматривают изображение
на экране. Не имеет значения, с помощью каких программ нарисовали
график или вывели текст на экран, важен сам график и сам текст.
Для предварительного ознакомления с особенностями языка
FORTRAN можно рекомендовать публикации, приведенные в списке
литературы. В данной книге вопросы программирования графических
приложений рассмотрены на примерах решения частных задач. Также
в книге приведены несколько простых примеров обработки текстовой
информации с целью демонстрации приемов применения языка
FORTRAN при создании такого рода приложений. Тексты программ со-
провождаются подробными комментариями. Для удобства изложения
тексты не оптимизированы. Они служат для демонстрации способов ре-
шения задач и могут быть улучшены. На основе типовых приемов, пред-
ставленных в этих примерах, достаточно просто могут быть реализова-
ны свои версии программ обработки текстовых и графических файлов.
Комментарии облегчают перевод текстов на другие языки. В случае не-
обходимости может быть повышена производительность программ.
В частности, могут быть применены более быстрые процедуры сорти-
ровки. При обработке большого количества файлов на многопроцессор-
ных ЭВМ каждому процессору может быть выделен свой файл; при об-
работке графиков медленная процедура последовательного рисования
линий от точки к точке может быть заменена более быстрой процедурой
рисования многоугольника; при обработке сложных рисунков каждый
процессор может обрабатывать свою часть рисунка. При создании мно-
гочисленных кадров фильма повторяющиеся элементы могут быть зане-
сены в буфер и извлекаться из него без повторного формирования. Это
касается и применения «медленных» процедур установки шрифтов.
Предложения, слова и отдельные символы при многократном вызове
иногда целесообразно запоминать в буфере и извлекать из него при не-
обходимости. Могут быть использованы и другие средства повышения
эффективности программ. Приемы и примеры оптимизации программ
изложены в специализированной литературе. В технических приложе-
ниях в большинстве случаев используются графики сравнительно про-
стого вида, не требующие больших вычислительных затрат. Эти графики
легко могут быть реализованы собственными средствами, без использо-
вания дополнительных коммерческих программ.
Заметим, что в отличие от вычислительных программ обработка
графической информации не всегда требует высокой производитель-
ности, так как обновление экрана происходит со сравнительно низкой
частотой (порядка 60 Гц), время реакции человека составляет от не-
сколько десятых долей секунды до нескольких секунд. В диалоговом
режиме работы с ЭВМ чаще всего «слабым звеном» оказывается чело-
век. При оформлении результатов уже после проведения исследований
основное время тратится на поиск нужных файлов с данными, а не на
построение графиков. В таких случаях длительность формирования
выводимого на экран кадра не столь важна. Быстродействие важно
в случаях включения графических модулей непосредственно в вычис-
лительную процедуру с целью обеспечения контроля сходимости ре-
шения в итерационном процессе. При наличии многих миллионов уз-
лов расчетной сетки и сотен тысяч итераций трудоемкость графиче-
ской обработки может оказаться существенной. В этих случаях имеет
смысл использовать графические построения с некоторым достаточно
большим шагом по итерациям, передачу данных в параллельно работа-
ющую независимую графическую программу через общие буферные
файлы. С развитием ЭВМ, с распространением версий FORTRANа,
поддерживающих многопроцессорную обработку, в том числе исполь-
зующих ресурсы графических процессоров, скорость обработки гра-
фиков растет, и можно ожидать, что задача ускорения вычислений ста-
нет менее актуальной.
Так как версии FORTRANа работают с файлами рисунков формата
*.BMP, которые занимают значительные объемы памяти, то при нали-
чии многочисленных файлов с рисунками целесообразно использовать
архиваторы, преобразующие их в другой, сжатый формат, например *.jpg.
Как правило, это позволяет многократно сократить требуемые объемы
памяти без существенной потери качества изображения. В случае необ-
ходимости повторной обработки таких файлов выполняется обратное
преобразование в формат *.BMP. Это замечание касается и подключе-
ния различных «заставок» в виде фотографий, рисунков, графиков, по-
лученных другими средствами и хранящихся в других форматах.
Алгоритмы обработки изображений, описания версий языка
FORTRAN и приемы программирования графических процедур доста-
точно подробно изложены в литературе [1—28]. Поэтому многие общие
вопросы, связанные с правилами написания программ на FORTRANе
и геометрическими построениями, в книге не затрагиваются. Внимание
уделено лишь некоторым особенностям программирования, которые
могут представлять интерес для разработчиков программного обеспече-
ния и студентов технических вузов.
В примерах приведены тексты программ в традиционном фиксиро-
ванном формате. Файлы имеют вид (расширение) *.f или *.for. Коммен-
тарии отмечены латинской буквой «c» в первой колонке. Они не влияют
на работу программы и могут быть удалены. Метки операторов распола-
гаются в первых пяти колонках. Строки продолжения отмечены симво-
лом «*» в шестой колонке. Тексты программ (операторы FORTRANа)
записаны в колонках 7—72. Примеры демонстрируют приемы обработ-
ки графической и текстовой информации простыми средствами языка
FORTRAN. Эти приемы могут быть применены и при использовании
других языков программирования.
ГЛАВА 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,file=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) go to 1000
c Открыли выходной файл 6 с именем "6.txt" OPEN (UNIT=6,FILE='6.txt')
c Вызвали подпрограмму сортировки текста call SortText
c Выход из программы 1000 continue
stop end
c Подпрограмма сортировки текста
subroutine SortText
c Выделили массивы для обработки текста c (до 2000 строк по 1000 символов)
c Задали значение символьной переменной probel data probel/" "/
c Ограничили число строк текста nstrok=2000
c Считывание текста из файла (в примере из файла №5) c Перебор строк данных
do 50 i=1,nstrok
c Считывание одной строки из файла данных (5). c Поочередно считываем символы строки.
read
*(5,'(1000a1)',advance='no',end=5557,err=101,iostat=iche)
* (stroka(j),j=1,1000)
101 continue
c В случае, если количество символов в строке меньше заданной c величины (в данном случае 1000), выходим из цикла
c считывания символов и идем к оператору (101 continue).
c В случае, если в файле число строк меньше заданного значения, c выходим из цикла считывания строк и идем к оператору
c (5557 continue).
c Определили длину считанной строки jstr jstr=j
c Записали считанную строку в массив text(i,j) do 2 j=1,jstr
2 text(i,j)= stroka(j)
c Очистили "хвост" строки от посторонних символов c (заполнили пробелами)
jstrp1=jstr+1
do 22 j=jstrp1,1000
22 text(i,j)= probel
c Распечатали считанную строку текста в файле 2 (для контроля) write (2,*) (text(i,j),j=1,jstr)
50 continue
cКонец считывания текста из файла (5)
5557 continue
nst=i-1 write (2,*)
write (2,*) 'Число строк текста =',nst write (2,*)
c Сортировка текста
nstrokm1= nst-1
c Первая строка (stroka1). Перебор первых строк do 3 i=1,nstrokm1
ip1=i+1
c Вторая строка (stroka2). Перебор вторых строк, c расположенных ниже первой строки
do 103 i1=ip1,nst
c Перебор первых 10 столбцов строки №1 (пример).
c Пропускаем цифры (старый номер строки №1
c в списке литературы).
c Ищем номер позиции первой буквы в текстовой строке j1=0
do 14 j=1,10 bukwa1= text(i,j)
call kodd(bukwa1,kod1) if(kod1.ge.1) j1=j if(kod1.ge.1) go to 114
14 continue
114 continue
if(j1.eq.0) go to 3
j2=0
c Перебор первых 20 столбцов строки №2.
c Пропускаем старый номер строки №2 в списке литературы. c Ищем первую букву
do 15 j=1,20 bukwa2= text(i1,j)
call kodd(bukwa2,kod2) if(kod2.ge.1) j2=j if(kod2.ge.1) go to 115
15 continue
115 continue
if(j2.eq.0) go to 103
c Задаем метку повторения строк metkapowt=0
c Сравниваем содержания строк №1 и №2.
c Последовательно перебираем буквы в строках c (в примере проверяем первые 500 символов)
do 4 j=1,500
bukwa1= text(i, j+j1-1) bukwa2= text(i1,j+j2-1) call kodd(bukwa1,kod1) call kodd(bukwa2,kod2)
c Если буквы строк разные, меняем метку повторения строк if(kod1.ne.kod2) metkapowt=metkapowt+1
c Сравниваем буквы (по номерам их кодов).
c Идем на перестановку строк местами,
c если сравниваемые буквы расположены не в заданном порядке if(kod1.gt.kod2) go to 5
c Обнаружены одинаковые буквы, переходим на сравнение c следующих букв строк
if(kod1.eq.kod2) go to 4
c Строки расположены в правильном порядке, c переходим к сравнению следующей строки
c (берем следующую строку №2) go to 13
4 continue
c Переходим к сравнению следующей строки c (берем следующую строку №2)
go to 13
c перестановка строк местами (переставляем символы)
5 continue
c write (2,*) 'Переставляем строки'
c write (2,*) (text(i,jj) ,jj=1,100)
c write (2,*) (text(i1,jj),jj=1,100)
c write (2,*) do 6 j=1,1000
bukwa1 =text(i,j) text(i,j) =text(i1,j) text(i1,j)=bukwa1
6 continue
c write (2,*) 'Строки после перестановки' c write (2,*) (text(i,jj) ,jj=1,100)
c write (2,*) (text(i1,jj),jj=1,100)
c write (2,*)
c Конец перестановки строк
13 continue
c Заполняем пробелами повторяющуюся копию строки if(metkapowt.ne.0) go to 103
do 16 j=1,1000
text(i1,j)=probel
16 continue
103 continue
c Конец перебора строк №2
3 continue
c Конец перебора строк №1
write (2,*) write (2,*)
write (2,*) ' Результат сортировки' write (2,*)
c Перебор строк данных (в примере запись результата в файл №6) nomer=0
do 60 i=1,nst
c Пропускаем старый номер строки j1=0
c Проверяем первые 10 символов строки do 1240 j=1,10
bukwa1= text(i,j)
call kodd(bukwa1,kod1) if(kod1.ge.1) j1=j if(kod1.ge.1) go to 1214
c Стираем старый номер строки текста (заполняем пробелами) text(i,j)=probel
1240 continue
1214 continue
if(j1.le.0) j1=1 jk=0
kod1sum=0
c Перебираем символы строки do 61 j=j1,1000 bukwa1= text(i, j)
c Определяем код символа
call kodd(bukwa1,kod1) if(kod1.ne.0) jk=j
if(kod1.ne.0) kod1sum=kod1sum+1
61 continue
c Количество символов в строке без учета пробелов (kod1sum) if(kod1sum.le.0) go to 60
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)
60 continue
cКонец записи текста в файл 6.txt
5000 continue stop
end
Заметим, что в современных версиях FORTRANа имеются процеду- ры, с помощью которых можно создать другие варианты программы, решающей поставленную задачу. В представленных примерах реализованы наиболее простые средства, которые используют традиционные формы языка. Применение расширенных версий языка минимизировано в связи с тем, что они чаще подвержены изменениям и иногда различаются у производителей программного обеспечения.