<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Bilgisayar Kavramları &#187; Kod Örnekleri</title>
	<atom:link href="http://www.bilgisayarkavramlari.com/category/kodlar/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.bilgisayarkavramlari.com</link>
	<description>www.bilgisayarkavramlari.com</description>
	<lastBuildDate>Wed, 18 Aug 2010 21:13:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Visual Basic ile Gösterici (Pointer) Kullanımı</title>
		<link>http://www.bilgisayarkavramlari.com/2010/02/23/visual-basic-ile-gosterici-pointer-kullanimi/</link>
		<comments>http://www.bilgisayarkavramlari.com/2010/02/23/visual-basic-ile-gosterici-pointer-kullanimi/#comments</comments>
		<pubDate>Tue, 23 Feb 2010 09:43:12 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Kod Örnekleri]]></category>
		<category><![CDATA[veri yapıları]]></category>
		<category><![CDATA[pointer]]></category>
		<category><![CDATA[visual basic]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2010/02/23/visual-basic-ile-gosterici-pointer-kullanimi/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Sitede gelen bir soru üzerine bu yazıyı yazmaya karar verdim. Bilgisayar dilleri (makine işlemeli diller, machine processing languages) tasnif edilirken, visual basic gibi görsel tasarıma dayalı diller üst seviye dil (high level langauge) olarak kabul edilirler. Hatta hiç kod yazmadan program üretilmesine izin verdiği için visual basic&#8217;i bir dilden çok [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>Sitede gelen bir soru üzerine bu yazıyı yazmaya karar verdim. Bilgisayar dilleri (makine işlemeli diller, machine processing languages) tasnif edilirken, visual basic gibi görsel tasarıma dayalı diller üst seviye dil (high level langauge) olarak kabul edilirler. Hatta hiç kod yazmadan program üretilmesine izin verdiği için visual basic&#8217;i bir dilden çok görsel geliştirme ortamı olarak kabul eden (basic&#8217;i dil ancak visual basic&#8217;i bir geliştirme ortamı) tasnifler söz konusudur.</p>
<p><a href="http://www.bilgisayarkavramlari.com/2007/10/16/pointer-gosterici-2/">Göstericiler (pointers)</a> ise tam tersine düşük seviyeli dillerde daha çok ihtiyaç duyulan ve programın geliştirildiği bilgisayarın hafızasına (ram) doğrudan erişim yapan yapılardır. Dolayısıyla tanım itibariyle visual basic ve <a href="http://www.bilgisayarkavramlari.com/2007/10/16/pointer-gosterici-2/">gösterici (pointer)</a> kavramları birbiri ile uyuşmazlar. Ancak .Net teknoloji ile birlikte nesne yönelimli programlama (object oriented programming) yapısı kazanan adeta kabuk değiştiren visual basic ile gösterici kullanımı ihtiyacı artmıştır.</p>
<p>Nesne yönelimli dillerin çoğunda (örn. JAVA) doğrudan gösterici kullanımı bulunmaz. Bunun yerine <a href="http://www.bilgisayarkavramlari.com/2007/05/03/pointer-gosterici/">nesne atfı ismi verilen (object referrer)</a> yapılar kullanılır ve bu yapılar aslında birere göstericidir.</p>
<p>Visual basic de nesne yönelimli programlama ile birlikte bu nesne atıflarını içermiş ve artık gösterici yapısını nesne yönelimli olarak içermiştir ancak biz bu yazı kapsamında, nesne yönelimli programlanın bize sunduğu bu imkanı bir kenara bırakarak, saf visual basic dilinde göstericileri nasıl kullanabileceğimizi irdeleyeceğiz.</p>
<p>Konuyu aşağıdaki örnek üzerinden anlamaya çalışalım.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/022310_0943_VisualBasic1.png" alt="" width="621" height="291" /></p>
<p>Yukarıda, C dilinde yazılmış basit bir gösterici kodu bulunmaktadır. Kodumuzun 7. Satırında p isimli bir tam sayı göstericisi (integer pointer) tanımlanmış, 8 . satırda bu göstericinin gösterdiği yerde 1 tam sayı konulacak bir yer hafızada ayrılmış (memory allocation) ve 9. Satıda bu göstericinin gösterdiği adrese 10 değeri konulmuştur.</p>
<p>Kodun 10. Satırında göstericinin adresi (hafızada nereyi gösterdiği ) ve gösterdiği yerdeki değerler ekrana basılmış ve 11. Satırda gösterici için ayrılan hafıza bölmesi serbest bırakılmıştır (free).</p>
<p>Yukarıdaki bu kodun çalışan hali aşağıda verilmiştir:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/022310_0943_VisualBasic2.png" alt="" /></p>
<p>Şimdi yukarıdaki bu basit C dili ile yazılmış gösterici kodunu Visual Basic dili ile kodlamaya çalışalım.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/022310_0943_VisualBasic3.png" alt="" width="550" height="325" /></p>
<p>Yukarıdaki kodu inceleyecek olursak, yapı olarak bir form yükleme fonksiyonuna yazılmış kodumuz, p ve hHeap isimli iki adet Long tipinde değişken tanımlayarak başlıyor. Buradaki p değişkenini  bir gösterici olarak kullanacağız. Dikkat edilmesi gereken husus, p değişkeninde gösterici mantığında olduğu üzere bir hafıza bölmesinin adresinin tutulmasıdır. Yani C dilinde olan p göstericisinde nasıl hafızanın bir adresi tutuluyorsa, visual basic örneğinde de hafıza adresini tutmaya çalışacağız.</p>
<p>Öncelikle çalışan programımızın yani <a href="http://www.bilgisayarkavramlari.com/2007/11/18/islem-process/">işlemin (process)</a> çalıştığı alanı tutan hHeap isimli değişkenimizden HeapAlloc fonksiyonu ile (C dilindeki malloc benzeri) hafızada bir alan ayırması yapılıyor.</p>
<p>Bu ayırma sırasında 0&#8242;dan başlanarak 2 boyutunda ayırma işlemi yapılmıştır. 2 sayısı, visual basic dilindeki bir tamsayının (integer) hafızada kapladığı alan boyutudur.</p>
<p>Sonuçta kodun 22. Satırı itibariyle, p isminde bir değişken ve bu değişkenin içinde, hafızada bize ayrılmış 2 byte uzunluğunda bir alanın adresi bulunmaktadır.</p>
<p>Ardından 23. Satırda böyle bir adres ayrımı başarılı olduysa, artık bu adres alanına bir integer değer koymayı deneyebiliriz.</p>
<p>24. satırda i isimli bir tam sayı değişkeni tanımlanıyor, 25. Satırda bu değişkene sayısal olarak 10 değeri konuluyor ve sonunda 26. Satırda, p göstericimizin gösterdiği adrese, i değişkenin içindeki değer konuluyor. Bu sırada CopyMemoryWrite fonksiyonu kullanılmıştır. Bu fonksiyon kernel32 dinamik kütüphanesi içinde bulunan <span style="color: #a31515; font-family: Courier New; font-size: 10pt;">RtlMoveMemory</span> fonksiyonudur. Dolayısıyla bu fonksiyonu kullanmak için aşağıdakine benzer bir şekilde kodun başında tanım yapılmalıdır:</p>
<p><span style="font-family: Courier New; font-size: 10pt;"><span style="color: blue;">Private </span><span style="color: blue;">Declare</span> <span style="color: blue;">Sub</span> CopyMemoryWrite <span style="color: blue;">Lib</span> <span style="color: #a31515;">&#8220;kernel32&#8243;</span> <span style="color: blue;">Alias</span> _<br />
<span style="color: #a31515;">&#8220;RtlMoveMemory&#8221;</span> (<span style="color: blue;">ByVal</span> Destination <span style="color: blue;">As </span><span style="color: blue;">Long</span>, _<br />
</span></p>
<p><span style="font-family: Courier New; font-size: 10pt;"><span style="color: blue;">ByVal</span> Source <span style="color: blue;">As</span> <span style="color: blue;">Long</span>, <span style="color: blue;">ByVal</span> Length <span style="color: blue;">As</span> <span style="color: blue;">Long</span>)</span></p>
<p>Ardından j isimli bir değişken tanımlanarak, p göstericimizin gösterdiği hafıza alanına daha önceden (kodun 26. Satırında) yazdığımız değeri okumaya çalışıyoruz. Bunun içinde yine kernel32.dll kütüphanesinden tanımladığımız fonksiyonumuzu kullanıyoruz.</p>
<p>Sonuç bir mesaj kutusu içerisinde gösteriliyor ve nihayetinde 31. Satırda bu ayrılan hafıza alanı serbest bırakılmaktadır.</p>
<p>Visual basic ile yazılan bu kodun tamamını <a href="http://www.bilgisayarkavramlari.com/wp-content/uploads/WindowsApplication5.rar">bu bağlantıdan</a> indirerek deneyebilirsiniz.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2010/02/23/visual-basic-ile-gosterici-pointer-kullanimi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sierpinski Üçgeni (Sierpinski Triangle)</title>
		<link>http://www.bilgisayarkavramlari.com/2010/01/29/sierpinski-ucgeni-sierpinski-triangle/</link>
		<comments>http://www.bilgisayarkavramlari.com/2010/01/29/sierpinski-ucgeni-sierpinski-triangle/#comments</comments>
		<pubDate>Fri, 29 Jan 2010 14:05:30 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Bilgisayar Grafiği (Computer Graphics)]]></category>
		<category><![CDATA[Scheme (Lisp)]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2010/01/29/sierpinski-ucgeni-sierpinski-triangle/</guid>
		<description><![CDATA[Orijinal ismi Sierpiński olan Polonyalı matematikçi tarafından 1915 yılında tanımlanan bu üçgen, yapı olarak özyineli (recursive) iç üçgenlerden oluşur. Kısaca üçgenin her parçası, üç adet alt üçgen oluşturacak şekilde bölünür. Örneğin aşağıdaki eşkenar üçgeni ele alalım: Bu üçgenin üç köşesinde üç ayrı üçgen oluşturarak işlemimize başlayabiliriz. Yukarıdaki şekilde görüldüğü üzere 3 adet siyah eşkenar üçgen [...]]]></description>
			<content:encoded><![CDATA[<p>Orijinal ismi Sierpiński olan Polonyalı matematikçi tarafından 1915 yılında tanımlanan bu üçgen, yapı olarak <a href="http://www.bilgisayarkavramlari.com/2008/08/05/ozyineli-fonksiyonlar-recursive-functions/">özyineli (recursive)</a> iç üçgenlerden oluşur.</p>
<p>Kısaca üçgenin her parçası, üç adet alt üçgen oluşturacak şekilde bölünür.</p>
<p>Örneğin aşağıdaki eşkenar üçgeni ele alalım:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/012910_1405_Sierpinskig1.png" alt="" /></p>
<p>Bu üçgenin üç köşesinde üç ayrı üçgen oluşturarak işlemimize başlayabiliriz.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/012910_1405_Sierpinskig3.png" alt="" /></p>
<p>Yukarıdaki şekilde görüldüğü üzere 3 adet siyah eşkenar üçgen oluştu. Bu üçgenlerin her birisini ilk başta ele aldığımız üçgen gibi bir adım daha ilerleyerek üç parçaya bölmeye çalışalım:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/012910_1405_Sierpinskig5.png" alt="" /></p>
<p>Görüldüğü üzere bölme işlemi sonucunda her alt üçgeninin üç köşesinde, ilk adımda yapılan işleme benzer şekilde 3 ayrı üçgen oluşturulmuştur.</p>
<p>Bu işlem sonsuza kadar devam ettirilebilir. Ancak bilindiği üzere bilgisayar bilimlerinde sonsuz yoktur. Dolayısıyla bu işlem için bir limit belirlenir ve belirlenen limite kadar işlem devam ettirilir.</p>
<p>Sierpinski üçgeninin kodlanması</p>
<p>Yukarıda anlatılan üçgeni, Scheme dilinde programlamaya çalışalım. Bu kodlama sırasında PLT Scheme kullanılacaktır.</p>
<p>Öncelikle gerekli olan bazı bilgilerimizi hatırlayalım. Çizim için draw.ss teachpackinin yüklü olması gerekiyor.</p>
<p>Bunun için Language menüsünden Add Teachpack seçeneğini seçip draw.ss paketini yüklüyoruz.</p>
<p>Ardından basit bir üçgenin scheme ile nasıl çizileceğine bakalım.</p>
<p>Ne yazık ki üçgen çizen hazır bir fonksiyonumuz bulunmuyor. Bunun için üçgeni oluşturan üç ayrı doğruyu ayrı ayrı çizdiren bir fonksiyonu bizim yazmamız gerekiyor.</p>
<p>(define (draw-triangle a b c)( and (draw-solid-line a b)(draw-solid-line b c)(draw-solid-line c a)))</p>
<p>Yukarıdaki draw-triangle fonksiyonu üç ayrı nokta almaktadır. Bu noktaları birleştiren üç ayrı doğruda fonksiyon içerisinde çizilmektedir. Bilindiği üzere draw-solid-line fonksiyonu verilen iki nokta arasında bir doğru çizer. Bu noktalar make-posn yapısında olmalıdır. Örneğin çizim ekranında (ki ekranın sol üst köşesi 0,0 olarak kabul edilir) 100, 150 koordinatlarından 200, 250 koordinatlarına bir doğru çizmek istiyorsak aşağıdaki şekilde komut vermemiz gerekir:</p>
<p>(draw-solid-line (make-posn 100 150) (make-posn 200 250))</p>
<p>Üçgen çizen fonksiyonumuz olduğuna göre artık sirepinski üçgenini kodlamaya geçebiliriz.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/012910_1405_Sierpinskig7.png" alt="" width="514" height="464" /></p>
<p>Kodumuzu yukarıdaki şekilde yazabiliriz. Kodda dikkat edilirse üçgen çizimi sırasında orta nokta bulma yöntemi kullanılmıştır. Buradaki amaç, üçgenin köşelerinde 3 ayrı üçgen elde etme işlemi sırasında üçgenin kenarlarının orta noktalarının birleştirilmesi ile bir ters üçgen oluşturulması olarak düşünülebilir.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/012910_1405_Sierpinskig8.png" alt="" /></p>
<p>Yukarıdaki şekilde de gösterildiği üzere alsında kenarların orta noktalarını birleştiren bir üçgen çizilmektedir.</p>
<p>İşte üçgeni meydana getiren 3 nokta ve bu noktaların oluşturduğu 3 doğru için orta noktalar bulunmakta ve bulunan bu orta noktaları birleştiren yeni bir üçgen çizilmektedir. Bu noktaları bulan kodumuz, yukarıda verilen mid-point fonksiyonudur. Bu mid-point fonksiyonu da, aritmetik ortalama kullanarak, nokta koordinatlarını toplayıp ikiye bölmekte ve bu işlem için yine yukarıdaki kodda verilen mid fonksiyonunu kullanmaktadır.</p>
<p>Ardından üçgenin 3 alt üçgeni yeniden sierpinski üçgeni çizen fonksiyonumuzu yeni noktalar ile verilmektedir.</p>
<p>Sierpinski üçgeninde dikkat edilirse, üçgeni oluştran 3 nokta (a b ve c) dışında ilave olarak bir n parametresi kullanıyoruz. Bu parametrenin amacı, fonksiyonun belirli bir yerde durmasıdır. Bu sayede kullanıcı, işlemimizin kaç adım gidilebileceğini parametre olarak girebilmekte ve belirtilen adım dolduğunda işlem durmaktadır.</p>
<p>Yukarıdaki kodun çalıştırılması aşağıdaki şekilde olabilir:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/012910_1405_Sierpinskig10.png" alt="" /></p>
<p>Görüldüğü üzere, üçgenin içerisine çizileceği üç nokta belirlenmiştir. Burada noktaları belirlerken, üçgenin eşkenar üçgen olması için ufak bir hesaplama yapılmıştır. Çizim tuvalimiz, 400 400 olarak verilmiş yani bize ekranda 400e 400 pixellik (imgecik) bir alan açılmaktadır. Bu alanı nispeten ortalayan bir üçgende A B ve C noktalarının birleştirilmesi ile teşekkül etmiş olur.</p>
<p>Son olarak sierpinski üçgenini çizen <a href="http://www.bilgisayarkavramlari.com/2008/08/05/ozyineli-fonksiyonlar-recursive-functions/">özyineli (recursive) fonksiyonumuzu</a> bu üç noktanın koordinatları ve 10 adım gidileceğini belirten 10 sabit sayısı ile çağırıyoruz.</p>
<p>Sonuç olarak ekrana çizilen görüntü aşağıdaki şekildedir:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/012910_1405_Sierpinskig11.png" alt="" /></p>
<p>Yukarıdaki şekilde, 10 adım ilerlenmiş ve 10 adım sonunda detaylı bir görüntü oluşmuştur. Örneğin aynı üçgeni 3 parametresi ile, yani 3 adım ilerleyecek şekilde çağırsaydık:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/012910_1405_Sierpinskig12.png" alt="" /></p>
<p>Yukarıda verilen biraz daha ilkel halini görecektik.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2010/01/29/sierpinski-ucgeni-sierpinski-triangle/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>C ile Programlamaya Giriş Quiz Soruları ve Çözümleri</title>
		<link>http://www.bilgisayarkavramlari.com/2010/01/13/c-ile-programlamaya-giris-quiz-sorulari-ve-cozumleri/</link>
		<comments>http://www.bilgisayarkavramlari.com/2010/01/13/c-ile-programlamaya-giris-quiz-sorulari-ve-cozumleri/#comments</comments>
		<pubDate>Wed, 13 Jan 2010 13:03:58 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Kod Örnekleri]]></category>
		<category><![CDATA[Programlama Dilleri]]></category>
		<category><![CDATA[Sınavlar]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2010/01/13/c-ile-programlamaya-giris-quiz-sorulari-ve-cozumleri/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Soru 1) Bir dosyaya isminizi yazdırınız. Çözüm 1) dosyaya ismimizi yazdıran kodu aşağıdaki şekilde yazabiliriz: Yukarıdaki kodda dikkat edilecek bir husus, dosyanın &#8220;r&#8221; değil &#8220;w&#8221; şekliyle açılması ve dosyanın mutlaka kapatılmasıdır. Bilindiği üzere kapatılmayan dosyalara yazıldığından kesin olarak emin olamayız ve dosya kapatılmadıysa içerisine bilgi yazılmamış olabilir. Yukarıdaki kod çalıştırıldıktan [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>Soru 1) Bir dosyaya isminizi yazdırınız.</p>
