FORTRAN90 Prof. Dr. İskender Öksüz Arş. Gör. Alpay Şahin

Slides:



Advertisements
Benzer bir sunumlar
Fonksiyonlar.
Advertisements

Bilgisayar Programlama Güz 2011
EKRAN ÇIKTISI.
Değişkenler ve bellek Değişkenler
JavaScript Birinci Hafta.
TEMEL C PROGRAMLAMA DERSİ - 1
ALGORİTMA VE PROGRAMLAMAYA GİRİŞ ***** Prof.Dr. Mustafa Ergün
Atama ve Girdi/Çıktı Komutları
ALGORİTMA ÖRNEKLERİ Programlamaya Giriş
Bölüm 4 – Kontrol İfadeleri:1.kısım
SQL de Değişken Tanımlama
BPR152 ALGORİTMA VE PROGRAMLAMA - II
BPR151 ALGORİTMA VE PROGRAMLAMA - I
BPR151 ALGORİTMA VE PROGRAMLAMA - I
4. KONTROL VE DÖNGÜ KOMUTLARI
Karar ifadeleri ve Döngüler
Fonksiyonlar ve Alt Programlar
HAZIRLAYAN:SAVAŞ TURAN AKKOYUNLU İLKÖĞRETİM OKULU 2/D SINIFI
BPR152 ALGORİTMA VE PROGRAMLAMA - II
Bölüm 3 – Yapısal Programlama
Fortran PROGRAMLAMA DİLİ
Diziler.
Yapısal Program Geliştirme – if, if-else
Fortran Proglama Dili’nin Esasları
6. HAFTA
Görsel C# ile Windows Programlama
4. HAFTA Mart 2010.
Bilgisayar Programlama
Operatörler ve Denetim Yapıları
BPR152 ALGORİTMA VE PROGRAMLAMA - II
SQL de Değişken Tanımlama
Bilgisayar Programlama
Algoritmalar (Algoritms)
C++ Temelleri C++ genel amaçlı, nesne tabanlı, yüksek seviye programlama dilidir.
C ile Programlamaya Giriş
Celal Bayar Üniversitesi Hasan Ferdi Turgutlu Teknoloji Fakültesi
Akış Kontrol Mekanizmaları
PASCAL ile Programlamaya Giriş
Chapter 6: Using Arrays.
Kontrol Yapıları ve Döngüler
Celal Bayar Üniversitesi Hasan Ferdi Turgutlu Teknoloji Fakültesi
Çoklu dallanma seçimi: switch
BM-103 Programlamaya Giriş Güz 2014 (7. Sunu)
Diziler Adres Kavramı Nesnelerin Adresleri sizeof Operatörü
BM-103 Programlamaya Giriş Güz 2014 (8. Sunu)
VERİ İŞLEME VERİ İŞLEME-4.
a) b) c) d) e) Pi= 4* atan(1) y=Log10 | x | +4 Y= LOG10 (ABS(x))+4
JAVA’DA DİZİLER Dr.Galip AYDIN.
ÇOK DEĞİŞKENLİ FONKSİYONLARDA
BİL 102 BİLGİSAYAR PROGRAMLAMA
C PROGRAMLAMA FONKSİYONLAR Adres ile Fonksiyon Çağırma Pointer (İşaretçiler) ile Fonksiyon Çağırma Rekürsif Fonksiyonlar.
Diferansiyel Denklemler
String class String karakterler dizisidir
Outline 4.1 Giriş 4.2 Algoritmalar 4.3 Pseudocode 4.4 Kontrol İfadeleri 4.5 if tek-seçimli ifadeler 4.6 if else seçimli ifadeler 4.7 while döngü ifadeleri.
Fonksiyonlar ile Çalışmak
Örnek Adam asmaca oyununun programının yazılması.
Bu Günkü Konular If yapısı ve karşılaştırma operatörleri
Bugünkü Konular Döngüler ve Akış Diyagramları C de Döngü Tanımlama
Adım Adım Algoritma.
SAYISAL ANALİZ Doç.Dr. Cüneyt BAYILMIŞ.
BİLGİSAYAR PROGRAMLAMA Ders 5: Döngüler
BİLGİSAYAR PROGRAMLAMA DERSİ 4. DERS NOTU Konu: M-dosya yapısı ve Kontrol Yapıları 1.
PHP'de Program Denetimi
Bilgisayar Programlamasına ve Veri Analizine Giriş - IV
BİLGİSAYAR PROGRAMLAMA Ders 5: Döngüler
ARDUİNO Arduino Eğitimleri Bölüm 3 Programlama Dili Temelleri
Bilgisayar Programlama
Bilgisayar Bilimi Problem Çözme Süreci-2.
ALGORİTMALAR VE PROGRAMLAMAYA GİRİŞ
Akis diyagramı Örnekleri
Sunum transkripti:

FORTRAN90 Prof. Dr. İskender Öksüz Arş. Gör. Alpay Şahin Arş. Gör. Hüseyin ARBAĞ Ders kitabı: FORTRAN90 for Engineers and Scientists Larry Nyhoff ve Sanford C. Leestma Prentice Hall 1997

1 Bilgisayar programlama: Programlama dilleri, makine dili, yüksek düzey diller Derleyici, “source”, “object”, “link” kavramları. Algoritma, bir programın yaşam aşamaları

Makine dili X = A * B + C Hafızanın A adresindeki değeri al, ALU’da bir “register”e yükle; Hafızanın B adresindeki değeri al, yukardaki değerle çarp ve sonucu aynı “register”de tut. Hafızanın C adresindeki değeri registerdeki değere ekle. Registerdeki değeri hafızanın X adresine koy.

Makine dili X = A * B + C Opcode Operand 00010000000000000000010000000000 (A’daki değeri reg. yükle) Hex: 08 00 04 00 00100100000000000000010000000001 (B’deki değerle çarp) Hex: 24 00 04 01 00100011000000000000010000000010 (C’deki değeri reg. ile topla) Hex: 23 00 04 02 00010001000000000000010000000011 (Registerdeki değeri X’e taşı) Hex: 11 00 04 03 İki tabanındaki sayılar : 0, 1 Ondalık sayılar : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 Onaltılık (hex) sayılar : 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F

Biraz daha hex Ondalık  Hex Hex  Ondalık 1 = 1 10 = A 147 = 93 DD = 221 255 = FF

Makine dili - Assembler X = A * B + C 08 00 04 00 24 00 04 01 23 00 04 02 11 00 04 03 MOV A, ACC MUL B, ACC ADD C, ACC STO ACC, X

Peki FORTRAN? X = A * B + C

Derleyici (compiler) (Java’da ve scriptlerde yok) Üst seviye dili FORTRAN C Pascal Basic C++ Java C# Üst seviye dili Derleyici (compiler) (Java’da ve scriptlerde yok) Makine dili

