Bilgisayar Hafızasını Fethet 1: isalpha

Mehmed Fatih Bayraktar
4 min readJul 9, 2023

--

Bilgisayar programlamak, bir bilgisayar hafızasına alınan veriler üzerinde belli bir algoritmaya göre yapılacak işlemleri bir programlama dili ile tanımlamaktır. Programlamayı anlamak için bilgisayar hafızasını iyi anlamak gerekiyor. Bilgisayar hafızasını iyi anlamak için de bence C programlama dilinin string (metin) fonksiyonlarını anlamaya çalışabiliriz.

Kendimi bu konuda geliştirmek ve sağlam temellere sahip olabilmek için 42 Kocaeli kampüsünde bir yola çıktım. Bilgisayar hafızasını fethettikçe öğrendiklerimi paylaşmak için burada bir yazı dizisi oluşturmak istiyorum. Dizinin içeriğini libc kütüphane fonksiyonlarından seçmeler oluşturacak. Bu fonksiyonları anladıktan sonra bu kütüphane dışında başka nasıl faydalı fonksiyonlar olabilir şeklinde seriyi uzatabiliriz.

Coding with C programming language

Fonksiyonları anlamak için önce fonksiyonların Linux işletim sistemindeki “man pages” açıklamalarına bakacağız. Sonra bu tanımlardan yola çıkarak kendimiz fonksiyonu C dili ile yazıp test edeceğiz. Dokümantasyona man <function_name> komutuyla erişilebilir (mesela man isalpha). Ayrıca Linux Man Pages şeklinde bir Internet aramasıyla online dokümanlara da ulaşabilirsiniz. Kampüste MacOS 10 sistemlerde FreeBSD tabanlı bir Linux dağıtımı var. Dolayısıyla Mac terminalindeki man dokümantasyonunu veya man.freebsd.org web sitesini tercih edeceğim. Farklı Linux dağıtımları ve man sayfalarına bakılarak fonksiyonlar hakkında ekstra bilgiler edinilebilir.

Haydi ilk fonksiyonumuz olan isalpha ile başlayalım. Yalnız önce man ascii komutuyla ASCII karakter kodlarına bakmakta fayda var. Yazımızda vereceğimiz işlem örneklerindeki string değerler, ASCII tablosundaki karakterler kullanılarak oluşturulacak. Aşağıdaki tabloda karakterlerin bir listesi ve decimal (ondalık) sayı karşılıkları görülebilir.

  0 NUL    1 SOH    2 STX    3 ETX    4 EOT    5 ENQ    6 ACK    7 BEL
8 BS 9 HT 10 LF 11 VT 12 FF 13 CR 14 SO 15 SI
16 DLE 17 DC1 18 DC2 19 DC3 20 DC4 21 NAK 22 SYN 23 ETB
24 CAN 25 EM 26 SUB 27 ESC 28 FS 29 GS 30 RS 31 US
32 SP 33 ! 34 “ 35 # 36 $ 37 % 38 & 39 ‘
40 ( 41 ) 42 * 43 + 44 , 45 – 46 . 47 /
48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7
56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ?
64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G
72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O
80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W
88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _
96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g
104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o
112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w
120 x 121 y 122 z 123 { 124 | 125 } 126 ~ 127 DEL

Şimdi isalpha fonksiyonuna dönelim. Bu fonksiyonu kullanmak için ctype.h kütüphanesini koda eklemek gerekir. Fonksiyonun tanımı şu şekilde verilmiştir:

int isalpha(int c);

Bu tanım isalpha fonksiyonunun integer tipinde bir tamsayı değerini girdi parametresi olarak aldığını ve geriye intiger tipinde bir sonuç döndürdüğünü söylüyor. Fonksiyonun girdi argümanı yukarıdaki tabloda görülen karakterlerden biridir. Fonksiyon, bu karakterin bir büyük ya da küçük harf olup olmadığını döner. Eğer karakter bir harf ise 0 dışında bir sayı, değilse 0 döndürülür. Mesela isalpha(65) veya isalpha(‘A’) sonucu 1, isalpha(64) sonucu ise 0 olabilir.

Yukarıda bahsedilen ctype.h kütüphanesinde ayrıca isupper ve islower diye de iki fonksiyon bulunmaktadır. Adlarından anlaşılacağı üzere isupper, argüman olarak verilen sayı değerinin bir büyük harf; islower, argüman olarak verilen sayı değerinin bir küçük harf olup olmadığını döner. Yani isalpha fonksiyonunun geri dönüş değeri aynı zamanda hem isupper, hem islower 0 dışında bir değer dönüyor ise doğrudur.

int isalpha(int c) {
if (isupper(c) || islower(c))
return 1;
else
return 0;
}

Peki hazır kütüphane fonksiyonlarını kullanmadan kendimiz bunu nasıl gerçekleştirebiliriz? ASCII tablosunu kullanarak bunu kolayca yapabiliriz.

int isalpha(int c) {
if (c >= 65 && c <= 90 || c >= 97 && c <= 122)
return 1;
else
return 0;
}

Şimdi kodumuzu test edelim ve orijinal fonksiyon ile karşılaştıralım. Bunun için kendi yazdığımız fonksiyona farklı bir isim verelim.

#include <stdio.h>
#include <ctype.h>

int ft_isalpha(int c) {
unsigned char a;

a = c % 128;
if (a >= 65 && a <= 90 || a >= 97 && a <= 122)
return 1;
else
return 0;
}

int main(void) {
printf("isalpha('%c'): %d\n", (char) 65, isalpha(65)); // A
printf("ft_isalpha('%c'): %d\n", (char) 65, ft_isalpha(65));
printf("isalpha('%c'): %d\n", (char) 97, isalpha(97)); // a
printf("ft_isalpha('%c'): %d\n", (char) 97, ft_isalpha(97));
printf("isalpha('%c'): %d\n", (char) 64, isalpha(64)); // @
printf("ft_isalpha('%c'): %d\n", (char) 64, ft_isalpha(64));
return 0;
}

Uygulama çalıştırıldığında şöyle bir çıktı görebilirsiniz:

isalpha('A'): 1024
ft_isalpha('A'): 1
isalpha('a'): 1024
ft_isalpha('a'): 1
isalpha('@'): 0
ft_isalpha('@'): 0

Orijinal fonksiyon 1024 değerini dönerken biz 1 değerini döndürdük.

İlk yazımızı burada sonlandıralım. İkinci yazımızda ASCII tablosunun üzerinde işlem yapan birkaç fonksiyondan daha bahsettikten sonra, string işlemleriyle bilgisayar hafızasını anlama yolculuğuna devam edeceğiz. Keyifli okumalar dilerim.

--

--

Mehmed Fatih Bayraktar

Master in Computer Engineering, working for Turkcell as Principal Data Analytics Developer and instructor at Turkcell Akademi