<p>Çözüm 1) dosyaya ismimizi yazdıran kodu aşağıdaki şekilde yazabiliriz:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/011310_1303_CileProgram1.png" alt="" /></p>
<p>Yukarıdaki kodda dikkat edilecek bir husus, dosyanın &#8220;r&#8221; değil &#8220;w&#8221; şekliyle açılması ve dosyanın mutlaka kapatılmasıdır. Bilindiği üzere kapatılmayan dosyalara yazıldığından kesin olarak emin olamayız ve dosya kapatılmadıysa içerisine bilgi yazılmamış olabilir.</p>
<p>Yukarıdaki kod çalıştırıldıktan sonra aynı dizin içerisinde &#8220;dosya.txt&#8221; isimli bir dosya oluşturulur ve bu dosyanın wordpad benzeri bir programla açılması durumunda içinde ismimizin yazdığını görebiliriz.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/011310_1303_CileProgram2.png" alt="" /></p>
<p>Soru 2) Klavyeden okunan bir sayının asal çarpanlarını ekrana basan kodu yazınız.</p>
<p>Çözüm 2)</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/011310_1303_CileProgram3.png" alt="" /></p>
<p>Yukarıdaki kodda görüldüğü üzere önce bir sayı okunmuş (kodun 7. Satırı) ardından bir döngü içerisinde, 2&#8242;den başlayarak bütün sayılara bu girilen sayıyı bölme denenmiştir. For döngüsünün (8. Satır) koşulu, sayının 1&#8242;den büyük olmasıdır. Dolayısıyla sayı 1 olunca yani bütün asal sayılara bölümü tamamlanınca çalışma duracaktır.</p>
<p>Yukarıdaki kodda bulunan iç döngü (9. Satırdaki while döngüsü) ise bir asal sayının birden fazla kere bölme ihtimaline karşı yazılmıştır. Örneğin 60 girdisi için 2 asal sayısı, 2 kere bölebilir. Bu durumda bir sonraki asal sayı ile deneme yapılmadan önce, şu anda bölmeyi denediğimiz asal sayı ile bölünmeyinceye kadar deneme yapıyoruz.</p>
<p>Kodun 11. Satırında ise, denediğimiz sayının, girilen sayıyı tam bölmesi durumunda bölerek sayıyı küçültüyor ve başarılı olarak bölebildiğimiz bu sayıyı bir çarpan olarak ekrana yazıyoruz.</p>
<p>Kodun örnek çalışması aşağıdaki şekildedir.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/011310_1303_CileProgram4.png" alt="" /></p>
<p>Soru 3) Bir dizgideki kelime sayısını ekrana bastıran kod yazınız.</p>
<p>Çözüm 3)</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/011310_1303_CileProgram5.png" alt="" /></p>
<p>Soruda, girilen bir <a href="http://www.bilgisayarkavramlari.com/2008/08/02/dizgi-string/">dizgideki (String)</a> kelime sayısının saydırılması istendiği için, dizginin scanf ile okunması mümkün değildir. Bilindiği üzere scanf tek bir kelime okur ve bu durumda işe yaramaz. Birden fazla kelimenin boşlukları ile okunması istenen durumda gets fonksiyonu kullanılabilir. Yukarıdaki kodun 6. Satırında da bu şekilde dizgi okunmuştur. Ardından dizgide bulunan boşluklar dizgi sonuna kadar saydırılmıştır. Dizgi sonu kontrolü 8. Satırda bulunan for döngüsünde yapılırken, dizgi içerisinde o anda bakılan karakterin boşluk karakteri olup olmadığı 9. Satırdaki if kontrolü ile yapılmıştır. Şayet boşluk karakteri ise, kelimesayısı değişkeni 1 arttırılmıştır.</p>
<p>Basitçe hesaplanacağı üzere, bir dizgideki boşluk sayısı, kelime sayısından 1 eksik olur. Bu problemin çözümü için kelimesayısı değişkeni 0 yerine 1&#8242;den başlatılmıştır.</p>
<p>Kodun çalışan hali aşağıda verilmiştir.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/011310_1303_CileProgram6.png" alt="" /></p>
<p>Soru 4) Bir dizgideki en uzun kelimeyi bularak ekrana bastıran kodu yazınız</p>
<p>Çözüm 4)</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/011310_1303_CileProgram7.png" alt="" /></p>
<p>Yukarıdaki kod, 3. Sorudaki koda benzer şekilde, dizgi sonuna kadar bütün karakterleri kontrol etmekte ve boşluk karakterlerinde kodun 15. Satırında bulunan if kontrolüne girmektedir. Bu kodda farklı olan bir özellik, iki adet <a href="http://www.bilgisayarkavramlari.com/2007/05/03/pointer-gosterici/">karakter göstericisi (character pointer) </a>ile dizgi üzerinde işaretleme yapılmasıdır.</p>
<p>Bu göstericilerden kelimebasi isimli gösterici, o ana kadar bulunan en uzun kelimeyi göstermekte, yenikelime göstericisi ise, üzerinden geçilen son kelimeyi göstermektedir.</p>
<p>Kodun çalışmasını aşağıdaki şekilde anlayabiliriz:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/011310_1303_CileProgram8.png" alt="" /></p>
<p>Yukarıda gösterildiği üzere, ilk başta iki gösterici de dizginin ilk karakterini göstermektedir. Ayrıca kelimeboyu ve yeniboy değişkenlerinin değeri 0&#8242;dır.</p>
<p>Ardından kodumuz döngü içerisinde karakter karakter ilerlemekte ve ilk boşluğu gördüğü anda aşağıdaki şekilde yeni kelim değişkeni hareket ettirilmektedir.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/011310_1303_CileProgram10.png" alt="" /></p>
<p>İlk boşluğa gösterici hareket ettirildikten sonra boşluğa kadar olan harf sayısı sayılmakta ve yeniboy 3 olmaktadır.</p>
<p>Tekrar bir boşluk karakterine kadar göstericimiz hareket eder:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/011310_1303_CileProgram12.png" alt="" /></p>
<p>Bulduğumuz yeni kelimenin boyu 4 olduğu ve şimdiye kadar bulduğumuz en uzun kelimeden daha uzun olduğu için kelimebasi göstericisini ilerletiyor ve yukarıdaki şekilde bulunan yeni kelimenin ilk karakterine atıyoruz, ayrıca yenikelime göstericisi, mevcut konuma ilerletiliyor ve bir sonraki kelimenin aranmasında kullanılıyor.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/011310_1303_CileProgram14.png" alt="" /></p>
<p>Yeni bulunan kelime boyu, o ana kadar bulunan kelime boyundan daha küçük olduğu için kelimebasi değişkenimiz hala o ana kadar bulunmuş en uzun kelimeyi göstermeye devam ediyor.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/011310_1303_CileProgram16.png" alt="" /></p>
<p>Bir önceki örnekte olduğu gibi, bulunan yeni kelimenin boyutu, ilk kelimeden büyük olmadığı için değişkenimiz ilerlemiyor.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/011310_1303_CileProgram18.png" alt="" /></p>
<p>Son olarak bulduğumuz yeni kelimenin boyu, şimdiye kadar bulunan kelimelerden uzun olduğu için, göstericiyi ilerletiyor ve kelimebasi olara bu kelimenin ilk harfini gösteriyoruz. Sonuçta dizgi sonuna kadar giderken, anlık olarak bir kelimenin boyutu değişkende tutuluyor, bir kelimenin boyutunun bu değişkende tutulan boyuttan daha uzun olması durumunda bu kelimeyi gösteren bir gösterici işaretleniyor ayrıca bu yeni kelimenin boyutu, elimizde o ana kadar bulunan en uzun kelime boyutu olarak tutuluyor.</p>
<p>Kodun çıktısı aşağıdaki şekildedir:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/011310_1303_CileProgram20.png" alt="" /></p>
<p>Soru 5) Kullanıcıdan bir sayı okuyarak, okunan bu sayı boyutlarında bir kare matrisi, her hücresine, en yakın kenara olan uzaklığı ile doldurunuz.</p>
<p>Çözüm 5)</p>
<p>Soruda her hücreye, en yakın kenara olan uzaklık yazılması istenmiş, bu durumda örneğin 5&#215;5 boyutunda bir matris için aşağıdaki şekilde veri girilmesi gerekir:</p>
<div>
<table style="border-collapse:collapse" border="0">
<colgroup>
<col style="width: 22px;"></col>
<col style="width: 22px;"></col>
<col style="width: 25px;"></col>
<col style="width: 22px;"></col>
<col style="width: 25px;"></col>
</colgroup>
<tbody>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  solid black 0.5pt; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  solid black 0.5pt; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  solid black 0.5pt; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  solid black 0.5pt; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  solid black 0.5pt; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">1</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">2</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">2</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">2</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">1</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">2</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">3</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">2</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">1</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">2</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">2</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">2</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">1</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">1</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">1</td>
</tr>
</tbody>
</table>
</div>
<p>Görüldüğü üzere kenar değerlerine 1 , bir içerdeki hücrelere 2 ve en ortadaki hücreye 3 yerleştirilmesi istenmiş.</p>
<p>Bu dorunun çözümünde sadece döngüler kullanılarak bir döngünün kenara olan uzaklığı hesaplanıp ekrana yazdırılabilir. Bu yöntemin çözümü aşağıdaki şekildedir:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/011310_1303_CileProgram21.png" alt="" /></p>
<p>Yukarıdaki kodda görüldüğü üzere, her hücre için, hücrenin kenara olan 4 farklı uzaklığı hesaplanmıştır. Bu değerlerden iki tanesi, koordinatları olan i ve j değerleridir ki bu değerler, sol kenara ve üst kenara olan uzaklık olarak düşünülebilir.</p>
<p>Ayrıca sağ kenar ve alt kenara olan uzaklıkların hesaplanması kodun 20. Ve 21. Satırlarında bulunan a ve b değişkenleri ile yapılmıştır. Matrisin boyutundan koordinat çıkarılmış ve 1 ilave edilmiştir.</p>
<p>Sonuçta elimizde 4 farklı kenara olan 4 farklı uzaklık bulunmaktadır. Bizden istenen bu uzaklıklardan en küçüğünü ekrana basmamız. Bu durumda kodun 4-13 satırları arasında bulunan ve verilen 4 sayıdan en küçüğünü döndüren fonksiyonu çağırarak bu 4 uzaklıktan en küçüğünü bulabiliriz.</p>
<p>Kodun çalışan hali aşağıdaki şekildedir:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/011310_1303_CileProgram22.png" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2010/01/13/c-ile-programlamaya-giris-quiz-sorulari-ve-cozumleri/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>JAVA ile Zar uygulaması</title>
		<link>http://www.bilgisayarkavramlari.com/2009/12/02/java-ile-zar-uygulamasi/</link>
		<comments>http://www.bilgisayarkavramlari.com/2009/12/02/java-ile-zar-uygulamasi/#comments</comments>
		<pubDate>Wed, 02 Dec 2009 18:49:10 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[JAVA]]></category>
		<category><![CDATA[Kod Örnekleri]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2009/12/02/java-ile-zar-uygulamasi/</guid>
		<description><![CDATA[Yazan : Şadi Evren ŞEKER Gelen bir soru üzerine aşağıdaki yazıyı yazıyorum. Soru şu şekilde: &#8220;Konsol programında rastgele zar atan ve çıkan zarı ekrana bastıran kodu yazınız. &#8221; Konsol ekranında zar çizdirmek için öncelikle bir tasarım yapmamız gerekiyor. Konsol ekranında sadece ascii karakterlerini basabileceğimizi düşünürsek, zarları aşağıdaki şekilde ascii ekranda göstermemiz mümkün olabilir. Yukarıdaki her [...]]]></description>
			<content:encoded><![CDATA[<p>Yazan : Şadi Evren ŞEKER</p>
<p>Gelen bir soru üzerine aşağıdaki yazıyı yazıyorum. Soru şu şekilde:</p>
<p><span style="font-family:Arial; font-size:10pt">&#8220;Konsol programında rastgele zar atan ve çıkan zarı ekrana bastıran kodu yazınız. &#8221;<br />
</span></p>
<p><span style="font-family:Arial; font-size:10pt">Konsol ekranında zar çizdirmek için öncelikle bir tasarım yapmamız gerekiyor. Konsol ekranında sadece <a href="http://www.bilgisayarkavramlari.com/2009/09/04/ascii-tablosu/">ascii karakterlerini</a> basabileceğimizi düşünürsek, zarları aşağıdaki şekilde <a href="http://www.bilgisayarkavramlari.com/2009/09/04/ascii-tablosu/">ascii ekranda</a> göstermemiz mümkün olabilir.<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/120209_1849_JAVAileZaru1.png" alt="" /><span style="font-family:Arial; font-size:10pt"><br />
</span></p>
<p><span style="font-family:Arial; font-size:10pt">Yukarıdaki her 3 satırda bir zar resmi olduğunu düşünelim. Örneğin zar ile 4 atıldığında 10 -12 satırlar arasındaki karakterler ekrana basılacak olsun.<br />
</span></p>
<p><span style="font-family:Arial; font-size:10pt">Şimdi java ile rast gele sayı üretme işi ile ilgilenebiliriz. Bunun için java dilinde bulunan Math.random() fonksiyonunu kullanmamız gerekiyor.<br />
</span></p>
<p><span style="font-family:Arial; font-size:10pt">Öncelikle zarları yukarıdaki şekillerde basacak bir program yerine zarın sonucunu doğrudan sayı olarak ekrana basan bir kod yazmaya çalışalım:<br />
</span></p>
<p><span style="font-family:Arial; font-size:10pt">İlk denememizde Math.random() fonksiyonunu çalıştırmaya çalışıyor ve aşağıdaki hatalı kodu yazıyoruz:<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/120209_1849_JAVAileZaru2.png" alt="" /><span style="font-family:Arial; font-size:10pt"><br />
</span></p>
<p><span style="font-family:Arial; font-size:10pt">Yukarıdaki kodu çalıştırdığımızda doğal olarak aşağıdaki hatayı alıyoruz:<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/120209_1849_JAVAileZaru3.png" alt="" width="522" height="110" /><span style="font-family:Arial; font-size:10pt"><br />
</span></p>
<p><span style="font-family:Arial; font-size:10pt">Görüldüğü üzere bize Math.random() fonksiyonunun bir double değeri döndürdüğü ve bir int değerinin içerisine konulamayacağı hatası geliyor. Gerçekten de ilgili java API&#8217;si okunduğunda Maht.random() fonksiyonunun 0 ile 1 arasında bir sayı döndürdüğü görülebilir.<br />
</span></p>
<p><span style="font-family:Arial; font-size:10pt">Zar değerimiz 1 ile 6 arasında olacağına göre (0 yok 1den başlayacağız), rastgele sayımızı 5 ile çarpıp 1 ekliyoruz.<br />
</span></p>
<p><span style="font-family:Arial; font-size:10pt">Bu durum ilk kez rast gele sayılar ile uğraşırken karışık görülebilir ancak şöyle anlatmaya çalışalım<br />
</span></p>
<p><span style="font-family:Arial; font-size:10pt">0 &lt; a &lt;1<br />
</span></p>
<p><span style="font-family:Arial; font-size:10pt">Aralığında olan a sayısı (ki bu değer aslında Math.random() fonksiyonunun orijinal olarak ürettiği değerdir)<br />
</span></p>
<p><span style="font-family:Arial; font-size:10pt">a * 5 yapıldığında:<br />
</span></p>
<p><span style="font-family:Arial; font-size:10pt">0 &lt; a &lt; 5<br />
</span></p>
<p><span style="font-family:Arial; font-size:10pt">Aralığında olur. a+1 yapıldığında da<br />
</span></p>
<p><span style="font-family:Arial; font-size:10pt">1 &lt; a &lt; 6<br />
</span></p>
<p><span style="font-family:Arial; font-size:10pt">Aralığında olmuş olur.<br />
</span></p>
<p><span style="font-family:Arial; font-size:10pt">Elbette bu değer aralığına getirdikten sonra da Math.random() fonksiyonu hâlâ double değer üretmektedir. Çözüm olarak<a href="http://www.bilgisayarkavramlari.com/2008/11/24/tip-inkilabi-tip-donusturme-type-casting/"> tip inkılabı yapmak (type casting) </a>ve tipini int değerine çevirmek gerekir. Öyleyse ilgili satır aşağıdaki şekle çevrilmelidir:<br />
</span></p>
<p><span style="font-family:Arial; font-size:10pt">int z = (int) Math.random() * 5 + 1<br />
</span></p>
<p><span style="font-family:Arial; font-size:10pt">Kodun çalışan hali ise aşağıda verilmiştir:<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/120209_1849_JAVAileZaru4.png" alt="" /><span style="font-family:Arial; font-size:10pt"><br />
</span></p>
<p><span style="font-family:Arial; font-size:10pt">Kodda dikkat edilirse 4. Satırda Math.random()*5+1 ibaresi parantez içerisine alınmıştır. Bunun sebebi başta bulunan ve tip inkılabı yapan (int) komutunun önce Math.random değerini int yapmasıdır. Dolayısıyla sonuçlar her zaman için 1 çıkacaktır (Math.random her zaman 0 ile 1 arasında değer üretecek, int çevriminden 0 olacak 5 ile çarpılıp 1 eklenince de hep 1 sonucu çıkacaktır)<br />
</span></p>
<p><span style="font-family:Arial; font-size:10pt">Kodun çalışan hali aşağıdaki şekildedir:<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/120209_1849_JAVAileZaru5.png" alt="" width="524" height="195" /><span style="font-family:Arial; font-size:10pt"><br />
</span></p>
<p><span style="font-family:Arial; font-size:10pt">Son olarak çizimi yaptıran kısma geçebiliriz. Çıkan sonuca göre ekrana farklı bir değer bastırmamız gerekiyor.<br />
</span></p>
<p><span style="font-family:Arial; font-size:10pt">Kodu aşağıdaki şekilde yazabiliriz:<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/120209_1849_JAVAileZaru6.png" alt="" /><span style="font-family:Arial; font-size:10pt"><br />
</span></p>
<p><span style="font-family:Arial; font-size:10pt">Kodun çalışan hali aşağıda verilmiştir:<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/120209_1849_JAVAileZaru7.png" alt="" width="520" height="420" /><span style="font-family:Arial; font-size:10pt"><br />
</span></p>
<p><span style="font-family:Arial; font-size:10pt">Yukarıdaki kod, hedefimize ulaşmamızı sağlamasına karşılık kodda ufak bir değişiklik yapmamız mümkündür. Kodda 9&#215;9 bir matris üzerinde * karakteri ile kodlama yaptığımıza dikkat etmişsinizdir. Bu değerlerin basıldığı durumları gösterecek olursak:<br />
</span></p>
<div>
<table style="border-collapse:collapse" border="0">
<colgroup>
<col style="width: 47px;"></col>
<col style="width: 113px;"></col>
<col style="width: 47px;"></col>
</colgroup>
<tbody>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  solid black 0.5pt; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt"><span style="font-family:Arial; font-size:10pt">&gt;=2</span></td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  solid black 0.5pt; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt"><span style="font-family:Arial; font-size:10pt">Hiçbir zaman</span></td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  solid black 0.5pt; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt"><span style="font-family:Arial; font-size:10pt">&gt;=4</span></td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt"><span style="font-family:Arial; font-size:10pt">=6</span></td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt"><span style="font-family:Arial; font-size:10pt">Zar tek sayı ise</span></td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt"><span style="font-family:Arial; font-size:10pt">=6</span></td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt"><span style="font-family:Arial; font-size:10pt">&gt;=4</span></td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt"><span style="font-family:Arial; font-size:10pt">Hiçbir zaman</span></td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt"><span style="font-family:Arial; font-size:10pt">&gt;=2</span></td>
</tr>
</tbody>
</table>
</div>
<p><span style="font-family:Arial; font-size:10pt">Görüldüğü üzere zar değerine bağlı olarak bazı karelerde * sembolü olmakta ve bazılarında olmamaktadır. Dolayısıyla kodu aşağıdaki şekilde yazmak da mümkün olabilir:<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/120209_1849_JAVAileZaru8.png" alt="" /><span style="font-family:Arial; font-size:10pt"><br />
</span></p>
<p><span style="font-family:Arial; font-size:10pt">Kodun çalışması sonucu aşağıda verilmiştir:<br />
</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/120209_1849_JAVAileZaru9.png" alt="" width="517" height="252" /><span style="font-family:Arial; font-size:10pt"><br />
</span></p>
<p><span style="font-family:Arial; font-size:10pt"><br />
</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2009/12/02/java-ile-zar-uygulamasi/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Ekrana Kare Çizdiren Kod</title>
		<link>http://www.bilgisayarkavramlari.com/2009/11/02/ekrana-kare-cizdiren-kod/</link>
		<comments>http://www.bilgisayarkavramlari.com/2009/11/02/ekrana-kare-cizdiren-kod/#comments</comments>
		<pubDate>Mon, 02 Nov 2009 11:27:04 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[JAVA]]></category>
		<category><![CDATA[Kod Örnekleri]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2009/11/02/ekrana-kare-cizdiren-kod/</guid>
		<description><![CDATA[Soru: Kullanıcıdan bir sayı alarak ekrana verilen sayı boyutlarında *&#8217;lardan oluşan içi dolu bir kare kodu yazınız. Çözen : Şadi Evren ŞEKER Yukarıdaki soruyu 4 ayrı dil için (C,C++,JAVA ve C#) ayrı ayrı çözeceğim. Böylelikle okuyucu bu diller arasında mukayese yapabilecek ve bildiği bir dilden diğer dillere kolayca geçebilecektir. Çözüm: Soru, yapısı itibariyle 2 boyutlu [...]]]></description>
			<content:encoded><![CDATA[<p>Soru: Kullanıcıdan bir sayı alarak ekrana verilen sayı boyutlarında *&#8217;lardan oluşan içi dolu bir kare kodu yazınız.</p>
<p>Çözen : Şadi Evren ŞEKER</p>
<p>Yukarıdaki soruyu 4 ayrı dil için (C,C++,JAVA ve C#) ayrı ayrı çözeceğim. Böylelikle okuyucu bu diller arasında mukayese yapabilecek ve bildiği bir dilden diğer dillere kolayca geçebilecektir.</p>
<p>Çözüm:</p>
<p>Soru, yapısı itibariyle 2 boyutlu bir şekil gerektirmektedir. 2 boyutlu bir şekil için 2 adet <a href="http://www.bilgisayarkavramlari.com/2009/11/02/ic-ice-donguler-nested-loops/">iç içe döngü (nested loop)</a> kullanılması yeterlidir. Buradaki amaç, döngülerden birisinin yatay diğerinin düşey eksende çalışmasıdır. Sorunun a şıkkı için JAVA dilinde çözüm aşağıdaki şekilde yazılabilir:</p>
<pre><span style="font-family:Courier New; font-size:12pt"><span style="color:#941edf">import</span><span style="color:black"> java.util.Scanner;
</span><span style="color:#941edf">public</span><span style="color:black">
</span><span style="color:#941edf">class</span><span style="color:black"> kare{</span></span><span style="color:#941edf">
public</span><span style="color:black">
</span><span style="color:#941edf">static</span><span style="color:black">
</span><span style="color:#941edf">void</span><span style="color:black"> main(String args[]){
   Scanner in = </span><span style="color:#941edf">new</span><span style="color:black"> Scanner(System.in);</span><span style="color:#941edf">
   int</span><span style="color:black"> boyut;
   System.out.println(</span><span style="color:#00cb00">"Karenin boyutlarını giriniz: "</span><span style="color:black">);
   boyut = in.nextInt();</span><span style="color:#941edf">
   for</span><span style="color:black">(</span><span style="color:#941edf">int</span><span style="color:black"> i = 0;i&lt;boyut;i++){ </span><span style="color:#fa6400">//her satir icin
</span>      <span style="color:#941edf">for</span><span style="color:black">(</span><span style="color:#941edf">int</span><span style="color:black"> j = 0;j&lt;boyut;j++){ </span><span style="color:#fa6400">// boyut kadar yildiz bas
         </span><span style="color:black">System.out.print(</span><span style="color:#00cb00">"*"</span><span style="color:black">);
      }
      System.out.println(); </span><span style="color:#fa6400">// alt satira gec
   </span><span style="color:black">}
 }
}</span></pre>
<p>Yukarıdaki kodun çalışan hali aşağıdaki şekildedir:</p>
<p><span style="font-size:12pt"><span style="color:blue; font-family:CSD12">ÏÏ§Ï</span><span style="color:black; font-family:Courier New">Karenin boyutlarını giriniz:<br />
</span><span style="color:blue; font-family:CSD12">¼¼§Ï</span><span style="color:#fa6400; font-family:Courier New">5<br />
</span><span style="color:blue; font-family:CSD12">ÏÏ§Ï</span><span style="color:black; font-family:Courier New">*****<br />
</span><span style="color:blue; font-family:CSD12">ÏÏ§Ï</span><span style="color:black; font-family:Courier New">*****<br />
</span><span style="color:blue; font-family:CSD12">ÏÏ§Ï</span><span style="color:black; font-family:Courier New">*****<br />
</span><span style="color:blue; font-family:CSD12">ÏÏ§Ï</span><span style="color:black; font-family:Courier New">*****<br />
</span><span style="color:blue; font-family:CSD12">ÏÏ§Ï</span><span style="color:black; font-family:Courier New">*****</span></span></p>
<p>Benzer uygulamayı C dilinde aşağıdaki şekilde yazabiliriz:</p>
<pre><span style="font-family:Courier New; font-size:12pt"><span style="color:#960000">#include</span><span style="color:#960000"> &lt;stdio.h&gt;
#include</span><span style="color:#960000"> &lt;conio.h&gt;
</span><span style="color:#941edf">int</span><span style="color:black"> main () {
   printf(</span><span style="color:#00cb00">"boyutu giriniz"</span><span style="color:black">);</span></span><span style="color:#941edf">
    int</span><span style="color:black"> boyut;
    scanf(</span><span style="color:#00cb00">"%d"</span><span style="color:black">,&amp;boyut);</span><span style="color:#941edf">
    for</span><span style="color:black">(</span><span style="color:#941edf">int</span><span style="color:black"> i = 0;i&lt;boyut;i++){ </span><span style="color:#fa6400">//her satir icin
</span>       <span style="color:#941edf">for</span><span style="color:black">(</span><span style="color:#941edf">int</span><span style="color:black"> j = 0;j&lt;boyut;j++){ </span><span style="color:#fa6400">// boyut kadar yildiz bas
          </span><span style="color:black">printf(</span><span style="color:#00cb00">"*"</span><span style="color:black">);
       }
       printf(</span><span style="color:#00cb00">"\n"</span><span style="color:black">); </span><span style="color:#fa6400">// alt satira gec
</span><span style="color:black">    }
    getch();</span><span style="color:#941edf">
    return</span><span style="color:black"> 0;
}
</span></pre>
<p>Yukarıdaki kodun örnek ekran çıktısı da aşağıda verimiştir:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/110209_1127_EkranaKarei1.png" alt="" /><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/110209_1127_EkranaKarei2.png" alt="" /></p>
<p>Yukarıdaki soruyu C++ dilinde çözecek olursak:</p>
<pre><span style="font-family:Courier New; font-size:12pt"><span style="color:#960000">#include</span><span style="color:#960000"> &lt;iostream.h&gt;</span></span></pre>
<pre><span style="color:#941edf">int</span><span style="color:black"> main () {
cout &lt;&lt; </span><span style="color:#00cb00">"boyutu giriniz"</span><span style="color:black"> ;</span><span style="color:#941edf">
int</span><span style="color:black"> boyut;
cin &gt;&gt; boyut;</span><span style="color:#941edf">
for</span><span style="color:black">(</span><span style="color:#941edf">int</span><span style="color:black"> i = 0;i&lt;boyut;i++){ </span><span style="color:#fa6400">//her satir icin
</span>   <span style="color:#941edf">for</span><span style="color:black">(</span><span style="color:#941edf">int</span><span style="color:black"> j = 0;j&lt;boyut;j++){ </span><span style="color:#fa6400">// boyut kadar yildiz bas
      </span><span style="color:black">cout &lt;&lt;</span><span style="color:#00cb00">"*"</span><span style="color:black"> ;
   }
   cout &lt;&lt; endl; </span><span style="color:#fa6400">// alt satira gec
</span><span style="color:black">}
system(</span><span style="color:#00cb00">"PAUSE"</span><span style="color:black">);</span><span style="color:#941edf">
return</span><span style="color:black"> 0;
}</span></pre>
<p>Yukarıdaki kod Dev-CPP ile kodlanmıştır ve ekran çıktısı aşağıdaki şekildedir:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/110209_1127_EkranaKarei4.png" alt="" /></p>
<p>Son olarak aynı soruyu C# dilinde yazacak olursak:</p>
<p><span style="font-family:Courier New; font-size:10pt"><span style="color:blue">using</span> System;</span><span style="font-family:Courier New; font-size:10pt"></span></p>
<p><span style="font-family:Courier New; font-size:10pt"><span style="color:blue">using</span> System.Collections.Generic;<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt"><span style="color:blue">using</span> System.Linq;<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt"><span style="color:blue">using</span> System.Text;<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt"><span style="color:blue">namespace</span> ConsoleApplication1<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">{<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt"><br />
<span style="color:blue">class</span><br />
<span style="color:#2b91af">Program<br />
</span></span></p>
<p><span style="font-family:Courier New; font-size:10pt"> {<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt"><br />
<span style="color:blue">static</span><br />
<span style="color:blue">void</span> Main(<span style="color:blue">string</span>[] args)<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt"> {<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt"><br />
<span style="color:#2b91af">Console</span>.WriteLine(<span style="color:#a31515">&#8220;boyutu giriniz&#8221;</span>);<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt"><br />
<span style="color:blue">int</span> boyut;<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt"> boyut = <span style="color:#2b91af">Console</span>.Read();<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt"> boyut = boyut &#8211; 48;<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt"><br />
<span style="color:green">// ascii int çevir (0-9 arasi için)<br />
</span></span></p>
<p><span style="font-family:Courier New; font-size:10pt"><br />
<span style="color:blue">for</span> (<span style="color:blue">int</span> i = 0; i &lt; boyut; i++)<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt"> { <span style="color:green">//her satir icin<br />
</span></span></p>
<p><span style="font-family:Courier New; font-size:10pt"><br />
<span style="color:blue">for</span> (<span style="color:blue">int</span> j = 0; j &lt; boyut; j++)<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt"> { <span style="color:green">// boyut kadar yildiz bas<br />
</span></span></p>
<p><span style="font-family:Courier New; font-size:10pt"><br />
<span style="color:#2b91af">Console</span>.Write(<span style="color:#a31515">&#8220;*&#8221;</span>);<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt"> }<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt"><br />
<span style="color:#2b91af">Console</span>.WriteLine(); <span style="color:green">// alt satira gec<br />
</span></span></p>
<p><span style="font-family:Courier New; font-size:10pt"> }<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt"> }<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt"> }<br />
</span></p>
<p><span style="font-family:Courier New; font-size:10pt">}</span></p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/110209_1127_EkranaKarei6.png" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2009/11/02/ekrana-kare-cizdiren-kod/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hızlı Sıralama (Quick Sort)</title>
		<link>http://www.bilgisayarkavramlari.com/2009/10/31/hizli-siralama-quick-sort/</link>
		<comments>http://www.bilgisayarkavramlari.com/2009/10/31/hizli-siralama-quick-sort/#comments</comments>
		<pubDate>Sat, 31 Oct 2009 20:40:34 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Scheme (Lisp)]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2009/10/31/hizli-siralama-quick-sort/</guid>
		<description><![CDATA[Soru: Bir listeyi alıp hızlı sıralama algoritmasına göre (quick sort algorithm) sıralayan kodu yazınız. Çözen : Şadi Evren ŞEKER Çözüm: Hızlı sıralama algoritması hatırlanacağı üzere parçala fethet (divide and conquere) yaklaşımı kullanmaktadır. Buna göre problem önce iki parçaya bölünür ve her iki parça kendi içerisinde sorun çözülene kadar parçalanır. En sonunda tek eleman kalınca problem [...]]]></description>
			<content:encoded><![CDATA[<p>Soru: Bir listeyi alıp <a href="http://www.bilgisayarkavramlari.com/2008/08/09/hizli-siralama-algoritmasi-quick-sort-algorithm/">hızlı sıralama algoritmasına göre (quick sort algorithm)</a> sıralayan kodu yazınız.</p>
<p>Çözen : Şadi Evren ŞEKER</p>
<p><strong>Çözüm:<br />
</strong></p>
<p>Hızlı sıralama algoritması hatırlanacağı üzere <a href="http://www.bilgisayarkavramlari.com/2008/08/09/2007/12/03/parcala-fethet-yontemi-divide-and-conquer/">parçala fethet (divide and conquere)</a> yaklaşımı kullanmaktadır. Buna göre problem önce iki parçaya bölünür ve her iki parça kendi içerisinde sorun çözülene kadar parçalanır. En sonunda tek eleman kalınca problem çözülür ve sonuçlar birleştirilir.</p>
<p>Kodumuzu yazarken verilen bir kerteriz değerinden (pivot) büyük ve küçük sayıları toparlamak için iki ayrı fonksiyon yazacağız. Fonksiyonlardan birisi büyük sayıları, diğeri ise küçük sayıları döndürecek:</p>
<pre>(define (larger-items alon threshold)</pre>
<pre>  (cond</pre>
<pre>    [(empty? alon) empty]</pre>
<pre>    [else (if (&gt;= (first alon) threshold)</pre>
<pre>          (cons (first alon) (larger-items (rest alon) threshold))</pre>
<pre>          (larger-items (rest alon) threshold))]))</pre>
<pre> (define (smaller-items alon threshold)</pre>
<pre>  (cond</pre>
<pre>    [(empty? alon) empty]</pre>
<pre>    [else (if (&lt; (first alon) threshold)</pre>
<pre>          (cons (first alon) (smaller-items (rest alon) threshold))</pre>
<pre>          (smaller-items (rest alon) threshold))]))</pre>
<p>Yukarıdaki iki fonksiyonda <a href="http://www.bilgisayarkavramlari.com/2008/08/05/ozyineli-fonksiyonlar-recursive-functions/">özyineli (recursive) </a>olarak verilen listeyi dolaşarak listedeki büyük veya küçük değerleri ayıklamaktadır. Burada iki fonksiyon arasındaki tek farkın if koşulunda bulunan &gt;= veya &lt; değerleri olduğuna dikkat ediniz.</p>
<p>Problemi bölen fonksiyonları yukarıdaki şekilde tanımladıktan sonra artık sırlama işlemini yapan fonksiyonu sayıları ayırıp birleştirmek üzere aşağıdaki şekilde yazabiliriz:</p>
<pre>(define (quick-sort alon)</pre>
<pre>  (cond</pre>
<pre>    [(empty? alon) empty]</pre>
<pre>    [else (append (quick-sort (smaller-items (rest alon) (first alon)))</pre>
<pre>              (list (first alon))</pre>
<pre>          (quick-sort (larger-items (rest alon) (first alon))))]))</pre>
<p>Görüldüğü üzere listenin ilk elemanı kerteriz (pivot) olarak seçiliyor ve bu değerden küçükler +kerteriz + büyükler şeklinde sıralama işlemi yapılıyor.</p>
<p><strong>Çözüm çalıştırması:<br />
</strong></p>
<p>(quick-sort (list 11 8 8 9 9 14 8 7))</p>
<p>Şeklinde fonksiyona bir liste verilmesi yeterlidir.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/103109_2040_HzlSralama1.png" alt="" /></p>
<p>Yukarıda örnek çalışma verilmiştir buna göre verilen listenin sıralanmış hali (list 7 8 8 8 9 9 11 14) olarak doğru bir şekilde bulunur.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2009/10/31/hizli-siralama-quick-sort/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bezier Eğrisi Çizen Kod</title>
		<link>http://www.bilgisayarkavramlari.com/2009/10/31/bezier-egrisi-cizen-kod/</link>
		<comments>http://www.bilgisayarkavramlari.com/2009/10/31/bezier-egrisi-cizen-kod/#comments</comments>
		<pubDate>Sat, 31 Oct 2009 19:18:05 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Bilgisayar Grafiği (Computer Graphics)]]></category>
		<category><![CDATA[Scheme (Lisp)]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2009/10/31/bezier-egrisi-cizen-kod/</guid>
		<description><![CDATA[Soru: Üç noktanın koordinatlarını alarak bu noktalardan geçen eğriyi bezier algoritması ile ekrana çizen kodu yazınız. Çözen : Şadi Evren ŞEKER Çözüm: Bezier eğrisini çizebilmek için ikinci dereceden bir denkleme ihtiyaç duyulur. Burada denklemin ikinci derece olmasının sebebi 3 nokta ile çizim yapılmasının istenmesidir. Öncelikle programımızda kullanacağımız basit temel fonksiyonları kodlayalım: İki nokta verildiğinde bu [...]]]></description>
			<content:encoded><![CDATA[<p>Soru: Üç noktanın koordinatlarını alarak bu noktalardan geçen <a href="http://www.bilgisayarkavramlari.com/2009/10/31/bezier-egrileri-bezier-curves/">eğriyi bezier algoritması ile ekrana çizen</a> kodu yazınız.</p>
<p>Çözen : Şadi Evren ŞEKER</p>
<p>Çözüm:</p>
<p><a href="http://www.bilgisayarkavramlari.com/2009/10/31/bezier-egrileri-bezier-curves/">Bezier eğrisini</a> çizebilmek için ikinci dereceden bir denkleme ihtiyaç duyulur. Burada denklemin ikinci derece olmasının sebebi 3 nokta ile çizim yapılmasının istenmesidir.</p>
<p>Öncelikle programımızda kullanacağımız basit temel fonksiyonları kodlayalım:</p>
<p>İki nokta verildiğinde bu iki noktanın ortasındaki noktayı hesaplayan fonksiyonu kodlayalım:</p>
<p>(define (mid-point a-posn b-posn)</p>
<p>(make-posn</p>
<p>(mid (posn-x a-posn) (posn-x b-posn))</p>
<p>(mid (posn-y a-posn) (posn-y b-posn))))</p>
<p>Yukarıda iki sayının orta değerini (aritmetik ortalamasını) hesaplayan mid fonksiyonunu kullandık. Bu fonksiyonu basitçe iki sayının toplamının yarısı olarak aşağıdaki şekilde tanımlayabiliriz:</p>
<p>(define (mid x y)</p>
<p>(/ (+ x y) 2))</p>
<p>Artık bezier fonksiyonumuzu kodlayabiliriz. Buradaki püf noktası sürekli olarak noktaların arasındaki noktaların hesaplanmasıdır. Bu açıdan bir fraktal üretimine benzetilebilir:</p>
<p>(define ( bezier  p1 p2 p3) (cond</p>
<p>[(too-small? p1 p2 p3) true]</p>
<p>[else (and (draw-solid-disk (mid-point (mid-point p1 p2) (mid-point p2 p3)) 3)</p>
<p>(bezier (mid-point (mid-point p1 p2) (mid-point p2 p3)) (mid-point p2 p3) p3)</p>
<p>(bezier p1 (mid-point p1 p2) (mid-point (mid-point p1 p2) (mid-point p2 p3)))</p>
<p>)]))</p>
<p>Yukarıdaki kod 3 nokta alıp bu noktalar arasındaki mesafe çizilemeyecek kadar küçük oluncaya kadar (bu mesafe aynı zamanda çizimdeki noktaların seyrekliğini de belirtmektedir) ara nokta hesaplamakta ve hesaplanan bu ara noktaları çizmektedir. Yukarıdaki fonksiyonda bitişi belirten too-small? Fonksiyonunu aşağıdaki şekilde tanımlayabiliriz:</p>
<p>(define (too-small? p1 p2 p3)(cond[(&lt;  (abs(- (posn-x p1)  (posn-x p2)))  10) true]</p>
<p>[else false]</p>
<p>))</p>
<p>Burada noktalar arası mesafe 10 veya daha düşükse artık yeni nokta üretimi duracaktır.</p>
<p>Çözüm çalıştırması:</p>
<p>(define p1 (make-posn 50 50))</p>
<p>(define p2 (make-posn 150 150))</p>
<p>(define p3 (make-posn 250 100))</p>
<p>Üç nokta tanımlanmıştır</p>
<p>(start 300 200)</p>
<p>Çizim alanı açılmıştır</p>
<p>(bezier p1 p2 p3)</p>
<p>Ve son olarak fonksiyonumuza üç nokta parametre verilmiştir.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/103109_1918_BezierErisi1.png" alt="" /></p>
<p>Kodun çalıştıktan sonra ekranda oluşturduğu çizim aşağıdaki şekilde görülebilir</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/103109_1918_BezierErisi3.png" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2009/10/31/bezier-egrisi-cizen-kod/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Binary Search Tree’yi Inorder olarak dolaşan Kod</title>
		<link>http://www.bilgisayarkavramlari.com/2009/10/31/binary-search-tree%e2%80%99yi-inorder-olarak-dolasan-kod/</link>
		<comments>http://www.bilgisayarkavramlari.com/2009/10/31/binary-search-tree%e2%80%99yi-inorder-olarak-dolasan-kod/#comments</comments>
		<pubDate>Sat, 31 Oct 2009 16:43:31 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Scheme (Lisp)]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2009/10/31/binary-search-tree%e2%80%99yi-inorder-olarak-dolasan-kod/</guid>
		<description><![CDATA[Soru: Bir adet ikili arama ağacı (binary search tree) oluşturunuz ve bu ağaç üzerinde ssn numarası ve bir isim tutunuz. Bu bilgileri ssn numarasına göre ağaca yerleştirin ve yerleşen bu verileri içsıraya göre (inorder) dolaşan bir kod yazınız. Bu kodu kullanarak ağaçta arama yapan bir fonksiyon yazınız. Çözen : Şadi Evren ŞEKER Çözüm : Bu [...]]]></description>
			<content:encoded><![CDATA[<p>Soru: Bir adet <a href="http://www.bilgisayarkavramlari.com/2008/05/07/ikili-agac-binary-tree/">ikili arama ağacı (binary search tree)</a> oluşturunuz ve bu ağaç üzerinde ssn numarası ve bir isim tutunuz. Bu bilgileri ssn numarasına göre ağaca yerleştirin ve yerleşen bu verileri içsıraya göre (inorder) dolaşan bir kod yazınız.  Bu kodu kullanarak ağaçta arama yapan bir fonksiyon yazınız.</p>
<p>Çözen : Şadi Evren ŞEKER</p>
<p>Çözüm :</p>
<p>Bu tip bir soruda verilerin tutulması ve işlenmesi önemli bir yer tutar. Verilerin tutulması için scheme dilinde bulunan struct özelliğinden faydalanacağız. Öncelikle verimizi tanımlayalım:</p>
<p>(define-struct tree (ssn label left right))</p>
<p>Yukarıdaki bu tanımda ağacın bir düğümü (node) için kullanılacak yapı verilmiştir. Bu yapıda bir düğümde ssn, label ve ağacın solunu gösteren left, sağını gösteren right değişkenleri bulunmaktadır. Yani solu ve sağı yine kendi yapısından birer üye olacaktır.</p>
<p>(define tree-1 (make-tree 1 &#8216;x null null))</p>
<p>(define tree-2 (make-tree 3 &#8216;y null null))</p>
<p>(define tree-3 (make-tree 2 &#8216;z tree-1 tree-2))</p>
<p>(define tree-4 (make-tree 5 &#8216;p null null))</p>
<p>(define tree-5 (make-tree 4 &#8216;q tree-3 tree-4))</p>
<p>Yukarıda örnek ağaç tanımları verilmiştir. Buna göre yukarıdaki ağacı çizecek olursak:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/103109_1643_BinarySearc1.png" alt="" /></p>
<p>Yukarıdaki şekilde bir ağaç elde ederiz. Bu ağaçta en tepede tree-5 ile tanımlanan ve içerisinde 4,q bulunan düğüm bulunmaktadır. Bu düğümün solunda tree-3 yani 3,y ve sağında ise tree-4 yani 5,p bulunmaktadır ve ağaç bu şekilde birbirine düğümler eklenerek devam etmektedir.</p>
<p>Şimdi ağacı dolaşan fonksiyonumuzu yazalım:</p>
<p>(define (inorder bt) ( cond[(null? bt) null][else (cond[(and (null? (tree-left bt ))(null? (tree-right bt))) (list(tree-label bt) (tree-ssn bt))][else (append (inorder (tree-left bt)) (list(tree-label bt) (tree-ssn bt)) (inorder (tree-right bt)))])]))</p>
<p>Fonksiyon basitçe ağacın önce sol, sonra düğüm sonra sağ değerini ekrana bastırmaktadır. Yani gidebildiği kadar sola gidip en sondaki elemanı basıp bir yukarı çıkmakta ve sonra sağa gitmektedir. Bunu sağlayan sadece yukarıdaki fonksiyonda bulunan dolaşma sırasıdır. Fonksiyonu çalıştırmak için aşağıdaki komut verilebilir.</p>
<p>(inorder tree-5)</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/103109_1643_BinarySearc3.png" alt="" /></p>
<p>Kodun çalışması sonucunda yukarıdaki ekranda görüldüğü üzere ağacın sol-orta-sağ sırasıyla dolaşılmış hali ekrana basılmaktadır:</p>
<p>(x 1 z 2 y 3 q 4 p 5)</p>
<p>Şimdi sorunun ikinci kısmına yani ağaçta arama yapan kısma geçebiliriz:</p>
<p>(define (search bt n)(cond [(eq? (tree-ssn bt) n) (tree-label bt)][(and (null? (tree-left bt)) (null? (tree-right bt))) false]</p>
<p>[else (cond [(eq? (tree-ssn bt) n) (tree-name bt)]</p>
<p>[else (cond [(&gt; (tree-ssn bt) n) (search (tree-left bt) n)][else (search (tree-right bt) n)])</p>
<p>])]))</p>
<p>Yukarıdaki kodu çalıştırmak için aşağıdaki komut verilebilir:</p>
<p>(search tree-5 4)</p>
<p>Yukarıda dikkat edilirse inorder fonksiyonunun aynısı kullanılmıştır. Tek farkı arama işlemi sırasında eşitlik durumu kontrol edilmiş ve bu sayede şayet aranan elemana ulaşıldıysa aram işlemi bitirilmiştir.</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/103109_1643_BinarySearc5.png" alt="" /></p>
<p>Bu kodun çalışan hali ise yukarıdaki şekildedir. Yani aranan değer 4 olarak verildiğinde, 4 ssn değerine sahip q label&#8217;ı döndürülmüştür.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2009/10/31/binary-search-tree%e2%80%99yi-inorder-olarak-dolasan-kod/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Öğrencinin GPA’ini hesaplayan kod</title>
		<link>http://www.bilgisayarkavramlari.com/2009/10/31/ogrencinin-gpa%e2%80%99ini-hesaplayan-kod/</link>
		<comments>http://www.bilgisayarkavramlari.com/2009/10/31/ogrencinin-gpa%e2%80%99ini-hesaplayan-kod/#comments</comments>
		<pubDate>Sat, 31 Oct 2009 14:43:49 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Scheme (Lisp)]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2009/10/31/ogrencinin-gpa%e2%80%99ini-hesaplayan-kod/</guid>
		<description><![CDATA[Soru: Bir öğrencinin okul numarası, ve aldığı dersler bulunur. Bir dersin ise kodu bulunur. Öğrencinin aldığı her dersin bir kodu ve öğrencinin bu dersten aldığı not bulunur. Buna göre bir öğrenci tanımlandığında aşağıda verilen not tablosuna göre bu öğrencinin ortalamasını hesaplayan bir kod yazınız. Harf Notu (4 üzerinden) A 4 A- 3.7 B+ 3 B- [...]]]></description>
			<content:encoded><![CDATA[<p>Soru: Bir öğrencinin okul numarası, ve aldığı dersler bulunur. Bir dersin ise kodu bulunur. Öğrencinin aldığı her dersin bir kodu ve öğrencinin bu dersten aldığı not bulunur. Buna göre bir öğrenci tanımlandığında aşağıda verilen not tablosuna göre bu öğrencinin ortalamasını hesaplayan bir kod yazınız.</p>
<div>
<table style="border-collapse:collapse" border="0">
<colgroup>
<col style="width: 307px;"></col>
<col style="width: 307px;"></col>
</colgroup>
<tbody>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  solid black 0.5pt; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">Harf</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  solid black 0.5pt; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">Notu (4 üzerinden)</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">A</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">4</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">A-</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">3.7</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">B+</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">3</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">B-</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">2.7</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">C+</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">2.3</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">C</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">2</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">C-</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">1.7</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">D+</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">1.3</td>
</tr>
<tr>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  solid black 0.5pt; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">D</td>
<td style="padding-left: 7px; padding-right: 7px; border-top:  none; border-left:  none; border-bottom:  solid black 0.5pt; border-right:  solid black 0.5pt">1</td>
</tr>
</tbody>
</table>
</div>
<p>Çözen : Şadi Evren ŞEKER</p>
<p>Çözüm fonksiyonları:</p>
<p>Bu tip bir soruda verilerin tutulması ve işlenmesi önemli bir yer tutar. Verilerin tutulması için scheme dilinde bulunan struct özelliğinden faydalanacağız.</p>
<p>Öncelikle dersin yapısını tanımlayalım:</p>
<p>(define-struct course (name credit grade))</p>
<p>Ardından bir öğrencinin yapısını tanımlayalım:</p>
<p>(define-struct student (id listofcourses))</p>
<p>Yukarıda görüldüğü üzere bir ders, isim, kredi ve nottan; öğrenci ise bir numara ve aldığı derslerden oluşur. Şimdi fonksiyonları yazmaya başlayabiliriz:</p>
<p>Öncelikle bir harf notu verildiğinde sayısal karşılığını döndüren fonksiyonu yazalım:</p>
<p>(define (letter-grade grade)(cond [(eq? grade 'A) 4][(eq? grade 'A-) 3.70][(eq? grade 'B+) 3.30][(eq? grade 'B) 3][(eq? grade 'B-) 2.70][(eq? grade 'C+) 2.30][(eq? grade 'C) 2][(eq? grade 'C-) 1.70][(eq? grade 'D+) 1.30][(eq? grade 'D) 1][else 0]))</p>
<p>Ardından verilen bir listedeki dersler için ağırlıklı ortalama hesaplayan fonksiyonu yazalım:</p>
<p>(define (weightedaverage acourse) ( * (course-credit acourse)(letter-grade (course-grade acourse))))</p>
<p>(define (weightedaverage-sum acourselist)( cond [(null? acourselist) 0][else (+ (weightedaverage-sum (rest acourselist)) (weightedaverage (first acourselist)))]))</p>
<p>Yukarıdaki kodda derslerin bir liste olarak verildiği kabul edilmiştir. Buradaki weightedaverage-sum fonksiyonu <a href="http://www.bilgisayarkavramlari.com/2008/08/05/ozyineli-fonksiyonlar-recursive-functions/">özyineli (recursive)</a> olarak listenin üzerinden geçer. Her geçişinde sıradaki elemanın değerini toplar ve sonuçta bütün elemanların toplam değerini döndürür.</p>
<p>Yukarıdaki toplamları alan fonksiyonlara ilave olarak derslerin kredilerinin toplamını veren bir fonksiyona ve nihayetinde bu not toplamını kredi toplamına bölen bir fonksiyona daha ihtiyaç vardır. Bunlar aşağıdaki şekilde yazılabilir:</p>
<p>(define (course-credits acourselist)( cond [(null? acourselist) 0][else (+ (course-credits (rest acourselist)) (cond[(eq? 'Z (course-grade (first acourselist))) 0][else ( course-credit (first acourselist))]))]))</p>
<p>(define (calculated-gpa astudent)(/ ( weightedaverage-sum (student-listofcourses astudent))(course-credits (student-listofcourses astudent))))</p>
<p>Sonuçta bir öğrenci dersleri ile birlikte aşağıdaki şekilde verilince ortalama GPA değeri başarıyla hesaplanır:</p>
<p>Çözüm çalıştırması:</p>
<p>(calculated-gpa (make-student 10022021  (list (make-course &#8216;Comp111 3 &#8216;B+) (make-course &#8216;Comp112 3 &#8216;D+) (make-course &#8216;FM302 3 &#8216;C+)(make-course &#8216;EC232 3 &#8216;A-)(make-course &#8216;FM412 3 &#8216;C+)(make-course &#8216;FM496 4 &#8216;C+))))</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/103109_1443_rencininGPA1.png" alt="" /></p>
<p>Yukarıdaki örnek öğrenci için ortalama 2.52 olarak bulunmuştur.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2009/10/31/ogrencinin-gpa%e2%80%99ini-hesaplayan-kod/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ekrana Trafik Işıkları Çizen Kod</title>
		<link>http://www.bilgisayarkavramlari.com/2009/10/31/ekrana-trafik-isiklari-cizen-kod/</link>
		<comments>http://www.bilgisayarkavramlari.com/2009/10/31/ekrana-trafik-isiklari-cizen-kod/#comments</comments>
		<pubDate>Sat, 31 Oct 2009 14:25:47 +0000</pubDate>
		<dc:creator>Şadi Evren ŞEKER</dc:creator>
				<category><![CDATA[Scheme (Lisp)]]></category>

		<guid isPermaLink="false">http://www.bilgisayarkavramlari.com/2009/10/31/ekrana-trafik-isiklari-cizen-kod/</guid>
		<description><![CDATA[Soru: Sırasıyla, ekrana üç adet kırmızı, sarı, yeşilden oluşan trafik ışıklarını çiziniz, ışıklardan birini söndüren fonksiyonu, ışıklardan birini yakan fonksiyonu, ışık değiştiren fonksiyonu ve sıradaki ışığı yakan fonksiyonu yazınız. Çözen : Şadi Evren ŞEKER Çözüm fonksiyonları: Öncelikle çizim yapacağımız için dr. Scheme üzerinde draw.ss teachpack&#8217;ini yüklememiz gerekiyor: Ardından poligonu çizim için değişkenlerimizi tanımlayalım: ;;6.2.1 (define [...]]]></description>
			<content:encoded><![CDATA[<p>Soru: Sırasıyla, ekrana üç adet kırmızı, sarı, yeşilden oluşan trafik ışıklarını çiziniz, ışıklardan birini söndüren fonksiyonu, ışıklardan birini yakan fonksiyonu, ışık değiştiren fonksiyonu ve sıradaki ışığı yakan fonksiyonu yazınız.</p>
<p>Çözen : Şadi Evren ŞEKER</p>
<p>Çözüm fonksiyonları:</p>
<p>Öncelikle çizim yapacağımız için dr. Scheme üzerinde draw.ss teachpack&#8217;ini yüklememiz gerekiyor:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/103109_1425_EkranaTrafi1.png" alt="" /></p>
<p>Ardından poligonu çizim için değişkenlerimizi tanımlayalım:</p>
<p>;;6.2.1</p>
<p>(define WIDTH 50)</p>
<p>(define HEIGHT 160)</p>
<p>(define BULB-RADIUS 20)</p>
<p>(define BULB-DISTANCE 10)</p>
<p>;; the positions of the bulbs</p>
<p>(define X-BULBS (quotient WIDTH 2))</p>
<p>(define Y-RED (+ BULB-DISTANCE BULB-RADIUS))</p>
<p>(define Y-YELLOW (+ Y-RED BULB-DISTANCE (* 2 BULB-RADIUS)))</p>
<p>(define Y-GREEN (+ Y-YELLOW BULB-DISTANCE (* 2 BULB-RADIUS)))</p>
<p>Yukarıdaki tanımlamada öncelikle trafik ışıklarının boyutları (width , height) yarı çapları ve birbirine mesafeleri tanımlanmıştır. Ardından aynı x değerine sahip farklı y değerlerindeki 3 adet x,y ikilisi hesaplanmıştır. Işıklar alt alta duracağı için tek x değeri bütün 3 ışık içinde yeterlidir.</p>
<p>Işıkları draw.ss kullanarak çizmek için aşağıdaki kod gerekmektedir:</p>
<p>(start WIDTH HEIGHT)</p>
<p>(draw-solid-disk (make-posn X-BULBS Y-RED) BULB-RADIUS &#8216;red)</p>
<p>(draw-circle (make-posn X-BULBS Y-YELLOW) BULB-RADIUS &#8216;yellow)</p>
<p>(draw-circle (make-posn X-BULBS Y-GREEN) BULB-RADIUS &#8216;green)</p>
<p>Ardından sorunun ilk fonksiyonu olan ve bir trafik ışığını temizleyen koda geçebiliriz:</p>
<p>(define (clear-bulb color) ( cond   [ (eq? color 'red) (draw-solid-disk (make-posn X-BULBS Y-RED) (- BULB-RADIUS 2) 'white)]</p>
<p>[ (eq? color 'yellow) (draw-solid-disk (make-posn X-BULBS Y-YELLOW) (- BULB-RADIUS 2) 'white)]</p>
<p>[ (eq? color 'green) (draw-solid-disk (make-posn X-BULBS Y-GREEN) (- BULB-RADIUS 2) 'white)]</p>
<p>))</p>
<p>Yukarıdaki kodda verilen renk 3 ihtimalden birisi ile kontrol edilmektedir. Hangi ihtimal ise ilgili rengin bulunduğu koordinata yarı çapı 2 küçük yeni ve beyaz bir daire çizilmektedir. Bu sayede trafik ışığının içi boş izlenimi verilmektedir.</p>
<p>Sorudaki ikinci fonksiyon olan ve trafik ışığını yakan fonksiyonu yazacak olursak:</p>
<p>(define (draw-bulb color) ( cond   [ (eq? color 'red) (draw-solid-disk (make-posn X-BULBS Y-RED) BULB-RADIUS  'red)]</p>
<p>[ (eq? color 'yellow) (draw-solid-disk (make-posn X-BULBS Y-YELLOW) BULB-RADIUS 'yellow)]</p>
<p>[ (eq? color 'green) (draw-solid-disk (make-posn X-BULBS Y-GREEN) BULB-RADIUS 'green)]</p>
<p>))</p>
<p>Yukarıdaki fonksiyonda bir öncekine benzer şekilde verilen renk 3 ihtimal ile kontrol edilmekte hangisine eşitse o ışık koordinatına ilgili renkte bir daire yerleştirilmektedir.  Bu sayede ilgili renkteki ışık yanmış izlenimi verilmektedir.</p>
<p>Işık değiştirmek için, bir ışığın sönüp diğerinin yanması gerekir. Bunun için öncelikle renk söndürülür ve sonra istenen diğer renk yakılır.</p>
<p>(define (switch color1 color2)( and (clear-bulb color1)(draw-bulb color2)))</p>
<p>Son olarak sorudaki son fonksiyon olan sıradaki rengin yakılması yani kırımızı-&gt;sarı-&gt;yeşil-&gt;kırmızı döngüsünü yapan fonksiyon için mevcut rengi alan ve bu rengi söndürüp döngüdeki bir sonraki rengi yakan fonksiyon aşağıdaki şekilde yazılabilir</p>
<p>(define (next color) (cond   [ (eq? color 'red) (switch 'red 'yellow)]</p>
<p>[ (eq? color 'yellow) (switch 'yellow 'green)]</p>
<p>[ (eq? color 'green) (switch 'green 'red)]))</p>
<p>Çözüm çalıştırması:</p>
<p>İlk fonksiyon olan ışığı söndürme:</p>
<p>(clear-bulb &#8216;red)</p>
<p>İkinci fonksiyon ışığı yakma</p>
<p>(draw-bulb &#8216;green)</p>
<p>Üçüncü fonksiyon ışığı değiştirme</p>
<p>(switch &#8216;green &#8216;yellow)</p>
<p>Son fonksiyon sıradaki ışığı yakma</p>
<p>(next &#8216;yellow)</p>
<p>(next &#8216;green)</p>
<p>Açıklama:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/103109_1425_EkranaTrafi3.png" alt="" /></p>
<p>Çalışmanın sonucunda görülen ekran aşağıda verilmiştir:</p>
<p><img src="http://www.bilgisayarkavramlari.com/wp-content/uploads/103109_1425_EkranaTrafi5.png" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.bilgisayarkavramlari.com/2009/10/31/ekrana-trafik-isiklari-cizen-kod/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