Derleme (Compilation) Kaynak kod (Source code) Source module Üst seviye dili X = A * B + C 08 00 04 00 24 00 04 01 23 00 04 02 11 00 04 03 Ara dil (Java, C#) Derleyici (compiler) (Java’da ve scriptlerde yok) Makine dili Object code Object module

Bitti mi? dll : dynamic link library Okuma programı Bağlama- link İcra edilebilir program: Executable Çarp_Topla.exe Object program Ekrana yazma programı … programı … programı dll : dynamic link library

Hatalar: Derleme hataları (Compiler error) Bağlama hataları (Falan modülü bulamadım) İcra hataları (Run time error)

Bir mühendislik problemi nasıl çözülür? Işın Çekirdek, Ver Bir Diploma da Mezun Olalım Üniversitesi’nde çekirdek fizikçisidir. Deney için 10 mg Polonyum almış. Sonra unutmuş ve aradan 180 gün geçmiş. Polonyum’un yarı ömrü 140 gün. Şimdi elinde kaç mg Po kaldığını hesab etmek istiyor. Girdiler Çıktı Başlangıç miktarı: 10 mg Kalan miktar: ? Yarı ömür: 140 gün Geçen zaman: 180 gün

Bir mühendislik problemi nasıl çözülür? Girdiler Çıktı Başlangıç miktarı: 10 mg Kalan miktar Yarı ömür: 140 gün Geçen zaman: 180 gün Biraz daha genel yazalım ve problemin verilerine isim verelim: Girdiler Çıktı Başlangıç miktarı: BaslangicMiktari Kalan miktar: KalanMiktar Yarı ömür: YariOmur Geçen zaman: GecenZaman

Hesaplama algoritması kuralım Girdiler Çıktı Başlangıç miktarı: BaslangicMiktari Kalan miktar: KalanMiktar Yarı ömür: YariOmur Geçen zaman: GecenZaman BaslangicMiktari, YariOmur, GecenZaman değerlerini oku KalanMiktar’ı hesapla KalanMiktar değerini yaz

Algoritma… BaslangicMiktari, YariOmur, GecenZaman değerlerini al KalanMiktar’ı hesapla KalanMiktar değerini yaz Nasıl? GecenZaman = YariOmur ise: KalanMiktar = BaslangicMiktari X 0.5 GecenZaman = 2YariOmur ise: KalanMiktar = (BaslangicMiktari X 0.5) X 0.5 = BaslangicMiktari X (0.5)2 KalanMiktar = BaslangicMiktari X (0.5) GecenZaman/YariOmur Fortran ile: KalanMiktar = BaslangicMiktari * 0.5 ** (GecenZaman / YariOmur)

Algoritma BaslangicMiktari, GecenZaman, YariOmur değerlerini oku KalanMiktar = BaslangicMiktari * 0.5**(GecenZaman/YariOmur) hesapla KalanMiktar’ı yazdır

Akış diagramı (Flowchart) Algoritma Başla BaslangicMiktari GecenZaman YariOmur değerlerini oku Akış diagramı (Flowchart) KalanMiktar = BaslangicMiktari * 0.5**(GecenZaman/YariOmur) hesapla KalanMiktar değerini yaz Dur

Ara: Algoritma ~ El Harezmî Ebû Cafer Muhammed bin Musâ el- Harizmî (Ölümü: 847) İlk cebir kitabının yazarı: “Kitabı muhtasar fi hisabil- cebr ve’l mukabele” İlk “algoritma” fikri de onun; o yüzden adını taşıyor… Lâtinceye çevirirken H ile G’yi karıştırmışlar: H: ﺧ G: ﻏ

Artık programı yazabiliriz: PROGRAM Radyoaktif_Bozunma !-------------------------------------------------------------------------------------------------------- ! Bu program, yarı ömür ve başlangıç miktarı verildiğinde, belli bir süre sonunda kalan ! radyoaktif madde miktarını hesaplar. Kullanılan değişkenler şunlardır: ! BaslangicMiktari : Radyoaktif maddenin mg cinsinden başlangıç miktarı ! YarıOmur : Radyoaktif maddenin gün cinsinden yarı ömrü ! GecenZaman : Gün cinsinden geçen zaman ! KalanMiktar : GecenZaman gün sonra geriye kalan miktar (mg olarak) ! ! Girdiler : BaslangicMiktari, YariOmur, GecenZaman ! Çıktı : KalanMiktar !--------------------------------------------------------------------------------------------------------

Radyoaktif bozunma programı… devam IMPLICIT NONE REAL :: BaslangicMiktari, YariOmur, GecenZaman, KalanMiktar ! BaslangicMiktari, GecenZaman, YariOmur değerlerini oku PRINT *, “Başlangıç miktarı, yarı ömür ve gecen zaman değerlerini giriniz: ” READ *, BaslangicMiktari, YariOmur, GecenZaman ! KalanMiktar = BaslangicMiktari * 0.5**(GecenZaman/YariOmur) hesapla KalanMiktar = BaslangicMiktari * 0.5 ** (GecenZaman / YariOmur) ! KalanMiktar değerini yaz PRINT *, “Kalan miktar =“, KalanMiktar, “mg” END PROGRAM Radyoaktif_Bozunma

Akış diyagramının parçaları: Algoritmanın başı veya sonu Akış bir karara göre ikiye (veya daha fazla yola) ayrılıyor: Yol çatallanıyor. Veri girişi veya çıkışı Döngü İşlem Bir alt yordam- alt algoritma Akış başka bir yerde devam ediyor- oraya git 7

Yazılım geliştirme aşamaları Çözümleme Veri düzeni ve algoritma tasarımı Kodlama Şelale modeli Test ve uygulama İteratif şelale modeli Bakım (maintenance)

Öğrendiğimiz FORTRAN ifadeleri PROGRAM program- ismi PROGRAM Radyoaktif_bozunma IMPLICIT NONE Type REAL :: değişken-isimleri-listesi REAL :: BaslangicMiktari, GecenZaman INTEGER :: OgrenciSayisi, OgrenciNumarasi

Öğrendiğimiz FORTRAN ifadeleri Girdi (input) ifadesi READ *, okunacak-değişkenler-listesi READ *, BaslangicMiktari, YariOmur, GecenZaman Çıktı (output) ifadeleri PRINT *, yazılacak-değişkenler-listesi PRINT *, “Kalan miktar = ”, KalanMiktar, “mg” WRITE(*,*) yazılacak-değişkenler-listesi WRITE(*, *) “Kalan miktar = ”, KalanMiktar, “mg”

Öğrendiğimiz FORTRAN ifadeleri Atama (assignment) ifadesi değişken = ifade Delta = b*b – 4.* a * c KalanMiktar = BaslangicMiktari * 0.5 ** (GecenZaman / YariOmur) DİKKAT: Cebir denklemi değildir. Bazı dillerde = yerine kullanılır. A * b = c + d gibi şeyler yazılamaz. Bitiş: END program-ismi END Radyoaktif_bozunma Tanımlayıcılar Program isimleri, değişken isimleri gibi tanımlayıcılar bir harfle başlar, harften sonra 30 veya daha az harf, sayı veya alt çizgi (_) bulunabilir. KalanMiktar, YariOmur, A28, Radyoaktif_Bozunma

Ödev: Harizmî’nin anısına… (Harizmî, daha önce ismin verdiğimiz kitabında ikinci derece denkleminin çözümüyle uğraşmış, bir çok hal için çözmüş ve ilk defa iki kök bulunduğunu fark etmiştir.) Işın Çekirdek, radyoaktif bozunma programını yazdıktan sonra şu denklemle karşılaştı: 2 x2 – 19 x + 35 = 0 Artık böyle durumlarda tek bu problemi çözmek yerine genel bir program yazmayı öğrenmişti. Siz de genel bir program yazın, hem bu denklemi hem de daha sonra çıkabilecek benzer denklemleri çözsün…

2 Temel FORTRAN FORTRAN veri tipleri, sabitler, değişkenler Aritmetik işlemler, aritmetik fonksiyonlar Atama komutu Veri girişi ve veri çıkışı Program düzeni ve biçimi

FORTRAN veri tipleri, sabitler, değişkenler: Veri tipleri INTEGER Tam sayı REAL Gerçek sayı COMPLEX Kompleks sayı CHARACTER Alfa-numerik LOGICAL .TRUE. .FALSE.

Integer sabitler FORTRAN veri tipleri, sabitler, değişkenler: “Integer” sabitler Integer sabitler Doğru: 0 137 -2516 +17745 Yanlış 9,999 16.0 --5 7- 3.

FORTRAN veri tipleri, sabitler, değişkenler: “Real” sabitler Doğru: 1.234 -0.01536 -1.536E-2 6.02E23 +5. Yanlış 5 1,234

FORTRAN veri tipleri, sabitler, değişkenler: “Character” sabitler “PDQ123-A” “Işın Çekirdek” ‘Işın Çekirdek’ ‘Işın’’ın’ Yanlış ‘Işın’ın’ “PDQ123-A’

… değişkenler Önce ilan gerekiyor (decleration) type-specifier :: list INTEGER :: Ogrenci_Sayisi, Iterasyon İsterseniz ilk değerleri ilan sırasında verebiliyorsunuz: INTEGER :: Ogrenci_Sayisi = 65, Iterasyon = 2 REAL :: Kutle, Hiz REAL :: Kutle = 12., Hiz

Character değişkenler CHARACTER (length-specifier) :: list Character(15) :: Isim, Soyad Character(15) :: Isim, Soyad , Sokak*20 Character :: Isim = “Atila” Sadece A’yı taşır. Character(10) :: Isim = “Ali” “Alibbbbbbb”taşır Kesme de yastıklama da sağdan yapılıyor.

IMPLICIT NONE FORTRAN’da A-H, O-Z ile başlayan değişkenler otomatik olarak REAL sayılır I- N ile başlayan değişkenler: INDEX, JALE, NANEMOLLA… INTEGER sayılır. IMPLICIT NONE bu kabulü geçersiz kılar. IMPLICIT NONE kullanıldığında her değişkenin ne olduğu açıkça (explicit olarak) ilân edilmelidir.

PARAMETER REAL, PARAMETER :: Pi = 3.141593 INTEGER, PARAMETER :: Ogrenci_Sayisi = 27 Bir başka ilk değer verme metodu. Fark: Bu değer program boyunca değiştirilmez. Neden gerektiğinde 3.141593 yazmıyoruz?

“Identifiers” Identifiers: Tanımlayıcılar Program isimleri PROGRAM Ikinci_Derece_Denklem123 Değişken, parametre isimleri REAL NotOrtalamasi INTEGER OgrenciSayisi Harfle başlamalı. Devamı alfabe, sayı veya alt_çizgi olabilir. Toplam 31 karakter.

FORTRAN programını parçaları Heading Specification Execution Subprogram END PROGRAM

Sorular Veri tiplerini sayınız Karakter sabitleri …. veya …. arasına alınmalıdır. Tanımlayıcılar …. ile başlamalı ve en çok …. karakter olmalıdır. Fortran programının parçalarını sayınız Bu değişkenlerin hangileri yanlıştır? Neden? Kalori A-tipi 2tipi SaatteKilometre PS.175 Saatte_Kilometre N/4 Yuz+ YüzDolar

Sorular Aşağıdakiler doğru sabitler midir? Sabitin tipini söyleyiniz. Yanlışsa niçin? 1234 1,234 -1.234 -1. 0.123E+04 ‘ bir’ bir “bir” ‘Dalton’un yasasi’ 12.34YTL 123E4 E4 +1234 12+34 “12+34”

Sorular INTEGER :: Mu REAL :: Zaman, Uzaklik Mu kelimesini bir INTEGER olarak tanımlayın INTEGER :: Mu Zaman ve Uzaklik kelimelerini REAL olarak tanımlayın REAL :: Zaman, Uzaklik Ad1, Ad2 20 karakterlik, Ad3 10 karakterlik CHARACTER sabitleridir. Tanımlayın CHARACTER(20) :: Ad1, Ad2, Ad3*10

Sorular Limit1, Limit2, Limit3, başlangıç değerleri 10, 20, 30 olan tam sayılardır. Tanımlayın INTEGER :: Limit1 = 10, Limit2 = 20, Limit3 = 30 Zaman ve Uzaklik, REAL değişkenlerdir. Tanımlayınız. REAL :: Zaman, Uzaklik Bolum, “Kimya” başlangıç değerine sahip CHARACTER; Enf, 102 başlangıç değerine sahip INTEGER değişkendir. Tanımlayınız. CHARACTER(*) :: Bolum = ‘Kimya’ INTEGER :: Enf = 102 Ad1, Ad2 en çok 20 karakter boyunda, Ad3 en çok 10 karakterlik CHARACTER değişkenleridir. Tanımlayınız. CHARACTER(20) :: Ad1, Ad2, Ad3*10

Sorular Bölüm, “Kimya Muhendisligi”ne eşit karakter değişkenidir. Tanımlayın. CHARACTER(*) :: Bolum = “Kimya Muhendisligi” Merih, 1.2E12 ve Dunya 1.5E10 değerlerini taşıyan sabitlerdir. Tanımlayınız. REAL, PARAMETER :: Merih = 1.2E12, Dunya 1.5E10

Aritmetik işlemler ve fonksiyonlar Bilin bakalım bunlar hangi işlemler: + - / * ** B2 – 4AC B**2 – 4 * A * C 9. / 4.  2.25000 9 / 4  2 4./ 9.  0.444444 4 / 9  0

Aritmetik işlemler ve fonksiyonlar Karışıksa ne sonuç vereceğ belli olmaz; onun için karıştırmayın. 3.0 + 8 / 5 ile 3 + 8. / 5 aynı sonucu vermez. Bir durumda karıştırma tavsiye edilir: 2.0 ** 3  8.0 2.**3.  exp(3.ln(2.)

Aritmetik işlemler ve fonksiyonlar İşlem hiyerarşisi 1. Önce ** (sağdan sola) 2. Sonra * ve / (soldan sağa) 3. Sonra + ve – (soldan sağa) Tereddüdünüz varsa parantez açın!

Aritmetik işlemler ve fonksiyonlar ABS(X) FRACTION(X) NINT(X) COS(X) LOG(X) REAL(X) EXP(X) MAX(X1,… XN) SIN(X) INT(X) MIN(X1,… XN) SQRT(X) FLOOR(X) MOD(X, Y) TAN(X)

… fonksiyonlar X – Y bölü X + Y ‘nin mutlak değerinin logaritmasını alın LOG(ABS((X – Y) / (X + Y))) A2 – B2 – 2AB Cos T nin FORTRANcasını yazın A ** 2 – B ** 2 – 2. * A * B * COS(T)

Variable = expression Ne eksik? Hesap yapıyoruz ama elde ettiğimiz değerleri bir yerlere koyamıyoruz: Atama ifadesi: Assignment statement: = Variable = expression

Atama ifadesi XKoord ? YKoord Sayi Terim İlanlar, aslında hafızada (RAM’da) yer ayırır. REAL :: XKoord, YKoord INTEGER :: Sayi, Terim XKoord ? YKoord Sayi Terim

Atama ifadesi XKoord ? Ykoord Sayi Terim 10.46 5.23 5.0 17 7 YKoord = SQRT(25.0) Sayi = 17 Terim = Sayi / 3 + 2 XKoord = 2.0 * XKoord XKoord ? Ykoord Sayi Terim 10.46 5.23 5.0 17 7

Atama ifadesi A 122.45 B -18.567 -18.567 A 122.45 B -18.567 C ? A = B ne demek? A = B icra edildiği anda A ile B’yi yer değiştirmek istersek? C = A A = B B = C icra edilir A 122.45 B -18.567 -18.567 A 122.45 B -18.567 C ? -18.567 122.45 122.45

Atama ifadesi A = A +B ne demek? Böyle bir ifade acemi programcıyı şaşırtabilir. A = A + B icra edildiği anda… A 122.45 B -18.567 103.883

Hızlı sınav Aşağıdakilerin geçerli atama ifadeleri olup olmadığını, geçersizse sebebini söyleyin. INTEGER :: M, N REAL :: Pi, Alfa Pi = 3.141593 3 = N N = N+ 1 N + 1 = N Alfa = 1 Alfa = “1” Alfa = Alfa M = N = 1 Şu FORTRAN atama komutlarını yazınız: Hiz ile Zaman değişkenlerini çarpıp sonucu Mesafe’ye koyun. Mesafe = Hiz * Zaman A2+B2 ‘nin karekökünü C ye Sayi adlı tam sayı değişkeninin değerini 1 arttirin C = SQRT(A ** 2 + B **2) Sayi = Sayi +1

Serbest düşüş problemi z = ½ gt2 + v0t + h0 v = gt +v0 Z = 0.5 * g * Zaman * Zaman + Vsifir * Zaman + Hsifir Hiz = g * Zaman + Vsifir

Veri giriş çıkışı READ *, giren veri-listesi Z = 0.5 * g * Zaman * Zaman + Vsifir * Zaman + Hsifir Hiz = g * Zaman + Vsifir READ *, giren veri-listesi READ (*, *) giren veri-listesi READ *, g, zaman, vsifir, hsifir PRINT *, çıkan veri-listesi WRITE (*, *) çıkan veri-listesi PRINT *, “Yükseklik = “, Z, “m”, “Hız = ”, Hiz, “m/s”

Serbest düşüş probleminin giriş-çıkışlı hâli PROGRAM Serbest_Dusme !-------------------------------------------------------------------------------------------------- ! Bu program yüksekliği z = ½ gt2 + v0t + h0 ve hızı v = gt +v0 denklemiyle bulur. ! Başlangıçta kullanıcıdan g, Zaman, Vsifir ve Hsifir değerlerini vermesi istenir ! Bu değerler girildiğinde yükseklik ve hız m ve m/s cinsinden ekranda belirir IMPLICIT NONE REAL g, Zaman, Vsifir, Hsifir PRINT *, “Yer cekimi sabiti g, zaman ve baslangic hizi ve yüsekligi degerlerini giriniz” READ *, g, Zaman, Vsifir, Hsifir Z = 0.5 * g * Zaman * Zaman + Vsifir * Zaman + Hsifir Hiz = g * Zaman + Vsifir PRINT *, “Yukseklik = “, Z, “m”, “ Hiz = ”, Hiz, “m/s” PRINT *, “Hosca kalin…” END PROGRAM Serbest_Dusme

Not: END ve STOP komutları Eskiden END program dosyasının sonunu gösterirdi. Programlar STOP END diye biterdi. Şimdi END  STOP + END anlamına geliyor. END programın sonunda kullanılır. STOP’u istediğiniz yerde kullanabilirsiniz. STOP veya STOP 15 veya STOP “BITTI”

Program düzeni ve biçimi Satır en çok 132 karakter uzunluktadır Komutları aralarına ; koyarak tek satıra yazabilirsiniz Satır altta devam edecekse sonuna & konur CHARACTER zincirini devam ettirmek için hem satır sonuna, hem diğer satırın başına & konur. PRINT *, “Nasilsiniz? İyi misiniz? & & Korkarim iyisiniz. :-)” “Comment” için satır ! ile başlatılır. Arada da kullanılır. REAL Hiz ! Herhangi bir andaki hiz İfadelerde etiket (statement label) kullanılıyorsa bu ifadeden önce gelir, etiket ile ifade arasında en az bir boşluk bırakılır ve etiket 1 – 99999 arasında bir sayı olur. İfadeler icra edilir (executable) veya icra edilmeyen (non-executable) diye ayrılır.

Akış kontrolü READ *, A, B, C DELTA = B*B – 4.* A * C DELTA = SQRT(DELTA) X1 = (-B + DELTA) / (2. * A) X2 = (-B - DELTA) / (2. * A) PRINT *, X1, X2

Akış kontrolü devam… READ *, A, B, C DELTA = B*B – 4.* A * C IF(DELTA > 0) THEN DELTA = SQRT(DELTA) X1 = (-B + DELTA) / (2. * A) X2 = (-B - DELTA) / (2. * A) PRINT *, “Kokler gercek: ”, X1, X2 END IF

Akış kontrolü devam… READ *, A, B, C DELTA = B*B – 4.* A * C IF(DELTA > 0) THEN DELTA = SQRT(DELTA) X1 = (- B + DELTA) / (2. * A) X2 = (- B – DELTA) / (2. * A) PRINT *, “Kokler gercek: ”, X1, X2 ELSE DELTA = SQRT(-DELTA) X1R = -2.* B X2R = X1R X1IM = DELTA / (2. * A) X2IM = -X1I PRINT *, “Kokler kompleks: X1 = ”, X1R, XIIM, “ ve X2 =“, X2R, X2IM END IF

READ *, A, B, C DELTA = B*B – 4.* A * C IF(DELTA > 0) THEN DELTA = SQRT(DELTA) X1 = (- B + DELTA) / (2. * A) X2 = (- B – DELTA) / (2. * A) PRINT *, “Kokler gercek: ”, X1, X2 ELSE IF (DELTA < 0) THEN DELTA = SQRT(-DELTA) X1R = -B / (2. * A) X2R = X1R X1IM = DELTA / (2. * A) X2IM = -X1I PRINT *, “Kokler kompleks: X1 = ”, X1R, XIIM, “ ve X2 =“, & X2R, X2IM ELSE X1 = -B / (2. * A) X2 = X1 PRINT*, “Kokler esit, X1 = X2 = ”, X1 END IF

Ödev: İkinci derece denklem çözen programı yazıp çalıştırın ama sıra şöyle olsun: Önce diskriminant >0, sonra 0, sonra pozitif. 0- 100 arasındaki öğrenci notunu okuyup, 0- 20 ye F 20- 40 a D 40- 60 a C 60- 80 e B 80- 100 e A veren bir program yazınız.

Bir başka problem: Bir program yazınız: Haftanın günlerini sayı olarak okusun. Günün adını yazsın: 1 ise Pazartesi, 2 ise Salı, … ve 7 ise Pazar…

Gün programı PROGRAM HAFTANIN_GUNLERI IMPLICIT NONE INTEGER GUN PRINT *, “HAFTANIN HANGI GUNU?” READ *, GUN IF(GUN == 1) THEN PRINT *, “PAZARTESI” STOP ELSE IF(GUN == 2) THEN PRINT *, “SALI” ELSE IF(GUN == 3) THEN PRINT *, “CARSAMBA”

Haftaya devam: IF(GUN == 4) THEN PRINT *, “PERSEMBE” STOP ELSE IF(GUN == 5) THEN PRINT *, “CUMA” ELSE IF(GUN == 6) THEN PRINT *, “CUMARTESI”

…VE HAFTANIN SONU IF(GUN == 7) THEN PRINT *, “PAZAR” STOP ELSE PRINT *, “GIRDIGINIZ GUNDE BIR & &YANLISLIK OLMASIN?”, GUN END IF END PROGRAM HAFTANIN_GUNLERI

Aynı probleme bir başka çözüm: SELECT CASE (GUN) CASE (1) PRINT *, “PAZARTESI” CASE (2) PRINT *, “SALI” CASE (1) CASE (3) PRINT *, “CARSAMBA” CASE (4) PRINT *, “PERSEMBE” CASE (5) PRINT *, “CUMA” CASE (6) PRINT *, “CUMARTESI” CASE (7) PRINT *, “PAZAR” CASE DEFAULT PRINT *, “GIRDIGINIZ SAYI 1 ILE 7 ARASINDA DEGIL: “, GUN END SELECT END PROGRAM HAFTANIN_GUNLERI

Şimdi “resmen” görelim: IF IF (logical expression) THEN ifadeler… END IF ELSE de bulunabilir: ELSE başka ifadeler…

Başka? IF (logical expression) THEN ifadeler… ELSE END IF

…VE ELSE IF IF (logical expression) THEN ifadeler… ELSE IF(logical expression) THEN başka ifadeler… daha da başka ifadeler ELSE ifadeler.. ifadeler… END IF

SELECT CASE SELECT CASE(selector) CASE (alternatif1) ifadeler… ------ CASE DEFAULT END CASE alternatif diye belirttiğimiz etiketlerin içinde INTEGER, CHARACTER veya LOGICAL sabit veya ifade olabilir. REAL olamıyor.. Neden? DEFAULT ne demek?

IF ve SWITCH ifadeleri isim alabilir İsim: IF(logical expression) THEN ----- END IF İsim İsim: SELECT(selector) ------ END SELECT İsim

Sabitler ve değişkenler Sabitler ve değişkenleri karıştırdığınızı görüyorum. Yüzüne bakınca tipini anlıyorsanız sabittir: 5 5. “BES” 6.02E23 .TRUE. (3.57, 2,85) Anlayamıyorsanız değişkendir: (Değişken tiplerini o yüzde “ilan” etmek zorunda kalıyoruz.) BES DEGISKEN SABIT KARAKTER Bu PRINT komutunda kimler sabit, kimler değişken? PRINT *, “BES = ”, 5., “GERCEK = ”, .TRUE., “X1= ”, X1

Mantık operatörleri özeti: Kıyas operatörleri: Diğer mantık operatörleri .GT. > .LT. < .GE. >= .LE. <= .EQ. = = .NE. /= .AND. .OR. .NOT. .EQV. .NEQV. Hiyerarşi: .NOT. .AND. .OR. .EQV. (veya .NEQV.)

Alıştırmalar: P, Q ve R sırasıyla .TRUE.,.TRUE ve .FALSE. değerlerine sahiptir. Buna göre aşağıdaki ifadelerin sonucunu bulunuz: P .AND. .NOT. Q .NOT. P .AND. Q P .AND. Q .OR. .NOT. R P .OR. Q .AND. Q P .AND. .NOT. Q .OR. R P .AND. .NOT. (Q .OR. R)  .TRUE.  .FALSE.  .TRUE.  .TRUE.  .FALSE.  .FALSE.

… alıştırmalar INTEGER:: NUMBER = 3, COUNT = 4, SUM = 5 Aşağıdaki mantık ifadelerinin sonucunu bulunuz: SUM – NUMBER <= 4 0 <= COUNT <= 5 NUMBER**2 + COUNT**2 = = SUM**2 NUMBER < COUNT .OR. COUNT < SUM (NUMBER + 1 < SUM) .AND. .NOT. (COUNT + 1 < SUM)  .TRUE. OLMAZ!  .TRUE.  .TRUE.  .TRUE.

…alıştırmalar INTEGER:: X sıfırdan farklıysa .TRUE. sonucunu veren bir mantık ifadesi yazınız: X .NE. 0 veya X /= 0 X -10 ve +10 kapalı aralığındaysa .TRUE. sonucunu veren bir mantık ifadesi yazınız -10 < = X <= 10 (-10 <= X) .AND. (X <= 10) olmaz

…alıştırmalar REAL:: X, Y X ve Y’nin ya birlikte negatif, yahut birlikte pozitif olduklarını .TRUE. Sonucunu veren bir mantık ifadesi yazınız. (X < 0) .EQV. (Y < 0)

…alıştırmalar  X   X  X Aşağıdakilerden hangileri geçerli IF ifadeleridir?  X IF( A > B) PRINT *, A IF ( X <= Y) STOP IF(1 <= N <= 10) N = 10 IF ( X = = 10) INTEGER:: TAM IF B < C N = N + 1 IF (A = X) READ *, Y IF (N > 1) PRINT *, “*”   X  X

…alıştırmalar IF(X >= Y)THEN PRINT*, X ELSE PRINT*, Y END IF X ve Y aşağıdaki değerleri aldığında sonuç nedir? X = 5, Y = 6 X = 5, Y = 5 X = 6, Y = 5 6 5 6

…alıştırmalar Aşağıdaki değerler için sonucu bulun 10 10 10 IF( X >= 0) THEN IF(Y >= 0) THEN PRINT *, X + Y ELSE PRINT *, X – Y END IF PRINT *, Y – X Aşağıdaki değerler için sonucu bulun X = 5, Y = 5 X = 5, Y = -5 X = -5, Y = 5 10 10 10

…alıştırmalar Aşağıdaki değerler için sonucu bulun IF( N > = 90) THEN PRINT *, “PEKIYI” ELSE IF (N >= 80) THEN PRINT *, “IYI” ELSE IF (N >= 70) THEN PRINT *, “ORTA” ELSE PRINT *, “KOTU” END IF Aşağıdaki değerler için sonucu bulun N = 100 N = 90 N = 89 N = 70 N = 0 PEKIYI PEKIYI IYI ORTA ZAYIF

…alıştırmalar N tam sayısı negatif veya 100’den büyükse çıktıya “ARALIK DISI” yazan bir IF ifadesi yazın: IF( N < 0 .OR. N > 100) PRINT *, “ARALIK DISI”

…alıştırmalar IF (X< 1.5) THEN N = 1 ELSE IF (X < 2.5) THEN REAL:: X; INTEGER N X <= 1.5 ise N = 1, 1.5 < X < 2.5 ise N = 2 ve X bunların dışındaysa N = 3 değerini veren bir IF yazınız. Yazarken programınızın hızlı çalışmasına dikkat edin. IF (X< 1.5) THEN N = 1 ELSE IF (X < 2.5) THEN N = 2 ELSE N = 3 END IF IF (X < 1.5) N = 1 IF (1.5< X .OR. X < 2.5) N = 2 IF (X >= 2.5) N = 3

…alıştırmalar NUMBER = 99 ise sonuç nedir? 198 NUMBER = -1 ise? -2 BOS VER REAL:: NUMBER SELECT CASE(NUMBER) CASE DEFAULT PRINT*, “BOS VER” CASE(99) PRINT*, NUMBER + 99 CASE(-1) PRINT*, NUMBER – 1 END SELECT

…alıştırmalar REAL:: ORTALAMA READ*, ORTALAMA SELECT CASE (INT(ORTALAMA) CASE (90:) NOT = “A” CASE (80:89) NOT = “B” CASE (70:79) NOT = “C” CASE (60:69) NOT = “D” CASE(:59) NOT = “F” END SELECT

4 Tekrarlı icra IF ve SELECT komutlar olmasa FORTRAN programında ifadeler yazılış sırasına göre yerine getirilirdi. Programlar “karar” veremezdi. Düz akışı değiştiren son komut tipi “tekrar” yapılarıdır. Tekrar yapıları bir şart yerine gelinceye kadar aynı işlemler kümesinin bir daha- bir daha yapılmasını sağlar.

Sayaçlı DO döngüleri DO kontrol-değişkeni = ilk-değer, son-değer, adım ifadeler END DO kontrol-değişkeni : Bir tam sayı değişkenidir ilk değer : kontrol-değişkeninin alacağı ilk değerdir. son-değer : kontrol-değişkeninin alabileceği son değerdir adım : Döngüden her geçişte ilk değer’e eklenecek tam sayıdır

DO kontrol-değişkeni = ilk-değer, son-değer, adım ifadeler END DO !Misal, 1’den N’e kadar tek sayıların toplamı !Misal: 1’den N’e kadar sayıların toplamı: INEGER:: I, N REAL:: TOPLAM ---------- TOPLAM = 0. DO I = 1, N TOPLAM = TOPLAM + I END DO , 2

!Misal: 1’den N’e kadar sayıların toplamı: INEGER:: I, N REAL:: TOPLAM DO etiket kontrol-değişkeni = ilk-değer, son-değer, adım ifadeler etiket son-icra-edilebilir-komut !Misal: 1’den N’e kadar sayıların toplamı: INEGER:: I, N REAL:: TOPLAM ---------- TOPLAM = 0. DO I = 100, 1, N 100 TOPLAM = TOPLAM + I !Misal, 1’den N’e kadar tek sayıların toplamı , 2

Sınıf ortalamasının bulunması !Sınıfta 54 öğrenci var. Aldıkları notlar tek tek !girilecek ve öğrenci sayısı (OGRENCI) kadar !not girildiğinde ortalama hesaplanacak: PROGRAM ORTALAMA_AL IMPLICIT NONE INTEGER:: OGRENCI, SAYAC REAL:: TOPLAM, ORTALAMA, NOT

Sınıf ortalamasının bulunması TOPLAM = 0. DO SAYAC = 1, OGRENCI PRINT*, “NOT GIRINIZ” READ*, NOT TOPLAM = TOPLAM + NOT END DO ORTALAMA = TOPLAM / REAL(OGRENCI) PRINT*, OGRENCI, “ OGRENCININ ORTALAMA & &NOTU = “, ORTALAMA END PROGRAM ORTALAMA_AL

Aynı problemin bir başka çözümü TOPLAM = 0. DO SAYAC = OGRENCI, 1, -1 PRINT*, “NOT GIRINIZ” READ*, NOT TOPLAM = TOPLAM + NOT END DO ORTALAMA = TOPLAM / REAL(OGRENCI) PRINT*, OGRENCI, “ OGRENCININ ORTALAMA & &NOTU = “, ORTALAMA END PROGRAM ORTALAMA_AL

Hızlı sınav MERHABA MERHABA MERHABA MERHABA MERHABA Çıktı nedir: DO I = 1, 5 PRINT*, “MERHABA” END DO DO I = 1, 5, 2 DO I = 1, 6 PRINT*, I, I+1 MERHABA MERHABA MERHABA MERHABA MERHABA MERHABA MERHABA MERHABA 1 2 / 2 3/ 3 4/ 4 5/ 5 6/ 6 7

…hızlı sınav 6 5 36 25… MERHABA Çıktı nedir: DO I = 6, 1, -1 PRINT*, I END DO DO I = 6, 6 PRINT*, “MERHABA” DO I = 6, 5 6 5 36 25… MERHABA

İki kural: 1 DO parametreleri döngünün içinde değiştirilemez: DO I = 1, 10 PRINT*, I I = I +1 END DO OLMAZ

İki kural: 2 DO döngüleri içiçe geçebilir: DO I = 1, 5 PRINT*, I DO J = 1, 4 PRINT*, I + J END DO

Mantık çıkışlı DOlar DO ifadeler IF(mantık-ifadesi) EXIT daha-daha-ifadeler END DO

DO ifadeler IF(mantık-ifadesi) EXIT daha-daha-ifadeler END DO Ortalama probleminin mantık DO’suyla çözümü TOPLAM = 0. DO SAYAC = 1, OGRENCI PRINT*, “NOT GIRINIZ” READ*, NOT TOPLAM = TOPLAM + NOT END DO SAYAC = 1 DO PRINT*, “NOT GIRINIZ” READ*, NOT TOPLAM = TOPLAM + NOT SAYAC = SAYAC +1 IF(SAYAC > 53) EXIT END DO SAYAC = 0 DO SAYAC = SAYAC +1 IF(SAYAC > 53) EXIT PRINT*, “NOT GIRINIZ” READ*, NOT TOPLAM = TOPLAM + NOT END DO

CYCLE Bir şart yerine geldiği zaman döngünün o tekrarı yapılmaz: 1’den N’e kadar sayıları toplama: DO I = 1, N TOPLAM = TOPLAM + I END DO DO I = I +1 IF(I>N) EXIT IF(I/2*2 .EQ. 2) CYCLE !SADECE TEK SAYILAR TOPLAM = TOPLAM + I END DO DO I = I +1 IF(I>N) EXIT TOPLAM = TOPLAM + I END DO

Hızlı test “pre-test” ve “post-test” döngülerinin farkı nedir? “pre-test” döngüsünün içindeki komutlar en az bir kere yapılır “post-test” döngüsünün içindeki komutlar en az bir kere yapılır X 

…hızlı test Programcılar üç (dört) tip hata yaparlar: 1- Başlangıçta bol gramer hatası- Bunlar derlemede yakalanır 2- Program çalışırken ortaya çıkacak hatalar: 0’a bölmek, sayı değişkenine karakter okumak gibi. Bunlar icra aşamasında ortaya çıkar. 3- Mantık hataları – bunları ancak testlerin yanlış sonuç vermesiyle anlaşılır… 4- Link zamanı hataları: Yazılamayan dosyalar, bulunamayan alt programlar…

…hızlı test icra zamanı gramer derleyici mantık ???? SQRT fonksiyonunun içine negatif bir sayı girmesi …………………….. hatasıdır Unutulmuş bir parantez veya tırnak ………….. hatasıdır ve ……………………..bunu yakalar. Bir algoritma tasarımında bir adımın ihmal edilmesi …………………. hatasıdır. ………..bunu yakalar icra zamanı gramer derleyici mantık ????

…hızlı test SAYI tam sayı ise aşağıdaki program parçası nasıl bir çıktı verir? SAYI = 1 DO IF(SAYI > 100) EXIT PRINT*, SAYI SAYI = 2 * SAYI END DO

…hızlı test LIMIT <= 4 0/ 1/ 2/ 3/ 4 LIMIT <= -2 SAYI ve LIMIT tam sayı ise aşağıdaki program parçası 4 ve -2 girdileri ile nasıl bir çıktı verir? READ*, LIMIT SAYI = 0 DO IF(SAYI > LIMIT) EXIT PRINT*, SAYI SAYI = SAYI + 1 END DO LIMIT <= 4 0/ 1/ 2/ 3/ 4 LIMIT <= -2

…hızlı test LIMIT <= 4 0/ 1/ 2/ 3/ 4/ 5 LIMIT <= -2 0 SAYI ve LIMIT tam sayı ise aşağıdaki program parçası 4 ve -2 girdileri ile nasıl bir çıktı verir? READ*, LIMIT SAYI = 0 DO PRINT*, SAYI IF(SAYI > LIMIT) EXIT SAYI = SAYI + 1 END DO LIMIT <= 4 0/ 1/ 2/ 3/ 4/ 5 LIMIT <= -2 0

Gerçek problemler: 1) Seri toplamı Sin(x) değerini hesaplayan bir program yazalım… Farklı x değerleri için farklı seriler kullanılabilir… Biz küçük x değerlerinde çalışacak bir program yazacağız… Kimbilir? Belki büyük x’lerde de çalışır… Sinx = Sin 0 + Cos 0 x – Sin 0 x2/2! – Cos 0 x3/3! + Sin 0 x4/4!.. Sin x = x – x3/3! + x5/5! – x7/ 7! + ...

Gerçek problemler: 1) Seri toplamı Sin x = x – x3/3! + x5/5! – x7/ 7! + ... PROGRAM SINUS_HESAPLA IMPLICIT NONE REAL:: X, SINUS, HASSASIYET, TERIM, ESKI INTEGER :: SAY, ENFAZLA READ *, X, HASSASIYET, ENFAZLA SAY = 2; SINUS = X; ESKI = X; DO TERIM = - X*X*EKSI / (SAY*(SAY+1)) SINUS = SINUS + TERIM ESKI = TERIM SAY=SAY+2

