Etiketler

1 Haziran 2020 Pazartesi

QuickBasic Kursu: Bölüm 9: Sayılarla ilgili işlemler

Önceki Bölüm: QuickBasic Kursu: Bölüm 8: Karakterlerle ilgili işlemler
Yayınlama: Eylül 2007
Güncelleme: 11 Haziran 2020

Matemetiksel İşlem Sembolleri


+ : Toplama. a = 10 + 2
- : Çıkarma. b = a - 5
* : Çarpma. b = a * 10
/ : Bölme. b = a / 3
\ : Kalansız bölme. a = 100 \ 3 : PRINT a ' 33
^ : Üs alma. a = 10 ^ 2 : PRINT a ' 100
- : Negatife dönüştürme. a = 5 : b =  - a : PRINT b ' -5

Matematiksel işlemlerde öncelik sırası

Normal bir hesaplama yapıldığında, Qbasic soldan sağa doğru çalışır, ancak belirli hesaplamaları aşağıdaki sırayla yapar. Kırmızı olan kısım önce işlenir
  1. Parantez içi. a =  (5 + 10) * 3 ' 45
  2. Üs alma işlemi (^). a = 10 + 2 ^ 3 ' 18
  3. Negatife dönüştürme (-) a = 10 - -30 - -5 ' 45
  4. Çarpma ve Bölme(* , /). a = 20 + 30 / 2 ' 35
  5. Kalansız bölme (\) a= 30 - 16 \ 3 ' 25
  6. MOD işlemi. a = 10 + 11 MOD 3 ' 12
  7. Toplama, Çıkarma (+ , -) a = 10 + 5 * 2 - 20 / (2 + 3) ^ 2 ' ' 19.2
Örnekler:
PRINT 5 ^ 2 ' 25 (Karesi)
PRINT 5 ^ -2 '.04
PRINT 1 / 5 ^ 2 '.04
PRINT 25 ^ 1 / 2 '12.5
PRINT (25 ^ 1) / 2 '12.5
PRINT 25 ^ (1 / 2) '5 (Karekök)
PRINT 25 ^ .5  '5 (Karekök)
PRINT 27 ^ (1 / 3) ' 3 (Küpkök)
PRINT 3 + 6 / 12 * 3 - 2' 2.5
PRINT 6 / 12 + 2 ^ 4 ' 0.5
PRINT 5 + .5 * 3' 1.5
PRINT 3 + 9 / 3' 4.5
PRINT 4.5 - 9 / 5 ' 2.5

ABS

Verilen sayının mutlak(ABSolute) değerini verir.
Sayı negatif ya da pozitif olsa da sonuç pozitif olur.
PRINT ABS(-127) '127
PRINT ABS(254) '254

INT

Sayı aşağı yuvarlar.
Sayı negatif ise bir küçük sayıyı verir.
PRINT INT(12.86) '12
PRINT INT(14.13) '14
PRINT INT(-12.86) '-13
PRINT INT(-14.13) '-15

FIX

Sayının tam kısmını verir. Küsurat atılır.
PRINT FIX(45.9) '45
PRINT FIX(45.1) '45
PRINT FIX(-45.1) '-45
PRINT FIX(-45.8) '-45

RND

0 - 1 arası rastgele küsurlu bir sayı üretir.
Fotoğraf: pexels.com
PRINT RND '0 - 1 arası küsurlu bir sayı
PRINT RND(1)
PRINT INT(RND * 10) + 1 '1-10 arası sayı
RND komutu program her çalıştırılışında aynı sayıları üretir.
Bundan kurtulmak için aşağıda verilen örnekte olduğu gibi RND den önce RANDOMIZE TIMER çalıştırılır.
TIMER o anki saate göre saniye cinsinden bir sayı üretir.
Rastgele sayı aralıklarını belirlemek için şu formül kullanılır:
SAYI = INT(RND * (büyüksayı - küçüksayı + 1) + küçüksayı)
Örnek: 20 ile 35 arası bir sayı için:
SAYI = INT(RND * ( 35 - 20 + 1)) + 20
SAYI = INT(RND * 16) + 20 ' 20 - 35 arası bir sayı

RANDOMIZE

Rasgele sayı üreticisini hazırlar.

Örnek Program:
RANDOMIZE TIMER
DO
    rgs% = INT(RND * 11) + 2 '(2-12 asrası rastgele sayı)
    PRINT rgs%;
    SLEEP
LOOP UNTIL INKEY$ = CHR$(27) 'ESC : Çıkış

UYGULAMA: Sayı Tahmin Oyunu

