Temel Yönleriyle Fortran 90 / 95 / 2003

  Temel Konular
* Önsöz

* Fortran'a Giriş
* Fortran'nın Temelleri
* Basit ve Formatlı Okuma/Yazma
* Temel Kütüphane Fonksiyonları
* Karşılaştırma Deyimleri
* Döngüler
* Alt Programlar I
* Alt Programlar II
* Diziler
* Dinamik Diziler
* Gösterici (Pointer) Kavramı
* Katarlar (Stringler)
* Yapısal Veri Tipleri
* Dosya Yönetimi
* Modül Kavramı
* Sayısal Tipler (KINDs)
* Bit Düzeyinde Çalışmak
* Kütüphane Fonksiyonları Listesi

* Yararlanılan Kaynaklar

  İleri Uygulamalar
* - - -
* Karmaşık Sayılar
* Tarih-Saat Fonksiyonları
* Rastgele Sayılar
* Katar - Sayı Dönüşümleri
* Komut Satırı İşlemleri
* Co-Array Fortran
* Derleme Seçenekleri
* Fortran ve C

  Seçilmiş Örnekler
* Sayılar Kuramı
* Analiz
* Lineer Cebir

  Fortran 90/95 Derleyicileri
* Salford (silversoft FTN95)
* G95
* GFORTRAN

  Dış Bağlantılar
* programlama.com
* Fortran (wikipedia)

* fortran.gantep.edu.tr
* g95.org
* Hot scripts

  İletişim
* E-posta

 

Bölüm 24: Komut Satırı İşlemleri (Fortran 2003)

###################- (%95)


Giriş

Bir programa komut satırından parametre aktarımı yapmakda mümkündür. Bu, derlenmiş (çalıştırılabilir) bir program komut satırından (işletim sistemi ortamından) çalıştırılacağı zaman yapılır. Parametre aktarımı, programın adı yazılıp bir boşluk bırakıldıktan hemen sonra yapılır.

Parametreler, komut satırından sayısal olarak girilse bile program içinde karakter topluluğu (string) olarak gelir. Bu durumda, bu ifadeleri sayısal değerlere çeviren fonksiyonlar kullanılır. Bunun için Bölüm 23'de anlatılan yöntemlerden yararlanılır.

Bu özellik Fortran 2003'e ait olmasına rağmen G95 derleyicisi tarafından desteklenmektedir.


24.1   Komut Satırına Erişim Fonksiyonları

Aşağıdaki fonksiyon ve rutinler, kullanıcıyı komut satırına eriştirir.
  • COMMAND_ARGUMENT_COUNT()
    Komut satırından girilen parametre sayısını verir.

  • CALL GET_COMMAND([COMMAND, LENGTH, STATUS])
    Aşağıdaki INTENT(OUT) özelliğine sahip değişkenleri gönderir.
    • COMMAND : (seçimlik) CHARACTER tipindeki bu değişken bütün komutu tutar.
    • LENGTH : (seçimlik) INTEGER tipindeki bu değişken komutun karakter sayını tutar.
    • STATUS : (seçimlik) INTEGER tipindeki bu değişken komut satırına erişimin gerçekleşip gerçekleşmediği sorgular. 0 ise sorun yok anlamındadır.

  • CALL GET_COMMAND_ARGUMENT(NUMBER[, VALUE, LENGTH, STATUS])
    Komut satırı argumanını (parameteresini) gönderir.
    • NUMBER : INTEGER tipinde ve INTENT(IN) özelliğine sahip bu değişken kaçıncı argümana erişileceğini gösterir.
      0 ila COMMAND_ARGUMENT_COUNT() arasında bir değerdir.
    • VALUE : (seçimlik) CHARACTER tipinde INTENT(OUT) özelliğine sahiptir ve argümanın değerini tutar.
    • LENGTH : (seçimlik) INTEGER tipinde ve INTENT(OUT) özelliğine sahiptir. Argümanın uzunluğunu tutar.
    • STATUS : (seçimlik) INTEGER tipinde ve INTENT(OUT) özelliğine sahiptir. Argümana erişimin başarılı olup olmadığnı sorgular.