Gerçek problemler: 1) Seri toplamı Sin x = x – x3/3! + x5/5! – x7/ 7! + ... SAY = 2; SINUS = X; ESKI = X; FKT= 1; ISARET = 1 DO TERIM = - X*X*EKSI / (SAY*(SAY+1)) SINUS = SINUS + TERIM ESKI = TERIM SAY=SAY+2 IF((SAY .GT. ENFAZLA).OR.(ABS(TERIM) .LT. HASSASIYET)) &EXIT END DO PRINT *, X, SINUS, SIN(X) END PROGRAM SINUS_HESAP

Gerçek problemler: 2) En küçük kareler metodu Fiyat 160 180 200 220 240 260 280 Satış 126 103 82 75 40 20

…en küçük kareler Yapılması gereken: Kavuniçi parçaların toplamını minimize etmek! Toplamını?... Mutlak değerlerinin toplamını veya karelerinin toplamını.

…en küçük kareler Eğrinin denklemi y = ax + b ise farkların karelerinin toplamını en küçük yapacak şekilde a ve b ayarlanmalı. Her xi değeri için fark2 = (a xi+ b – yi)2 Fark karelerinin toplamı = Σi(a xi+ b – yi)2 En küçük yapmak demek, a ve b’ye göre türev alıp sıfıra eşitlemektir…

…en küçük kareler Fark karelerinin toplamı = Σi(a xi+ b – yi)2 En küçük yapmak demek, a ve b’ye göre türev alıp sıfıra eşitlemektir… a’ya göre: 2 Σixi(a xi+ b – yi) = 0 düzenlersek: a Σixi2+ b Σixi – Σixiyi = 0 b’ye göre: 2 Σi(a xi+ b – yi) = 0 düzenlersek: a Σi xi+ n b – Σiyi = 0

…en küçük kareler a Σixi2+ b Σixi = Σixiyi a Σi xi+ b n = Σiyi İki bilinmeyen için iki denklem! Toplamlara isim verelim… Kolay olsun: X2 = Σixi2 X = Σixi XY = Σixiyi Y = Σiyi D = X2 * n – X*X a = (XY * n – X * Y) / D b = (X2 Y – X * XY) / D

…en küçük kareler X2 = Σixi2 X = Σixi XY = Σixiyi D = X2 * n – X*X a = (XY * n – X * Y) / D b = (X2 Y – X * XY) / D _______________________________________________________________________________________________________ REAL :: X2, X, XY, Y, D, A, B, IKS, YE INTEGER :: N, SAYAC READ *, N X2 = 0; X = 0; XY = 0; Y = 0 DO SAYAC = 1, N READ *, IKS, YE X = X + IKS X2 = X2 + IKS * IKS XY = XY + IKS * YE Y = Y + YE END DO

