Recursive DEC to HEX function in C
https://github.com/esatiz/Dec2Hex
https://github.com/esatiz/SordumNET/blob/main/Dec2Hex.c
Kod: Tümünü seç
#include <stdio.h>
#include <conio.h>
char harf[/*17 yazmamıza gerek yok*/] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', '\0' };
void toHex(int sayi)
{
if (sayi > 15)
{
toHex(sayi / 16);
}
printf("%c", harf[sayi % 16]);
}
int main()
{
toHex(123);
getch();
return 0;
}
Programımızda global değişken olarak yani programdaki bütün fonksiyonların erişebileceği şekilde bir karakter dizisi tanımladık. Sonra main fonksiyonumuzda program başladı. dec_to_hex fonksiyonu 123 değerindeki parametre ile çalıştırıldı. Peki bu fonksiyon nasıl çalışıyor derseniz, kendini çağırma özelliğine sahip yani recursive (özyinelemeli) bir fonksiyon.
Özyineleme şöyle çalışır (İç içe fonksiyonlar iş yapsa bile kodda yukarıdan aşağı gidildiği unutulmamalıdır ) :
123'ü gönderdik, 123 > 15 mi ? evet o zaman tekrar fonksiyonu çağıralım ama bu sefer 123 / 16 değeriyle olsun. O çağırılan noktada toHex(7) oluştu. Onun içine girelim. 7 > 15 mi ? : hayır o zaman if'i terk edelim, kendini çağırmadan kurtulduk Aşağıda printf var. Global karakter dizimizdeki 7. karakteri ekrana basar. Yani 7 rakamını.void toHex(int sayi)
{
if (sayi > 15)
{}void toHex(int sayi) // Buradaki "sayi", dışarıdaki fonksiyonun sayısı değil. Lokal değişken.
{
if (sayi > 15)
{}void toHex(int sayi) // Buradaki "sayi" da sadece bu fonksiyona ait.
{
if (sayi > 15)
{
toHex(sayi / 16); // Buradaki if şartı sağlandığı sürece fonksiyon kendini çağırır.
}
printf("%c", harf[sayi % 16]);
}
printf("%c", harf[sayi % 16]);
}
printf("%c", harf[sayi % 16]);
}
İçeride çağırdığımız fonksiyonla işimiz bitti, dışarıdaki fonksiyondan devam ediyoruz, if bloğundan kurtulduk, hemen aşağıda bir tane printf var. Fakat, orada 7 rakamını değil 123 sayısını "sayi" olarak alacağız.
harf'in 123 mod 16 = 11. karakteri yani B harfini ekrana basacağız. Bakıyoruz bütün fonksiyonların sonuna geldik.
Ekranda ne var? 7B.
Kod: Tümünü seç
0x7B
0x0000007B
(16 * 7) + (1 * 11) = 123
void toHex(int sayi)
{
if (123 > 15)
{}void toHex(int sayi)
{
if (7 > 15)
{
toHex(int sayi / 16); // Burası çalışmaz, kendini çağırma işi bitti.
}
printf("%c", harf[7 % 16]); // Ekrandaki yazı : 7
}
printf("%c", harf[123 % 16]); // Ekrandaki yazı : 7B
}