' **** SAYI TAHMİN OYUNU ****
' Mesut Akcan
' 28/05/2020
DEFINT A-Z
DIM SHARED sayi, a
RANDOMIZE TIMER
CLS
cr$ = CHR$(10)
CALL rastgeleSayi
DO
    a = a + 1
    IF a > 5 THEN
        COLOR 12
        PRINT cr$; "Tahmin hakkınız bitti!"
        CALL tekrar
    ELSE
        COLOR 14
        PRINT "Tahmin:"; a; "-";
        INPUT tahmin
        IF tahmin = sayi THEN
            COLOR 26
            PRINT cr$; "Tebrikler "; a; " denemede bildiniz..."
            COLOR 10
            CALL tekrar
        ELSEIF tahmin < 1 OR tahmin > 10 THEN
            COLOR 28
            PRINT "!! sayı 1 - 10 arasında !!"
        ELSE
            COLOR 13
            PRINT "Bilemediniz, Kalan tahmin hakkınız:"; 5 - a
        END IF
    END IF
LOOP
 
SUB rastgeleSayi
    sayi = RND * 10 + 1
    COLOR 11
    CLS
    PRINT "Bilgisayar 1 - 10 arası bir sayı tuttu."
    PRINT "Bu sayıyı tahmin edin"
END SUB
 
SUB tekrar
    PRINT "Tekrar oynamak ister misiniz? (E/H)"
    c$ = INPUT$(1)
    IF UCASE$(c$) = "H" THEN
        END
    ELSE
        CALL rastgeleSayi
    END IF
    a = 0
END SUB

DÖNÜŞTÜRME FONKSİYONLARI

Bellekte değişken değeri olarak tutulan sayıyı farklı formatlara dönüştürmek için bazı fonksiyonlar kullanılır.

CDBL