…en küçük kareler X2 = Σixi2 X = Σixi XY = Σixiyi D = X2 * n – X*X a = (XY * n – X * Y) / D b = (X2 Y – X * XY) / D _______________________________________________________________________________________________________ DO SAYAC = 1, N READ IKS, YE X = X + IKS X2 = X2 + IKS * IKS XY = XY + IKS * YE Y = Y + YE END DO D = X2 * REAL(N) – X * X A = (XY * REAL(N) – X * Y) / D B = (X2* Y – X * XY) / D PRINT *, N, A, B

…en küçük kareler

5 GİRDİ- ÇIKTI I/O

DAHA ŞIK ÇIKTILAR Çıktılar canınızı sıktı… PRINT *, LIRA, “TL”, YENILIRA, “YTL EDER” 1.2000000 E +07TL12.00000000YTL EDER PRINT 20, LIRA, “TL”, YENILIRA, “YTL EDER” 20 FORMAT( F12.0, 2X, A, 5X, F8.2, 2X, A) 12552000 TL 12.55 YTL EDER ---------------------------------------

DAHA ŞIK ÇIKTILAR En küçük kareler probleminde… PRINT *, N, A, B 12 -7.92923532E-01 2.49998734E+02 Gibi abuk çıktılar verecektir… Halbuki PRINT 55, N, A, B 55 FORMAT( 1X, I5, F12.5, 5X, F12.1) 7 -0.79294 249.9 ----------------------------------

…daha şık çıktılar PRINT 55, N, A, B 55 FORMAT( 1X, I5, F12.5, 5X, F12.1) yerine PRINT “( 1X, I5, F12.5, 5X, F12.1)”, N, A, B PRINT 20, LIRA, “TL”, YENILIRA, “YTL EDER” 20 FORMAT( F12.0, 2X, A, 5X, F8.2, 2X, A) yerine PRINT “( F12.0, 2X, A, 5X, F8.2, 2X, A)”, LIRA, “TL”, & YENILIRA, “YTL EDER” yazabiliriz...

…Daha şık çıktılar… Format ifadeleri: Örnekler: 1234, 3.14159 ve 6.02 10**23 Iw I8 1234 Fw.d F12.4 3.1416 Ew.d E14.4 0.3142E+01 ESw.d ES14.4 6.0200E+23 ENw.d EN14.4 602.0000E+21 A Tc T20 nX 5X İlk karakter: boşluk: Normal tek aralık 0: Çift aralık +: Üstüne yaz 1: Sonraki sayfadan başla

