Ўзбекистон Фанлар Академияси Ядро физикаси институти



Download 1,08 Mb.
Pdf ko'rish
bet1/2
Sana24.02.2022
Hajmi1,08 Mb.
#230567
  1   2
Bog'liq
Fortran-Flattened



Ўзбекистон Фанлар Академияси
Ядро физикаси институти
Мухторали Нишонов
ФОРТРАН
1. Умумий маълумотлар
Тошкент, 2018


Муаллиф таҳрири. 0.101 L
A
TEX
Ўзбек тили камбағал эмас, балки ўзбек тилини камбағал дегувчиларнинг ўзи
камбағал. Улар ўз нодонликларини ўзбек тилига тўнкамасинлар.
Абдулла Қодирий
Ушбу китобда Фортран 90/95/03/08 стандартлари хақида сўз юрити-
лади.
2


Мундарижа
1 Бошланғич маълумотлар
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
1.1
Кириш
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8
1.2
Фортран компилятори ҳақида
. . . . . . . . . . . . . . . . . . . . . . . . .
10
1.3
Фортранда биринчи программа
. . . . . . . . . . . . . . . . . . . . . . . .
11
1.4
Компиляторни ишлатиш
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
12
1.5
Компилятор опциялари
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
13
1.6
Фортран программаси матни сақланган файл номи
. . . . . . . . . . . .
15
1.7
Makefile
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
16
2 Фортран элементлари
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
17
2.1
Фортран алифбоси
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
18
2.2
Сўзлар
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
18
2.3
Номлар
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
2.4
Махсус сўзлар
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
19
2.5
Программа
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
21
2.6
Фортранда программа матнини ёзиш шакли
. . . . . . . . . . . . . . . . .
21
2.7
Программа таркиби
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
26
2.8
Маълумотларнинг турлари
. . . . . . . . . . . . . . . . . . . . . . . . . .
27
2.9
Ўзгарувчилар
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
29
2.10 Доимийлар
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
30
2.11 Массивлар
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
31
2.12 Маълумотларнинг ҳосилавий турлари
. . . . . . . . . . . . . . . . . . . .
32
2.13 Кўрсатгичлар
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
32
2.14 Меткалар
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
33
2.15 Изоҳлар
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
33
2.16 Операторлар
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
34
2.17 Ифодалар билан ишлаш учун қоидалар
. . . . . . . . . . . . . . . . . . .
36
2.18 Мантиқий шартлар ва назорат қилиш операторлари структураси
. . . .
36
2.19 Цикл оператори
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
40
2.20 STOP оператори
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
41
2.21 Мустақил ишлаш учун савол ва топшириқлар
. . . . . . . . . . . . . . .
41
3 Маълумот турини тавсифлаш операторлари
. . . . . . . . . . . . . . . . . . .
43
3.1
Маълумот турини ноошкор аниқлаш. IMPLICIT оператори
. . . . . . . .
43
3.2
Турни тавсифлаш операторининг таркиби
. . . . . . . . . . . . . . . . .
45
3


Мундарижа
3.3
Маълумотларнинг ҳосилавий тури
. . . . . . . . . . . . . . . . . . . . . .
47
3.4
Хусусиятлар (атрибутлар)
. . . . . . . . . . . . . . . . . . . . . . . . . . .
48
3.5
Бутун турдаги маълумотларни тавсифлаш
. . . . . . . . . . . . . . . . .
57
3.6
Бутун турдаги доимийлар
. . . . . . . . . . . . . . . . . . . . . . . . . . .
59
3.7
Ҳақиқий турдаги маълумотларни тавсифлаш
. . . . . . . . . . . . . . .
60
3.8
Ҳақиқий турдаги доимийлар
. . . . . . . . . . . . . . . . . . . . . . . . .
61
3.9
Ҳақиқий турдаги маълумотларнинг тур параметри
. . . . . . . . . . . .
62
3.10 Комплекс турдаги маълумотларни тавсифлаш
. . . . . . . . . . . . . . .
63
3.11 Комплекс турдаги доимийлар
. . . . . . . . . . . . . . . . . . . . . . . . .
63
3.12 Мантиқий турдаги маълумотларни тавсифлаш
. . . . . . . . . . . . . . .
64
3.13 Белгили турдаги маълумотларни тавсифлаш
. . . . . . . . . . . . . . . .
64
3.14 Белгили турдаги доимийлар
. . . . . . . . . . . . . . . . . . . . . . . . . .
66
3.15 Стандарт турдаги маълумотлардан иборат массив
. . . . . . . . . . . . .
67
4 Фортран арифметикаси
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
71
4.1
Арифметик ифодалар
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
71
4.2
Қайта юкланувчи амаллар
. . . . . . . . . . . . . . . . . . . . . . . . . .
73
4.3
Арифметик амалларнинг бажарилиш тартиби
. . . . . . . . . . . . . . .
74
4.4
Арифметик ўзлаштириш
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
74
4.5
Турларни алмаштириш
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
75
4.6
Ўзгарувчиларга қиймат ўзлаштириш
. . . . . . . . . . . . . . . . . . . .
79
4.7
Ҳисоблашларни оптимизациялаш
. . . . . . . . . . . . . . . . . . . . . . .
81
5 Асосий алгоритмик конструкциялар
. . . . . . . . . . . . . . . . . . . . . . . .
88
5.1
Тармоқланиш
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
88
5.2
Тўхташ оператори
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
93
5.3
Ўтиш оператори
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
94
5.4
Циклларни ташкил қилиш
. . . . . . . . . . . . . . . . . . . . . . . . . . .
95
5.5
Бошқарувчи конструкцияларни аралаштириш ва ўтиш опероторлари
.
100
5.6
Алгоритм ва программа
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
101
5.7
Алгоритмларнинг негиз структуралари
. . . . . . . . . . . . . . . . . . .
104
5.8
Операторлар ва тузилмалар блоки
. . . . . . . . . . . . . . . . . . . . . .
104
5.9
Тармоқланиш
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
104
5.10 Цикл турлари
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
108
5.11 Параметрли цикл
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
108
5.12 Шартли ва чегарали цикллар
. . . . . . . . . . . . . . . . . . . . . . . . .
111
5.13 Циклни узиш. Шартларни бирлаштириш
. . . . . . . . . . . . . . . . . .
112
5.14 Алгоритм ва программа яратиш усули
. . . . . . . . . . . . . . . . . . . .
114
6 Программа структураси. Қисм программалар ва модуллар
. . . . . . . . . .
117
6.1
Асосий программа
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
117
6.2
Ташқи қисм программалар
. . . . . . . . . . . . . . . . . . . . . . . . . .
118
6.3
Ички қисм программалар
. . . . . . . . . . . . . . . . . . . . . . . . . . .
120
6.4
Интерфейс
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
121
6.5
Қисм программаларнинг параметрлари
. . . . . . . . . . . . . . . . . . .
123
6.6
Фактик параметрларга қўйиладиган чекланишлар
. . . . . . . . . . . .
123
6.7
Формал параметр учун алоқа тури
. . . . . . . . . . . . . . . . . . . . . .
124
4


М. Нишонов, mnishonov@gmail.com
6.8
Йўлланмаларни формал ва фактик параметрлар сифатида ишлатиш
.
125
6.9
TARGET ҳусусиятли параметрлар
. . . . . . . . . . . . . . . . . . . . . . .
125
6.10 Қисм программаларни параметр сифатида ишлатиш
. . . . . . . . . . .
125
6.11 Калит ва шарт бўлмаган параметрлар
. . . . . . . . . . . . . . . . . . . .
126
6.12 Номланган интерфейслар ва процедураларни аралаштириш
. . . . . . .
128
6.13 Модуллар
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
130
6.14 Рекурсив процедуралар ва функциялар
. . . . . . . . . . . . . . . . . . .
132
6.15 Номлар ва меткаларнинг кўриниш соҳаси
. . . . . . . . . . . . . . . . . .
133
6.16 USE оператори
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
134
6.17 Хотиранинг умумий соҳалари
. . . . . . . . . . . . . . . . . . . . . . . . .
136
6.18 Операторларнинг жойлашиш тартиби
. . . . . . . . . . . . . . . . . . . .
139
7 Қисм программаларни ишлатиш
. . . . . . . . . . . . . . . . . . . . . . . . . .
141
7.1
Формал аниқлаш
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
142
7.2
FUNCTION қисм программаси
. . . . . . . . . . . . . . . . . . . . . . . . . .
142
7.3
SUBROUTINE қисм программаси
. . . . . . . . . . . . . . . . . . . . . . . .
146
7.4
Ўзгарувчиларнинг кўриниш соҳаси
. . . . . . . . . . . . . . . . . . . . . .
147
7.5
Локал ва глобал ўзгарувчилар
. . . . . . . . . . . . . . . . . . . . . . . .
147
7.6
Модулларни ишлатиш
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
149
7.7
PUBLIC ва PRIVATE хусусиятлар
. . . . . . . . . . . . . . . . . . . . . . . .
152
8 Массивлар
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
154
8.1
Массивлар ҳақида асосий маълумотлар
. . . . . . . . . . . . . . . . . . .
154
8.2
Ўлчами номаълум массивлар ва автоматик объектлар
. . . . . . . . . .
157
8.3
Массивлар билан арифметик амаллар бажариш
. . . . . . . . . . . . . .
160
8.4
Массив элементлари билан ишлаш
. . . . . . . . . . . . . . . . . . . . . .
161
8.5
WHERE оператори
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
161
8.6
FORALL оператори
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
162
8.7
Ўлчами ўзгариб турувчи массивлар
. . . . . . . . . . . . . . . . . . . . .
163
8.8
ALLOCATE, DEALLOCATE ва NULLIFY операторлари
. . . . . . . . . . . . . .
163
9 INPUT/OUTPUT
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
168
9.1
Файллар
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
168
9.2
Маълумотларни узатиш операторлари
. . . . . . . . . . . . . . . . . . . .
171
9.3
INQUIRE оператори
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
174
9.4
NAMELIST оператори
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
174
9.5
I/O самарадорлигини ошириш
. . . . . . . . . . . . . . . . . . . . . . . .
176
Адабиётлар рўйҳати
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
177
5


Сўз боши
Одамлар билмаган нарсаларига душманлик кўзи билан қарайдилар.
Абу Райҳон Беруний
Ушбу китобда замонавий Фортран ҳақида сўз юритилади. Хозирги кунда ихти-
ёрий соҳага тегишли ахборотларни жуда тез олиш мумкинлиги сабабли, сиз Фортран
ҳақида хориж тилларида келтирилган маълумотларни тездагина топишингиз мум-
кин. Масалан, интернетга мурожат қилсангиз ва агар сиз хорижий тилларда сўзлаша
олсангиз, буни сира қийинлиги йўқ. Аксарият ҳолларда, Фортран ҳақидаги фикрлар
салбий. Нега шундай?
Кўпгина алгоритмик тиллар орасида Фортран асосан ҳисоблашлар бажариш
учун мўлжалланганлиги билан ажралиб туради. Компьютер сўзининг моҳиятига эъ-
тибор берсангиз, у ҳисоблагич маъносини беради. Компьютер қурилмаси аслида ўта
кўп миқдордаги такрорланувчи математик ҳисоблашлар бажариладиган соҳаларда
фаолият юритувчи инсонларнинг талаблари туфайли пайдо бўлган эди. Фортран эса
– ҳисоблашларни бажариш учун инсон ақли томонидан яратилган энг биринчи юқори
сатҳли алгоритмик тилдир. У кўпинча аниқ, табиий ва техника фанлари соҳасида
қўлланилади.
Фортрандан кейин кўп миқдорда бошқа алгоритмик тиллар таклиф қилин-
ди. Уларнинг баъзилари, худди Фортран каби, компьютерда илмий ҳисоблашларни
бажариш учун махсус яратилган эди. Ҳисоблашлар учун яратилган тиллар ҳар
10 - 15 йилда Фортран билан солиштирилар ва хулоса сифатида ’Фортранни яқин
келажакда ишлатмай қўйишади!’ – деган фикрлар билдирилар эди. Лекин бундай
фикрлар кўпинча хато бўлиб чиқди, Фортраннинг ўрнини босиши башорат қилинган
тилларнинг ўзлари муомаладан чиқиб кетдилар. Фортранга бўлган салбий муноса-
батнинг асосий сабаби, муаллифнинг фикрича, Фортраннинг эски стандартларидаги
мавжуд ноқулайликлар ва информатика (инг. Computer science) соҳаси мутахас-
сисларининг фаолиятлари билан боғлиқ. Информатика соҳасида ҳисоблашлар жуда
кичик қисмни ташкил қилганлиги сабабли бу ерда Фортранга зарурат унчалик кўп
эмас ва ушбу соҳа мутахассислари уни деярли ишлатишмайди. Программалаш тил-
ларини кўпчиликка тарғиб қиладиган соҳа вакиллари айнан улар бўлгани туфайли,
ҳисоблашларни бажариш учун улар ўзлари кўп ишлатадиган ’Cи’, ’Си++’ каби
программалаш тилларини таклиф қилишади. Ушбу тиллар асосан компьютерларни
бошқариш учун зарур бўлган операцион тизимлар ва бошқа махсус программаларни
6


М. Нишонов, mnishonov@gmail.com
яратиш учун мўлжалланган
1
.
Бошқа алгоритмик тиллар қанчалик ривожланган ва қулай бўлмасин, улар
юқори аниқликдаги математик ҳисоблашларни бажаришда Фортранда бўлган имко-
ниятларга эга эмас. Фортраннинг охирги стандартларида ҳисоблашларни параллел
бажариш имкониятлари (co-array
2
) тилнинг ички хусусияти сифатида киритилган.
Ҳеч қайси программалаш тилининг компилятори ҳисоблаш тезлиги ва аниқлик
бўйича, программаларни яратишда йўл қўйилган хатоларни тутишда Фортран ком-
пиляторига тенг кела олмайди. Илм-фан ва техника соҳаларида бажариладиган
ҳисоблашлар ўта юқори аниқлик ва тезликни талаб қилганлиги сабабли, тилнинг бу
ҳусусияти жуда муҳим аҳамиятга эга.
Фортранга бағишланган бу китоб уч қисмдан иборат: 1- қисмда Фортран ҳақида
умумий маълумотлар келтирилган; 2- қисмда Фортранда мавжуд стандарт (ички
ўрнатилган) математик функция ва процедураларга ҳамда паралел ҳисоблашлар,
сонли ҳисоблашлар аниқлиги ва ҳисоблаш хатолиги қараб чиқилган; 3- қисмда
илм-фан ва техника сохасида учрайдиган математик муаммолар Фортран имконият-
ларидан фойдаланиб амалий математика усуллари ёрдамида ҳал қилиш ҳақида сўз
юритилади.
Ушбу китобда келтирилган фикрларнинг барчаси ҳам муаллифники эмас,
бунда у ўз фаолияти давомида орттирган ва бошқа инсонлар томонидан яратилган
билимларни жамлашга ҳаракат қилган. Китоб хато ва камчиликлардан ҳам ҳоли
эмас.
Китоб борасидаги фикларингиз ва хатолар ҳақидаги ихтиёрий маълумотни
бизга етказасиз деган умид билан,
Мухторали Нишонов.
2018 йил, Тошкент
1
Айнан, ҳисоблашлар бажариш учун махсус эмас.
2
Бу имконият Си++ да ҳам мавжуд.
7


1 чи БОБ
Бошланғич маълумотлар
Янги программалаш тилини ўрганишнинг
ягона йўли – унда программа ёзишдир.
1.1 Кириш
Биринчи компьютер яратилгандан бошлабоқ компьютер программаси
1
тушун-
часи пайдо бўлди. Программа ёзувчилар
2
программа ёзиш учун бажариладиган ва
жуда узоқ вақт талаб қиладиган ишларни автоматлаштиришга ҳаракат қилишди.
Компьютер бажарадиган сонли амалларни мнемоник
3
белгилашларга алмаштириш
ғояси пайдо бўлди. Масалан, хотиранинг иккита ячейкасида жойлашган маълумотни
қўшиш ’01 0100 0101 0102’ кўринишдаги сонли буйруқ орқали бажарилиши мум-
кин. Мнемоник алмаштиришдан сўнг эса у одамга тушунарли ёзув шаклини олади:
’ADD 0100 0101 0102’. Бундан дарров тушунарли бўлдики, агар сон кўринишида-
ги буйруқларни мнемоник белгилашлар ёрдамида ёзиб ва бу ёзувни сонли буйруқ
кўринишига таржима қилишни махсус программага юклатилса программа ёзиш
жараёни жуда соддалашар экан. Бу холда ’z = x + y’ формула орқали ифодалана-
диган алгоритм маъно жиҳатдан тушунарли ’ADD x,y,z’ кўринишдаги компьютер
буйруғига келиб қолар экан. Ушбу ғоя туфайли автокод ва ассемблер деб номланган
системалар пайдо бўлди.
Турли муаммоларни компьютер ёрдамида ҳал қилишда учрайдиган амалларни
стандартлаштириш натижасида кейинчалик алгоритмик тиллар
4
таклиф қилинди.
Бундай тилларда ёзилган ҳар бир сатрни автоматик равишда эквивалент компьютер
буйруғига ўтказадиган таржимон программалар яритилди. Бу таржимон программа-
1
рус. компьютерная программа, инг. computer program; ўзбек тилидаги адабиётларда дастур сўзи
кўп ишлатилади, лекин кундалик сўзлашувда асосан программа сўзи оммавий.
2
рус. программист, инг. computer programmer ; биз эса, келгусида содда қилиб ’программист’ деб
атаймиз, чунки бу ном ўзбек тилида аллақачон оммавийлашган.
3
Сунъий белгилашлар оқали бирор нарса ҳақида имкон борича кўпроқ ахборотни эслаб қолишни
енгиллаштурувчи усуллар тўплами – мнемоника деб юритилади.
4
Компьютер программаларини ёзиш учун одам томонидан яратилган сунъий тил. Алгоритмик
тилни яна программалаш тили деб ҳам аташади.
8


М. Нишонов, mnishonov@gmail.com
лар транслятор ёки компилятор деб номланди. Шундай вазифани бажарадиган яна
бошқа тур программалар бажарувчи ёки интерпретаторлар ҳам бор.
Кўпчилик учун Delphi, Си/Си++, Java, Visual Basic ва шулар каби програм-
малаш тилларини ўрганиш қизиқарли. Бундан ташқари Access, SQL ва ҳ.к. маълу-
мотлар базаси билан ишлашга мўлжалланган тиллар ҳам жуда оммабоп. Шубҳасиз,
ҳар бир алгоритмик тилнинг у қўлланиладиган соҳаси мавжуд. Уларнинг баъзилари
операцион системалар, турли кўринишдаги график интерфейслар, ҳаракатланув-
чи тасвирлар яратиш учун мўлжалланган бўлса, баъзилари хатто ҳисоблашлар
бажаришга ҳам имкон беради. Улар ичида финанс тизимлари ва савдо ташкилот-
ларини бошқаришда қулай имкониятлагра эга бўлган, ҳамда интернет муҳитидан
фойдаланиб маҳсулотларни етказиб бериш тизимларини ташкил қилишга яхши
мосланганлари ҳам бор. Лекин бу тилларни табиат ҳодисаларини ва турли хилдаги
жараёнларни (физик, кимёвий, технологик ва ҳ.к.) тавсифлаш учун қўллаш ноқулай.
Илмий - техник масалаларни ечишда кенг қўлланиладиган алгоритмик тиллардан
1
бири (энг машҳури деса ҳам бўлади) бу - Фортрандир.
Фортран номи FORmula TRANslator (формула таржимони) сўзларидан олин-
ган. У 1954 - 1957 йиллар мобайнида Жон Бекус раҳбарлигида IBM фирмасида яратил-
ган энг биринчи юқори сатҳли компиляторли программалаш тилидир. Фортрангача
барча компьютер программалари машина кодларида ёки белгили ассемблерларда
ёзилар эди.
Мана 60 йилдан ортиқ вақт мобайнида Фортран фан ва инженерлик соҳалари-
даги ҳисоблашларни бажаришда кенг қўлланилади. Бу вақт мобайнида илмий ва
инженерлик соҳасидаги мураккаб муаммоларни ҳал қилиш учун Фортранда ўта кўп
миқдорда тайёр программалар библиотекалари яратилди. Масалан, BLAS, LAPACK,
LINPACK, EISPACK, MINPACK, ARPACK, IMSL, NAG ва бошқалар. Фортран компиля-
тори ишламайдиган бирорта операцион тизим ёки процессор мавжуд эмас.
Бошланишида Фортран IBM компаниясининг корпоратив стандартлари миқё-
сида ривожлантирилди. Улар Фортран II ва Фортран IV номлари билан маълум.
Кейинчалик у Америка миллий стандартлар институти (ANSI) ва ҳалқаро стандарт-
лаштириш ташкилоти (ISO) миқёсида қараладиган бўлди.
ANSI да Фортранни стандартлаштиришга жавобгар X3J3 техник қўмита ташкил
қилинган. ISO/IEC JTC1/SC22/WG5 (қисқача WG5) ҳалқаро кузатувчилар гуруҳи Фор-
транни ISO миқёсида стандартлаштиришни бошқаради. Турли стандартларга мансуб
Фортранлар орасидаги мослик X3J3 қўмита фаолияти орқали таъминланади. Унга
кўра программалаш тилининг эскирган хусусиятлари аввалдан эълон қилинган вақт
ўтгачгина олиб ташланади (қоида бўйича 10 йилдан кам бўлмаган вақт мобайнида).
IBM фирмасининг корпоратив стандартига асосланиб 1966 йилда биринчи ҳалқа-
ро стандарт Фортран 66 яратилди, ундан кейин процедурали ва таркибли програм-
малашга имкон берувчи Фортран 77 (1978 йил) ва объектларга йўналтирилган про-
граммаларни ёзишга имкон берувчи Фортран 90 (1991 йил) пайдо бўлди.
1997 йилда қабул қилинган Фортран 95 стандарт Фортран 90 стандартнинг
1
Кейинги пайтларда Фортран қаторида Си++ алгоритмик тили илмий тадқиқодлар соҳасида зарур
бўлган ҳисоблашларни бажаришда кенг қўлланилмоқда.
9


1 Бошланғич маълумотлар
тўғриланган ва яхшиланган вариантидир. Кейинчалик яратилган Фортран 2003 (2004
йил) ва Фортран 2008 стандартларда объектларга йўналтирилган программалаш
имкониятларини кенгайтириш, параллел ҳисоблашлар учун қуролларни (co-array)
тилни ички хусусиятлари сифатида аниқлашга ва тилни операцион тизим билан
ўзаро таъсирлашишини қулайлаштиришга интилинган.
Барча Фортран компиляторларининг умумий хусусияти машина кодини сузувчи
нуқтали ҳисоблашларни максимал даражада тез бажариш учун оптимизациялашдир.
Бошқа программалаш тиллари билан солиштирилганда ҳисоблашларни тез бажа-
ришда Фортранга тенг келадиган йўқ, Фортран айнан шу мақсадда яратилган эди
ва шу мақсад учун ривожланишда давом этмоқда.
Ҳисоблаш самарадорлиги бўйича таҳлиллар натижасига кўра Intel корпора-
циясининг Intel IA-32 ва IA-64 (Intel Fortran Compiler, ifort) тижорий ком-
пилятори биринчи ўринда туради.
Эркин программа таъминоти фонди (GNU) томонидан яратилган
1
ва GCC
2
тар-
кибида мавжуд gfortran компилятори ҳам кенг ишлатилади.
1.2 Фортран компилятори ҳақида
Матнда
келтирилган
программалар
илмий
ва
техник
ҳисоблашлар
учун мўлжалланган Фортран алгоритмик тили стандартига асосланган. Ун-
да [ISO/IEC 1539-1:1997(E)] стандарт учун яратилган Gfortran (free FORTRAN
95/2003/2008 compiler for GCC, the GNU Compiler Collection) компилятори
қўлланилади. Gfortran компилятори Фортран 77, 90, 95 стандартларни тўлиқ,
Фортран 2003 ва Фортран 2008 стандартларнинг кўпчилик имкониятларини ишлата
олади.
Программаларни ёзишда программалаш тили стандарти ва шу стандарт қўл-
ланилаётган программа маҳсулоти орасидаги боғланиш ҳақида тўғри тасаввурга
эга бўлиш жуда муҳим ҳисобланади. Бу боғланиш компилятор (ёки транслятор)
ва уни ишлатишда қулайликлар яратувчи график интерфейс (бошқача айтганда –
программаларни яратиш муҳити) орқали амалга оширилади.
Кўп ҳолларда, программалаштиришни турли муҳитларда ўрганиш мобайнида,
ўрганувчи компилятор ҳақида ҳеч қандай маълумотга эга бўлмайди. Бунга про-
граммаларни тайёрлаш учун яратилган, ҳар бир амал бирор қулай тугмани босиш
орқали бажариладиган, кўп сатҳли менюга эга бўлган тизимлар (график интер-
фейслар) сабабдир. Шунинг учун программа ёзишни ўрганишнинг бошланғич қа-
дамларида буйруқлар қаторида ишлатиш имкони бўлган ва турли хилдаги график
муҳитлар билан боғлиқ бўлмаган энг содда компилятордан фойдаланиш мақсадга
мувофиқдир. Айнан Gfortran комилятори шундай хусусиятга эга. Бу компилятор
аслида GNU/Linux учун яратилган (http://gcc.gnu.org/fortran), лекин уни MinGW
1
Эркин программа таъминоти фонди томонидан таклиф қилинадиган барча программа маҳсу-
лотлари эркин тарқатилиши ва барча инсонлар текин фойдалана олиши ҳуқуқини берувчи
лицензияга асосланиб дунёдаги энг яхши программистлар томонидан яратилади ва доимий
равишда мукаммаллаштириб борилади.
2
Инглизча GNU Compiler Collection сўзларининг бош ҳарфларидан ташкил қилинган қисқатрма.
10


М. Нишонов, mnishonov@gmail.com
(Minimalist GNU for Windows) программа пакети таркибида http://www.mingw.org
интернет саҳифасидан эркин кўчириб олиб Windows га ҳам ўрнатиш мумкин.
Программа ёзишда программалаштириш тили стандартига амал қилиш ва
программани бошқа компьютерларга кўчирганда уни тўғри ишлашини таъминлаш
муҳимлигини тушуниш ўта аҳамиятлидир. Масалан, Fortran Power Station (FPS)
компилятори ҳудди Gfortran сингари [ISO/IEC 1539-1:1997(E)] стандартни қано-
атлантиради. Лекин FPS компиляторида тўғри ишлаган программа Фортраннинг
бошқа компиляторлари учун хато бўлиши мумкин. Бундай ҳолат, агар программа
матнида айнан FPS нинг [ISO/IEC 1539-1:1997(E)] стандартни кенгайтирувчи ва бо-
шқа компиляторларда мавжуд бўлмаган имкониятлари ишлатилганда содир бўлади.
Бу билан, биз программалаштириш пайтида қандайдир компиляторни кенгайти-
рувчи имкониятларидан фойдаланмасилик керак демоқчимасмиз. Фақат ёзилган
программа матнини праграммалаштириш тили стандартига мослиги ва уни бошқа
компиляторларда тўғри ишлашини аниқ баҳолай олишни билиш лозим.
1.3 Фортранда биринчи программа
Программалаш тилини ўрганишнинг энг яхши йўли – ўқигандан сўнг дарров
программа ёзишдир
1
. Агар компьютер ёнингизда бўлса, келтирилган содда про-
граммаларни қандай тарзда ишлашини ва Фортран компилятори ўзини қандай
тутаётганини тушунишга ҳаракат қилинг. Бунинг учун биринчи навбатда компью-
терда Фортран компилятори ўрнатилган бўлиши лозим.
Дастлаб бирор матн муҳаррирда (русча текстовый редактор, масалан, Windows
операцион тизимида кўпинча ишлатиладиган блокнотда, лекин Microsoft Office
таркибига кирувчи MS Word да эмас, ёки агар Linux операцион тизимида ишла-
ётган бўлсангиз vim, emacs, nano каби программаларни ишлатишингиз мумкин)
birinchi_prog.f90 номли файл яратинг. Унда қуйидаги ёзувларни сақланг:
PROGRAM birinchi
WRITE(*,*) ’Мен ёзган биринчи программа!’
END PROGRAM birinchi
Ушбу программани изоҳлайлик. Биринчи сатрда PROGRAM birinchi оператори,
охирги сатрда эса унга мос END PROGRAM birinchi турибди. Бу ерда birinchi про-
грамма номи (файл номи эмас, программа номи ва файл номлари мос келиши шарт
эмас). Ушбу программани яна қуйидаги кўринишда ёзиш мумкин:
WRITE(*,*) ’Мен ёзган биринчи программа!’
END
1
Ушбу қўлланмада ’Ўқувчи маълум даражада компьютерда ишлаш кўникмаларига, турли опе-
рацион тизимлар ҳақида маълумотга эга ва уларни бемалол ишлата олади.’ - деб фараз
қилинган.
11


1 Бошланғич маълумотлар
Яъни, бунда программанинг юқори қисмидаги PROGRAM birinchi ва пастки
қисмидаги END операторидан кейин турган PROGRAM birinchi ёзувлар тушириб қол-
дирилди. Лекин, программа доим END оператори билан тугаши шарт!
Программанинг асосий танасида Фортран оператори (буйруғи) WRITE(*,*),
ундан кейин қўштирноқ ичида ’Мен ёзган биринчи программа!’ ёзуви жойлашган.
Ушбу программа ишлатилса, Мен ёзган биринчи программа! ёзуви компьютер экра-
нида пайдо бўлади (бу ерда, ёзув қўштирноқсиз). Чунки WRITE(*,*) оператори
ўзидан кейин жойлашган маълумотни айтилган жойга ёзиш (чиқариш) учун мўл-
жалланган. Бу ерда, қавс ичидаги юлдузчалардан
1
бири (аниқ айтсак, биринчиси)
маълумотни компьютер экранига ёзиш лозимлигини WRITE операторига тайинлайди
(унинг вазифаси шунақа).
1.4 Компиляторни ишлатиш
Биз ёзган программани энди компьютер тушунадиган сўзларга таржима қилиш
зарур. Шундан сўнг биз уни компьютерга бажариш учун таклиф қилишимиз мумкин.
Бу вазифани, юқорида айтганимиздек, компилятор бажаради.
Компилятор (ёки транслятор) - программист томонидан ёзилган программани
компьютер тилига таржима қиладиган махсус программа. Агар сиз компьютеримда
Фортран ўрнатилган десангиз, сизнинг компьютерингизда Фортран компилятори
борлигини назарда тутган бўласиз. Фортран синтаксисида ёзилган программани
компьютер бажара оладиган сўзларга таржима қилиш амали - компиляция дейилади.
Фортран компиляторини буйруқлар қаторида (рус. командная строка, инг.
command line) чақириш қуйидагича амалга оширилади:
gfortran -c birinchi_prog.f90
(Enter тугмасини босинг)
gfortran -o test.x birinchi_prog.o (Enter тугмасини босинг)
Натижада test.x номли бажарилувчи файл пайдо бўлади. Уни қуйидаги буй-
руқ билан ишга туширамиз:
./test.x
(Enter тугмасини босинг)
Бажарилувчи файл номи олдидаги ./ ёзув Linux операцион тизимига ушбу
файл жорий папкада жойлашганлиги ҳақида хабар беради. Бажарилувчи файл номи
.x кенгайтмага эга бўлиши шарт эмас, яъни компиляция қилганда бажарилувчи
файл номи test.x эмас test каби танланиши мумкин:
gfortran -o test birinchi_prog.o (Enter тугмасини босинг)
Windows операцион системасида бажарилувчи файл номи одатда exe (инглизча
executable сўзини дастлабки учта ҳарфидан олинган) каби кенгайтмага эга бўлади.
1
Бу юлдузчаларнинг вазифаси ҳақида Фортранда маълумотларни сақлаш ва уларни ўқиш усулла-
рига бағишланган бўлимда сўз юритилади.
12


М. Нишонов, mnishonov@gmail.com
Программа учун бажарилувчи test.x файл ишлагач, компьютер қуйидаги натижани
экранга чиқаради:
Мен ёзган биринчи программа!
Компилятор билан ишлагандаги ёзувда gfortran – Linux учун эркин тарқати-
ладиган Фортран компиляторининг номи (Windows операцион системасида кўпинча
ишлатиладиган Фортран компилятори номи, масалан, Fortran Power Station ҳоли-
да, fl32). Компилятор номидан кейин ёзилган -c опция
1
компиляторга бажарилувчи
файл
2
ҳосил қилинмасин, фақат .o кенгайтмали объек файл яратилсин холос деган
хабарни беради. Одатда компиляторлар кўпгина турли опцияларга эга. Уларнинг баъ-
зилари ҳақида қуйида сўз юритилган. Юқоридаги буйруқлардан биринчиси ишлагач
gfortran компилятор программа матни сақланган birinchi_prog.f90 номли файл
ичидаги Фортран буйруқларини компьютер тушинадиган буйруқларга таржима
қилади ва таржима қилинган буйруқларни birinchi_prog.o номли файлга сақлайди.
Иккинчи буйруқ эса birinchi_prog.o файлдан бажарилувчи test.x номли файлни
яратади, бу ерда -o опция бажарилувчи файл хосил қилинсин ва унинг номи test.x
бўлсин деган маънони беради. Ушбу буйруқлар ишлагандан сўнг test.x номли ба-
жарилувчи файл пайдо бўлади. Фортраннинг эски диалектларида, масалан, Фортран
77 стандартида ёзилган программа матни сақланган файл birinchi_prog.f ёки
birinchi_prog.for каби номланар эди. Фортран 90/95 стандарти синтаксисида ёзил-
ган программа матни сақланган файл эса birinchi_prog.f90 ёки birinchi_prog.f95
ном билан сақланади. Файлларни номлаш қоидаларини эсласак, файл номи нуқта
билан ажратилган иккита қисмдан иборат бўлади. Биринчи қисм ном ва иккинчи
қисм кенгайтма деб аталади. Бизни ҳолда Фортранда ёзилган программа матни
сақланган файлда birinchi_prog ном ва f90 кенгайтмадир, улар нуқта билан ажра-
тилган. Компилятор файл номидаги кенгайтма орқали унда программа Фортраннинг
қайси диалектида ва у фиксирланган ёки эркин шаклда ёзилганини билиб олади.
1.5 Компилятор опциялари
Фортран программаларини gfortran ёрдамида компиляция қилишда кўпинча
ишлатиладиган опциялар қуйидагилардир:
Опция
Вазифаси
-c
Бу опция фақатгина компиляция зарур эканлигини билдиради.
Программа матнлари сақланган файллардан фақат ном.o
каби номланган объект файллар яратилади холос. Уларни
ўзаро улаш (рус. компановка) амали бажарилмайди.
1
Бирор амални бажариш учун аниқланган кўпгина шартлардан бирини танлаш хуқуқи.
2
Бундай файл танланганда компьютер бирор амал бажаради.
13


1 Бошланғич маълумотлар
-Dном=қиймат
Компиляция қилинаётган программада ном каби аталган ном-
ни қиймат сингари аниқлаш. Бу опциядан келадиган таъсир
худди программа бошланишида #defane ном қиймат ёзил-
гандаги каби бўлади. Ушбу опцияда =қиймат қисм тушириб
қолдирилиши мумкин, бу ҳолда қиймат сифатида 1 ишлати-
лади.
-o файл-номи
Бажарилувчи файл номи сифатида файл-номи каби номни
танлаш.
-lname
Объект файлларни улаш пайтида libname.so номли библио-
текани ишлатиш.
-Llib-path
-Iinclude-path
Библиотекаларни қидириш учун тайинланган стандарт папка-
лар қаторига мос равишда lib-path ва include-path йўлларни
ҳам қўшиш.
-g
gdb йиғувчи (рус.отладчик) учун мўлжалланган маълумотни
объект файлга ёки бажарилувчи файлга жойлаш. Ушбу опция
ҳам компиляция вақтида, ҳам йиғиш вақтида кўрсатилиши
зарур. Бунда -g билан бирга оптимизацияни ўчириб қўювчи
-O0 опцияни ишлатиш маслаҳат берилади.
-MM
Си ёки Си++ программада ишлатиладиган сарлавҳа файллар-
га боғлиқликни make программасига мос келадиган шаклда
кўрсатиш.
-pg
gprof программаси ишлатадиган маълумотларни яратиш учун
шаклга солувчи кўрсатмаларни объект ёки бажарилувчи файл-
га жойлаш. -pg опция билан йиғилган программа бажарила-
ётган пайтда ўзида статистик маълумотларни сақлаган файл
яратади. Ушбу файлга асосланиб gprof программа ҳар бир
функцияни бажариш учун сарфланган вақтни кўрсатувчи
маълумотни ҳосил қилади.
-Wall
Программани компиляция қилиш пайтида ҳосил бўладиган
барча огоҳлантиришлар ва хатолар ҳақидаги маълумотларни
кўрсатиш.
-O1,O2,O3
Турли сатҳлардаги оптимизациялаш.
14


М. Нишонов, mnishonov@gmail.com
-O0
Оптимизацияланмасин. Агар бир нечта турли сатҳдаги оптими-
зацияларни англатувчи рақамлар билан -O опция ишлатилса,
улардан энг охирида жойлашганигина таъсир қилади холос.
-I
Йиғиш пайтида сарлавҳа файлларни қидириш учун програм-
мачи томонидан яратилган папкаларни қўшиш.
-L
Йиғиш пайтида библиотекаларни қидириш учун программачи
томонидан яратилган папкаларни қўшиш.
-l
Йиғиш пайтида программачи томонидан яратилган библиоте-
каларни қўшиш.
Опциялар ҳақида тўлиқ маълумотни https://gcc.gnu.org интернет манзилдан
қарашингиз мумкин.
1.6 Фортран программаси матни сақланган файл номи
Фортран программаси матни сақланган файллар номига қараб, ушбу програм-
ма фиксирланган ёки эркин шаклда ёзилгани, компиляция вақтида компилятор
қандайдир қўшимча амаллар бажариши зарурлига ҳақида маълумот олишимиз
мумкин.
1) Агар
файл
номидаги
кенгайтма
’.f’, ’.for’, ’.fpp’, ’.ftn’, ’.F’,
’.FOR’, ’.FPP’ ва ’.FTN’ бўлса, уни ичида сақланган Фортран программа-
си фиксирланган шаклда ёзилганини англатади.
2) Кенгайтмалари ’.f90’, ’.f95’, ’.f03’, ’.f08’, ’.F90’, ’.F95’, ’.F03’
ва ’.F08’ бўлган файлларда эса эркин шаклда ёзилган программалар сақлана-
ди.
3) Кенгайтмалари
’.fpp’, ’.F’, ’.FOR’, ’.FPP’, ’.F90’, ’.F95’, ’.F03’,
’.F08’ бўлган файллар учун компилятор томонидан аввалдан текшириш амали
автоматик равишда бажарилади (инг. preprocessing
1
, рус. предварительная
обработка).
Ихтиёрий файл учун аввалдан текшириш амалини қўлда ёқиш – компиляция вақтида
’-cpp’ опцияни ишлатиш билан амалга оширилиши мумкин. Аввалдан текширишни
ўчириш учун эса ’-nocpp’ опцияси ишлатилади.
1
Фортран компиляторларининг кўпчилиги, жумладан gfortran ҳам, ёзилган программани Си –
пре-процессори (CPP; базида Фортран пре- процессори, FPP, деб ҳам аталади.) орқали ўтказишга
имкон беради.
15


1 Бошланғич маълумотлар
1.7 Makefile
Linux/Unix операцион тизимларда makefile каби номланувчи файл хосил қи-
лиш жуда қулай. Бу файл комиляция вақтида компилятор буйруғини ва унинг
опцияларини бир марта аниқлаб олишга имкон беради ва ҳар сафар буйруқларни
қайта ёзиб чиқишдан озод қилади. Фортран комилятори опциялари учун ишлатила-
диган makefile қуйидагича ташкил қилиниши мумкин:
# Linux операцион тизимсида ўрнатилган gfortran номли
# Фортран компилятори учун умумий makefile
FC= gfortran
PROG= birinchi_prog
# Бажарилувчи файл хосил қиламиз
${PROG}:
${PROG}.o
${FC} ${PROG}.o -o ${PROG}
# Қуйида object файл хосил қиламиз:
${PROG}.o :
${PROG}.f90
${FC} -c ${PROG}.f90
У birinchi_prog.f90 файл жойлашган папкада сақланган деб фараз қиламиз.
Ушбу makefile ни ишлатиш учун, у жойлашган папкада туриб, буйруқлар қатори-
да
1
make буйруғини ёзамиз ва клавиатурада Enter тугмасини босамиз. У ишлагач
birinchi_prog номли бажарилувчи файл хосил бўлади (агар программа матнини
тўғри ёзган бўлсангиз). Бажарилувчи файлни ишлатиш учун буйруқлар қаторида
./birinchi_prog ни ёзиб яна Enter тугмасини босиш зарур.
1
Linux да
16


2 чи БОБ
Фортран элементлари
Формула:
A
i,j
= ( A
i-1,j
+ A
i+1,j
+ A
i,j-1
+ A
i,j+1
)/4
Фортран:
FORALL (i=2:n-1, j=2:n-1)
&
A(i,j)=(A(i-1,j)+A(i+1,j)+A(i,j-1)+A(i,j+1))/4
Ҳар қандай тил - бу ахборотни узатиш учун ишлатиладиган белгилашлар ва
қоидалар тизимидир. Инсонлар мулоқотда ишлатадиган тил табиий тил, программа-
лаш тиллари эса сунъий тил дейилади. Программалаш тиллари - маълум турдаги
муаммоларни тавсифлаш ва уларни компьютер ёрдамида ҳал этишга имкон беради.
Ихтиёрий тил алифбо, синтаксис ва семантика орқали аниқланади. Алифбо - бу тил
ёки тизимда маълум маънода тартибланган белгилар (ҳарфлар) тўпламидир. Ушбу
тилдаги сўзларни қуришда фақат шу тилга тегишли белгиларгина (ҳарфларгина)
ишлатилиши мумкин. Синтаксис (грекча syntaxis - қуриш, тартиб) - тилдаги сўз-
ларни, сўз бирикмаларини ва матн тузилишини қуриш учун қоидалар тўплами. Сўз
- алифбодаги белгиларнинг тартибланган ва маълум маънога эга бўлган тўплами.
Семантика (грекча semantikos - ифодаловчи) - тилдаги синтаксисга асосланиб қу-
рилган ҳар бир сўз бирикмасининг маъносини билдиради. Уларнинг Фортран билан
боғлиқлари ҳақида асосан ушбу бобда сўз юритамиз.
Фортраннинг биз қараб чиқадиган асосий элементлари – унинг алифбоси
1
, мах-
сус сўзлар
2
ва белгилар
3
, программа таркибидир
4
. Ушбу бобда Фортранда маълумот
турлари
5
, программани бажарилиш жараёнини бошқарувчи мухим операторлар,
маълумотни киритиш/чиқариш операторлари ҳақида гаплашамиз. Бу эса сизга
ўзингизни дастлабки содда программангизни ёзишингизга ва Фортранда ёзилган
программаларни ўқишингиз учун етарли.
1
рус. алфавит, инг. alphabet.
2
рус. специальные слова, инг. special words.
3
рус. символы, инг. symbols.
4
рус. структура программы, инг. program structure.
5
рус. типы данных, инг. data types.
17


2 Фортран элементлари
2.1 Фортран алифбоси
Фортран алифбоси 26 та катта ва кичик лотин ҳарфлари
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
a b c d e f g h i j k l m n o p q r s t u v w x y z
араб рақамлари
0, 1, 2, 3, 4, 5, 6, 7, 8, 9
маҳсус белгилар
бўш жой = + - * / ( ) , . ’ : ! " % & ; < > ? $
ҳамда пастки чизиқ ’_’ дан иборат.
2.2 Сўзлар
Сўз
1
- тилда маънога эга бўлган энг кичик элемент вазифасини бажаради.
Программалаш тилларида сўзлар:
• ўзгарувчиларнинг
2
, қисм программаларнинг ва ҳ.к. номлари;
• тавсифлашни, операторларни ва тилнинг бошқа тузилмаларини аниқлаш учун
маҳсус сўзлар;
• арифметик амалларни аниқлаш учун белгилар;
• белгили доимийлар
3
;
• операторларни бир-биридан ажратиш белгилари, рўйҳатлар
4
элементлари ва
ҳ.к.;
• меткалар
5
бўлиши мумкин.
1
рус. лексема ёки слово.
2
рус. переменные, инг. variables.
3
рус. буквальные константы, масалан, 12 ёзув бутун 12 ни, 12. эса ҳақиқий 12 ни англатади; инг.
symbol constants.
4
рус. списки, инг. lists.
5
рус. метка, одатда меткалар операторларга тартиб рақам беришда ишлатилади; инг. label.
18


М. Нишонов, mnishonov@gmail.com
2.3 Номлар
Фортранда номлар
1
турли объектларга мурожаат қилиш учун ишлатилади.
Масалан, ўзгарувчига ёки программа қисмларига. Номлар ҳарфдан ёки ’$’ белгисидан
бошланади. Узунлиги 32 тагача белгидан иборат ва ҳарф-рақамлар кетма- кетлигидан
ташкил топган бўлиши мумкин.
Тўғри номларга мисоллар:
aAaAaA, olma_va_shaftoli, r2d2, atirgul, ATIRGUL, Atirgul
атиргулни билдирувчи охирги учта номлар эквивалент (битта ном). Чунки
Фортранда катта ва кичик ҳарфлар фарқланмайди (белгили ўзгарувчи туридан
бошқа ҳолларда).
Нотўғри номларга мисоллар:
_nom_pastki_chiziqdan_boshlangan, 2_nom_raqamdan_boshlangan,
nom_juuuuda_uzun_yozilsa, xato_@_belgi
2.4 Махсус сўзлар
Махсус сўзлар – программада гапларни тузишда ишлатилади. Улар икки хил
бўлади: банд қилинган ва калит сўзлар.
• Банд қилинган сўзлар
2
– аниқ маънога ва вазифага эга. Улар программалаш
тили стандартида аниқлаган бўлади. Уларни ишлатишдаги ҳар қандай ноаниқ-
лик жиддий хатога сабаб бўлади.
• Калит сўзлар
3
– программанинг қаерида ишлатилганига қараб турли вазифага
эга.
ADMIT
ALLOCATABLE
ALLOCATE
ASSIGN
ASSIGNMENT
ATEND
BACKSPACE
BLOCKDATA
CALL
CASE
CHARACTER
CLOSE
COMMON
COMPLEX
CONTAINS
CONTINUE
CYCLE
DATA
DEALLOCATE
DEFAULT
DIMENSION
DO
DOUBLE
ELSE
END
ENDFILE
END IF
END SELECT
ENTRY
EQUIVALENCE
EXIT
EXTERNAL
FORMAT
FUNCTION
GO TO
IF
IMPLICIT
INCLUDE
INQUIRE
INTEGER
INTENT
INTERFACE
INTRINSIC
LOGICAL
MAP
MODULE
NAMELIST
NONE
OPEN
OPTIONAL
PARAMETER
PAUSE
POINTER
PRINT
PRECISION
PROCEDURE
PROGRAM
READ
REAL
RECORD
1
рус. имя, инг. name.
2
рус. зарезервированные слова, инг. reserved words
3
рус. ключевые слова, инг. key words
19


2 Фортран элементлари
RECURSIVE
RETURN
REWIND
SAVE
STOP
STRUCTURE
SUBROUTINE
TARGET
THEN
TYPE
UNION
USE
WHILE
WRITE
Мантиқий амалларни ва мантиқий доимийларни билдирувчи белгилашлар ҳам
Фортран сўзлари ҳисобланади.
Белги
Маъноси
Белги
Маъноси
.GT.
Қиёсий ’катта’
.OR.
Мантиқий ’ёки’,
(мантиқий қўшиш)
.LT.
Қиёсий ’кичик’
.AND.
Мантиқий ’ва’,
(мантиқий кўпайтириш)
.GE.
Қиёсий ’катта ёки тенг’
.NOT.
Мантиқий ’инкор’
.LE.
Қиёсий ’кичик ёки тенг’
.FALSE.
Мантиқий доимий ’ёлғон’
.NE.
Қиёсий ’тенг эмас’
.TRUE.
Мантиқий доимий ’ҳақиқат’
.EQ.
Қиёсий ’тенг’
.EQV.
Эквивалентлик муносабати
.NEQV.
Ноэквивалентлик муносабати
Фортранда ёзилган программада ёлғиз ва жуфтлашган махсус белгилар ҳам
ишлатилади. Бундай махсус белгилар қуйидаги жадвалда келтирилган.
Белги
Маъноси
Белги
Маъноси
=
Ўзлаштириш оператори
.
Сонли доимийларда
ўнли нуқта ёки мантиқий
амал/доимий элементи
+
Арифметик ’қўшиш’
(/
Массив конструкторида
/)
четки чегараловчилар
-
Арифметик ’айриш’

Белгили доимийларни
"
четки чегараловчилари
*
Арифметик ’кўпайтириш’
:
Ном ва калит сўз орасидаги
ажратувчи белги, индекс
қийматини ўзгариш
диапазонини кўрсатишда
ажратувчи белги, USE
операторида ONLY
тармоқланиш учун
ажратувчи белги
/
Арифметик ’бўлиш’,
!
Изоҳни бошланиши
COMMON-блок номи
учун ажратувчи белги
(
Қисм программа
Бўш жой
)
параметрлари рўйҳати,
массив ва цикл индекс-
лари
20


М. Нишонов, mnishonov@gmail.com
,
Рўйҳатда ажратувчи
::
Тавсифловчи ва эълон
белги

қилиш опероторларида
ажратувчи белги
&
Кейинги сатрга
==
Тенглик муносабати
ўтиш белгиси
;
Программани эркин
=>
Кўрсатгични ўзлаштириш
шаклда ёзганда
операторларни
ажратувчи белги
//
Сатрларни бирлаштириш
**
Даражага кўтариш
>
Муносабат ’катта’
/=
Муносабат ’тенг эмас’
<
Муносабат ’кичик’
>=
Муносабат ’катта ёки тенг’
%
Тузилма компонента-
<=
Муносабат ’кичик ёки тенг’
сини танловчи белги
2.5 Программа
Программа – компьютер бажариши учун берилган кўрсатмалар (операторлар)
кетма-кетлигидир. Бу кўрсатмалар кўпинча математик ҳисоблашлар, тенглик ва
тенгсизликларга асосланган қарорлар ёки "натижаларни экранга (файлга) ёз" каби
буйруқлар бўлиши мумкин. Программа матн файлга "сақланган" манбаа коди
1
дан
(биз манбаа коди ўрнига программа матни сўзини ишлатамиз) иборат. Бундай код
юқори даражада тартибланган кўрсатмалар кетма- кетлиги шаклида бўлади. Ҳар бир
программалаш тили айтилган кўрсатмаларни ёзиш учун ўзининг турли қоидаларига
(синтаксисига) эга.
2.6 Фортранда программа матнини ёзиш шакли
Программа матнини ёзишда икки хил шакл ишлатилиши мумкин. Улар
фиксирланган ва эркин шакллардир
2
. Фиксирланган шакл Фортран 77 ва ундан
аввалги стандартларга хосдир. Бундай шакл программаларни перфокарталар
ёрдамида хотирага киритишдан мерос бўлиб қолган. Программа матнини эркин
шаклда ёзиш Фортран 90 ва ундан кейинги стандартларда ишлатилади. Фортраннинг
янги стандартларида фиксирланган шаклни ҳам ишлатиш мумкин. Фиксирланган
шаклда программа матнини ёзишда сатр узунлиги 72 та жойдан иборат бўлади.
Дастлабки 5 та жой операторлар меткаси учун, 6 чи жой сатрни давом эттириш
белгиси учун, 7 дан 72 чигача жой операторларни ёзиш учун ажратилган. Давом
эттириш белгисисифатида бўш жой белгисидан бошқа ихтиёрий белги ишлатилиши
мумкин:
1
рус. программный код, инг. source code.
2
рус. фиксированный формат ва свободный формат, инг. fixed form ва free form
21


2 Фортран элементлари
1. . . . . . . . . 5
6
7. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
Программада бўш сатрлар компилятор томонидан ҳисобга олинмайди. Эр-
кин шаклда ёзилган программа сатрининг ҳамма жойлари тенг хуқуқли. Сатр
узунлиги 132 тагача жойдан иборат ва бўш жойлар аҳамиятли бўлиши мумкин.
Операторлар номини ёзганда номни ташкил қилган белгилар орасида бўш жой
қолдириш мумкин эмас. Масалан, ’∗∗’ даражага кўтариш операторидаги юлдуз-
чалар орасида бўш жой қолдириш хато ҳисобланади. Бўш жойлар ўзгарувчилар,
доимийлар номларини ёки оператор меткаларини ва калит сўзларни ажратиш учун
ишлатилади. Масалан,
REAL MASSA
GO TO 10
DO I = 1, 10
ёзувда REAL, TO ва DO дан кейин бўш жой зарур.
Программада қуйидаги ёзув ҳато ҳисобланади:
DO 3 i = 1. 3
Бу ерда 1 дан кейин вергул ўрнига нуқта ёзилган. Агар DO дан кейинги бўш
жой аҳамятли бўлмаганда эди у DO3i=1.3 ёзувга тенг кучли бўлар эди ва у Фортран
синатаксисига кўра DO3i номли ўзгарувчига 1.3 қийматни ўзлаштириш амалини
билдиради.
Баъзи калит сўзлар бир-биридан бўш жой ёрдамида ажратиб ёзилиши талаб
қилинади, баъзилари учун ажратиш шарт эмас. Масалан, BLOCK DATA оператори
BLOCKDATA каби ёзилиши мумкин. Қуйидаги таблицада бўш жой қолдириш зарур
бўлмаган ва зарур бўлган калит сўзлар рўйхати келтирилган:
Бўш жой шарт эмас
Бўш жой шарт
BLOCK DATA
CASE DEFAULT
DOUBLE COMPLEX
DO WHILE
DOUBLE PRECISION
IMPLICIT ...
ELSE IF
IMPLICIT NONE
END BLOCK DATA
INTERFACE ASSIGNMENT
END DO
INTERFACE OPERATOR
END FILE
MODULE PROCEDURE
END FORALL
RECURSIVE FUNCTION
END FUNCTION
RECURSIVE SUBROUTINE
END IF
RECURSIVE тур FUNCTION
END INTERFACE
тур FUNCTION
END MODULE
тур RECURSIVE FUNCTION
END PROGRAM
END SELECT
END SUBROUTINE
22


М. Нишонов, mnishonov@gmail.com
END TYPE
END WHERE
GO TO
IN OUT
SELECT CASE
Фиксирланган шаклда ёзилган программага мисол келтирамиз.
1234567..............................................................72
SUBROUTINE katta_kichik(bosh_satr, natija_satr, uzunligi, kk)
IMPLICIT NONE
INTEGER uzunligi
CHARACTER(uzunligi = *) :: bosh_satr, natija_satr
LOGICAL kk
C
C 1) Ҳарфли сатрнинг барча белгиларини катта ҳарфларга
C
ёки кичик ҳарфларга алмаштириш.
C
C 2) Аргументлар:
C
C
bosh_satr = киришда бошланғич ҳарфли сатр
C
natija_satr = чиқишда натижавий ҳарфли сатр
C
uzunligi = bosh_satr узунлиги
C
kk = ҳарф катта-кичиклигини алмаштириш калити
C
= .TRUE. бўлса катта ҳарфлар
C
= .FALSE. бўлса кичик ҳарфлар
C
INTEGER i, harflar, kichik, katta
katta = IACHAR(’A’) - 1
kichik = IACHAR(’a’) - 1
natija_satr = ’’
IF(kk) THEN
DO i = 1, uzunligi
harflar = IACHAR(bosh_satr(i:i)) - kichik
IF(harflar .GE. 1 .AND. harflar .LE. 26) THEN
C
Катта ҳарфларга алмаштириш
natija_satr(i:i) = ACHAR(katta + harflar)
ELSE
natija_satr(i:i) = bosh_satr(i:i)
END IF
END DO
23


2 Фортран элементлари
ELSE
DO i = 1, uzunligi
harflar = IACHAR(bosh_satr(i:i)) - katta
IF(harflar .GE. 1 .AND. harflar .LE. 26) THEN
C
Катта ҳарфларга алмаштириш
natija_satr(i:i) = ACHAR(katta + harflar)
ELSE
natija_satr(i:i) = bosh_satr(i:i)
END IF
END DO
END IF
END SUBROUTINE katta_kichik
Ушбу программада эътибор бериш керак бўлган ҳолат, бу операторлар 7- устун-
дан бошлаб ёзилганлигидир, 6- устун юқорида айтганимиздек аввалги сатрни (сатр
узунлиги 72 дан ортиб кетганда) кейинги сатрга давом эттириш учун ишлатиладиган
белги учун, 1- дан 5- гача устунлар операторлар меткалари учун ажратилган. Изоҳлар
биринчи устунда C ҳарфдан кейин ёзилган. Цикл оператори ва шарт операторла-
ри ўқиш осон бўлиш учун зинасимон кўринишда ташкил қилинган. Фиксирланган
шаклдаги программа сақланган файл номи .f ёки .for кенгайтмага эга бўлади.
Программада ишлатилган барча операторлар ҳақида келгусида сўз юритамиз.
Айнан шу программани эркин шаклдаги кўриниши қуйидагича бўлади:
1234567...........................................................132
SUBROUTINE katta_kichik(bosh_satr, natija_satr, uzunligi, kk)
IMPLICIT NONE
INTEGER uzunligi
CHARACTER(uzunligi = *) :: bosh_satr, natija_satr
LOGICAL kk
!
! 1) Ҳарфли сатрнинг барча белгиларини катта ҳарфларга
!
ёки кичик ҳарфларга алмаштириш.
!
! 2) Аргументлар:
!
!
bosh_satr = киришда бошланғич ҳарфли сатр
!
natija_satr = чиқишда натижавий ҳарфли сатр
!
uzunligi = bosh_satr узунлиги
!
kk = ҳарф катта-кичиклигини алмаштириш калити
!
= .TRUE. бўлса катта ҳарфлар
!
= .FALSE. бўлса кичик ҳарфлар
!
24


М. Нишонов, mnishonov@gmail.com
INTEGER i, harflar, kichik, katta
katta = IACHAR(’A’) - 1
kichik = IACHAR(’a’) - 1
natija_satr = ’’
IF(kk) THEN
DO i = 1, uzunligi
harflar = IACHAR(bosh_satr(i:i)) - kichik
IF(harflar .GE. 1 .AND. harflar .LE. 26) THEN
!
Катта ҳарфларга алмаштириш
natija_satr(i:i) = ACHAR(katta + harflar)
ELSE
natija_satr(i:i) = bosh_satr(i:i)
END IF
END DO
ELSE
DO i = 1, uzunligi
harflar = IACHAR(bosh_satr(i:i)) - katta
IF(harflar .GE. 1 .AND. harflar .LE. 26) THEN
!
Катта ҳарфларга алмаштириш
natija_satr(i:i) = ACHAR(katta + harflar)
ELSE
natija_satr(i:i) = bosh_satr(i:i)
END IF
END DO
END IF
END SUBROUTINE katta_kichik
Программани эркин шаклда ёзиш ҳақида баъзи нарсаларни айтиб ўтамиз.
Кўриниб турибдики, операторлар сатрда 1 дан 132 гача устунларда ёзилиши мум-
кин (7 чи устундан бошлаб ёзилиши шарт эмас!). Изоҳлар учун ундов белгиси (!)
ишлатилади. Изоҳларни сатрда оператордан кейин ундов белгисини қўйиб сатрни
давоми сифатида ёзиш имкони бор. Масалан,
m = 0.5
! Бу ерда m - жисмнинг оғирлиги (кг)
Баъзида оператор ёки бошқа ёзув битта сатрга сиғмаслиги мумкин. Умуман
олганда узун ёзувларни имкон қадар ишлатмасликка ҳаракат қилиш керак. Чунки
узун ёзувлар программани ўқишни қийинлаштиради. Агар узун ёзувлар билан
ишлашга мажбур бўлсангиз ва кейинги сатрга ўтишга тўғри келса, сатр охирида
амперсанд белгиси & ни ишлатинг. Ушбу белги кейинги сатр аввалгисининг довоми
эканлигини билдиради. Мисол:
25




2 Фортран элементлари
harflar = IACHAR(bosh_satr(i:i))&
- katta
Программанинг ушбу қисми қуйидагига тенг кучли
harflar = IACHAR(bosh_satr(i:i)) - katta
Аксинча агар битта сатрга бир нечта операторларни ёзишга тўғри келса уларни
нуқта-вергул (;) билан ажратиб ёзишингиз мумкин:
a = 2.2; b = 3; c = 13.8
2.7 Программа таркиби
Фортранда программа асосий программадан
1
ва бир нечта қисм программалар-
дан
2
иборат бўлиши мумкин. Қисм программалар функция
3
ёки процедура
4
, ташқи,
ички ёки модуллар
5
бўлиши мумкин. Асосий ва қисм программаларни программа-
нинг таркибий қисмлари деб атаймиз. Программа таркибий қисмларининг ҳар бири
алоҳида компиляция қилиниши мумкин. Бу хусусият жуда муҳим қулайлик туғдира-
ди. Программанинг алоҳида қисмларига тўла программани компиляция қилмасдан
ўзгартиришлар киритишга имкон беради.
Асосий программада биринчи сўз унинг сарлавҳасидир. Сарлавҳа PROGRAM
сўзидан бошланади. Ундан кейин унинг ёнида программа номи ёзилади:
PROGRAM программа_номи
Программа номи албатта ҳарфдан бошланади ва ундан сўнг рақамлар ҳамда
рухсат этилган белгилар ишлатилиши мумкин. Масалан,
PROGRAM summa
PROGRAM kvadrat_tenglama
PROGRAM ravon_s3
Номнинг узунлиги 31 та белгигача бўлиши мумкин. Бу қоида Фортрандаги
ихтиёрий ном учун амал қилади.
Программа сарлавҳасини ёзмаслик мумкин. Программа номи программада
ишлатилган бошқа номлар билан мос келмаслиги керак ва у ушбу программа матни
сақланган файл номи билан боғлиқ эмас.
1
рус. главная программа, инг. main program.
2
рус. подпрограмма, инг. subprogram.
3
рус. функция, инг. function.
4
рус. процедура, инг. procedure.
5
рус. внешняя, внутренняя ёки модул, инг. external, internal ёки module.
26


М. Нишонов, mnishonov@gmail.com
Қисм программаларда сарлавҳа фақат FUNCTION ва SUBROUTINE сўзлари бўлиши
мумкин. Ҳар қандай программанинг охирги оператори END бўлиши лозим. Асосий
программада охирги якунловчи оператор қуйидаги кўринишда ҳам бўлиши мумкин:
END PROGRAM программа_номи
программа_номи тушириб қолдирилиши мумкин.
Сарлавҳадан сўнг ўзгарувчиларни, доимийларни, меткаларни, қисм програм-
маларни ва бошқа объектларни тавсифлаш қисми ёзилади. Программанинг бу қисми
тавсифлаш бўлими
1
дейилади. Содда программаларда бу бўлимни ёзмаса ҳам бўлади.
Тавсифлаш бўлимидан кейин қандайдир амалларни бажариш учун мўлжаллан-
ган қисм ёзилади. Бу қисми операторлар бўлими деб аталади. Тавсифлаш бўлими
ўзгарувчилар, номланган доимийлар, COMMON- блоклар ва бошқа объектларни ифо-
даловчи гаплардан ташкил топади. Объектларни ифодаловчи гаплар бир қанча
бўлиши мумкин ва улар сарлавҳа ҳамда операторлар бўлими орасида жойлашади.
Ифодаловчи гаплар DATA сўзидан олдин ёзилиши керак.
IMPLICIT тавсифловчи бўлимда биринчи ёзиладиган оператордир. PARAMETER
операторида ишлатилган объектлар унгача тавсифловчи бўлимда аниқланган бўлиши
лозим.
2.8 Маълумотларнинг турлари
Фортранда маълумотлар турли усуллар ёрдамида сақланиши ёки уларга муро-
жаат қилиниши мумкин. Маъумотларга тўғридан тўғри мурожаат қилиш мумкин,
масалан, ҳақиқий сонга 4.67 ва 8.0056, бутун сонга 12345 ёки -890, белгили маълу-
мотга ’Davom et’ каби. Маълумотларни x ёки y, ёки MASOFA каби номлаб, уларни
хотирада сақлаш ёки уларга мурожаат қилиш мумкин, π ёки ёруғлик тезлиги c
каби доимийлар ўзгармас қиймат қабул қилувчи номлар орқали аниқланиши мум-
кин. Маълумотларни массивлар, кўрсаткичлар ёки ҳосилавий турдаги ўзгарувчилар
сифатида ҳам сақлаш мумкин.
Доимийлар, ўзгарувчилар, турли функцияларнинг барчасини маълумот тури
тушунчаси орқали тасвирлаш мумкин. Ўрнатилган (ёки ички)
2
ва ҳосилавий
3
турлар
мавжуд. Ўрнатилган турлар программалаш тилида, ҳосилавийлари эса программачи
томонидан киритилади.
Маълумотлар учун ички турлар:
Бутун
-
INTEGER, BYTE, INTEGER(1), INTEGER(2), INTEGER(4)
Ҳақиқий
-
REAL, REAL(4), REAL(8), DOUBLE PRECISION
Комплекс
-
COMPLEX, COMPLEX(4), COMPLEX(8), DOUBLE COMPLEX
Мантиқий
-
LOGICAL, LOGICAL(1), LOGICAL(2), LOGICAL(4)
Белгили
-
CHARACTER(n)
1
рус. раздел описаний.
2
рус. встроенный тип, инг. internal type
3
рус. производный тип, инг. derivative type
27


2 Фортран элементлари
Мантиқий турдаги маълумот объекти фақат иккита .TRUE. (ҳақиқат) ёки
.FALSE. (ёлғон) қиймат қабул қилиши мумкин.
Фортранда ҳар бир ички маълумот тури тур параметри
1
(KIND) билан харак-
терланади. Сонли маълумот турлари
2
учун ушбу параметр орқали аниқликни ва
уларнинг ўзгариш оралиғини назорат қилиш имкони бор. Ҳозирги кунда белгили
турдаги маълумотлар учун фақат бир дона тур параметри мавжуд (KIND = 1).
Ҳар бир ички маълумот тури ноошкор (инг. by default, рус. по умолчанию)
аниқланган турга эга. Ноошкор тур – маълумотларнинг стандарт тури деб аталади.
Маълумотларнинг стандарт турлари қуйидаги опреаторлар билан аниқланган
маълумотларга мос келади:
Бутун
-
INTEGER
Ҳақиқий
-
REAL
Комплекс
-
COMPLEX
Мантиқий
-
LOGICAL
Белгили
-
CHARACTER
Изоҳ :
1. Ҳар бир сонли тур ишорасиз 0 қийматли элементга эга.
2. Фортран 90/95 стандартдаги барча маълумот турлари Фортран 77 стандартда
ҳам мавжуд эди. Лекин бошқача кўринишда ёзилар эди. Масалан:
Фортран 90
Фортран 77
INTEGER(1)
INTEGER*1
INTEGER
INTEGER
COMPLEX(4)
COMPLEX*4
COMPLEX(8)
COMPLEX*16
Фортран 90/95 да ички маълумот турини тавсифлаш операторидан кейин қавс
ичида тур параметри кўрсатилади, Фортран 77 да эса юлдузчадан кейин маълумот
турига ажратилган байтлар сони ёзилар эди. Фортран 77 билан мосликни сақлаш
учун янги Фортран стандартларида Фортран 77 синтаксисини ишлатиш имкони
мавжуд.
Ички маълумот турлари билан бирга ҳосилавий (программачи томонидан
киритиладиган) турларни ҳам аниқлаш мумкин. Бунда ички маълумот турлари ва
аввал аниқланган ҳосилавий турлардан фойдаланилади. Бундай турлар TYPE ...
END TYPE оператори ёрдамида ҳосил қилинади.
Фортранда кўп сондаги алмаштирувчи ва маълумот олишга имкон берувчи
ички функциялар киритилган. Улар ҳар хил турдаги маълумотларнинг хусусиятлари
ҳақида ахборот олишга ёрдам беради. Масалан, энг катта мумкин бўлган ҳақиқий
ёки бутун сон қийматини HUGE оператори, энг кичик мумкин бўлган қийматни TINY
оператори ёрдамида билиш мумкин.
1
рус. разновидность типа, инг. kind of type.
2
рус. данные числового типа.
28


М. Нишонов, mnishonov@gmail.com
2.9 Ўзгарувчилар
Программада ўзгарувчилар, доимийлар, ифодалаш учун гаплар (ёки тавсифлаш
операторлари) ва операторлар ишлатилишига гувоҳ бўляпмиз.
Ўзгарувчи – қандайдир номга ва хусусиятга эга. У компьютер хотираси билан
боғланган. Баъзида ўзгарувчига компьютер хотирасининг битта абстракт ячейкаси
мос келади дейилади. Бу ячейканинг сиғими ўзгарувчи турига, яъни унда қандай
маълумот сақланганлигига боғлиқ. Ўзгарувчи бир қанча хусусиятлар билан харак-
терланади. Унинг номи – шундай хусусиятлардан бири. Бошқа бир хусусият унинг
қиймати. Ўзгарувчи билан боғлиқ хотира ячейкасидаги маълумот ўзгариши мумкин.
Шунинг учун у ўзгарувчи дейилади! Ўзгарувчининг тури – яна бир хусусият. Ўзга-
рувчининг тури хотира ячейкасида сақланаётган маълумот турини, ушбу маълумот
устида бажариладиган амаллар ва мумкин бўлган қийматлар чегарасини аниқлайди.
Ўзгарувчининг яна бир муҳим хусусияти бу – унинг манзили. Манзил ўзгарувчи
қиймати сақланган хотира ячейкаларининг энг катта номерли ячейка тартиб рақами.
Ўзгарувчининг кўриниш соҳаси – ўзгарувчи қийматини операторлар ишлата олади-
ган программанинг қисми. Бунда глобал ва локал ўзгарувчилар ҳақида гапирилади.
Глобал ўзгарувчилар программанинг ҳамма қисмида, локал ўзгарувчилар эса унинг
алоҳида қисмидагина ишлатилади.
Ўзгарувчиларни ифодаловчи гаплар Фортран 90/95 да қуйидаги кўринишда
бўлади:
тур ўзгарувчиларнинг_рўйҳати
ёки
тур, хусусиятлар :: ўзгарувчиларнинг_рўйҳати
Масалан,
INTEGER olmalar, anorlar
REAL, PARAMETER :: maosh = 800 000
Бу ерда REAL, INTEGER лар ҳақида юқорида айтиб ўтдик. olmalar, anorlar -
ўзгарувчиларнинг номлари, PARAMETER бўлса maosh объектининг хусусияти.
Фортраннинг янги стандартида ифодалаш гаплари қисқароқ ва кўпроқ маъ-
лумот сиғимига эга. Масалан, Фортран 77 да жуфт икки нуқта ишлатилмайди ва
хусусиятлар рўйҳати мавжуд эмас:
REAL pi_soni, bmassiv
PARAMETER(pi_soni = 3.14159)
DIMENSION bmassiv(5)
DATA bmassiv /1.0, 2.0, 3.0, 4.0, 5.0/
Айнан шу парча Фортран 90/95 да иккита сатрда ёзилади:
29


2 Фортран элементлари
REAL, PARAMETER :: pi_soni = 3.14159
REAL, DIMENSION(1:5) :: bmassiv = (/1.0, 2.0, 3.0, 4.0, 5.0/)
Объектлар учун қуйидаги хусусиятлар
1
ишлатилади:
PARAMETER
номланган доимий;
PUBLIC
программа ташқарисида ҳам кўринади;
PRIVATE
программа ташқарисида кўринмайди;
POINTER
кўрсаткич (йўлланма);
TARGET
кўрсаткич ўрнатувчи операторда манзил;
ALLOCATABLE
ўлчам ўзгариб турадиган массив;
DIMENSION
массив
INTENT
процедура параметри учун алоқа тури
(кирувчи, чиқувчи ёки кирувчи-чиқувчи);
OPTIONAL
процедуранинг шарт бўлмаган параметри
SAVE
қисм программада маҳаллий ўзгарувчининг
қийматини турли чақирувлар орасида сақлаш;
EXTERNAL
ташқи функция;
INTRINSIC
ички функция
2.10 Доимийлар
Доимий – ўзгарувчидан фарқ қилиб программа ишлаши мобайнида унинг қийма-
ти ўзгармайди. Рақамли ва номланган доимийлар бўлади. Рақамли доимийлар ҳолида
уларнинг қиймати улар қандай кўринишда тасвирланган бўлса шундайлигича ишла-
тилади. Номланган доимийларга уларнинг турига қараб ҳар хил қийматлар бериш
мумкин. Улар сон, белгили ва ҳ.к. лар бўлиши мумкин. Номланган доимийларга
уларнинг номлари орқали мурожаат қилинади. Уларнинг номларига ўзгаруви ном-
ларига қўйилган талаблар қўйилади. Номланган доимийларни ифодаловчи гаплар
қуйидаги кўринишда бўлади:
тур, PARAMETER :: ном_1 = қиймат_1, ном_2 = қиймат_2, ...
ёки
PARAMETER(ном_1 = қиймат_1, ном_2 = қиймат_2, ... )
Иккинчи вариант Фортран 77 да ишлатилади. Мисол:
INTEGER, PARAMETER ::
my_birth_year = 1969
REAL, PARAMETER :: mass_of_proton = 938.3
! МэВ ларда
1
рус. атрибуты, инг. attributes.
30


М. Нишонов, mnishonov@gmail.com
Рақамли доимийнинг тури унинг қиймати орқали аниқланади. Масалан, 1211
бутун қийматга эга ва унинг тури INTEGER. Ноошкор ҳолда сонли қийматлар ўнли
ҳисоб тизимида деб фараз қилинади.
Фиксирланган нуқтали
1
шаклда ёзилган ҳақиқий турдаги рақамли доимий
(баъзида вергул билан ёзилади) ишора белгиси, бутун қисм, ўнли нуқта ва каср
қисмдан иборат бўлади. Масалан, 2.5, -10.0, .005 ва ҳ.к.
Сузувчи нуқтали
2
шаклда ҳақиқий турдаги доимийларни ёзишда E ва D ҳарфлар
ишлатилади. Уларнинг иккаласи ҳам 10 асосни билдиради, фарқи, E ҳарфи оддий
аниқлик, D эса иккиналган аниқлик учун қўлланади. Ушбу ҳарфлардан сўнг даража
ёзилади, масалан, .314159E1. Уни .314159 × 10
1
деб ўқиш керак.
Комплекс турдаги доимийлар қавслар ичида ёзилади:
(0., 1.) - мавҳум сон i ни билдиради;
(1., 0.) - ҳақиқий бир сонини билдиради;
(2., 1.) - 2 + i комплекс сонни билдиради.
Иккита мантиқий доимийлар мавжуд:
.TRUE. - ’ҳақиқат’;
.FALSE. - ’ёлғон’.
Номланган белгили доимий қўштирноқ ичида ёзилади. Қўштирноқлар ушбу
доимийнинг қийматига кирмайди, улар фақат четки чегараловчи белги ҳисобланади.
Мисол:
’satr’
"Жон Бекусни туғилган куни билан табриклаймиз!" ! Фортран асосчиси
2.11 Массивлар
Массив - таркибли турлар қаторига мансуб объект ҳисобланади. У умумий ном
берилган бир хил турдаги кўпгина қийматлар тўпламидир. Массив элементлари
индекслар орқали фарқланади. Индексни элемент тартиб рақамининг умумлашгани
деса ҳам бўлади. Индекс бутун турдаги қиймат қабул қилади ва у манфий ва мусбат
бўлиши мумкин.
Ҳисоблаш билан боғлиқ масалаларни ҳал этишда массивлар муҳим аҳамиятга
эга. Шунинг учун программалаш тили массивлар билан ишлаш учун қулай имко-
ниятларга эга бўлиши муҳимдир. Ҳисоблашларда массивларнинг муҳимлиги нима
билан боғлиқ? - деб сўрашингиз мумкин. Гап шундаки, илмий-тадқиқот соҳасида
фаолият юритадиган программачилар кўпинча тенгламалар ёрдамида ҳисоблашлар
бажаришига тўғри келади. Булар алгебраик тенгламалар системаси, дифференциал
1
рус. с фиксированной точкой.
2
рус. с плавающей точкой.
31


2 Фортран элементлари
ёки интеграл тенгламалар бўлиши мумкин. Алгебраик тенгламалар системасини
ечишда тушунарлики масалани ечиш матрицалар билан ишлашга олиб келинади.
Матрицалар эса компьютерда массивлар орқали тасвирланади. Дифференциал ва
интеграл тенгламаларни сонли усуллар асосида ечиш ҳам матрицалар билан ишлаш-
га келтирилади. Программалаш тиллари ичида Фортран - массивлар билан ишлашга
қулай имкониятларга эга бўлган кам сондаги тиллардан биридир.
Массивлар DIMENSION хусусияти ёрдамида тавсифланади:
REAL, DIMENSION(1:100) :: bmassiv
Қавслар ичида индексларнинг ўзгариш диапазонини энг кичик ва энг катта
қийматлари кўрсатилади. Массивлар ҳақида келгусида алоҳида гаплашамиз.
2.12 Маълумотларнинг ҳосилавий турлари
Юқорида маълумотларнинг стандарт (ёки ички) турлари ҳақида сўзлашган
эдик. Фортран программачи томонидан янги ҳосилавий турлари аниқлашга имкон
беради. Фортранда ҳосилавий тур бир нечта қисмлардан топган таркибли объект-
дир. Алоҳида қисмларнинг турлари ҳар-хил бўлиши мумкин. Ҳосилавий турни
ифодоловчи гап TYPE калит сўзидан бошланади:
TYPE yangi_tur
REAL x, y
INTEGER rang
CHARACTER(LEN = 15) obyekt_nomi
END TYPE yangi_tur
Келтирилган мисолда x, y, rang ва obyekt_nomi янги ҳосилавий тур қисмла-
ридир.
Фортрандаги ҳосилавий турларни маълум маънода Паскаль программалаш
тилидаги ёзувлар ва C тилидаги таркибий объектларнинг аналоги деб ҳисоблаш
мумкин. Баъзида ҳар-хил турдаги объектларни умумий ном билан бирлаштириш
қулай. Массивлар фақат бир хил турдаги объектлар тўплами бўла олади ва ҳосилавий
турдаги каби имкониятга эга эмас.
Фортран ҳосилавий турдан ташқари яна ҳосилавий амалларни аниқлашга ҳам
имкон беради. Программачи томонидан аниқланган ҳосилавий амаллар мавжуд
стандарт амалларнинг имкониятларини кенгайтиради.
2.13 Кўрсатгичлар
Бошқа объектларга йўлланма берувчи ёки бошқа объектларни кўрсатувчи
объект йўлланма ёки кўрсаткич
1
деб аталади. Аниқроқ айтганда кўрсаткич бу - қий-
1
рус. ссылка, инг. pointer.
32


М. Нишонов, mnishonov@gmail.com
матлари оралиғи ҳотира ячейкаларидан ташкил топган ўзгарувчидир. Кўрсатгични
ифодалаш учун POINTER хусусияти ишлатилади. Йўлланма аввалдан аниқланган
мавжуд объектни ёки махсус ажратилган хотира соҳасини кўрсатиши мумкин. Кўр-
сатгичларни миқдори ўзгариб турувчи маълумотлар объектларини программалаш
учун қўллаш мумкин. Масалан, рўйҳатлар, навбатлар, стеклар ва бошқа ҳолларда.
2.14 Меткалар
Фортранда операторлар меткаларга эга бўлиши мумкин. Улар операторларга
мурожаат қилиш ёки улар билан боғланиш учун ишлатилади, алгоритмлардаги
’ташлаб кетиш’ ёки ’айланиб ўтиш’ каби ҳолатларни амалга оширишда қулланади.
Меткалар биттадан бештагача рақамлардан иборат бўла олади. Метка ноллардан
бошланса улар ҳисобга олинмайди, лекин албатта бешта рақамдан биттаси нолдан
фарқли бўлиши лозим. Қуйидаги меткалар тўғри ёзилган:
123
7000
99999
1
00001
охирги иккита метка эквивалент.
Программани фиксирланган шаклда ёзишда сатрдаги 1 дан 5 гача жойлар
меткалар учун ажратилгани ҳақида гапириб ўтган эдик. Мисол:
i = 0
1
i = i + 1
CALL sehr(i, ooo)
PRINT*, ooo
GO TO 1
Эркин шаклда метка ишорасиз рақамли доимий ҳисобланади, у бошқа объект-
лардан битта ёки бир нечта бўш жойлар билан ажратиб ёзилади. Мисол:
PRINT*, "x2=", x2; 3 aaa = ’1’; PRINT*, aaa; GO TO 3
2.15 Изоҳлар
Программа матнининг асосий қисмларидан бири изоҳлардир. Изоҳларни ком-
пилятор кўрмайди. Улар бажарилувчи программага таъсир қилмайди. Лекин про-
граммалар ёзишда жуда муҳим аҳамиятга эга.
Изоҳлар ёрдамида программанинг тўла маъносини программанинг матнида тав-
сифлаш мумкин. Яхши программада унинг турли қисмлари маъноси изоҳлар орқали
33


2 Фортран элементлари
тавсифланган бўлади. Изоҳларни тўғри ишлатиш программани тушунишни осонла-
штиради. Изоҳларсиз фақат операторлардан иборат программани ўзингиз таҳлил
қилиб кўринг. Ўшанда изоҳларнинг аҳамияти ўта муҳим эканлигини тушунасиз.
Фиксирланган шаклда программа ёзишда изоҳлар сатрнинг 1 чи устунида C
ҳарфини ёзиш билан аниқланади. Эркин шаклда бу усул қўлланилмайди, бу ҳолда
изоҳ ундов белгиси ’!’ билан бошланади. Бу усулда изоҳ сатрнинг иҳтиёрий қисмида
жойлашиши мумкин ва сатрни тамомлаш белгиси билан тугайди. Изоҳ ёзилган
сатр кейинги сатрга давом эттирилмайди. Чунки ундов белгисидан кейин ёзилган
ихтиёрий белги ўзининг махсус вазифасидан ажралади.
2.16 Операторлар
Оператор – қандайдир амални ифодалайди. Масалан, математик формула орқа-
ли ҳисоблаш ёки программанинг бошқа операторларини бажарилиш кетма-кетлигини
ифодалаши мумкин. Ўзгарувчиларнинг (ва бошқа объектларнинг) хусусиятларини
ифодаловчи операторлар ифодалаш учун гаплар ёки тавсифлаш операторлари дейи-
лади. Программа ишини бошқарувчи операторлар бошқарувчи операторлар дейила-
ди. Бошқарувчи операторлар алгоритмнинг асосий тузилишини ташкил қилишади,
масалан, бинар, кўп қаватли тармоқланиш (шарт операторлари, танлаш операторла-
ри) ва такрорланувчи амалларни бажаришдаги цикллар. Маълумотни киритиш ва
чиқариш операторлари ҳам бор.
Баъзи операторлар билан танишайлик. Ўзлаштириш операторидан бошлаймиз:
ўзгарувчи_номи = ифода
= - белги Фортранда ўзлаштириш оператори ҳисобланади. Бунда ўзлаштириш
операторидан ўнгда жойлашган ифода доимийлардан, ўзгарувчилардан, функцияга
мурожаат ва арифметик амаллар белгиларидан ташкил топган бўлиши мумкин.
Дастлаб ифода қиймати ҳисобланади, сўнгра олинган натижавий қиймат ўзлашти-
риш операторининг чап томонида турган ўзгарувчи_номи учун ажратилган хотира
ячейкасига жойланади. Мисол:
b341 = 0.23
z = x / (1.0 + x**5)
Ўзлаштириш операторининг кўриниши арфиметик тенглик ёзувига ўхшаб
кетади. Лекин ўзлаштириш оператори бажариш зарур бўлган бир нечта амаллар
кетма- кетлигини ифодалайди (ҳисоблаш, ҳотирадан чиқариш ва хотирага жойлаш).
Арифметик тенглик эса фақат иккита катталик орасидаги муносабатни билдиради.
Арифметик кўпайтиришни бажариш учун * юлдузча ишлатилади, даражага
кўтариш амали ** қўш юлдузча орқали бажарилади. Масалан a x
2
ифода Фортранда
a * x**2 кўринишда ёзилади.
Арифметик амалларни бажаришда амалларнинг муҳимлик даражасини ёдда
тутиш лозим. Муҳимлик даражаси қайси амал биринчи, қайсиниси кейин бажарилиш
34


М. Нишонов, mnishonov@gmail.com
тартибини белгилайди. Биринчи бўлиб даражага кўтариш амали бажарилади. Кейин
кўпайтириш ва бўлиш амаллари, сўнгра қўшиш ва айриш амаллари бажарилади.
Агар муҳимлик даражаси бир хил амаллар кетма- кет келса, улар чапдан ўнга
қараб навбат билан бажарилади. Амалларни бажарилиш тартиби қавслар ёрдамида
ўзгартирилиши мумкин. Арифметик амалларда қавслар билан ажратилган қисм
биринчи бажарилади.
Қуйидаги ифодани қарайлик.
a + b * c / d - e * f
амал қуйидаги тартибда бажарилади:
1.
b * c
(натижа а1)
2. a1 / d
(натижа а2)
3.
e * f
(натижа а3)
4.
a + a2 (натижа а4)
5. a4 - a3.
Қуйидаги жадвалда арифметик амаллар бажарувчи операторларнинг муҳим-
лик даражаси келтирилган.
Оператор
Муҳимлик
Маъноси
даражаси
∗∗
1
Даражага кўтариш

2
Кўпайтириш
/
Бўлиш
+
3
Қўшиш

Айриш
Арифметик ифодаларда ҳар хил турдаги катталиклар биргаликда ишлатилиши
мумкин. Масалан,
INTEGER iv
REAL v1, v2
v2 = iv + v1
Бундай ҳолларда ўзлаштириш операторидан ўнгда турган ифодани ҳисоблашда
дастлаб барча қийматларни энг ’мураккаб’ турдаги қийматга алмаштириш амали
бажарилади (бутун ҳақиқийдан ’соддароқ’, ҳақиқий эса комплексдан ’содда’). Нати-
жа ўзлаштириш операторидан чапда турган ўзгарувчи турига мос келувчи турга
алмаштирилади.
35


2 Фортран элементлари
2.17 Ифодалар билан ишлаш учун қоидалар
Ифодалар бажарилгач олинадиган натижа унда ишлатилган ўзгарувчиларнинг
турига боғлиқ. Агар ’a оператор b’ ифода бажарилаётган бўлса, бу ерда оператор
(+, –, ∗, /, ∗∗) арифметик амаллардан бири, натижа тури қуйидаги қоидаларга
асосланиб ҳосил қилинади:
a тури
b тури
натижа тури
INTEGER
INTEGER
INTEGER
INTEGER
REAL
REAL
INTEGER
COMPLEX
COMPLEX
REAL
REAL
REAL
REAL
COMPLEX
COMPLEX
COMPLEX
COMPLEX
COMPLEX
Бутун турдаги ўзгарувчилар билан ишлаганда, натижа кесиб ташлаш орқали ҳосил
бўлишини унутмаслик керак. Кўпинча учрайдиган хато ’1 / 2’ каби ёзув. Унинг
натижаси 0 га тенг. Бундай ёзув туфайли топиш қийин бўлган тушинарсиз хатолар
содир бўлиши мумкин.
Комплекс сон комплекс даражага кўтарилганда асосий қиймат (аргумент (−π,π)
оралиқда ўзгаради) олинади.
’Ўзгарувчи = ифода’ шакл ишлатилганда, ўзгарувчи ва ифода тури мос бўлмаса,
натижа турини қуйидаги жадвалда кўрсатилгандек аниқлаш мумкин:
Ўзгарувчи тури
Ифода
Ўзлаштирилган қиймат
INTEGER
REAL
кесилган бутун қиймат
INTEGER
COMPLEX
кесилган бутун қиймат
REAL
INTEGER
ҳақиқийга ўгириш
REAL
COMPLEX
ҳақиқий қисми
COMPLEX
INTEGER
ҳақиқий қисми бор, мавхум қисми 0
COMPLEX
REAL
ҳақиқий қисми бор, мавхум қисми 0
2.18 Мантиқий шартлар ва назорат қилиш операторлари
структураси
Ифодаларни ёзишда турли мантиқий шартлар ва уларни назорат қилиш учун
қуйидаги операторлар ишлатилади:
36


М. Нишонов, mnishonov@gmail.com
IF ( ikki_karra_ikki == 4) THEN
PRINT *, ’икки карра икки 4’
ELSE
PRINT *, ’икки карра икки 4 эмас, арифметикани такрорланг!’
ENDIF
hisoblagich = 0
DO WHILE (hisoblagich < 10)
PRINT *, ’ҳисоблагич қиймати ’, hisoblagich, ’га тенг’
hisoblagich = hisoblagich + 2
ENDDO
IF ( a>=b ) THEN
b=0
ENDIF
SELECT CASE (i)
CASE (1) ! i = 1
j = 3
CASE (2, 4) ! i = 2 ёки 4
j = 7
END SELECT
summa = 0
DO i= 1, 100, 2 ! i ни ўзгариш қадами 2
summa = summa + i
ENDDO
Ҳисоблашлар вақтида бирор шартга асосланиб қарор қабул қилишга тўғри
келса нима қиламиз? Мисол қарайлик, у қўйилган саволга жавоб беришга ёрдам
беради. Фараз қилайлик, физика факултетида ўқийдиган студентнинг математикадан
олган бали у тўплаган барча баллар ўртачасини яхшиласагина инобатга олиниши
керак бўлсин. Шу вазифани бажарадиган программа ёзамиз. Биз баҳолаш учун
тўртта қийматни ўқиймиз ва ўртача бални печатга чиқарамиз.
37


2 Фортран элементлари
PROGRAM fizik
IMPLICIT NONE
REAL :: p1, p2, p3, maths
REAL :: av1, av2
! баҳоларни ўқиймиз
READ(*,*) p1, p2, p3, maths
! иккита ўтрача қийматни ҳисоблаймиз
av1 = p1 + p2 + p3
av2 = av1 + maths
av1 = av1 / 3.0 ; av2 = av2 / 4.0
! шарт операторини ишлатамиз
IF (av2 > av1) THEN
WRITE(*,*) ’Умумий ўртача балл = ’,av2
ELSE
WRITE(*,*) ’Умумий ўртача балл = ’,av1
END IF
END PROGRAM fizik
• Программани компиляция қилинг ва уни ишлашини тушинганингизга ишонч
ҳосил қилинг.
• IF операторида ифодаларни ёзишда уларни қават-қават қилиб жойлашганига
эътибор беринг. Бундай ёзув программани мантиқий тузилишини тез тушини-
шга ёрдам беради. Лекин бу муҳим эмас.
IF оператори аввал нима бўлганига қараб қандай қарор қабул қилишга имкон
берадиган энг содда ва муҳим оператордир. У умумий ҳолда қуйидаги шаклга эга:
IF (мантиқий ифода) амал
Манфий қийматларни қуйидагича олиб ташлашимиз мумкин:
IF (x < 0) x=0 ! x ни манфий қийматларини 0 га алмаштириш
IF оператори, худди юқоридаги мисолдаги каби, кенгайтирилган шаклда ишла-
тилиши мумкин:
IF (мантиқий ифода) THEN
қандайдир амал
ELSE
бошқа амал
END IF
38


М. Нишонов, mnishonov@gmail.com
Бунда агар мантиқий ифода ёлғон бўлса, ELSE операторидан кейинги амал
бажарилади. Қават-қават IF операторида тўғри жавобли мантиқий ифода келмагу-
нича текшириш бажарилаверади. Юқоридаги шарт операторини янада ёйиб ёзиш
мумкин:
IF (мантиқий ифода) THEN
қандайдир амал
ELSE IF (мантиқий ифода) THEN
бошқа бир амал
ELSE
яна бошқа амал
END IF
Бири иккинчисини ичида жойлашган шарт операторлари ҳам учрайди. Фараз
қилайлик, x = (b

d/a) да x ни қийматини ҳисобламоқчимиз. Бунда агар d < 0 ёки
a = 0 бўлганда ифода нотўғри. Яхши программа бундай ҳолатларни текширади.
IF (a /= 0.0) THEN
IF (d < 0.0) THEN
WRITE(*,*) ’d манфий, нотўғри қиймат’
ELSE
x = b * SQRT(d) / a
END IF
ELSE
WRITE(*,*) ’a нол, нотўғри қиймат’
END IF
Катта программаларда ичма-ич жойлашган шарт операторлари қаерда қайси
бошланиб қаерда тугалланганлигини кўриш қийинлашиб кетади. Шунинг учун шарт
операторларини номлаш имкониятидан фойдаланиш қулай. Юқоридаги программани
бошқача ёзайлик:
tashqi: IF (a /= 0.0) THEN
ichki: IF (d < 0.0) THEN
WRITE(*,*) ’d манфий, нотўғри қиймат’
ELSE ichki
x = b * SQRT(d) / a
END IF ichki
ELSE tashqi
WRITE(*,*) ’a нол, нотўғри қиймат’
END IF tashqi
Мантиқий шарт операторини умумийроқ ҳолда мантиқий ўзгарувчилар ёрдами-
да ҳам ишлатиш мумкин. Мантиқий ўзгарувчилар иккитагина қиймат қабул қилади:
.TRUE. ёки .FALSE.. Қуйида уларни ишлатишга мисол келтирамиз:
39


2 Фортран элементлари
LOGICAL :: l1, l2
l1 = x > 0.0
l2 = y /= 1.0
IF (l1 .and. l2) THEN
...
Бу программа қисми аслида қуйидагича ёзилиши мумкин:
IF ((x > 0.0) .AND. (y /= 1.0)) THEN
...
Мантиқий ўзгарувчиларни ишлатиш баъзи нарсаларни осонроқ тушинишга
ёрдам беради.
2.19 Цикл оператори
Цикл – программа ёзишда жуда муҳим бўлган яна бир тушунча. Агар бир
қанча кўрсатмалар кўп марта такроран бажарилиши талаб қилинса цикл тушунчаси
ишлатилади. Циклни назорат қилишга имкон берадиган кўпгина усуллар мавжудлиги
уни жуда фойдали қурол сифатида ишлатишга сабаб бўлади.
Умумий ҳолда цикл DO оператори орқали қуйидаги шаклда бўлади:
DO var = boshla, tuga [,qadam]
кўп марта бажарилувчи амал
END DO
бунда квадрат қавс ичидаги ёзув тушириб қолдирилиши мумкин. Юқорида
• var бутун турдаги ўзгарувчи
• boshla цикл ўзгарувчиси var ни бошланғич қиймати
• tuga – var ни охирги қиймати
• qadam – var ни ўзгариш қадами, ёзилмаган бўлса 1 деб фараз қилинади.
Цикл var га boshla қиймат бериш билан ишлашни бошлайди. Агар var ≤ tuga бўлса,
END DO гача турган амаллар бажарилади ва var га qadam қиймати қўшилади. Бундай
ҳол var қиймати tuga га тенг бўлмагунича такрорланади. Цикл оператори бирон
марта ҳам ишламаслиги мумкин бўлган ҳолатлар учрайди. Масалан, boshla > tuga
ва qadam = 1 бўлганда.
Факториални ҳисоблайдиган программани қарайлик:
40


М. Нишонов, mnishonov@gmail.com
PROGRAM factorial
IMPLICIT NONE
! ўзгарувчиларни аниқлаймиз, бошланғич қиймат билан
INTEGER :: nfact = 1
INTEGER :: n
! факториални ҳисоблаймиз
DO n = 1, 10
nfact = nfact * n
WRITE(*,*) n, nfact
END DO
END PROGRAM factorial
• Факториал учун ёзилган программани ўзгартиринг: цикл ўзгарувчисининг
охирги қиймати 10 ни 100 га алмаштиринг ва END DO операторидан аввал
қуйидаги сатрни қўшинг:
IF (n > 10) EXIT
Чиқарилаётган натижа қандай ўзгаради? EXIT буйруғи цикл ишини якунлайди.
2.20 STOP оператори
Хозиргина EXIT оператори циклни қандай якунлаши ҳақида гапирдик. Агар
сиз программа ишлашини якунлашини хохласангиз STOP операторини ишлатишингиз
мумкин. Бу оператор программа якунлангач экранга маълумот чиқаришга ҳам имкон
беради:
STOP ’Программа ишини тугатди!’
2.21 Мустақил ишлаш учун савол ва топшириқлар
1. Фортран кўпинча қаерда қўлланилади? Компилятор нима?
2. Фортран алфавити қандай белгилардан ташкил топган?
3. Фортранда ёзилган программада қандай махсус белгиларни ишлатиш мумкин?
4. Фортранда ёзилган программа қандай таркибга эга?
5. Фортранда қандай маълумот турлари бор?
6. Комплекс турга эга бўлган доимийга мисол келтиринг.
41


2 Фортран элементлари
7. Комплекс турга эга бўлган ўзгарувчига мисол келтиринг.
8. Қуйидаги тавсифлаш тўғрими:
INTEGER integer
9. Қуйидаги тавсифлаш тўғрими:
LOGICAL all
10. Қиймати 3.1415 га тенг бўлган доимийни қандай тавсифлаш мумкин?
11. Қуйидаги тавсифлаш тўғрими:
COMMON :: var
12. Қуйидаги сатр маъносини тушунтиринг:
a = 1; b = 2.1 ! Бутун ва ҳақиқий ўзгарувчилар; c = 1.3; d = 25
13. Қуйидаги сатрлар тўғрими:
y = COS(MAX(x,y)) * EXP(-COS(z)**i) - TAN(AT&
AN(x4))
14. Компьютердан фойдаланмасдан программа ишлагач олинадиган натижани
аниқланг:
PROGRAM misol1
INTEGER(4) :: n
REAL :: x
n = 0; x = 1.0
DO WHILE(x < 1.0E5)
n = n + 1
x = 2.0 + x
END DO
PRINT *, n, ’ ’, x
END PROGRAM misol1
42


3 чи БОБ
Маълумот турини тавсифлаш операторлари
Агар ниманидир бувингизга тушунтириб бера олмасангиз,
демак ўзингиз ҳам уни яхши тушунмайсиз.
Алберт Эйнштейн
Маълумот турларини тавсифлаш операторлари программада ишлатилаётган
барча объектлар ҳақидаги маълумотларни ўз ичига олади. Фортран қоидаларига
кўра маълумотларни тавсифлаш блоки программанинг (асосий программа, қисм
программа, модулнинг) энг бошида жойлаштирилиши зарур. Юқорида келтирил-
ган мисолларда ҳам маълумотларни тавсифлаш блоки учраган эди. Ушбу бобда
тавсифлаш операторлари ҳақида батафсил гаплашамиз.
3.1 Маълумот турини ноошкор аниқлаш. IMPLICIT
оператори
Фортранда ҳар бир ўзгарувчининг турини ошкор аниқлаш шарт эмас. Тури
ошкор аниқланмаган объектга турни ноошкор аниқлаш қоидасига кўра тур тайин-
ланади. Турни ноошкор аниқлаш қоидасига кўра объект тури унинг номи орқали
ёки IMPLICIT оператори ёрдамида аниқланади. IMPLICIT операторидан олдин фақат
USE, PARAMETER ва FORMAT операторларигина туриши мумкин.
Турни ноошкор аниқлаш қоидаси
Фортранда турни ноошкор аниқлаш қоидасига кўра, бутун ва ҳақиқий турдаги
маълумотларни эълон қилмаслик мумкин. Бу қоидага кўра агар объектнинг номи i,
j, k, l, m, n ҳарфлар билан бошланса, бундай маълумот стандарт бутун (INTEGER)
турга эга бўлади. Қолган барча объектлар стардарт ҳақиқий (REAL) турга мансуб
бўлишади (номи a, b, ..., h, o, p, ...,z ҳарфлардан бошланган объектлар). Бу
қоида стандарт функциялар номларига таалуқли эмас. Қуйидаги мисолда турни
аниқлаш операторларидан бирортаси ҳам қатнашмаган:
43


3 Маълумот турини тавсифлаш операторлари
PROGRAM misol_tur
j = 3
k = 5
i = j + k
f = 0.5 + 1.2**i
WRITE(*,*) ’ i=’, i, ’ j=’, j, ’ k=’, k,&
&’ i нинг тур параметри =’, KIND(i)
WRIET(*,*) ’ f=’, f, ’ f нинг тур параметри =’, KIND(f)
END PROGRAM misol_tur
Турни ноошкор аниқлашда тури ошкор аниқланмаган ўзгарувчига унинг номи-
даги биринчи ҳарф орқали тур тайинланади. Бунда ўзгарувчининг номи нотўғри
ёзилганда, программада йўл қўйилган хато компилятор томонидан тутилмайди.
Юқоридаги мисолда программага атайлаб хато киритайлик:
PROGRAM misol_tur_hato
j = 3
k = 5
i = l + k
! j ўрнига l ёздик
f = 0.5 + 1.2**i
WRITE(*,*) ’ i=’, i, ’ j=’, j, ’ k=’, k
WRIET(*,*) ’ f=’, f
END PROGRAM misol_tur_hato
Ушбу программани компиляция қилганимизда ундаги хато ушланмайди, лекин
натижа бутунлай бошқа бўлади.
Турни ноошкор аниқлаш қоидасини ички қисм программалар, модуллар би-
лан ишлаганда қўллаш – топиш қийин бўлган ҳатоликларга олиб келиши мумкин.
Шу сабабли бу қоидани умуман ишлатмаган маъқул. Бу мақсадга турни ноошкор
аниқлаш қоидасини ўзгартириб эришиш мумкин.
Турни ноошкор аниқлаш қоидасини ўзгартириш
Маълумот турини ноошкор аниқлаш қоидасини IMPLICIT операторини қўллаб
ўзгартириш мумкин. Ушбу опретор синтаксиси:
IMPLICIT NONE
ёки
IMPLICIT tur(harflar) [,tur(harflar), ...]
tur - маълумот турини тавсифлаш операторларидан бири.
harflar - ҳарфлар рўйҳати ёки ҳарфлар диапазони. Ҳарфлар диапазони рўй-
ҳатнинг чизиқ (тире) билан ажратилган биринчи ва охирги ҳарфлари ёрдамида
аниқланади, масалан, c - f. Ҳарфлар ва диапазон вергул билан ажратиб ёзилади,
масалан,
44


М. Нишонов, mnishonov@gmail.com
IMPLICIT INTEGER(4)(a, c-f), CHARACTER(10)(n)
Бундай аниқлашдан сўнг номи a ва A, c - f ва C - F диапазондаги ҳарфлардан
бошланган объектлар бутун INTEGER(4) турга, номи n ва N дан бошланган объектлар
эса CHARACTER(10) турга эга бўлади. Ҳарфлар диапазони алифбо тартибида бўлиши
керак. Ушбу оператор стандарт функцияларнинг турига таъсир этмайди.
Қуйидаги
IMPLICIT NONE
ёзув программада ишлатилаётган барча номларнинг тури ошкор ҳолда, маълумот
турини тавсифлаш операторлари ёрдамида аниқланиши зарурлигини билдиради.
Бундай ёзув маълумот объектларининг барчаси учун турни тўла назорат қилишга
имкон беради. Юқорида келтирилган атайлаб йўл қўйилган ҳатоли программани
ўзгартириб ёзайлик:
PROGRAM misol_tur_oshkor
IMPLICT NONE
INTEGER i, j, k
j = 3
k = 5
i = l + k
! j ўрнига l ёзганмиз
f = 0.5 + 1.2**i
WRITE(*,*) ’ i=’, i, ’ j=’, j, ’ k=’, k
WRIET(*,*) ’ f=’, f
END PROGRAM misol_tur_oshkor
Бу программадаги хато компилятор томонидан ушланади. IMPLICIT NONE операто-
ридан олдин фақат USE ва FORMAT операторларигина келиши мумкин.
3.2 Турни тавсифлаш операторининг таркиби
Турни тавсифлаш оператори объект тури, унинг ҳусусиятларини ва бошланғич
қийматларини аниқлаши керак. Турни тавсифлаш операторининг умумий кўриниши
қуйидагича бўлиши мумкин:
турни_аниқловчи_опертор [, хусусиятлар_рўйҳати ::] объектлар_рўйҳати
Бу ерда турни_аниқловчи_опертор қуйидагилар бўлиши мумкин:
CHARACTER [(тур_параметрлари_рўйҳати)]
COMPLEX [(KIND = тур_параметри_қиймати)]
INTEGER [(KIND = тур_параметри_қиймати)]
LOGICAL [(KIND = тур_параметри_қиймати)]
REAL [(KIND = тур_параметри_қиймати)]
TYPE [(ҳосилавий_тур_номи)]
DOUBLE PRECISION
45


3 Маълумот турини тавсифлаш операторлари
тур_параметри_қиймати компьютер процессори ишлай олиши мумкин бўлган қиймат
бўлиши зарур.
CHARACTER
операторидаги
тур_параметрлари_рўйҳати
сифатида
[LEN=]
узунлик_қиймати ва (ёки) [KIND=] тур_параметри_қиймати ёзилиши мумкин. LEN=
ва KIND= калит сўзлар ёзилмаслиги, уларнинг фақат қийматлари ёзилиши мумкин.
Агар иккаласи бирга келса, узунлик_қиймати биринчи бўлиши лозим.
Хусусиятлар_рўйҳати сифатида қуйидагилар келиши мумкин:
ALLOCATABLE, AUTOMATIC, DIMENSION(элементлар_рўйҳати), EXTERNAL,
INTENT(киришда/чиқишда маълумот_хоссалари), INTRINSIC, OPTIONAL,
PARAMETER, POINTER, PRIVATE, PUBLIC, SAVE, STATIC, TARGET
Битта операторда ихтиёрий хусусият бир мартадан ортиқ кўрсатилмаслиги лозим.
Хусусиятларнинг маъноси турлича, баъзи хусусиятлар бир-бирига ўзаро тескари
(масалан, INTRINSIC ва EXTERNAL, TARGET, POINTER ва ALLOCATABLE). POINTER ҳусу-
сиятли объект INTRINSIC, EXTERNAL ва PARAMETER ҳусусиятларга эга бўла олмайди.
Чунки бу хусусиятлар ўзаро келишмайди.
Объектлар_рўйҳати вергуллар билан ажратилган элементлар тўпламидан ибо-
рат бўлади. Ҳар бир элемент қуйидаги кўринишда ёзилиши мумкин:
ном [(экстентлар_рўйҳати)][*матн_узунлиги][ = ўзлаштирилаётган_ифода]
Бу ерда ном – объект номи, экстентлар_рўйҳати – агар объект массив бўлса, экстент-
лар рўйҳати, ва = ўзлаштирилаётган_ифода – бошланғич қиймат берилаётгандаги
қиймат, *матн_узунлиги – матн турдаги объект узунлигини билдиради, (::) жуфт
икки нуқта тавсифлаш операторида ҳеч бўлмаганда битта хусусият келтирилганда
ёки ўзлаштириш амали бўлганда ишлатилиши мажбурийдир.
Мисоллар:
COMPLEX, DIMENSION(:), POINTER :: pk
INTEGER, PARAMETER :: LONG = KIND(0.D0)
REAL (KIND = 8), DIMENSION(:,:), ALLOCATABLE :: e
LOGICAL, PARAMETER, DIMENSION(3) :: veritas = .TRUE.
COMPLEX, EXTERNAL :: tashqi_complex_funksiya
CHARACTER(32), INTENT(IN) :: parol
Агар хусусиятлар рўйҳати ва жуфт икки нуқта бўлмаса тавсифлаш оператори-
нинг кўриниши қуйидагича бўлади:
турни_аниқловчи_оператор ўзлаштиришсиз_объектлар_рўйҳати
Масалан,
INTEGER index(2), i,j,k
Бу ҳолда ўзгарувчиларга қиймат ўзлаштириш DATA оператори ёрдамида амалга
оширилади:
46


М. Нишонов, mnishonov@gmail.com
DATA index/21, -3, 0/, i,j,k/4,5,7/
Тавсифлаш операторининг бу кўриниши турли шаклли объектларни бир пайтда
аниқлаганда қулайдир:
REAL x(11,23), y(1000), z(2,5,9), pi
Агар объектларга хусусият бериш зарур бўлса, бунда алоҳида оператор ишлатилади:
PARAMETER (pi = 3.14159265)
Турни ва ҳусусиятларни алоҳида аниқлашда кутилмаган ҳатоликлар содир бўлиши
мумкин. Қуйида шундай ҳолатга мисол келтирилган:
PROGRAM hato_tavsif
IMPLICIT INTEGER(c - f)
PARAMETER (i = 3, pi = 3.14159265, e = 2.718282)
j = 2 * i + 4
r = 6 * e + pi
c = i * e
WRITE (*, *) ’ c =’, c,’ r =’, r
WRITE (*, *) ’ e =’ , e
END PROGRAM hato_tavsif
3.3 Маълумотларнинг ҳосилавий тури
Замонавий Фортран программачига ўзининг хусусий турларини аниқлашга
имкон беради. Бундай ҳосилавий турлар стандарт турларни аралаштириш йўли
билан яратилиши мумкин. Янги тур TYPE тавсифлаш оператори ёрдамида ҳосил
қилинади. Санага тегишли ’кун, ой, йил’ шаклдаги ҳосилавий турни қуйидагича
яратиш мумкин:
PROGRAM hosilaviy_tur
TYPE SANA
INTEGER kun
INTEGER oy
INTEGER yil
END TYPE SANA
END PROGRAM hosilaviy_tur
SANA турдаги маълумотни тавсифлаш учун қуйидаги тавсифлаш операторини ишла-
тамиз:
TYPE(SANA) tugilgan_sanasi
Янги ҳосил қилинган тур қисмларига қиймат бериш учун қисмлар қурувчисини
қўллаш мумкин:
47


3 Маълумот турини тавсифлаш операторлари
tugilgan_sanasi = SANA(12, 11, 1969)
Ёки ҳар бир қисмга алоҳида қиймат бериш мумкин. Бунинг учун қисмларнинг ҳар
бирини ҳосиловий тур ичидан танловчи белги % ёрдамида навбат билан чиқариб
олиш керак:
tugilgan_sanasi%kun = 12
tugilgan_sanasi%oy = 11
tugilgan_sanasi%yil = 1969
Ҳосилавий турни бошқа ҳосилавий тур таркибига қўшиш мумкин. Масалан, SANA
турини SHAXS турида қўллайлик:
TYPE SHAXS
CHARACTER(LEN = 20) ismi
TYPE(SANA) tugilgan_sanasi
INTEGER id
END TYPE SHAXS
SHAXS туридан объектнинг туғилган йилига ’етиш’ учун танлаш амалини икки марта
ишлатиш лозим:
TYPE(SHAXS) Oyxon
Oyxon%tugilgan_sanasi%yil = 2007
Тушунарлики, ҳосилавий турлар ёрдамида жуда мураккаб таркибли объектлар билан
ҳам ишлаш мумкин.
3.4 Хусусиятлар (атрибутлар)
Объектларнинг тури билан боғлиқ бўлмаган хоссалари хусусиятлар орқали
аниқланади. PARAMETER хусусият номланган доимийни, DIMENSIOM экстентлар тўпла-
мидан иборат массивни аниқлайди. Кўрсатгич POINTER хусусият орқали, массивга
кўрсатгич (йўлланма) POINTER, DIMENSION хусусиятлар орқали аниқланади. Ҳусу-
сиятларни аниқлаш махсус опреаторлар орқали бажарилади. Бу операторларнинг
баъзиларини турни тавсифлаш операторлари билан бирга ёки алоҳида қўллаш мум-
кин. POINTER, ALLOCATABLE ва TARGET ҳусусиятларни турни тавсифлаш операторидан
ажратмаган маъқул. PRIVATE, PUBLIC ва SAVE хусусиятлар алоҳида аргументларсиз
ишлатилиши мумкин – бу ҳолда улар кўриниш соҳасидаги барча объектларга таъсир
қилади. EXTERNAL ва INTRINSIC хусусиятлар алоҳида берилиши мақсадга мувофиқ.
PARAMETER хусусияти. Номланган доимийлар ва қиймати
ўзгармас ифодалар
Ўзгармас қийматли объектга программада кўп марта ва турли жойлардан му-
рожаат қилиш зарур бўлса, номланган доимийлар ишлатилади. Бундай ҳусусиятли
48


М. Нишонов, mnishonov@gmail.com
катталикларга физик ва математик доимийлар (масалан, ёруғлик тезлиги, эркин
тушиш тезланиши, e, π сонлари кабилар) мисол бўлади. Бундай объектнинг қийма-
ти ишонарли равишда ўзгармасдан қолиши учун уни кутилмаган ўзгаришлардан
ҳимоя қилиш зарур. Номланган диомийга албатта тавсифлаш операторида қиймат
ўзлаштилиши керак. Ўзлаштириш операторининг чап томонида номланган доимий
номи келса, бу ҳолат компилятор томонидан хато сифатида ушланади.
Номланган доимий PARAMETER хусусият орқали аниқланади. Бу хусусият тавси-
флаш оператори ҳусусятлар рўйҳатида:
REAL, PARAMETER :: pi = 3.14159265
ёки хусусиятни аниқлаш оператори сифатида (маслаҳат берилмайди):
REAL pi
PARAMETER (pi = 3.14159265)
келиши мумкин. Номланган доимий массив бўлиши:
INTEGER, PARAMETER, DIMENSION(3) :: massiv = (/1,2,3/)
ёки ҳосилавий турдаги таркибий объект бўлиши мумкин:
TYPE POINT
REAL x, y
INTEGER i
END TYPE POINT
TYPE(POINT), PARAMETER :: ORIGIN = POINT(0., 0., 1)
Номланган доимийни аниқлашда мажбурий элемент бу унга тавсифлаш операторида
ёки хусусиятни аниқлаш операторида қиймат ўзлаштиришдир:
REAL, PARAMETER :: e = 2.718282
ёки
REAL e
PARAMETER (e = 2.718282)
Ўзлаштриш амали мажбурийлигидан белгили турдаги номланган доимийларни
тавсифлашда кутилаётган узунликни қуйидагича аниқлаш мумкин:
CARACTER(LEN = *), PARAMETER :: matn = ’Uzun satr’
Номланган доимийлар қиймати уларнинг номига компиляция вақтида ўзлаштирил-
ганлиги сабабли уларни қиймати ўзгармас ифодалар таркибида ишлатиш мумкин:
INTEGER, PARAMETER :: raqam = 100
REAL x(raqam), z(raqam, raqam), y(2 * raqam)
CHARACTER(LEN = raqam) matn(raqam**2)
49


3 Маълумот турини тавсифлаш операторлари
Қиймати ўзгармас ифодалар деб – таркиби стандарт амаллардан (қўшиш, ай-
риш, кўпайтириш ва ҳ.к) иборат ва
• доимийлар ёки қиймати ўзгармас ифодадан иборат доимий қисми қатнашган;
• ифодасида доимийлар ёки ноошкор цикл қатнашган таркибли объектлар ёки
массивларни қуриш амаллари;
• аргументлари доимий бўлган стандарт функция ёки алмаштирувчи функцияга
мурожаат;
• маълумот олиш учун мўлжалланган функцияга мурожаат (PRESENT, ASSOCIATED
ёки ALLOCATED лардан бошқа)
бўлган ифодаларга айтилади.
Ўзлаштириш амали бажарилаётган қиймати ўзгармас ифодада
• бутун кўрсатгичли даражага кўтариш;
• натижа ва аргументи бутун ёки белгили бўлган стандарт функциялар;
• алмаштирувчи REPEAT, RESHAPE, SELECTED_INT_KIND, SELECTED_REAL_KIND,
TRANSFER ва TRIM функцияларни
ишлатиш мумкин. Масалан,
INTEGER, PARAMETER :: РАМ = 12, DOUBLE_REAL = KIND(0.D0)
INTEGER, PARAMETER :: LONG = SELECTED_REAL_KIND(PAM)
PARAMETER хусусиятга эга бўлган объект формал параметр, йўлланма манзили ёки
кўрсатгич, ажратилган объект бўла олмайди. Шу сабабли бу хусусият билан POINTER,
TARGET, ALLOCATABLE лар биргаликда қўлланилмайди, INTRINSIC ёки EXTERNAL ху-
сусиятлар номланган доимий учун керак бўлишини ҳам тасаввур қилиш қийин.
Модулда аниқланган номланган доимий PUBLIC ёки PRIVATE хусусиятга эга бўлиши
мумкин. PARAMETER билан муаммосиз тўла келишадиган ягона хусусият бу DIMENSION
дир.
DIMENSION ва ALLOCATABLE хусусиятлар. Массивларни
тавсифлаш
DIMENSION хусусият массивларни аниқлашда ишлатилади. Бу ҳусусиятнинг
параметри тавсифланаётган массивларнинг экстентлари рўйҳати бўлиши лозим
(1-экстент, 2-экстент, ..., n-экстент)
Экстентлар миқдори массив рангини аниқлайди. Ҳар бир экстент қуйидаги кўрини-
шда ёзилади:
50


М. Нишонов, mnishonov@gmail.com
[қуйи_чегара :] юқори_чегара
Масалан,
REAL, DIMENSION(0:5, 2, -2:3, 10) :: fgrid
Агар қуйи чегара қиймати ёзилмаган бўлса у 1 га тенг деб фараз қилинади. Қуйи
ва юқори чегарани ажратиб турувчи икки нуқта қуйи чегара кўрсатилмаганда
ёзилмаслиги мумкин.
Баъзи ҳолларда экстентлар рўйҳати вергуллар билан ажратилган икки нуқта-
лар орқали келтирилаши мумкин
REAL, POINTER, DIMENSION( :,:,:,:):: to_grid
ва бундай ёзув ўзгариб турувчи массивни аниқлашда ҳам ишлатилади
REAL, ALLOCATABLE, DIMENSION(:,:) :: keyinroq
Ўзгариб турувчи массив – бу программа ишлаётгандан ўлчами ўзгариб турадиган
массивдир. Ўзгариб турувчи массив экстентлари ҳали аниқланмаган, DIMENSION
хусусият бўлажак массив рангинигина аниқлайди холос.
PROGRAM tus_massiv
IMPLICIT NONE
INTEGER size
REAL, ALLOCATABLE, DIMENSION(:) :: massiv
WRITE(*, *) ’size?’
READ(*, *) size
IF(size > 0) ALLOCATE(massiv(size))
IF(ALLOCATED(massiv)) DEALLOCATE(massiv)
END PROGRAM tus_massiv
ALLOCATABLE хусусият POINTER, PARAMETER билан бирга ишлатилмайди, уни формал
параметрларга қўллаб бўлмайди.
Массивни тавсифловчи операторда DIMENSION хусусият ёзилмаслиги мумкин.
Бунда массив шакли уни номидан сўнг қавслар ичида ёзилиши мумкин:
REAL x(10, 20, 30), y(100), z(3, 200, 2, 4)
POINTER ва TARGET хусусиятлар
POINTER хусусият бошқа объектларга йўлланма (кўрсатгич) сифатида ишлати-
ладиган объектларга берилади. Йўлланма-объект учун манзил тури ва агар манзил
массив бўлса унинг рангини аниқлаш талаб қилинади. Масалан,
INTEGER, DIMENSION(:,:), POINTER :: pntr
51


3 Маълумот турини тавсифлаш операторлари
Лекин ҳар қандай икки ўлчамли массив ҳам pntr йўлланмага манзил бўлавермай-
ди. Компилятор ишини оптимизациялаш учун (компиляция масаласи йўлланмага
манзил бўлиши керак бўлган объект ажратилган бўлса, сезиларли даражада содда-
лашади) TARGET хусусият киритилган. Бу хусусият аниқланган йўлланмага манзил
бўлиши мумкин бўлган объектларни ажратиш учун қўлланади. Йўлланмалар POINTER
ҳусусиятли объектларга ҳам кўрсатилиши мумкин. TARGET ёки POINTER ҳусусият-
ли объектларнинг барча қисмлари автоматик равишда шу хусусиятга эга бўлиб
қолишади. Қуйидаги программада double объекти
INTEGER, DIMENSION(10, 10), TARGET :: double
келгусида pntr йўлланмани double(1:3, 5) кесимга боғлаб қўйиш имконини беради:
pntr => double(1:3,5)
PUBLIC ва PRIVATE хусусиятлар
PUBLIC ва PRIVATE хусусиятлар модулларда аниқланган объектларга муро-
жаатни бошқариш учун ишлатилади. USE оператори орқали модул ихтиёрий про-
грамманинг таркибий қисмига айланиши мумкин. Ноошкор ҳолда модулнинг барча
объектлари PUBLIC хусусиятга эга бўлади. Лекин бу ҳол доим ҳам яхши эмас. Мо-
дулда аниқланган ўзгарувчилар бир модулдан иккинчи модулга ахборот алмашиш
учун ишлатилиши мумкин. Бунда модулдаги ўзгарувчиларнинг қийматларини та-
шқаридан ўзгартириш хато натижаларга олиб келиши мумкин. PRIVATE хусусият
модулдаги объектларни шу модулдагина кўринишини таъминлайди ва ташқаридан
уларнинг қийматини ўзгартиришни чегаралайди.
мурожаат учун хусусиятлар объектларни тавсифлаш пайтида аниқланиши
мумкин:
INTEGER, PRIVATE :: А, В, С
INTEGER, PUBLIC :: F, G, H
ёки хусусият бериш операторлари ёрдамида алоҳида аниқланиши мумкин:
INTEGER А, В, С, F, G, Н
PRIVATE А, В, С
PUBLIC F, G, Н
PUBLIC ва PRIVATE операторлар объектлар рўйҳатисиз қўлланилиши мумкин. Бунда
кўриниш соҳасидаги барча объектлар шу хусусиятга эга бўлиб қолади:
PRIVATE
INTEGER А, В, С, F, G, Н
PUBLIC F, G, Н
Қуйида модул ичида PUBLIC ва PRIVATE ҳусусиятларни қўллашга мисол келтирилган:
52


М. Нишонов, mnishonov@gmail.com
MODULE vars
INTEGER,PRIVATE, :: j =2, i = 5
REAL,PUBLIC :: f = 10.
END MODULE vars
PROGRAM use_vars
USE vars
WRITE(*, *) ’1=’, i,’j=’, j ! ноллар оламиз, i ва j - модул учун маҳаллий
WRITE(*, *) ’f =’, f
! модулдаги ўзгарувчини қийматини оламиз
END PROGRAM use_vars
SAVE хусусияти. Маҳаллий ўзгарувчиларнинг
қийматларини сақлаб қўйиш
Қисм программадан (процедурадан) чиққач у ердаги маҳаллий ўзгарувчилар-
нинг қийматлари сақланмаслиги мумкин. Бу ҳолда маҳаллий ўзгарувчилар ноаниқ
ҳолатда бўлиб қолишади; уларга уланган йўлланмалар ҳам ноаниқ ҳолатга келиб
қолишади. Агар қисм программада модулдан келадиган ўзгарувчи ишлатилаётган
бўлса, у ҳам ноаниқ ҳолатга ўтар экан. Қисм программани (процедурани) чақири-
шлар оралиғида ундаги маҳаллий ўзгарувчиларнинг қийматларини сақлаш учун SAVE
хусусияти қўлланилади. Йўлланмага ишлатилган SAVE хусусият қисм программадан
чиққач боғланганлик ҳолатини сақланганлигини, ажратиб белгиланган массивга
ишлатилган SAVE эса ажратилган массив элементларининг қийматларини сақланган-
лигини билдиради. Қуйидаги мисолда SAVE хусусият функция қисм программасининг
формал параметри қийматларини функцияга қилинган барча мурожаатлар бўйича
йиғиндисини сақлашга имкон беради:
REAL FUNCTION count(x)
REAL x
REAL, SAVE :: a
INTEGER :: counter = 1
IF(counter .EQ. 1) THEN
a = x
ELSE
a = a + x
END IF
counter = counter + 1
count = a
END FUNCTION count
counter номли ўзгарувчида қисм программага мурожаатлар миқдори сақланади.
Унга SAVE хусусият қўлланилмаган бўлса ҳам унинг қиймати сақланади. Чунки қисм
программа ичида ўзлаштириш амали бажарилаётган барча маҳаллий ўзгарувчиларга
автоматик равишда SAVE хусусият қўлланилади.
53


3 Маълумот турини тавсифлаш операторлари
SAVE хусусият формал параметрларга, функция натижаларига ва рекурсив
функцияларга ишлатилмайди. Ушбу хусусият SAVE оператори орқали объектларга
қўлланилади:
SAVE [[::] ўзгарувчилар_номлари_рўйҳати]
Агар ўзгарувчилар номлари рўйҳати келтирилмаган бўлса, қисм программада
аниқланган барча ўзгарувчилар шу хусусиятга эга бўлиб қолади. SAVE хусусият-
ни асосий программада ишлатиш тақиқланмаган. Лекин у асосий программада ҳеч
қандай амал бажармайди.
OPTIONAL ва INTENT хусусиятлар. Формал параметрларни
тавсифлаш
OPTIONAL ва INTENT хусусиятлар қисм программаларнинг формал параметрла-
ригагина қўлланади. OPTIONAL хусусият қисм программага мурожаат пайтида фактик
параметр сифатида кўрсатиш шарт бўлмаган формал параметрларига ишлатилади.
Бу хусусиятни турни тавсифлаш операторида ёки хусусият тайинловчи оператор
ёрдамида аниқлаш мумкин:
SUBROUTINE subtr( a, b, c, d, e, f)
REAL, OPTIONAL, DIMENSION(:) : : e, f
REAL :: a, b, c
INTEGER :: d
OPTIONAL :: c, d
OPTIONAL ҳусусиятли формал параметр бошқ ҳеч қандай хусусиятга эга бўлмаслиги
лозим.
INTENT хусусият формал параметр қийматини кирувчи, чиқувчи ёки универсал
эканлигини тайинлайди. Бунда IN кирувчи, OUT чиқувчи ва INOUT универсал формал
параметрни аниқлашда INTENT хусусиятга параметр сифатида ишлатилади. Бу
хусусиятни ишлатиш қисм программа формал параметрларининг қийматларини
назорат қилишни яхшилайди. INTENT хусусият турни тавсифлаш операторида ёки
хусусият тайинловчи оператор ёрдамида аниқланиши мумкин:
SUBROUTINE subb(a, b, c, d, e, f)
REAL, INTENT(IN) :: a, b, c
INTEGER, DIMENSION( :,: ) :: d
COMPLEX :: e, f
INTENT(INOUT) :: d, e
INTENT(OUT) :: f
INTENT хусусиятни формал процедуралар ва йўлланмаларга қўллаш мумкин эмас.
54


М. Нишонов, mnishonov@gmail.com
INTRINSIC ва EXTERNAL хусусиятлар
EXTERNAL хусусият қисм программани ташқи ёки формал эканлигини аниқлайди.
У турни тавсифлаш операторида ёки алоҳида тайинланиши мумкин:
EXTERNAL ташқи_процедуралар_номлари_рўйҳати
EXTERNAL хусусият компиляторга унда аниқланган функцияни ташқи эканлиги ҳақи-
да ахборот беради. Бу хусусият тайинланган стандарт функцияларни компилятор
кўрмай қўяди.
INTRINSIC хусусият объектга ёки функция номига тайинланганда компилятор
бу функцияни (объектни) худди стандарт (ички) функциядек кўради. Бу хусусият
турни тавсивлаш операторида ёки алоҳида тайинланиши мумкин:
INTRINSIC функциялар_номлари_рўйҳати
Мисол:
PROGRAM fcall
IMPLICIT NONE
REAL x, s
REAL, INTRINSIC :: SIN
REAL, EXTERNAL :: count
x = 0.0
DO
IF(x < 1.0) THEN
s = count(SIN(x)) ! SIN - ички функция
x = x + 0.1
ELSE
EXIT
END IF
END DO
END PROGRAM fcall
EXTERNAL компиляторни count номли ташқи функцияни қидиришга мажбур қилади.
Ўзгарувчиларга бошланғич қиймат тайинлаш
Тавсифлаш операторларида ўзгарувчиларга бошланғич қиймат тайинлаш мум-
кин. Номланган доимийларга тавсифлаш операторларида қиймат ўзлаштириш маж-
бурий. Формал параметрларга, йўлланмаларга, ажратилган массивларга, автома-
тик объектларга ва функциялар натижаларига қиймат ўзлаштириш мумкин эмас.
Юқорида келтирилган мисолларда биз ўзгарувчиларга ва номланган доимийларга
тавсифлаш операторларида қиймат ўзлаштириш амалини аллақачон учратдик: бу
амал оддий ўзлаштириш оператори (=) ёрдамида, массивлар қурувчисини чақириш
ёки ноошкор циклларни ишлатиш орқали бажарилиши мумкин. Масалан,
55


3 Маълумот турини тавсифлаш операторлари
REAL :: a = 0.0, b = 1.0
REAL, DIMENSION(3) :: f = (/ 0.6, 0.54, 0.01/)
INTEGER, DIMENSION(300) :: (c(i) = i, i = 1, 300)
Қиймат ўзлаштириш бажарилган барча ўзгарувчилар автоматик равишда SAVE ху-
сусиятга эга бўлиб қолишади. Тавсифлаш операторида объектга тўлиқ равишда
қиймат ўзлаштирилиши лозим. Тавсифлаш операторидан ташқари бошланғич қий-
мат ўзлаштириш DATA оператори ёрдамида ҳам амалга оширилиши мумкин. DATA
оператори қуйидаги кўринишда ёзилади:
DATA объектлар_рўйҳати /қийматлар_рўйҳати/ &
[[,] объектлар_рўйҳати /қийматлар_рўйҳати/]
бу ерда объектлар_рўйҳати – ўзгарувчилар ва ноошкор цикллар рўйҳати,
қийматлар_рўйҳати – скаляр доимийлар ва структура қурувчилар рўйҳатини билди-
ради. Масалан,
REAL :: c, g, f
REAL, DIMENSION(5) :: a
INTEGER :: i, j, k, l
DATA a, c, g, f /5.6, 7.8, 2.1, 4.7, 5.9, 1., 2., 5. /,&
&i, j, k, l /2, 5, 7, 3/
Объектлар рўйҳатидаги номлар сони ва қийматлар рўйҳатидаги скаляр доимий-
лар сони бир ҳил бўлиши керак. Масалан, DATA операторида a массив учун 5 та
ҳақиқий турдаги сонлар, қолган учтаси c, g, f ларга мос келади. Рўйҳатда бир хил
қийматлар кетма-кет келса такрорланиш коэффициентини ишлатиш мумкин:
DATA i, j, k, l /4 * 1/
Бу ерда i, j, k, l ўзгарувчилар бир хил 1 қиймат қабул қилишади.
Массив элементларига қиймат ўзлаштириш бир нечта йўллар билан амалга
оширилиши мумкин:
• ҳамма қийматларни бир хил деб тўлиғича:
REAL, DIMENSION(5,5) :: r
DATA r /25 * 2.5/
• қисман, алоҳида элементларга ва кесимларга қиймат ўзлаштириб:
DATA r(1, 1), r(2,2), r(3, 3), r(4, 4), r(5, 5) / 5 * 1.0/
DATA r(3:5, 1:2) /6*0.0/
• ноошкор циклни ишлатиб:
DATA ((r(i, j), i = 1, 3, 5), j = 1, 3, 5 ) /9 * 3.0/
56


М. Нишонов, mnishonov@gmail.com
Ҳосилавий турда DATA ни ишлатиб бошланғич қиймат бериш учун мос струк-
турани қурувчини ёки структура элементини чиқариб олиш операторини ўзла-
штириш ифодаси билан бирга қўллаш лозим:
TYPE POINT
REAL X, Y
INTEGER I
END TYPE POINT
TYPE(POINT) :: P1, P2
DATA P1 / POINT(1.0, 1.0, 1)/, P2 %X /2/
3.5 Бутун турдаги маълумотларни тавсифлаш
Бутун турдаги ўзгарувчилар, константалар ва функциялар (Фортранда функ-
ция тушунчаси турга эга) INTEGER, INTEGER(1), INTEGER(2) ёки INTEGER(4) опе-
раторлари орқали эълон қилинади. Қуйидаги жадвалда ушбу операторлар ҳақида
ахборот келтирилган. Байтлар сони устунида берилган турдаги объект учун ажра-
тиладиган байтлар миқдори келтирилган. Белгилашлар Фортран 90 стандартида
аниқланган келишувга асосланган. Бутун турдаги маълумотларни тавсифлаш опера-
торлари қуйидаги жадвалда келтирилган:
Оператор
KIND
Байтлар сони
Изоҳ
BYTE
1
1
INTEGER(1) билан бир хил
INTEGER(1)
1
1
INTEGER(2)
2
2
INTEGER(4)
4
4
INTEGER
4
4
INTEGER(4) билан бир хил
Фортран 77 да қабул қиланган синтаксис: INTEGER*1, INTEGER*2 ёки INTEGER*4
ларни ҳам ишлатиш мумкин.
INTEGER оператори синтаксиси:
INTEGER [[([KIND=] тур_параметри_қиймати)]
[, хусусиятлар_рўйҳати]::] объектлар_рўйҳати
Диққат: Юқоридаги ёзув битта сатрда ёзилиши лозим! Агар битта сатрга сиғмаса
сатрни давом эттириш белгиси (&) ишлатилиши керак.
тур_параметри_қиймати - KIND нинг қиймати. Улар юқоридаги жадвалда кел-
тирилган.
хусусиятлар_рўйҳати - объектлар_рўйҳати да келтирилган объектларнинг ҳу-
сусиятлари. Агар ҳеч бўлмаганда бир дона атрибут кўрсатилган бўлса :: ажратувчи
57


3 Маълумот турини тавсифлаш операторлари
белги ишлатилиши зарур. Агар PARAMETER атрибути берилган бўлса, у ҳолда ўзлаш-
тириш амали бажарилиши лозим:
INTEGER(4), PARAMETER :: m = 11, n = 4
объектлар_рўйҳати - вергуллар билан ажратилган маълумот объектларининг
(ўзгарувчилар, доимийлар, ташқи ва ички ҳамда оператор функциялар) номлари рўй-
ҳати. Ушбу рўйҳатда қиймат ўзлаштириш амали бажарилиши мумкин. Ўзлаштириш
амали икки хил усулда бўлиши мумкин:
INTEGER :: a = 3, b = 4 ! (::) ажратувчи белги бўлиши шарт
ёки
INTEGER a/3/, b/4/
! (::) ажратувчи белги ёзилмайди
Бутун турдаги маълумотларнинг ўзгариш диапазони:
BYTE
INTEGER(1) билан бир хил
INTEGER(1)
-128 дан +127 гача
INTEGER(2)
-32768 дан +32767 гача
INTEGER(4)
-2147483648 дан +2147483647 гача
INTEGER
INTEGER(4) билан бир хил
Мисол:
INTEGER kun, yil
! Атрибутларсиз тавсифлаш
INTEGER(2) k/5/, limit/45/
! тавсифлашда ўзлаштириш
BYTE :: vmin = -1
! Атрибутлар билан тавсифлаш
INTEGER, ALLOCATABLE, DIMENSION(:) :: kunlar, soatlar
INTEGER(KIND = 2), TARGET :: kt = 2
INTEGER(2), POINTER :: kp
INTEGER(1), DIMENSION(7) :: val = 2
ALLOCATE(kunlar(5),soatlar(24))
! Массивларни жойлаш
kunlar = (/1,3,5,7,9/)
! Массив конструктори орқали
soatlar = (/i,i=1,24/)
! массив қийматларини бериш
kun = kunlar(5)
soat = soatlar(10)
kp => kt
! Йўлланмани манзилга улаш
PRINT*, kun, soat
PRINT*, kt, kp
PRINT*, vmin, val(5), k*limit, KIND(val), RANGE(kp)
END
Бутун турдаги катталик баъзи ҳолларда мантиқий қиймат кутилганда ҳам
ишлатилиши мумкин (IF ва DO WHILE операторларида). Бунда нолдан фарқли ҳар
қандай қиймат ҳақиқат (.TRUE.), нол қиймат ёлғон (.FALSE.) сифатида қабул
қилинади. Масалан,
58


М. Нишонов, mnishonov@gmail.com
INTEGER(4) :: i, a(3) = (/1,-1,0/)
DO i = 1,3
IF(a(i)) THEN
WRITE(*,*) ’Ҳақиқат’
ELSE
WRITE(*,*) ’Ёлғон’
END IF
END DO
END
Шу билан бирга бутун қиймат мантиқий ўзгарувчига ўзлаштирилиши мумкин:
LOGICAL fL1, fL2
fL1 = 5; fL2 = 0
PRINT*, fL1,fL2
! T F
3.6 Бутун турдаги доимийлар
Бутун турдаги рақамли доимий программада унинг кўриниши билан аниқла-
нади. У ишорали ва ишорасиз ҳолда рақамлар кетма- кетлигидан иборат бутун ўнли
сонлар сифатида қабул қилинади:
15
-1024
32767
+501
Рақамли доимийнинг тур параметри (KIND) охирги рақамдан сўнг пастки чизиқ (_)
дан кейин кўрсатилиши мумкин:
32767_3
15_1
+501_2
Бунда 32767 сонини 3 байт, 15 сонини 1 байт ва 501 сонини 2 байт узунликдаги
сонлар деб тушиниш керак. Лекин бундай усул билан тур синфини аниқлаш учун
компьютер марказий процессори 1, 2 ва 3 тур параметри билан ишлай олишини
аввалдан билиш лозим. Тур параметри аниқланмаган ҳолда барча бутун турдаги
рақамли доимийлар стандарт бутун тур сифатида қабул қилинади ва бошқа компью-
терларга ўтганда улар ўзгариши мумкин. Бутун турдаги рақамли доимийларнинг
тур параметрини тўғри тавсифлаш йўли уларни параметр ёрдамида аниқлашдир.
Фортранда SELECTED_INT_KIND(n) стандарт функция бутун сонларнинг −(10
n
− 1)
дан +(10
n
− 1) оралиқдаги қийматлари учун тур параметрини энг кичик хатолик
билан тўғри қайтаради. Бутун турдаги рақамли доимийни керакли тур параметри
билан тавсифлаш ва аниқлаш уларни тўғри тур параметрига эга бўлишини таъ-
минлайди. Тавсифлаш операторларида бутун турнинг тур параметри қуйидагича
аниқланиши мумкин:
59


3 Маълумот турини тавсифлаш операторлари
INTEGER, PARAMETER :: n6 = SELECTED_INT_KIND(6)
Бу ҳолда программа матнида бутун турдаги рақамли доимий қуйидагича киритилиши
мумкин:
30405_n6
Бунда n6 тур параметри бутун сонлар қийматлари учун -99999 дан 99999 оралиқни
ишонч билан таъминлайди.
Ихтиёрий компьютерда тўғри ишлайдиган программага мисол:
PROGRAM butun_tur
INTEGER, PARAMETER ::
n6 = SELECTED_INT_KIND(6)
INTEGER, PARAMETER :: n12 = SELECTED_INT_KIND(12)
INTEGER i, j, k
IF (n6 > 0 .AND. n12 > 0) THEN
k =
200_n6
j = -10000_n12
ELSE
STOP ’Ўзгарувчилар қийматлари диапазони таъминланмади’
END IF
DO i = 1_n6, k, 2_n6
j = j + 20_n12 * k
PRINT *, j
END DO
PRINT *, k
END PROGRAM butun_tur
3.7 Ҳақиқий турдаги маълумотларни тавсифлаш
Ҳақиқий турдаги маълумотларни тавсифлаш оператори REAL синтаксиси
INTEGER оператори синтаксиси билан бир хил:
REAL [[([KIND=] тур_параметри_қиймати)]
[, хусусиятлар_рўйҳати]::] объектлар_рўйҳати
Қуйидаги жадвалда REAL операторининг турли кўринишлари ҳақида ахборот келти-
рилган:
Оператор
KIND
Байтлар сони
Изоҳ
REAL(4)
4
4
REAL
4
4
REAL(4) билан бир хил
REAL(8)
8
8
DOUBLE PRECISION
8
8
REAL(8) билан бир хил
60


М. Нишонов, mnishonov@gmail.com
Ҳақиқий турдаги маълумотлар компьютер хотирасида сузувчи нуқтали сонлар
кўринишида тасвирланади. Уларнинг ўзгариш диапазони:
REAL(4)
манфий сонлар -3.4028235E+38 дан -1.1754944E-38 гача
0 сони;
мусбат сонлар +1.1754944E-38 дан +3.4028235E+38 гача
каср қисми олтитагача ўнли сонлардан иборат бўлиши мумкин.
REAL
REAL(4) билан бир хил
REAL(8)
манфий -1.797693134862316D+308 дан -2.225073858507201D-308 гача
0 сони;
мусбат +2.225073858507201D–308 дан +1.797693134862316D+308 гача
каср қисми 15 та ўнли сонлардан иборат бўлиши мумкин.
1- мисол:
INTEGER(4), PARAMETER :: m =3, n = 5, low = 4
REAL(KIND = 4) :: d(m,n) = 15.0, hot = 3.4
REAL(4), POINTER :: da(:,:)
REAL(low) d2(n)
2- мисол: Атрибут оператор кўринишида ишлатилиши мумкин.
REAL(8) da
! Массив турини эълон қиламиз
POINTER da
! уни йўлланма эканлигини айтамиз
DIMENSION da(:,:)
! шаклини аниқлаймиз
PARAMETER m = 10, n = 20
ALLOCATE(da(m,n))
! Аниқ ўлчамини берамиз
3.8 Ҳақиқий турдаги доимийлар
Бирор сонли доимий ҳақиқий турдаги рақамли доимий бўлиши учун у ушбу
доимийларни аниқлаш қоидасига асосланиб ёзилиши керак. Ҳақиқий доимий ишо-
рали ва ишорасиз бутун қисмдан, ўнли нуқтадан, каср қисмдан ҳамда ишорали ва
ишорасиз даража қисмдан иборат бўлади. Бу қисмларнинг ихтиёрий биттаси ташлаб
кетилиши мумкин. Лекин уларни бир пайтда бутун ва каср қисмсиз ёки ўнли нуқта
ва даража қисмсиз ёзиш мумкин эмас. Бутун турдаги ҳақиқий доимий қуйидаги
кўринишда бўлади:
-13.54E-2
Бу ёзув −13.54 × 10
−2
ни билдиради. У юқорида санаб ўтилган барча қисмлардан
ташкил топган. Бу доимийни -.1354 ёки -0.1354 шаклда ёзиш мумкин. Қуйидаги
сонлар ҳам стандарт турдаги ҳақиқий доимий деб қабул қилинади:
61


3 Маълумот турини тавсифлаш операторлари
-0.3
2E-1
2.7182818
-9 ёзув бутун турдаги доимийдир. .E+0 ёзув, ҳақиқий турдаги доимийни Фортрандаги
ёзиш қоидаларига кўра ҳақиқий турдаги нолни ифодалаши керак эди. Лекин бундай
ёзув хато. Ҳақиқий турдаги доимийда бўлган рақамлар сони унинг тур параметрига
таъсир қилмайди.
3.9 Ҳақиқий турдаги маълумотларнинг тур параметри
Бутун турли доимийларнинг тур параметри сингари, ҳақиқий тур параметри
ҳам байтлар сони сифатида аниқланиши мумкин. Лекин Фортран стандартида
бу талаб этилмайди. Агар тур параметри аввалдан маълум бўлса, уни доимий
аниқланаётганда кўрсатиш мумкин:
-1.6_8
Лекин бундай аниқлаш ушбу йўл билан киритилган доимий мавжуд бўлган про-
граммани бошқа компьютерга кўчирганда натижа ўзгариб кетишига олиб келиши
мумкин. Тур параметрини кўрсатишни тўғри йўли, қуйидагича аниқланган номлан-
ган доимийни киритиб, сўнг тур параметрини кўрсатишдир:
INTEGER, PARAMETER :: r9 = SELECTED_REAL_KIND(9,99)
Фортранда SELECTED_REAL_KIND(p,r) стандарт функция p та ўнли рақамли, абсолют
қиймати 10
−r
дан 10
r
гача оралиқда жойлашган, ҳақиқий турдаги сонлар билан
тўғри ишлашни таъминлайди. Агар сўралган тур параметри мавжуд бўлмаса, уш-
бу функция -1, тур параметри таъминланмаса -2, бундай тур параметри билан
ишлаш имкони бўлмаса -3 ни қайтаради. Ихтиёрий компьютерда тўғри ишлайдиган
программага мисол:
PROGRAM haqiqy_tur
INTEGER, PARAMETER ::
r6 = SELECTED_INT_KIND(6)
INTEGER, PARAMETER :: r12 = SELECTED_REAL_KIND(9)
REAL g
IF (r6 > 0 .AND. r12 > 0) THEN
DO
WRITE(*, *) ’0 дан 100 гача сон киритинг:’
READ(*, *) g
WRITE(*, *) g, ’ ёруғлик йили = ’, &
&g * 365_r6 * 24_r6 * 3600_r6 * 2.99792458e08_rl2’,’ метр’
END DO
ELSE
STOP ’Қийматлар оралиғи таъминланмади’
END IF
END PROGRAM haqiqy_tur
62


М. Нишонов, mnishonov@gmail.com
3.10 Комплекс турдаги маълумотларни тавсифлаш
Комплекс турдаги маълумотлар COMPLEX оператори ёрдамида эълон қилинади.
Комплекс сонлар бу тартибланган сонлар жуфтлигидир. Масалан:
COMPLEX :: c, z =(3.0,4.0)
c = z / 2
! (1.500000,2.000000)
Қавс ичидаги биринчи сон комплекс соннинг ҳақиқий қисми, иккинчиси эса
мавҳум қисмини билдиради. Уларнинг иккаласи ҳам бир ҳил турга эга.
Комплекс маълумот объектини тавсифлаш оператори синтаксиси:
COMPLEX [[([KIND=] тур_параметри_қиймати)]
[, хусусиятлар_рўйҳати]::] объектлар_рўйҳати
Қуйидаги жадвалда COMPLEX операторининг турли кўринишлари ҳақида ахборот
келтирилган:
Оператор
KIND
Байтлар сони
Изоҳ
COMPLEX(4)
4
8
4 байт ҳақиқий ва
яна шунча мавҳум қисм учун
COMPLEX
4
8
COMPLEX(4) билан бир хил
COMPLEX(8)
8
16
8 байт ҳақиқий ва
яна шунча мавҳум қисм учун
DOUBLE COMPLEX
8
16
COMPLEX(8) билан бир хил
3.11 Комплекс турдаги доимийлар
Комплекс турдаги доимий иккита ҳақиқий тудраги доимийлар жуфти орқали
аниқланади. Комплекс турдаги объект қисмларининг тур параметри ҳақиқий тур
параметри билан бир хил. Тур параметри ушбу турдаги объект сақланиши учун
зарур байтлар сони орқали аниқланса, комплекс сон тур параметрининг қиймати
аниқланган параметрнинг ярмига тенг бўлади.
Комплекс турдаги доимийлар қавс ичида ёзилган иккита ҳақиқий турдаги
доимийлар орқали аниқланади:
(-2.,3.5)
(0.13,77E-2)
(1,4.6_8)
(11,45)
Қавс ичидаги биринчи рақам комплекс объектнинг ҳақиқий қисмини, иккинчиси
мавҳум қисмини билдиради.
63


3 Маълумот турини тавсифлаш операторлари
3.12 Мантиқий турдаги маълумотларни тавсифлаш
Мантиқий турдаги объектлар қуйидаги оператор ёрдамида эълон қилинади:
LOGICAL [[([KIND=] тур_параметри_қиймати)]
[, хусусиятлар_рўйҳати]::] объектлар_рўйҳати
LOGICAL операторининг турли кўринишлари жадвалда келтирилган:
Оператор
KIND
Байтлар сони
Изоҳ
LOGICAL(1)
1
1
0 - .FALSE. ёки 1 - .TRUE.
қийматли байт
LOGICAL(2)
2
2
1- байт LOGICAL(1) 2-си null
LOGICAL(4)
4
4
1- байт LOGICAL(1)
қолганлари - null
LOGICAL
4
4
LOGICAL(4) билан бир хил
Мисол:
LOGICAL, ALLOCATABLE :: flag1(:), flag2(:)
LOGICAL(2), SAVE :: doit, dont = .FALSE.
LOGICAL switch
! Тенг кучли тавсифлаш
LOGICAL flag1, flag2
LOGICAL(2) :: doit, dont = .FALSE.
ALLOCATABLE flag1(:), flag2(:)
SAVE doit, dont
Мантиқий катталиклар (ўзгарувчилар, ифодалар) арифметик операторларда
ишлатилиши ва бутун турдаги ўзгарувчиларга ўзлаштирилиши мумкин.
Мисол:
INTEGER :: a = 2
LOGICAL :: fl = .TRUE., g = .FALSE.
WRITE(*,*) a * fl, a * g
! 2
0
END
3.13 Белгили турдаги маълумотларни тавсифлаш
Фортранда ўзгарувчилар ва доимийлар белгили турга эга бўлиши мумкин. Улар
сатрлар деб ҳам аталади. Шу билан бирга массивлар ва функциялар ҳам белгили
турда бўлиши мумкин.
64


М. Нишонов, mnishonov@gmail.com
Белгили турдаги маълумот объектлари CHARACTER оператори ёрдамида эълон
қилинади. Унинг синтаксиси:
CHARACTER[([LEN=] узунлик_қиймати [,KIND=] тур_синфи_қиймати)]
[[хусусиятлар_рўйҳати]::] объект
Белгили турдаги маълумотларни тавсифлаш операторлари:
Оператор
KIND
Байтлар сони
Изоҳ
CHARACTER
1
1
Бир дона белги
CHARACTER(1)
1
1
CHARACTER билан бир хил
CHARACTER(n)
1
n
n- сатр узунлиги (байтларда)
Белгили турда ишлатилган n параметр (жадвалдаги охирги сатрда) - белгили
сатр узунлигини билдиради ва у 1 ≤ n ≤ 32767 оралиқда бўлиши мумкин.
узунлик_қиймати - эълон қилинаётган объект узунлиги.
узунлик_қиймати - юлдузча (*), ёки 1 дан 32767 гача ишорасиз бутун доимий,
ёки қиймати 1 дан 32767 гача ишорасиз бутун сон бўладиган арифметик ифода
бўлиши мумкин. Шу билан бирга агар CHARACTER оператори формал
1
параметрларни
аниқлаётган ва INTERFACE оператори танасида жойлашган бўлса ёки программанинг
процедура эълон қилинаётган қисмида қўлланилаётган бўлса узунлик_қиймати қий-
мати сифатида доимий бўлмаган тавсифловчи ифода ишлатилиши мумкин. Бунда
агар мос фактик
2
параметр берилган бўлса, формал параметр SAVE атрибутига эга
бўла олмайди ёки DATA операторида ишлатилмайди ёки CHARACTER операторида уни
эълон қилиб бўлмайди. Масалан, қисм программа subpr нинг формал параметри
spar:
CHARACTER(LEN=15) :: sp1 = ’misol’, sp2*20/’misol_2’/
CALL SUBPR(sp1,15)
! sp1, 15 - фактик параметрлар
CALL SUBPR(sp2,20)
END
SUBROUTINE SUBPR(spar,n)
! spar, n - формал параметрлар
INTEGER(4) n
CHARACTER(LEN=n) spar
PRINT*,LEN(spar)
! 1- чақиришда spar узунлиги 15
! 2- чақиришда 20
END
Агар белгили элемент узунлигини аниқловчи ифода қиймати манфий бўлса,
эълон қилинаётган белгили элементлар узунлиги нолга тенг бўлиб қолади. Агар LEN,
1
Қисм дастурлар аниқланаётганда уларнинг аргументлари формал дейилади.
2
Қисм дастурларга мурожаат қилинаётганда уларнинг аргументлари фактик дейилади.
65


3 Маълумот турини тавсифлаш операторлари
KIND лар қиймати аниқланмаган бўлса, ноошкор ҳолда белгили турдаги объектлар
узунлиги бирга тенг деб қабул қилинади. Белгили тур учун Фортранда фақат бир
дона тур параметри бор (KIND = 1).
хусусиятлар_рўйҳати - бир дона ёки вергуллар билан ажратилган кўп сондаги
хусусиятлар. Агар ҳеч бўлмаганда бир дона хусусият берилган бўлса ажратувчи
белги :: ёзилиши шарт. Масалан,
CHARACTER(LEN = 20), PARAMETER :: st = ’Sarlavha’
vname - ўзгарувчи, доимий ёки функция (ташқи, ички, оператор, стандарт)
номи.
Ноошкор ҳолда бошланғич қиймати аниқланмаган сатр null - белгилардан ибо-
рат бўлади. Шунинг учун LEN_TRIM функция (сатр узунлигини аниқловчи стандарт
функция) сатрнинг тўла узунлигини қайтаради. Сатрга бошланғич қиймат сифатида
бўш жойларни ўзлаштириш фойдали, масалан,
CHARACTER(30) fn, path/’ ’/
! path бошланғич қиймат оляпти
WRITE(*,*) LEN(fn), LEN(path)
! 30
30
WRITE(*,*) LEN_TRIM(fn), LEN_TRIM(path) !
0
30
Агар сатр бошланғич қиймати унинг узунлигидан кам белгилардан иборат
бўлса, етишмаётган белгилар ўрни бўш жойлар билан тўлдирилади. Агар бошланғич
қиймат узунликдан кўп белгилардан иборат бўлса, ортиқчаси ташлаб юборилади.
Бу ерда қараб чиқилган маълумотларни тавсифлаш операторлари ҳақида
кўпроқ маълот олиш учун Фортранга бағишланган бошқа қўлланмаларга мурожаат
қилинг.
3.14 Белгили турдаги доимийлар
Стандарт синфли белгили доимийлар апостроф ёки жуфт қўштирноқлар орас-
ида ёзилади:
’Кўзни юмгил, кўзга айлансин кўнгил!’
"Жалолиддин Румий."
Ихтиёрий белгили турдаги доимийдан ташкил топган белгили объектлар учун стан-
дарт тур параметри KIND функцияси ёрдамида KIND(’ASCII’) кўринишда аниқлани-
ши мумкин.
Бошқа маълумот турларидан фарқли равишда тур параметри белгили доимий
олдида ёзилади:
1_’Uzun harf’
Белгили турларнинг барча синфлари бўш жойни ўз ичига олиши лозим. Апо-
строф ва қўштирноқлар доимий қийматига кирмайди. Улар четки чегараловчи
вазифасини бажаради холос. Лекин уларни доимий қийматига қўшиш мумкин. Бу-
нинг учун уларни аралаштириб ишлатиш керак:
66


М. Нишонов, mnishonov@gmail.com
’Ҳаммага "САЛОМ!" ’
Ёки жуфт чегараловчи ишлатиб:
’Д’’Аламбер белгиси’
Чунки бўш жой билан ажратилмаган жуфт чегараловчи ёлғиз ҳарфли белги деб
қабул қилинади. Белгили доимийда қатнашган бўш жой ва ҳарфлар регистри ҳам
қийматга эга: ’А лаббай’ ва ’аЛаббай’ бир хил эмас.
Бошқарувчи белгилар, масалан, сатрни давом эттириш, белгили доимийда
қатнашиши мумкин эмас. Бир нечта сатрдан иборат белгили доимий сатрлар занжири
кўринишида ёзилади:
Uzun_satr = ’Тилимдан бол томмас, аччиқ ҳам эмас,&
&
ярайди қалбдагин изҳор этишга.
&
&
Узунмас унчалик, қисиқ ҳам эмас,
&
&
етади бўйнимдан тортиб кетишга.
&
&
Аъзам Ўктам.’
Кўриб турганингиздек ҳар бир сатр амперсанд белгиси билан бошланиши зарур.
3.15 Стандарт турдаги маълумотлардан иборат массив
Стандарт турдаги маълумотлардан иборат массив бу тури ва тур параметри
бир хул бўлган элементларнинг тартибланган тўпламидир. Массивнинг ўлчами ўз-
гармас бўлиши мумкин. Бунда унинг элементлари миқдори у эълон қилинаётганда
кўрсатилади. Бошқа ҳолларда массив ўлчами ўзгарувчан бўлиши мумкин. Бу ҳолда
массивнинг элементлари сони программа ишлаётган вақтда ўзгариб туриши мумкин.
Масалан, агар эълон қилинаётганда DIMENSION атрибути битта параметр 20 билан
келтирилган бўлса, A ўзгарувчи 20 та ҳақиқий турдаги элементлардан ташкил топган
бўлади:
REAL, DIMENSION(20) :: A
Массив элементлари индекс ортиб бориш тартибида жойлашади:
A(1), A(2), A(3), ..., A(19), A(20)
Фортранда массив ўлчами учун юқори чегарани кўрсатиш билан бирга қуйи чегарани
ҳам кўрсатиш имкони пайдо бўлди. Биринчи элемент индекси - массив ўлчамининг
қуйи чегараси ихтиёрий бутун, ҳамда манфий сон бўлиши мумкин:
REAL, DIMENSION(-5:15) :: B
Массив Фортранда еттитагача ўлчамли бўлиши мумкин:
REAL, DIMENSION(3,-7:5,-4:4,2,-3:4,6,7) :: D
67


3 Маълумот турини тавсифлаш операторлари
Массив элементлари сони унинг тўлиқ ўлчами дейилади. D массивнинг тўлиқ ўлчами
3 x 13 x 9 x 2 x 8 x 6 x 7 = 235872 га тенг. Кўп ўлчамли массивлар баъзида
жуда катта хотира талаб қилади. Ўлчамлар сони массивнинг ранги
3
дейилади.
Массивнинг битта ўлчамдаги элементлари сони унинг шу ўлчамидаги экстенти
(узунлиги) дейилади. Массивнинг тўлиқ ўлчами унинг экстентларини барча ўлчамлар
сонига кўпайтмасига тенг бўлади. Экстентлар тўплами массивнинг шакли дейилади.
Шундай қилиб юқорида кўрилган D массивнинг тўлиқ ўлчами 235872 га, ранги 6 га
тенг ва унинг шакли (3, 13, 9, 2, 8, 6, 7) кўринишга эга.
Массивни қисм программага узатишда формал параметр фактик параметр
шаклини қабул қилиши мумкин. Бунда фактик параметр формал параметрнинг тури
ва рангинигина аниқлайди. Қуйида номаълум шаклдаги массивни формал параметр
сифатида олаётган қисм программага мисол келтирамиз:
SUBROUTINE massiv_oluvchi(A)
REAL, DIMENSION(:,:) :: A
INTEGER S, I
INTEGER, DIMENSION(2) :: B
S = SIZE(A)
WRITE(*,*) ’Олинган массив ўлчами = ’, S
B = SHAPE(A)
WRITE(*,*) ’Олинган массивнинг экстентлари:’
DO I = 1, SIZE(B)
WRITE(*,*) I, ’: ’, B(I)
END DO
RETURN
END SUBROUTINE massiv_oluvchi
Массивлар билан ишлаганда уларнинг элементлари хотирада қандай тартибда
жойлашганини билиш муҳим. Биринчи рангли массив учун тушунарли, улар эле-
мент индекси ортиб бориш тартибида жойлашиши ҳақида юқорида айтиб ўтдик.
Иккинчи рангли массив учун ҳам шундай, массив элементлари хотирада индексни
чапдан ўнга қараб ошиб бориши тартибида жойлашади. Лекин қайси ўлчамдаги
индекс биринчи бўлиб ортиши ҳақида тасаввур ҳосил қилиш учун икки ўлчамли
массив элементларини тартибини аниқ ёзган маъқул: A(1,1), A(2,1), A(3,1) ...,
A(N,1), A(1,2), A(2,2), A(3,2) ..., A(N,2), ... ва х.к. Яъни, дастлаб бирини-
чи ўлчамдаги индекс чапдан ўнга қараб ортиб боради, кейин иккинчиси. Юқори
рангли массивлар учун ҳам шу қоида ишлайди.
Массивнинг алоҳида элементига мурожаат қилишда ушбу элементнинг индек-
сини кўрсатиш керак. Индексни бутун турдаги доимий кўринишда, масалан, A(5)
ёки D(1, 0, -3, 2, 0, 0, 5) каби кўринишда кўрсатиш мумкин. Умуман олганда
индексни бутун турдаги арифметик ифода орқали аниқлаш мумкин, масалан, B(I*J).
3
Ўзбек тилидаги ранг сўзи билан адаштирманг!
68


М. Нишонов, mnishonov@gmail.com
Маълумотларнинг ўзгариб турувчи структураси
Фортраннинг эски стандартларидаги энг жиддий камчиликлардан бири ўзгариб
турувчи хотирани ишлатиш имконияти йўқлигидан массив учун ажратиладиган
хотира компиляциягача аниқланиши мажбурий эди. Фортран 90 стандартидан бо-
шлаб бу камчилик бартараф этилди. Энди ўлчами ўзгариб турувчи массивлар билан
ишлаш имконияти пайдо бўлди. Ўзгариб турувчи хотира яна кўрсаткичларга ҳам
қўлланилиши мумкин. Объект учун хотира ажратишга мўлжалланган ALLOCATE
оператори фақат эълон қилинаётганда ALLOCATABLE атрибути мавжуд массив ёки
кўрсаткичларга қўлланилиши мумкин.
Кўрсаткичлар
Фортранда кўрсаткичлар маълум турга эга бўлган турли объектларга йўлланма
сифатида ишлатилади. Бунда кўрсатгични мавжуд объектларнинг лақаби деб ай-
тиш мумкин. Объект ва кўрсатгич орасидаги алоқа программа ишлаши мобайнида
ўрнатилиши ёки узиб қўйилиши мумкин. Юқорида айтганимиздек кўрсатгич учун
ўзгариб турувчи хотира ажратилиши ҳам мумкин.
Эълон қилинаётганда POINTER атрибути кўрсатилган ўзгарувчи кўрсатгич
ҳисобланади:
REAL, POINTER :: A
INTEGER, POINTER, DIMENSION(:) :: INDEX
COMPLEX, POINTER, DIMENSION(:,:) :: MATRIX
Кўрсатгични тавсифлаш учун объект тури ва агар массивга йўлланма ҳосил қилиш
керак бўлса, массив ранги аниқланиши етарли. Масалан, йўлланма ёрдамида ҳақиқий
турдаги, ўлчами ўзгариб турувчи массивни олишимиз мумкин:
PROGRAM pointer_misol
REAL, ALLOCATABLE, DIMENSION(:,:), POINTER :: A
INTEGER N, S
WRITE(*,*) ’Массив ўлчамини киритинг:’
READ(*,*) N
ALLOCATE(A(N,N), STAT = S)
CALL RANDOM_NUMBER(A)
WRITE(*,*) A
DEALLOCATE(A, STAT = S)
END PROGRAM pointer_misol
Мустақил ишлаш учун савол ва топшириқлар
1. Фортранда киритилган барча стандарт маълумот турларини санаб беринг.
69


3 Маълумот турини тавсифлаш операторлари
2. Қайси маълумот турлари сонли турга мансуб? Маълумот тур параметрига
таъриф беринг. Мантиқий маълумот тури мавжудми?
3. DOUBLE PRECISION га мос келувчи маълумот турининг тур параметрини
аниқланг.
4. Агар, қуйидаги ифодалар ҳарфли доимийлар бўлса, улар қайси турга мансуб-
лигини аниқланг:
’tree’ - 3.8
476
3.7 - 4
1_2
’(5, -6)’
0.0001E-10
z10
b’04’
z’af’
(0.4,7)
5. Текисликда турли рангларни (RGB, Red- қизил, Green- яшил, Blue- кўк) тасвир-
ловчи нуқтани тавсифловчи ҳосилавий маълумот турини аниқланг.
6. Стандарт турдаги бутун, ҳақиқий, белгили ва мантиқий маълумотларни тавси-
фловчи программа ёзинг.
7. Ўзгарувчан узунликка эга бўлган сатр доимийни аниқловчи ҳосилавий турни
тавсифланг.
8. Қуйидаги хусусиятларни биргаликда ишлатиш мумкинми? Агар мумкин бўл-
маса, нима учун?
• ALLOCATABEL, TARGET
• TARGET, POINTER
• ALLOCATABLE, SAVE
• POINTER, DIMENSION
• PRIVATE, DIMENSION
• PARAMETER, ALLOCATABLE
• ALLOCATABLE, INTRINSIC
• POINTER, EXTERNAL
9. Қуйидаги иккита тавсифлаш операторларида аниқланган объектларнинг фарқи
нимада:
REAL :: pi = 3.141592
ва
IMPLICIT REAL(p)
PARAMETER (pi = 3.141592)
10. Юқоридаги қайси тавсифлаш оператори учун pi қиймати программада pi =
2.718282 каби аниқланганда, компилятор хато ҳақида ахборот беради?
70


4 чи БОБ
Фортран арифметикаси
Фақат ўзимизга ёққан китобларнигина ўқисак,
билимли бўла олмаймиз.
Жозеф Жубер
Ушбу бобда Фортранда арифметик ифодалар билан ишлашдаги ҳусусиятлар
ҳақида сўз юритамиз. Арифметик ифодалар ҳисоблаш учун ёзилган программалар-
нинг муҳим қисмини ташкил қилади. Уларни ҳисоблаш учун компьютер процессори
анчагина вақтни сарфлайди. Шу сабабли Фортранда программа ёзишда машина
арифметикасининг ҳусусиятларини ҳисобга олиш алоҳида эътиборга лойиқ. Ҳисоб-
лашларни оптималлаштириш муҳим аҳамиятга эга.
4.1 Арифметик ифодалар
Арифметик ифода операндлар, арифметик амалларни бажарувчи операторлар
ва қавслардан ташкил топади. У бажарилгач сон кўринишдаги натижа олинади.
Операнд – арифметик амал қўлланилаётган қиймат. Қуйидагилар операнд бўлиши
мумкин:
• сон кўринишдаги доимий;
• ихтиёрий сон турдаги ўзгарувчи;
• элементлари сонлардан иборат массив ёки массив кесими;
• структура элементи;
• сон турдаги функцияга мурожаат.
Ҳар бир операнднинг қиймати унга мурожат қилингунча аниқланган бўлиши лозим.
Фортранда қиймати ҳали аниқланмаган ўзгарувчига баъзи компиляторлар маҳсус
NaN қиймат (Not-a-Number – ’мавжуд бўлмаган сон’), баъзилари эса нол қиймат
ўзлаштиради (агар операнд сон турга эга бўлса).
71


4 Фортран арифметикаси
Арифметик ифода қиймати математик жиҳатдан маълум бўлиши зарур. Яъни,
масалан, ифодада нолга бўлиш амали қатнашмаслиги керак, a**b ифода ҳақиқий
турдаги даражага эга бўлса, асос манфий ёки нол бўлганда натижа номаълум.
Арифметик амаллар, операндлар миқдорига қараб иккита гуруҳга ажратилади:
• унар амаллар, бир дона операнд бўлган ҳолда, кўриниши
амал_белгиси операнд
• бинар амаллар, иккита операнд бўлган ҳолда, кўриниши
операнд амал_белгиси операнд
Масалан, ишорани ўзгартириш амали унар ҳисобланади:
a = -x
қўшиш эса бинар арифметик амалдир:
z = x + y
Иккита арифметик амал кетма-кет ишлатилиши мумкин эмас. Лекин, баъзида
шундай ҳоллар ҳам учрайди. Масалан, манфий даражага кўтариш. Бундай ҳолларда
қавслар ишлатилади:
a**(-2.5)
Охирги ёзувда даражага кўтариш амали ва унар амал белгиси ’минус’ кетма-кет
келяпти.
Арифметик амаллар ўрнатилган (стандарт) ва қайта юкланувчи бўлиши мум-
кин. Ўрнатилган амаллар программалаш тили яратувчилари томонидан аниқланган
бўлади. Фортранда бундай амалларга қўшиш (+), айриш (–), кўпайтириш (*), бўлиш
(/) ва даражага кўтариш (**) киради. Асосий арифметик амаллар ўзларининг мос
белгиларига эга, баъзилари стандарт функциялар кўринишида ташкил қиланган
(масалан, бўлиш қолдиғини ҳисобловчи функция MOD).
Турли хилдаги арифметик амаллар битта белги билан ифодаланиши мумкин.
Масалан, бўлиш қоидаси (/) бутун, ҳақиқий ва комплекс операндлар учун турли-
ча. Бу ҳодиса амални қайта юклаш ёки статик полиморфизм дейилади. Даражага
кўтариш ҳам полиморф амалдир: i = j**2 амал кўпайтириш амали орқали ҳисобла-
нади, лекин i=j**2. бўлса логорифм ёрдамида ҳисобланади (2 сонидан кейин турга
нуқта ҳисобига). Ифодалар скаляр ва массив-ифода бўлиши мумкин. Биринчи ҳолда
операндлар скаляр объектлар, масалан, оддий ўзгарувчи, массив элементи ва ҳ.к.,
натижа ҳам скаляр. Иккинчи ҳолда эса ифода натижаси массив ёки массив кесими.
72


М. Нишонов, mnishonov@gmail.com
4.2 Қайта юкланувчи амаллар
Қайта юкланувчи амаллар ҳосилавий тур учун аниқланади. Амални қайта
юклаш – умумий таъсир соҳасида турли амалларни битта ном билан белгилашдир.
Амални таъсир соҳаси у аниқланган программа бирлиги билан мос келади.
Стандарт (ўрнатилган) амаллар стандарт маълумот турлари учун аниқланган.
Фортранда ҳосилавий турлар учун ҳам амалларни аниқлаш имкони мавжуд. Ҳоси-
лавий тур учун зарур бўлган амални оддий программа ёрдамида яратиш мумкин,
лекин бу йўл ноқулай. Қисм программага мурожат қилишдан кўра янги семантикали
маҳсус белгини ишлатга маъқул. Бунга программалаш тилида мавжуд амалларни
қайта аниқлаш ёки янгиларини киритиш йўли билан эришиш мумкин.
Амални қайта аниқлашга мисол қараймиз. Қуйидаги ҳосилавий турга эга
бўлайлик:
TYPE KORDINATA
REAL x, y
END TYPE KORDINATA
Ушбу тур учун бинар амални аниқлаш учун қуйидаги функцияни аниқлаш зарур:
FUNCTION add_kordinata(a, b)
TYPE(KORDINATA) add_kordinata
TYPE(KORDINATA), INTENT(IN) :: a, b
add_kordinata%LOWER = a%LOWER + b%LOWER
add_kordinata%UPPER = a%UPPER + b%UPPER
END FUNCTION add_kordinata
Бу функция учун интерфейс блок ҳам аниқланиши зарур:
INTERFACE OPERATOR(+)
MODULE PROCEDURE add_kordinata
END INTERFACE
Бу ерда қайта аниқланган қўшиш амалини ва KORDINATA турдаги операндларни ўз
ичига олган ифодаларни ҳисоблашда
KORDINATA :: x1, y1, z1
x1 = y1 + z1
юқорида аниқланган функцияга мурожат қилинади. Унар амаллар ҳам шунга ўхшаб
қайта аниқланади, фақат функцияда бир дона кириш аргументи ишлатилади.
Янги ҳосил қилинган амал номи сифатида аввал мавжуд бўлган амал белгисини
ёки узунлиги 31 тадан ошмаган ҳарфлар кетма-кетлигини ишлатиш мумкин. Бунда
янги номни ишлатишда биринчи ва охирги белги сифатида нуқта ёзилади. Масалан,
интерфейс блоки сарлавҳаси қуйидаги кўринишда бўлса:
INTERFACE OPERATOR(kupaytir)
73


4 Фортран арифметикаси
ифодада у
z = x .kupaytir. y
каби ишлатилади. Агар янги ҳосил қилинган амал учун аввалдан мавжуд стандарт
амал белгиси ишлатилса стандарт амал муҳимлик даражаси сақланади. Қайта
аниқлашда коммутативлик ва ассоциативлик ҳоссалари мерос қилинмайди, яъни x
+ y - z ифода учун натижа y - z + x ифода натижасидан фарқ қилиши мумкин.
Унар амаллар муҳимлик даражаси энг юқори, бинар амалларники эса энг қуйи
бўлади.
4.3 Арифметик амалларнинг бажарилиш тартиби
Ифодада арифметик амалларнининг бажарилиш тартибини учта фактор
аниқлайди:
• ифодадаги операндлар кетма-кетлиги;
• амалларнинг муҳимлик даражаси;
• ифода қисмларини ажратувчи қавсларни жойлашуви.
Ифодада муҳимлик даражаси бир хил амаллар келса улар чапдан ўнгга қараб навбат
билан бажарилади. Агар муҳимлик даражаси турли бўлса, дастлаб юқори муҳимлик
даражага эга амал бажарилади. Амаллар муҳимлик даражаси ҳақида аллақачон сўз
юритган эдик.
Ифоданинг маълум қисмлари қавслар билан ажратилиши мумкин. Ажратилган
қисм биринчи бўлиб бажарилади.
4.4 Арифметик ўзлаштириш
Фортаранда ўзлаштириш оператори қуйидаги кўринишда эди:
ўзгарувчи = ифода
Агар ўзгарувчи ва ифода сон (бутун, ҳақиқий ёки комплекс) турга эга бўлса, бундай
ўзлаштириш арифметик дейилади.
Ўзгарувчи ва ифода тури бир хил ўзгариш диапазонга эга бўлиши муҳим, 10
та ўнли разрядларга эга стандарт бутун турдаги сонни 7 та муҳим сонли стандарт
ҳақиқий турга (REAL(4)) айлантиришда аниқлик йўқолади.
Агар ўзгарувчи ва ифода турлари ҳар-ҳил бўлса, ифода тури ўзгарувчи турига
алмаштирилади. Ўзлаштириш операторининг чап томонида доимий туриши мумкин
эмас: 5 = x + y ёзув хато, чунки 5 сони доимий.
Ўзлаштириш операторининг чап ва ўнг томонида жойлашган объектлар тури
мос бўлиши керак: i = a//b ёзув хато, чунки чап томонда бутун турдаги объект,
ўнг томонда эса сатр турдаги ифода турипти.
74


М. Нишонов, mnishonov@gmail.com
Ўнг ва чап томондаги объектларнинг шакли ҳам мос келиши керак: x = (:)
ёзув хато.
Ўзлаштириш операторининг чап томонида ифода жойлаша олмайди: x + y =z
ёзув хато.
4.5 Турларни алмаштириш
Бир хил турдаги операндлардан иборат арифметик ифода - бир жинсли ифода
дейилади. Ифода ҳисоблангач натижа ҳам операндлар эга бўлган турга эга бўлади.
Бир жинсли ифодаларга мисол келтирамиз:
1 + 2
(3)
3.14 - 2.71 (0.43)
5 * 6
(30)
12 / 5
(2)
1 / 2
(0)
Қавслар ичида ифода натижаси кўрсатилган. Охирги иккита натижадан кўриниб
турибдики, бутун сонларни бўлишда каср қисм ташлаб юборилади.
Бир жинсли бўлмаган ифодаларни ҳисоблаш мураккаброқ. Бинар арифметик
амаллар бажарилишидан олдин операндлар дастлаб умумий турга айлантирилади.
Бу қоидага x**n даражага кўтариш амалигина бўйсунмайди. Даражага кўтаришда
даража бутун турга эга бўлса, у бутунлигича қолади. Ифода x ни n марта ўзига
кўпайтириш билан олинади, яъни: 2**4 ифода 2 * 2 * 2 * 2 га тенг кучли.
Бир жинсли бўлмаган ифодаларга мисоллар:
3 + 0.5 (3.5)
1 / 2.0 (0.5)
5.0**(1/2) (1)
Арифметик ифодада мантиқий қийматлар бутун тур деб қабул қилинади.
Операндларнинг турини алмаштириш уларнинг ранги билан аниқланади. Ранг
турнинг тавсифи ҳисобланади. Қуйида стандарт турларнинг ранги ошиб бориш
тартибида келтирилган:
1. LOGICAL(1) ва BYTE
2. LOGICAL(2)
3. LOGICAL(4)
4. LOGICAL(8)
5. INTEGER(1)
6. INTEGER(2)
7. INTEGER(4)
75


4 Фортран арифметикаси
8. INTEGER(8)
9. REAL(4)
10. REAL(8)
11. REAL(16)
12. COMPLEX(4)
13. COMPLEX(8)
14. COMPLEX(16)
Унар ёки бинар арифметик амал натижаси операндларнинг ранги бир хил бўлганда
операндлар турида бўлади. Агар ҳар ҳил турда бўлишса натижа тури энг юқори
рангга эга бўлган операндники билан мос тушади. Бу ҳолат умумий қоидадир. Агар
операндлар бутун сонлар бўлишса, натижа энг кенг диапазонли операнд тур пара-
метрига, агар операндлар ҳақиқий ёки комплекс бўлишса, натижа катта аниқликка
эга бўлган операнд тур параметрига эга бўлади.
Агар комплекс операнд қатнашаётган арифметик амалда бутун турдаги операнд
бўлса, у дастлаб ҳақиқий турга алмаштирилди. Алмаштириш натижаси комплекс
соннинг ҳақиқий қисми деб ҳисобланади, мавҳум қисм эса нолга тенг деб фараз
қилинади.
Турларни алмаштириш ҳар ҳил кутилмаган эффектларга олиб келиши мумкин.
Бундай эффектлар унчалик аҳамиятли бўлмаслиги мумкин. Лекин баъзида улар
ҳисоблаш аниқлигини йўқолишига ёки программага киритилган маънони ўзгарти-
риб юбориши ҳам мумкин. Бир жинсли бўлмаган ифодаларнинг баъзилари билан
танишайлик.
Аниқлиги кичик бўлган турдан аниқлиги катта турга ўтиш ҳақиқий турдаги
сонни тасвирлашда ҳатоликка олиб келиши мумкин. Қуйида мисол келтирамиз:
PROGRAM aniqlik_kamayishi
REAL(4) :: x
REAL(8) :: y
x = 1.07
PRINT *, "x = ", x
y = x
PRINT *, "y = ", y
END PROGRAM aniqlik_kamayishi
Натижа (gfortran)
x = 1.07000005
y = 1.0700000524520874
Бу ерда стандарт ҳақиқий турдан иккилик аниқликдаги ҳақиқий турга ўтганда қий-
мат ўзгарди, аниқлик йўқотилди. y нинг турини стандарт ҳақиқий турга ўзгартирсак
қуйидаги натижани оламиз:
76


М. Нишонов, mnishonov@gmail.com
x = 1.07000005
y = 1.07000005
Юқоридаги программа билан содда тажриба ўтказайлик. Агар x нинг қиймати
сифатида 1.25
10
сонини ишлатсак аниқликни йўқолиши содир бўлмайди, лекин
1.26
10
сони билан яна аниқлик йўқолишини кузатамиз. Нима учун бундай бўлганини
тушуниш учун ушбу сон қийматларни иккилик ҳисоб системасидаги кўринишига
қараймиз. 1.25
10
сони иккилик ҳисоб системасида 1.01
2
кўринишда тасвирланади.
Каср қисмининг иккинчи разрядидан сўнг фақат ноллар келади. 1.26
10
сони эса
қуйидаги кўринишга эга:
1.01000010100011110101110000101000111101011100001
2
Яъни, у чексиз касрдир. Стандарт ҳақиқий турдаги сон қийматлари учун IEEE
754 стандарт бўйича (The Electrical and Electronics Engineers, Inc.) фақат
дастлабки 23 та разряд сақланади. Иккиланган аниқликка алмаштирилганда ажра-
тилган ҳотира катакчалари 23 чи разряддан кейин ноллар билан тўлдирилади:
1.01000010100011110101110000000000000000000000000
2
Бу қиймат 1.25999999046326
10
сонининг иккилик ҳисоб системасидаги кўринишидир.
Битта ифодада аҳамиятли рақамлар миқдори фарқ қиладиган ўзгарувчиларни
(қийматларни) ишлатиш маслаҳат берилмайди, масалан,
PROGRAM kommutativlik_buzilishi
REAL(4) :: x = 1.0e20, y = -1.0e20, z = 1.0
REAL(4) :: a, b
a = (x + y) + z
PRINT *, "a = ", a
b = x + (y + z)
PRINT *, "b = ", b
END PROGRAM kommutativlik_buzilishi
Натижага кўра бу ҳолда арифметик қўшиш амали учун коммутативлик ҳоссаси
бузилади, яъни натижа арифметик амалларнинг бажарилиш тартибига боғлиқ:
a = 1.00000000
b = 0.00000000
Иккиланган аниқликка ўтиш ҳам бу муаммони ҳал қилмайди.
Арифметик қўшиш ва айриш амалларини бажаришда ҳам қийматлари ўта
катта фарқ қилувчи катталикларни ишлатганда кичик қийматлар йўқотилиши содир
бўлади:
PROGRAM katta_va_kichik
IMPLICIT NONE
REAL :: a, b, c, d
77


4 Фортран арифметикаси
DATA a/1.e20/, b/1.e-20/
c = a + b
d = a - b
PRINT *, "a = ", a
PRINT *, "b = ", b
PRINT *, "c = ", c
PRINT *, "d = ", d
END PROGRAM katta_va_kichik
Бу программани ишлатгач олинган натижа
a =
1.00000002E+20
b =
9.99999968E-21
c =
1.00000002E+20
d =
1.00000002E+20
Йиғиндиларни ҳисоблашда натижа қўшилаётган ҳадларнинг жойлашиш тарти-
бига боғлиқ бўлиши мумкин, масалан:
a =
N
X
k=1
1
k
,
b =
1
X
k=N
1
k
Бу ерда a– тўғри тартибда, b– эса тескари тартибдаги йиғинди. Уларни программа
ёрдамида ҳисоблаб кўрайлик:
PROGRAM summa
IMPLICIT NONE
INTEGER :: N, k
REAL :: a, b
DATA a /0./, b /0./, N /1000000/
DO k = 1, N
a = a + 1. / FLOAT(k)
b = b + 1. / FLOAT(N - k + 1)
ENDDO
PRINT *, "a =", a
PRINT *, "b =", b
END PROGRAM summa
gfortran компиляторни қўллаб олинган натижа:
a = 14.3573580
b = 14.3926516
Йиғинди тўғри тартибда ҳисобланганда циклнинг ҳар бир кейинги қадамида аввалги
қисмий натижага навбатдаги ҳад қиймати қўшилади. Бунда қўшилувчи ҳад қиймати
камаяди, қисмий натижа қиймати ортади. Шундай вақт келадики навбатдаги ҳад
78


М. Нишонов, mnishonov@gmail.com
ва қисмий натижа қийматлари бир-биридан сезиларли даражада фарқ қилади. Шу
сабабли йиғиндини ҳисоблаш ҳатолиги ортиб боради. Тескари тартибда ҳисоблаш
бажарилганда йиғиндининг барча ҳадлари қиймати тахминан бир ҳил даражали
бўлишади. Бу ҳолда ҳисоблаш ҳатолиги кичкина. Шундай қилиб, иккинчи натижа-
ни биринчисидан аниқроқ деб ҳисоблаш керак. Иккиланган аниқликка ўтилганда
натижалар фарқи вергулдан кейинги 12-чи рақамда пайдо бўлади:
a = 14.392726722864781
b = 14.392726722865756
Операндлар турини автоматик равишда ёки ноошкор алмаштириш компьютер
процессорининг анчагина вақтини олиши мумкин. Шуни ва кутилмаган эффект-
лар содир бўлиш эҳтимоллигини ҳисобга олиб бир жинсли бўлмаган ифодаларни
ишлатмасликка ҳаракат қилиш лозим. Бунга турларни алмаштириш функцияларини
қўллаб эришиш мумкин, масалан:
k = INT(x)
x = REAL(j)
4.6 Ўзгарувчиларга қиймат ўзлаштириш
Ўзгарувчига бошланғич қиймат бериш қиймат ўзлаштириш (инициализация)
дейилади. Фортранда ўзгарувчиларга қиймат ўзлаштиришнинг бир нечта йўли бор:
• тавсифлаш операторларида;
• DATA операторида;
• ўзлаштириш операторлари ёрдамида;
• ташқи файлдан қиймат киритиш ёрдамида;
• BLOCK DATA танасида.
Ўзлаштириш операторида қиймат бериш бир қанча камчиликларга эга. Аввало,
ўзлаштириш бажарилаётганда бир нечта кетма-кет амалларни бажариш зарур, яъни
ҳотирага мурожат, ҳотирага ёзиш ва ҳ.к. Бу эса компьютер процессорини қанчадир
вақт сарф қилишига олиб келади. Бундан ташқари ўзлаштириш операторида
ўзгарувчи = доимий
сон кўринишдаги доимийни сақлаш учун ҳотиранинг алоҳида ячейкасини ажратишга
тўғри келади.
Ўзлаштириш оператори орқали кўп миқдорда қиймат бериш бажарилувчи
программа ҳажмини катта бўлишига сабаб бўлиши мумкин.
Ўзгарувчиларга қиймат беришни ўзлаштириш операторини ишлатмасдан амал-
га ошириш мумкин. Бу ташқи файлдан қийматларни ўқиш йўли билан амалга
оширилади.
79


4 Фортран арифметикаси
Кўпинча ўзгарувчиларга бошланғич қиймат сифатида нол ўзлаштирилади.
Баъзи компиляторлар қиймати ошкор аниқланмаган ўзгарувчиларга ўзлари нол
ўзлаштиради. Лекин программани турли компьютерларда муаммосиз ишлатиш учун
ошкор қиймат ўзлаштириш бажарилгани маъқул.
Тавсифлаш вақтида қиймат ўзлаштиришга мисоллар:
INTEGER :: yil = 2007
REAL(4), DIMENSION(2) :: kordinatalar = (/0.0, 3.1/)
CHARACTER(LEN = 5) :: ismi = ’Oyxon’
DATA оператори ишлатилганда бошланғич қийматлар компиляция вақтида ўзлашти-
рилади:
REAL(8) :: x, y
INTEGER, DIMENSION(4) :: a12
DATA x, y /1.2978D+01, -3.1222D0/
DATA a12 /1, 5, 5, 0/
Бу ерда x га 1.2978D1, y га -3.1222D0 манфий қиймат, a12 массив элементларига:
a12(1) = 1
a12(2) = 5
a12(3) = 5
a12(4) = 0
сонлар ўзлаштириляпти. Охирги ҳолда иккита 5 қиймат кетма-кет келяпти. Бундай
пайтларда такрорланиш коэффициентини қўллаш мумкин:
INTEGER, DIMENSION(4) :: a12
DATA a12 /1, 2*5, 0/
Такрорланиш коэффициенти номланган ёки сонли доимий бўлиши мумкин. У қиймат
олдида туради ва юлдузча билан ажратилиб ёзилади. Унинг қиймати нол ёки мусбат
бутун бўлиши мумкин. DATA операторини массив кесимига қиймат бериш учун ҳам
қўллаш мумкин:
DATA rmatrix(2:4,3) /3*0.0/
Бу ерда нол қиймат массивнинг учта элементи rmatrix(2,3), rmatrix(3,3),
rmatrix(4,3) га ўзлаштирляпти.
DATA операторида параметрли ноошкор цикл қўлланилиши мумкин:
DATA ((rmatrix(i,j), i=1,21,2), j=1,10) /110*0.0/
DATA операторини ҳосилавий турдаги объектларга бошланғич қиймат бериш
учун ҳам ишлатиш мумкин:
80


М. Нишонов, mnishonov@gmail.com
TYPE kordinatalar
REAL x, y, z
CHARACTER a
END TYPE kordinatalar
TYPE(kordinatalar) :: nuqta1, nuqta2
DATA nuqta1 /kordinatalar( 1.,
1.1,
2., ’nu1’)/, &
nuqta2 /kordinatalar(-1., -1.1, -2., ’nu2’)/
Бунда ўзлаштириш пайтида ўзгарувчи SAVE ҳусусиятини автоматик равишда олади.
Маълумотлар блоки BLOCK DATA сарлавҳага эга. Маълумотлар блоки ёрдами-
ада бошланғич қиймат беришда COMMON-блок ва DATA ишлатилади. Маълумотлар
блокининг умумий таркиби қуйидагича:
BLOCK DATA [номи]
тавсифлаш операторлари
COMMON-блоклар
END [BLOCK DATA [номи]]
BLOCK DATA сарлавҳадан кейин блок номи ёзилиши мумкин, лекин у шарт бўлмаган
параметр. Программада фақат бир дона номланмаган маълумотлар блоки бўли-
ши мумкин ҳолос. Тавсифлаш операторларида ALLOCATABLE, EXTERNAL, INTENT,
OPTIONAL, PRIVATE, PUBLIC ҳусусиятлар, интерфейс блоки ва бажарилувчи опера-
торлар ишлатилмайди.
Маълумотлар
блокида
USE, IMPLICIT, PARAMETER, INTRINSIC, POINTER,
TARGET, COMMON, DIMENSION, EQUIVALENCE, DATA, SAVE ва тавсифлаш операторла-
ри, ҳосилавий турларни аниқлаш ишлатилиши мумкин.
Фортраннинг янги стардартларида BLOCK DATA маълумотлар блоки тилнинг
эскирган ҳусусияти сифатида қаралади. Чунки у бажарадиган вазифани модуллар
амалга ошириши мумкин.
4.7 Ҳисоблашларни оптимизациялаш
Фортранда ёзилган программалар асосан ҳисоблашлар учун мўлжалланган.
Уларнинг ишлаш вақти кенг оралиқда ўзгаради. Улар бир неча сонияда бажари-
ладиган кичик программалар бўлиши мумкин. Бундай программаларни яратишда
самарадорликни ошириш билан боғлиқ саволлар туғилмайди. Лекин, баъзида шун-
дай масалалар борки уларни ҳал қилиш учун компьютер процессори соатлар, кунлар
ва хатто ҳафталарни сарфлаши мумкин. Бундай ҳолларда программани оптими-
зация қилиш масаласи пайдо бўлади. Яъни, программанинг бажарилиш вақтини
камайтиришга ҳаракат қилиш лозим бўлади.
Оптимизация ғояси жуда содда. Унинг маъноси, юқорида айтганимиздек, бутун
программанинг ёки унинг баъзи қисмларининг ишлаш вақтини камайтиришдир. Бу
мақсадга бажарилувчи амаллар миқдорини камайтириб эришиш мумкин. Албатта
81


4 Фортран арифметикаси
бунда программанинг мантиқий таркиби сақланиб қолиши лозим. Алоҳида амални
бажарилиш вақтини камайтириш учун эса компьютерни алмаштиришга тўғри келади.
Иккита турдаги оптимизация ҳақида гапириш мумкин:
1. Компилятор томонидан автоматик равишда бажариладиган оптимизация
2. "Қўлда" бажариладиган оптимизация.
Автоматик оптимизация қилишда программачининг вазифаси компиляторга зарур
калитни кўрсатишдир (масалан, -O2). Бу усул энг кам мехнат талаб қиладиган йўлдир.
Лекин бунда катта самарадорликка эришиб бўлмаслиги мумкин. Чунки компилятор
программа мантиғини ўзгартирмасликка ҳаракат қилади. Автоматик оптимизация
жуда эҳтиёткорлик билан бажарилади ва деярли "ҳавфсиз". Шундай бўлса ҳам,
автоматик оптимизацияни текшириш талаб қилинади. Ҳусусан, бу ҳолда амалларнинг
бажарилиш тартиби ўзгариши ва ҳисоблаш аниқлиги камайиши мумкин.
Программанинг маълум бир парчаси турли кўринишда ёзилиши мумкин. Бир
кўринишда ёзилган парча бошқа кўринишда ёзилганига нисбатан компилятор томо-
нидан осон оптимизацияланади, баъзида умуман оптимизациялаб бўлмайди. Шунинг
учун программани бошиданоқ оптимал ёзиш кўникмасини ҳосил қилишга ҳаракат
қилиш лозим.
Компиляторга боғлиқ бўлмаган оптимизациялаш усулларига тўхтаб ўтайлик.
Турлича арифметик амалларни, ҳамда битта амални лекин ҳар ҳил турдаги
операндлар билан бажариш учун процессор ҳар ҳил вақт сарфлаши мумкин. Масалан,
ҳақиқий турга эга бўлган асосни ҳақиқий турдаги даражага кўтариш энг секин
бажариладиган амал ҳисобланади. Қуйида арифметик амаллар қийинлик даражаси
ва бажарилиш вақти ошиб бориш тартибида келтирилган. Бундай тақсимланиш
таҳминий ва бошқа ҳолатларда сал ўзгариши мумкин.
1. Бутун турдаги операндарни қўшиш ва айриш.
2. Ҳақиқий турдаги операндарни қўшиш ва айриш.
3. Бутун турдаги операндларни кўпайтириш.
4. Ҳақиқий турдаги операндарни кўпайтириш.
5. Бутун турдаги операндлар билан бўлиш амали.
6. Ҳақиқий турдаги операндлар билан бўлиш амали.
7. Бутун турдаги мусбат доимий кўрсатгичли даражага кўтариш.
8. Бутун турдаги ўзгарувчи кўрсатгичли даражага кўтариш.
9. Ҳақиқий турдаги ўзгарувчи кўрсатгичли даражага кўтариш.
Шулардан келиб чиқиб арифметик ифода имкон борича секин бажариладиган амал-
лардан ҳоли бўлиши керак. Қуйидаги ифодани ҳисоблаш
82


М. Нишонов, mnishonov@gmail.com
x = a / b / c / d
ҳудди шу амални бажарадиган бошқа
x = a / (b * c * d)
ифодани ҳисоблашга нисбатан қийинроқ. Полиномнинг қийматини ҳисоблашда се-
кин бажариладиган амаллар миқдорини камайтириш усулларидан бири бу Горнер
схемасидир. Масалан, 5- даражали кўпҳаднинг қийматини ҳисоблаш талаб қилинсин:
a
5
x
5
+ a
4
x
4
+ a
3
x
3
+ a
2
x
2
+ a
1
x + a
0
Даражали ифоданинг қийматини ҳисоблашда бутун кўрсаткичли даража асосни
ўз- ўзига кўпайтириш орқали бажарилишини назарда тутиш керак. Агар даража
кўрсаткичи ҳақиқий сон бўлса ифодани ҳисоблаш логорифмни ҳисобловчи стандарт
функцияга мурожаат қилиш билан амалга оширилади. Бизнинг мисолда даража
кўрсаткичи бутун сон ва шунинг учун ифода қуйидагига тенг кучли:
a(5) ∗ x ∗ x ∗ x ∗ x ∗ x + a(4) ∗ x ∗ x ∗ x + a(2) ∗ x ∗ x + a(1) ∗ x + a(0)
Ушбу ифодада 15 та ҳақиқий сонларни кўпайтириш ва 5 та ҳақиқий сонларни қўшиш
амали бор. Горнер схемасини қўллаб уни қуйидаги кўринишда ёзиш мумкин:
((((a(5) ∗ x + a(4)) ∗ x + a(3)) ∗ x + a(2)) ∗ x + a(1)) ∗ x + a(0)
Энди бу ифодада 5 та кўпайтириш ва 5 та қўшиш амали бор. Шундай қилиб ифодада
10 та ҳақиқий турдаги операндларни кўпайтириш амалини тежашга эришилди!
Баъзида даражага кўтариш амалини тезроқ бажариладиган қўшиш ва айриш
амаллари билан алмаштириш мумкин. Мисол сифатида ишораси ўзгарувчи қаторни
ҳисоблашни қарайлик:
1 − a
1
+ a
2
− a
3
+ a
4
+ . . .
Ушбу йиғиндини қуйидаги программа ёрдамида ҳисоблаш мумкин:
s = 0
qator: DO i = 0, n
s = s + (-1)**i * a(i)
END DO qator
Лекин бу самарасиз усулдир. Циклни ўзгартириб кўпайтириш амалини қўшиш амали
билан алмаштиришимиз мумкин:
s = 0
qator: DO i = 0, n - 1
s = s - a(i) + a(i+1)
END DO qator
Арифметик ифодаларда бир ҳил кўринишдаги қисмларни кўп марта ёзишдан воз
кечишга ҳаракат қилиш керак. Масалан,
83


4 Фортран арифметикаси
1 - x + x*e - x*f + z*(e-f)
ўрнига
1 - x + (x+z)*(e-f)
ифодани ишлатиш қулайроқ. Бунда учта ўрнига битта кўпайтриш амали бажари-
ляпти.
Вақтинчалик ўзгарувчиларни ишлатишда хотирага қўшимча мурожаат қилиш
зарурати пайдо бўлади ва бу ортиқча вақт сарфланишига олиб келади. Шу сабабли
оралиқ ҳисоблашларни ва ёрдамчи ўзлаштриш амалларини ишлатмасликка ҳаракат
қилиш керак. Масалан,
temp1 = x + ro
temp2 = z * mu * s
eta = temp1 + temp2
ўрнига
eta = x + ro + z * mu * s
ёзувни ишлатиш лозим. Ўзгарувчиларни турларини эътибор билан танлаш ва имкон
борича аралаш турдаги ўзгарувчиларни ишлатмасликка ҳаракат қилиш керак. Ара-
лаш турдаги операндлар қатнашган арифметик ифодани ҳисоблашда ифода тури
мураккаброқ турдаги операнд турига алмаштирилади ва бунга вақт сарфланади.
Масалан,
a = x + y + z + i + j + k
ифодада дастлабки учта ўзгарувчи ҳақиқий, қолганлари бутун турга эга бўлсин.
У ҳолда бу ифодада ноошкор ҳолда 3 та тур алмаштириш амали бажарилади.
Қўшилувчилар жойлашиш тартибини ўзгартирайлик:
a =
i + j + k + x + y + z
Бу ҳолда фақат бир марта тур алмаштириш амали бажарилади. Шундай қилиб
ўзгарувчиларни тўғри гуруҳлаб тур алмаштириш амаллари миқдорини камайтириш
мумкин экан.
Программа самарадорлигини циклларни оптимизациялаш орқали сезиларли
даражада ошириш мумкин. Циклни ишлатишда ҳисоблаш вақтининг маълум қисми
уни инициализациясига (қийматларни ўзлаштиришга) сарфланишини ёдда сақлаш
лозим. Бунда циклни неча марта такрорланиши ва бошқа амаллар киради. Цикл-
ларни тўғри қўллашга бир қанча маслаҳатларни қарайлик. Агар цикл қисқа бўлса,
уни операторларнинг чизиқли кетма-кетлиги билан алмаштириш мумкин. Бунда
программа матни мураккаблашади, лекин ҳисоблаш вақти сезиларли қисқаради.
Бир-бирини ичида жойлашган циклларни ишлатишда энг кўп такрорланадига-
ни энг ички, энг қисқаси ташқи цикл сифатида ёзилгани маъқул. Қуйидаги иккита
циклни солиштирайлик:
84


М. Нишонов, mnishonov@gmail.com
cycle1: DO i = 1, 1000
cycle2: DO j = 1, 50
cycle3: DO k = 1, 10
s(i,j,k) = a(i) + b(j) + f(k,13)
END DO cycle3
END DO cycle2
END DO cycle1
ва
cycle3: DO i = 1, 10
cycle2: DO j = 1, 500
cycle1: DO k = 1, 10000
s(i,j,k) = a(i) + b(j) + f(k,13)
END DO cycle1
END DO cycle2
END DO cycle3
Биринчи программада 51001 марта, иккинчисида эса 5011 та ўзлаштириш амали
бажариляпти, яъни иккинчи программада ўзлаштириш тахминан 10 марта кам.
Албатта ҳар доим ҳам циклларни биз хохлагандек тўғри тартибда жойлаштириб
бўлавермайди.
Циклда ошкор ҳолда индексда ҳисоблашлар бажаришдан қочиш лозим. Маса-
лан,
cycle1: DO i = 1, 10000
s = b(2 * i)
END DO cycle1
Бу ерда 2 * i ҳисоблаш ўрнига цикл қадамини ишлатган маъқул:
cycle1: DO i = 2, 10000, 2
s = b(i)
END DO cycle1
Баъзида циклни ёйиш усулини қўллашади. Бу усулда цикл бажарилаётган вақтда
текширишлар миқдори камайтирилади. Масалан,
cycle1: DO i = 1, 200
s = b(i) / a(i)
END DO cycle1
цикл кам миқдорда такрорланишли бошқа цикл билан алмаштирилади:
cycle1: DO i = 2, 200, 2
s = b(i-1) / a(i-1)
s = b(i) / a(i)
END DO cycle1
85


4 Фортран арифметикаси
Бунда ёйилган циклни бир марта ҳисоблашда бошланғич циклдаги иккита ҳисоблаш
бажариляпти (ёйилма даражаси). Цикл итерациялари миқдори ёйилма даражасига
қолдиқсиз бўлиниши лозим.
Бошқа усуллардан бири циклларни бирлаштиришдир. Ўзаро кетма-кет жойла-
шган цикллар:
cycle1: DO i = 1, n
w = c(i) + COS(alfa * FLOAT(i))
END DO cycle1
cycle2: DO i = 1, n
h = e(i) - d(i)
END DO cycle2
битта циклга бирлаштирилиши мумкин:
cycle1: DO i = 1, n
w = c(i) + COS(alfa * FLOAT(i))
h = e(i) - d(i)
END DO cycle1
Циклларни бирлаштиришга тескари уларни ажратиш усули ҳисобланади. Бунда
cycle1: DO i = 1, n
IF(x > 0) THEN
s = ax(i) * by(i)
ELSE
s = ax(i) / by(i)
END IF
END DO cycle1
ўрнига
IF(x > 0) THEN
cycle1: DO i = 1, n
s = ax(i) * by(i)
END DO cycle1
ELSE
cycle2: DO i = 1, n
s = ax(i) / by(i)
END DO cycle2
END IF
циклни ишлатиш қулай. Бу ерда мантиқий текширишлар сони камайтириляпти. Яна
бошқа ҳол:
cycle1: DO i = 1, n
s = ax(i) * bx(i) / epsilon
END DO cycle1
86


М. Нишонов, mnishonov@gmail.com
циклда epsilon га бўлиш амали циклдан ташқарига чиқарилгани маъқул:
cycle1: DO i = 1, n
s = ax(i) * bx(i)
END DO cycle1
s = s / epsilon
Бунда цикл ичида бажарилаётган арифметик амаллар миқдори камайтириляпти.
Бу ерда epsilon ўзгарувчига бўлиш цикл инварианти дейилади. Инвариант код –
ифоданинг цикл ўзгарувчисига боғлиқ бўлмаган қисмидир. Баъзида инвариант
кодларни компилятор циклдан ташқарига олиб чиқади. Лекин, инвариант кодларни
олиб ташлаш программачи томонидан бажарилгани маъқулдир.
Мустақил ишлаш учун савол ва топшириқлар
1. Фортраннинг асосий ва қўшимча арифметик операторларини санаб беринг.
2. Операнд нима? Қандай амаллар мавжуд? Амалларни қайта юклаш нима?
3. Қандай ифодалар бир жинсли дейилади?
4. Қандай ифодалар аралаш дейилади? Уларни ҳисоблаш қандай амалга ошири-
лади?
5. Ифодада арифметик амалларни бажарилиш тартиби нима билан аниқланади?
6. Ўзлаштириш оператори ҳақида гапириб беринг.
7. Тур параметри (KIND) нима?
8. Фортранда бутун ва ҳақиқий сонлар моделини тавсифланг.
9. Фортраннинг бутун ва ҳақиқий сонлар моделлари учун параметрларни аниқлаб
берувчи ўрнатилган (стандарт) функциялари ҳақида гапириб беринг.
10. Ўзгарувчиларга қиймат ўзлаштириш учун қандай усуллар бор?
11. BLOCK DATA программа бирлиги ҳақида гапириб беринг.
12. Ҳисоблашларни оптимизациялаш учун нималарга эътибор бериш лозим?
13. ’Программа ёрдамида ҳисоблашда аниқликни йўқолиши’ мавзусида маъруза
тайёрланг.
14. Операторнинг ранги нима?
15. x
2
− 2 · a · x + e = 0 квадрат тенгламани энг юқори аниқликда ечиш учун
программа ёзинг. Бу ерда e– кичик сон.
16. Ўзингиз ёзмаган ихтиёрий программани олиб, унда ишлатилган конструкция-
ларни оптималлигини ва аниқликни йўқолишини таҳлил қилинг.
87


5 чи БОБ
Асосий алгоритмик конструкциялар
Аксар ялқовлар ўзлари учун фойдали бўлган ишларга дангасалик қилиб,
фойдасиз бўлган ишлар орқасинда умр ўтказарлар.
Абдулла Қодирий
Ифодаларнинг қийматларини ҳисоблаш ва қийматларни ўзлаштириш амаллари
ҳисоблаш учун мўлжалланган ихтиёрий программанинг асосини ташкил қилади.
Шу билан бирга оралиқ ҳисоблаш натижаларига қараб турли хилдаги бошқа амал-
ларни бажариш, масалан, бошқарувни программанинг бошқа қисмига узатиш ёки
программа ишини тамомлаш зарурати туғилиши мумкин. Программанинг айни бир
қисми ўзгарувчиларнинг турли қийматлари учун бир неча бор қайта бажарилиши
мумкин. Бундай ҳолатларни амалга ошириш учун программалаш тилида оператор-
ларни такрор ёзмасдан уларга мурожаат қилиш имкониятлари мавжуд бўлиши шарт.
Фортранда бундай амаллар бошқарув конструкциялар ёрдамида бажарилади.
Бошқарув конструкциялар асосан сарлавҳа-оператор ва тамомлаш оператори-
дан иборат қисмдан ташкил топади. Сарлавҳа ва тамомлаш операторлари орасида
оралиқ операторлар жойлашган бўлиши мумкин. Бошқарувчи қисм ичида жойлаш-
ган операторларга шу қисм сарлавҳаси орқали кириш билан мурожаат қилинади.
Бошқарувчи қисмлар бир-бирининг ичида жойлашган бўлиши мумкин.
5.1 Тармоқланиш
Программани ёки унинг қандайдир қисмини бир нечта қисмга мантиқий ажра-
тиш учун IF оператори, IF...END IF ва SELECT(CASE) конструкциялар ишлатилади.
IF оператори шарт бўйича бир дона амални бажаришдан иборат энг содда
тармоқланишни амалга ошириш учун қўлланилади. У қуйидаги кўринишда ёзилади:
IF(скаляр_мантиқий_ифода) амал
Бу ерда амал – ихтиёрий бажарилувчи оператор. Ушбу оператор қавс ичидаги
скаляр_мантиқий_ифода ҳақиқат бўлганда бажарилади. Масалан,
88


М. Нишонов, mnishonov@gmail.com
IF(son .LT. 0) son = -son
IF(bayroqcha) GO TO 999
IF(shart. OR. b .GT. a .AND. c .LT. d) natija(b,a) = -v(a,b) / c * d
IF оператори ўтиш оператори GO TO метка билан ишлатилганда ўта самарадордир.
Бу оператор асосан шарт бўйича ва бир дона ўзлаштириш бажарилганда қўлланилади.
Мисол:
PROGRAM shart
PARAMETER (i=5)
WRITE(*,*) ’Сон қийматини топинг: i =’
READ(*,*) j
IF(i.EQ.j) WRITE(*,*) ’Тўғри қийматни топдингиз!’
IF(i.LT.j) WRITE(*,*) ’Нотўғри! i кичикроқ.’
IF(i.GT.j) WRITE(*,*) ’Нотўғри! i каттароқ.’
END PROGRAM shart
Агар шарт бўйича бир нечта амал бажарилиши зарур бўлса, IF...THEN конструкция
қўлланилади. У қуйидагича ёзилади:
[номи:] IF (скаляр_мантиқий_ифода) THEN
амаллар_блоки
END IF
Масалан,
almashtirish: IF(x < y) THEN
t = x
x = y
y = t
END IF
Амаллар_блоки END операторидан бошқа ихтиёрий сондаги бажарилувчи оператор-
лардан иборат бўлиши мумкин. Ушбу блок скаляр_мантиқий_ифода ҳақиқат бўлганда
бажарилади, ёлғон бўлганда бажарилмайди. Шарт бўлмаган номи (одатда програм-
мада ёзилиши шарт бўлмаган элементлар квадрат қавс ичида кўрсатилади) ихтиёрий
бошқарувчи конструкцияга берилиши мумкин ва Фортранда номларга таалуқли қои-
далар асосида ёзилиши керак. Бошқарувчи конструкцияларни номлаш бир-бирини
ичида жойлашган бир нечта бошқарувчи конструкциялар ҳолида жуда фойдали.
Мантиқий шарт ёлғон бўлганда бажарилиши зарур бўлган амаллар бўлса IF...THEN
конструкция ELSE блоки билан кенгайтирилиши мумкин:
[номи:] IF (скаляр_мантиқий_ифода) THEN
амаллар_блоки
ELSE
бошқа_амаллар_блоки
END IF
89


5 Асосий алгоритмик конструкциялар
Бу
конструкцияда
қавс
ичидаги
мантиқий
ифода
ёлғон
бўлганда
бошқа_амаллар_блоки бажарилади, маслан:
almashtirish: IF(x < y) THEN
t = x
x = y
y = t
ELSE
t = -x
x = -y
y =
t
END IF
IF...THEN...ELSE конструкция юқорида келтирилган сонни топиш ҳақидаги про-
грамманинг имкониятларини кенгайтиради:
PROGRAM shart
PARAMETER (i=5)
WRITE(*, *) ’Сон қийматини топинг: i =’
READ(*, *) j
IF(i .EQ. j) WRITE(*, *) ’Тўғри топдингиз!’
IF(i .LT. j) THEN
WRITE(*, *) ’i кичикроқ.’
ELSE
WRITE(*, *) ’i каттароқ.’
END IF
END PROGRAM shart
IF...THEN...ELSE конструкция бир нечта амаллар блокини ўз ичига олиши мумкин.
Бу ҳолда ELSE IF...THEN оператор қўшилади:
[номи:] IF(скаляр_мантиқий_ифода) THEN
амаллар_блоки
ELSE IF(скаляр_мантиқий_ифода_1) THEN [номи]
бошқа_амаллар_блоки_1
ELSE IF(скаляр_мантиқий_ифода_2) THEN [номи]
бошқа_амаллар_блоки_2
.....................
ELSE [номи]
бошқа_амаллар_блоки
END IF [номи]
Бу конструкцияда скаляр_мантиқий_ифода ҳақиқат бўлгана амаллар_блоки бажари-
лади, акс ҳолда кейинги қавс ичидаги мантиқий ифодалар текширилади. Мантиқий
ифодалар ичида ҳақиқат қийматли ифода топилмагунча текшириш давом этади.
Бунда қиймати ҳақиқат бўлган мантиқий ифодадан кейин турган амаллар блоки
90


М. Нишонов, mnishonov@gmail.com
бажарилади. Агар бундай қийматли ифода топилмаса ELSE операторидан кейинги
амаллар бажарилади. Ушбу конструкцияда THEN, ELSE ва END IF операторлардан
кейин турган номи бошланишда берилган ном билан бир ҳил бўлиши шарт. Бо-
шқарувчи конструкция номланмаган бўлса улар ёзилмайди. ELSE оператори фақат
бир марта ишлатилиши ёки умуман ишлатилмаслиги мумкин. IF...THEN...ELSE IF
конструкцияга мисол:
PROGRAM shart
PARAMETER (i=5)
WRITE(*, *) ’Сон қийматини топинг: i =’
READ(*, *) j
IF(i .LT. j) THEN
WRITE(*,*) ’i кичикроқ.’
ELSE IF(i .GT. j) THEN
WRITE(*,*) ’i каттароқ.’
ELSE
WRITE(*,*) ’Тўғри топдингиз!’
END IF
END PROGRAM shart
Амаллар блоки меткалар ва ўтиш операторларини ўз ичига олган бўлиши мумкин.
Лекин IF...THEN...ELSE конструкциясининг ички блокларида жойлашган меткалар-
га ташқаридан ўтиш мумкин эмас. ELSE IF ва ELSE блоклардаги меткаларга ўтиш
умуман тақиқланади. Қуйидаги конструкция хато:
IF(t < 0) THEN
a = 1
GO TO 10
ELSE
10 a = 2
b = 3
END IF
Бундай ҳолларда бошқарув фақат тамомлаш операторигагина узатилиши мумкин:
IF(t < 0) THEN
a = 1
GO TO 10
ELSE
a = 2
b = 3
10 END IF
Ихтиёрий чуқурликдаги конструкцияларни ишлатиш мумкин:
IF(t < 0) THEN
91


5 Асосий алгоритмик конструкциялар
a = 12
IF(y /= 13) THEN
b = a + b
ELSE
b = c + b
END IF
ELSE
a = 23
IF(t > b) c = d + e
END IF
Операторларни қаватлаб жойлаштириш программани ўқиш учун қулай. Жуда кўп
шартлар қатнашган ҳолда уларни номлаш мақсадга мувофиқдир.
Яна бир бошқарувчи конструкция SELECT оператори билан ташкил қилиниши
мумкин. Бу ҳолда IF операторидан фарқ бир нечта маълум тўпламлардан иборат
бир дона ифода қиймати текширилади. У қуйидагича ёзилади:
[номи:] SELECT CASE(ифода)
[CASE танлаш_1 [номи]
1_блок]
.....................
[CASE танлаш_n [номи]
n_блок]
END SELECT [номи]
Ном бериш шарт эмас, лекин, у берилган бўлса тамомлаш операторида уни ёзиш шарт.
Оралиқ операторларда номни кўрсатиш шарт эмас. Агар у оралиқ опраторларда
ёзилган бўлса сарлавҳадаги ном билан бир хил бўлиши лозим. Сарлавҳадаги SELECT
операторидан кейин турган CASE операторида қавс ичидаги ифода бутун, мантиқий
ва матн турдаги скаляр қийматли ифода бўлиши керак. Танлаш_1 – сарлавҳадаги
ифода билан бир хил турдаги ифода бўлиши керак. Тур синфи сон ва мантиқий
турдаги ифодалар ва танловчилар ҳолида фарқланиши мумкин. Лекин матн тур
учун улар мос тушиши лозим. Танлаш қавс ичида жойлашган қийматлар ва ўзаро
кесишмайдиган оралиқлар бўлиши мумкин. Масалан,
CASE(3, 20, 13:25, 111, 1001:1009)
Энг содда танлаш - скаляр қийматни ўзлаштириш ифодасидир, масалан,
CASE(1)
Сон ёки матн турдаги ифодалар учун оралиқларни қуйи_чегара:юқори_чегара кўри-
нишда аниқлаш мумкин:
CASE(1:9)
CASE(a:z)
92


М. Нишонов, mnishonov@gmail.com
Оралиқда чегаралардан бири тушириб қолдирилиши мумкин. Бу ҳолда оралиқ
тенгсизлик маъносига эга бўлиб қолади. Масалан, (:-1) ёзув бутун турдаги ифо-
далар учун ’0 дан кичик барча қийматлар’ маъносини беради. Қуйидаги мисолда
SELECT конструкцияси ёрдамида бутун соннинг ишорасини аниқловчи функцияни
моделлаштириш келтирилган:
INTEGER FUNCTION son_ishorasi(son)
IMPLICIT NONE
INTEGER, INTENT(IN) :: son
ishora: SELECT CASE(son)
CASE(:-1)
son_ishorasi = -1
CASE(0)
son_ishorasi =
0
CASE(1:)
son_ishorasi =
1
END SELECT ishora
END FUNCTION son_ishorasi
Танлашлар оралиғи ўзаро кесишмаслиги керак. Танлашларнинг бирортаси ҳам
бажарилмаса бошқарув END SELECT дан кейинги операторига узатилади. Бундай
ҳолда DEFAULT танлашни қўллаш қулай. Конструкцияда бир дона CASE DEFAULT
ишлатилиши мумкин. Қуйидаги мисолда матнли ифоданинг турини синфлагра
ажратиш қаралган:
tur: SELECT CASE(harf)
CASE DEFAULT
real_tur = .TRUE.
CASE ’c’
complex_tur = .TRUE.
CASE (i:n)
butun_tur = .TRUE.
END SELECT tur
Меткалар бўйича ўтишларга фақат айни бир блок ичидагина рухсат берилади; CASE
операторига ўтиш рухсат берилмайди; END SELECT операторига энг охирги блокдан
ўтиш мумкин.
5.2 Тўхташ оператори
Программанинг бажарилишини ихтиёрий жойда тўхтатиш мумкин. Бунинг
учун STOP оператори ишлатилади. Бу орератор программанинг ихтиёрий қисмида
жойлашган, меткага эга бўлиши ва шарт операторининг бир қисми бўлиши мумкин:
IF(i .GT. 100) STOP
93


5 Асосий алгоритмик конструкциялар
STOP оператори ахборот билан таъминланган бўлиши мумкин:
IF(input .LT. malumot_uzunligi) STOP ’Маълумот кутилмаган узунликда!’
STOP ’ROUTE қисм программадан чиқиш’
STOP 123
Сон қийматини топиш ҳақидаги программани қуйидагича ташкил қилиш мумкин:
PROGRAM shart
PARAMETER(i=5)
WRITE(*,*) ’Сон қийматини топинг: i=’
READ(*,*) j
IF(i .EQ. j) STOP ’Тўғри топдингиз!’
WRITE(*,*) ’Нотўғри қиймат!’
END PROGRAM shart
5.3 Ўтиш оператори
Ўтиш оператори барча программалаш тилларида баҳсларга сабаб бўлади. Ўтиш
операторини кўп миқдорда қўллаш ҳатто содда программани ҳам ўқишни оғирлаш-
тиради, лекин, бошқа томондан, баъзида ўтиш операторини ишлатмасликни иложи
йўқ.
Ўтиш оператори қуйидагича ёзилади:
GO TO метка
Метка программанинг бирор бажарилувчи операторини кўрсатиши зарур ва ушбу
оператор ўтиш манзили дейилади:
x = y + z
GO TO 15
c = b + a
3 d = e * f
15 WRITE(*,*) x, c, d
Бу программада шартсиз ўтишга мисол келтирилган: x = y + z оператордан кейин
бошқарув WRITE(*,*) x, c, d операторга узатилади. Бунда d = e * f операторда
бажарилиш учун имкон мавжуд. Чунки у метка билан белгиланган. Программанинг
қаеридандир унга ўтиш амали бажарилиши мумкин. Лекин c = b + a операторда
бажарилиш учун ҳеч қандай имконият йўқ, бу ҳол йўқотилган код деб аталади ва
ёмон ёзилган программага аниқ мисол бўла олади. Сон қийматини топиш ҳақидаги
программани ўтиш оператори қатнашиши билан ташкил қилишни қараймиз:
PROGRAM shart
PARAMETER(i=5)
WRITE(*,*) ’Сон қийматини топинг: i=’
94


М. Нишонов, mnishonov@gmail.com
READ(*,*) j
IF(i .EQ. j) GO TO 111
WRITE(*,*) ’Нотўғри қиймат!’
GO TO 112
111
WRITE(*,*) ’Тўғри топдингиз!’
112
CONTINUE
END PROGRAM shart
5.4 Циклларни ташкил қилиш
Программалашда айни бир амални қайта-қайта бажаришга талаб пайдо бўлади.
Масалан, тўққизта элементли массив учун 1/n кўринишдаги қийматларни ҳисоблаш
учун тўққизта операторни қайта ёзиш керак:
r(1) = 1.; r(2) = 1./2.; ...; r(9) = 1./9.
Яқинлашишларни бажаришда ҳам айни бир хил кўринишдаги операторлар тўпла-
мини бир неча бор такроран ишлатишга тўғри келади. Масалан, юқоридаги массив
элементларининг йиғиндисини ҳисоблаш учун саккиз марта қўшиш амалини бажа-
риш зарур:
s = r(1); s = s + r(2); s = s + r(3); ... ; s = s + r(9)
Бундай такрорланишлардан операторлар циклини ташкил этиш билан қутилиш
мумкин:
i = 0; s = 0.
99
i = i + 1
r(i) = 1. / i
s = s + r(i)
IF(i .LT. 9) GO TO 99
Лекин, циклларни қўлда сунъий ташкил этиш билан осонгина ҳатога йўл қўйиш
мумкин, масалан, меткани нотўғри кўрсатиш ёки қадамни ошириш операторини
ёзмаслик ва ҳ.к. Фортранда циклларни ташкил қилиш учун стандарт DO оператор
қўлланилади. Юқоридаги иккита масалани бу оператор билан ҳал этиш жуда содда
ташкил қилинади:
s = 0.
DO i = 1, 9
r(i) = 1. / i
s = s + r(i)
END DO
DO операторининг умумий кўриниши қуйидагича ёзилади:
95


5 Асосий алгоритмик конструкциялар
[номи:] DO [цикл рўйҳати]
амаллар_блоки
END DO [номи]
Цикл номи шарт бўлмаган элемен ҳисобланади, лекин у берилган бўлса, циклни
тамомлаш операторида кўрсатилиши шарт. Цикл номи ва DO операторидан ташқа-
ри, сарлавҳада шарт бўлмаган цикл_рўйҳати ёзилган бўлиши мумкин. Унда цикл
қадамлари миқдори кўрсатилган бўлиши мумкин. Агар цикл_рўйҳати ёзилмаган
бўлса ушбу цикл чексиз бўлиб қолади! Чексиз циклдан чиқиш учун EXIT оператори
қўлланилади. Бу чексиз циклни тамомлашнинг ягона йўлидир:
i = 0
DO
i = i + 1
...
IF(i .GT. 101) EXIT
END Do
Сон қийматини топиш ҳақидаги масалани цикл орқали қандай ташкил қилиш мум-
кинлигини қуйидаги мисолда қарайлик:
PROGRAM shart_do
PARAMETER(i=5)
DO
WRITE(*,*) ’Сон қийматини топинг: i=’
READ(*,*) j
IF(i .LT. j) THEN
WRITE(*,*) ’Нотўғри! i кичикроқ.’
ELSE IF(i .GT. j) THEN
WRITE(*,*) ’Нотўғри! i каттароқ.’
ELSE
WRITE(*,*) ’Тўғри топдингиз!’
EXIT
END IF
END DO
END PROGRAM shart_do
Умумий ҳолда EXIT оператори қуйидаги кўринишда ёзилади:
EXIT [ном]
Бу ерда ном DO конструкция ичида жойлашган қайси қисмдан чиқиш зарурлигини
кўрсатади. Ном кўрсатилмаган бўлса, бошқарув энг яқин жойлашган END DO га
узатилади.
DO конструкциясида ишлатиладиган яна бир оператор номланган ёки унга энг
яқин END DO операторга бошқарувни беради:
96


М. Нишонов, mnishonov@gmail.com
CYCLE [ном]
Бу операторнинг таъсири циклдаги навбатдаги қадамга ўтишга тенг кучли. Агар
цикл ўзгарувчисининг чегаравий қийматига эришилмаган бўлса, цикл ўзгарувчининг
кейинги қийматидан бошлаб давом этади.
Умумий ҳолда, цикл_рўйҳати қуйидаги кўринишда ёзилади:
ўзгарувчи = бошланғич_қиймат, охирги_қиймат [,қадам]
Бу ерда ўзгарувчи – бутун турдаги ўзгарувчи. Биринчи қадамда у бошланғич_қиймат
қабул қилади. Кейинги қадамда унинг қиймати циклнинг қадамига ошади. Унинг энг
катта қиймати охирги_қийматдан катта бўла олмайди. Агар қадам ёзилмаган бўлса,
қадамнинг қиймати бирга тенг деб фараз қилинади. Шундай қилиб амаллар_блоки
цикл ўзгарувчиси қабул қиладиган қийматлар миқдорига тенг марта такроран бажа-
рилади. Агар охирги_қийматнинг қиймати бошланғич_қийматдан кичик бўлса, цикл
ўзгарувчисининг қиймати бирга тенг деб қабул қилинади. Лекин амаллар_блоки
бирор марта ҳам бажарилмайди ва бошқарув END DO дан кейин турган операторга
узатилади.
Сон қийматини топиш ҳақидаги программада уринишлар сонини цикл рўйҳа-
тини қўшиш билан камайтиришимиз мумкин:
PROGRAM ruyhat_do
IMPLICIT NONE
INTEGER, PARAMETER :: i = 5
INTEGER j, k
DO k = 1, 9
WRITE(*,*) ’Сон қийматини топинг: i=’
READ(*,*) j
IF(i LT. j) THEN
WRITE(*,*) ’Нотўғри қиймат! i кичикроқ.’
ELSE IF(i .GT. j) THEN
WRITE(*,*) ’Нотўғри қиймат! i каттароқ.’
ELSE
WRITE(*,*) ’Тўғри қийматни топдингиз!’
EXIT
END IF
END DO
END PROGRAM ruyhat_do
Цикл сарлавҳасидаги барча ўзгарувчилар бутун турга эга, ва уларнинг ҳар бири, агар
у ҳарфли доимий орқали берилмаган бўлса, DO конструкциясининг ичида ҳам ва унинг
ташқарисида ҳам ишлатилиши мумкин. Агар бажарилиш вақтида охирги_қийматнинг
қиймати манфий ёки нол бўлиб қолса цикл ўзгарувчисининг қиймати бирга тенг деб
қабул қилинади ва циклнинг бажарилиши тугатилади. Циклнинг ўзгариш қадамининг
қийматига билмасдан нол қиймат бериш циклни чексиз давом этишига сабаб бўлади.
Шунинг учун DO оператори билан ишлашда программачидан эҳтиёткорлик талаб
97


5 Асосий алгоритмик конструкциялар
қилинади. Цикл бажарилгач кутилган натижани олишнинг энг ишончли усули,
цикл ўзгарувчилари-параметрларни циклдан ташқарида ишлатмасликдир. Цикл
ўзгарувчисининг қийматлари оралиғи ва ўзгариш қадамини ҳарфли доимийлар билан
беришнинг доим ҳам иложиси йўқ.
DO конструкцияси бошқача кўринишда ҳам ёзилиши мумкин:
DO метка цикл_рўйҳати
амаллар_блоки
метка END DO
ёки
DO метка цикл_рўйҳати
амаллар_блоки
метка CONTINUE
Масалан,
DO 10 i = 1, 33, 2
a(i) = b(i) + b(i+1)
10 END DO
ёки
DO 10 i = 1, 33, 2
a(i) = b(i) + b(i+1)
10 CONTINUE
CONTINUE оператори – Фортранда ’бўш оператор’ деб аталади. У бошқарувни ўзидан
кейинги операторга узатади. Бу оператор цикл операторидан бошқа кўп жойларда
ишлатилиши мумкин.
Циклларни бир-бирини ичида жойлаштириш ҳам мумкин. Бунда ички цикл
тўла ташқи цикл ичида тамомланиши керак:
DO i = 1, n
a(i) = 0.
DO j = 1, m
a(i) = a(i) + b(j)
END DO
END DO
Меткалар ишлатилганда циклларнинг ҳар бири ўзининг меткали тамомлаш операто-
рига эга бўлиши зарур:
DO 20 i = 1, n
DO 10 j = 1, m
..............
10 CONTINUE
20 CONTINUE
98


М. Нишонов, mnishonov@gmail.com
Цикл операторининг шарт бўйича чиқиш шакли қуйидаги кўринишда ёзилади:
DO метка WHILE (скаляр_мантиқий_ифода)
............
метка CONTINUE
Сон қийматини топиш ҳақидаги программа DO...WHILE конструкция орқали ёзилса
қуйидаги кўринишда бўлиши мумкин:
PROGRAM dowhile
IMPLICIT NONE
INTEGER, PARAMETER :: i = 5
INTEGER j, k
k = 1
DO 123 WHILE(k < 11)
WRITE(*,*) ’Сон қийматини топинг: i=’
READ(*,*) j
IF(i .LT. j) THEN
WRITE(*,*) ’Нотўғри қиймат! i кичикроқ.’
ELSE IF(i .GT. j) THEN
WRITE(*,*) ’Нотўғри қиймат! i каттароқ.’
ELSE
STOP ’Тўғри топдингиз!’
END IF
k = k +1
123 CONTINUE
WRITE(*,*) ’Балки сизга омад кейинги сафар кулиб боқар!’
END PROGRAM dowhile
Маълумотни киритиш-чиқариш операторларида цикл операторининг ноошкор
кўриниши ишлатилади:
(do_рўйҳат, do_ўзгарувчи = ифода1, ифода2 [, ифода3])
Масалан,
WRITE(*,*) ((a(i,j), i = 1,7), j = 1,5)
Бу ерда do_рўйҳатга массив элементлари, структураларнинг скаляр қисмлари ва
ноошкор цикллар кириши мумкин, do_ўзгарувчи бутун турдаги номланган скаляр
бўлиши, кўриниш соҳаси мос цикл миқёсида чегараланган бўлиши зарур.
Яна бир мисол:
DATA((b(j,k), j = 1,9), k=j,9)
99


5 Асосий алгоритмик конструкциялар
5.5 Бошқарувчи конструкцияларни аралаштириш ва
ўтиш опероторлари
Турли хилдаги бошқарувчи конструкцияларни бир-бирини ичига аралаштириб
ишлатиш мумкин. Бунда ягона қоида - бошқарувчи конструкция уни ўзи ичига олган
қисм ичида тўла жойлашган бўлиши керак, масалан:
DO i = 1, 20
a(i) = i*i
IF(a(i) .GT. 200.) THEN
a(i) = a(i)/ 200. + b1
ELSE
a(i) = a(i) * 1.358 + c2
END IF
b(i) = d(i) - e(i) * a(i)
END DO
ёки
IF(a .EQ. b) THEN
s = 0.
DO i = 1, n
s = s + a(i) * b(i)
END DO
ELSE
p = 1.
DO i = 1, n
p = p * a(i) * b(i)
END DO
END IF
Лекин қуйидаги программа хато:
IF(t .NE. r) THEN
DO j = 2, 9
h(j) = h(j) - h(j-1)
END IF
END DO
Бу ерда END IF оператор END DO дан кейин жойлашган бўлиши керак эди.
Бошқарувчи конструкциялардан ва бошқарувчи конструкцияларга бошқарувни
ўзатиш учта асосий қоидага бўйсунади:
• бошқарувчи конструкциядан ташқарига ўтишларга рухсат берилади;
• бошқарувчи конструкция ичида жойлашган операторларга ташқаридан ўтиш
тақиқланади;
100


М. Нишонов, mnishonov@gmail.com
• айни бир қисм ичида ихтиёрий операторга ва конструкциянинг тамомловчи
операторига ўтишларга рухсат берилади.
Мисоллар:
GO TO 10
! хато: бошқарувчи конструкция ичига ўтиш
2
c = a + b
IF(g .GE. -2.) THEN
GO TO 2
! тўғри: ташқи операторга ўтиш
10
f = v * d
GO TO 20
! хато: ELSE операторига ўтиш
GO TO 10
! тўғри: айни бир қисмдаги операторга ўтиш
20
ELSE
GO TO 10
! хато: бошқа қисмдаги операторга ўтиш
GO TO 3
! тўғри: тамомловчи операторга ўтиш
GO TO 4
! тўғри: ташқи операторга ўтиш
3
END IF
4
g = b + c
5.6 Алгоритм ва программа
Бизга керак бўлган натижани олишимиз учун программа компьютерда қан-
дайдир амаллар кетма-кетлигини бажаради. Бирор масалани ечиш учун программа
ёзишдан аввал унинг
1
моҳиятини аниқлаш ва бажарилиши керак бўлган амалларни
тавсифлаб олиш зарур. Бошқача айтганда масалани ечиш учун алгоритм тузиш
керак бўлади.
Содда мисол қалайлик. y = x · sin(x) фнкциянинг x ∈ [a, b] да 4x қадам билан
қийматлари жадвалини тузиш талаб қилинган бўлсин. Ушбу масалани ҳал этиш
учун қуйидаги амаллар бажарилиши зарур:
1. Алгоритм бошланиши.
2. x ўзгарадиган оралиқ чегаралари a ва b ҳамда қадам 4x қийматини киритиш.
3. x нинг бошланғич қийматини киритиш: x = a
4. x ≤ b бўлганда:
y функциянинг x нуқтадаги қийматини ҳисоблаш: y = x · sin(x);
x ва y ларнинг қийматларини печатга чиқариш;
берилган оралиқдаги кейинги нуқтага ўтиш: x = x + 4x;
цикл охири.
5. Тамом.
1
масаланинг
101


5 Асосий алгоритмик конструкциялар
Алгоритмнинг тўртинчи қадами y функциянинг турли x лардаги қийматларини
ҳисоблаш учун такрорий ҳисоблашларни назарда тутади. Бир ҳил турдаги амалларни
такроран бажариш цикл деб аталади. Келтирилган цикл x нинг қиймати берилган
оралиқнинг ўнг чегараси b дан катта бўлиб қолганда тугайди.
Юқорида келтирилган алгоритмдаги амалларни бажарувчи программа ёзиш
учун алгоритмнинг ҳар бир қадамини программалаш тилига таржима қилиш керак.
Агар ушбу алгоритмга мос программа ёзсак қуйидагини оламиз:
READ*,a,b,dx
! Алгоритмнинг 2 чи қадамини бажаряпмиз
x=a
! Алгоритмнинг 3 чи қадамини бажаряпмиз
DO WHILE(x<=b) ! Алгоритмнинг 4 чи қадами, цикл бошланиши
y=x*SIN(x)
! у функцияниг х даги қийматини ҳисоблаш
PRINT*,x,y
! у ва х қийматларини печатга чиқариш
x=x+dx
! х нинг кейинги қиймати
END DO
! Цикл охири
END
! Программани тамомлаш
Программа тўғри ёзилганига қарамасдан у билан ишлаш жуда ноқулай. Фараз
қилайлик, сиз программани ишга туширдингиз. У ҳолда сизни олдингизда қора
экран пайдо бўлади. Сиз қандайдир 3 та сон киритишингиз ва Enter тугмасини
босишингиз кераклигини ўйлаб топишингиз керак. Яна фараз қилайлик, сиз ўша 3
та сонни 0, 1, 0.1 қийматлар сифатида киритдингиз ва Enter тугмасини босдингиз
ҳам дейлик. Натижада сизнинг олдингизда сонлардан иборат иккита устун пайдо
бўлади ва яна сиз бу сонлар нимани билдиришини топиб олишингиз керак бўлади.
Ушбу программани бир ҳафтадан кейин ишлатсангиз, сиз, албатта, ҳеч нарсани
эслай олмайсиз.
Шу сабабли биз программага алгоритмда назарга олинмаган ҳусусиятларни
беришимиз зарур. Яъни, зарур бўлган маълумотларни киритиш учун савол-жавоб
(диалог) ташкил қилишимиз, печатга чиқарилаётган қийматлар қайси объектга теги-
шли эканлигини изоҳлашимиз зарур. Бошқача айтганда инсон ва программа орасида
интерфейс яратишимиз керак. Шу билан бирга маълумотлар тўғри киритилаётга-
нини назорат қилиш керак: оралиқнинг чап чегараси ўнг чегарадан кичик, қадам
нолдан катта бўлсин (акс ҳолда чексиз тугамайдиган циклга эга бўлишимиз мумкин,
масалан a < b ва 4x ≤ 0). Бундай текширишларни киритиб программани ишончли
ишлашини таъминлаган бўламиз.
Бундан ташқари программани кўринишига ҳам талаблар қўйиш мумкин: про-
граммага ном бериш, ўзгарувчиларнинг турини эълон қилиш, тўлиқ изоҳлар ёзиш
каби. Фортран операторларининг, ички функция ва процедураларнинг номларини
катта, изоҳларни кичик ҳарфлар билан ёзиш сингари қоидаларни ишлатиш жуда
қулай. Программа қисмларини, масалан DO WHILE ... END DO ни ёзишда рельеф
қоидасини ишлатиш программани ўқишни осонлаштиради. Рельеф қоидасининг маъ-
носи шундаки, DO WHILE ва END DO лар матнда бир хил четки сатҳда ёзилади. Улар
орасидаги операторлар четки томондан бир нечта бўш жой ташлаб жойлаштирилади.
Вергул ёки бошқа ажратиш учун ишлатилган белгидан кейин бўш жой ташлаб
102


М. Нишонов, mnishonov@gmail.com
ёзиш ҳам фойдали. Шундай қилиб, бир қанча ўзгартиришлардан сўнг қуйидаги
программани ёзиш мумкин:
PROGRAM fxy
! Программа номи
REAL a, b, dx, x, y
! Ўзгарувчиларнинг турини эълон қилиш
REAL :: dxmin = 1.0E-4
! Фойдаланувчи учун изоҳларни экранга чиқариш
PRINT*, ’--------------------------------------------------’
PRINT*, ’y = x * sin(x) нинг a<=x<=b оралиқ учун қийматлари’
PRINT*, ’--------------------------------------------------’
PRINT*, ’Оралиқ чегаралари ва ҳисоблаш қадамини киритинг:’
PRINT*, ’Чап чегара:’
READ*, a
PRINT*, ’Ўнг чегара:’
READ*, b
PRINT*, ’Ҳисоблаш қадами:’
READ*, dx
IF(dx < dxmin) STOP ’Қадам қиймати нотўғри!’
x = a
DO WHILE(x <= b)
y = x * SIN(x)
PRINT*,’x=’,x, ’y=’,y
x = x + dx
END DO
END PROGRAM fxy
Фараз қилайлик, a = 0.1, b = 0.3 ва dx = 0.1 бўлсин. У ҳолда x нинг қиймати
0.1, 0.2 ва 0.3 бўлганда қуйидаги натижа печатга чиқарилади:
x=
0.100000001
y=
9.98334214E-03
x=
0.200000003
y=
3.97338681E-02
x=
0.300000012
y=
8.86560678E-02
Бу ерда экранга чиқарилган ҳар бир сатр биз ёзган программада алоҳида
ёзувдир.
Чиқарилган натижа тушунарли, лекин унинг шакли мураккаб. Натижа кўри-
нишини форматли чиқаришни ишлатиб яхшилаш мумкин. Яъни, чиқарилаётган
маълумот шаклини ўзгартириш қоидаларини қўллаш мақсадга мувофиқ. Бундай
қоидалар ?? да қараб чиқилган формат дескрипторлари ёрдамида амалга оширилади.
Қўштирноқ ичида чиқарилаётган маълумотлар учун A дескрипторини ишлатамиз.
x нинг қийматлари учун эса 5 та жойдан иборат соҳа танлаб вергулдан кейинги
сонларга 2 та жой ажратиб чиқарамиз. Бунинг учун бизга F5.2 дескриптори керак
бўлади. y нинг қийматлари учун F7.4 дескрипторни ишлатамиз. У ҳолда x ва y
ларни печатга чиқариш операторининг кўриниши қуйидагича бўлади:
PRINT’(1x,A,F5.2,A,2x,F7.4)’,’x=’,x,’y=’,y
103


5 Асосий алгоритмик конструкциялар
Энди юқоридаги натижанинг айнан ўша қийматлар учун кўриниши қуйидагича
бўлади:
x= 0.10
y= 0.0100
x= 0.20
y= 0.0397
x= 0.30
y= 0.0887
Форматлаш дескрипторларини ишлатганда PRINT операторида қавс ичидаги
1x ёзувга эътибор беринг. У экранга чиқаришда маълумотни чиқаришдан олдин чап
четдан битта бўш жой ташлаш зарурлигини буюради. Яъни маълумот экраннинг
чап четига ёпишиб эмас битта бўш жойдан кейин чиқарилишини таминлайди.
5.7 Алгоритмларнинг негиз структуралари
Программани бирор программалаш тилида ёзиш учун дастлаб алгоритм ярати-
лиши зарур. Алгоритмга эга бўлиб сиз масалани қандай ечишни биласиз, ёзилиши
керак бўлган программа кўринишини олдиндан аниқлаб оласиз.
Алгоритмни яратишда чизиқли схемалар, блок-схемалар ва псевдокод қўлла-
нилиши мумкин. Чизиқли схема усули аввалги
5.6
параграфда ишлатилди. Келгусида
кўпинча шу усулни ишлатамиз. Бунда рельеф қоидасини қўллаймиз, схемаларда
шарт бўлмаган элементларни квадрат қавслар ичига ёзамиз, тик чизиқ билан ёки
шартни назарда тутамиз.
Ҳар қандай алгоритм учта негиз структура орқали яратилиши мумкин:
• операторлар ва тузилмалар блоки
• тармоқланишлар блоки
• цикл блоки
5.8 Операторлар ва тузилмалар блоки
Операторлар ва тузилмалар блоки (ОТБ) - битта ёки бир нечта содда ёки му-
раккаб амалларни бажариш учун блок. ОТБ тармоқланиш ва циклларни ўз ичига
олган бўлиши мумкин. Содда амаллар қиймат бериш, натижани экранга чиқариш
ёки бошланғич маълумотни киритиш, процедура қисм программасини чақириш каби
амалларни билдириши мумкин. Тузилмалар бир нечта операторлардан ташкил топ-
ган бўлиши ва қандайдир бошқарув амалларини бажаришда ишлатилади. Масалан,
циклларни бажарувчи DO ... END DO тузилма иккита DO ва END DO операторлардан
иборат.
5.9 Тармоқланиш
Тармоқланиш - бирор шартга кўра бўлиши мумкин бўлган бир нечта йўнали-
шлардан бирини танлаш.
104


М. Нишонов, mnishonov@gmail.com
Қуйидаги турдаги тармоқланишлаш бўлиши мумкин:
• агар - у ҳолда;
• агар - у ҳолда - бўлмаса;
• агар - у ҳолда - бўлмаса - агар;
• калит бўйича танлаш.
Дастлабки иккита тармоқланишни қарайлик. агар - у ҳолда ва агар - у
ҳолда - бўлмаса турдаги тармоқланишларда шарт амалини ёзиш учун мантиқий
ифода (МИ) қўлланилади. Мантиқий ифоданининг қиймати ҳақиқат (Ҳ) ёки ёлғон
(Ё) бўлиши мумкин. Тармоқланишни қуйидаги график орқали кўрсатиш мумкин
(1-расм)
Рис. 5.1: Тармоқланиш: а- агар - у ҳолда турдаги тармоқланиш; б- агар - у ҳолда
- бўлмаса турдаги тармоқланиш
агар - у ҳолда турдаги тармоқланиш қуйидаги тартибда ишлайди:
• МИ қиймати ҳисобланади;
• агар у ҳақиқат бўлса, у ҳолда ОТБ1 бажарилади;
• агар у ёлғон бўлса, бошқарув ОТБ2 га узатилади.
агар - у ҳолда турдаги тармоқланишни алгоритмнинг чизиқли схемасидаги
кўриниши қуйидагича бўлади:
105


5 Асосий алгоритмик конструкциялар
X
o
Агар МИ ҳақиқат бўлса, у ҳолда
ОТБ1 [бажарилсин]
[X
o
] тамом.
Фортранда бундай тармоқланишни қуйидагича ёзиш мумкин:
IF (МИ) THEN
ОТБ1
END IF
END IF оператор биргаликда қўшиб ENDIF каби ёзилиши мумкин. Агар ОТБ1 битта
оператордан иборат бўлса, программа кўриниши қуйидагича бўлади:
IF (МИ) оператор
агар - у ҳолда - бўлмаса турдаги тармоқланиш қуйидагича ишлайди:
• МИ қиймати ҳисобланади;
• агар у ҳақиқат бўлса, у ҳолда ОТБ1 бажарилади;
• агар у ёлғон бўлса, ОТБ2 ҳисобланади;
• кейин бошқарув ОТБ3 га узатилади..
агар - у ҳолда - бўлмаса турдаги тармоқланиш алгоритми чизиқли схемада
қуйидаги кўринишда ёзилади:
X
o
Агар МИ ҳақиқат бўлса, у ҳолда
ОТБ1 [бажарилсин]
ёлғон бўлса,
ОТБ2 [бажарилсин]
[X
o
] тамом.
агар - у ҳолда - бўлмаса турдаги тармоқланишнинг Фортрандаги програм-
маси қуйидагича бўлади:
IF ( МИ ) THEN
ОТБ1
ELSE
ОТБ2
END IF
МИ ни ёзиш учун мантиқий амаллар ва муносабат амаллари қўлланилади. Шу-
нингдек МИ да арифметик ва белгили амаллар ҳам иштирок этиши мумкин. Қуйидаги
жадвалда мантиқий ва муносабат амаллари учун ишлатиладиган операторларни
уларнинг муҳимлик даражаси пасайиб бориш тартибида келдирилган. Муносабат
операторлари икки хил кўринишда ёзилиши мумкинлигига эътибор беринг. Таъкид-
лаш лозимки, тенглик белгиси учун .EQ. шаклни ишлатмасангиз у иккита тенглик
белгиси (==) ёрдамида ёзилиши лозим.
106


М. Нишонов, mnishonov@gmail.com
Таблица 5.1: Мантиқий ва муносабат амаллари
Амаллар
Фортранда ёзилиши
Амаллар тури
=, 6=,>, <, ≥, ≤
.EQ., .NE., .GT., .LT., .GE., .LE.
Муносабат
==, /=, <, >, >=, <=
ЭМАС, ВА, ЁКИ
.NOT., .AND., .OR.
Мантиқий
агар - у ҳолда турдаги тармоқланишга мисол. Берилган a, b, c сонлардан
қайси бири энг кичик эканлигини топинг.
Алгоритм:
1
o
. Бошланиши.
2
o
. Учта сондан энг кичигини топиб натижани m га ўзлаштириш.
3
o
. Агар a қиймати m га тенг бўлса, a сони кўринишдаги маълумотни печатга
чиқариш.
4
o
. Агар b қиймати m га тенг бўлса, b сони кўринишдаги маълумотни печатга
чиқариш.
5
o
. Агар c қиймати m га тенг бўлса, c сони кўринишдаги маълумотни печатга
чиқариш.
6
o
. Тамом.
Ушбу алгоритм қиймати энг кичик бўлган сонга тенг бўлган барча сонларни
топишга имкон беради. Уни Фортрандаги программаси қуйидагича бўлиши мумкин:
PROGRAM fmin
REAL :: a = 5.3, b = 7.6, c = 5.3, m
m = MIN(a, b, c)
! Энг кичик қийматни топиш
IF(a == m) WRITE(*, *) ’a сони’
IF(b == m) WRITE(*, *) ’b сони’
IF(c == m) WRITE(*, *) ’c сони’
WRITE(*, *) ’Энг кичик сон ’, m
END PROGRAM fmin
Натижа:
a сони
c сони
Энг кичик сон
5.300000
107


5 Асосий алгоритмик конструкциялар
5.10 Цикл турлари
Цикл – бирор берилган шартни бажарилиши билан тугайдиган такрорий амал
эканлигини юқорида кўрдик. Бир марта бажариладиган цикл итерация дейилади.
Циклдаги операторлар ва ОТБ цикл танаси деб аталади.
Уч турдаги цикллар бор:
• параметрли цикл;
• шартли цикл;
• чегарали цикл.
5.11 Параметрли цикл
Параметрли циклда бирор параметр p нинг бошланғич қиймати pб, охирги
қиймати pо ва унинг ўзгариш қадами q берилган бўлади. q қиймати нолдан фарқли
бўлиши керак ва у навбатдаги итерациядан кейин параметр p нинг қиймати қанчага
ўзгариши кераклигини аниқлайди. Параметр p цикл ўзгарувчиси деб аталади ва у
бутун турли ўзгарувчи бўлиши керак. pб, pо ва q лар бутун турдаги ифодалардир.
Қуйидаги расмда параметрли цикл тасвирланган:
Параметрли цикл қуйидаги тартибда ишлайди (q > 0 ҳол):
1
o
. p = pб ўзлаштириш бажарилсин.
2
o
. Агар p ≤ pо бўлса, 3
o
га ўтилсин, акс ҳолда цикл тамом.
3
o
. ОТБ бажарилсин.
4
o
. p = p + q ўзлаштириш бажарилсин ва 2
o
га ўтилсин (такрорланиш).
q < 0 бўлганда 2
o
қадам қуйидаги кўринишда бўлади:
2
o
. Агар p ≥ po бўлса, 3
o
га ўтилсин, акс ҳолда цикл тамом.
Изоҳ :
1. Параметрли циклда 1
o
ва 4
o
қадамлардаги операторлар программа матнида
қатнашмайди. Лекин компилятор томонидан автоматик равишда бажарилувчи
программага ўрнатиб қўйилади.
2. Параметрли циклда p ўзгарувчининг қийматини цикл танасида ўзгартириш
тақиқланади.
Алгоритмни чизиқли схемасида параметрли цикл қуйидагича ёзилади:
X
o
. p = pб, pо, q параметр билан
ОТБ [бажарилсин]
[p параметрли] цикл тамом [X
o
].
108


М. Нишонов, mnishonov@gmail.com
Рис. 5.2: Параметрли цикл
Фортранда параметрли цикл учун программа қисми қуйидагича ёзилади:
DO p = pi, pe [,q]
ОТБ
END DO
Агар қадам q ёзилмаган бўлса, унинг қиймати 1 деб фараз қилинади. END DO
оператори қўшиб ENDDO кўринишда ёзилиши мумкин.
Мисол: n та кесмадан ташкил топган синиқ чизиқнинг узунлигини ҳисобланг.
Кесмалар узунлиги a, 4a, . . . , n
2
a кетма - кетлик орқали аниқланади.
L- синиқ чизиқнинг қидирилаётган узунлиги бўлсин. Тушунарлики, бошланғич
қийматни L = 0 деб олиб
L = L + i
2
· a, (i = 1, 2, . . . , n)
(5.1)
операторни n марта бажариб қидирилаётган натижани топамиз. (
5.1
) ни n марта
такрорий бажариш учун параметрли циклни қўллаймиз. Бунда цикл параметри
сифатида синиқ чизиқни ташкил қилган кесма тартиб рақами ишлатилади.
Алгоритм.
109


5 Асосий алгоритмик конструкциялар
1
o
. Бошланиши.
2
o
. n ва a ларнинг қийматлари киритилсин.
3
o
. L = 0.0 каби бошланғич қиймат аниқлансин.
4
o
. i = 1, n, 1 параметр билан:
L = L + i ∗ ∗2 * a [бажарилсин];
4
o
цикл тамом.
5
o
. L печатга чиқарилсин.
6
o
. Тамом.
Ушбу алгоритмнинг Фортрандаги программаси:
PROGRAM Luzunligi
! Алгоритм программаси
INTEGER i, n
REAL a, L
! L - синиқ чизиқ узунлиги.
WRITE(*,*) ’a ва n ни киритинг:’
READ(*,*) a, n
L = 0.0
DO i = 1, n
L = L + i**2 * a
END DO
WRITE(*,*) L
END PROGRAM Luzunligi
Изоҳ : программанинг бажарилиш вақтини қуйидаги ўзгартиришлардан сўнг қисқар-
тириш мумкин (ишлаш тезлигини ошириш мумкин):
• a га кўпайтириш амалини цикл танасидан ташқарига олиб чиқиш;
• квадрат даражага кўтариш амали i ∗ ∗2 ни тезроқ ишловчи кўпайтириш амали
i ∗ i га алмаштириш.
У ҳолда янги программа қуйидагича ёзилади:
PROGRAM Luzunligi
! Алгоритм программаси
INTEGER i, n
REAL a, L
! L - синиқ чизиқ узунлиги.
WRITE(*,*) ’a ва n ни киритинг:’
READ(*,*) a, n
L = 0.0
DO i = 1, n
L = L + i * i
END DO
WRITE(*,*) L * a
END PROGRAM Luzunligi
110


М. Нишонов, mnishonov@gmail.com
5.12 Шартли ва чегарали цикллар
Шартли цикл бирор маълум МИ қиймати ҳақиқат бўлгандагина бажарилади. Бун-
да МИ қиймати навбатдаги итерациянинг бошланишида текширилади. Чегарали цикл
шартли циклдан МИ нинг қийматини навбатдаги итерация бажарилгач текширилиши
билан фарқланади. Фортранда чегарали циклни бажариш учун алоҳида оператор
киритилмаган. Лекин уни DO ... END DO тузилма орқали амалга ошириш мумкин.
5.12
- расмда шартли ва чегарали циклларни график кўриниши келтирилган.
Рис. 5.3: Шартли ва чегарали цикллар: чапдаги расм - шартли, ўнгдагиси - чегарали
циклни график тасвири.
Изоҳ : шартли ва чегарали цикллар билан ишлашда МИ қиймати қачонлар-
дир ёлғон бўлиб қолишини назорат қилиш зарур. Акс ҳолда чексиз бажарилувчи
циклга эга бўламиз ва бу ҳол компьютер чексиз кўп вақт мобайнида программани
бажаришига сабаб бўлади.
Шартли ва чегарали цикллар алгоритмнинг чизиқли схемасида қуйидагича
ёзилади:
Шартли цикл
X
o
МИ қиймати ҳақиқат бўлса,
ОТБ [бажарилсин]
[X
o
] цикл тамом.
Чегарали цикл
111


5 Асосий алгоритмик конструкциялар
X
o
ОТБ [бажарилсин]
агар МИ қиймати ёлғон бўлса, циклдан чиқилсин
[X
o
] цикл тамом.
Фортранда
Шартли:
Чегарали:
DO WHILE( МИ )
DO
ОТБ
ОТБ
END DO
IF (.NOT.МИ) EXIT
END DO
5.13 Циклни узиш. Шартларни бирлаштириш
Циклдан чиқиш ва бошқарувни циклдан кейин жойлашган операторга узатиш
амалини EXIT операторини қўллаб бажариш мумкин. Агар циклдаги бир қанча опе-
раторларни ташлаб кейинги итерацияни бажариш зарурати бўлса CYCLE операторини
ишлатиш мумкин. Бунда бошқарув DO WHILE ёки DO операторига узатилади. EXIT ва
CYCLE операторлар ёлғиз ишлатилмайди. Улар IF тузилмага бириктирилади.
Мисол: бир ўлчамли массивнинг мусбат ва манфий элементлари сонини
аниқлаш. Агар массив элементлари ичида нол қийматлилари сони k дан кўп бўлса,
ҳисоблашлар тўхтатилсин.
PROGRAM mm
INTEGER, PARAMETER :: n = 10
INTEGER :: a(n) = (/ 1, -2, 0, 3, -4, 5, -6, 7, 0, 9 /)
INTEGER :: k = 3, pos = 0, ze = 0, i, va
DO i = 1, n
! i - a массив элементи тартиб рақами
va = a(i)
IF(va == 0) THEN
ze = ze + 1
! ze - қиймати нол бўлган элементлар сони
IF(ze > k) THEN
EXIT
! Циклдан чиқиш
ELSE
CYCLE
! Цикл бошига ўтиш
END IF
END IF
IF(va > 0) pos = pos + 1 ! pos - мусбат элементлар сони
END DO
! Манфий элементлар сони: n - ze - pos
IF(ze > k) STOP ’Нол қийматли элементлар сони чегарадан ташқарида’
WRITE(*, *) ’pos = ’, pos, ’ neg = ’, n - ze - pos
END PROGRAM mm
112


М. Нишонов, mnishonov@gmail.com
Изоҳ : ушбу программада va ўзгарувчини ишлатиш a массивга мурожатлар сонини
қисқартириш ва программани тез бажарилишига имконини беради.
Қаралган мисолда циклни тугаллаш учун программалаштиришда кўп қўлла-
ниладиган усул: шартларни бирлаштиришни ишлатиш мумкин. Цикл иккита шарт
i ≤ n ва ze ≤ k ҳақиқат бўлгандагина бажарилиши зарур. Улардан ҳеч бўлмаса
бири бажарилмаса цикл тамомланади. Шартларни бирлаштиришни шартли циклда
қўллайлик.
Алгоритм.
1
o
. Бошланиши.
2
o
. n, a ва k ларнинг қийматларини киритилсин.
3
o
. pos = 0 ! a массивнинг мусбат элементлари сони
ze = 0 ! қиймати нолга тенг элементлар сони
i = 1 ! жорий элемент тартиб рақами
деб қабул қилинсин.
4
o
. i ≤ n ва ze ≤ k бўлганда
va = a(i)
Агар va = 0 бўлса, у ҳолда
ze = ze + 1
бўлмаса, агар va > 0 бўлса,
pos = pos + 1
агар тамом.
5
o
. neg = n − ze − pos ! манфий элементлар сони
6
o
. pos ва neg лар печатга чиқарилсин.
7
o
. Тамом.
PROGRAM mmw
! Алгоритмни программа кўриниши
INTEGER, PARAMETER :: n = 10
INTEGER :: a(n) = (/ 1, -2, 0, 3, -4, 5, -6, 7, 0, 9 /)
INTEGER :: k = 3, pos = 0, ze = 0, i, va
i = 1
! биринчи элементдан бошлаймиз
DO WHILE(i <= n .AND. ze <= k)
va = a(i)
IF(va == 0) THEN
ze = ze + 1
! ze - нол қийматли элементлар сони
ELSE IF(va > 0) THEN
pos = pos + 1
! pos - мусбат элементлар сони
END IF
i = i + 1
END DO
113


5 Асосий алгоритмик конструкциялар
! Манфий элементлар сони: n - ze - pos
IF(ze > k) STOP ’Нол қийматли элементлар сони чегарадан ташқарида’
WRITE(*, *) ’pos = ’, pos, ’ neg = ’, n - ze - pos
END PROGRAM mmw
Шартларни бирлаштириш усули байроқча ёрдамида ҳам амалга оширилиши
мумкин. Масалан,
...
LOGICAL bayroq
! bayroq - мантиқий турдаги ўзгарувчи
i = 1
bayroq = i <= n .AND. ze <= k ! bayroq нинг бошланғич қиймати
DO WHILE( bayroq )
! bayroq қиймати ҳақиқат бўлгунича
...
i = i + 1
bayroq = i <= n .AND. ze <= k ! bayroq нинг янги қиймати
END DO
5.14 Алгоритм ва программа яратиш усули
Алгоритмлар ва программаларни яратиш жараёни берилган масалани содда-
роқ масалаларга (қисмларга) ажратиш йўли билан амалга оширилади. Масалани
қисмларга ажратишда қуйида келтирилган қадамлардаги амалларни бажариш зарур:
1) масалани таҳлил қилиб уни қандай қисмларга ажратиш мумкинлигини аниқлаб
олиш;
2) қисмларга ажратишни блок-схема ёки чизиқли схема кўринишида тасвирлаш;
3) ажратилган қисмлар орасида алоқани аниқлаш: ҳар бир қисм қандай маълу-
мотни қабул қилиши (киритиладиган маълумотлар) ва нимани қайтариши-
ни (чиқариладиган маълумотлар) аниқлаб олиш. Қисмлар орасидага алоқа
интерфейс деб аталади;
4) ҳар бир қисмни алоҳида қараб чиқиш: у учун алгоритм яратиш ва уни блок-
схема ёки чизиқли схема орқали тасвирлаб олиш. Керак бўлса, қисмни яна
соддароқ қисмчаларга ажратиш. Бундай қисмларга ажратишни шундай амалга
ошириш керакки охирида программа ёзиш қийинчилик туғдирмасин;
5) ҳосил бўлган қисмларни алоҳида программалар кўринишида ёзиб чиқиш ёки
улар учун алоҳида ОТБ яратиш.
Бундай ёндашувда программани бир нечта қисм программалар тўплами си-
фатида қараш мумкин. Ҳар бир қисм қандайдир маълумотни қабул қилиб бошқа
қандайдир маълумотларни қўшни қисмга узатади.
114


М. Нишонов, mnishonov@gmail.com
Берилган масалани ечишда ҳосил бўлган қисмлар учун яратилган чизиқли
схемалар ном, интерфейсни (киришдаги ва чиқариладиган маълумотлар нимани
билдириши) тавсифлаш билан таъминлаган бўлиши керак.
Фортранда қисмларни ишлатиш учун асосий программа, модуллар, қисм
программалар ва функциялар каби программа бирликларини қўллаш мумкин.
Қисм программалар ва функциялар процедуралар деб аталади ва улар ташқи,
модул ва ички процедуралар бўлиши мумкин.
Модуллар ва ташқи процедуралар мустақил программа бирликлари бўлиши ва
уларга бошқа турли программалардан мурожат қилиниши мумкин.
Мустақил ишлаш учун савол ва топшириқлар
1. SELECT конструкциясини қўллаб сон қийматини аниқлаш ҳақидаги программани
қайта ёзинг.
2. Қуйидаги программаларни қайси бири тўғри ва қайси бири хато эканлигини
аниқланг:
а) IF(a > b) c = a - b
END IF
б) IF(j < c) STOP’j < c’
в) IF(k < 100) THEN
IF(l > k) THEN
IF(j == i) THEN
c = a + b
f = g * h
END IF
ELSE
c = a + f
END IF
ELSE STOP 2
г) WHILE(x < y) DO
x = x**2
END DO
д) DO i = 1,20
c = 21 / i
2
GO TO 1
IF(c > b) THEN
b = d + e
1
c = SIN(b)
IF(c > b) THEN
b = d + e
c = SIN(b)
ELSE
115


5 Асосий алгоритмик конструкциялар
GO TO 2
END IF
END DO
3. Бошқарувчи конструкцияларни қўллаб, N та бутун катталиклардан дастлабки
N та
• туб сонларни;
• Фибоначи сонларини (дастлабки иккита сон йиғиндиси 1 га, ҳар бир
кейингиси аввалги иккитасини йиғиндисига тенг бўлган сонлар);
• биномиал коэффициентлар жадвалининг сатрини Паскал учбурчаги кўри-
нишида:
1
1
1
1
2
1
1
3
3
1
1
4
6
4
1
.................................
ўқувчи программа ёзинг.
• N та дастлабки туб сонларни ҳисобловчи программа ёзинг; программани N
ни ҳисоблаш вақтида ўқийдиган қилиб ўзгартиринг.
• Матрица элементларини тартибини берилган оралиқда тескарисига алма-
штирувчи программа ёзинг.
4. Алгоритм нима?
5. Қандай негиз алгоритмик структуралар бор?
6. Қандай турдаги тармоқланишлар бор?
7. Цикл нима ва у қачон ишлатилади? Қандай цикллар бор?
8. Алгоритм яратиш ва программа ёзиш босқичлари ҳақида гапириб беринг.
9. Программа ёзишда нималарга эътибор бериш лозим?
116


6 чи БОБ
Программа структураси. Қисм программалар ва
модуллар
Билимсиз кишиларнинг кўнгли хурофотга мойил бўлади.
Абу Райҳон Беруний
Мураккаб ҳисоблашларни бажариш учун яратилган программалар анча катта
ҳажмга эга бўлиши ва уларни ягона қисм сифатида сақлаш компиляция пайтида
программачи ишини қийинлаштириши мумкин. Бошқа томондан ҳар қандай масала
ўзининг мантиқий тузилишига эга бўлади ва уни нисбатан кичик масалаларга бўлиш
имкони бор. Бундай ҳолларда, ҳар бир кичик масалага алоҳида қисм бағишланиши
мумкин – программани қисмларга ажратиш уни яратишни анча енгиллаштиради,
бир пайтни ўзида бир нечта программачиларни ягона масалани алоҳида қисмларни
ҳал этишга жалб қилишга имкон беради, мавжуд хатоларни қисқа вақт мобайни-
да тўғрилаш имкони пайдо бўлади. Кичик масалалар учун ажратилган қисмлар
– программа компоненталари дейилади. Фортранда учта мустақил компоненталар
ажратилган: асосий программа, ташқи қисм программа ва модул. Мустақил програм-
ма компонентлари ўрнатилган ва ички қисм программаларни ўз ичига олган бўли-
ши мумкин. Ўрнатилган қисм программалар программалаш тилининг стандартида
аниқланган бўлади. Улар ҳақида қўлланманинг ?? чи бобида маълумотлар берилган.
6.1 Асосий программа
Асосий программа ихтиёрий программанинг мажбурий компонентасидир. Унда
операцион система программа ишга тушганда бошқарувни берадиган операторлар
тўплами ёзилган бўлади. Асосий программа ягона бўлиши зарур. Асосий программа-
нинг тузилиши қуйидагича бўлади:
[PROGRAM программа_номи]
[тавсифлаш_операторлари]
[бажарилувчи_операторлар]
[CONTAINS
ички_қисм_программалар]
117


6 Программа структураси. Қисм программалар ва модуллар
END [PROGRAM [программа_номи]]
Кўриниб турганидек, асосий программанинг ягона мажбурий элементи END опе-
раторидир. Бошқа барча элементлар бўлмаслиги мумкин. Асосий программада
END оператори программанинг тамом бўлганини билдириш билан бирга программа
ишини тўхтатиш ҳақидаги сигнални ҳам билдиради. Программани яхши ташкил
қилинганлиги белгиларидан бири программа ишини тамомлашда бошқарувни асосий
программага узатишдир, лекин, агар программани бошқа жойда тамомлаш зарурати
бўлса, STOP оператори ишлатилиши керак.
Агар END операторидан кейин программа_номи ёзилган бўлса, у сарлавҳадаги
PROGRAM оператордан кейин ёзилган ном билан бир хил бўлиши лозим.
Тавсифлаш_операторлари қисми бажарилувчи_операторлар дан аввал ёзилиши
шарт.
CONTAINS оператори бажарилувчи операторларни ички қисм программалардан
ажратиш учун ишлатилади. Ички қисм программалар – программа компоненталари-
нинг яна бир тури ҳисобланади. Лекин уларни алоҳида мустақил программа бирлиги
деб ҳисоблаб бўлмайди. Ички қисм программалар ўзлари аниқланган программа
компонентаси ичидагина ишлатилиши мумкин. Ташқаридан уларга мурожаат қилиб
бўлмайди.
6.2 Ташқи қисм программалар
Ташқи қисм программалар одатда умумий масалани ечиш мобайнида алоҳида
кичик масалаларни ечиш учун хизмат қилишади. Ташқи қисм программаларга
асосий қисм программадан ёки бошқа қисм программалардан мурожаат қилиш
мумкин. Ташқи қисм программанинг тузилиши асосий программаникига ўхшайди,
лекин, унда сарлавҳа бошқача бўлади:
Қисм_программа_сарлавҳаси
[тавсифлаш_операторлари]
[бажарилувчи_операторлар]
[CONTAINS
ички_қисм_программалар]
END [қисм_программа_белгиси [қисм_программа_номи]]
Бу ерда қисм_программа_сарлавҳаси қуйидаги кўринишда бўлиши мумкин:
[тур] қисм_программа_белгиси қисм_программа_номи
[(формал_параметрлар_рўйҳати)]
Қисм_программа_белгиси иккита SUBROUTINE ва FUNCTION операторларидан бири бў-
лиши мумкин. Қисм_программа_номи – номларга Фортранда қўйилган талаблар бўй-
ича бериладиган ном. Ундан кейин қавслар ичида формал_параметрлар_рўйҳати
ёзилади. Қисм_программа_белгиси қисм программа процедура ёки функция турдаги
қисм программа эканлигини кўрсатувчи белги ҳисобланади. Процедура турдаги
118


М. Нишонов, mnishonov@gmail.com
қисм программа ўзининг номи орқали қиймат ташимайди: у бажарилгач олинадиган
натижалар унинг формал параметрлари ёки глобал ўзгарувчилар орқали узатилади.
Функция қисм программаси эса ўзининг номи орқали маълумот ташийди. Маълумот
тури унинг номига берилган тур билан мос тушади. Шу сабабли функция қисм
программасининг қисм_программа_белгиси олдида унинг турини кўрсатиш ёки ушбу
функция қисм программасининг танасида унинг номига тур тайинланиши мумкин.
Процедурага мурожаат CALL оператори ёрдамида амалга оширилади:
CALL процедура_номи [(формал_параметрлар_рўйҳати)]
Масалан,
CALL test_sub
Функцияга мурожаат қилиш учун ҳеч қандай махсус оператор шарт эмас:
REAL a, x
REAL, EXTERNAL :: myfunc
.......
a = myfunc(x)
Қисм программадаги END оператори бошқарувни унга мурожаат қилган программа
компонентасига қайтаради. Қисм программанинг охирига етмасдан бошқарувни унга
мурожаат қилган жойга узатиш учун RETURN оператори ишлатилиши мумкин. Ушбу
оператор STOP оператори каби меткага эга бўлиши ва шарт операторининг қисми
бўлиши мумкин. RETURN оператори асосий программада ишлатилмайди.
Агар қисм программани тамомловчи END оператордан кейин қисм программа
номи ёзилган бўлса у қисм программа сарлавҳасидаги ном билан бир хил бўлиши
лозим. Ташқи программага мурожаатни ўз ичига олган асосий программага мисол
келтирамиз:
PROGRAM asosiy
IMPLICIT NONE
REAL x, y, z
DATA x, y /0.78955, 3.14159/
CALL tashqi_sub(x,y,z)
WRITE(*,*) ’Ташқи қисм программадан натижа: z=’,z
END PROGRAM asosiy
!---------------------------------------------------
SUBROUTINE tashqi_sub(a,b,c)
REAL a, b, c
c = sqrt(a**2+b**2)
END SUBROUTINE tashqi_sub
119


6 Программа структураси. Қисм программалар ва модуллар
6.3 Ички қисм программалар
Ташқи программалардан фарқли равишда ички қисм программалар ўзининг
ички қисм программасига эга бўла олишмайди. Ички қисм программа ўзи аниқланган
программа компонентасининг барча объектларига ва бошқа ички программаларга
мурожаат қила олади. Ички қисм программага фақат у аниқланган программа
компонентидангина мурожаат қилиниши мумкин. Мисол:
PROGRAM asosiy
IMPLICIT NONE
REAL x, y, z
DATA x, y /0.78955, 3.14159/
CALL ichki_sub(x,y,z)
WRITE(*,*) ’Ички қисм программадан натижа: z=’,z
CONTAINS
SUBROUTINE ichki_sub(a,b,c)
REAL a, b, c
c = sqrt(a**2 + b**2)
END SUBROUTINE ichki_sub
END PROGRAM asosiy
Бу ерда келтирилган мисоллар жуда содда ва ички қисм программалар нима учун
керак? – деган саволга жавоб беришмайди. Лекин ички қисм программалар жуда
қулай хусусиятларга эга. Қуйида бир хил номли ички қисм программага эга иккита
программа компоненталарга мисол келтирилган:
PROGRAM asosiy
IMPLICIT NONE
REAL x, y, z
DATA x, y /0.78955, 3.14159/
CALL ichki_sub(x,y,z)
WRITE(*,*) ’Асосийда ички қисм программадан натижа: z=’,z
CALL tashqi_sub(x,y,z)
WRITE(*,*) ’Ташқи қисм программадан натижа: z=’,z
CONTAINS
SUBROUTINE ichki_sub(a,b,c)
REAL, PARAMETER :: r = 3., rr = sqrt(3 / 2.0)
REAL a, b, c
IF(c > r) THEN
IF(a > r) a = rr
IF(b > r) b = rr
END IF
c = sqrt(a**2 + b**2)
END SUBROUTINE ichki_sub
END PROGRAM asosiy
120


М. Нишонов, mnishonov@gmail.com
!------------------------------------------------------------
SUBROUTINE tashqi_sub(a,b,c)
REAL a, b, c
REAL s
CALL ichki_sub(a,b,s)
WRITE(*,*) ’Ташқи қисм программанинг ичкисидан натижа: s=’,s
c = sqrt(a**2 + b**2)
CONTAINS
SUBROUTINE ichki_sub(a,b,c)
REAL a, b, c
c = sqrt(a**2 - b**2)
END SUBROUTINE ichki_sub
END SUBROUTINE tashqi_sub
6.4 Интерфейс
Ихтиёрий қисм программага мурожаат қилиш учун унинг интерфейсини би-
лиш зарур. Интерфейс – бу қисм программанинг сарлавҳаси, формал параметрлар
рўйҳати ва уларнинг тавсифини билдиради. Ички қисм программанинг интерфейси
уни ташувчи программа компоненти миқёсида доимо маълум: ташувчи-компонентга
ички қисм программанинг барча параметрлари маълум; бошқа программа компо-
нентлар ушбу қисм программага мурожаат қила олишмайди. Ички қисм программа
интерфейси ошкор интерфейсга мисолдир: унга тўғри мурожаат қилинаётганлиги-
ни компиляция вақтида текшириш мумкин. Ошкор интерфейсга яна модул қисм
программалар ва ички функциялар мисол бўлади.
Ташқи қисм программалар ва формал процедуралар одатда ошкор интерфейсга
эга бўлишмайди. Компиляторга ташқи ва формал процедуралар ҳақида ҳеч қандай
ахборот маълум эмас, яъни уларнинг интерфейси ноошкордир. Шунинг учун компи-
ляция вақтида формал ва фактик параметрларнинг мослигини текшириш имкони
йўқ.
Ноошкор интерфейсни ошкор қилиш учун уни INTERFACE блокда тавсифлаш
керак:
INTERFACE
қисм_программа_сарлавҳаси
формал_параметрлар_тавсифи
[локал_ўзгарувчилар_тавсифи]
қисм_программа_учун_END_оператори
END INTERFACE
Интерфейс блокда DATA ва FORMAT операторларини кўрсатиш мумкин эмас. Формал
параметрларнинг номларини ва тавсифлаш операторлари тартибини ўзгартириш
мумкин ва баъзида зарур. Интерфейс блокда бошқа программалаш тилларида,
масалан, ассемблер ёки C да ёзилган қисм программаларни жойлаштириш мумкин.
121


6 Программа структураси. Қисм программалар ва модуллар
Интерфейс блоки программа компонетида тавсифлаш операторлари орасида
жойлаштирилади: шундан сўнг унда мурожаат қилинган қисм программа интерфейси
ошкор кўринишга келади.
Қуйидаги мисолда асосий программага интерфейс блокини қўшиш билан қисм
программа интерфейси ошкор ҳолга келтирилган:
PROGRAM asosiy
IMPLICIT NONE
REAL x, y, z
INTERFACE
SUBROUTINE tashqi_sub(a,b,c)
REAL ,B,C
END SUBROUTINE tashqi_sub
END INTERFACE
DATA x, y /0.78955, 3.14159/
CALL ichki_sub(x,y,z)
WRITE(*,*) ’Асосийда ички қисм программадан натижа: z=’,z
CALL tashqi_sub(x,y,z)
WRITE(*,*) ’Ташқи қисм программадан натижа: z=’,z
CONTAINS
SUBROUTINE ichki_sub(a,b,c)
REAL, PARAMETER :: r = 3., rr = sqrt(3 / 2.0)
REAL a, b, c
IF(c > r) THEN
IF(a > r) a = rr
IF(b > r) b = rr
END IF
c = sqrt(a**2 + b**2)
END SUBROUTINE ichki_sub
END PROGRAM asosiy
!------------------------------------------------------------
SUBROUTINE tashqi_sub(a,b,c)
REAL a, b, c
REAL s
CALL ichki_sub(a,b,s)
WRITE(*,*) ’Ташқи қисм программанинг ичкисидан натижа: s=’,s
c = sqrt(a**2 + b**2)
CONTAINS
SUBROUTINE ichki_sub(a,b,c)
REAL a, b, c
c = sqrt(a**2 - b**2)
END SUBROUTINE ichki_sub
122


М. Нишонов, mnishonov@gmail.com
END SUBROUTINE tashqi_sub
6.5 Қисм программаларнинг параметрлари
Барча қисм программалар уларга мурожаат қилаётган бошқа программа ком-
понентлари билан маълумот алмашиниш имконига эга бўлиши зарур. Қисм програм-
малар уларга мурожаат қилаётган программадан кириш маълумотларини олишади
ва ўзининг бажарилишидан ҳосил бўлган натижаларни унга узатишади (чиқишда-
ги маълумотлар). Маълумот алмашиниш қисм программаларнинг параметрлари
ёки глобал маълумотлар орқалиш содир бўлиши мумкин. Глобал маълумотлар –
бу бир пайтнинг ўзида қисм программага ва унга мурожаат қилаётган программа-
га кўринадиган (улар ишлата оладиган) ўзгарувчиларнинг қийматларидир. Қисм
программанинг параметрлари орқали маълумот алмашишда қисм программанинг
номидан кейин қавс ичида формал_параметрлар_рўйҳати кўрсатилиши зарур. Ушбу
рўйҳатда функция номлари ҳам бўлиши мумкин. Формал параметрлар қисм програм-
манинг тавсифлаш операторлари ёрдамида ошкор ёки ноошкор ҳолда аниқланган
бўлиши зарур. Қисм программага мурожаат пайтида формал параметрлар фактик
параметрлар билан алмаштирилади. Мисол:
SUBROUTINE qism_prog(a,b,c) ! Бу ерда a,b,c лар формал параметрлар
REAL a,b,c
c = sqrt(a**2 + b**2)
END SUBROUTINE qism_prog
!------------------------------------------------------------------
PROGRAM asosiy
IMPLICIT NONE
REAL x,y,z
DATA x, y /0.78955, 3.14159/
CALL qism_prog(x,y,z) ! Бу ерда x,y,z лар фактик параметрлар
WRITE(*,*) ’Қисм программадан натижа: z=’,z
END PROGRAM asosiy
6.6 Фактик параметрларга қўйиладиган чекланишлар
Фактик параметрлар формал параметрлар билан тури, тур синфи ва шакли
жиҳатдан мос келиши керак. Номлари бир хил бўлиши шарт эмас. Формал параметр
ўрнига тури ва тур синфи у билан мос тушадиган ифода ишлатилиши ҳам мумкин.
Формал параметрлар қисм программанинг бошқа объектларидан фарқ қила-
диган алоҳида объектлар деб фараз қилинади. Фактик параметрларга қуйидаги
чекланишлар қўйилади:
• формал параметрни ишлатмасдан фактик параметрга таъсир қилувчи ҳар
қандай амал тақиқланади;
123


6 Программа структураси. Қисм программалар ва модуллар
• агар фактик параметрнинг бирор ихтиёрий қисми формал параметр орқали
қиймат олаётган бўлса, ушбу фактик параметрга фақат формал параметр
орқалигина мурожаат қилиш мумкин.
Агар қисм программада a формал параметр ишлатилган бўлса, у ҳолда ушбу қисм
программа миқёсида бу параметр фақат a сифатидагина ишлатилиши мумкин.
Яъни, бу қисм программага мурожаат қилаётган программада a ўрнига қандай
фактик параметр қўйилиши аҳамиятли эмас. Фактик параметрга формал параметрни
айланиб ўтиб мурожаат қилиш имконияти у модул ёрдамида глобал ўзгарувчи
сифатида аниқланганда ёки хотиранинг умумий қисми COMMON-блок орқалигина
пайдо бўлади.
6.7 Формал параметр учун алоқа тури
Фортранда формал параметр вазифасини кўрсатиш мумкин. Формал па-
раметр фақат кириш, чиқиш ёки кириш-чиқиш маълумотини билдиришини
INTENT(параметр) ҳусусият орқали аниқлаш мумкин. Бунда параметр – IN, OUT
ва INOUT қиймат қабул қилади:
SUBROUTINE sub(n, p, natija)
INTEGER, INTENF(IN) :: n
REAL, INTENT(OUT) :: p
REAL, DIMENSION(:), INTENT(INOUT) :: natija
IN қиймат формал параметр киришдаги маълумотни ташишини билдиради: қисм
программа ичида унинг қийматини ўзгартириш мумкин эмас, яъни, у ўзлаштириш
операторининг чап томонида ишлатилмайди.
OUT қиймат формал параметр чиқишдаги маълумотни ташишини билдиради:
унинг қиймати қисм программа ичида аниқланиши керак, шунинг учун қисм про-
граммага киришда унинг қиймати номаълум. Унга мос фактик параметр ўзгарувчи
бўлиши лозим.
INOUT қиймат формал параметр киришда ҳам чиқишда ҳам маълумот ташиши-
ни билдиради. Унинг киришдаги қиймати қисм программа ичида ўзгартирилиши
мумкин.
Агар формал параметрнинг алоқа тури аниқланмаган бўлса, унга мос фактик
параметр ўзгарувчи ва ифода бўлиши мумкин. Агар формал параметрнинг қиймати
қисм программа ичида қайта аниқланса, унга мос фактик параметр ўзгарувчи бўлиши
шарт.
Формал параметрнинг алоқа тури имкон бўлса доим кўрсатилиши маслаҳат
берилади. Агар формал параметр POINTER ҳусусиятга эга бўлса, унинг учун алоқа
турини кўрсатиш имкони бўлмайди: чунки алоқа тури йўлланма манзилигами ё
йўлланманинг боғланиш ҳолатига тўғри келишини аниқлаш имкони йўқ. Қуйида-
ги мисолда қисм программа параметрларига кириш ва чиқиш учун алоқа тури
кўрсатилган:
124


М. Нишонов, mnishonov@gmail.com
SUBROUTINE qism_prog(a,b,c)
REAL, INTENT(IN) :: a,b
REAL, INTENT(OUT) :: c
c = exp(a**2 + b**2)
END SUBROUTINE qism_prog
6.8 Йўлланмаларни формал ва фактик параметрлар
сифатида ишлатиш
Агар формал параметр POINTER ҳусусиятга эга бўлса, унга мос фактик параметр
йўлланма бўлиши шарт. Қисм программага мурожаат пайтида фактик параметрнинг
боғланиши формал параметрга узатилади: чиқишда фактик параметр формал пара-
метрнинг боғланиш ҳолатини қабул қилади. Агар формал параметрнинг манзили
SAVE ҳусусиятга эга бўлмаган локал ўзгарувчи бўлса, фактик параметр номаълум
қийматли манзилга боғланиб қолади.
Формал параметр йўлланма бўлмагандагина фактик параметр йўлланма бўлиши
мумкин. Бу ҳолда формал параметр фактик параметрнинг йўлланма манзили билан
мос тушади.
6.9 TARGET ҳусусиятли параметрлар
Агар фактик параметр йўлланма манзили бўлса, унинг ҳолати қисм программа-
га киришда ўзгармайди, яъни, йўлланма мос формал параметрга боғланмайди. Агар
формал параметр TARGET ҳусусиятга эга бўлса, унга боғланган иҳтиёрий йўлланма
қисм программадан чиқишда номаълум бўлиб қолади.
6.10 Қисм программаларни параметр сифатида
ишлатиш
Қисм программаларнинг параметрлари ўзгарувчи ва ифодалар бўлиши билан
бирга процедуралар бўлиши ҳам мумкин. Масалан, берилган оралиқда бирор функци-
янинг аниқ интегралини ҳисобовчи қисм программани тасаввур қилайлик. Бу ҳолда
функция қийматини ҳисобловчи қисм программанинг номини интеграл қийматини
ҳисобловчи қисм программага унинг параметрлари орқали бериш зарурати пайдо
бўлади. Интегрални ҳисобловчи қисм программанинг формал параметрлар рўйҳатида
функция қийматини ҳисобловчи қисм программа номи кўрсатилади ва тавсифлаш
операторларида унга EXTERNAL ҳусусият берилади. Формал қисм программанинг
интерфейси интерфейс блокида аниқланади:
REAL FUNCTION integral(a,b,func)
INTERFACE
REAL FUNCTION func(x)
125


6 Программа структураси. Қисм программалар ва модуллар
REAL, INTENT(IN) :: x
END FUNCTION func
END INTERFACE
REAL, INTENT(IN) :: a,b
REAL x, f
...
f = func(x)
...
END FUNCTION integral
Бунда integral номли қисм программани чақирганда унинг формал параметрлари
ичидаги func ўрнига мавжуд функция номи ёзилади. Бу функция интерфейсини
ҳам ошкор аниқлаш мақсадга мувофиқ:
PROGRAM integ
INTERFACE
REAL FUNCTION myfun(x)
REAL, INTENT(IN) :: x
END FUNCTION myfun
END INTERFACE
REAL f
EXTERNAL myfun
...
f = integral(0.5,2.5,myfun)
...
END PROGRAM integ
!---------------------------
REAL FUNCTION myfun(x)
REAL, INTENT(IN) :: x
myfun = 2.0 * x**2 + 3.0
END FUNCTION myfun
Параметр сифатида ўзатилаётган қисм программа ташқи ёки модул қисм программа
бўлиши зарур. Ички қисм программаларни параметр сифатида ишлатиш мумкин
эмас.
6.11 Калит ва шарт бўлмаган параметрлар
Одатда қисм программаларга мурожаат қилинганда фактик параметрлар форм-
алларининг ўрнига қўйилади: параметрни тайинлаш чақирувчи операторда унинг
рўйҳатдаги жойига қараб аниқланади. Фактик параметрларни бундай қўйиб чиқиш
позицион (жойига қараб) узатиш дейилади. Лекин формал параметрни фактик па-
раметр билан мослигини ўрнатишни бошқа усули ҳам бор. Фактик параметрларни
қуйидаги кўринишда узатиш мумкин:
126


М. Нишонов, mnishonov@gmail.com
формал_параметр_номи = фактик_параметр
Фактик параметрларни бундай узатишда жойлашиш тартиби аҳамиятли эмас: бу
усул калитли узатиш дейилади.
Масалан,
SUBROUTINE kalit(num, record, file)
INTEGER, INTENT(IN) :: num, record
CHARACTER(LEN = *), INTENT(IN) :: record
...
END SUBROUTINE kalit
қисм программани
number = i
tale = ’Файлга ёзиш’
wr = 11
параметрлар учун қуйидаги кўринишда чақириш мумкин:
CALL kalit(number, tale, wr)
Қисм программага бундай мурожаат позицион чақиришга мисол бўлади. Калитли
чақиришда параметрларнинг ўрни аҳамиятли эмас ва иҳтиёрий бўлиши мумкин:
CALL kalit(record = tale, file = wr, num = number)
Калитли ва позицион усуллар аралаштириб ишлатилиши мумкин. Қисм программа-
ларга мурожаат пайтида баъзи параметрлар тушириб қолдирилиши мумкин. Бундай
параметрлар шарт бўлмаган параметрлар дейилади. Шарт бўлмаган параметрларга
мос формал параметрларга OPTIONAL ҳусусият тайинланиши лозим. Қуйидаги қисм
программада:
SUBROUTINE qism_pr(matn, uzunligi, ib)
CHARACTER, DIMENSION(:) :: matn
INTEGER uzunligi
INTEGER, OPTIONAL :: ib
...
END SUBROUTINE qism_pr
формал параметрлар рўйҳатидаги энг охирида турган ib параметр мурожаат пай-
тида тушириб қолдирилиши мумкин. Масалан, qism_pr қисм программада белгили
массивдан uzunligi га тенг узунликдаги қисм сатрни ib индексли белгидан бошлаб
ажаратиш амали бажарилаётган бўлсин. Қисм программа qism_pr га мурожаат
қилинганда фактик параметрлар ичида ушбу параметр тушириб қолирилган бўлса,
унга 1 қиймат ўзлаштирилади:
IF(.NOT. PRESENT(ib)) ib = 1
127


6 Программа структураси. Қисм программалар ва модуллар
PRESENT стандарт функция кўрсатилган формал параметр фактик параметрлар
ичида мавжуд бўлса, .TRUE. қийматни қайтаради. Шундай қилиб қисм программа
шарт бўлмаган параметрларни мавжудлигини таҳлил қилиш имконига эга.
Агар рўйҳатда бир нечта фактик параметрлар тушириб қолдирилса қисм
программага мурожаат пайтида формал ва фактик параметрлар мослигини уларнинг
жойига қараб аниқлаш имкони йўқ. Бундай ҳолларда формалларига мос фактик
параметрларни аниқлаш учун калитлар ишлатилади. Масалан, қисм программада
иккита шарт бўлмаган параметр бўлсин:
SUBROUTINE qism_pr(matn, uzunlihi, ib, io)
CHARACTER, DIMENSION(:) :: matn
INTEGER uzunligi
INTEGER, OPTIONAL :: ib, io
...
END SUBROUTINE qism_pr
Бу ҳолда ушбу қисм программага matn, uzunligi, io параметрлар тўплами билан
мурожаат қилиш учун охирги параметр қийматини калитли усул билан узатиш
керак:
CALL qism_pr(matn, uzunligi, io = 15)
Барча параметрлар фактик параметрлар рўйҳатида бир мартадан ортиқ пайдо бўла
олишмайди. Агар параметрлар кўп бўлса, хатто позицион параметрлар учун ҳам
калит кўрсатиш маслаҳат берилади.
Қисм программада ҳеч бўлмаганда бир дона шарт бўлмаган параметр бўлса, у
ошкор интерфейсга эга бўлиши шарт!
6.12 Номланган интерфейслар ва процедураларни
аралаштириш
Фортранда қисм программалар гуруҳини битта ном остида бирлаштириш им-
кони бор. Бу уларга ягона ном орқали мурожаат қилиш имконини беради. Масалан,
айни бир катталикни бутун, ҳақиқий ва комплекс турда ҳисобловчи функциялар-
ни бирлаштириш мумкин: чунки бир дона қисм программа ёрдамида бир пайтни
ўзида ҳар ҳил турга эга бўлган параметрни ҳисоблашга эришиш имкони йўқ, ле-
кин мурожаатни умумлаштириш масалани ҳал қилади. Процедураларни ягона ном
остига бирлаштиришни ананага кўра қайта юклаш деб аташади (инглиз тилидан
overloading сўзини таржимаси). Бунда содир бўлаётган ҳодисани аралаштириш сў-
зи билан аниқроқ тавсифлаш мумкин. Аралаштирилган қисм программаларнинг
умумлашган ягона номини уруғ номи дейишади
1
.
Қисм программаларни бирлаштириш учун гуруҳдаги барча қисм программа-
ларнинг сарлавҳаларини ўз ичига олган номланган интерфейс яратилиши лозим,
масалан:
1
Ўзбекларнинг "Қайси уруғдансиз?" – деган саволидан.
128


М. Нишонов, mnishonov@gmail.com
INTERFACE gamma
REAL FUNCTION igamma(x)
INTENT(IN) :: x
END FUNCTION igamma
REAL FUNCTION rgamma(x)
INTENT(IN) :: x
END FUNCTION rgamma
REAL FUNCTION cgamma(x)
INTENT(IN) :: x
END FUNCTION cgamma
END INTERFACE gamma
Бу кўринишдаги бирлаштирувчи интерфейс уруғнинг интерфейси, унинг номи эса
уруғнинг номи деб аталади. Ушбу мисолда уруғ номи аралаштирилаётган қисм
программаларнинг бирортасини номи билан бир хил эмас, лекин, бу шарт эмас. Уруғ
номи интерфейс ичидаги қисм программалардан бирининг номи билан мос тушиши
мумкин. Агар уруғ интерфейсга модул қисм программалар киритилаётган бўлса,
ҳар бир қисм программа учун алоҳида интерфейс ёзиш шарт эмас. Бу ҳолда уруғ
интерфейсга MODULE PROCEDURE операторини киритиш етарли:
INTERFACE gamma
...
MODULE PROCEDURE mgamma, pgamma, dgamma
...
END INTERFACE
Чунки модул қисм программалар доим ошкор интерфейсга эга бўлишади.
Уруғ номи орқали маълум бир қисм программага мурожаат фактик параметр-
лар тўплами бўйича амалга оширилади. Аралаштирилаётган қисм программалар
ўзларининг формал параметрлари билан бир қийматли аниқланган бўлиши лозим.
Уларнинг параметрлари албатта ёки миқдоран, ёки тур бўйича, ёки тур синфи
бўйича фарқланиши зарур. Бирлаштирилаётган қисм программаларнинг барчаси
бир пайтнинг ўзида ё процедуралар, ёки функциялар бўлиши шарт. Функциялар
ёки процедураларнинг номлари ва уларнинг формал параметрларининг жойлашиш
тартиби аҳамиятли эмас. Уруғ интерфейс нуқтаи назаридан
REAL FUNCTION fun(x, i)
REAL x
INTEGER i
...
END FUNCTION fun
ва
REAL FUNCTION ufn(i, x)
REAL x
129


6 Программа структураси. Қисм программалар ва модуллар
INTEGER i
...
END FUNCTION ufn
функциялар бир-биридан фарқ қилмайди: уруғ номи бўйича мурожаат пайтида
функциянинг аниқ номини ишлатиш мумкин эмас, функция параметрлари орқа-
ли фақат позицион усулда чақириш билан аниқланади – (y,k). Калитли усулда
чақиришда эса – (x = y, i = k) – иккала функция учун мурожаатлар бир хил.
Агар бир нечта уруғ интерфейслар бир хил уруғ номига эга бўлса, улар ичида
жойлашган барча қисм программаларга шу ном орқали мурожаат қилиш мумкин. Бу
ҳусусият уруғ гуруҳларини керак бўлганда қулай йўл билан кенгайтириш имконини
беради.
Аралаштиришнинг бошқа шакли ҳосилавий турни аниқлашда стандарт амаллар
ва ўзлаштириш амалининг имкониятларини кенгайтиришдир. Стандарт амаллар-
ни қайта аниқлаш (қайта юклаш) учун OPERATOR(амал_белгиси) номли номланган
интерфейс ҳосил қилиш зарур, масалан:
INTERFACE OPERATOR(+)
интерфейс_танаси
END INTERFACE
бу ерда интерфейс_танасида интерфейс сарлавҳасида кўрсатилган стандарт амални
алмаштирувчи функциянинг сарлавҳаси ёки модул функцияларга мос келувчи MODULE
PROCEDURE йўлланма-оператор жойлашган бўлиши мумкин. Стандарт бинар амал-
нинг имкониятларини кенгайтирувчи функция иккита формал кириш параметрига
(INTENT(IN) ҳусусиятли) эга бўлиши лозим; стандарт унар амалнинг имкониятини
кенгайтирувчи функция бир дона шундай параметрга эга бўлиши керак. Бундай
функцияларнинг аргументлари сони стандарт амалнинг операндлар сонига тенг
бўлиши керак. Унар * амалини қайта аниқлаб бўлмайди.
Ўзлаштириш амалининг имкониятларини кенгайтириш учун ASSIGNMENT(=)
номли уруғ номи ишлатилади:
INTERFACE ASSIGNMENT(=)
интерфейс_танаси
END INTERFACE
Интерфейс_танасига жойлаштирилган қисм программалар иккита мажбурий пара-
метрга эга бўлиши шарт, улардан бири OUT ёки INOUT, иккинчиси эса IN алоқа турига
эга бўлиши лозим.
6.13 Модуллар
Ички ва ташқи қисм программалар бирор программа миқёсида қандайдир
кичик масалаларни ечиш учун мўлжалланган бўлади. Модуллар эса маълумотларни
тайёрлаш учун қўлланилади. Фортраннинг эски вариантларида ягона маълумот
130


М. Нишонов, mnishonov@gmail.com
қисмига бир пайтнинг ўзида бир нечта программа компонентларидан мурожаат
қилиш имкони йўқ эди; глобал ўзгарувчилар жойлашган хотиранинг умумий қавати
ҳар бир программа компонентида такроран тавсифланиши зарур эди. Бу ҳол програм-
маларда глобал ўзгарувчиларни ишлатишни қийинлаштирар ва кўпинча хатолар
манбаи бўлиб хизмат қилар эди. Фортран 77 компилятори учун киритилган INCLUDE
кўрсатма глобал маълумотларни ягона файлга жойлаш имконини яратди ва кўпинча
содир бўладиган хатолардан қутилишга ёрдам берди. Лекин INCLUDE ни Фортран
оператори деб қарай олмаймиз: у компилятор томонидан бажариладиган буйруқдир.
Глобал маълумотларга муаммосиз мурожаат қилиш Фортран 90 да пайдо бўлди.
Модуллар айнан шу муаммони ҳал қилиш учун киритилди. Модулнинг тузилиши
қуйидагича:
MODULE модул_номи
[тавсифлаш_операторлари]
[CONTAINS
модул_қисм_программалар]
END [MODULE [модул_номи]]
Модул бошқа программа компонентларига USE оператори ёрдамида қўшилади. Модул-
даги PRIVATE ҳусусиятга эга бўлмаган барча объектлар модул қўшилган программа
компонентида ишлатилиши мумкин.
USE оператори модулнинг маълум қисмларига мурожаатни чегаралаш ёки муро-
жаат рухсат берилган объектларни қайта номлаш имконига эга. Агар чегаралашлар
қўйилмаган бўлса, модулдаги барча объектларга мурожаат қилиш мумкин. Модул
қисм программаларнинг тузилиши ташқи қисм программаларники билан бир хилдир.
Фарқи модул қисм программани тамомловчи END операторидан кейин мос ҳолда
SUBROUTINE ёки FUNCTION сўзлари ёзилиши шарт. Модулнинг барча объектларига
модул қисм программалар автоматик равишда мурожаат қила олишади.
Модулларни USE оператори ёрдамида бир-бирининг ичига жойлаштириш мум-
кин. Модул ҳеч қачон ўз-ўзига мурожаат қила олмайди.
Модулни ишлатишга энг содда мисол, маълумотларни тавсифлашни модул-
га жойлаштиришдир. Масалан, array номли модул ҳосил қилиб, унга қандайдир
массивнинг тавсифини жойлаштирайлик:
MODULE array
REAL, DIMENSION(20) :: a
END MODULE array
Сўнг, USE оператори ёрдамида уни sub1, sub2, sub3 қисм программаларга қўшамиз:
SUBROUTINE sub1
USE array
...
END SUBROUTINE sub1
!-------------------
SUBROUTINE sub2
131


6 Программа структураси. Қисм программалар ва модуллар
USE array
...
END SUBROUTINE sub2
!-------------------
SUBROUTINE sub3
USE array
...
END SUBROUTINE sub3
Энди a массивни уччала қисм программаларда ишлатса бўлади:
PROGRAM subs
CALL sub1
CALL sub2
CALL sub3
END PROGRAM subs
Модул ҳосилавий турларни ва улар учун амалларни аниқлашни, интерфейслар-
ни ва NAMELIST рўйҳатларни жойлаштириш учун қулай жой ҳисобланади.
6.14 Рекурсив процедуралар ва функциялар
Қисм программалар ўзларига мурожаат қила олишмайди деб фараз қилинади,
ноошкор ҳолда қисм программаларнинг рекурсияси тақиқланган. Лекин қисм про-
граммани рекурсив (ўзига мурожаат қилиш ҳусусияти) қилиш мумкин. Бунинг учун
унинг сарлавҳасига RECURSIVE кўрсатмасини қўшиш керак:
RECURSIVE SUBROUTINE factorial(n,nf)
Шундан сўнг қисм программага ўз-ўзига мурожаат қилишга рухсат берилади. Ре-
курсив қисм программани тайёрлашда унинг алгоритми шундай бўлиши керакки,
қисм программадан чиқиш кафолатланган бўлиши лозим. Бутун турдаги факториал
n! ни ҳисоблашни қарайлик:
RECURSIVE SUROUTINE factorial(n,nf)
INTEGER, INTENT(IN) :: n
INTEGER, INTENT(INOUT) :: nf
DATA nf/1/
IF(n. GT. 1) THEN
nf = nf * n
CALL factorial(n-1,nf)
END IF
END
Рекурсив қисм программага ҳар бир мурожаатда алоҳида локал объектлар ҳосил
қилинади. Бунга SAVE ҳусусиятли ва объектнинг DATA оператордаги бошланғич
132


М. Нишонов, mnishonov@gmail.com
қиймати кирмайди. Қисм программаларда қиймат ўзлаштирилаётган объектлар
автоматик равишда SAVE ҳусусият билан таъминланади, DATA оператори биринчи
мурожаат пайтида фақат бир мартагина бажарилади.
Рекурсив функциялар рекурсив процедуралардан сал фарқ қилишади: агар
рекурсив функция ўзига мурожаат қилаётган бўлса, натижа бошқа номга эга бўлиши
лозим. Юқоридаги факториални ҳисобловчи қисм программа процедурадир. Уни
функцияга алмаштирамиз:
INTEGER RECURSIVE FUNCTION factorail(n) RESULT(nf)
INTEGER n, nf
DATA nf/1/
IF(n .GT. 1) nf = n * factorial(n-1)
END FUNCTION factorial
RESULT кўрсатма натижани кўрсатилган ўзгарувчига жойлайди.
6.15 Номлар ва меткаларнинг кўриниш соҳаси
Номланган объектлар ва меткалар учун улар кўринадиган соҳа мавжуд. У
кўриниш соҳаси деб аталади. Ҳар бир қисм программа учун меткаларнинг алоҳида
тўплами аниқланади; ички қисм программалар ҳам уларни ташувчи компонетдаги
тўпламдан алоҳида ўзларининг тўпламига эга. Яъни ташувчи-компонента ва ички
қисм программалардаги меткалар бир хил бўлиши мумкин, лекин улар бир-бири
билан аралашиб кетмайди.
Ўзгарувчилар, номланган доимийлар, қисм программалар (ички ва ташқи),
ҳосилавий турлар ва NAMELIST рўйҳатлар номланган объектлар ҳисобланади.
Ҳар бир қисм программа учун унда тавсифланган объектлардан иборат номлар
фазоси аниқланади. Улар локал объектлар дейилади. Қисм программада локал
объектлардан ташқари боғланган ва глобал объектлар ҳам ишлатилиши мумкин.
Боғланиш қисм программани ташувчиси (қисм программа ички бўлганда) ёки модул
компонентни қўшиш орқали амалга оширилиши мумкин. Глобал объектлар – бу про-
грамма компонеталари ва ташқи қисм программалар номлари – автоматик равишда
программанинг ихтиёрий жойида ишлатилиши мумкин.
Локал номланган объектлар улар аниқланган программа компонентдаги барча
операторлар учун кўринади. Ҳосилавий турларни аниқлаш блоки ва ички қисм
программалар боғланган объектларга ўзларини ташувчиси орқали мурожаат қила
олишади. Локал объектлар боғланган объектлардан юқори мурожаат даражасига эга.
Яъни, локал ва боғланган объект бир хил номга эга бўлса, локал объект ишлатилади.
Ташувчи учун ҳосилавий турларни аниқлаш блокида, ички қисм программаларда ва
интерфейсларда аниқланган локал объектлар кўринмайди. Масалан, ichida номли
қисм программадаги a номли ўзгарувчи унинг ташувчиси tashqarida номли қисм
программа орқали кўринади, лекин b ташувчидаги ўзгарувчи номи ichida қисм
программада локал аниқланганлиги учун ички қисм программада ишлатилмайди:
SUBROUTINE tashqarida
133


6 Программа структураси. Қисм программалар ва модуллар
REAL a, b
...
CONTAINS
SUBROUTINE ichida
REAL b, y
y = a + b
END SUBROUTINE ichida
END SUBROUTINE tashqarida
USE билан боғланган объектларнинг номларини локал объектларни тавсифлашда
ишлатиш, умуман олганда, мумкин эмас.
Ҳар бир номланган объект номи у аниқланган қисмда ягона бўлиши керак.
Масалан, ички қисм программани SIN орқали номлаш худди шу номли стандарт
функцияни ишлатиб бўлмасликка олиб келади.
6.16 USE оператори
USE оператори модулда аниқланган ўзгарувчиларга, қисм программаларга,
интерфейсларга ва бошқа объектларга у қўшилган программа компоненти мурожаат
қила олишига имкон беради. Бу оператор тавсифлаш операторлар сирасига керади.
Барча бошқа тавсифлаш операторлари ундан кейин жойлашган бўлишлари лозим.
USE операторини қўшиш учун энг содда шакл қуйидагича:
USE модул_номи
Программага ташқи объектларни қўшишда модулда ва программада локал аниқлан-
ган объектларнинг номлари (агар улар бир хил бўлиб қолса) орасидаги келишмов-
чиликларни ҳал қилиш муаммоси пайдо бўлиши мумкин. USE операторининг тўла
кўриниши қўшилаётган модулдаги объектлар номларини ўзгартириш имконига эга:
USE модул_номи, ўзгартирилган_номлар_рўйҳати
Бу ерда ўзгартирилган_номлар_рўйҳати вергуллар билан ажратилган қуйидаги кўри-
нишдаги жуфтликлардан:
локал_ном => модулдаги_ном
ёки
ONLY: [only_рўйҳат]
кўрсатмадан иборат бўлади. Ўзгартирилган_номлар_рўйҳати модулда аниқланган
объектларга локал номлар беришга имкон беради. Бу рўйҳатда келтирилмаган модул
объектлари ўзларининг номлари орқали ишлатилади. ONLY-шакл бўлса модулдаги
объектларни модул қўшилган программа компонентида қайсилари ишлатилишини
ажратиб беради. ONLY-шаклда кўрсатилмаган модул объектлар у қўшилган програм-
ма компонентига кўринмайди, яъни уларни бу ерда ишлатиб бўлмайди.
134


М. Нишонов, mnishonov@gmail.com
Қуйидаги мисолда номларни ўзгартиришни қараб чиқамиз. Унда иккита m1 ва
m2 модулларда бир хил номланган лекин турли вазифани бажарадиган s функция
аниқланган:
MODULE m1
CONTAINS
REAL FUNCTION s(x,y)
REAL, INTENT(IN) :: x,y
s = SIN(x) * COS(y) + COS(x) * SIN(y)
END FUNCTION s
END MODULE m1
!------------------------------------------------
MODULE m2
CONTAINS
REAL FUNCTION s(x,y)
REAL, INTENT(IN) :: x,y
s = COS(x) * COS(y) - SIN(x) * SIN(y)
END FUNCTION s
END MODULE m2
Бу ҳолда уларни қуйидагича ишлатиш мумкин:
PROGRAM modul_test
USE m1, m1s => s
USE m2, m2s => s
REAL x,y
DATA x,y/1.3,1.8/
WRITE(*,*) ’x+y нинг синуси =’, m1s(x,y)
WRITE(*,*) ’x+y нинг косинуси =’, m2s(x,y)
WRITE(*,*) ’x-y нинг синуси =’, s(x,y)
CONTAINS
REAL FUNCTION s(x,y)
REAL INTENT(IN) :: x,y
s = SIN(x)*COS(y) - COS(x)*SIN(y)
END FUNCTION s
END PROGRAM modul_test
Асосий программадаги ички қисм функция ўзининг s номи билан, m1, m2 модуллар-
даги функциялар мос ҳолда m1s, m2s номлар билан ишлатиляпти. Агар модулда
бир нечта функциялар аниқланган бўлсада лекин уларнинг баъзиларинигина асосий
программада ишлатиш талаб қилинаётган бўлса, ONLY кўрсатмасини қўллаймиз:
MODULE a_modul
CONTAINS
REAL FUNCTION s(x, y)
REAL, INTENT(IN) :: x, y
135


6 Программа структураси. Қисм программалар ва модуллар
s = SIN(x) * COS(y) + COS(x) * SIN(y)
END FUNCTION s
!----
REAL FUNCTION r(x, y)
REAL, INTENT(IN) :: x, y
r = SIN(x / 2) * COS(y) + COS(x) * SIN(y / 2)
END FUNCTION r
!----
REAL FUNCTION t(x, y)
REAL, INTENT(IN) :: x, y
t = SIN(x)**2 * COS(y) + COS(x) * SIN(y)**2
END FUNCTION t
END MODULE a_modul
Асосий программада:
PROGRAM modul_test
USE a_modul, ONLY: as => s, r ! a_modul даги 3 та функциядан 2 таси
! ишлатилиши мумкин
USE m2, m2s => s
REAL x, y
DATA x, y/1.3, 1.8/
...
CONTAINS
REAL FUNCTION s(x,y)
REAL, INTENT(IN) :: x,y
s = SIN(x)*COS(y) - COS(x)*SIN(y)
END FUNCTION s
END PROGRAM modul_test
Бу ерда a_modul даги s номли функция as ном билан, r эса ўзининг номи билан
ишлатилиши мумкин, t номли функцияни ишлатиб бўлмайди.
6.17 Хотиранинг умумий соҳалари
Фортранда глобал маълумотларни аниқлашнинг яна бир қуроли мавжуд – бу
COMMON-блок деб аталадиган хотиранинг умумий соҳаларидир. COMMON-блокка ном
бериш мумкин. Лекин программада фақат бир дона номсиз COMMON-блок ишлатиш,
номланганлари иҳтиёрий миқдорда бўлиши мумкин. Хотиранинг умумий соҳаси
COMMON оператори орқали ҳосил қилинади:
COMMON [/умумий_блок_номи/] рўйҳат [,/умумий_блок_номи/] рўйҳат...
Бунда умумий_блок_номи – шарт бўлмаган ном, рўйҳат – хотиранинг умумий соҳасига
жойлашиши керак бўлган ўзгарувчиларнинг номлари. Номли ва номсиз COMMON-
блокка мисол:
136


М. Нишонов, mnishonov@gmail.com
COMMON/asos/ x,y,z,index(10)
COMMON / / natija(210)
COMMON-блокка кирган ўзгарувчилар у аниқланган программа компоентда тавсифлан-
ган бўлиши лозим. Агар бирор ўзгарувчи бирор программа миқёсида COMMON-блокка
қўшилган бўлса, уни айни шу программадаги бошқа COMMON-блокка қўшиш мумкин
эмас. Умумий хотира блокига номланган доимийлар ва қисм программаларнинг
формал параметрлари, функциялар қўшилмайди. COMMON-блок бу хотира кесими
бўлиб, унга қўшилган объектлар ушбу кесимга аниқ кетма-кетликда жойлаштириб
чиқилади. COMMON-блокда кўрсатилган барча объектлар у аниқланган программа
компонентларининг барчаси учун кўринади. COMMON-блокка қўшилган объектларнинг
номи бир-хил бўлиши шарт эмас, фақат уларнинг узунлиги мос тушиши лозим.
Масалан, юқорида аниқланган номли COMMON-блок бошқа программа компонентида
қуйидаги кўринишда бўилиши мумкин:
COMMON/asos/ a,b,c,k(10)
Агар бирор қисм программада аниқланган COMMON-блок бошқа программаларда
аниқланмаган бўлса, у ушбу қисм программадан чиқилгач номаълум бўлиб қолади.
SAVE ҳусусият COMMON-блокнинг алоҳида объектларига ишлатилмайди. У COMMON-
блокнинг барча объектларига бирданига қўлланилиши мумкин, масалан:
SAVE /asos/
Модулларни ишлатиш COMMON-блоклардан бутунлай воз кечишга имкон беради.
COMMON-блокларнинг камчиликлари модуллардан мавжуд эмас.
Хотирани глобал аниқлашдан ташқари Фортранда объектларга ажратилган
жойни иқтисод қилиш имкони бор. Бу вазифа EQUIVALENCE оператори ёрдамида
амалга оширилади. Масалан,
REAL a,b,c,d,e
EQUIVALENCE (a,b), (c,d,e)
Бунда a ва b ўзгарувчиларга хотиранинг битта ягона соҳаси ажратилганини билдира-
ди, c, d, e ўзгарувчилар эса улар учун умумий бўлган бошқа хотирага кўчирилади.
EQUIVALENCE операторининг операндлари сифатида массивларнинг алоҳида
элементлари ва индекси кўрсатилмаган массивлар ишлатилиши мумкин. Қуйида
x(1) ва y(1) элементларни хотирада битта соҳада жойлашга мисол келтирамиз:
REAL x(100), y(10)
EQUIVALENCE (x,y)
Сон ва сон бўлмаган турга эга бўлган объектлар учун EQUIVALENCE операторини
ишлатиш мумкин эмас. Масалан:
REAL a
CHARACTER * 4 word
EQUIVALENCE (a,word) ! хато, рухсат берилмаган
137


6 Программа структураси. Қисм программалар ва модуллар
Лекин, бутун ва ҳақиқий турдаги ўзгарувчилар учун EQUIVALENCE оператори ишла-
тилиши мумкин:
INTEGER m(100)
REAL z(100)
EQUIVALENCE (m,z)
Бундай усулни қўллаш m ва z лар бир пайтнинг ўзида ишлатилмаганда мумкин:
лекин буни доим ёдда сақлаш талаб қилинади.
Узунлиги ҳар-ҳил бўлган объектлар учун ҳам EQUIVALENCE операторини ишла-
тиш мумкин:
CHARACTER(LEN=4) v
CHARACTER(LEN=6) w(2)
EQUIVALENCE (v,w(1)(5:))
Битта объектнинг элементларини ягона хотира катагига жойлаш мумкин эмас,
масалан:
EQUIVALENCE (w(1),v), (w(2),v)
Ягона хотира катакларига жойлашадиган объектлар фақат ўзгарувчи бўлиши шарт.
Формал параметрлар, йўлланмалар, ажратилган массивлар, функциялар ва структу-
ра компонентлари ягона хотирага жойлаштирилмайди.
Бир хил турга эга бўлган ҳосилавий турлар элементалари учун фақат улар
SEQUENCE ҳусусиятга эга бўлгандагина EQUIVALENCE оператори ёрдамида ягона хотира
ажратилиши мумкин. Яъни, уларнинг элементлари хотирада аниқ кетма-кетликда
жойлашганда:
TYPE ota_bola
SEQUENCE
REAL ota
INTEGER index
COMPLEX bola
END TYPE ota_bola
Иккита ёки бир нечта ўзгарувчилар учун хотирани ягоналаштиришда битта
ўзгарувчининг қийматини ўзгариши бошқасининг ҳам ўзгаришига олиб келади. Худди
шундай натижага b ўзгарувчини a га йўлланма қилиб тайинлаб келиш мумкин:
REAL, TARGET :: a
REAL, POINTER :: b
b => a
Ўзгариб турувчи хотирани ва автоматик массивларни қўллаб EQUIVALENCE операто-
рини ишлатишдан бутунлай воз кечиш мумкин.
138


М. Нишонов, mnishonov@gmail.com
6.18 Операторларнинг жойлашиш тартиби
Айни пайтда Фортраннинг деярли барча операторлари ва программа компо-
ненталарининг таркиби билан танишиб чиқдик. Энди программа компонентаси –
асосий ёки қисм программа ичида операторларнинг жойлашиш тартибини қараймиз.
Фортран операторлари икки гуруҳга бўлинади: бажарилувчи ва тавсифлаш оператор-
лари. Тавсифлаш операторларига турларни аниқловчи ва ҳусусиятларни белгиловчи
барча операторлар, ҳосилавий турларни аниқлаш операторлари, USE, IMPLICIT,
COMMON, EQUIVALENCE, FORMAT ва DATA операторлари киради. Тавсифлаш оператор-
лари сарлавҳадан сўнг жойлаштирилади ва доимо бажарилувчи операторлардан
аввал келади. FORMAT оператори бу қоидага бўйсунмайди. У USE операторидан аввал
жойлашмаслиги лозим. DATA оператори бажарилувчи операторлар орасида жойлаш-
ган бўлиши мумкин. Тавсифлаш операторларининг жойлашиш тартиби иҳтиёрий
эмас. Дастлаб USE оператори, кейин IMPLICIT ва PARAMETER операторлари ёзилади.
IMPLICIT NONE оператори барча IMPLICIT операторларидан олдин ёзилиши лозим.
Ҳосилавий турларни аниқлаш операторлари, интерфейс блоклар ва бошқа тавси-
139


6 Программа структураси. Қисм программалар ва модуллар
флаш операторлари IMPLICIT операторларидан сўнг жойлаштирилиши керак. Сўнг
бажарилувчи операторлар жойлаштирилади: процедураларга мурожаат қилиш опера-
тори, бошқарувчи конструкциялар, ўзлаштириш операторлари. CONTAINS оператори
бажарилувчи операторларни ички қисм программаларни аниқлаш қисмидан ажратиб
туради. Барча программа компоненталари END оператори билан тамомланади.
Мустақил ишлаш учун савол ва топшириқлар
1. juftlik номли ҳосилавий турни тавсифланг. Унда аниқланган ўзгарувчилар
ўзларини худди комплекс сонлар каби тутсин.
2. juftlik номли ҳосилавий турни стандарт турлар учун киритилган арифметик
амаллар билан тўлдиринг.
3. Тавсифланган ҳосилавий тур бошқа программа компонентларга кўриниши учун
нима қилиш керак?
4. juftlik турдаги бир нечта ўзгарувчиларни қурувчи ва уларниниг қийматлари-
ни печатга чиқарувчи программа ёзинг.
5. x
2
+ 3xy + y
2
+ 8 да x ва y лар juftlik маълумот турида бўлган ифоданинг
қийматини ҳисобловчи қисм программа ёзинг. Қисм программа ички ва ташқи
бўлган ҳолларни қараб чиқинг.
6. Ташқи ва ички қисм программаларни тавсифлашдаги фарқни тушунтириб
беринг.
7. Программада операторларнинг жойлашиш тартиби қандай?
8. Операторлар қандай гуруҳга бўлинади?
9. Хотиранинг умумий соҳаси қандай аниқланади?
10. Рекурсив функция нима?
140


7 чи БОБ
Қисм программаларни ишлатиш
Ҳеч қачон сабрни йўқотма,
бу барча эшикларни очувчи калитдир.
Антуан де Сент-Экзюпери.
Қисм программалар билан ишлашни қараймиз. Юқорида айтганимиздек Фор-
транда программа структураси (таркиби) бошқа барча алгоритмик тиллардаги каби
ягона асосий программа, қисм программалар ва модуллардан иборат бўлади.
Умумий ҳолда қисм программалар алоҳида файлларда сақланиши мумкин.
Катта ҳажмдаги программалар ёзишда қисм программалар алоҳида файлларда
сақлангани маъқул. Бу ҳолда алоҳида файлларда сақланган программа қисмлари
компиляция вақтида бир- бирига уланади.
Фортранда икки турдаги FUNCTION ва SUBROUTINE қисм программалар бор.
Уларнинг асосий фарқи, FUNCTION қисм программаси маълумот қийматини ўзининг
номи орқали ташийди (узатади) ва у ҳеч бўлмаганда битта аргументга эга бўлиши
шарт, SUBROUTINE ҳолида унинг номи унга мурожаат қилиш учун ишлатилади. Маъ-
лумот, аввал айтганимиздек, унинг параметрлари ёки глобал ўзгарувчилар орқали
бошқа программа компоненталарига узатилади. FUNCTION қисм программасининг
номи турга эга, у худди стандарт функциялар каби ишлатилади. SUBROUTINE қисм
программасига мурожаат эса CALL оператори ёрдамида амалга оширилади. Келгуси-
да ’қисм программа’ деганимизда иккала турдаги қисм программалар ва модулларни
назарда тутган бўламиз.
Бирор программа ва қисм программалар орасидаги тўғридан- тўғри алоқа
уларнинг формал параметрларини фактикларига алмаштириш орқали содир бўлади.
Қисм программаларда кодланган амалларга у чақирилаётган программада унинг
параметрлари орқали таъсир қилинади. Қисм программа ичида аниқланган ва унинг
параметрлари бўлмаган бошқа ўзгарувчилар ушбу қисм программа учун локал
ўзгарувчилардир. Улар фақат шу қисм программа ичидагина ишлатилади, улар
қисм программадан ташқарида кўринмайди.
141


7 Қисм программаларни ишлатиш
7.1 Формал аниқлаш
Қисм программа структурасини аввалги бобларда аниқлаган эдик. Асосий
программа структурасидан фарқи фақат бошланғич сатрда унинг номи аниқланади.
Шундай қилиб функция қисм программасининг шаклини яна бир бор эсга оламиз:
FUNCTION ном (арг1, арг2, ....)
[эълон қилиш операторлари]
[амаллар бажарувчи операторлар рўйхати]
END FUNCTION ном
SUBROUTINE қисм программаси учун:
SUBROUTINE ном (арг1, арг2, ....)
[эълон қилиш операторлари]
[амаллар бажарувчи операторлар рўйхати]
END SUBROUTINE ном
FUNCTION қисм программасида унинг номини тури эълон қилиниши зарур. Ушбу
номга қисм дастурда худди бошқа ўзгарувчилар каби қиймат ўзлаштирилади. Фор-
мал параметрлар ҳам тавсифлаш операторлари орқали аниқланган бўлиши керак.
Уларнинг турлари уларни чақираётган программада кўрсатилган турга мос тушиши
керак. Формал параметрларни қавс ичида жойлашган тартиби ва сони чақираётган
программадаги фактик параметрлар тартибга ва миқдорига мос келиши зарур.
Агар қисм программаси вазифаси унинг охиригача ёзилган буйруқлар ишала-
шидан аввалроқ тугатилишини хохласак RETURN операторидан фойдаланамиз.
7.2 FUNCTION қисм программаси
Биз аллақачон функция қисм программаси ғоясига Фортраннинг стандарт
функциялари ҳақида гапирганимзда учраган эдик. Стандарт функциялар кўпича
учрайдиган математик функциялар билан ишлаш учун махсус киритилган ўрнатил-
ган қисм программалардир. Лекин биз энди ўзимизни функцияларимизни функция
қисм программаси имкониятларини ишлатиб киритишимиз мумкин. Бундай қисм
программаларни ишлатишни бир нечта қулай томонлари мавжуд:
• Қандайдир ҳисоблашларни бажариш учун код бир матра ёзилади, лекин қайта-
қайта ишлатилиши мумкин.
• Функциялар программанинг бошқа қисмларидан алоҳида текширилиши мум-
кин. Бу эса уларни тўғри натижа бераётганини текшириш учун қулай. Бир
марта текшириб кейинчалик уларни катта программада ишонч билан ишлатиш
мумкин бўлади.
FUNCTION қисм программаси одатда ҳисоблашлар натижасида бир дона скаляр
ёки массив қайтарилганда қўлланилади.
142


М. Нишонов, mnishonov@gmail.com
Мисол: берилган учта бир ўлчамли a(1 : 10), b(1 : 15) ва c(1 : 20) массивларнинг
қайси бирини биринчи манфий элементи энг кичик?
Алгоритм:
1
o
. a, b, c массивлар киритилсин;
2
o
. a массивда биринчи манфий элемент қиймати ma топилсин;
3
o
. b массивда биринчи манфий элемент қиймати mb топилсин;
4
o
. c массивда биринчи манфий элемент қиймати mc топилсин;
! Агар массивларда манфий элемент бўлмаса
! мос ma, mb ёки mc қиймати нолга тенг деб олинсин.
5
o
. Агар ma + mb + mc = 0 бўлса, Массивларда манфий элемент мавжуд эмас кўри-
нишдаги маълумот чиқарилсин!
Акс ҳолда ma, mb, mc лар таҳлил қилинсин ва энг кичик қийматли манфий
элемент бор бўлган массив номи чиқарилсин!
[5
o
] тамом.
6
o
. Тамом.
2
o
, 3
o
, 4
o
қадамлар турли массивлар учун бир хил амални, биринчи манфий
элементни топиш масаласини ўз ичига олган. Юқорида сўз юритилган програм-
ма яратиш усулига мувофиқ ушбу қисм учун интерфейсни, яъни, киришдаги ва
чиқишдаги маълумотларни тавсифлаймиз. Сўнгра алгоритм тузамиз.
Киришдаги маълумотлар. Бир ўлчамли массив ва элементлар сони. Қисм учун
массив номини d, элементлар сонини n орқали аниқлаймиз.
Чиқишдаги маълумотлар. d массивнинг биринчи элементи қиймати ёки 0, агар
массивда манфий элемент мавжуд бўлмаса. Натижа учун md ном ишлатамиз.
Массивнинг биринчи манфий элементини қидириш учун алгоритм:
1
o
. i = 1 ! i- d массив элементи тартиб рақами
2
o
. md = d(i) ! цикл учун тайёрлаш
3
o
. md ≥ 0 ва i < n бўлганда:
i = i + 1
md = d(i) [бажарилсин]
[3
o
] цикл тамом.
4
o
. Агар md ≥ 0 у ҳолда md = 0 ! агар манфий элемен мавжуд бўлмаса
5
o
. Қайтариш. ! нол қийматни қайтарамиз
Ушбу қисм бир дона (md) қийматни қайтаради. Шунинг учун уни функция
кўринишида тайёрлаш мумкин. Фортранда функция ёрдамида қайтариладиган нати-
жа натижавий деб аталади ва унинг тури ҳамда номи функция тури ва номи билан
мос келади. Биз қараётган мисолда функция номи md бўлади.
143


7 Қисм программаларни ишлатиш
PROGRAM massive
INTEGER, PARAMETER :: na = 10, nb = 15, nc = 20
INTEGER a(na), b(nb), c(nc)
INTEGER ma, mb, mc, m3
INTEGER md
! md ташқи функция кўринишида
! тайёрланган, уни турини эълон қилиш
! зарур
!------------------------------------

!------------------------------------
ma = md(a,na); mb = md(b,nb); mc = md(c,nc)
IF(ma+mb+mc==0) THEN
PRINT*, ’ a,b,c массивларда манфий элемент мавжуд эмас’
ELSE
m3 = min(ma,mb,mc)
IF(ma==m3) PRINT*, ’a массивда’
IF(mb==m3) PRINT*, ’b массивда’
IF(mc==m3) PRINT*, ’c массивда’
END IF
END PROGRAM massive
!-----------------------------------
FUNCTION md(d,n)
! Функция номи
INTEGER md
! Натижавий ўзгарувчи
INTEGER n, d(n), i
! Ушбу функция биринчи манфий
! элементни қайтаради
! Агар манфий элемент мавжуд
! бўлмаса, 0 қиймат қайтаради
i = 1
md = d(i)
DO WHILE(md >= 0 .AND. i < n)
i = i + 1
md = d(i)
END DO
IF(md > 0) md = 0
RETURN
END FUNCTION md
Бошқа мисол: Ньютон усулида тенглама илдизини топиш учун функция ғоя-
сини ишлатамиз. Биз ёзмоқчи бўлган иккита функция қисм программасида ноли
қидирилаётган функцияни ва унинг биринчи ҳосиласини ҳисоблаймиз. Қисқалик
учун алгоритм яратмаймиз.
PROGRAM newton
144


М. Нишонов, mnishonov@gmail.com
!
! f(x) = 0 тенгламани Ньютон усулида ечиш
!
IMPLICIT NONE
INTEGER :: its = 0
! итерацияларни ҳисоблагич
INTEGER :: maxits = 20
! итерациялар максимал сони
INTEGER :: converged = 0
! тўйиниш
белгиси
REAL :: eps = 1.0e-6
! энг катта хатолик
REAL :: x = 2
! бошланғич тахмин
! цикл учун янги шакл
DO WHILE (converged == 0 .and. its < maxits)
x = x - f(x) / df(x)
WRITE(*,*) x, f(x)
its = its + 1
IF (ABS(f(x)) <= eps) converged = 1
END DO
IF (converged == 1) THEN
WRITE(*,*) ’Ньютон усулида натижа тўйинди’
ELSE
WRITE(*,*) ’Ньютон усулида натижа тўйинмади’
END IF
CONTAINS
! Функция қисм программалари
FUNCTION f(x)
REAL :: f, x
f = x**3 + x - 3.0
END FUNCTION f
FUNCTION df(x)
! f(x) нинг биринчи ҳосиласи
REAL :: df, x
df = 3 * x**2 + 1
END FUNCTION df
END PROGRAM newton
Ушбу мисолда эътибор бериш зарур бўлган кўп нарсалар бор.
• DO операторини ўзгарган шаклини ишлатдик. Олдиндан аниқланган миқдордаги
такрорланишлар ўрнига шартли цикл DO WHILE операторини ишлатдик.
• f ва df номли функция қисм программаларини аниқладик. Улар асосий програм-
мада CONTAINS операторидан кейин аниқланяпти, FUNCTION сўзидан бошланиб
END FUNCTION сўзи билан тамомланяпти. Бу усулда киритилган (алоҳида эмас)
145


7 Қисм программаларни ишлатиш
қисм программа ички қисм программа дейилади.
• Функция қисм программасининг номи ўзгарувчи каби аниқланяпти, уни тури
эълон қилиняпти ва унга қиймат бериляпти. Функция қисм программасининг
номи у ишлатилаётган программада ҳам худди ўзгарувчи сифатида аниқла-
няпти ва тури кўрсатиляпти.
• Бошланғич маълумот қиймати функция қисм программасининг аргументи
орқали узатиляпти, қавслар ичидаги ’x’ орқали. Эътибор беринг, аргументни
тури аниқланган бўлиши зарур.
– Программани компиляция қилинг ва ишлатиб кўринг. Чиқарилаётган
маълумотларни тушинишга ҳаракат қилинг. Бошқа функцияларни нолини
қидириш учун программани ўзгартириб кўринг.
7.3 SUBROUTINE қисм программаси
Агар алгоритм қисми бир нечта скаляр ёки массивларни натижа сифатида
қайтарса SUBROUTINE қисм программаси қўлланилади.
SUBROUTINE қисм программаси FUNCTION га ўхшайди, лекин у номи орқали
маълумот ташимайди. SUBROUTINE ўзининг аргументларини ўзгариши орқали маълу-
мотларни ўзгартиради. Қуйида SUBROUTINE га мурожаат қилишга мисол келтирамиз.
Бунда қисм программа ўзгарувчиларни қийматларини алмаштиради:
PROGRAM almashtir_asosiy
IMPLICIT NONE
REAL :: a, b
! Иккита қиймат ўқиймиз
READ(*,*) a, b
! Уларни қийматларини алмаштирамиз
CALL almashtir(a,b)
WRITE(*,*) a,b
CONTAINS
SUBROUTINE almashtir(x, y)
REAL :: x, y, temp
temp = x
x = y
y = temp
END SUBROUTINE almashtir
END PROGRAM almashtir_asosiy
• Программани компиляция қилинг ва киритилган қийматлар чиқарилгач нима
бўлганига эътибор беринг. Улар алмашиб қолган бўлиши керак.
• SUBROUTINE га мурожаат қилингач у аргументларини қандай ўзгартирганига
эътибор беринг.
146


М. Нишонов, mnishonov@gmail.com
• SUBROUTINE ва FUNCTION лар орасидаги муҳим фарқлардан бири, FUNCTION ҳеч
бўлмаганда битта аргументга эга бўлиши шарт, SUBROUTINE да эса аргументлар
бўлмаслиги мумкин.
7.4 Ўзгарувчиларнинг кўриниш соҳаси
Ўзгарувчиларни аниқлашда муҳим нарса уларни кўриниш соҳасидир. Функция
ичида ўзгарувчини INTEGER :: var кўринишда аниқлаймиз. Савол туғилади: бу ўзга-
рувчи бошқа функцияларга ҳам кўринадими, ушбу ўзгарувчи аниқланган функцияга
кўп марта мурожаат қилганимизда унинг қиймати сақланадими? Фортран ҳар-ҳил
турдаги ўзгарувчилар билан ишлайди ва юқоридаги саволга жавоб INTEGER :: var
ни қандай аниқлаганимизга боғлиқ. Қуйидаги жадвал қўйилган саволга аниқлик
киритишга ёрдам беради:
ўзгарувчи тури
кўриниш соҳаси
локал ўзгарувчилар
функция миқёсида аниқланган,
фақат шу функция ичида мавжуд
формал параметр
агар функция ичида аниқланган бўлса,
фақат шу функция ичида мавжуд
глобал ўзгарувчилар
берилган функциядан ташқарида аниқланган,
у аниқланган нуқтадан бошлаб мурожаат қилинган
ҳамма функцияларга кўринади
7.5 Локал ва глобал ўзгарувчилар
Локал ва глобал ўзгарувчиларнинг маъноси қисм программа тушунчаси кири-
тилгандан сўнг янада ойдинлашади. Қисм программа миқёсида (ичида) аниқланган
ўзгарувчилар шу қисм программа учун локал, ва улар ушбу қисм программадан
ташқарида кўринмайди. Агар ўзгарувчи асосий программадан аниқланган бўлса, ва
уни шу программанинг ички қисм программалари ҳам ишлата олса, бундай ўзгарувчи
глобал ўзгарувчи бўлади. Қуйида содда мисол қараймиз:
PROGRAM qiymat_ber
IMPLICIT NONE
REAL :: a, b
! a ни қийматини ўқиймиз
READ(*,*) a
CALL qiymatni_berish(b)
WRITE(*,*) b
CONTAINS
SUBROUTINE qiymatni_berish(x)
REAL :: x
x = a ! a ни қиймати асосий программадан олинади
147


7 Қисм программаларни ишлатиш
END SUBROUTINE qiymatni_berish
END PROGRAM qiymat_ber
Бу программа жуда сунъий, унда qiymatni_berish номли қисм программа аргумен-
тига асосий программадаги ўзгарувчининг қиймати бериляпти. Мисолда a ўзгарувчи
асосий ва қисм программа qiymatni_berish га глобал.
INTENT ва SAVE хусусиятлар
Биз қисм программалар аргументларини қандай ўзгартириши мумкинлиги-
ни кўрдик. Кўпинча қисм программанинг қайсидир аргументини ўзгартирилиши
мумкин, бошқа бири эса фақат қисм дастурга бошланғич маълумот беришга мўл-
жалланган бўлишини хохлаймиз. Юқорида ўзгармас сонларни қийматини ўзгариб
қолишдан ҳимоя қилувчи PARAMETER атрибути хақида гапирган эдик. Шунга ўхшаш
Фортран 90/95 да қисм программа аргументларини қайси бирини ўзгариши мум-
кинлигига ва бошқасини ўзгаришига йўл қўймайдиган имкониятлар бор. Ошкормас
ҳолда (рус. по умолчанию, инг. by default) қисм программанинг ҳамма аргумент-
ларини ўзгартириш мумкин. Аргументни ўзгариши ёки ўзгармаслигини сунъий
ҳимоялайдиган атрибут бу INTENT дир. У ўзгарувчини эълон қилиш рўйхатига қў-
шиб ёзилиши мумкин. Унинг қиймати қисм программа аргументини ўзгартириш
мумкин ёки йўқлигига қараб OUT, INOUT ёки IN бўлиши мумкин.
INTENT ни ишлатишга мисол:
SUBROUTINE name(arg1, arg2, ...)
REAL, INTENT(IN) :: arg1
REAL, INTENT(OUT) :: arg2
...
Қуйидаги мисолда x ўзгарувчи қийматини ўзгартиришга ҳаракат қилинса компиля-
тор хато хақида маълумот беради:
SUBROUTINE qiymatni_berish(x, y)
! y га x ни қийматини ўзлаштирамиз
REAL, INTENT(IN) :: x
REAL, INTENT(OUT) :: y
y = x
END SUBROUTINE qiymatni_berish
• Юқоридаги программани ўзгартириб уни ишлатишга ҳаракат қилинг.
• Биринчи аргументни қийматини атайин ўзгартириб программани ишлатинг ва
нима содир бўлишини кўринг.
Қисм программа учун локал бўлган ўзгарувчилар у кўп марта турли жойлардан
чақирилганда ўз қийматини сақлаб қолмайди. Бир марта чақирилгач кейинги чақи-
рувгача локал ўзгарувчини қийматини сақлаб туриш имкони бор. Бунинг учун
148


М. Нишонов, mnishonov@gmail.com
қиймати сақланиб туриши керак бўлган ўзгарувчининг аниқланиш рўйхатида SAVE
атрибутни ёзиш етарли:
REAL, SAVE :: local
Буни қисм программа аргументлари учун ишлатиб бўлмайди.
7.6 Модулларни ишлатиш
Программалар катталашган сари программа матни учун битта файлни ишла-
тиш ноқулай бўлиб қолади. Кўпинча бир матра ёзилган FUNCTION ва SUBROUTINE
қисм программаларни бошқа жойда ёзилган турли программаларда ишлатиш за-
рурати пайдо бўлиши ҳам мумкин. Худди шунга ўхшаш ҳолатлар учун программа
матнини қулай ташкил қилиш йўллари мавжуд. Хозир модул ғоясини ишлатиб турли
файлларда ёзилган программаларни бир- бирига қандай улаш мумкинлиги, қисм
программаларни бошқа жойларда қандай ишлатиш хақида гаплашамиз.
Турли файлларда сақланган программаларни бир-бири билан улашда модуллар
жуда фойдали қурол ҳисобланади. Уларни ишлатиш бир қанча қулайликларга эга:
1. Модуллар глобал маълумотларни аниқлаш учун жуда қулай ва уларни қисм
программаларга узатиш учун ишлатиш мумкин.
2. Модулда аниқланган ўзгарувчи ва бошқа объектлар программачи ҳоҳлаган
жойда кўринадиган қилиниши мумкин.
3. Модуллар бошқа программа ва қисм программаларга ўтказилиши мумкин.
Модулда аниқланган функциялар ва ўзгарувчилар ишлатишга тайёр ҳолда
бўлади. Компилятор модулда аниқланган функциялар ва бошқа объектларни
ҳудди стандарт аниқланганлари каби ишлатишга имкон беради.
Модулни аниқланиши қуйидаги кўринишда бўлади:
MODULE модул номи
[эълон қилиш операторлари]
[CONTAINS
[қисм программалар] ]
END MODULE модул номи
У ишлатилиши керак бўлган жойда USE оператори орқали аниқланади:
USE модул номи
• Ҳоҳлаганча миқдорда турли модулларни яратиш мумкин. Ҳар бир модул
алоҳида файлда сақланиши ва алоҳида компиляцияланиши мумкин.
• Модуллар турли программаларда ишлатилиши мумкин. Бир программани
ўзида бир неча марта ҳам ишлатилиши мумкин.
149


7 Қисм программаларни ишлатиш
• Модулда CONTAINS дан аввал аниқланган ўзгарувчилар шу модул ичида глобал
ва унда аниқланган барча қисм программалар учун глобал бўлади.
• Модулда
аниқланган
маълумотларни
асосий
программада,
ихтиёрий
SUBROUTINE да ёки бошқа модулда ушбу модул номини USE ёзуви орқали аниқлаб
ишлатиш мумкин.
Мисоллар қараймиз. Юқорида келтирилган almashtirish_asosiy программани
модул ғоясини ишлатиб қайта кўриб чиқайлик. Уни иккита файлга ажратамиз. Би-
ринчисини asosiy_almashtir.f90 каби номланган файлга сақлаймиз. Унда қуйидаги
матн ёзилган:
PROGRAM almashtirish_asosiy
USE mening_mudulim ! USE энг биринчи ёзилиши шарт
IMPLICIT NONE
REAL :: a, b
! иккита қиймат ўқиймиз
READ(*,*) a, b
CALL almashtir(a,b)
WRITE(*,*) a, b
END PROGRAM almashtirish_asosiy
Энди, mening_modulim_matni.f90 деб номланган файлда модулни аниқлаймиз:
MODULE mening_modulim
IMPLICITE NONE ! доим модулда ёзилиши керак
!
! Агар бўлса, глобал ўзгарувчиларни аниқлаймиз
!
CONTAINS
! Шу модулда аниқланадиган қисм программа
SUBROUTINE almashtir(x, y)
REAL :: x, y, temp
temp = x
x = y
y = temp
END SUBROUTINE almashtir
END MODULE mening_modulim
• mening_modulim_matni.f90 ни қуйидаги буйруқ ёрдамида компиляция қила-
миз:
gfortran -c mening_modulim_matni.f90
– Бу ерда -c опция компиляторга бажариладиган файл хосил қилиниши
шарт эмаслиги хақида ҳабар беради (бажариладиган файл хосил бўлмай-
ди).
150


М. Нишонов, mnishonov@gmail.com
– Қандай файл хосил бўлганлигини кўриш учун ls буйруғини ишлатинг.
mening_modulim_matni.mod ва mening_modulim_matni.o номли файллар
хосил бўлганлигини кўришингиз керак.
mening_modulim_matni.o файлда mening_modulim_matni.f90 да аниқланган қисм
программани компиляция қилинган коди сақланади. Модул ёзилган файл компиляция
қилинганда mod кенгайтмали файл хосил бўлади. Бу файл модулни программага
қўшиш учун зарур.
• Энди тўлиқ программадан бажариладиган файл хосил қилиш учун юқорида
компиляциядан сўнг олинган mening_modulim_matni.o ни асосий программа
asosiy.f90 га қўшиб компиляция қилиш керак бўлади:
gfortran -o almashtir asosiy.f90 mening_modulim_matni.o
Бунда -o опция almashtir деб номланган ишлайдиган файл хосил қилиш
кераклиги хақида компиляторга кўрсатма беради.
– almashtir ни ишлатиб қандай натижа бўлганини кўринг.
Модуллар ёрдамида глобал маълумотлар қандай хосил қилиниши мумкинлигига
мисол қарайлик. Келтирилган мисол модулларни ишлатиш ҳақидаги жуда содда
программа. Бу мисолда учта файл хосил қиламиз.
• Биринчи gm номли модул хосил қилиш учун gm.f90 деб номланган файлни
яратамиз: унда қандайдир глобал маълумот аниқланади, қисм программа бу
ерда йўқ.
MODULE gm
IMPLICIT NONE
! глобал маълумотни эълон қиламиз
REAL :: a_g, b_g
END MODULE gm
• Бу ерда IMPLICIT NONE ёзувига эътибор беринг: у ҳамма программаларда ёзи-
лиши шарт.
• Иккинчи модул ёзилган файлни setval.f90 деб номлаймиз ва унда setv номли
қисм программани аниқлаймиз:
MODULE setval
! глобал маълумотни кўринадиган қиламиз
USE gm
IMPLICIT NONE
CONTAINS
SUBROUTINE setv(a, b)
151


7 Қисм программаларни ишлатиш
REAL :: a, b
! глобал маълумот қийматларини ўзлаштирамиз
a = a_g; b = b_g
END SUBROUTINE setv
END MODULE setval
• Сўнгра асосий программа testset.f90:
PROGRAM testset
! глобал маълумотни қўшамиз
USE gm
! setval қисм программани кўринадиган қиламиз
USE setval
REAL :: x, y
! қийматларни экрандан ўқиймиз
READ(*,*) a_g, b_g
! x ва y ларни қийматларини ҳисоблаймиз ва натижани кўрамиз
CALL setv(x, y)
WRITE(*,*) x, y
END PROGRAM testset
• Иккала модулни компиляция қилинг:
gfortran -c gm.f90
gfortran -c setval.f90
• Энди асосий программани қўшиб компиляция қилинг, ишлайдиган файл хосил
қилинг:
gfortran -o testset testset.f90 gm.o setval.o
• testset ни ишлатиб натижани кўринг.
7.7 PUBLIC ва PRIVATE хусусиятлар
Юқорида кўриб чиқилган программалар модулларни ишлатишга бағишланган
содда мисоллар эди. Умумий ҳолда глобал маълумотлар ва қисм программалар бит-
та модулда аниқланиши мумкин. Лекин шундай ҳолатлар бўлиши мумкинки, унда
модулда аниқланган баъзи маълумотлар ҳамма программалар учун глобал бўлади,
баъзилари эса фақат ўша модулни ўзида ва унинг ичида аниқланган қисм програм-
маларгагина глобал бўлиши мумкин. Бу вазифани PUBLIC ва PRIVATE кўрсатмалари
ёрдамида бажарса бўлади. Қуйидаги мисолда a_g ўзгарувчи модулни ишлатган ҳам-
ма программалар учун глобал бўлади, b номли ўзгарувчи эса шу модулнинг ўзида
глобал:
152


М. Нишонов, mnishonov@gmail.com
REAL, public :: a_g
REAL, private :: b
Ноошкор ҳолда ҳамма ўзгарувчилар PUBLIC билан аниқлангандек бўлади.
Мустақил ишлаш учун савол ва топшириқлар
1. Программа компоненти нима?
2. Қандай турдаги қисм программалар бор?
3. FUNCTION қисм программаси қандай ишлайди?
4. SUBROUTINE қисм программаси қандай ишлайди?
5. MODULE қачон ишлатилади?
6. FUNCTION ва SUBROUTINE қисм программалар фарқи нимада?
7. Қисм программаларнинг параметрлари ҳақида гапириб беринг?
8. Формал параметр нима?
9. Фактик параметр нима?
10. Глобал ўзгарувчилар қандай хусусиятга эга бўлади?
11. Маҳаллий ўзгарувчилар қандай хусусиятга эга бўлади?
12. INTENT ва SAVE хусусиятлар ҳақида гапириб беринг.
153


8 чи БОБ
Массивлар
Ҳеч нарсамиз йўғу ҳеч нарса ҳам кам эмас,
Ҳеч нарсанинг йўқлиги бизга вале ғам эмас.
Баҳоуддин Нақшбанд
Кириш қисмида айтганимиздек, Фортран ҳисоблашларга йўналтирилган тил.
Ҳисоблашлар эса доим массивлар билан боғлиқ. Замонавий ҳисоблаш машиналари
амалларни вектор моделларини қурилмалар сатҳида бажара олади ва массивни
ягона бутун объект сифатида қараш имкони бор. Фортраннинг массивлар билан
ишлаш қуроллари ҳисоблашларни вектор тасаввурига мос келади: улар программачи
учун қулай бўлиши билан бирга турли архитектурали компьютерларда ишлаганда
программаларни юқори даражада оптимизациялашга имкон беради.
8.1 Массивлар ҳақида асосий маълумотлар
Массив – бир турдаги элементларнинг тартибланган тўпламидир. У элемент-
ларнинг тури, миқдори ва уларни рақамлаш усули билан тавсифланади. Элементлар
миқдори – массив ўлчами ёки узунлиги дейилади. Рақамлаш усули – бир ўлчамли
бутун турдаги массив орқали тавсифланади ва у массив шакли деб аталади.
Узунлиги нолга тенг – яъни элементлари мавжуд бўлмаган массивлар ҳам бор
деб фараз қилинади. Бундай массивлар кўпинча учрайдиган ҳолатларда жуда қулай
ҳисобланади. Масалан, чизиқли тенгламалар системаси
a · x
=
b
ни ечишда кесимларни қўллаш бунга мисол бўла олади:
DO i = n, 1, -1
x(i) = b(i) / a(i,i)
b(1:i-1) = b(1:i-1) - a(1:i-1,i)*x(i)
END DO
154


М. Нишонов, mnishonov@gmail.com
Циклнинг охирги қадамида кесим чегараси (1:0) га тенг; кесим ўлчами нол бўлиб
қолади, ва у билан ҳеч қандай амал бажарилмайди. Бу ҳолда айнан шу керак; нол
узунликдаги массив чегаравий ҳолда амалларнинг умумийлигини сақлашга имкон
беради.
Массивнинг қуйи чагараси юқори чегарасидан катта бўлиб қолганда массив
узунлиги доимо нолга тенгланади. Узунлиги нолга тенг бўлган массив шакли сақла-
нади: ҳар-хил шаклдаги узунлиги нолга тенг бўлган массивлар ўзаро мос эмас ва
уларни бинар амал учун операнд сифатида ишлатиш мумкин эмас. Яъни
a(6:7,7:6) + b(7:6,6:7)
ифода хато. Чунки a(6:7,7:6) кесим (2,0) шаклга, b(7:6,6:7) эса (0,2) шаклга эга.
Узунлиги нолга тенг массив доим қиймати маълум ҳолатда жойлашади.
Фортранда массив 7 тагача индексга эга бўлиши мумкин. Масалан,
a(3,4,i,j), b(1,2,3,4,5,6,7), c(k)
Индекслар миқдори массивнинг ранги дейилади; битта индексга мос элементлар
сони массив экстенти дейилади. Массивни аниқлашдаги кўриниши унинг шакли
дейилади. Масалан,
REAL, DIMENSION(10,23) :: a
INTEGER i(-1:8,-25:-2), k(-1:1,2:5,1,5,0:3)
Бу ерда a ва i массивлар бир хил шаклга эга, уларнинг учунлиги 10×23 = 230 га,
ранги 2 га тенг; k массивнинг шакли (3,4,1,5,4), ранги 4 га, узунлиги эса 3×4×1×5×4
= 240 га тенг.
Ҳар бир индексдаги чегаралар қуйидаги жуфтлик кўринишида берилади:
(қуйи_чегара : юқори_чегара)
Агар қуйи_чегара ёзилмаган бўлса, у 1 га тенг деб қабул қилинади.
Бир хил шаклли массивлар ўзаро мос дейилади. Массив ўлчами ва шакли
мос ҳолда SIZE ва SHAPE операторлари ёрдамида аниқланиши мумкин. Бу опера-
торлар массивларнинг ўлчами қиймати ўзгарувчан ифодалар орқали аниқланганда
қўлланилади.
Массивларни аниқлашни содда йўли уларни ўлчамини қавслар ичида кўрсатиш:
REAL :: a(3) ! a -- 3 та элементли массив: вектор
REAL :: m(3,3) ! m -- 2 чи рангли массив: матрица
Юқорида айтганимиздек, қавслардан иборат қисмни шакл деб аташади. Программада
массивнинг ҳар бир элементига шакл орқали мурожаат қилиш мумкин. Қуйида мисол
келтирамиз:
PROGRAM vector
IMPLICIT NONE
REAL :: v(3)
155


8 Массивлар
REAL :: x
INTEGER :: i
v(1) = 0.25
v(2) = 1.2
v(3) = 0.2
! вектор квадрати модулини ҳисоблаймиз
x = 0.0
DO i = 1,3
x = x + v(i)*v(i)
END DO
WRITE(*,*) ’Квадрат модул = ’,x
END PROGRAM vector
Барча элементлар бўйича йиғиндини қандай ҳисобланганлигига эътибор беринг.
Бошқа мисол, вектор ва матрицалар устида оддий амаллар қандай бажарилиши
мумкинлиги ҳақида:
PROGRAM linalg
IMPLICIT NONE
REAL :: v1(3), v2(3), m(3,3)
INTEGER :: i,j
v1(1) = 0.25
v1(2) = 1.2
v1(3) = 0.2
! бирлик матрица элементларига қиймат бериш
! ичма ич цикл ишлатамиз
DO i=1,3
DO j=1,3
m(j,i) = 0.0
END DO
m(i,i) = 1.0
END DO
! матрицани векторга кўпайтмасини ҳисоблаймиз
! v2i = mij v1j
DO i=1,3
v2(i) = 0.0
DO j = 1,3
v2(i) = v2(i) + m(i,j)*v1(j)
END DO
END DO
WRITE(*,*) ’v2 = ’,v2
END PROGRAM linalg
Массив элементлари бутун, комплекс ёки бошқа турдаги маълумотлардан иборат
бўлиши мумкин. Улар тавсифлаш операторлари орқали аниқланади. Келгусида, ’,’,
’:’ ва ’::’ белгиларни махсус табиатига эътибор беринг.
156


М. Нишонов, mnishonov@gmail.com
DIMENSION сўзини ишлатиб массивларни аниқлаш қуйидаги мисолда кўрсатил-
ган:
REAL, DIMENSION(10,11) :: a ! a -- 2 чи рангли матрица
Массив элементлари номерлари бирдан бошланади деб фараз қилинади. Лекин
ўлчамни аниқ кўринишини бериш орқали бу ҳолат ўзгартирилиши мумкин. Бунда
ўлчам қиймати бошланғич ва охирги номерларни икки нуқта билан ажратиш орқали
берилади:
REAL, DIMENSION(0:9) :: a ! a -- 10 та элементли массив,
! элемент номери 0 дан бошланади
Баъзида кўп ўлчамли массив элементларини хотирада жойлашиш тартибини
билиш фойдали. Қуйидаги массив элементларининг
A =


a
11
a
12
a
13
a
21
a
22
a
23
a
31
a
32
a
33


компьютер хотирасида жойлашиш тартибини ёзайлик:
A = {a
11
, a
21
, a
31
, a
12
, a
22
, a
32
, a
13
, a
23
, a
33
}
Яъни, элементлар дастлаб биринчи индекс ортиб бориши билан кетма-кет хотирага
жойланади.
8.2 Ўлчами номаълум массивлар ва автоматик
объектлар
Массивларнинг ўлчамларини олдиндан аниқлашни доим ҳам имкони бўла-
вермайди, масалан, қисм программанинг формал параметри сифатида ишлатилган
массив ўлчами мос фактик параметрдан олиниши талаб қилинсин. У ҳолда, массивни
тавсифлаш пайтида унинг шаклини кўрсатиш ёки индекснинг юқори чегарасини
кўрсатмаслик етарли. Конформ массивлар таркиби ўрнини алмаштирувчи қисм
программани мисол сифатида қарайлик:
SUBROUTINE replace(a, b)
REAL, DIMENSION(:) :: a, b
REAL, DIMENSION(SIZE(b)) :: r
r = a
a = b
b = r
END SUBROUTINE replace
157


8 Массивлар
SIZE(b) – стандарт функция массив узунлигига тенг бўлган бутун турдаги қийматни
қайтаради. У тавсифлаш операторларида аниқловчи ифода сифатида ишлатилиши
мумкин.
Энди бу қисм программани бошқа программа компонетидан чақирганда
REAL, DIMENSION(1:200) :: x,y
...
x=2; y=4
CALL replace(x,y)
a, b – массивларнинг индекси чегаралари x, y – фактик параметр сифатида ишла-
тилган массивларнинг чегараларини қабул қилади. Ўлчами номаълум массивлар
чегараларнинг айнан аниқ қийматларини эмас, экстентлар миқдорини қабул қилиб
олади. Яъни, x, y массивларнинг индекслари бошқа чегараларга эга бўлиши мумкин:
REAL, DIMENSION(201:400) :: x
REAL, DIMENSION(-99:100) :: y
Юқорида келтирилган қисм программадаги r – массив автоматик объектга мисол
бўлади. Бундай объектлар хотирада қисм программага мурожаат қилинганда ҳосил
қилинади ва қисм программадан чиқишда йўқ қилинади.
Автоматик объектга яна бир мисол, ўзгариб турувчи узунликка эга бўлган
матн ўзгарувчи:
SUBROUTINE matn(soz)
CHARACTER(LEN=*) soz
CHARACTER(LEN = LEN(soz)) ism
Қисм программа ишлаётган пайтда автоматик объектнинг узунлиги аниқлаб қўйи-
лади ва уни тавсифловчи ифоданинг қиймати ўзгарганда ҳам у ўзгармайди.
Агар функция натижаси узунлиги ўзгарувчан объект бўлса, бу функция интер-
фейси ошкор бўлиши керак.
Автоматик объектлар SAVE ҳусусиятга эга бўлолмайди, NAMELIST рўйҳатда,
COMMON-блокда ва EQUIVALENCE операторида ишлатилиши мумкин эмас.
Массивларни қисм программаларга узатиш
Массивлар қисм программаларнинг формал параметрлари сифатида ишлати-
лишида иккита махсус ҳолат бор.
Массивнинг шакли ва ўлчами маълум
Агар массивнинг ўлчами ва шакли маълум бўлса, массив фактик параметр
сифатида узатилаётганда, қисм программада уни аниқлашни такрорлаб қўйиш
етарли. Масалан, v ва r лар 3 та элементдан иборат вектор бўлсин. Уларни қисм
программага узатишда аниқлаш қуйидаги кўринишда бўлиши мумкин:
158


М. Нишонов, mnishonov@gmail.com
SUBROUTINE massiv1(v, r)
REAL :: v(3)
REAL :: r(3)
...
ёки DIMENSION ни ишлатиб
SUBROUTINE massiv1(v, r)
REAL, DIMENSION(3) :: v, r
...
Массивнинг шакли маълум, ўлчами маълум эмас
Ўлчами номаълум массивлар билан қандай ишлашимиз мумкин? Юқоридаги
фикрлани давом эттирамиз. Шундай қисм программа ёзмоқчимизки, у кўпгина
турли ўлчамли массивлар билан ишлашга имкон берсин. Масалан, массив ёрдамида
турли статистикаларни ҳисобламоқчимиз. Бу ҳолда қуйидагича ёзишимиз мумкин:
SUBROUTINE stats(x, xbar)
REAL, DIMENSION(:) :: x
REAL :: xbar
! локал ўзгарувчилар
INTEGER :: i, n
n = SIZE(x)
xbar = 0.0
DO
i = 1, n
xbar = xbar + x(i)
END DO
xbar = xbar / n
END SUBROUTINE stats
• Бу ерда шакли маълум лекин ўлчами маълуммас x массивни аниқладик. У
матрица эмас, вектор. Стандарт функция SIZE массив элементлари сонини,
бошқача айтганда вектор узунлигини аниқлаб беради.
• Худди шунга ўхшатиб икки ўлчамли массивларни, ёки матрицаларни ҳам
аниқлашимиз мумкин ва у қуйидаги кўринишда бўлиши мумкин:
REAL, DIMENSION(:,:) :: a2d
Агар массивларни чақирувчи программадан алоҳида файлга сақланган SUBROUTINE
қисм программасига узатишни ушбу шаклда аниқласак модул тушунчасини ишлатиш
мақсадга муофиқ.
159


8 Массивлар
8.3 Массивлар билан арифметик амаллар бажариш
Фортран 95 да жуда фойдали имконият бу массивларни тўла ўлчами билан
ишлашдир. Кўпчилик программалаш тилларида иккита бир ўлчамли (1 чи рангли)
массивларни қўшиш цикл орқали бажарилади. Масалан,
REAL :: a(10), b(10), c(10)
INTEGER :: i
...
DO i = 1, 10
c(i) = a(i) + b(i)
END DO
Фортран 95 да бундай ёзув қуйидаги кўринишда бўлиши мумкин (тўла ўлчам билан
ишлаш имконияти туфайли):
REAL :: a(10), b(10), c(10)
...
c = a + b
Қуйида массивлар билан ишлашда учрайдиган бошқа мисоллар келтирилган:
REAL, DIMENSION(3,3) :: a, b
REAL, DIMENSION(3) :: x, y, z
INTEGER, DIMENSION(10) :: idx
idx = 1
! idx элементларини ҳаммасини 1 га тенглаш
a = b
! b ни элементларини a элементларига кўчириш
x = y+1
! i=1,2,3 учун x(i) = y(i)+1
z = atan2(y,x) ! i=1,2,3 учун z(i) = atan2(y(i),x(i))
Бир қанча стандарт процедуралар ёрдамида массивлар устида турли амаллар
бажариш мумкин:
DOT_PRODUCT
бир ўлчамли иккита массивни аргумент сифатида
олади ва уларни скаляр кўпайтмасини ҳисоблайди
MATMUL
иккита мос ўлчамли матрицани кўпайтмасини
ҳисоблайди
MAXVAL
массив элементлари (бутун ёки хақиқий турдаги)
ичидан энг каттасини топади
MINVAL
массив элементлари (бутун ёки хақиқий турдаги)
ичидан энг кичигини топади
PRODUCT
массив элементларининг кўпайтмасини ҳисоблайди
SUM
массив элементларининг йиғиндисини ҳисоблайди
Ушбу
стан-
дарт қисм программалар ҳақида қўлланманинг ?? чи бобида тўлиқ маълумотлар
келтирилган.
160


М. Нишонов, mnishonov@gmail.com
8.4 Массив элементлари билан ишлаш
Массивларни элементларига мурожаат қилиб бошқа массивни аниқлаш мумкин:
• z(/1,3,6/) бу z(1), z(3), z(6) элементлардан иборат узунлиги 3 бўлган массив
• z(m:n) узунлиги (n-m+1) га тенг, номери m дан бошланиб n да тугаган элемент-
лардан иборат массив
• z(m:n:c) элементлари номери m дан бошланиб c қадам билан n гача ўзгарадиган
(n-m+1)/c узунликли массив
• x(1:5) = y(2:6) ёзув y массивни 2 дан 6 гача номерли элементларини x мас-
сивнинг номери 1 дан 5 гача бўлган элементларига кўчиради
• z(1:3) = y(1:5:2) ёзув y массивни 1,3,5 номерли элементларини z массивнинг
1,2,3 номерли элементларига кўчиради
• a(2,:) = z ёзув z векторни a нинг 2 устунига кўчиради
8.5 WHERE оператори
Шартли WHERE оператори ёрдамида массив элементлари билан осон ишлаш
мумкин, масалан, z массивнинг манфий қийматли элементларини уларнинг абсолют
қийматлари билан алмаштириш ёки фақат мусбат элементларни барча элементлари
йиғиндисига бўлиш мумкин:
WHERE (z < 0.0) z = -z
WHERE (a > 0.0) a = a / SUM(a)
Умумийроқ кўринишда қуйидагича ёзилади:
WHERE (массивни_мантиқий_текшириш)
[текшириш_натижаси_TRUE_бўлса_бажариладиган_ифода]
ELSEWHERE
[текшириш_натижаси_FALSE_бўлса_бажариладиган_ифода]
END WHERE
Мисол учун, массивнинг мусбат элементларини логорифмини ҳисоблаш учун қуйи-
даги программани ёзиш мумкин:
REAL, DIMENSION(1000) :: a
WHERE (a > 0.0)
a = LOG(a)
ELSEWHERE
a = 0.0
END WHERE
161


8 Массивлар
8.6 FORALL оператори
WHERE оператори массив элементларини бирор шартга кўра ажратишга, массив
кесимларини эса индекслар орқали танлашга имкон беради. FORALL оператори бу
иккала имкониятни бирлаштиради. Унинг синтаксиси қуйидаги кўринишга эга:
FORALL (индексли_ифода[, скаляр_мантиқий_маска]) тайинлаш_оператори
Масалан, индексларнинг (2:n, 4:m) ўзгариш оралиғида мусбат элементларни уларнинг
тескариси билан алмаштириш талаб қилинсин. У ҳолда
FORALL (i=2:n, j=4:m, a(i,j) > 0) a(i,j) = 1 / a(i,j)
кўринишдаги буйруқни ишлатиш мумкин. Агар бир нечта тайинлаш операторлари
ишлатилса у END FORALL оператор билан тамомланади:
FORALL (i = 1:n:2, j = n:1:2, a(i,j) /= 0.0 )
a(i,j) = 1.0 /a(i,j)
a(i,i) = b(i)
END FORALL
Бир қарашда FORALL операторининг вазифаси цикл операториникига ўхшаб ке-
тадигандек туюлади. Лекин у цикл операторидан кескин фарқ қилади. Дастлаб
индексли_ифода қиймати ҳисобланади, ундан кейин барча элементлар учун
скаляр_мантиқий_маска текширилади. .TRUE. қийматга эга бўлган индексли_ифода
учун ўзлаштириш операторининг ўнг томони ҳисобланади ва шундан сўнг ўзлаш-
тириш бажарилади. Содда мисол қараймиз. 1, 2, 3 ва 4 элементлардан иборат a –
массивнинг 2 ва 3 рақамли элементлари учун қуйидаги амални бажарайлик:
a(i) = a(i-1) + a(i) + a(i+1)
Цикл операторида
DO i = 2,3
a(i) = a(i-1) + a(i) + a(i+1)
END DO
ва FORALL операторида
FORALL (i=2:3) a(i) = a(i-1) + a(i) + a(i+1)
Цикл бажарилганда қуйидагини оламиз:
a(2) = 1 + 2 + 3 = 6
a(3) = 6 + 3 + 4 = 13
FORALL бўлса,
a(2) = 1 + 2 + 3 = 6
a(3) = 2 + 3 + 4 = 9
натижани беради.
162


М. Нишонов, mnishonov@gmail.com
8.7 Ўлчами ўзгариб турувчи массивлар
Аввал айтганимиздек массив ўлчамини доим ҳам олдиндан аниқлаб бўла-
вермайди. Бундай ҳолларда ўлчами ўзгариб турувчи массивларни ёки йўлланма
массивларни қўллаш мумкин.
Ўлчами ўзгариб турувчи массивларни тавсифлашда ALLOCATABLE ҳусусият
ишлатилади:
REAL, DIMENSION(:), ALLOCATABLE :: a
ва ўлчами аниқланиши зарур бўлган пайтда (масалан, у 10 та элементдан ташкил
топган бўлсин) уни қуйидагича аниқлашимиз мумкин бўлади:
m = 10
ALLOCATE(a(m))
бунда m бутун турдаги ўзгарувчи. Программада массивни ишлатиш тугаллангач,
хотира қуйидаги ёзув ёрдамида бўшатилиши мумкин:
DEALLOCATE(a)
Йўлланма массив ҳолида:
REAL, POINTER, DIMENSION(:,:,:) :: x
...
ALLOCATE(x(2:10, 3:k, -2:k-1), STAT = IER)
8.8 ALLOCATE, DEALLOCATE ва NULLIFY операторлари
ALLOCATE операторининг умумий кўриниши:
ALLOCATE(ажратилаётган_объектлар_рўйҳати[, STAT = ҳолати])
бу ерда ажратилаётган_объектлар_рўйҳати – массивлар ёки йўлланмалар номлари
рўйҳати. Уларнинг кўриниши
объект_номи[([қуйи_чегара:]юқори_чегара)]
Қуйи ва юқори чегара сифатида бутун турдаги скаляр ифода ишлатилиши мумкин.
Ноошкор ҳолда қуйи чегара қиймати 1 га тенг. Хотира ажратилаётган пайтда
чегаралар номаълум ва уларни ифодалар таркибида ишлатиб бўлмайди. Масалан,
битта оператор миқёсида SIZE операторини ишлатиш мумкин эмас:
ALLOCATE(x(n,n,n), y(SIZE(x))) ! хато, x нинг ўлчами ҳали номаълум
Лекин алоҳида оператор билан массив чегараларига йўлланмани ишлатиш тўғри
бўлади:
163


8 Массивлар
ALLOCATE(x(n,n,n))
ALLOCATE(y(SIZE(x))
Шарт бўлмаган STAT параметр хотира ажратиш амалини бажарилиш ҳолати ҳақида-
ги ахборотни ўзида ташийди. У бутун турдаги ўзгарувчи бўлиши лозим ва ажра-
тилаётган объектлар таркибига кирмаган бўлиши керак. Агар хотира ажратиш
мувофақиятли якунланган бўлса у 0 қиймат қабул қилади; акс ҳолда мусбат қий-
мат қабул қилади. Бу параметр ёзилмаганда хотира ажратиш амали бажарилмаса
программа ишини тугалланиши содир бўлади.
DEALLOCATE операторининг кўриниши
DEALLOCATE(ажратилаётган_объектлар_рўйҳати[, STAT = ҳолати])
ALLOCATE операториникига ўхшайди. Фақат индексларнинг чегаралари кўрсатилиши
шарт эмас. Шарт бўлмаган STAT параметри хотира бўшатилганлиги ҳақида маълумот
ташийди. Хотира бўшатилиши мувофақиятли тугаса у 0 қиймат қабул қилади; акс
ҳолда мусбат қиймат қабул қилади. Бу ҳолда ҳам агар хотира бўшатилиши амалга
ошмаса ушбу параметрни кўрсатмаслик программа ишини якунланишига олиб
келади.
DEALLOCATE оператори ажратилган соҳа билан боғлиқ бўлган манзилларга йўл-
ланмалар бўлганда ҳам хотирани бўшата олади. Бундай йўлланмалар манзилларга
боғлангунча номаълум ҳолатда жойлашган бўлади. Йўлланмаларни манзиллардан
озод қилиш учун NULLIFY оператори ишлатилади. Унинг кўриниши:
NULLIFY(йўлланма_объектлар_рўйҳати)
NULLIFY оператори йўлланмаларга боғланган манзиллар банд қилган хотирани бў-
шатмайди. Хотира фақат DEALLOCATE оператори ёрдамидагина бўшатилади.
Ўзгариб турувчи хотира билан ишлаганда хотирани ажратиш ва бўшатиш
кетма-кетлигини эътибор билан бажариш зарур. Кетма-кетликни бузилиши ишлатиб
бўлмайдиган хотирани пайдо бўлишига олиб келиши мумкин.
Ўлчами ўзгарувчан массив билан ишлашга мисол:
PROGRAM din_massiv
IMPLICIT NONE
INTEGER, ALLOCATABLE :: a(:)
INTEGER, PARAMETER :: m = 5
INTEGER i
ALLOCATE(a(m))
FORALL(i:m)
a(i) = 1
ENDFORALL
DO i = 1,m
WRITE(*,"(I4,\)") a(i)
164


М. Нишонов, mnishonov@gmail.com
END DO
WRITE(*,*)
DEALLOCATE(a)
END PROGRAM din_massiv
Ўлчами ўзгарувчан массив бўлганда модул, функция қисм программалари
билан ишлашга мисол:
!------------------------------------------------
! Модулни аниқлаймиз:
!------------------------------------------------
MODULE massiv
DOUBLE PRECISION, ALLOCATABLE :: a(:)
END MODULE massiv
!------------------------------------------------
! Массив элементларини йиғиндисини ҳисобловчи
! функция қисм программаси
!------------------------------------------------
DOUBLE PRECISION FUNCTION summa_massiv(b)
DOUBLE PRECISION, DIMENSION(:) :: b
summa_massiv = SUM(b)
END FUNCTION summa_massiv
!------------------------------------------------
! Хотирани бўшатувчи процедура қисм программаси
!------------------------------------------------
SUBROUTINE hotirani_tozala()
USE massiv
IMPLICIT NONE
DEALLOCATE(a)
END SUBROUTINE hotirani_tozala
!------------------------------------------------
! Асосий программа
!------------------------------------------------
PROGRAM misol_prog
USE massiv
IMPLICIT NONE
INTEGER, PARAMETER :: n = 7
165


8 Массивлар
DOUBLE PRECISION natija
! Функция қисм программаси учун интерфейс
INTERFACE
DOUBLE PRECISION FUNCTION summa_massiv(b)
DOUBLE PRECISION, DIMENSION(:) :: b
END FUNCTION summa_massiv
END INTERFACE
ALLOCATE(a(n))
a = 1.d0
natija = summa_massiv(a)
PRINT *, natija
CALL hotirani_tozala()
END PROGRAM misol_prog
Мустақил ишлаш учун савол ва топшириқлар
1. Белгили массивда навбатдаги элемент тартиб рақамини кўрсатувчи ҳосилавий
турни тавсифланг.
2. Икки ўлчамли массивни қўллашда қайси ифода тўғри ёки нотўғри эканлигини
аниқланг:
a(2:21,10), a(1,:), a(/1,7,5,13/,3), a(2,:)(5), a(:,35)
3. Қуйидаги массивларда бешинчи, ўнинчи ва охирги элементни танланг:
INTEGER, DIMENSION(11) :: id
REAL, DIMENSION(-5:27) :: r
COMPLEX, DIMENSION(10,10) :: z
REAL, DIMENSION(5,-3:2,4) :: v
4. REAL, DIMENSION(20,20,20) орқали тавсифланган массив учун
• қуйи текисликнинг биринчи сатрини;
• охирги вертикал диагонал устунни;
• (1,1,1) дан (20,20,20) индексли элементга ўтувчи диагонални
билдирувчи кесимни аниқланг.
5. Ихтиёрий ўлчамли учбурчак матрицани қурувчи программа ёзинг. Матрица
ўлчамини аниқловчи сон клавиатурадан киритилсин. Уни йўлланмалар массиви
кўринишида тасвирланг. Матрицани бутун сонлар билан тўлдиринг. Бунда
166


М. Нишонов, mnishonov@gmail.com
битта сатрнинг барча элементлари сатр тартиб рақамига тенг бўлсин. Қиймати
нолдан фарқли элементларни печатга чиқаринг.
6. WHERE оператордан фойдаланиб дастлабки N та натурал сонлар қаторидан барча
туб сонларни ажратиб олувчи ва уларни печатга чиқарувчи программа ёзинг.
7. N x N та дастлабки туб сонлардан иборат массив қуринг. Қурилган массивнинг
шаклини ўзгартиринг ва уни N x N массив кўринишда печатга чиқаринг.
8. Дастлабки 1000 та бутун сонлардан 3 чи рангли массив қуринг. FORALL опе-
раторидан фойдаланиб ушбу массивнинг диагонал кесимларидан барча туб
сонларни топинг.
9. Қуйидаги программада автоматик объектлар ва ўлчами номаълум массивларни
топинг:
SUBROUTINE misol2(n, x, y)
REAL, DIMENSION(n,n) :: f
REAL, DIMENSION(:,:) :: x
REAL, DIMENSION(:) :: y
REAL, POINTER, DIMENSION(:,:) :: d
INTEGER, DIMENSION(SIZE(y)) :: index
167


9 чи БОБ
INPUT/OUTPUT
Хотираси паст инсонлар ҳамиша
ўз виждонининг тозалиги билан фахрланишади.
Лев Толстой
Бу бобда маълумотларни киритиш ва чиқариш ҳақида сўз юритамиз. Дастлаб
файллар структураси ва уларга мурожаат қилиш усуллари ҳақида ахборот бера-
миз. Сўнгра маълумотларни киритиш ва чиқариш амалларининг ҳусусиятлари,
маълумотларни узатиш учун мўлжалланган ва кириш-чиқишда маълумотнинг кўри-
нишини назорат қилувчи (форматловчи) Фортран операторлари ва бошқалар билан
танишамиз.
9.1 Файллар
Файл – бу бир хил турдаги маълумотлар тўплами сақланган, компьютернинг
хотирасида (ишчи ёки доимий хотирасида) хотиранинг номланган қисмидир. Файл-
да одатдаги матн, рақамлардан иборат сонли маълумотлар, Фортранда ёки бошқа
тилда ёзилган программа учун бажарилувчи код ёки яна қандайдир бошқа ахборот
сақланган бўлиши мумкин. Фортранда файллар билан ишлаш учун турли хилда-
ги қуроллар мавжуд. Чунки кўпинча, ҳисоблашлар вақтида маълумотларни ўқиш
ёки программа ўз ишини тамомлагач натижани сақлаш, оралиқ натижа сифатида
маълум турдаги ахборотни вақтинчалик эслаб қолиш ва ҳ.к. ҳолатлар учрайди.
Бундай ҳолатларда ўқилаётган ёки дискка (ёки бошқа турдаги хотира қурилмасига)
ёзилаётган ахборот хажми жуда катта, маълумотлар шакли турли туман бўлиши
мумкин. Маълумотларни киритиш ва чиқариш амаллари одатда энг секин бажарила-
диган амаллар ҳисобланади. Шунинг учун маълумотларни узатиш ва қабул қилиш
усулларига алоҳида эътибор бериш талаб қилинади.
Ахборот файлларда сақланади ва файллар орасида ўзаро алмашинилади.
Экран, клавиатура ва шу каби бошқа стандарт киритиш-чиқариш қурилмаларига
махсус ташқи файллар мос қўйилади. Аксинча, Фортрандаги ҳар бир файлга унга
тўғри келадиган мантиқий қурилма мос қўйилади. Турли хилдаги мантиқий қурилма-
168


М. Нишонов, mnishonov@gmail.com
га бир дона физик хотира қурилмаси мос келиши мумкин. Кўпинча бундай қурилма
сифатида компьютернинг доимий хотира қурилмаси (қаттиқ диск) ишлатилади.
Ҳар бир файл ўзининг хусусиятлар тўпламига эга. Бу тўплам оперцион система
билан боғлиқ бўлади. Ушбу тўпламга файл номи, уни ишлатиш ҳуқуқи, вақтинчалик
белгилашлар (ҳосил қилинган, ўзгартирилган ва охирги марта мурожаат вақти)
кириши мумкин. Программани яратиш вақтида операцион системада файлга бериш
мумкин бўлган номлар ҳақида маълумотни аниқлаб олиш зарур.
Файлда жорий ҳолат файл кўрсатгичи орқали белгиланади. Файлда ёзилган
маълумотни ўқиш, уни ўзгартириш, маълумот қўшиш ёки ўчириш ҳақидаги ахборот
ўша кўрсатгич жойлашган ерда амалга оширилади. Кўрсатгич киритиш-чиқариш
амаллари бажарилганда ёки махсус буйруқлар ёрдамида файл бўйлаб кўчиб юради.
Файл маълум тартибда кетма-кет жойлашган ёзувлардан иборат бўлади. Ёзув
деб программа ва ташқи файл орасида ахборот алмашиниш бирлигига айтилади.
Ёзув – қийматлар ёки белгилар кетма-кетлигидан иборат бўлиб, файлга кириш эшиги
ҳисобланади. У терминалда ёзилган сатр ёки дискдаги файлда сақланган мантиқий
ёзув бўлиши мумкин. Ёзув тури ахборотни сақлаш ҳақидаги келишувларга асосланиб
аниқланади. Файлдаги барча ёзувлар битта ягона турга эга бўлади. Файл ҳосил
қилинган қоидаларга мос бўлмаган ёзувларни ишлатиш кутилмаган оқибатларга
олиб келиши мумкин. Айнан ёзув файлни ташкил қилиш усулини ва унинг ички
тузилишини аниқлаб беради.
Маълумот кўринишини назорат қилимайдиган (форматсиз) киритиш (READ) ёки
чиқариш (WRITE) операториларини ҳар бир чақирганда битта ёзув ҳосил қилинади.
Форматли READ, WRITE операторлар эса, агар шаклни аниқловчи белгилар ичида
ўнгга ётиқ қийшиқ чизиқ бўлса (’слеш’ – /), биттадан кўп ёзувни узатиши мумкин.
Фортранда учта турдаги ёзувлар билан иш кўрилади:
1. Форматли ёзув, ички тасаввурдан ташқига ўтишда кўринишини алмаштириш
учун назорат қилинган (форматланган) маълумотларни ўз ичига олган ёзувдир.
Форматли киритиш-чиқариш операторлари ошкор ҳолда форматлаш белгилари-
ни ёки NAMELIST рўйҳатлар белгисини ўз таркибига олган бўлади. Форматланган
маълумотларни фақат форматли киритиш-чиқариш операторларигина ўқий
олади.
2. Форматсиз ёзув, кўриниши назорат қилинмаган (форматланмаган) маълумот-
лардан иборат ёзувдир. Форматланмаган маълумотлар учун ички ва ташқи
тасаввурлар орасида алмаштириш бажариш талаб қилинмайди. Форматсиз ёзув
бўш бўлиши мумкин. Форматсиз ёзувнинг ички тасвири компьютер марказий
процессори билан боғлиқ бўлади. Форматланмаган ахборотни фақат форматсиз
киритиш-чиқариш операторларигина ўқий олади.
3. ’Файл охири’ ёзуви, файлдаги энг охирги ёзув. Бу ёзув файлган маълумотлар
ёзиш тўхтатилгач автоматик равишда ҳосил қилинади ёки ENDFILE оператори
ёрдамида ҳосил қилиниши мумкин.
Сақлаш муҳити нуқтаи назаридан Фортранда икки турдаги файллар фарқла-
нади: ташқи ва ички файллар. Ташқи файллар компьютер программасидан ташқа-
169


9 INPUT/OUTPUT
ридаги муҳитда жойлашган бўлади. Бундай муҳит сифатида, масалан, қаттиқ диск
хизмат қилиши мумкин. Ташқи файлда форматли ёки форматсиз маълумотлар
сақланиши мумкин.
Программада аниқланган бирор ўзгарувчи ўзини қаттиқ дискдаги файл ка-
би тутиши мумкин. Ўзгурувчи бундай равишда ишлатилганда уни ички файл деб
аташади. Иккита турдаги ички файл бўлиши мумкин.
1. Ички файл сифатида оддий белгили ўзгарувчи, белгили массив ёки бошқа
турдаги массив элементи ишлатилса. Бундай файл битта ягона ёзувни ўз
ичида сақлаган бўлади, ёзув узунлиги ўзгарувчининг, массив элементининг ёки
белгили бўлмаган массив элементининг узунлиги билан бир хил бўлади.
2. Ички файл белгили массив, белгили ҳосилаваий тур ёки бошқа турдаги массив
бўлганда. Бундай массив кўпгина ёзувлар кетма-кетлигидан ташкил топган
бўлади. Ёзувлар тартиби массив, ҳосилавий тур элементлари тартиби билан
мос тушади. Ёзув узунлиги массив элементи узунлиги, ҳосилавий тур элементи
узунлигига тенг бўлади.
Ички файллар учун фақат форматли киритиш-чиқариш қўлланилиши мумкин.
Номланган рўйҳатлар (NAMELIST) ни ишлатишга рухсат берилмайди. Ички файл-
лар билан фақат READ ва WRITE операторлари ишлай олади. OPEN, CLOSE, REWIND,
BACKSPACE ва INQUIRE операторларни улар билан ишлатиш мумкин эмас. Мисол
қалаймиз:
PROGRAM ichki_file
CHARACTER(10) :: qator, fnomi
INTEGER i,x,y,z
qator = "12 11 1969"
READ(qator, *) x,y,z
PRINT *, ’x = ’, x
PRINT *, ’y = ’, y
PRINT *, ’z = ’, z
i = 1
WRITE(fnomi, ’(’’fm’’,I3.3,’’.dat’’)’) i
PRINT *, ’fnomi =’, fnomi
END PROGRAM ichki_file
Бу программада qator ва fnomi ички файллардир. READ оператори x, y, z ларга
мос равишда 12, 11, 1969 қийматларни тайинлаяпти. WRITE оператори эса fm001.dat
номни ҳосил қиляпти.
Ҳар бир файл мантиқий қурилма билан боғланганлигини юқорида айтган
эдик. Мантиқий қурилма махсус белги орқали берилади. Ички файл учун мантиқий
қурилма белгиси бу – белгили ўзгарувчининг номи. Ташқи файл учун мантиқий
қурилма белгиси – OPEN операторида тайинланадиган бутун турдаги сонли қиймат
қабул қилувчи ифода, ёки ’юлдузча’ (*) белгиси. Ифода қиймати 0 дан 2 147 483 640
170


М. Нишонов, mnishonov@gmail.com
оралиқда жойлашган бўлиши керак. Мантиқий қурилма белгиси учун сон қиймат
умуман олганда ўзгариши мумкин.
Файллар билан амаллар бажаришдан аввал уни мантиқий қурилма билан
боғлаш лозим. Мантиқий қурилма билан боғланган файл очиқ дейилади. Боғланиш
OPEN оператори ёрдамида амалга оширилади. Мантиқий қурилмани бир пайтнинг
ўзида бир нечта файллар билан боғлаш ёки битта файлни бир пайтнинг ўзида
бир нечта қурилмалар билан боғлаш мумкин эмас. Аллақачон очиқ файлга OPEN
оператори ёрдамида кириш-чиқишдаги қандайдир параметрларини ўзгартириш учун
қайта боғланиш мумкин. Киритиш- чиқариш амали тамомлангач файлни ёпиш лозим.
Шундан сўнггина унда маълумотлар сақланиши тугалланади ва унга мурожаат
қилиш имкони пайдо бўлади.
Баъзи файллар ва уларга мос мантиқий қурилмалар автоматик равишда боғла-
нишади. Уларни алоҳида кўрсатмалар билан боғлашнинг зарурати йўқ. Масалан, 5
рақамли мантиқий қурилма стандарт киритиш қурилмаси – клавиатурага, 0 ёки 6
рақамли мантиқий қурилма стандарт чиқариш қурилмаси – мониторга мос келади.
Юлдузча (*) билан белгиланган мантиқий қурилмалар доим стандарт киритиш-
чиқариш қурилмалари билан боғланишади.
9.2 Маълумотларни узатиш операторлари
Маълумотларни узатиш операторлари маълумотларни киритиш ва чиқариш,
файлни мантиқий қурилма билан боғлаш, файл хусусиятларини ва файл кўрсатги-
чини маълум жойга ўрнатиш учун ишлатилади.
Ёзишга кўп вақт сарфламаслик учун маълумотларни киритиш ва чиқаришни
I/O (input, output сўзларини бош ҳарфлари) каби қисқартма билан белгилаб оламиз.
Мантиқий қурилма белгисини – мқб каби қисқартириб ёзамиз.
Фортранда I/O учун буйруқлар (операторлар)
Фортранда I/O ни амалга ошириш учун READ ва WRITE операторлари ишлатила-
ди. Киритилаётган ва чиқарилаётган маълумотларнинг кўриниши FORMAT оператори
ёрдамида назорат қилинади. Яна бошқача, белгили ўзгарувчилар орқали ҳам бу
мақсадга эришиш мумкин.
I/O ни бажариш қуйидагича амалга оширилади
READ(мқб, метка) рўйҳат
ва
WRITE(мқб, метка) рўйҳат
бунда мқб – ҳақида юқорида сўз юритдик, метка FORMAT оператори номери ёки ’*’,
юлдуз форматсиз ёзув учун ишлатилади.
Чиқарилаётган маълумотни аниқ кўриниши, айтиб ўтканимиздек, FORMAT опе-
ратори ёрдамида аниқланади. Уни кўриниши қуйидагича:
171


9 INPUT/OUTPUT
метка
FORMAT (формат_аниқлашлари)
• метка READ ёки WRITE операторида бериладиган бутун сон. Бир нечта READ,
WRITE операторлар бир пайтни ўзида битта метка ли FORMAT га мурожаат
қилиши мумкин.
• формат_аниқлашлари вергул билан ажратилган, чиқарилаётган маълумотни
кўринишини ташкил қиладиган белгилар рўйхати. Улар қўштирноқ ичига
олинган матн бўлиши ҳам мумкин.
FORMAT операторидаги формат_аниқлашлари қуйидагилар бўлиши мумкин:
nIw
бутун турдаги маълумотни чиқариш учун
nFw.d
вергули силжимайдиган хақиқий ёки
комплекс турдаги маълумотни чиқариш учун
nEw.d
силжувчи вергулли хақиқий ёки
комплекс турдаги маълумотни чиқариш учун
Aw
белгили ўзгарувчиларни чиқариш учун
n
такрорланиш сони, аниқланган шаклни рўйхатдаги миқдори
w
аниқланган шаклдаги белгилар миқдори,
ишора ва бўш жойлар билан биргаликда, соҳа кенглиги
d
w да вергулдан кейин ўнли сонлар миқдори
Файлдан ўқиш ёки файлга чиқаришда ўша файлга мурожаат қилиш учун
OPEN оператори ишлатилади. Уни ёзилиши қуйидагича:
OPEN (мқб, err=escape, action=action, file=’файл номи’)
Бунда
• мқб READ, WRITE операторларида берилган
• escape фараз қилинган файлни очишда муаммо бўлганда назорат қилиш
• action у файлни қандай ишлатишга қараб ’read’, ’write’ ёки ’readwrite’ бў-
лиши мумкин
• файл номи мурожаат қилинаётган файл номи, у албатта қўштирноқ ичида
ёзилади
Файл мқб орқали боғланган ҳолда, маълумот ўқилган бўлса, файлни бошига қайтиш
учун қуйидаги буйруқ ишлатилади:
REWIND(мқб)
Агар I/O бирор файл орқали тугалланган бўлса, файлни ёпиш учун CLOSE операто-
рини ишлатиш мумкин:
CLOSE(мқб)
172


М. Нишонов, mnishonov@gmail.com
Мисол қараймиз:
PROGRAM format1
IMPLICIT NONE
INTEGER :: i
DO i = 1,20
WRITE(*,1) i, i*i, i**3
END DO
1 FORMAT(i4,i6,i8)
END PROGRAM format1
• Программани компиляция қилиб ишлатиб кўринг. Чиқарилаётган маълумот
кўринишига эътибор беринг. Эркин форматли маълумот чиқариш учун програм-
мани ўзгартиринг. Аввалги чиқарилган маълумот кўриниши билан солиштириб
кўринг.
Кейинги мисол маълумотни файлга чиқаришга бағишланади:
PROGRAM fileio
IMPLICIT NONE
INTEGER :: i
OPEN(20, file=’cubes.dat’)
DO i = 1,100
WRITE(20,1) i, i*i, i**3
END DO
CLOSE(20)
1 FORMAT(i4,i6,i8)
END PROGRAM fileio
• Программани компиляция қилиб ишлатиб кўринг. Маълумотни иккита файлга
чиқадиган қилиб программани ўзгартиринг.
Қуйидаги мисолда Natija.dat файл 12 белгили мантиқий қурилма билан
боғланяпти ва унга маълумо ёзиб қўйиляпти:
OPEN(UNIT = 12, FILE = ’Natija.dat’)
WRITE(12, ’F9.3’) Tezlik
Экранга белгили доимийни чиқаришга мисол:
WRITE(*,’(1X,A5)’) ’Salom’
Қуйидаги мисолда маълумот дастлаб 6 рақамли мантиқий қурилмага чиқари-
ляпти, яъни компьютер экранига; сўнг шу рақамли қурилмага ташқи файл боғланиб
маълумт шу файлга ёзиляпти; охирида маълумот яна экранга чиқариляпти:
173


9 INPUT/OUTPUT
PROGRAM avto_ulangan_qurilma
REAL x,y
ekran_do: DO x = 0.1, 6.28, 0.1
y = SIN(x)
WRITE(6, ’(F3.1, F5.2)’) x, y
END DO ekran_do
OPEN(UNIT = 6, FILE = ’sin_jad’, STATUS = ’NEW’)
file_do:
DO x = 0.1, 6.28, 0.1
y = SIN(x)
WRITE(6, ’(F3.1, F5.2)’) x, y
END DO file_do
CLOSE(6)
WRITE(6, ’("sin jadvali toldirildi")’)
END PROGRAM avto_ulangan_qurilma
9.3 INQUIRE оператори
INQUIRE оператори файл ҳолати, мантиқий қурилма ёки чиқишдаги рўйҳат
ҳақида маълумот қайтаради. Уни ишлатишга мисол:
INQUIRE(FILE = ’Natija.dat’, EXIST = exist_chek)
Қуйида бошқа мисол қараймиз:
PROGRAM file_mavjudmi_yo_yoq
CHARACTER(LEN = 10) :: file_nomi
LOGICAL(1) :: mavjud_yo_yoq
DO WHILE(.NOT.mavjud_yo_yoq)
WRIET(*,’(1X,A\)’) ’Файл номини киритинг:’
READ(*, ’(A)’) file_nomi
INQUIRE(FILE = file_nomi, EXIST = mavjud_yo_yoq)
WRITE(*, ’(2A/)’) ’Файл топилмади ’, file_nomi
END DO
END PROGRAM file_mavjudmi_yo_yoq
Бу программада файл номи сўраляпти, кейин у мавжуд ёки мавжудмаслиги текши-
риляпти, агар мавжуд бўлмаса бошқа файл номи сўраляпти.
9.4 NAMELIST оператори
NAMELIST оператори ўзгарувчилар тўпламига умумий ном билан мурожаат
қилишга имкон беради. Шунинг учун уни номланган рўйҳат деб аташади. Унинг
кўриниши қуйидагича ёзилади:
NAMELIST /гуруҳ_номи/ ўзгарувчилар_рўйҳати ...
174


М. Нишонов, mnishonov@gmail.com
NAMELIST- гуруҳда
- ўзгарувчан чегарали массивларни;
- номаълум узунликдаги белгили ўзгарувчиларни;
- ўлчами ўзгарувчан массивларни;
- автоматик объектларни;
- кўрсатгичларни;
- компонент сифатида кўрсатгични ўз ичига олган ҳосилавий турдаги ўзгарувчи-
ларни;
- юқорида санаб ўтилган объектларнинг қисмларини
ишлатиш мумкин эмас.
Мисоллар:
NAMELIST /lst1/ yil, oy, kun /lst2/ nom, sarlavha
Номланган рўйҳатни ўқишга мисол:
NAMELIST /kirish_par/ raqam, bayroq, harorat, kompls, ar
READ(*,NML=kirish_par)
Бу рўйҳат учун кириш маълумотлари қуйидагилар бўлиши мумкин:
&Misol
raqam = 10
bayroq = .TRUE.
harorat = 299.5D0
kompls = (1.0D0, 0.1D0)
ar(3) = 41,42,43
/
NAMELIST- формати ҳақидаги маълумот киритиш-чиқариш операторида NML параметр
орқали аниқланади. NAMELIST ни форматли киритиш-чиқаришда ишлатиб бўлмайди.
Бошқа мисол, рўйҳатни чиқаришга:
PROGRAM namelist_misol
INTEGER a
REAL b
CHARACTER(LEN=10) :: hat
NAMELIST /royhat/ a, b, hat
a = 1
b = 1.0
hat = ’Royhat uchun chiqih’
175


9 INPUT/OUTPUT
OPEN(UNIT = 4, FILE = ’royh.dat’, DELIM =’APOSTROPHE’)
WRITE(UNIT = 4, NML = royhat)
CLOSE(4)
END PROGRAM namelist_misol
Бу программа ишлагач қуйидаги маълумотлар чиқарилади:
&royhat
a
=
1,
b
= 1.000000,
hat = ’Royhat uch’
/
9.5 I/O самарадорлигини ошириш
Киритиш-чиқариш амали энг секин бажариладиган амаллар сирасига кира-
ди. Агар программад жуда кўп миқдорда киритиш-чиқариш амаллари бўлса, бу
ҳол программа ишини ўта секинлаштириб юбориши мумкин. Киритиш-чиқариш
амалларини оптимизациялаш программа ишлаш тезлигини сезиларли тезлаштиради.
Бунда биринчи маслаҳат, иложи борича форматли киритиш-чиқариш амалларининг
миқдорини камайтириш, оралиқ маълумотларни ортиқча узатишлардан воз кечиш
керак.
Доимо, агар имкон бўлса, форматсиз киритиш-чиқариш амалларини ишла-
тишга ҳаракат қилиш лозим. Форматсиз маълумотлар узатиш пайтида маълумот
кўринишини алмаштиришни талаб қилмайди. Алмаштириш бўлмаса аниқликни
йўқолиши ҳам камаяди. Масалан, ar массив элементларини
WRITE(12) ar
оператор билан ёзиш
WRITE(12, ’(5(F9.3))’) ar
операторга нисбатан анча тез ишлайди. Массивларни элементлари бўйича эмас
бутунлигича узатиш керак. Массив элементларини улар хотирада қандай жойлашган
бўлса шундайлигича узатиш маслаҳат берилади.
Мустақил ишлаш учун савол ва топшириқлар
1. Файл нима?
2. Файлларни турини санаб ўтинг.
3. Ташқи файллар нима учун ишлатилади?
4. Ички файллар нима учун ишлатилади?
176


М. Нишонов, mnishonov@gmail.com
5. Форматли ва форматсиз киритиш-чиқариш амалларини самарадорлик нуқтаи
назардан солиштиринг.
6. Ёзув нима? У нима билан характерланади?
7. Маълумотларни алмаштириш учун формат_аниқлашлар нима учун ишлатилади?
8. Сон қийматлар учун формат_аниқлашларни санаб беринг.
9. Мантиқий қийматлар учун формат_аниқлашларни санаб беринг.
10. Белгили қийматлар учун формат_аниқлашларни санаб беринг.
11. Форматни бошқарувчи формат_аниқлашларни санаб беринг.
12. Комплекс қийматлар учун қайси формат_аниқлашлари ишлатилади?
13. Маълумотларни файлга сақлаш учун бажариладиган амалларни санаб беринг.
14. OPEN ва CLOSE операторларида ишлатиладиган белгилашларни тавсифланг.
15. INQUIRE операторининг вазифаси нима?
16. Номланган рўйҳатлар нима?
17. Киритиш-чиқариш амалларини оптимизациялаш ҳақида сўзлаб беринг.
18. Қуйидаги операторни бажаришда олинадиган натижа қандай:
WRITE(*,"(Hi)")
19. Программанинг қуйидаги қисми бажарилгач нима содир бўлади:
CHARACTER(LEN = 9) :: f
f = ’(1PG14.6)’
WRITE(*,F) 0.001, 1.0, 1000000
20. Қуйидаги формат аниқланишлари билан берилган қийматлар чиқишда қандай
кўринишда бўлади:
-123
(I4)
-227
(I3)
-113.214
(F6.1)
0.00012013 (E9.2)
177


Адабиётлар рўйҳати
1. http://gcc.gnu.org/wiki/GFortran
2. О. Бартеньев. Современный Фортран, 2005, Диалог-МИФИ
3. С. Немнюгин, О. Стесик. Современный Фортран, 2004, БХВ-Петербург
4. M.
Hermanns.
Parallel
Programming
in
Fortran
95
using
OpenMP,
http://www.openmp.org
5. Ф. Горелик. Средства поддержки параллельных вычислений в стандартах
языка Фортран, 2012, Препринт ИПМ им. М.В. Келдыша, № 68. URL:
http://library.keldysh.ru/preprint.asp?id=2012-68
6. M. Hjorth-Jensen. Computational physics, 2003, University of Oslo
7. R. Padman. Computational physics, 2007, University of Cambridge
8. А. Мудров. Численные методы для ПЭВМ на языках Бейсик, Фортран и Паскаль,
1991, Томск: МП "РАСКО"
9. Д. Мак-Кракен, У. Дорн. Численные методы и программирование на Фортране,
1977, Издательство "МИР"
10. Н. Калиткин. Численные методы, 2011, БХВ-Петербург
11. Е. Волков. Численные методы, 1987, Москва "Наука"
178






Download 1,08 Mb.

Do'stlaringiz bilan baham:
  1   2




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish