FORTRAN Arzu Erdem 2010-2011 BAHAR DÖNEMİ 2010-2011 Bahar Dönemi Matematik Bölümü ders notları Koceali Üniversitesi erdem.arzu@gmail.com
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/m 2 ) Newton/m 2 ) 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. Örrnneekk: : 1234 tamsayıdır ancak 1234. değildir. REAL (REEL SAYI) 8 basamağa kadar değişen bir sabittir. Örrnneekk: : 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. Örrnneekk: : Bugün Sıla nın doğum günü LOGİCAL (MANTIKSAL) Doğru ve yanlış değerlerini alan mantıksal sabitlerdir. Örrnneekk: :. true ve.false COMPLEX (KOMPLEKS SAYILAR) Kompleks sayılar reel sayı ikilileri olarak tanımlanır. Örrnneekk: : (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! Örrnneekk: : A3, A_2, loop3, sam, A3B4 Doğru 123x, 0A, _abc Yanlış Fortran büyük ve küçük harf ayrımı yapmaz! Örrnneekk: : 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
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(*,*) EKRANA YAZMAK VARSAYILAN FORMATTA YAZMAK 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 (*,*) EKRANA YAZMAK VARSAYILAN FORMATTA YAZMAK Klavye Bilgisayar Read (*,*)
Ekran Bilgisayar write (*,*) 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. Örrnneekk: : Merhaba tanıştığıma memnun oldum. Ben yazdıran program, hi.f Örrnneekk: : İki sayının toplamını yazdıran program, top.f Örrnneekk: : 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 Örrnneekk: : Kompleks sayılarda 4 işlemi hesaplayan program, Kompleks.f
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.NOT..AND..OR..EQV..NEQV. Açıklama Mantıksal negatiflik Mantıksal birleşme Mantıksal ayrılma Mantıksal eşitlik 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 Örrnneekk: : employed=.true, age=50 test = employed.and. (age<45) değeri nedir? Örrnneekk: : name = James test = (name='dimitris').or. (name='james') değeri nedir? Örrnneekk: : big=100, small=2 test =.NOT. (big>small), test =.NOT. test değerleri nedir?
Örrnneekk: : test = (5*3>12).EQV. (6*2>8), test = (5*3<12).EQV. (6*2<8) değerleri nedir?. Örrnneekk: : 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.LT..LE..EQ..NE..GT..GE. Açıklaması Küçük Küçük veya eşit Eşit Eşit deği Büyük 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
Örrnneekk: : 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 1, x 0 Örnek: f( x) x,0 x 2 3,2 x 4 ile tanımlanan fonksiyonun dışarıdan girilen x değerine 4 x, x 4 göre f() x i hesaplayan program, Örnek: 2 f ( x) x 5x 3 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 2 3 4 x x x Örnek: ln 1 x fonksiyonun seriye açılımı ln(1 x ) x... şeklindedir. 2 3 4 Buna göre dışarıdan girilen x için ln 1 x değerini hesaplayan program, 3 5 x x Örnek: arctan x fonksiyonun seriye açılımı arctanx x... şeklindedir. Buna 3! 5! göre dışarıdan girilen x için arctan x değerini hesaplayan program 3 5 x x Örnek: Dışarıdan girilen x için T x... ; x 1 değerini hesaplayan program, 3 5
Örnek: Dışarıdan girilen x için T 1 1 1 x 3 3x 5 5x... ; x 1 değerini hesaplayan program, Örnek: Dışarıdan girilen x için T 2 3 x 1 ( x 1) ( x 1) 2 3 x 2x 3x... ; x 1/ 2 değerini hesaplayan program, Örnek: Dışarıdan girilen n sayısına göre a 1 1 1 1 1 1 1... 1 2 2 2 2 1 2 3 n çarpımını bulduran program, Örnek: Dışarıdan girilen n sayısına göre seri toplamını bulduran program, a 1 1 1... sin1 sin1 sin 2 sin1 sin 2... sin n Örnek: Dışarıdan girilen n sayısına göre program, a 1! 1 2! 1 1 2... 1 n! 1 1... 2 n ifadesini bulduran 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İ belirtmekteyiz. gösterimi ile 8 elemanlı a dizisinin 5. Elemanı 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. 2 Örnek: B 0 sayısı verildiğinde a 1 1 ; ai a i 1 1, i 2,3,4,... 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 genelleştiriniz. 2 N x x x x ifadesinin hesaplanmasını x Örnek: e fonksiyonunun seriye açılımı e 1... şeklindedir. Buna göre, 1! 2! N! x dışarıdan girilen x ve N değerine göre e 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 T D A BC CB C B ABC matrisini oluşturan program