C programlama dilinde fonksiyonlara çok güzel bir örnek ve uygulama olan
Hanoi kulelerini mutlaka deneyin. Algoritma açısından çok önemli...
C de Hanoi Kuleleri
Bazı oyun sitelerinde ya da programlarda görmüşsünüzdür belki de. Hanoi kuleleri; 3 tane çubuk vardır, ortası delik, diskleri üst üste bir tanesinden diğerine aktarmanızı ister. Ancak 2 tane meşhur kuralımız vardır:
- 1.cisi, küçük diskin üzerine büyük disk gelemez.
- 2.cisi, her seferinde sadece bir disk hareket ettirilebilir ve tabi ki de en üstte bulunan disk hareket ettirilmek zorundadır; hatta bazı sitelerde bu oyuna 3. kural konulmuştur: Sınırlı hareket sayınız var diye.
Tabi biz bunun programını yapınca şaşırma şansımız kalmıyor. Keşke bunun yarışmasını yapsalar da biz de boyuna birinciliği programımız sayesinde alsak.
Programcılık aslında algoritma işidir. Yani bu Hanoi kulelerinin çalışma prensibi nedir, bunu bulmamız lazım. Yoksa programı yazamayız.
Kurallarımız çerçevesinde bir kağıt kalem alıp düşünüyoruz; nasıl yapalım diye ve şöyle bir fikir buluyoruz:
Diyelim ki elimizde n tane disk var ve bunlardan bu n-1 tane diski taşımak için yaptığınız işlem sayısı x ise, n diski taşımak için yapacağınız işlem sayısı 2x + 1 olacaktır.
Aslında bunun çıktığı nokta şurasıdır: n disk önce 1 den 2 ye taşınır yani x tane işlem yapılmış olur.Daha sonra n. disk 1 den 3. çubuğa taşınır Daha sonra 2. kuledeki n - 1 disk 3. kuleye taşınır (x tane işlem daha). Buradaki olay aslında tek disk içinde 8 disk içinde aynı ki hanoi kuleleri bildiğim kaderıyla en fazla 8 oluyor onu da 255 harekette yapabiliyoruz. Tabi siz bu kuleleri sınırlı hareket içinde çözmeye kalkarsanız birkaç gününüz gider bunu düşünüp bu kodu programladım
#include <stdio.h>
#include <conio.h>
void disk_mov(int value, int kule1, int kule3, int kule2);
/*disk hareketlerini çağıran fonksiyonumuzun varligini
programa haber veriyoruz bunuda sonundaki ; isaretinden anlıyoruz*/
main() /*asil fonksiyonumuz*/
{
int disks; /*disk diye bir degiskenimiz var türü integer tamsayi*/
printf("Lutfen Hanoi kulenizdeki tasinacak disk sayisini giriniz:";
scanf("%d", &disks); /*disk sayisini aldik*/
disk_mov(disks, 1, 3, 2); /*fonksiyonu çagirdik*/
printf("islem sona erdi kuleniz tamam tebrikler ";
getchar();getchar();getchar(); /*sonucun ekranda kalmasini sagliyorlar 3ünüde silip tekrar deneyin programi çalistirmayi*/
return 0;
}
void disk_mov(int value, int kule1, int kule3, int kule2) /*iste fonksiyonumuz*/
{
if (value == 1) {
{printf("%d'den-> %d'e diski tasiyiniz sonrasinda \n\n", kule1, kule3);
}
return;
}
disk_mov(value - 1, kule1, kule2, kule3);
printf("%d'den-> %d'e diski tasiyiniz sonrasinda\n\n", kule1, kule3);
disk_mov(value - 1, kule2, kule3, kule1);
}