Decimal to Hexadecimal (Recursive) [C]

Programlama ve Script dilleri konusunda bilgi paylaşım alanıdır.
Cevapla
Kullanıcı avatarı
esatiz
Gigabyte3
Gigabyte3
Mesajlar: 2650
Kayıt: 30 Eki 2020, 11:18
cinsiyet: Erkek
Teşekkür etti: 335 kez
Teşekkür edildi: 272 kez

Decimal to Hexadecimal (Recursive) [C]

Mesaj gönderen esatiz »

Resim

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;
}
Bu fonksiyon nasıl çalışıyor bir bakalım :kafasalla:
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 :kafasalla:) :
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]);
}
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 :kafasalla: Aşağıda printf var. Global karakter dizimizdeki 7. karakteri ekrana basar. Yani 7 rakamını.

İç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
}
Cevapla