29 Aralık 2021 Çarşamba

QuickBasic - 9: Sayılarla ilgili işlemler

Yayınlama: 2000
Güncelleme: 29 Aralık 2021

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, QuickBasic 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

Verilen sayıyı 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.
PRINT RND '0 - 1 arası küsurlu bir sayı
PRINT RND(1)
PRINT INT(RND * 10) + 1 '0-9 arası tam sayı
RND komutu program her çalıştırılmasında aynı sayıları üretir.

Bundan kurtulmak için aşağıda verilen örnekte olduğu gibi RND komutundan önce RANDOMIZE TIMER kullanılır.

TIMER, saat 00:00:00'dan o anki saate kadar geçen süreyi saniye cinsinden verir.

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

Rastgele sayı üreticisini hazırlar.

Örnek 1:
RANDOMIZE TIMER
DO
    rgs% = INT(RND * 11) + 2 '(2-12 arası rastgele sayı)
    PRINT rgs%;
    SLEEP
LOOP UNTIL INKEY$ = CHR$(27) 'ESC : Çıkış
Örnek 2: Sayı tahmin oyunu
' **** SAYI TAHMİN OYUNU ****
' ©2020 Mesut Akcan
' 28/05/2020
' mesutakcan.blogspot.com
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

Örnek 3
'Mesut Akcan
CLS
RANDOMIZE TIMER
FOR c = 191 TO 196
	COLOR c - 191 + 10
	FOR n = 1 TO 80 * 24
		PRINT CHR$(c + RND);
	NEXT
	SLEEP
NEXT

DÖNÜŞTÜRME FONKSİYONLARI

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

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.

SIN

Radyan olarak verilen açının sinüsünü verir.
Dereceyi radyana dönüştürmek için: sayı * (pi / 180)

Örnekler:
pi# = 4 * ATN(1) 'pi sayısı
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

ArkTanjant (Arctangent)
ATN
Arksinüs (arcsine) Arcsin = Atn(X / Sqr(-X * X + 1))
Sekant (secant)
Sec = 1 / Cos(X)
Kosekant (cosecant)
Cosec = 1 / Sin(X)
Kotanjant (cotangent)
Cotan = 1 / Tan(X)
Arkkosinüs (arccosine)
Arccos = Atn(-X / Sqr(-X * X + 1)) + 2 * Atn(1)
Arksekant (arcsecant)
Arcsec = Atn(X / Sqr(X * X – 1)) + Sgn((X) – 1) * (2 * Atn(1))
Arkkosekant (arccosecant)
Arccosec = Atn(X / Sqr(X * X - 1)) + (Sgn(X) – 1) * (2 * Atn(1))
Arkkotanjant (arccotangent)
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 tabanı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ı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
Örnek: 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
PRINT SGN(18) ' 1
PRINT SGN(0) ' 0
PRINT SGN(20-10) ' 1
PRINT SGN(-20-10) ' -1
PRINT SGN(-2*-10) ' 1
PRINT SGN(10/-2) ' -1
PRINT SGN(10+12-5-4/2-17) ' -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

QuickBasic'te 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): QuickBasic'te 2'lik sayıyı doğrudan 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:
QuickBasic 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:

QuickBasic 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 de 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

STR$

Sayıyı string'e dönüştürür
a = 4.5
b$ = STR$(a)
MKI$, MKS$, MKL$, MKD$ komutları için Dosya İşlemleri-3 bölümüne bakınız.



Önceki Bölüm: 8: Karakterlerle ilgili işlemler Sonraki Bölüm: 10: Dosya İşlemleri-1

Hiç yorum yok:

Yorum Gönder