What is this article about?
I recently find out my fortran lessons published on students.edu.tr from 2002. It took me back in time and realized how much I loved programming. Wanted to re-publish it after 21 years. You can see the original from the wayback machine https://web.archive.org/web/20020806134915/http://www.students.itu.edu.tr/~dagb/fortran.htm. Here it is:
##fortran90
Fortran dili 1955 te ilk kez kullanılmaya başlanmıştır. Daha sonra birçok versiyonu kullanılan bu dil son olarak F95 olarak karşımıza çıkmıştır. Biz bu sitede F90 dan bahsedeceğiz. Bu derslere başlamadan önce eğer bir yazılım dili hakkında daha önce hiç eğitim almadıysanız ana programcılık bölümünü ziyaret etmenizi tavsiye ediyoruz.
Başlangıç
İlk Program
Ana Program
Modüller
Subroutine’ler
do Döngüsü
if komutu
select case komutu
Diğer komutlar
Örnekler
BAŞLANGIÇ
Fortran yazılım türlerinin en eskilerindendir.Bu yüzden geliştirilirken dahi hep bir önceki versiyona bağlı kalındığı için günümüzde pek tercih edilmeyen bir dildir. Eğer başka bir yazılım dili biliyorsanız fortran90’ı öğrenmeniz hiçte zor olmayacaktır. Çünki gayet sade bir dille oluşturulan bu yazılımda kullanılan kodlar bile ne işe yaradıklarını belli edecek şekilde tasarlanmıştır. Başlangıç olarak bu bilgileri verdikten sonra artık fortranda bir program yazmanın nasıl yapılanacağına bir bakalım.Fortranda ilk kural programınıza bir isim vermekle başlar.Mesela programınızın ismi deneme olsun. Bunu compiler’a tanıtmak için:
program deneme
komutunu kullanmalısınız.Eğer programınızın ismini başka bir şey koymak istiyorsanız deneme yazılan yere istediğiniz ismi yazabilirsiniz.Ancak verilen isim en fazla 32 karakterden oluşmalı ve mutlaka bir harf ya da rakamla başlamalı. Programımıza verdiğiniz ismin ikinci bir önemi daha var.Bu da programın sonunda bu ismi tekrar kullanmanız gerektiğidir.Yani program biterken programın bittiğini belirten komut olan “endprogram” komutunun yanına bu ismi tekrar yazmanız gereklidir.Bu komutu compiler’a :
endprogram deneme
şeklinde tanıtmalısınız.Compiler’a yaptırmak istediğiniz bütün herşeyi bu iki komut arasına yazmalısınız. Bu işlem bittikten sonra ilk programı yazmak için hazırlıklara başlayalım. Programın ismini compiler’a tanıtmak için “program” komutunu kullanmıştık. Compiler’a tanıtacağımız bütün diğer elemanları da compiler’a bazı diğer komutları kullanarak tanıtmamız gerekecek. Eğer bir reel sayıyı compiler’a tanıtmak istiyorsak real komutunu kullanmamız gerekecek. Diyelim herhangi “a” gibi bir sayıyı bir reel sayı olarak compiler’a tanıtmak istiyorsak bunu
real :: a
şeklinde yapmalıyız. Eğer birden fazla rrel sayıyı tanıtacaksanız parametreler arasına virgül koymalısınız. Yani:
real :: a,h
şeklinde olmalı.Bu diğer komutlar içinde aynı şekilde yapılmalıdır.
Böylece yazacağınız programın ileriki bölümlerinde “a” parametresini compiler bir reel sayı olarak tanıyacaktır. Eğer bir başka “b” sayısını bir tam sayı olarak tanıtmak istiyorsanız bunu integer komutunu kullanarak yapmanız gerekecek.yani programa :
integer :: b
yazmanız gerekecek. Peki integer ile real komutları arasındaki fark ne? integer komutuyla tanımladığınız sayı virgülden sonra basamak içermeyecektir.Eğer real komutuyla tanımlarsanız bu sayıyı programınızı çalıştırdığınızda virgülden sonraki basamaklarda ekranda görülecektir.
Compiler’a bir sayı dışında “c” gibi bir sözcük tanıtacaksanız bunu character komutunu kullanarak yapmalısınız. Ancak bu komutu kullanırken kullanıcının gireceği kelimenin en fazla ne kadar olacağını belirtmek için bir de (len=10) şeklinde ek bir komut daha kullanmalısınız.Biz burda girilecek kelimenin en fazla “10” karakterden oluşmasını istedik.Siz bunun yerine başka bir sayı yazbilirsiniz. Yani bu “c” kelimesini compiler’a:
character (len=10) :: c
şeklinde tanıtmalısınız. Parametreleri compiler’a tanıttıktan sonra ekrana bilgi girişinin nasıl olacağına bir bakalım. Kullanıcının ekrana bilgi girmesi için print komutu kullanılmalıdır. Mesela kullanıcıya ekranda Hoşgeldiniz yazısını göstermek için:
print \*,"Hoşgeldiniz"
şeklinde yazmalısınız. Yazacağınız mesajı mutlaka tırnak içinde yazmalısınız
Kullanıcının gireceği bilgileri okutmak için read komutunu kullanmalısınız.Diyelim reel sayı olarak tanımladığınız a sayısını kullanıcının girmesini ve compiler’ın bu sayıyı algılamasını istiyorsunuz. Bunu:
read \*,a
Şimdi ilk program denememize geçebiliriz.
İLK PROGRAM
İlk programımız iki sayının ortalamasını veren bir program olsun.
!iki sayının ortalamasını veren program
program ilk real::a,b,c print \*,"Lütfen iki sayı giriniz" read \*,a,b c=(a+b)/2 print \*,"bu iki sayının ortalaması =",c end program ilk
Şimdi programımızın nasıl çalıştığını anlayalım.Önce program “ilk” adını verdik. Sonra üç tane parametre belirledik ve bunu reel sayı olarak yaptık. Daha sonra kullanıcıya yön vermek için ekrana yazdırmak üzere print komutuyla “Lütfen iki sayı giriniz” yazdık. Kullanıcı bu uyarıyı gördükten sonra iki sayı girdi ve compiler bunu read komutuyla algıladı. Girdiğimiz iki sayıyı ortalamasını alması için programa bir de “c” diye farklı bir reel sayı tanıttık.Bu “c” değerinin ne olduğunu anlaması için programa c değerinin matematiksel karşılığını yazdık.Kullanıcı iki sayı girdiğinde compiler hemen “c” değerini hesapladı. Biz bu değeri kullanıcıya göstermek için tekrar bir print komutu kullandık ve bu komutun sonuna " ,c " yazdık. Eğer prgoramınızda hesaplanan değerleri kullanıcıya göstermek istiyorsanız bu yöntemi tercih etmelisiniz. Böylece kullanıcı c değerini yani girdiği iki sayının ortalamasını görmüş oldu. Her zaman olduğu gibi programımızın bittiğini compiler’a algılatmak için end program komutunu yazdık ve programa verdiğimiz ismi tekrarladık.(F90 case sensitive özelliği taşır.Yani programa başta DENEME ismi verdiyseniz end program dediğinizde yine DENEME yazmak zorundasınız.deneme yazrsanız program çalışmaz).
ANA PROGRAM
Fortran yazılım dilinin bir diğer özelliği de yazdığınız programın modüller kullanabilmesidir. Bu yüzden dersin başında ana program ve modüller diye farklı bölümler oluşturduk. Eğer programınız modüller kullanıyorsa ortada bir modül ve bir ana program olmak zorundadır. Ana program program ve enprogram komutları arasında yazılırken modüller module ve endmodule komutları arasında yazılmalıdır.Şimdi modüller kısmına geçebiliriz.
MODÜLLER
Bir modül ana programda kullanılmak üzere yazılan yardımcı bir yazılımdır. Modüllere de başlamadan önce aynı ana programda olduğu gibi modüle module komutundan sonra bir isim vermeli ve program sonunda endmodule komutuyla bu modül sonlandırılmalıdırYani modülün içeriği
module ali . . endmodule ali
komutları arasına yazılmalıdır. Bir module içerisinde mutlaka bir subroutine bulundurmalıdır. Bu subroutine public veye private (private ve public komutları arasında bir fark vardır.Eğer görev yüklediğiniz subroutine’i private olarak tanıtırsanız bu subroutine yanlızca yazdığınız programda geçerli demektir.Ama public komutunu kullanarak bu işlemi yaparsanız yazdığınız diğer programlarda da bu subroutine kullanılabilir demektir)komutlarıyla mutlaka compiler’a tanıtılmalıdır.Mesela adı tomi olan bir subroutine ‘i compiler’a tanıtmak için
public::tomi
yazmanız yeterli olacaktır.Bir de bir module içerisinde bu modülün neler içerdiğini tanıtmak için contains komutu kullanılmalıdır. Mesela modülünüzün içinde adları tomi ve joni olan iki subroutine varsa bunları:
contains subroutine tomi() . . end subroutine tomi subroutine joni() . . end subroutine joni
şeklinde yazmalısınız.Yani her modülde public komutundan sonraki satıra contains komutu yazılmalıdır. Şimdi yukarıdaki ilk program örneğini bir module kullanarak çalıştırmayı deneyelim.
module ahmet public::ali contains subroutine ali() integer::sayi1,sayi2,ortsayilar print \*,"lütfen iki sayi giriniz" read \*,sayi1,sayi2 ortsayilar=(sayi1+sayi2)/2 print \*," Bu iki sayinin ortalaması=",ortsayilar end subroutine ali endmodule ahmet
şeklinde bir module hazırladık.Bu modülü biraz inceleyelim. Önce modülümüze bir isim verdik.Sonra modülün içinde yazılan subroutine’i modüle tanıtmak için public kullandık ve contains komutuyla modülün içeriğini yazmaya başladık.Doğal olarak contains komutundan hemen sonra işlemleri yaptıracağımız subroutine fonksiyonunu ona da bir isim vererek yazmaya başladık.Burdan sonrası end subroutine komutuna kadar aynen sanki bir ana program yazılıyormuş gibi yapıldı.Subroutine’e yapması gereken görevleri yükledikten sonra subroutine’i bittiği anlamında end subroutine komutuyla kapattık.bundan sonra en son olarak modülümüzü end module komutuyla kapatmış olduk.Şimdi ilk yapmamız gereken bu modülü validate ettirmektir. Modülü validate ettirdikten sonra bir ana program yazmalıyız.Bunu da
program salak use ahmet call ali() endprogram salak
Şeklinde yapabiliriz.Gördüğünüz gibi programa neredeyse hiçbirşey yazmadık.Çünki ana program yazdığımız use komutuyla önce modülü çağırdı sonra yazılan call komutuyla subroutine’i çağırdı.Böylece ana program bütün hesap işlerini modüle yaptırmış oldu.(ana programı ve modülü ayrı sayfalara yazmalısınız)
SUBROUTINE’LER
Subroutine komutundan modüller kısmında sıkça söz ettik. Temel olarak fortranda iki türlü fonksiyon vardır.Birincisi programda zaten kayıtlı olan ve ana programda kullanmak için ayrı bir komut gerektirmeyen doğal fonksiyonlardır(sinüs,cosinüs gibi).İkincisi ise sizin tarafınızdan bazı değişkenleri hesaplatmak için yazılan programlardır.Bu fonksiyonlar mutlaka bir modül içinde kullanılmalıdır.Her subroutine’e aynen ana program ve modülde olduğu gibi isimler verilmelidir.Diyelim modül içerisinde kullanacağınız subroutine’in ismi kasap olsun. O zaman
subroutine kasap()
şeklinde bu subroutine’in ismini tanıtmalısınız.Subroutine ismini yazdıktan hemen sonra iki parantez koymalısınız(bunun anlamını ben de bilmiyorum).Ayrıca subroutine fonksiyonuna yükleyeceğiniz görevler bittikten sonra end subroutine komutuyla bu subroutine’in bittiğini belirtmelisiniz.Öyleyse aynen modul ve ana programda olduğu gibi subroutine’i başlatıp bitirmelisiniz.yapacağınız işlemleri
subroutine kasap() . . end subroutine kasap
komutları arasına yazmalısınız.Bir subroutine’e işlemleri yapması için yükleyeceğiniz görevler aynen ana programda olduğu gibi olmalıdır.Diyelim bir subroutine’e iki sayinin ortalamasını hesaplatacak bir komut dizini yazacaksınız.Bunu
subroutine ali() integer::sayi1,sayi2,ortsayilar print \*,"lütfen iki sayi giriniz" read \*,sayi1,sayi2 ortsayilar=(sayi1+sayi2)/2 print \*," Bu iki sayinin ortalaması=",ortsayilar end subroutine ali
Şeklinde yapmalısınız.
do DÖNGÜSÜ
Diyelim ki 1’den 50’ye kadar olan sayıları toplayan bir program yapmak istiyorsunuz. Bu tür olaylarda kullanabileceğiniz en doğru komut do komutudur. Şimdi programın bunu yapması için gerekli olan do komutunu ve diğer elemanları yazalım.
program hesap integer::i,toplam toplam=0 do i=1,50 toplam=toplam+i end do print \*,"1 den 50 ye kadar olan sayilarin toplami=",toplam end program hesap
Önce i ve toplam diye iki tamsayı tanıttık.Daha sonra ilk toplam değerimizin 0 olduğunu belirttik(eğer bunu yapmazsanız program hata vermeden yanlış sonuçlar verir). Şimdi asıl önemli kısım olan do döngüsünü yazmaya başladık. Önce bu dögüye başladığımızı belirtmek için do komutunu kullandık ve aynı satıra i=1,50 yazdık.Siz başlangıçta tanımladığınız i tam sayısını farklı bir şekilde tanıtabilirsiniz ancak bunu yapınca do komutunun yanında yazılan i değişkeninide aynı şekilde değiştirmelisiniz. i=1,50 ifadesi bize i tamsayısının do döngüsü içinde i sayısının 1’den başlayıp 50’ye kadar değer alacağını belirtiyor.Eğer bu örnekteki 50 sayısından sonra virgül koyup 5 yazsaydık i sayısı 1’den 50’ye kadar 5’er 5’er artan değerlerin herbirini do döngüsü içinde alacaktı. 50 sayısından sonra birşey yazmamak değerlerin 1’er 1’er artacağı anlamına gelir.Diğer satıra geçtiğimizde toplam=toplam+i yazdığını görüyoruz.bu başlangıçtaki toplam değerine i sayısının döngü içinde aldığı değeri ekle anlamına gelir.end do komutuna gelindiğinde compiler i nin bir sonraki değerine geçmek üzere döngüyü yeniden başlatır.Ta ki döngünün ulaşması gereken son rakam olan 50 ‘ye ulaşıncaya kadar.Son olarak i sayısı 50 değerini aldığında program do döngüsünün bittiğini algılar ve bir sonraki satıra geçer.Bu örnekte kullanıcı hiçbir bilgi girmiyor ve program direkt olarak işlemleri yapıyor.Eğer siz yaptığınız programda kullanıcının değerleri girip o değerler arasında toplama yapmak istiyorsanız:
program hesap integer::i,toplam,n,m toplam=0 print \*,"lütfen basalangic degerini girin" read \*,n print \*,"Ltfen son değeri girin" read \*,m do i=n,m toplam=toplam+i end do print \*,"",n," den",m," ye kadar olan sayilarin toplami=",toplam end program hesap
Yöntemini kullanmalısınız.
İÇİÇE DO DÖNGÜLERİ
program hesap integer::i,toplam,n toplam=0 do i=1,4 do n=1,8 toplam=toplam+i\*n end do end do print \*," Bu işlem sonucu=",toplam end program hesap
Programına bir göz atalım. Önce bir do döngüsü başlamış ve ikinci satırda başka bir do döngüsü devam etmiş. Alttaki satıda toplam=toplam+i*n yazıyor. i sayısı ilk olarak 1 n sayısı 1 değerlerini alacaklardır. Yani toplama 1 eklenmiş oldu.n sayısı 1 değerini aldıktan sonra end do komutuyla karşılaştı.Henüz n sayısı 1’den 8 ’e kadar olan tüm değerleri almadığından tekrar do çevrimine başladı.Bu sefer n=2 ve i=1 değerlerini aldılar.Çünki henüz içerideki do çevrimi bitmediğinden i değeri 1’den sonraki değeri alamadı.1*2=2 olduğundan toplama 2 daha eklenmiş oldu.n sayısı bir sonraki değeri almak için tekrar tekrar başa döndü ve 1’den 8’e kadar olan bütün değerleri aldığında diğer satıra geçebildi.Bu sefer diğer end do komutuyla karşılaştı ve i değeri nihayet ikinci değerini almak için ilk do çevrimine ulaştı ve 1’den sonra gelen 2 değerini alabildi.Diğer satırda yine bir do çevrimiyle karşılaştı ve n sayısına ilk değer olan 1 değeri verildi.Bu işlem i sayısı en son değer olan 4 değerini alıncaya kadar devam etti ve bütün çarpımlar toplam değerine eklendi.Yani her i değeri için n değeri 1-8 değerlerini sırasıyla aldı
if KOMUTU
if komutu ortamda birden fazla seçenek varsa kullanılır.Kullanıcıdan alınan bu seçeneklere göre programa yön vermekte kullanılan bu komut hayli işe yarar bir komuttur ve çok kullanılır.Mesela programı çalıştırdığınızda isminizi girmenizi isteyen ve eğer bu sizin isminizse size selam veren bir program yazalım:
program ad character(len=10)::isim print \*,"Lutfen isminizi giriniz" read \*,isim if (isim=="hasan")then print \*,"Hosgeldin hasan" else print \*,"Sizi tanimiyorum" end if end program ad
Bu programda if komutuyla kullanıcının girdiği isim okundu ve hemen bir karşılaştırma yapıldı.Eğer kullanıcının girdiği isim hasan ise print komutuyla ekrana hoşgeldin hasan yazdırıldı.İşte burda olaya else komutu giriyor ve diğer bütün seçenekler anlamına geliyor.Yani hasan isminin dışında bütün seçeneklerde karşınıza sizi tanımıyorum yazısı çıkıyor.İf komutu görevini tamamladıysa hemen
end if komutuyla bu compiler’a belirtiliyor. Bir parametrenin gerçekliği veya başka bir özelliği denetleniyorsa araya " == " işareti, büyüktür anlamında " >" işareti, küçüktür anlamında " < " işareti, eşit değildir anlamında " /=" işareti kullanılmalıdır. Bir parametrenin bir özelliğini denetliyor ve ona göre bir sonuç elde etmek istiyorsanız bu örnekteki if komutu kullanımı herzaman kullanılan formattır. Yani aynı satıra önce if sonra parantez içinde parametrenin doğruluğu parantezi kapattıktan sonra then yazılır ve parametrenin hangi özellikte olduğu anlaşılır. Bu örnekte bir isimin doğrluğunu denetledik ve bu ismi belirtirken character komutunu kullandık.Eğer böyle bir parametre kullanıyorsanız if komutunda bunun doğruluğunu saptarken değeri "" içinde yazmalısınız.Ama sayılarla uğraşıyorsanız ve parametreleri integer veya real olarak tanımladıysanız bunu yapmamalısınız.Mesela girdiğiniz iki sayının büyüklüğünü araştıran bir program yapalım:
program rakamlar integer::a,b print \*,"Lutfen iki sayi giriniz" read \*,a,b if (a>b)then print \*,"",a,"sayisi",b,"sayisindan büyüktür" else if (a<b)then print \*,"",a,"sayisi",b,"sayisindan kücüktür" else print \*,"",a,"sayisi",b,"sayisina eşittir" end if end program rakamlar
Bu programda ise kullanıcı iki sayi giriyor ve program ilk if komutuyla ilk durumu ,yani ilk girilen sayinin diğerinden büyük olma durumunu denetliyor.Else if komutu ise ikinci durumu, yani ilk sayinin ikinciden küçük olma durumunu denetliyor.Bunlardan sonraki komut olan else ise girilien iki sayinin da eşit olma durumunda karşımıza çıkıyor.Zaten büyüklük yoksa eşitlik sözkonusu olur demektir. else komutu yerine els if komutunu kullanabilirdik yani else if (a==b) then şeklinde de yazabilirdik
ama bu iş daha uzun olduğundan else komutu da işimizi gördüğünden bunu yapmadık.
Select case komutu
Bu komut if komutuna alternatif olarak kullanılabilecek bir komuttur.Mesela birden fazla kullanıcı tarfından kullanılan ve kullanıcıdan isim girmesini isteyen, bu isme göre kullanıcıya mesaj veren bir program yazalım
program isimler character(len=10)::isim,taninmiyor print \*,"Lutfen isminizi girin" read\*,isim if (isim/= "leyla")then isim="taninmiyor" else if (isim/= "omer")then isim="taninmiyor" else if (isim/= "hasan")then isim="taninmiyor" endif select case(isim) case("leyla") print \*,"seni hic sevmiyorum leyla" case("hasan") print \*,"ooo hosgeldin hasan abi!" case("omer") print \*,"omercim hosgeldin canim!" case("taninmiyor") print \*,"seni tanimiyorum" end select end program isimler
Önce select case komutunda hangi parametrenin kullanılacağını parantez içinde yazdık.Böylece compiler artık hangi parametrenin seçeneklerini denetleyeceğini biliyor.Sonra ilk seçenek olan ismin “leyla” ‘ya eşit olması drumunda mesajımızı yazdık.Diğer isimlerde de aynı şekilde mesajlar veriyor.Fakat ismin bu isimlerden farklı olması durumunda if komutu sayesinde ismin tanınmadiği anlaşılıyor ve isme “taninmiyor” değeri veriliyor.Case komutlarının sonuncusunda ise bu seçenek göz önüne alınarak bu ismin tanınmadığı anlaşılıyor ve sizi tanımıyorum mesajı veriliyor.İşimiz bitince select komutunu end select komutuyla kapatıyoruz.
stop
stop komutu programı o anda sonlandırmak için kullanılır ve bu komuttan sonra herhangi bir dönüş yoktur.Yni program işlemini tamamladığını düşünüp kendini sonlandırır.Örneğin şifre soran ve şifreyi 4 defa yanlış giren bir kullanıcının bu programı kullanmasını engelleyelim.
program sorgu integer ::a,b real::c character(len=17)::sifre print *,"lutfen sifreyi giriniz" read*,sifre if (sifre=="benimparolam") then print*,"sifreyi dogru girdiniz programı kullanabilirsiniz" print *,"iki sayi giriniz" read *,a,b c=(a+b)/2 print *,"bu iki sayinin ortalamasi=",c else if (sifre/="benimparolam") then print *,"tekrar deneyin" read *,sifre if (sifre=="benimparolam") then print*,"sifreyi dogru girdiniz programı kullanabilirsiniz" print *,"iki sayi giriniz" read *,a,b c=(a+b)/2 print *,"bu iki sayinin ortalamasi=",c else if (sifre/="benimparolam") then print *,"tekrar deneyin" read *,sifre if (sifre=="benimparolam") then print*,"sifreyi dogru girdiniz programı kullanabilirsiniz" print *,"iki sayi giriniz" read *,a,b c=(a+b)/2 print *,"bu iki sayinin ortalamasi=",c else if (sifre/="benimparolam") then print *,"son sansiniz" read *,sifre if (sifre=="benimparolam") then print*,"sifreyi dogru girdiniz programı kullanabilirsiniz" print *,"iki sayi giriniz" read *,a,b c=(a+b)/2 print *,"bu iki sayinin ortalamasi=",c else if (sifre/="benimparolam") then print *,"bye bye!!!" stop endif endif endif endif endprogram sorgu
Bu programı çalıştırmak için içiçe if döngüleri kullandık.Bu döngülerin nasıl çalıştığını takip ederseniz kolayca anlayabilirsiniz.Kullanıcıya ilk olarak şifre soruluyor.Kullanıcı doğru şifreyi yani “benimparolam” parolasını girince program if komutu sayesinde bunun doğru parola olduğunu anlıyor ve kullanıcıya işlemleri yapması için izin veriyor.Bu şifreyi doğru olarak giremediğinde program kullanıcıyı else if komutuyla tekrar şifreyi girmesi için yönlendiriyor.ve her 4 seferde program aynı işlemi devam ettiriyor parolanın doğruluğunu denetliyor, ona göre kullanıcıya izin veriyor ya da vermiyor. kullanıcı son şansında parolayı yine doğru giremezse stop komutuyla program sonlandırılıyor ve yeni bir şans tanınmıyor.
ÖRNEK: SAPMA HESABI
şimdi birçok komutu pekiştirmek için bir program yazalım.Bu program bir dosyadan bir sınava giren 30 öğrencinin notlarını okusun.Standart sapmayı hesaplasın,ortalamayı hesaplasın, öğrencinin geçme durumunu belirlesin,sonra bütün bunları bir dosyaya yazdırsın.
program deneme integer,dimension(30) :: x character(len=5),dimension(30)::d real::toplam,ortalama,standart_sapma1,standart_sapma2 integer::i open(unit=1,file="c:\windows\desktop\oku.txt" ,status="old" ,action="read") open(unit=2,file="c:\windows\desktop\yaz.txt" ,status="old" ,action="write",form="formatted") read(unit=1,fmt=*)x toplam=sum(x) ortalama=toplam/30 standart_sapma1=0 standart_sapma2=0 do i=1,30 standart_sapma1= standart_sapma1+(x(i))**2 standart_sapma2= toplam/(standart_sapma1)**0.5 end do write(unit=2,fmt=*)"ortalama=",ortalama write(unit=2,fmt=*)"standart sapma=",standart_sapma2 write(unit=2,fmt=*)"PUAN DURUM" write(unit=2,fmt=*)"-----------------------" do i=1,30 if(x(i)>50)then d(i)="gecer" else d(i)="kalır" end if end do do i=1,30 write(unit=2,fmt="(i4,15x,a)")x(i),d(i) end do print*,"program tamamlanmistir,lutfen desktoptaki yaz.txt dosyasina bakin" end program deneme
Önce öğrencilerin notlarını belirlemek için integer,dimension(30)::x komutunu kullandık.Böylece bu 30 öğrencinin 30 notu 30 tamsayı içeren x serisi olarak tanımlandı.Onun altına öğrencilerin geçme durumunu belirleyecek olan bir seri daha tanımladık.Bu seri alfabetik karakterler içereceğinden bunu character komutuyla yaptık.Yani seriler hem sayı hem de karakter olarak tanımlanabiliyor.Bu satırdan sonra real ve integer olarak bazı parametreler tanımladık.Diğer satırda yolları belirli olan iki dosyayı açması için programa emir verdik.Birinin özelliğini “read” diğerininkini “write” olarak belirledik.Burda karşımıza değişik bir komut çıkıyor. form=“formatted” .Bunu sonra anlatacağız.Öncelikle siz de iki dosya oluşturun.Birine 1 ile 100 arasında 30 sayı girin.Bu sayılar öğrencilerin notları olacak.Diğerini (yazdıracağımız dosyayı) boş bırakın nasıl olsa üstüne biz bazı şeyler yazdıracağız. Sonra read komutuyla dosyadan x serisini okuttuk.Sonra 30 notun toplamını toplam=sum(x) şeklinde belirttik. sum komutu serilerin toplatılması için çok uygun bir fonksiyondur. bundan sonra ortalamanın toplam/30 olduğunu belirttik.Sonra standart sapmayı bulmakta kullanacağımız standart_sapma1 ve standart_sapma2 parametrelerinin başlangıç değerlerinin 0 olduğunu belirttik.(do çevrimiyle üzerinde işlem yaptırıp değerini bulacağımız parametrelerin, genellikle sonradan sorun çıkmasın diye , ilk değerlerini 0’a eşitleriz). Sonraki satırda bir do çevrimi başlattık ve i değerinin 1’den 30’a kadar olduğunu söyledik. Böylece her 30 not için bu satırın altında işlem yapacağımız parametreleri serinin her elemanı için ayrı değerini bulmasını sağladık.Burası seri elemanlarını tek tek ele alıp işlem yaptırdığımız yer. x(i) demek bir seri elemanını belirtir.Diyelim ki serinin 16. elemanını arıyoruz.Öyleyse do çevriminde i değeri 16 değerine ulaştığında compiler serinin 16. elemanını ele alacaktır.Bu do çevriminde bazı parametreleri hesaplattıktan sonra çevrimi end do komuytuyla kapattık.Alt satırda Adı 2 olan uniteye write komutuyla yazdığımız yazının dosyaya yazdırılmasını sağladık.Bu formata dikkat edin her zaman karşınıza çıkacaktır.Belli şeyleri 2 adlı dosyaya yazdırdıktan sonra bir do çevrimi daha başlattık.Bu çevrim de bize if komutu kullanımıyla serideki değerlere göre öğrencinin geçme durumunu bildiriyor.Biz notlama sisteminin nasıl yapıldığını bilmediğimiz için sadece 50 nin altındaki değerlerin kalacağını üstündekilerin ise geçeceğini belirledik.Eğer siz notlamanın nasıl yapıldığını biliyorsanız standart sapmayı da kullanarak öğrenci notunun AA, BB, FF olacağını bu bölümü değiştirerek yapabilirsiniz.Zaten bir programcının görevi formülleri bilmek değil o formüllerle bir program yazmaktır.if ve do çevrimlerini de kapattıktan sonra artık dosyaya 30 öğrencinin notlarını ve geçme durumunu yazdırmak kalıyor.Bunu yine write komutuyla yapıyoruz.Fakat burda yeni gördüğümüz birşey var. Dosyaya yazdıracağımız bilgilerin düzenli olmaları için belirli bir format kullandık. fmt="()" komutu her zaman sabittir , siz bunun içine formatı nasıl kaydetmek istediğinizi yazmalısınız. integer için " i5 " gibi bir format kullanılır.Bu bir tamsayıyı belirtir ve 5 basamaktan oluştuğunu anlatır. real için " f7.3 " gibi bir format kullanılır. f ten sonraki 7 toplam basamak sayısını(virgül dahil) 3 ise virgülden sonraki basamak sayısını gösterir. a formatı bize bunun alfabetik karakterlerden oluştuğunu anlatır. Eğer bu örnekte olduğu gibi birden fazla elemanı yan yana yazdıracaksanız bu formatların arasına virgül koyarak bunu çalıştırmanız gerekecektir.Eğer iki eleman arasında dosyaya yazdırılırken boşluk olmasını istiyorsanız formatların arasına 10x gibi bir değer yazmalısınız. Bu 10 boşluk bırak demektir.Şimdi bütün bu olup bitenler(dosyaya yazdırma) hep do döngüsünün içinde oluyor bunu unutmayalım. Yukarıda bahsettiğimiz gibi i bir değer aldığında x(i) o değer sırasındaki elemanı gösterecek ve d(i) yukarıdaki if komutu sayesinde gecer ya da kalır değerlerini ifade edecek. Böylece kullanıcı programa program çalışırken hiç değer girmeden işlemlerini yaptırdı. bu işlemlerin yapıldığını ve bilgilerin dosyaya kaydedildiğini belirttikten sonra programı sonlandırıyoruz.
not:yazılımda kahverengi renkle yazılmış yerler değiştirliebilir kısımları, yeşil ile yazılmış yerler yeni öğrendiğimiz şeyleri, kırmızı ile yazılmış yerler değiştirilemez kısımları belirtir. Eğer başlangıçta kahverengilerden birini değiştirirseniz aynı parametreyi sonra kullanılan yerlerde de değiştirmelisiniz.