24.2   Örnek Uygulamalar

ÖRNEK 1: KOMUT SATIRINDAKİ DEĞERLER

Bir önceki kısımda analatılan fonksiyonların ilk ve en basit kullanımı Program 24.1 verilmiştir.

Program 24.1: Komut satırındaki değerlerin yazdırılması.
01: 
02: 
03: 
04: 
05: 
06: 
07: 
08: 
09: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
PROGRAM KomSat
!-------------------------------------------------------
! 24prg01.f95
! Komut satırındaki değerlerin yazdırılması.
!-------------------------------------------------------
IMPLICIT NONE
CHARACTER(LEN=200) :: Komut
CHARACTER(LEN=10)  :: Arguman
INTEGER :: I

 ! Bütün komutu al ve yazdır
 CALL GET_COMMAND(Komut)
 PRINT *, "Komut : ",TRIM(Komut)

 ! Komut satırı argümanlarını yazdır
 DO I = 1, COMMAND_ARGUMENT_COUNT()

  CALL GET_COMMAND_ARGUMENT(I,Arguman)
  PRINT *, "Arguman ", I, " : ",TRIM(Arguman)

 END DO 

END PROGRAM 

Programın Windows ortamında G95 ile derlenip çalıştırılması aşağıdaki gibidir.
Linux ortamında derleme ve çalıştırma örneği aşağıdaki gibi olacaktır.


ÖRNEK 2: KOMUT SATIRINDAN GİRİLEN İKİ SAYININ TOPLANMASI

Bu örnekte komut satırından girilen iki sayının nasıl toplanacağı anlatılacaktır. İnceleyiniz.

Program 24.2: Komut satırından girilen iki sayının toplamı.
01: 
02: 
03: 
04: 
05: 
06: 
07: 
08: 
09: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
26: 
27: 
28: 
29: 
30: 
31: 
32: 
33: 
34: 
35: 
PROGRAM KomSat
!-------------------------------------------------------
! topla2.f95
! Komut satırından girilen iki sayının toplamı.
! Kullanımı: topla2 sayı1 sayı2
!-------------------------------------------------------
IMPLICIT NONE
CHARACTER(LEN=10)  :: Arg1, Arg2
INTEGER :: N, a, b

  ! Arguman sayısı
  N = COMMAND_ARGUMENT_COUNT()

  IF(N /= 2) STOP "Eksik veya fazla parametre"

  CALL GET_COMMAND_ARGUMENT(1,Arg1) ! 1 inci arguman
  CALL GET_COMMAND_ARGUMENT(2,Arg2) ! 2 nci arguman

  ! Argumanları tam sayıya çevir
  A = KtrTam(Arg1)
  B = KtrTam(Arg2)

  PRINT *,"Toplam = ", A+B

CONTAINS

      ! Bu fonksiyon bir katarı tamsayıya dönüştürür
      INTEGER FUNCTION KtrTam(Katar)
      CHARACTER (*), INTENT(IN) :: Katar

         READ(UNIT=Katar,FMT='(I10)') KtrTam

      END FUNCTION KtrTam

END PROGRAM 

ÇIKTI

$ g95 topla2.f95 -o topla2
$ topla2 11 22
 Toplam =  33
$ topla2
STOP Eksik veya fazla parametre



ÖRNEK 3: KOMUT SATIRINDAN GİRİLEN BÜTÜN SAYILARIN TOPLANMASI

Bir önceki örneğin daha gelişmiş bir örneği aşağıda verilmiştir. Burada komut satırından girilen bütün sayılar toplanmaktadır.

