IRCForumları - IRC ve mIRC Kullanıcılarının Buluşma Noktası
  sohbet

 Kayıt ol  Topluluk
Yeni Konu aç Cevapla
 
LinkBack Seçenekler Stil
Alt 08 Mart 2010, 20:53   #1
Çevrimdışı
Kullanıcıların profil bilgileri misafirlere kapatılmıştır.
IF Ticaret Sayısı: (0)
IF Ticaret Yüzdesi:(%)
C Algoritma Geliştirme..




Hayatımızın her alanında problemlerle karşılaşıyoruz ve bildiğimiz gibi bu konuları çözümleme üstüne odaklanıyoruz. Bilgisayar alanındaki programlama dilleri de aslında bizim ürettiğimiz belli bir mantık içinde görevini yerine getirmek üzere tasarlanmıştır. Yemek, içmek gibi her an farkında olmadan çözmeye çalıştığımız problemlerin karşılıklarını C algoritmaları içerisinde de buluyoruz. Ürettiğimiz çözüm algoritmalarının kaynak kodunu derlemek ve çalışır bir program haline getirmek de, bir mantık çerçevesi içinde, başlama ve bitiş sürecinin arasında kalmış bir evreden ibaret.

İlk önce isterseniz basit birkaç algoritma ve çözüm yolları düşünelim ve bunların hangi evrelerden en iyi çözüme gittiğini görelim. Örneğin, çalışan bir saat yapmak istesek, gün, saat, dakika ve saniye cinsinden 4 adet döngüyle kontrol sağlamamız gerekecekti. Fakat bu algoritmayı sadece 1 adet döngü kullanarak da nasıl çözüme ulaşabileceğimizi göstermeye çalışacağım. Çalışan saat örneğimiz ;

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
int main() { int i,j= 0,x= 0,z=0; for(i = 0;i < 61; i++) { delay(500); if(i > 59) { j++; i=0; delay(1000); } if(j > 59){ x++; j=0; delay(1000); } if(x > 23){ z++; z=0; delay(1000); } printf("%d gun %d saat %d dakika %d saniye\r",z,x,j,i); } return 0; }

Örneğimizde de gördüğünüz gibi; iç içe döngülerle uğraşmak yerine bir adet for döngüsüyle çözüme ulaştık. Bu uygulamamızı, programınızın ne kadar zamandır çalıştığını öğrenmek içinde kullanabilirsiniz.

Küçük örneklerle size algoritmaları anlatmaya çalışacağım. Gördüğünüz gibi algoritma kurulamazsa programdan bahsedemeyiz. Kod yazmak bir sanattır ama şu da unutulmaması gerekir ki algoritma yani çözücülük sanatı kod yazma sanatının lokomotifidir. Karmaşık yollardan çözüme ulaşan bir algoritmanın kodu da karmaşık olacaktır. Unutmayalım ki, programlama sanatı hem algoritmayı hem de kodu kapsayan bir birlikteliktir. Bunun da en önemli amacı programın anlaşılabilir ve taşınabilir olmasıdır.

Girişimizi yaptıktan sonra ana konumuza yavaş yavaş değinelim bir problem düşünelim ve bunun yapım aşamalarını ortaya çıkartalım.

Problemimiz şu olsun:

Bir satranç tahtasında aletlerimizi (şah , at, fil vb.), nereye koyarsak koyalım yapabileceği bütün hamleleri bize gösterebilen bir o kadarda yararlı bir uygulama geliştirelim. Bu uygulamamızın adı (programımızın bir adı olmalı değil mi?), hamle v0.9 olsun.

İlk öncelikle include’larımızı ve global değişkenlerimizi koyalım;

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
#include <stdio.h> #include <stdlib.h> #include <string.h> #define alet tahtagor(tahta) int satir, sutun; int tahta[8][8]={0};

Burada tahta dizimiz, satranç tahtamızı temsil etmektedir(8x8’liktir lakin dizilerin 0’ıncı indis’den başladığını unutmayalım). Satir ve sutun ise tahtamızın bizim oluşturduğumuz, sanal olarak x ve y koordinatlarına böldüğümüz matrisimizin istediğimiz alanına ulaşmakta kullandığımız değişkenlerimizdir.

Burada bütün taşların mantığı belli bir kalıba oturduğu için her taşımızı çözümlemek yerine önce at aletimizi çözümlemeyi uygun bulduk yazımızın altında uygulamanın çalıştırılabilir programını bulabilirsiniz.