Sayıyı DOUBLE formata dönüştürür.
A% = 15454 ' Bellekte 2 baytlık yer tutuyor
B# = CDBL(A%) ' Şimdi 8 baytlık Double formata dönüştü ve B değişkenine aktarıldı
PRINT LEN(A%), LEN(B#)

CINT

Sayıyı INTEGER formata dönüştürür.
Sayı küsurlu ise; küsur .4 den büyükse yukarı değilse aşağı yuvarlanır ve küsur atılır.
A = 1245.85 : PRINT CINT(A) '12346

CLNG

Sayıyı LONG formata dönüştürür. Sayı küsurlu ise CINT gibi.

CSNG

Sayıyı SINGLE formata dönüştürür

MATEMATİKSEL FONKSİYONLAR

TAN

Radyan olarak verilen açının TANjantını verir.

ATN

Radyan olarak verilen açının ArkTaNjantını verir.
PI = 4 * ATN(1)
PRINT PI ' 3.141593 (Pi sayısı)

COS

Radyan olarak verilen açının kosinüsünü verir. Radyanı dereceye dönüştürmek için sayıyı (pi / 180) ile çarpın.

SIN 

Radyan olarak verilen açının sinüsünü verir.
Örnekler:
pi# = 4 * ATN(1)
d = 30 'derece
r = d * (pi# / 180) 'radyan
PRINT SIN(r) '.5
PRINT COS(r) '.8660254
PRINT TAN(r) '.5773503
PRINT ATN(r) '.4823479

Türetilmiş Trigonometrik fonksiyonlar

Arksinüs
Arcsin = Atn(X / Sqr(-X * X + 1))

Sekant
Sec = 1 / Cos(X)

Kosekant
Cosec = 1 / Sin(X)

Kotanjant
Cotan = 1 / Tan(X)

Arkkosinüs
Arccos = Atn(-X / Sqr(-X * X + 1)) + 2 * Atn(1)

Arksekant
Arcsec = Atn(X / Sqr(X * X – 1)) + Sgn((X) – 1) * (2 * Atn(1))

Arkkosekant
Arccosec = Atn(X / Sqr(X * X - 1)) + (Sgn(X) – 1) * (2 * Atn(1))

Arkkotanjant
Arccotan = Atn(X) + 2 * Atn(1)

Hiperbolik Sinüs
HSin = (Exp(X) – Exp(-X)) / 2  

Hiperbolik Kosinüs
HCos = (Exp(X) + Exp(-X)) / 2

Hiperbolik Tanjant
HTan = (Exp(X) – Exp(-X)) / (Exp(X) + Exp(-X))

Hiperbolik Sekant
HSec = 2 / (Exp(X) + Exp(-X))

Hiperbolik Kosekant
HCosec = 2 / (Exp(X) – Exp(-X))

Hiperbolik Kotanjant
HCotan = (Exp(X) + Exp(-X)) / (Exp(X) – Exp(-X))

ArkHiperbolik Sinüs
HArcsin = Log(X + Sqr(X * X + 1))

ArkHiperbolik Kosinüs
HArccos = Log(X + Sqr(X * X – 1))

ArkHiperbolik Tanjant
HArctan = Log((1 + X) / (1 – X)) / 2

ArkHiperbolik Kosekant
HArcsec = Log((Sqr(-X * X + 1) + 1) / X)

ArkHiperbolik Kosekant
HArccosec = Log((Sgn(X) * Sqr(X * X + 1) + 1) / X)

ArkHiperbolik Kotanjant
HArccotan = Log((X + 1) / (X – 1)) / 2

N tabanına logaritma
LogN = Log(X) / Log(N)
sayi = 1000
taban = 10
logn = LOG(sayi) / LOG(taban)
' 1000 sayısının 10 tananına göre logaritması
PRINT logn '3

EXP

e sabitinin (~ = 2.718282) üstünü alır
INPUT "Başlangıç bakteri miktarı"; c
INPUT "Günlük çoğalma oranı"; oran
r = oran / 100
PRINT
PRINT "Gün", "Çoğalma"
FOR t = 0 TO 15 STEP 3
    PRINT USING "##"; t;
    PRINT USING "###,###,###,###"; c * EXP(r * t)
NEXT

LOG

Sayını doğal LOGaritmasını hesaplar.
'e tabanına göre 1000 sayısının logaritması (doğal logaritma)
PRINT LOG(1000) '6.907755

MOD

İki sayının bölümü sonucunda kalanı verir.
A = 11
PRINT A MOD 3 ' 11 in 3 e bölümünde kalan sayı: 2
UYGULAMA: 1-20 arası çift sayıların toplamı
FOR n = 1 TO 20
    IF (n MOD 2) = 0 THEN toplam = toplam + n
NEXT
PRINT toplam

SGN

Sayının işaretini belirtir. Sayı; 0 ise 0, pozitif ise 1, negatif ise -1 değerini verir.
PRINT SGN(-28) ' -1

SQR

Sayını karekökünü verir.
PRINT SQR(81) '9
'Alternatif:
PRINT 81 ^ .5 '9
PRINT 81 ^ (1/2) '9

8'lik ve 16'lık sayı sistemlerini kullanma

Qbasicde kullanılan sayısal değerler varsayılan olarak desimal(decimal) yani 10'luk sayı sistemi olarak değerlendirilir.
Programcılıkta desimal sayılardan başka 16'lık sayı(hexadecimal), 8'lik sayı(octal) ve 2'lik sayı(binary) sistemi de kullanılır.
16'lık sayı kullanma(hexadecimal): 16'lık sayı önüne &H eklenir.
PRINT &HFF ' 255
A = &H1FA9
PRINT A ' 8105
8'lik sayı kullanma(octal): 8'lik sayı önüne &O eklenir.
PRINT &O77 ' 63
A = &O5402
PRINT A ' 2818
2'lik sayı kullanma(binary): Qbasic'de 2'lik sayıyı direkt olarak kullanmak için bir seçenek yoktur.

HEX$

Verilen sayıyı 16'lık sayı sistemine(HEXadecimal) dönüştürür
HEX$(sayı)
PRINT HEX$(2001) ' 7D1

OCT$

Verilen sayıyı 8'lik sayı sistemine(OCTal) dönüştürür.
PRINT OCT$(2001) ' 3721
Problem 1:
Qbasic dahili fonksiyonlarında 10'luk sayı sistemini 2'lik sisteme(BINARY) çeviren bir fonksiyon yoktur. Bu fonksiyonu yazınız.
FUNCTION DEC2BIN(s AS INTEGER)
..
..
END FUNCTION

Problem 2:
Qbasic dahili fonksiyonlarında 2'lik sayı sistemini 10'luk sisteme çeviren bir fonksiyon yoktur. Bu fonksiyonu yazınız.
FUNCTION BIN2DEC(s AS STRING)
..
..
END FUNCTION

LEN

Önceki bölümde LEN komutunun verilen metnin karakter uzunluğunu verdiğini görmüştük.
LEN komutuyla sayısal değişkenin bellekte kapladığı alanı bayt cinsinden öğrenebiliriz.
a% = 1
PRINT LEN(a%) ' 2 - INTEGER
Sayı 1 olduğu halde sonucun 2 çıktığına dikkat ediniz. Integer sayı değişkeni bellekte 2 bayt alan kaplar. Sayı 0 da olsa 32767 da olsa sonuç 2 olur.
d& = 2 ^ 30: PRINT LEN(d&) '4 - LONG
b! = 3.1415: PRINT LEN(b!) '4 - SINGLE
c# = .5: PRINT LEN(c#)     '8 - DOUBLE
TYPE kayit
  adi AS STRING * 15 '15
  dyili AS INTEGER   '2
  boyu AS SINGLE     '4
END TYPE             'toplam: 21
DIM personel AS kayit
PRINT LEN(personel) '21

SAYIYI STRING'E DÖNÜŞTÜRME

MKI$, MKS$, MKL$, MKD$ komutları kullanılır.
Ayrıntı için Dosya İşlemleri-3 bölümüne bakınız. 

Hiç yorum yok:

Yorum Gönderme