Hızlı sınav (Doğru mu yanlış mı?) İlk karakter 0 ise bir sonraki sayfaya gidilir. (Doğru mu yanlış mı?) 3I2 ile I2, I2, I2 aynıdır. (Doğru mu yanlış mı?) F10.3 formatındaki 10, ondalık işaretinin solundaki hane sayısını, 3 de sağındaki hane sayısını verir. (Doğru mu yanlış mı?) T formatı çıktı ve girdilerin belli bir noktada kesilmesi (truncate) için kullanılır. (Doğru mu yanlış mı?) Format PRINT’deki bilgiye göre kısaysa, sağa bakan ilk parantezden itibaren tekrarlanır. X  X X 

…hızlı sınav (Doğru mu yanlış mı?) F format tanımlayıcısında, gerçek değerler, virgülden sonra belirtilen rakam sayısın uyacak şekilde yuvarlanır. _____ çıktıyı bir sonraki satıra geçirir. N = 100 ise, PRINT ‘(1X, 4I3)”, N ifadesi, 100 değerini kaç defa yazdıracaktır?  / 1 defa

REAL :: X = 234.56, Y = -1.0 INTEGER :: I = 987, J = -44 CHARACTER(20) :: Form = “(1X, I5, F10.1)” …hızlı sınav Ne çıkar? PRINT 5, I, X 5 FORMAT(1X, “I = “, I3, 2X, “X =“, F8.3, “BITTI”) I =987 X = 234.560BITTI -------------------------------------- PRINT Form, I, X, J, Y 987 234.5 -44 -1.0 PRINT ‘(1X, F10.0 / 1X, I3, T11, I5)’, X, I, J 234. 987 -44 Aşağıdaki sorularda, şu ifadelerin daha önce yazıldığını kabul ediniz: REAL :: X = 234.56, Y = -1.0 INTEGER :: I = 987, J = -44 CHARACTER(20) :: Form = “(1X, I5, F10.1)”

…hızlı sınav Bu değerlerin alınabilmesi için veri nasıl yazılmalı? CHARACTER (20) :: FORM = “(2I3, F5.2, F1.0)” ve X = 123.45, Y = 6.0, I = 99, J = 876 Bu değerlerin alınabilmesi için veri nasıl yazılmalı? READ *, I, J, X, Y 99 876 123.45 6. READ “(2I3, 2F6.0)”, I, J, X, Y b99876123.45bbbbb6 ------------------------- READ ‘(I3, F7.0, 2X, I5, T20, F5.0)’, I, X, J, Y b99 123.45bb876 bbbb6

…hızlı sınav CHARACTER (20) :: FORM = “(2I3, F5.2, F1.0)” ve X = 123.45, Y = 6.0, I = 99, J = 876 Bu değerlerin alınabilmesi için veri nasıl yazılmalı? READ FORM, I, J, X, Y b99876123456 ------------------------- READ 9, I, X, J, Y 9 FORMAT(I2, F5.2 / I3, F2.1) 9912345 ------------------------- 87660

WRITE WRITE(kontrol_listesi) çıktı_listesi Kontrol_listesi’nde neler bulunabilir? Birim numarası, çıktının alınacağı birim olabilir. (Bir tam sayı) UNIT = 6 veya sadece 6… Format belirten bir ifade veya sayı FMT = format_belirtici veya sadece format_belirtici. UNIT ve FMT kullanılmayacaksa birim ilk, format ikinci unsur olmalıdır. ADVANCE= yes_veya_no Eşitliğin sağı ya YES yahut NO’dur.

WRITE INTEGER :: CIKIS = 6 WRITE (6, *) AHMET, MEHMET Birim numarası Format ifadesi ADVANCE INTEGER :: CIKIS = 6 WRITE (6, *) AHMET, MEHMET WRITE (6, FMT = *) AHMET, MEHMET WRITE (UNIT = 6, FMT = *) AHMET, MEHMET WRITE ( CIKIS, *) AHMET, MEHMET WRITE (UNIT = CIKIS, FMT = *) AHMET, MEHMET WRITE (*, *) AHMET, MEHMET PRINT *, AHMET, MEHMET

WRITE WRITE (6, 30) AHMET, MEHMET 30 FORMAT (1X, 2F10.2) Birim numarası Format ifadesi ADVANCE Formatlı çıkış almak isterseniz: WRITE (6, ‘(1X, 2F10.2)’) AHMET, MEHMET WRITE (6, FMT = ‘(1X, 2F10.2)’) AHMET, MEHMET WRITE (6, 30) AHMET, MEHMET 30 FORMAT (1X, 2F10.2) WRITE (UNIT = 6, FMT = 30) AHMET, MEHMET

WRITE Peki ADVANCE ne? ADVANCE = “NO” ADVANCE = “YES” Birim numarası Format ifadesi ADVANCE Peki ADVANCE ne? ADVANCE = “NO” ADVANCE = “YES”

READ READ (kontrol_listesi) girdi_listesi Kontrol_listesi’nde neler bulunabilir? Birim numarası, girdinin okunacağı birim olabilir. (Bir tam sayı) UNIT = 5 veya sadece 5… Format belirten bir ifade veya sayı FMT = format_belirtici veya sadece format_belirtici. UNIT ve FMT kullanılmayacaksa birim ilk, format ikinci unsur olmalıdır. ADVANCE= yes_veya_no Eşitliğin sağı ya YES yahut NO’dur. IOSTAT = ifade veya END = ifade

READ INTEGER :: GIRIS = 5 READ (5, *) AHMET, MEHMET Birim numarası Format ifadesi ADVANCE IOSTAT veya END Dosya manipülasyon ifadeleri READ INTEGER :: GIRIS = 5 READ (5, *) AHMET, MEHMET READ (5, FMT = *) AHMET, MEHMET READ (UNIT = 5, FMT = *) AHMET, MEHMET READ ( GIRIS, *) AHMET, MEHMET READ (UNIT = CIKIS, FMT = *) AHMET, MEHMET READ (*, *) AHMET, MEHMET READ *, AHMET, MEHMET

READ READ (5, 30) AHMET, MEHMET 30 FORMAT (2F10.2) Birim numarası Format ifadesi ADVANCE IOSTAT veya END Dosya manipülasyon ifadeleri READ Formatlı okuma isterseniz: READ (5, ‘(2F10.2)’) AHMET, MEHMET READ (5, FMT = ‘(2F10.2)’) AHMET, MEHMET READ (5, 30) AHMET, MEHMET 30 FORMAT (2F10.2) READ (UNIT = 5, FMT = 30) AHMET, MEHMET

Dosya işlemleri Veri her zaman öyle birkaç sayı olmaz. Girişte de, çıkışta da… Klavyeyle yazıp, ekrandan okuyamazsınız… Dosyalara yazmak ve dosyalardan okumak gerekir. 500 değer çifti olan bir en küçük kareler? 500 000? Fiyat Satış 160 126 180 103 200 82 220 75 240 260 40 280 20

Önce? Önce? Dosyayı açmak gerek: OPEN (açma_listesi) 1. Birim (INTEGER) Dosyaya bu sayıyla atıf yapılır. 2. FILE= dosya_ismi (dosyanın işletim sistemindeki ismi) 3. STATUS = dosyanın_durumu 4. ACTION = ne_yapılacak (okunacak? yazılacak=? her ikisi?) 5. POSITION = dosyanın_neresinde_yapılacak 6. IOSTAT = dosya_başarıyla_ açılmış_mı?

açma_listesi birim FILE = STATUS = ACTION = POSITION = IOSTAT = birim: Dosya açılırken ona bir numara verilir. Meselâ 22 olsun… READ(22, 100)… WRITE(22, 100)… FILE= dosyanın ismidir… Açılırken işletim sistemi dosyayı bulur, kapanırken bu isimle saklanır (save) FILE = “ENKKVERI” STATUS = “OLD” veya “NEW” veya “REPLACE”

acma_listesi ACTION = “READ” veya “WRITE” veya “READWRITE” birim FILE = STATUS = ACTION = POSITION = IOSTAT = ACTION = “READ” veya “WRITE” veya “READWRITE” POSITION = “REWIND” veya “APPEND” veya “ASIS” IOSTAT = bir_tam_sayı_değişken Daha sonra bu değişkeni okuyup sonuçta ne olduğunu anlayabiliriz. (IOSTAT, READ ile de kullanılabilir.) Meselâ INTEGER :: KOD IOSTAT = KOD KOD = 0 dosya kazasız belasız açıldı… KOD > 0 dosya açılamadı, sebep verilen numaradan bulunur… KOD < 0 Verilerin sonuna gelindi, hata yok…

OPEN Diskteki INFO.DAT isimli mevcut bir dosyayı açıp içindeki değerleri okumak istiyoruz… OPEN (UNIT = 12, FILE = “INFO.DAT”, STATUS = “OLD”, & ACTION = “READ”, POSITION = “REWIND”, IOSTAT = ACILDIMI) Sonra, READ(12, *) gibi bir komutla info.dat dosyasındaki bilgileri okuyabiliriz…

…OPEN Dosya ismini illâ programın içine yazmak gerekmez… CHARACTER(10):: DosyaIsmi WRITE(*, ‘(1X, A)’, ADVANCE = “NO”) & “Dosyanin ismini yaziniz: ” READ*, DosyaIsmi OPEN(UNIT = 12, FILE = DosyaIsmi, STATUS = “OLD”, & ACTION = “READ”, POSITION = “REWIND”, IOSTAT = & ACILDIMI) IF (ACILDIMI >0) PRINT “**** DOSYAYI ACAMIYORUM***”

…OPEN Farklı bir uygulama: İçine yazmak için RAPOR isimli yeni bir dosya açalım: OPEN(UNIT = 13, FILE = “RAPOR”, STATUS = “NEW”, & ACTION = “WRITE”, IOSTAT = ACILDIMI) Sonra bu dosyaya, FIYAT ve MIKTAR verilerini yazmak için şu ifadeyi kullanabiliriz: WRITE(13, ‘(1X, 2F10.3)’) FIYAT, MIKTAR İşimiz bitince de dosyayı kapatırız: CLOSE(13)

IOSTAT uygulama örneği DO !Bir sonraki veriyi oku READ (12, *, IOSTAT = GIRDI_DURUMU) KOD, & SICAKLIK, BASINC IF(GIRDI_DURUMU > 0) STOP “GIRDI HATASI” IF(GIRDI_DURUMU < 0) EXIT !Veri bitti ! Veriyi işlemeye devam et SAY = SAY +1 ….. TOPLAMBASINC = TOPLAMBASINC + BASINC END DO