Program 24.3: Komut satırından girilen bütün sayının toplamı.
01: 
02: 
03: 
04: 
05: 
06: 
07: 
08: 
09: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
26: 
27: 
28: 
29: 
30: 
31: 
32: 
33: 
PROGRAM KomSat
!-------------------------------------------------------
! topla.f95
! Komut satırından girilen sayıların toplamı.
! Kullanımı: topla sayı1 sayı2 ...
!-------------------------------------------------------
IMPLICIT NONE
CHARACTER(LEN=10) :: Arg
INTEGER :: X, I, N, Toplam = 0

  ! Arguman sayısı
  N = COMMAND_ARGUMENT_COUNT()

  ! Argumanları al ve topla
  DO I = 1, N
    CALL GET_COMMAND_ARGUMENT(I,Arg)
    X = KtrTam(Arg)
    Toplam = Toplam + X
  END DO

  PRINT *,"Toplam = ", Toplam

CONTAINS

      ! Bu fonksiyon bir katarı tamsayıya dönüştürür
      INTEGER FUNCTION KtrTam(Katar)
      CHARACTER (*), INTENT(IN) :: Katar

         READ(UNIT=Katar,FMT='(I10)') KtrTam

      END FUNCTION KtrTam

END PROGRAM 

ÇIKTI

$ g95 topla.f95 -o topla
$ topla 11 22
 Toplam =  33
$ topla 11 22 33 44 100
 Toplam =  210



ÖRNEK 4: BEŞ İŞLEM

Son olarak, komut satırından girilen sayılar üzerinde beş işlem yapan bir program aşağıda verilmiştir.

Program 24.4: Komut satırından girilen iki sayı üzerinde beş işlem.
01: 
02: 
03: 
04: 
05: 
06: 
07: 
08: 
09: 
10: 
11: 
12: 
13: 
14: 
15: 
16: 
17: 
18: 
19: 
20: 
21: 
22: 
23: 
24: 
25: 
26: 
27: 
28: 
29: 
30: 
31: 
32: 
33: 
34: 
35: 
36: 
37: 
38: 
39: 
40: 
41: 
42: 
43: 
44: 
45: 
46: 
47: 
48: 
PROGRAM KomSat
!-------------------------------------------------------
! hesap.f95
! Komut satırından girilen iki sayı üzerinde beş işlem.
! Kullanımı: hesap sayı1 operatör sayı2
!-------------------------------------------------------
IMPLICIT NONE
INTEGER :: N
REAL :: X, Y, Z
CHARACTER(10) :: Arg1, Arg2, Arg3

  ! Arguman sayısı
  N = COMMAND_ARGUMENT_COUNT()

  IF(N < 3) STOP "Eksik parametre"
  IF(N > 3) STOP "Fazla parametre"


  CALL GET_COMMAND_ARGUMENT(1,Arg1) ! 1 inci parametre
  CALL GET_COMMAND_ARGUMENT(2,Arg2) ! 2  nci parametre
  CALL GET_COMMAND_ARGUMENT(3,Arg3) ! 3 üncü parametre

  x = KtrGer(Arg1)
  y = KtrGer(Arg3)

  SELECT CASE(Arg2(1:2))
    CASE('+');    z = x+y
    CASE('-');    z = x-y
    CASE('*');    z = x*y
    CASE('/');    z = x/y
    CASE('**');   z = x**y
    CASE DEFAULT; z = 0.0
             WRITE(*,*) "Geçersiz parametre: ", Arg2
  END SELECT

  PRINT *," Sonuc = ",z

CONTAINS

      ! Bu fonksiyon bir katarı gerçel sayıya dönüştürür
      REAL FUNCTION KtrGer(Katar)
      CHARACTER (*), INTENT(IN) :: Katar

        READ(UNIT=Katar, FMT='(F10.5)') KtrGer

      END FUNCTION KtrGer

END PROGRAM 

ÇIKTI

$ g95 hesap.f95 -o hesap
$ hesap 2.5 + 3.0
  Sonuc =  5.5
$ hesap 2.5 - 3.0
  Sonuc =  -0.5
$ hesap 2.5 ** 3.0
  Sonuc =  15.625



Powered by PHP