Son günlerde süregelen 2 boyutlu algoritma sorunum sebebiyle kolları sıvamak durumunda kalmıştım. Şükür sorunu çözdük ve uzunca süredir kütüphanemde gözüme çarpan Seçkin kitabevinin yayınladığı “Algoritma Geliştirme ve Programlamaya Giriş” kitabının da tozunu almış oldum. Elimde 10. baskısı bulunan ve Dr. Fahri Vatansever tarafından ele alınan bu kitabın şu sıralar 12. baskısı piyasada.
Genişletilmiş 12. baskısını yapan bu kıymetli kitap, daha önce programlama ile ilgili bilgisi bulunmayan başlangıç seviyesinden ileri seviyelere kadar, adım adım “Algoritma Geliştirme” ve “Programlama Teknikleri”ni anlatmaktadır. Programlama merakı olan herkesinde kütüphanesinde bulunması gerektiğini düşünüyorum. Kitapta “algoritma geliştirme” ve “program yazma” tekniklerinin kazandırılması amaçlanmış.
Konuya dönersek, temel sorunumu çözdükten sonra kitabı biraz inceledim ve böylece kendimi biraz tazeleme fırsatı buldum (bir çeşit sudoku). Ara ara buradan sizlerle yaptıklarımı paylaşmaya çalışacağım. Algoritmaları çizmeyeceğim ama çizmek isteyenler için sıkı bir tool olduğunu düşündüğüm cross-platform bir uygulama olan Pencil‘ı tavsiye edebilirim.
Sırasıyla algoritmaları aşağı doğru ekleyeceğim, zaman içinde ekledikçe de konu aşağı doğru uzayacak ve sayfalanacaktır. Benim gibi meraklıysanız göz atmanızı önereceğim.
Sınıf isimlerinin 10.baskıya göre kitaptaki örnek numaraları ile isimlendirildiğini belirterek başlayayım;
Örnek 6.1 // 2015.12.27
Sayfa 165’de göreceğiniz bu örnekte taban ve yükseklik verileri ile üçgenin alan hesaplaması yapılıyor.
Algoritmalar.java
package org.mustak.algoritmagelistirmekitabi; /** * @author Hakan Müştak * 2015/12 */ //Gereken Paket/Sınıflar import java.util.Scanner; import kitap.AltiyaBir; public class Algoritmalar { // Kullanıcı giriş değişkenleri private static Scanner scCikis; private static Scanner scTaban; private static Scanner scYukseklik; public static void main(String[] args) { // Taban ve Yükseklik scTaban = new Scanner(System.in); scYukseklik = new Scanner(System.in); // Ucgen sınıfını çağırıyoruz AltiyaBir ucgen = new AltiyaBir(); // Programın tekrar edileceği alan do { // Taban girişi try { System.out.print("Üçgenin taban değerini giriniz :"); ucgen.setTaban(scTaban.nextFloat()); // Taban değeri Set } catch (Exception e) { hata(); } // Yukseklik girisi try { System.out.print("Üçgenin yükseklik değerini giriniz :"); ucgen.setYukseklik(scYukseklik.nextInt()); // Yukseklik degeri // Set } catch (Exception e) { hata(); } ucgen.AlanHesapla(); // Alan hesaplatalım ucgen.ekranaYaz(); // Sonucu Yazalım System.gc(); // Garbage Collector } while (programCikisKontrolu()); System.out.println("Program sonlandırılmıştır...\n\n"); }// main // Çıkışı kontrol eden metod public static boolean programCikisKontrolu() { // Kullanıcı çıkış bilgisi scCikis = new Scanner(System.in); System.out.print("Tekrar denemek ister misiniz? (E/H)"); // Kullanıcı çıkmak istiyor mu? if (scCikis.nextLine().equalsIgnoreCase("e")) { return true; } else { return false; } }// programCikisKontrolu() // Hatalı giriş yapılırsa, çıkış ve öncesindeki uyarı public static void hata() { System.out.printf("Giriş hatası yapıldı : %s\n", "Sayısal değer girilmedi!"); System.out.println("Hatalı giriş sebebiyle uygulama sonlandırılmıştır.!\n\n"); System.exit(0); // Konsolu durdur }// hata() }// class
AltiyaBir.java (Sınıf isimleri package içinde kolaylıkla bulunabilmesi için örnek numaraları ile aynıdır.)
package kitap; /** * @author Hakan Müştak * 2015/12 */ public class AltiyaBir { // Değişkenler----------------------------------- private float taban, yukseklik, alan; // Getter-Setter--------------------------------- public float getAlan() { return alan; } private void setAlan(float alan) { this.alan = alan; } private float getTaban() { return taban; } public void setTaban(float taban) { this.taban = taban; } private float getYukseklik() { return yukseklik; } public void setYukseklik(float yukseklik) { this.yukseklik = yukseklik; } // Metodlar------------------------------------ public void AlanHesapla() { setAlan((getTaban() * getYukseklik()) / 2); } public void ekranaYaz() { System.out.println("\n---------------------------------------"); System.out.printf("Taban %,33.1f\n" ,getTaban()); System.out.printf("Yukseklik %,29.1f\n" ,getYukseklik()); System.out.printf("Alan %,34.1f\n" ,getAlan()); System.out.println("---------------------------------------\n"); } }
Örnek 6.1 sonu
Mail, yorum ve olumlu/olumsuz eleştirilerinizi bekliyorum.
Hakan Müştak @2015/12
Yaptığı İŞ düşünülecek olursa gereğinden fazla uzun olmuş gibi görünüyor. Algoritmayı test eden kodu yazıp bitirmekdaha uygun olurdu. Gene de emeğinize sağlık.
Eleştriniz için teşekkür ederim. Matematiksel işlevin algoritması için yeterli olabilirdi söylediğiniz. Ama bunun için hesap makinesi yeterli olacaktı; fakat amacımızın programcı kimliğimizle algoritmayı denemek olduğu için kısa yada uzun olduğuna bakmadan, kontrollerimizle oluşturduğumuz programımıza algoritmanın hesap sınıfını entegre etmek olmalı diye düşünüyorum. Bir çeşit kod antremanı olarak görmek lazım.