END uygulama örneği DO !Bir sonraki veriyi oku READ (12, *, END = 20) KOD, SICAKLIK, BASINC !IF(GIRDI_DURUMU < 0) EXIT YERİNE… ! Veriyi işlemeye devam et SAY = SAY +1 ….. TOPLAMBASINC = TOPLAMBASINC + BASINC END DO 20 CONTINUE

REWIND ve BACKSPACE Genel ifade: REWIND birim BACKSPACE birim

Hızlı sınav X WRITE (10, 20) X, Y ifadesinde 10 ve 20 nedir? 10 yazılacak birim (cihaz veya dosya), 20 bir FORMAT ifadesidir. PRINT *, CEVAP ifadesine eşdeğer bir WRITE ifadesi yazınız. WRITE (*, *) CEVAP (Doğru mu yanlış mı?) OPEN komutundaki FILE = “NEW” bu dosyanın mevcut olmadığını, bu program tarafından yaratılacağını gösterir. X

Hızlı sınav SINAV isimli ve diskte mevcut bir dosyayı 15 birim nunarasıyla okumak ve yazmak için açacak bir OPEN yazınız: OPEN (15, STATUS = “OLD”, ACTION = “READWRITE”, ) Bu dosyadan 6-8 pozisyonundan NOT adlı tam sayıyı okuyacak bir komut yazınız. REWIND 15 READ (15, ‘(5x, I3)”) NOT (Doğru mu yanlış mı?) IOSTAT = VAR ise ve hata meydana gelmemekle birlikte dosyanın sonuna varılmışsa, VAR eksi değer alacaktır. (Doğru mu yanlış mı?) READ(5, 10, END = 15) NOT komutunda, okunacak veri kalmayınca program, 15 numaralı komuttan devam edecektir.  

Hızlı sınav (Doğru mu, yanlış mı) BACKSPACE komutu, mevcut konumun soluna bir değer yazmak için kullanılır. _________ komutu, dosyayı başlangıcına çekmek için kullanılır. X REWIND

6 FONKSİYON ALT PROGRAMLARI

FORTRAN’ın İÇ FONKSİYONLARI Kitapta 324. sayfadaki 6.1 tablosuna bakın… Bu fonksiyonlar programlarda serbestçe kullanılır. LOG10 kullandınız… Meselâ: INTEGER :: Sayi_1, Sayi_2, Kucuk REAL :: Alfa, Beta, X PRINT *, ABS(X) Alfa = ANINT(100.0 * Beta) / 100.0 Small = MIN(0, Sayi_1, Sayi_2)

…FORTRAN’ın İÇ FONKSİYONLARI Kendimiz fonksiyon yazabilir ve sonra tıpkı FORTRAN fonksiyonları gibi onları da kullanabiliriz. fonksiyon başlığı tanımlar kısmı icra kısmı END FUNCTION ifadesi fonksiyon başlığı FUNCTION fonksiyon-ismi(resmî-argüman-listesi) veya tip-belirleyici FUNCTION fonksiyon-ismi(resmî-argüman-listesi)

…FORTRAN’ın İÇ FONKSİYONLARI fonksiyon başlığı FUNCTION fonksiyon-ismi (resmî-argüman-listesi) veya tip-belirleyici FUNCTION fonksiyon-ismi (resmî-argüman-listesi) FUNCTION TLDEN_YTLYE( YTL) REAL FUNCTION TLDEN_YTLYE( YTL)

…Fahrenheit- Santigrat dönüşümü FUNCTION F_DEN_C_YE (FSICAKLIK) REAL :: F_DEN_C_YE REAL INTENT(IN) :: FSICAKLIK F_DEN_C_YE = (FSICAKLIK – 32.0)/ 1.8 END FUNCTION F_DEN_C_YE

…Fahrenheit- Santigrat dönüşümü PROGRAM SICAKLIK_DONUSUMU IMPLICIT NONE REAL :: FDERECESI, CDERECESI CHAR(1) :: CEVAP DO WRITE(*, ‘(1X, A)’, ADVANCE = “NO”) “F SICAKLIGI GIRINIZ” READ *, FDERECESI CDERECESI = F_DEN_C_YE(FDERECESI) PRINT ‘1X, 2(F6.2, A)’, FDERECESI, “ F ”, CDERECESI, “ C YE ESITTIR” WRITE(*, ‘(1X, A)’, ADVANCE = “NO”) “BASKA DONUSUM YAPCAN MI? & & (E VEYA H)” READ *, CEVAP IF (CEVAP /= “H”) EXIT END DO CONTAINS FUNCTION F_DEN_C_YE (FSICAKLIK) REAL :: F_DEN_C_YE REAL INTENT(IN) :: FSICAKLIK F_DEN_C_YE = (FSICAKLIK – 32.0)/ 1.8 END FUNCTION F_DEN_C_YE END PROGRAM SICAKLIK_DONUSUMU INTERNAL

…Fahrenheit- Santigrat dönüşümü PROGRAM SICAKLIK_DONUSUMU IMPLICIT NONE REAL :: FDERECESI, CDERECESI CHAR(1) :: CEVAP DO WRITE(*, ‘(1X, A)’, ADVANCE = “NO”) “F SICAKLIGI GIRINIZ” READ *, FDERECESI CDERECESI = F_DEN_C_YE(FDERECESI) PRINT ‘1X, 2(F6.2, A)’, FDERECESI, “ F ”, CDERECESI, “ C YE ESITTIR” WRITE(*, ‘(1X, A)’, ADVANCE = “NO”) “BASKA DONUSUM YAPCAN MI? & & (E VEYA H)” READ *, CEVAP IF (CEVAP /= “E”) EXIT END DO END PROGRAM SICAKLIK_DONUSUMU FUNCTION F_DEN_C_YE (FSICAKLIK) REAL :: F_DEN_C_YE REAL INTENT(IN) :: FSICAKLIK F_DEN_C_YE = (FSICAKLIK – 32.0)/ 1.8 END FUNCTION F_DEN_C_YE EXTERNAL

…Fonksiyonun tipi FUNCTION F_DEN_C_YE (FSICAKLIK) REAL :: F_DEN_C_YE REAL INTENT(IN) :: FSICAKLIK F_DEN_C_YE = (FSICAKLIK – 32.0)/ 1.8 END FUNCTION F_DEN_C_YE REAL FUNCTION F_DEN_C_YE (FSICAKLIK) REAL INTENT(IN) :: FSICAKLIK F_DEN_C_YE = (FSICAKLIK – 32.0)/ 1.8 END FUNCTION F_DEN_C_YE

Değişkenler… Yerel değişken- global değişken (Scope… Erişim?) Altprogramda ilan edilen değişkene dışarıdan ulaşılamaz. Ana programda ilân edilen değişkene o programın iç alt programlarından ulaşılabilir. Eğer alt programda aynı isimde değişken varsa, o öne geçer. SAVE REAL, SAVE :: liste veya SAVE liste INTENT (IN) REAL INTENT (IN) :: ….

HIZLI SINAV 1. İki tip FORTRAN altprogramı hangileridir? FUNCTION ve SUBROUTINE 2. FUNCTION alt programının dört parçasını sayın. fonksiyon başlığı tanımlar kısmı icra kısmı END FUNCTION ifadesi

√ HIZLI SINAV 3. TOPLA (A, B) de A ve B nedir? TOPLA fonksiyonun argümanları 4. Bir programda, bir değişkenin değerine ulaşılabilen program kısımlarına o değişkenin nesi denir? Scope 5. (Doğru mu?) Fonksiyon alt programı ve ana program aynı değişken isimlerini kullanabilir. √

HIZLI SINAV FUNCTION NE(N) INTEGER :: NE INTEGER INTENT(IN) :: N NE = (N * (N + 1) ) / 2 END FUNCTION NE Ana programda SAYI1 = NE(SAYI2) yazıyorsa SAYI2’ye, ……… argüman denir. Ana programda SAYI = NE(3) yazıyorsa, SAYI hangi değeri alır? NE fonksiyonun içinde NE = 1 gibi bir ifade bulunabilir. actual 6 X

7 SUBROUTINE ALT PROGRAMLARI

Function alt programından farkı FUN(X) fonksiyon, SUB(X) subroutine olsun… FUN’un ismi geri dönen değeri taşır. SUB herhangi bir değer taşımaz. (1) in sonuçları: FUN’un tipi vardır: REAL, INTEGER, LOGICAL gibi… SUB’un tipi yoktur.

Function alt programından farkı FUN(X) fonksiyon, SUB(X) subroutine olsun… Programda kullanılış: ...… SONUC = ALFA/FUN(X) ..... ....... CALL SUB(X) SONUC = ALFA / X ... SUBROUTINE’den değer dönecekse bu değer(ler) argümanlar vasıtasıyla taşınır.

Örnek: 132.23456 gibi bir saat değeri verildiğinde bunu gün, saat, dakika, saniye’ye çevirip sonucu basan bir subroutine !Bu subroutine yukarda anlatılan işi yapar SUBROUTINE GSDS(GIRENSAAT) REAL, INTENT(IN) :: GIRENSAAT INTEGER :: TAMSANIYE, GUN, SAAT, DAKIKA, SANIYE TAMSANIYE = GIRENSAAT * 3600. + 0.5 GUN = 0 DO IF(TAMSANIYE .LT. 86400) EXIT TAMSANIYE = TAMSANIYE – 86400 GUN = GUN +1 END DO

REAL, INTENT(IN) :: GIRENSAAT INTEGER :: TAMSANIYE, GUN, SAAT, DAKIKA, SANIYE DO IF(TAMSANIYE .LT. 86400) EXIT TAMSANIYE = TAMSANIYE – 86400 GUN = GUN +1 END DO SAAT = 0 IF(TAMSANIYE .LT. 3600) EXIT TAMSANIYE = TAMSANIYE – 3600 SAAT = SAAT +1

