Arzu Erdem 2010-2011 BAHAR DÖNEMİ FORTRAN 2010-2011 Bahar Dönemi Matematik Bölümü ders notları Koceali Üniversitesi [email protected]
Arz
u E
rdem
20
10
-20
11
BA
HA
R D
ÖN
EMİ
FO
RT
RA
N
2010-2011 Bahar Dönemi Matematik Bölümü ders notları
Koceali Üniversitesi [email protected]
GİRİŞ
AMAÇ:
Problem çözme kavramını geliştirmek ve incelemek
Problem çözerken başka yollar düşünmek ve geliştirmek
Problemi çözmek için öncelikle, problemin nasıl bir duruşunun veya tavrının olduğunu
düşünmemiz gerekmektedir. Ve bu bazen göründüğü kadar kolay olmamaktadır. Bunun için
2 temel yöntem ele alınabilir:
1. Doğal diller
2. Yapay diller
DOĞAL DİLLER
Pek çok insanın kullanmış olduğu dillerdir. Fakat zaman zaman farklılıklar mevcut olabilir.
Örneğin
o 3 yaşındaki bir çocuk ile yetişkinin konuşması arasındaki farklar
o Bir araba yapımında, fizikçi ile mühendisin kullanmış olduğu dil arasındaki farklılıklar
o Yeni teknolojilerin kullanımlarının anlatılmasında işçi ve yöneticilerin kullanmış
olduğu diller, vb.
Veya doğal diller bazen çok anlamlı da olabilirler. Örneğin
Yaşlı bir adam ve kadın yolda yürüyorlar.==> Kadın ve adam ikisi de yaşlı mı?
Bu yüzden problemin tanımlanması ve çözülmesinde doğal dilleri kullanırken çok dikkatli
olmalıyız!
YAPAY DİLLER
En çok kullanılan yapay diller ise teknik terim ve notasyonlardır:
Terimler
o Sıcaklık (°C, °F)
o Basınç ((Pa)-Pascal, (N/m2) Newton/m2)
o Kütle ((kg), (g), (t) - ton), vb.
Notasyonlar
o Cebir (N,Z,Q,R,C ile gösterilen sayı kümeleri)
o Temel hesaplar ( )
o Mantık ( )
ALGORİTMA
Bir problemi veya problemin bir parçasını çözmek için kullanılan adımlar dizisidir.
Hata! Sıra belirtilmemiş.Tost ve yağda yumurta pişirmek için bir algoritma yazınız.
Öncelikle pişirmek için eksiklerimizin olup olmadığını kontrol etmek ve varsa bunları
tamamlamak işimizin yarısını yapmak demektir. Buna göre
1. İhtiyaç listesini belirleriz
sonra ise
2. Yapılacakları adım adım sıralarız. Burada adımlarımızın tam olması gerekmektedir. Örneğin
yumurta yapımında yağı koymadan yumurtaları kırarsak yumurtalarımız yanabilir gibi
PROGRAM DİLLERİ
PROGRAM DİLİ NEDİR?
Problemi çözmek için bilgisayarın anlamlandırdığı bir araçtır. Problemlerin çeşitliliği ile
birlikte programların çeşitliliği meydana gelmiştir.
Programın ilk olarak 0-1 i kullanan bir dijital araç olarak başlamıştır. Ve 0-1 ikilisinin
kullanımının yetersiz geldiği durumlarda ise programlar geliştirilmiştir.
FORTRAN (FORMULA TRANSLATİON)
1954’ten 1957 ye kadar IBM ve John Backus tarafından geliştirilen bir dildir. Problemlerin
bilimsel olarak çözülmesinde kullanılır ve öğrenmesi oldukça kolaydır. Bilimsel olarak hala
kullanılan bir dildir ve özellikle eğitim sektöründe uygun olması sebebiyle kullanılır. 1958 de
Fortan II versiyonu ile yenilenmiştir. Fortran III, Fortran IV, Fortran 66, Fortran 77, Fortran 90,
Fortran 95, Fortran 2003 ve Eylül 2010’da Fortran 2010 adıyla bilinen geliştirilmiş versiyonları
da mevcuttur.
COBOL (COMMON BUSİNESS ORİENTATED LANGUAGE)
İş dünyası tarafından kabul edilen bir programdır. Bilimsel hesaplamalardan daha çok daha
karmaşık tarzdaki problemler için kullanılır.
ALGOL
1950’lerde geliştirilen ve UNESCO tarafından desteklenen bir dildir. Ve Algol 60, Algol 68 gibi
versiyonları ile geliştirilmiştir.
PASCAL
Pascal’ı dizayn eden Niklaus Wirth, Algol 68’in disaynında bulunmuştur. Pascal görüntü
olarak Algol 68 ile benzerlikler taşırken daha etkili ve öğrenmesi daha kolay bir dildir.
BASİC (BEGİNNERS ALL PURPOSE SYMBOLİC INSTRUCTİON CODE)
Kemeny ve Kurtz tarafından Dartmouth da, 1960’larda geliştirilmiştir. Öğrenmesi kolay
olduğu gibi bazı yetersizliklerinden dolayı çok fazla eleştiri alan bir dildir.
C
Brian Kernighan ve Dennis Ritchie tarafından geliştirilen yüksek seviyede gelişmeler içeren
bir dildir.
MATLAB(MATRİX LABORATORY)
C, C++ ve Fortran dillerini içinde barındıran bir ara yüzdür. 1970 lerde University of New
Mexico’da Cleve Moler tarafından oluşturulmuş ve 2000 lerde MathWorks tarafından
geliştirilmiştir.
VERİ TİPLERİ
SABİTLER
INTEGER (TAM SAYI)
Tamsayı türüdür ve sınırlıdır. İşlemcinin ve bilgisayarın kapasitesine göre sınır değişir.
ÖÖÖrrrnnneeekkk:::
1234 tamsayıdır ancak 1234. değildir.
REAL (REEL SAYI)
8 basamağa kadar değişen bir sabittir.
ÖÖÖrrrnnneeekkk:::
1234.
1234E3=1234000
-23456. = -2.3456E4
DOUBLE
16 basamağa kadar değişen reel sayılardır. Reel sayılardaki E sembolü yerine D sembolü
kullanılır.
Örnek:
1234D3=1234000
CHARACTER (KARAKTER)
Tek harf veya harfler bütünüdür. Tek tırnak içinde yazılır.
Örnek:
‘S’
‘ ‘
‘Abab’
‘Bugün hava çok güzel’
Yanlış kullanım
‘Yanlış kullanım
Yanlış kullanım’
Karakter işlemlerinde kesme işareti kullanmak için iki kesme işareti tanımlanmalıdır.
ÖÖÖrrrnnneeekkk::: ‘Bugün Sıla’’nın doğum günü’
LOGİCAL (MANTIKSAL)
Doğru ve yanlış değerlerini alan mantıksal sabitlerdir.
ÖÖÖrrrnnneeekkk::: . true ve .false
COMPLEX (KOMPLEKS SAYILAR)
Kompleks sayılar reel sayı ikilileri olarak tanımlanır.
ÖÖÖrrrnnneeekkk::: (1.2345,-6.5E4) 1.2345 reel kısım, -6.5E4 sanal kısım olarak tanımlanır.
DEĞİŞKENLER
Değişkenler, programın depoladığı giriş, çıkış, sabit ve ara değerlerdir. Değişkenlerin
isimlerinde alfabetik karakter ve sayı bulunabilir. Ancak isimler harflerle başlamalıdır ve 31
karakterden uzun olmamalıdır. Ayrıca değişkenleri programın başında tanımlamalıyız!
ÖÖÖrrrnnneeekkk:::
A3, A_2, loop3, sam, A3B4 Doğru
123x, 0A, _abc Yanlış
Fortran büyük ve küçük harf ayrımı yapmaz!
ÖÖÖrrrnnneeekkk::: NUMBER ve NUMber isimli değişkenler aynıdır!
Sabitler gibi değişkenlerinde tipleri mevcuttur ve tipler sabit tipleri gibidir. Programın
başlangıcında değişken tiplerini tanımlarken çok dikkatli olunmalıdır. Eğer değişken
tanımlamayı yapmazsanız, Fortran otomatik olarak bir belirleme yapar:
I,J,K,L,M,N harfleri ile başlayan değişkenler tam sayıdır,
A -H ve O – Z harfleri ile başlayan değişkenler reel sayı olarak atanır.
CHARACTER*7:: PROG PROG=’FORTRAN’
EKRANA YAZMAK
VARSAYILAN FORMATTA YAZMAK
EKRANA YAZMAK
VARSAYILAN FORMATTA YAZMAK
LOGİCAL:: D D=.TRUE.
PROGRAM NASIL YAZILIR VE ÇALIŞTIRILIR?
Fortran ara yüzü için kullanılacak program Force 2.0 dır.
Yeni dosya açmak için FİLE –NEW
Var olan dosyayı açmak için FİLE –OPEN
En son açılmış olan dosyaları açmak için FİLE – REOPEN
Kaydetmek, Farklı formatta kaydetmek ve tüm dosyaları kaydetmek için FİLE –SAVE,
FİLE –SAVE AS, FİLE –SAVE ALL kullanılır. Dosya uzantıları .f olarak kaydedilir.
Programı veya tüm programları kapatmak için FİLE – CLOSE, FİLE – CLOSE ALL
Programı çalıştırmak için RUN (F9)
Programı derlemek için RUN – COMPİLE (CTRL+F9)
Derlenen programı açmak için RUN – EXECUTE (SHİFT + F9)
Programı durdurmak için RUN – STOP (CTRL+ F12)
WRİTE(*,*)
Programın çıktılarının ekranda görünmesi ve yazdırılması için kullanılır. Parantez içindeki ilk *
işareti çıktının nereye yazılacağını ikinci * ise hangi formatta yazılacağını belirtir.
WRITE(*,*)
READ(*,*)
Programın girişlerinin okunması için kullanılır. Write da olduğu gibi parantez içindeki ilk *
işareti çıktının nereye yazılacağını ikinci * ise hangi formatta yazılacağını belirtir.
READ (*,*)
Klavye
Read (*,*)
Bilgisayar
PROGRAMI ADLANDIRMAK VE BİTİRMEK
Program yazarken aşağıdaki gibi program ile başlamalı stop ve end ile bitirmeliyiz.
Program Program_adı …. İşlemler …. Stop End Program_adı
Programı kaydederken kaydedeceğimiz ad ve Program_adı aynı olmak zorunda değildir
ancak hangi programın neyi ifade ettiğini anlamamız açısından aynı adları vermekte fayda
vardır.
COMMENT (YORUM) SATIRLARI
Çalışmayan ve yorumda bulunulacak veya açıklama yapılacak satırlar için C, ! işaretlerinden
biri kullanılır.
ÖÖÖrrrnnneeekkk::: “Merhaba tanıştığıma memnun oldum. Ben …” yazdıran program,
hi.f
ÖÖÖrrrnnneeekkk::: İki sayının toplamını yazdıran program,
top.f
ÖÖÖrrrnnneeekkk::: Değişken tiplerinin hassasiyeti ile ilgili program. (x=3.4 y=3 ve tanımlama integer
olarak ve x/(x-y) ifadesini buldursun!),
Degisken.f
ÖÖÖrrrnnneeekkk::: Kompleks sayılarda 4 işlemi hesaplayan program,
Kompleks.f
Bilgisayar
write (*,*)
Ekran
OPERATÖRLER
ARİTMETİK OPERATÖRLER
Operator Açıklama
+ Toplama veya pozitif sayı
- Çıkarma veya negatif sayı
* Çarpma
/ Bölme
** Kuvvet
MATEMATİKSEL FONKSİYONLAR
Fonksiyon Açıklama
ABS (x) X in mutlak değer
COS (x) x in Cosine değeri (radian olarak)
EXP(x) Exponential Fonksiyon
INT(x) X’in tam kısmı
LOG(x) X in doğal logaritması
MAX(xl, . . . , Xn) xl, . . .,xn ‘nin Maximumu
MIN(xl, . . . , xn) xl, . . ., xn ‘nin Minimumu
MOD(x,y) x (mod y); x - INT(x/y) * y
NINT(x) X in en yakın tamsayıya yuvarlatılması
SIN(x) X in Sine değeri (radian olarak)
SQRT(x) x in karekökü
MANTIKSAL OPERATÖRLER
Operator Açıklama
.NOT. Mantıksal negatiflik
.AND. Mantıksal birleşme
.OR. Mantıksal ayrılma
.EQV. Mantıksal eşitlik
.NEQV. Mantıksal eşitsizlik
.NOT.
Logic 1 .NOT. (Logic 1)
TRUE FALSE
FALSE TRUE
.AND.
Logic 1 Logic 2 (Logic 1) .AND. (Logic 2)
TRUE TRUE TRUE
TRUE FALSE FALSE
FALSE TRUE FALSE
FALSE FALSE FALSE
.OR.
Logic 1 Logic 2 (Logic 1) .OR. (Logic 2)
TRUE TRUE TRUE
TRUE FALSE TRUE
FALSE TRUE TRUE
FALSE FALSE FALSE
.EQV.
Logic 1 Logic 2 (Logic 1) .EQV. (Logic 2)
TRUE TRUE TRUE
TRUE FALSE FALSE
FALSE TRUE FALSE
FALSE FALSE TRUE
.NEQV.
Logic 1 Logic 2 (Logic 1) .NEQV. (Logic 2)
TRUE TRUE FALSE
TRUE FALSE TRUE
FALSE TRUE TRUE
FALSE FALSE FALSE
ÖÖÖrrrnnneeekkk::: employed=.true, age=50 ” test = employed .AND. (age<45)” değeri nedir?
ÖÖÖrrrnnneeekkk::: name = ‘James’ ” test = (name='Dimitris') .OR. (name='James')” değeri nedir?
ÖÖÖrrrnnneeekkk::: big=100, small=2 ” test = .NOT. (big>small)” , “test = .NOT. test” değerleri nedir?
ÖÖÖrrrnnneeekkk::: “test = (5*3>12) .EQV. (6*2>8)”, “test = (5*3<12) .EQV. (6*2<8)” değerleri nedir?.
ÖÖÖrrrnnneeekkk::: “test = (5*3>12) .NEQV. (6*2>13)”, “test = (5*3>12) .NEQV. (6*2<13)” değerleri
nedir?.
Operatorler.f
İLİŞKİSEL OPERATÖRLER
Operator Açıklaması
.LT. Küçük
.LE. Küçük veya eşit
.EQ. Eşit
.NE. Eşit deği
.GT. Büyük
.GE. Büyük veya eşit
İŞLEM ÖNCELİĞİ
Sıra İşlem Bilgisayar Dili
1 Parantezler ()
2 Üs alma A**B
3 Çarpma ve Bölme A*B, A/B
4 Toplama ve Çıkarma A+B, A-B
ÖÖÖrrrnnneeekkk::: Aşağıdaki ifadeleri dışarıdan girilen değerler için sonuçları bulduran programlar,
A+B-C+2AB-7,
,
,
,
,
KONTROL İFADELERİ
IF KOŞUL
If karar yapısı, bir koşul sağlandığı zaman yapılacak işlemleri kapsar. Kontrol edilecek koşul
ifadesinin sonucu True değerini alırsa, If End If bloğu arasındaki kodlar çalıştırılır.
If (Şart) Then Komutlar ElseIf (Şart) Komutlar ElseIf (Şart) Komutlar … Else Komutlar End If
Eğer birden fazla koşulumuz yoksa ancak birden fazla komutumuz varsa
If (Şart) then Komutlar End If
Tek şartımız varsa Then ve End If kullanmayabiliriz.
IF (TODAY.EQ.MONDAY) THEN
.
ELSEIF (TODAY.EQ.TUSDAY) THEN
.
ELSEIF (TODAY.EQ.WEDDAY) THEN
.
ELSEIF (TODAY.EQ.THRDAY) THEN
.
ELSEIF (TODAY.EQ.FRIDAY) THEN
.
ELSEIF (TODAY.EQ.SATDAY) THEN
.
ELSEIF (TODAY.EQ.SUNDAY) THEN
.
ELSE
there has been an error. The variable TODAY has
taken on an illegal value.
ENDIF
If (Şart) Komutlar
Örnek:
1 , 0
,0 2( )
3 ,2 4
4 , 4
x
x xf x
x
x x
ile tanımlanan fonksiyonun dışarıdan girilen “x” değerine
göre ( )f x ’i hesaplayan program,
Örnek: 2( ) 5 3f x x x fonksiyonu için sgn ( )f x fonksiyonunu hesaplayan ,
Örnek: Dışarıdan girilen herhangi bir sayının negatifi pozitif veya 0 olduğunu veren program,
Örnek: Dışarıdan girilen bir sayının tek mi çift mi olduğunu veren program,
Örnek: Dışarıdan girilen 2 sayıdan büyük olanı veren programı yazınız.
Örnek: 1.vize ve 2. Vize durumlarına göre not hesabı yapan ve geçmesi için finalden kaç
alması gerektiğini veren program,
SELECT CASE
Tekrarlamalı If koşulu yerine Select Case yapısı da kullanılabilir.
SELECT CASE( ifade ) CASE( değeri ) koşullar ... CASE DEFAULT koşullar END SELECT
select case season
case ('summer')
leaves = .true.
sun = .true.
case('winter')
leaves = .false.
sun = .false.
case('spring','autumn')
leaves = .true.
sun = .false.
case default
write(*,*) 'mistake in season name'
end select
Örnek: Verilen aya göre hangi mevsimde olduğu belirten program,
Örnek: Belirtilen tarihteki ayın kaç gün sürdüğünü veren algoritmayı yazınız.
AY.f
Örnek: Dışarıdan girilen tek haneli bir sayıyı yazı ile yazdıran programın VBasic dilinde yazınız.
SAYI.f
Örnek: Katlı bir otoparkta arabalar girişte plaka numaraları, sahibinin adı ve giriş saati kaydedilecektir. Garaj yöneticisi araba sahibi gelip plakasını veya ismini söylediğinde arabanın kalma süresi ile orantılı olan ücretini bulup fişini kesebilecek program,
OTOPARK.f
0 - 2 saat 1,5 YTL
2 - 8 saat 3 YTL
8-24 saat 5 YTL
Örnek:
Koc - 21 Mart - 20 Nisan
Boga - 21 Nisan - 20 Mayıs
Ikizler - 21 Mayıs - 21 Haziran
Yengec - 22 Haziran - 22 Temmuz
Aslan - 23 Temmuz - 23 Ağustos
Basak - 24 Ağustos - 23 Eylül
Terazi - 24 Eylül - 23 Ekim
Akrep - 24 Ekim - 22 Kasım
Yay - 23 Kasım -21 Aralık
Oglak - 22 Aralık -20 Ocak
Kova - 21 Ocak - 19 Şubat
Balik - 20 Şubat - 20 Mart
Burç çizelgesine göre ay ve günü girdiğimizde hangi burcumuzun olduğunu veren program.
BURC.f
GOTO
Programı durdurmadan önce başka bir ifadeye yönlendirmek istiyorsak GOTO ifadesini
kullanırız.
...
IF( x<10 ) GOTO 10
...
10 STOP
Örnek: Yaş girişi ve negatif sayı girilmesi durumunda tekrar giriş yaptıran program,
DO
DO *kontrol cümlesi+ komutlar END DO
Veya
DO sayac = başlangıç, bitiş [,adım] komutlar END DO
Döngüleri yazarken çakışmamasına veya kontroller le birlikte düzgün kullanımına dikkat
ediniz!
main: IF( sum>100 ) THEN
inner: DO i=1,n
...
END IF main
END DO inner !illegal, inner must be within main
EXİT
Koşullu olarak DO döngüsünden çıkmak için kullanılır.
do
ifadeler if (mantıksal ifade) exit komutlar end do
Örnek: Dışarıdan girilen N sayısına göre 1’den N’e kadar olan sayıların karelerinin toplamını
hesaplayan program,
DO1.f
Örnek: Dışarıdan girilen N sayısına göre; T1,1’den N’e kadar sayıların toplamı; T2, 1’den N’e kadar tek sayıların toplamı; T3 de 1’den N’e kadar çift sayıların toplamıdır. Buna göre T1, T2,
T3 değerlerini hesaplayan program
DO2.f
Örnek: 1-N arasında girilen pozitif sayılardan negatif sayı girişi olduğunda döngüden çıkıp
yeniden giriş yapmasını sağlayan program,
DO3.f
Örnek: Tüm kenarları tamsayı ve hipotenüsü 20’den küçük olan tüm dik üçgenleri bulduran program
Örnek: Dışarıdan girilen bir N tamsayısı için 1-N arasında kaç tane asal sayı olduğunu bulduran program
Örnek: Dışarıdan girilen N değerine göre (N>20), 0-N arası tüm sayıların toplamını, 5-N-6 arası tek sayıların çarpımını, 14-N arası çift sayıların toplamını hesaplayan program
Örnek: ln 1 x fonksiyonun seriye açılımı ......432
)1ln(432 xxx
xx şeklindedir.
Buna göre dışarıdan girilen x için ln 1 x değerini hesaplayan program,
Örnek: arctan x fonksiyonun seriye açılımı ......!5!3
arctan53 xx
xx şeklindedir. Buna
göre dışarıdan girilen x için arctan x değerini hesaplayan program
Örnek: Dışarıdan girilen x için ......53
53 xxxT ; 1x değerini hesaplayan program,
Örnek: Dışarıdan girilen x için ......5
1
3
1153 xxx
T ; 1x değerini hesaplayan
program,
Örnek: Dışarıdan girilen x için ......3
)1(
2
)1(13
3
2
2
x
x
x
x
x
xT ; 2/1x değerini
hesaplayan program,
Örnek: Dışarıdan girilen n sayısına göre 2222
11......
3
11
2
11
1
11
na çarpımını
bulduran program,
Örnek: Dışarıdan girilen n sayısına göre 1 1 1
....sin1 sin1 sin 2 sin1 sin 2 ... sin
an
seri toplamını bulduran program,
Örnek: Dışarıdan girilen n sayısına göre
n
na
1....
2
11
!.....
2
11
!2
1
!1 ifadesini bulduran
program,
DO WHİLE
Tekrarlamalı ifadelerde koşul sağlandıkça işlemlerin sağlanması için kullanılan bir komuttur.
do while(mantıksal ifade) komutlar end do
Örnek: Dışarıdan girilen 10 tabanındaki pozitif bir tamsayının, belirtilen tabandaki karşılığını hesaplayan program,
Örnek: Verilen N sayısını oluşturan tek rakamların toplamını bulmak için program yazınız.
Örnek: M tabanında verilen N sayısının 10 tabanında değerini bulmak için program yazınız.
DİZİLER
Birden fazla giriş yapılıp, programda kullanılacak olan değişken türlerini dizi olarak
tanımlamamız gerekir. Dizilerin 2 boyutlu durumunu ise matris olarak düşünürüz.
Aşağıda 8 elemanlı bir dizi örneği görmekteyiz.
Aşağıdaki ise 2 satır ve 4 sütundan oluşan bir matrisi gösterir.
Fortran dilinde dizi ve matrisleri aşağıdaki kullanımlar ile belirtiriz:
DIMENSION name(bound) DIMENSION name (bound1,bound2) REAL name(bound) INTEGER name(bound) CHARACTER name(bound) LOGICAL name(bound) REAL name (bound1,bound2) INTEGER name (bound1,bound2) CHARACTER name (bound1,bound2) LOGICAL name (bound1,bound2)
Aşağıdaki örnekte bir telefon rehberi örneği verilmiştir. Matris gibi düşündüğümüzde 1.
Sütun kişilerin adlarını, 2. Sütun kişilerin adreslerini ve 3. Sütun ise bunlara karşılık gelen
telefon numaralarını ifade eder ve her bir satır için kişilerin bilgilerini doldurabiliriz.
Bir başka örnek olarak aşağıdaki kitap katoloğunu verebiliriz: 1. Sütun kitabın yazarını, 2.
Sütun kitabın adını ve 3. Sütun ise yayın evini belirtir. Örneğin 4. Sütun yayım yılı ve 5.
Sütunda da fiyat bilgileri ilan bir çizelgeye genişletebiliriz.
Ve son örnek olarak da bir sınıfın ders notu tablosunu verebiliriz:
DİZİLERİN ÖZELLİKLERİ
gösterimi ile 8 elemanlı a dizisinin 5. Elemanı
belirtmekteyiz.
gösteriminde ise b matrisi 5x4 ‘lük bir matristir ve taralı kısım
b matrisinin 4. Satırının 2. Sütun elemanını gösterir.
Aşağıdaki örnekte ise aylara göre sağanak yağış miktarı verilmiştir:
Dizilerin indisleri her zaman pozitif olmak zorunda değildir!
REAL V(-5:5) v(-5),v(-4),v(-3),v(-2),v(-1),v(0),v(1),v(2),v(3),v(4),v(5) elemanları ile 11 boyutlu bir dizi tanımlar
REAL A(3:5, 3:5) A(3,3),A(3,4),A(3,5), A(4,3),A(4,4),A(4,5), A(5,3),A(5,4),A(5,5) elemanları ile birlikte 3x3 lük bir matris verir.
CHARACTER M(3,4)*7, V(9)*4
Örnek: Dışarıdan girilen N boyutlu bir A dizisinin tüm elemanlarının toplamını hesaplayan program.
Örnek: Dışarıdan girilen N boyutlu bir A dizisinin tüm elemanlarının karelerinin toplamını hesaplayan program.
Örnek: Dışarıdan girilen N boyutlu A ve B dizilerin toplayarak C dizisini oluşturan program.
Örnek: Dışarıdan girilen N boyutlu A ve B dizilerinin karşılıklı elemanlarının çarpımından oluşan C dizisini oluşturan program. .
Örnek: Dışarıdan girilen N boyutlu A dizisini bir “k” katsayısı ile çarpıp B dizisini oluşturan program.
Örnek: Dışarıdan girilen N boyutlu bir A dizisini elemanlarının ters sırada yazılmasıyla elde edilen B dizisini bulduran program.
Örnek: Dışarıdan girilen N boyutlu A ve B vektörlerinin iç çarpımını hesaplayan program.
Örnek: Dışarıdan girilen N boyutlu A dizisini aritmetik, geometrik ve harmonik ortalamalarını hesaplayan program.
Örnek: 0B sayısı verildiğinde 11a ; ,.....4,3,2 ,112 iaa ii kuralı ile tanımlanan
dizisinin B – den küçük olan tüm elemanlarını bulmak için program yazınız.
Örnek: Dışarıdan girilen NxN tipinde A ve B matrislerinin toplamını hesaplayan program.
Örnek: Dışarıdan girilen NxN tipinde A matrisinin izini (ana köşegen üzerindeki elemanların toplamını) hesaplayan program.
Örnek: Dışarıdan girilen NxN tipinde A matrisinin 2. köşegen üzerindeki elemanların toplamını hesaplayan program.
Örnek: Dışarıdan girilen NxN tipinde A matrisinin 2. satır elemanlarının toplamın hesaplayan program.
Örnek: Dışarıdan girilen NxN tipinde A matrisinin 2. sütun elemanlarının toplamını hesaplayan program.
Örnek: Dışarıdan girilen NxN tipinde A matrisinin tüm elemanlarının toplamın veren program.
Örnek: Dışarıdan girilen NxN tipinde A matrisinin transpozesini veren program.
Örnek: Dışarıdan girilen N sayısına göre NxN tipinde birim matris oluşturan program.
Örnek: Dışarıdan girilen NxN tipinde A ve B matrislerinin çarpımını hesaplayan program.
Örnek: Dışarıdan girilen NxN tipinde A matrisinin esas köşegenin üst kısmında kalan elemanların toplamını veren program.
FORMAT
OPEN
Read ve Write komutlarında bir veriyi giriş yaparken veya yazdırırken bilgisayar ekranındaki
dosyaya yazdırıyorduk Hâlbuki var olan bir dosyadaki veriyi kullanabileceğimiz gibi
verilerimizi saklamak ve bir dosyaya da yazdırmak isteyebiliriz. Bunun için dosya açmak
gerekmektedir. Fortranda dosya açma işlemi ise OPEN komutu ile yapılır.
OPEN (UNIT=sayı,FILE=’dosyanın adı’) OPEN (UNIT=10,FILE=’fibonacci.DAT’)
Örnek: Dışarıdan verdiğiniz 3x3 lük bir matrisi txt uzantılı bir dosyaya yazdırın.
OPEN1.f
DO döngüsüne girilmeden okutma ve yazdırma yapmak için
WRITE (2,*) ((A(I,J),J=1,N),I=1,N) READ (*,* ) ((A(I,J),J=1,N),I=1,N)
Komutu da kullanılabilir.
TAM SAYILAR, I FORMATI
Bazen programda varsayılan format kullanmak yetersiz olabilir. Özellikle de verilerimizi
dosyadan okutuyorsak Format özelliklerini bilmemiz gerekmektedir. Read ve Write
komutlarındaki ikinci * sembolü yerine belirtilen format tanıtılabilir. Tamsayı format için
kullanım:
Iw (idth) w: toplam karakter sayısı I3 için 123, -93
Örneğin,
write(*,10) i,j,k
10 format(i2,i4,i10)
Ifadesi ile I,j,k tamsayılarını toplam olarak sırasıyla 2,4 ve 20 basamaklı olarak belirtmeliyiz.
Aynı formatta birden fazla sayıyı formatları için
2I8 8 basamaklı 2 tam sayıyı belirtir.
Örnek: 5,7,2 basamaklı tam sayı girişi ve yazdırılması için program,
REEL SAYILAR, F FORMATI
Reel sayı format için kullanım:
Fw.d w: toplam karakter sayısı, ondalıklı basamaklarda dahil olmak üzere, d ise ondalıklı basamak F8.3 için 1234.678, -234.678
Örneğin,
write(*,10) T,S
10 format(F5.2,F7.4)
Ifadesi ile T,S reel sayılarını toplam olarak sırasıyla 5 basamaklı-2 ondalıklı ve 7 basamaklı-4
ondalıklı olarak belirtmeliyiz.
REAL :: itest=123.4567 !number to write
...
WRITE(*,*) itest ! 1.2345670E+02 -not F format
WRITE(*,’(F8.0)’) itest ! 123.
WRITE(*,’(F10.4)’) itest ! 123.4567
WRITE(*,’(F10.5)’) itest ! 123.45670
WRITE(*,’(F10.9)’) itest !**********
WRITE(*,’(2F8.4)’) itest, 7654321 !123.4567765.4321
WRITE(*,’(2F10.4)’) itest, 7654321 ! 123.4567 765.4321
Aynı formatta birden fazla sayıyı formatları için
2F8.3 8 basamaklı, 3 ondalıklı 2 reel sayıyı belirtir.
Örnek: 3 ondalıklı 7 basamaklı, 5 ondalıklı,8 basamaklı reel sayı girişi ve yazdırılması için program,
KARAKTERLER, A FORMATI
Karakter format için kullanım:
Aw w: toplam karakter sayısı A5 için ABCDE
Örneğin,
write(*,10) b
10 format(A8)
Ifadesi ile b yi 8 karakter olarak belirtmeliyiz.
CHARACTER(LEN=8) :: long=’Bookshop’
CHARACTER(LEN=1) :: short=’B’
...
WRITE(*,*) long ! Bookshop
WRITE(*,’(A)’) long !Bookshop
WRITE(*,’(A8)’) long !Bookshop
WRITE(*,’(A5)’) long !Books
WRITE(*,’(A10)’) long ! Bookshop
WRITE(*,’(A)’) short !B
WRITE(*,’(2A) short, long !BBookshop
WRITE(*,’(2A3) short, long ! BBoo
Aynı formatta birden fazla karakter formatları için
2A4 4 harfli 2 karakteri belirtir.
Örnek: 7 ve 12 karakterli değişkeleri okutun ve yazdırın,
CONTROL FONKS İYONLARI
Yeni bir satırdan yazdırmak için / sembolü kullanılır.
Boşluk vermek için ise X sembolü kullanılır.
INTEGER :: n=1234 !number to write
...
WRITE(*,’(I4, 2X, I4)’) i, i-1 !1234_ _1233
WRITE(*,’(I4, 4X, I4)’) i, i-1 !1234_ _ _ _1233
INTEGER :: value = 100
INTEGER :: a=101, b=201
...
WRITE(*,’( ’The value is’, 2X, I3, ’ units.’)’) value
WRITE(*,’( ’a =’, 1X, I3, /, ’b = ’, 1X, I3)’)
WRITE(*,’( ’a and b =’, 2(1X, I3) )’) a, b
Komutlarından sonar ekrandaki görüntü:
The value is 100 units.
a = 101_ _ _
b = 201_ _ _
a and b = 101_ _ _ 201
ALT PROGRAMLAR
Sin, Sqrt gibi fonksiyonları kullandığımızda aslında alt programları kullanmış oluyoruz. Bu
fonksiyonlar Fortranın yazılımında verilen fonksiyonlardır. Bizde bu fonksiyonlar gibi
fonksiyon yazıp alt program tanımlayabiliriz. Alt programları, Fortranın belirli olan
işleyişinden bağımsız olarak ele alabiliriz. Ayrı ayrı yazılabilir ve derlenebilir. Büyük
programlar yazarken, program alt programlar bölmek, programın doğruluğunu test etmek
amacıyla oldukça kullanışlı bir yöntemdir. Alt programların diğer bir avantajı ise, çalışan bir
alt programınızı diğer pek çok ana programda kullanabilirisiniz.
2 türlü alt program ele alacağız:
1. Functions: isimleri ile çağırılırlar. Örneğin sin(x).
2. Subroutines: alt programların en genelidir. Çok kompleks programların 1 veya 1 den
fazla cevabı olması durumlarında çalışırlar.
RETURN
Alt programları sonlandırmadan önce alt programa gönderme yapan komuttur. Alt
programlarda END komutundan önce kullanılmalıdır.
CHARACTER*25 TEXT
TEXT = "Some kind of minor catastrophe"
…
CALL OOPS ( TEXT )
STOP
END
SUBROUTINE OOPS ( S )
CHARACTER S* 32
WRITE (*,*) S
RETURN
END
FUNCTİON
Function kullanımları ana programda olmalıdır ve ana programın END komutundan
sonra yazılmaya başlamalıdır.
Function kullanımı Function ile başlayan ve argumanları olan bir kullanımdır.
function bigroot(a,b,c)
Function kullanımları END ifadesi ile bitmelidir.
end function function_name
END ifadesinden önce kesinlikle RETURN ifadesi kullanılmalıdır.
Function kullanımlarında da kontrol ifadeleri (if,do,select) kullanılabilir
Function ifadelerinde de değişken tipleri aynı şekilde geçerlidir.
Function kullanımlarında 1 (tek) değer hesaplanır!
program fn1
real:: a,b,c,bigroot
!
! Program to demonstrate the use of a FUNCTION subprogram
!
write(6,10)
read(5,*) a, b, c
write(6,20) bigroot(a, b, c)
10 format(' Enter the coefficients a, b, c '/)
20 format(' The larger root is ',F12.6)
stop
end program fn1
!
! End of main program
!
function bigroot(a, b, c)
real:: bigroot, a, b, c, test, root1, root2
!
! Function to find largest root of a quadratic
! If no real roots then function returns value -9.0E35
!
test = b*b - 4.0*a*c
if(test.ge.0.0) then
root1 = (-b + sqrt(test)) / (2.0 * a)
root2 = (-b - sqrt(test)) / (2.0 * a)
if(root2.gt.root1)then
bigroot = root2
else
bigroot = root1
end if
else
bigroot = -9.0e35
end if
return
end function bigroot
Yukarıdaki örnek, 2.dereceden bir polinomun köklerinden en büyüğünü buldurmak için
Function komutu kullanılarak yapılmıştır.
Örnek: Kombinasyonu fonksiyon kullanarak ve kullanmayarak bulan program
Örnek: fonksiyonu için ifadesini fonksiyon kullanarak ve
kullanmayarak hesaplayan program, aynı örnek için ifadesinin hesaplanmasını
genelleştiriniz.
Örnek: xe fonksiyonunun seriye açılımı 2
1 ...1! 2! !
Nx x x x
eN
şeklindedir. Buna göre,
dışarıdan girilen x ve N değerine göre xe ’I funksiyon kullanarak ve Fortran’ın kütüphanesinde kullanılan fonksiyon ile kaşılaştıracak şekilde program,
SUBROUTİNES
Function ifadesi ile tek bir değer hesaplanabilirken, Subroutines ifadesi ile birden çok değer
hesaplanabileceği gibi hiçbir değer de hesaplanmayabilir.
Subroutine, ana programın içinde bulunan bir alt programdır ve ana programın END
komutundan sonra yazılmaya başlanır
Subroutine komutu, Subroutine ile başlayan ve argumanları olan bir kullanıma
sahiptir.
subroutine(orig,sorted,N)
Subroutine komutu END ifadesi ile biter
END komutundan önce RETURN kullanılmalıdır
Subroutine ile birden fazla değer çıktısı alınabildiğinden değişken tipleri
belirtilmelidir. Değişken tipleri ana programda tanımlandığı kurallar geçerlidir.
Subroutine komutunda dizi/matrisleri de tanımlayabilir ve sonuç olarak dizi/matris
çıktısı alabilirsiniz.
Aşağıdaki örnekte ise 2. Dereceden bir polinomun köklerini bulduran bir programdır:
program subrout1
implicit none
real:: a,b,c,root1,root2
logical:: realroots
! demonstration of simple subroutine
write(*,10)
read(*,*) a,b,c
!
call solvit(a,b,c,root1,root2,realroots)
!
if (realroots) then
write(*,20) root1,root2
else
write(*,*) 'Sorry, there are no real roots'
endif
!
10 format('Enter 3 coefficients')
20 format('The roots are',2f12.6)
stop
end
!
!subroutine solvit
!
subroutine solvit(a,b,c,root1,root2,realroots)
implicit none
real::a,b,c,root1,root2,test
logical::realroots
!
test=b**2 - 4*a*c
!
if(test>=0.0) then
root1 = (-b + sqrt(test))/(2.0*a)
root2 = (-b - sqrt(test))/(2.0*a)
realroots = .true.
else
realroots = .false.
end if
!
return
end
Örnek: N ve M boyutlu A ve B dizilerinin en büyük elemanlarını karşılaştıran program,
Örnek: A NxM, B ise NxK boyutlu matrisler olmak üzere, satırlarının en büyüğünden oluşan dizilerin iç çarpımını veren program (Euclid iç çarpımı!)
Örnek: Dışarıdan girilen NxN tipindeki A, B, ve C matrislerini kullanarak T T TD A BC CB C B ABC matrisini oluşturan program