At fonksiyonumu;

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
void at(int n, int m) { int ilk,son,z; int kadir[8][2]={{-2,-1},{-2,1},{2,-1},{2,1},{1,-2},{1,2},{-1,-2},{-1,2}}; for(z=0;z<8;z++){ ilk = kadir[z][0]; son = kadir[z][1]; kolaylik(n,m,ilk,son); } }


Gördüğünüz gibi bir at fonksiyonu yazdık burada dikkat edilmesi gereken yer kadir dizimiz olacaktır. Kadir dizimizde bir atın gidebileceği yerleri tanımlamış bulunuyoruz. Bir at aleti L şeklinde gideceği için 2 ve 1 rakamları bizim sihirli sayılarımızdır. Bunların oluşturduğu kombinasyonlar, kadir dizinini çok değerli bir hale getirmektedir. Sizde bir satranç tahtasında bu rakamları kullanarak gidebileceği bütün yerleri görebilirsiniz(algoritmanın burada işi nasıl bitirdiğini görebilirsiniz acaba beynimizde 0 ve 1’lerdenmi oluşuyor
Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir.
). Unutulmaması gereken bir diğer husus ise döngümüzün 8 defa döndüğüdür. At’ımızın gidebileceği maksimum yer sayısı 8’dir. Aynı anda ilk ve son değişkenlerimize x ve y koordinatlarını bildiriyoruz. At fonksiyonumuzun aldığı iki tamsayı parametre ise geldiği gibi fonksiyonun içinden kolaylik fonksiyonumuza geçiyor.

İsterseniz kolaylik fonksiyonumuzu inceleyelim(nede olsa C bir fonksiyonlar dili bunu sonuna kadar kullanabiliriz).

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
void kolaylik(int re, int ke, int z, int l) { int x,y; system("cls"); re += z; ke += l; for(x= 0,y = 0;x < 8, y < 8; x++,y++) { if(re > x || ke > y || re < 0 || ke < 0) { } else{ gecerli(re, ke); } } }

Kolaylik fonksiyonumuz, 4 parametre almaktadır. Unutmayalım At fonksiyonundan aldığı n,m ve ilk,son değişkenleri ile işlem yapmaktadır. Dizimizin taşmaması ve saçmalamasını önlemek için for döngümüzü işe getirdik eğer taşıyorsa veya saçmalıyorsa da hiçbir şey yapmadan o pozisyonu if deyimimizde pas geçiyor. Eğer bir sorun yoksa gecerli() fonksiyonumuz işletiliyor. Unutulmaması gereken at fonksiyonumuzun aldığı iki parametre değişkeni, at fonksiyonumuz içindeki ve kadir değişkeninden aldığımız değerle toplanıyor.

İsterseniz şimdide gecerli() fonksiyonumuzu inceleyelim (fonksiyonların bizi nereye götüreceği belli olmuyor ).

İşte geçerli fonksiyonumuz;

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
void gecerli(int x, int y) { tahta[x][y]=2; }

Sadece tahtamızdaki hamleleri işliyor. Basit ama o kadarda işin özünü anlatan bir fonksiyon diyebiliriz.

Ve uygulamamız da satranç tahtamızı görmek için yazdığım bir fonksiyon;

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
void tahtagor(int dizi[][8]) { int k,l; printf("\n\n"); for(k=0;k<8;k++){ for(l=0;l<8;l++){ printf("\t%d",dizi[k][l]); } printf("\n\n\n\n"); } }

Bu kısmı anlatmama gerek yok sanıyorum basitçe dizinin her elemanını bir matris şeklinde yazdırıyor.

Evet, işin zor kısmını atlattık bundan sonraki bölümler ince ve dikkat edilmesi gereken noktalar.

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
void warning() { printf("Ornek 4 5 !!!"); scanf("%d%d",&satir,&sutun); system("CLS"); satir--; sutun--; tahta[satir][sutun]=1; }


Burada satir ve sutun değişkenlerimizi okuyoruz ve 1 azaltıyoruz malum dizilerin güzelliklerinden dolayı.
Algoritmalar daha çok bizim atı nasıl işletebileceğimiz kısmında ortaya çıkıyor. Benim yazdığım aletin bütün hamleleri, adlı uygulamanın bu konuda en iyi algoritma olduğunu savunmuyorum, çünkü daha çok çözüm yolları olabildiği gibi daha iyisi ve daha kötüsüde olabilir.