REAL, INTENT(IN) :: GIRENSAAT INTEGER :: TAMSANIYE, GUN, SAAT, DAKIKA, SANIYE DO IF(TAMSANIYE .LT. 3600) EXIT TAMSANIYE = TAMSANIYE – 3600 SAAT = SAAT +1 END DO DAKIKA = 0 IF(TAMSANIYE .LT.60) EXIT TAMSANIYE = TAMSANIYE – 60 DAKIKA = DAKIKA +1 SANIYE = TAMSANIYE PRINT "(1X, T10, A, T20, A, T30, A, T40, A/ 2X, 4I10)", “GUN”, & “SAAT”, “DAKIKA”, “SANIYE”, GUN, SAAT, DAKIKA, SANIYE END SUBROUTINE GSDS

Kullanılışı PROGRAM BIRPROGRAM REAL :: SAATLER PRINT *, “KAC SAAT?” READ*, SAATLER CALL GSDS(SAATLER) END PROGRAM BIRPROGRAM

Bir başka çözüm SUBROUTINE GSDS(GIRENSAAT,GUN,SAAT,DAKIKA, SANIYE) REAL, INTENT(INOUT) :: GIRENSAAT INTEGER, INTENT(OUT) :: GUN, SAAT, DAKIKA, SANIYE INTEGER :: TAMSANIYE ….. ! VE PRINT KOMUTU BU SUBROUTINE’DEN CIKARILIR END SUBROUTINE GSDS

Bir başka çözüm: REAL :: SAATLER PRINT *, “KAC SAAT?” READ*, SAATLER PROGRAM BIRPROGRAM REAL :: SAATLER PRINT *, “KAC SAAT?” READ*, SAATLER CALL GSDS(SAATLER, GUN, SAAT, DAKIKA, SANIYE) PRINT "(1X, T10, A, T20, A, T30, A, T40, A/ 2X, 4I10)", & “GUN”, “SAAT”, “DAKIKA”, “SANIYE”, & GUN, SAAT, DAKIKA, SANIYE END PROGRAM BIRPROGRAM

Hızlı test SUBROUTINE CALCULATE(ALPHA, NUMBER_1, & NUMBER_2) REAL, INTENT(IN) :: ALPHA INTEGER, INTENT(OUT) :: NUMBER_1 INTEGER, INTENT(INOUT) :: NUMBER_2 ..... END SUBROUTINE CALCULATE Ana programda da aşağıdaki ilanlar yapılmış: INTEGER :: CODE, ID_NUMBER REAL :: RATE

Hızlı test √ X X X X X Doğru mu? SUBROUTINE CALCULATE(ALPHA, NUMBER_1, NUMBER_2) REAL, INTENT(IN) :: ALPHA INTEGER, INTENT(OUT) :: NUMBER_1 INTEGER, INTENT(INOUT) :: NUMBER_2 END SUBROUTINE CALCULATE Ana programda da aşağıdaki ilanlar yapılmış: INTEGER :: CODE, ID_NUMBER REAL :: RATE Hızlı test Doğru mu? RATE = CALCULATE(2.45, CODE, ID_NUMBER) CALL CALCULATE(RATE + 0.5, 0, CODE 2 ID_NUMBER) CALL CALCULATE(RATE, ID_NUMBER) CALL CALCULATE(RATE, CODE, ID_NUMBER) CALL CALCULATE CALL CALCULATE(RATE, RATE, RATE) X X X √ X X

Aşağıdaki program nasıl çıktı verir? program question_11 character(3) :: str1 = “cat”, str2 = “dog”, str3 = “elk” call change(2, str1, str2, str3) print*, “String = “, str1, str2, str3 contains subroutine change(Number, a, b,c) integer, intent(in) Number character(3), intent(inout) a, b, c character(3) :: bat = “bat” if(Number < 3) then a = bat b= bat else c = bat end if end subroutine change end program question_11

Çözümler- Cosinus program main REAL :: x INTEGER :: j x = 0. do j=0,90 print*, cos(x), cosinusus(x) x=x+0.01745 end do CONTAINS …. end program main real function cosinusus(x) implicit none !cos x = 1 - x2/2! + x4/4!- xn/ n! + ... REAL, INTENT(IN):: x REAL :: cosx, terim INTEGER :: fkt, isaret, i cosx = 1.; fkt = 1 ; isaret = 1 do i=1,20, 2 isaret=-isaret fkt = fkt * i * (i +1) terim = REAL(isaret) * x**(i+1) / fkt cosx=cosx+terim end do cosinusus = cosx end function cosinusus

Çözümler- çeyrek çember program main integer :: i, j, topla integer, parameter :: nokta = 10000 real :: sonuc topla = 0 do 100 i = 0, nokta do 100 j = 0, nokta 100 topla = topla + icmidismi(i/real(nokta), j/real(nokta)) sonuc = real(topla) / (nokta + 1) ** 2 print *, 4.*sonuc end program main Integer function icmidismi(x, y) real, intent(in) :: x, y if(sqrt(1-x*x) > y) then icmidismi = 1 else icmidismi = 0 end if end function icmidismi

program main implicit none integer :: i, j logical asalmi, boltest do 100 i = 3, 1001, 2 asalmi = .true. do 200 j = 3, i-1 if(boltest(i, j)) asalmi = .false. 200 continue 100 if(asalmi) print *, i end program main logical function boltest(sayi, bolen) integer, intent(in):: sayi, bolen if((sayi/bolen) * bolen == sayi) then boltest = .true. else boltest = .false. end if end function boltest

8 Dizinler- Arrays Problem: 50 öğrencili bir sınıfta, her öğrencinin notunu ve notun ortalamanın kaç puan üstünde veya altında olduğunu hesaplayıp bastırmak istiyoruz. REAL NOT, ORTALAMA ORTALAMA = 0. DO 100 I = 1, 50 READ *, NOT PRINT*, NOT 100 ORTALAMA = ORTALAMA + NOT ORTALAMA = ORTALAMA / 50. ŞİMDİ N’APCAZ?

Dizinler- Arrays REAL :: NOT(50) REAL :: NOT(1:50) 50 öğrencili bir sınıfta, her öğrencinin notunu ve notun ortalamanın kaç puan üstünde veya altında olduğunu hesaplayıp bastırmak istiyoruz. Dizinler- Arrays REAL, DIMENSION(50) :: NOT ORTALAMA = 0 DO 100 I = 1, 50 READ *, NOT(I) 100 ORTALAMA = ORTALAMA + NOT(I) ORTALAMA = ORTALAMA / 50. DO 200 I = 1, 50 200 PRINT*, NOT(I), ORTALAMA – NOT(I) REAL :: NOT(50) REAL :: NOT(1:50)

Başka bir çözüm REAL :: NOT(50), SAPMA(50) ORTALAMA = 0 DO 100 I = 1, 50 READ *, NOT(I) 100 ORTALAMA = ORTALAMA + NOT(I) ORTALAMA = ORTALAMA / 50. DO 200 I = 1, 50 200 SAPMA(I) = ORTALAMA – NOT(I) DO 300 I = 1, 50 300 PRINT*, NOT(I), SAPMA(I)

Eşdeğer ifadeler “imâ edilen” do = implied do Meselâ: DO 100 I = 1, 50 100 READ *. NOT(I) yerine READ *, (NOT(I), I = 1, 100) veya READ *, NOT PRINT için de aynı şeyler geçerli... “imâ edilen” do = implied do Meselâ: DO 300 I = 1, 50 300 PRINT *, NOT(I), SAPMA(I) yerine PRINT *, (NOT, SAPMA, I = 1, 50)

Hafızada yer ne zaman ayrılıyor? REAL :: NOT(1:50) veya REAL, DIMENSION(1:50) :: NOT Bunlar icra edilebilen (executable) ifadeler değil... Bütün ilân ifadeleri gibi (tip, implicit, v.s.) derleme zamanında yerine getiriliyor. Peki ya öğrenci sayısını bilmiyorsak? REAL, DIMENSION(:), ALLOCATABLE :: NOT, SAPMA

İcra zamanı dizinleri REAL, DIMENSION(:), ALLOCATABLE :: NOT, SAPMA INTEGER :: HATA .... READ *, OSAY ALLOCATE(NOT(1:OSAY), SAPMA(1:OSAY), STAT = HATA) IF(HATA .NE. 0) STOP “HAFIZADA YER YOK” DEALLOCATE(NOT, SAPMA, STAT = HATA) IF(HATA .NE.0) PRINT *, “BOYLE BIR ARRAY YOK KI...”

Fortran dizin fonksiyonları ALLOCATED(A) DOT_PRODUCT(A, B) MAXVAL(A) MAXLOC(A) MINVAL(A) MINLOC(A) PRODUCT(A) SIZE(A) SUM(A)

Not ortalaması probleminin başka bir çözümü PROGRAM NOT_ORTALAMASI ... PRINT *, ORTALAMA(NOT, OSAYI) CONTAINS REAL FUNCTION ORTALAMA (DEGERLER, SAYI) INTEGER :: SAYI REAL :: DEGERLER(SAYI) ORTALAMA = SUM(DEGERLER) /REAL(SAYI) END FUNCTION ORTALAMA END PROGRAM NOT_ORTALAMASI

Başka... Dizin elemanlarına DO’suz da değer verilebilir: REAL :: A(10) A = 0 Bütün elemanları 0 yapar A = (/11, 22, 33, 44, 55, 66, 77, 88, 99, 110 /) Elemanlara gösterilen değerleri verir Bilin bakalım bu ne yapar: REAL :: B(5) INTEGER :: I(5) I = (/5, 3, 3, 4, 3/) B = A(I) A(1:10:2) = (/(I**2, I = 1, 5)) INDEKS ÜÇLÜSÜ (SUBSCRIPT TRIPLET)

WHERE En iyisi misalle anlatmak: integer, dimension(5) :: a = (/0, 2, 5, 0, 10/) real dimension(5) :: b WHERE(a > 0) b= 1.0/ a WHERE(a>0) b = 1.0/a ELSEWHERE b = -1.0 END WHERE

Öğrenci programının devamı Öğrenci programının devamı... Öğrenci numaraları, notları okunacak, ortalamdan sapmalarıyla birlikte yazılacak. real :: ogrenci(50, 3), topla integer :: i read 20, (ogrenci(I, 1), ogrenci(I, 2), I = 1, 50) 20 format(2f10.0) topla = 0. do 100 i = 1, 50 100 topla = topla + ogrenci(i, 2) topla = topla / real(50) do 200 i = 1, 50 200 ogrenci(i, 3) = topla - ogrenci(i, 2)