main ve hikaye isimli son fonksiyonumuzu da verelim.

Kod:   Kodu kopyalamak için üzerine çift tıklayın!
int main() { int a; hikaye(); scanf("%d",&a); if(a == 1) { printf("At’in Konumunu Giriniz"); warning(); at(satir, sutun); } else if(a == 2){ printf("Fil’in Konumunu Giriniz"); warning(); fil(satir, sutun); } else if(a == 3){ printf("Kale’nin Konumunu Giriniz"); warning(); kale(satir, sutun); } else if(a == 4){ printf("Piyon’un Konumunu Giriniz"); warning(); piyon(satir, sutun); } else if(a == 5){ printf("Sah’in Konumunu Giriniz"); warning(); sah(satir, sutun); } else if(a == 6){ printf("Vezir’in Konumunu Giriniz"); warning(); vezir(satir, sutun); } alet; getch(); return 0; } void hikaye() { system("CLS"); printf("\n\n\tLutfen Bir Alet Seciniz\n"); printf("\t1-) At\n\t2-) Fil\n\t3-) Kale \n\t4-) Piyon\n\t5-) Sah\n\t6-) Vezir\n"); printf("\twritten by Volkan Atasever\t
Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir.
\n"); }

Evet, uygulamamız bitti sizde kalan diğer taşları programlarsanız bu uygulamanın bir anlamı olacağı kanısındayım.

----------


Bu forumdaki linkleri ve resimleri görebilmek için en az 25 mesajınız olması gerekir.
C dilini ve komutlarını öğrenmek, programlamaya başlamak için şarttır ama algoritma oluşturamadığımız sürece bir program oluşturmazsınız. Algoritma, mantıktır. Yani neyi, nasıl yapacağınızı belirtir. Algoritma türetmek için geliştirilmiş bir metot yok. Her program için o metodu sizin bulmanız gerekiyor. Ama hiç merak etmeyin, yazdığınız program sayısı arttıkça, algoritma kurmanız daha kolaylaşır.
Algoritma, programlamanın bel kemiğidir. C dilinde kullanılan komutlar, BASIC veya FORTRAN gibi başka dillerde işe yaramaz. Fakat programlama mantığını bir kere oturttursanız, C komutlarının yerine pekâlâ başka dillere ait komutları da öğrenebilir ve büyük bir zorluk çekmeden diğer dillerde de program yazabilirsiniz.
Basit bir örnek üzerinden düşünelim. Bir markete gittiniz, kasada ki görevliye aldığınız ürünü gösterdiniz, parayı uzattınız, paranın üstünü aldınız. Günlük hayatta gayet normal olan bu durumu biraz değiştirelim. Karşınızda insan değil, elektronik bir kasiyer olsun. Ona göre bir algoritma geliştirirsek,
1-) Ürüne bak;
2-) Ürün Fiyatını bul;
3-) Parayı al;
4-) Alınan paradan ürün fiyatını çıkar;
5-) Kalan parayı ver.
İnsan zekasının otomatik hâle getirdiği eylemleri, ne yazık ki bilgisayar bilmez ve ona biz öğretmek zorundayız. Öğretirken de hata yapma hakkımız yoktur, çünkü yanlış öğreti yanlış programlamayla sonuçlanır.

 
Alıntı ile Cevapla

IRCForumlari.NET Reklamlar
sohbet odaları reklam ver Benimmekan Mobil Sohbet
Cevapla

Etiketler
algoritma, gelistirme, geliştirme


Konuyu Toplam 1 Üye okuyor. (0 Kayıtlı üye ve 1 Misafir)
 

Yetkileriniz
Konu Acma Yetkiniz Yok
Cevap Yazma Yetkiniz Yok
Eklenti Yükleme Yetkiniz Yok
Mesajınızı Değiştirme Yetkiniz Yok

BB code is Açık
Smileler Açık
[IMG] Kodları Açık
HTML-Kodu Kapalı
Trackbacks are Kapalı
Pingbacks are Açık
Refbacks are Açık


Benzer Konular
Konu Konuyu Başlatan Forum Cevaplar Son Mesaj
Algoritma Nedir? Violent Sözlük 0 10 Şubat 2014 23:41
Google'dan 17,5 saatte bir yeni algoritma! System Arama Motorları Haberleri 1 01 Eylül 2011 18:52
Google yeni algoritma (Caffein) DizZy Google 4 17 Haziran 2010 18:27