Soru Cozum Mantigi(Java)
-
Soruyu java uzerinden yazdigimdan java uzerinden orneklendirerek anlatiyorum. Bir el atin fikir bakimindan Kod yada soru cozumu degil :) Ha ben ugrastim yaptim al bak fikrimin kaynak koduda burda dursun diyen olursa kendi secimidir seve seve incelerim iyi olur.
Bir komut satiri yorumlayici programi yapmak istiyorum Ornegin.
Ben length "Tahribat" die girdigimde bana tirnak icindeki stringi uznlugunu vericek yada
upper "tahribat" dedigimde touppercase yapip ekrana o sekilde yazdiricak.
boyle belli basli komutlar eklenicek programa. Komutlar en az 3 harfli yazilabilir sonrasindaki karakterleri zorunlu degil yani, length i len de yazabilir leng de lengt yada length seklinde hepsini kabul edicek ve gerekli islemleri yapip ekrana yazdiricak. lenxx lentt gibi yazimlar kabul edilmiycek.
Sorudaki ornek komutlar = lenght, reverse, upper, lower, quit. seklindedir bunlara uygun gelen methodlar kullanilarak ekran ciktisi alinicaktir.
Farkli gidis yollarina ve baska kisilerinde sorun cozme yontemlerini gormek adina sizlere soruyorum.
Su su methodlari su ekilde kullanarak sunu kullanarak vs gibi Java uzerinden orneklemeler ile yapilirsa tadindan yenmez yinede baska dillerlede aciklama yapilirsa mantik ayni ben kendim ceviririm.
NOT: ders sinav zart zurt sorusu degildir. Soru cozumundan herhangi bir maddi kazanc elde etmiyorum. Tamamen kendi capimdaki yaptigim alistirmalar ornegidir. Lan sen bize odev mi yaptiriosun triplerine girilmeden on yargisiz yaklasalim :D
Absolut tarafından 24/Ağu/15 21:39 tarihinde düzenlenmiştir -
Hocam switch-case yapısıyla pratik bir şekilde yapılabilir. Tabi if/else kullanılabilir ancak switch-case'de daha derli toplu oldu gibi.
Ben yalnızca uzunluğu aldım bunlara toUpper toLower falan eklersin uzar böyle liste. Program sonlanmasın istersen while döngüsü içine alabilirsin. Takipteyim :d
-
ben case yerine komutu tek satirda alip length "tahribat" seklinde onlari split edip bir string arraye atayip, komut kisaltmalarinida ayri string arraylerde saklayip denedim. case cok uzun geldi gozume :D
-
daha kompleks komutlar için de düşününce regex kullanılabilir
-
-
Lightsaber bunu yazdı
daha kompleks komutlar için de düşününce regex kullanılabilir
Aslinda soruda komut satiri ve ardindan uygulanacak komut kelimesi gelmeli die basitlestirmisler. ben yinede ordan yola cikarak kompleks verilir die split ettim bosluk tab " falan atip o sekilde dondurdugu her elemani string arraya atip array[0] i da komut olarak kabul edip ordan yola cikarak islem yaptirmaya calistim.
@PcK0 hocam istediginiz dilde aciklama yazabilirsiniz maksat sorun cozumune gidisat yolu javascript ile yaparsaniz elimizde extra dil kodu olmus olur daha tatli olur. satirlari yorumlayarak javaya cekmeye calisirim.
-
Olur başlayalım o zaman.
Kod giriş mantığı hakkında sadece splitlere bağlı kalmamak demişsin ama eval gibi olayları çok geniş noktalara taşıyabilecek eval komutu javada yok :D Yani compile edilen bir dilde eval pek olmaz. Şu an baktım javascript'e bağlı olarak bir eval komut işlemesi falan kullanmakta imiş sanırım oda matematiksel işlemler için. Neyse devam edelim.
dizi = array
dizge = string
Ayrıca bazı yerlerde ilgili dillere göre farklılıklar gösterecektir. Mesela dizi anahtarında dizge kullanmak phpde çok alışıla gelmiş birşeyken javascriptte anahtarı dizge kullanıldığında dizi associative olarak anılıyor. O yüzden daha ortak tarzda yönlendirmeye çalışacağım.
Ama sormalıyım javada anonim fonksiyonlar hakkında bilgin varmı? Ve bunları dışarıdan çağırabilir misin?
PcK0 tarafından 25/Ağu/15 00:07 tarihinde düzenlenmiştir -
Ben karaladım birşeyler umarım işine yarar.
Editlemeden önce gördüysen biraz karışık oldu jsfiddle'a attım biraz toparladım. jsfiddle.net/an2a158n/
PcK0 tarafından 25/Ağu/15 01:09 tarihinde düzenlenmiştir -
Kolay bir problem. Mademki kodla çözüm istemiyorsun sana hızlıca anlatıvereyim.
-input stringini al
-input stringini regexp e tabi tut. Bu regexp ile komut ve varsa parametre/leri ayırıp bir objenin içine göm.
-Switch case ile komutun yapacağı işi tanımlayıp gerçekleştirebilisin. Ama gördüğüm kadarıyla daha yakışıklı ve öğretici bir yöntem istiyorsun. O zaman Observer Pattern i inceliyorsun. https://en.wikipedia.org/wiki/Observer_pattern Bu pattern i kullanarak uygulama içerisinde "length diye bir komut geldi" diye tüm uygulamaya haber veriyorsun ve bu "length" parametresiyle işi olan herkes bu olaydan haberdar oluyor. Sana sadece her komut için listener yazıp attach etmek kalıyor. Ama switch-case çok daha hızlı çalışır ama merkezi bir yapıdadır. Observer ise classların birbirine olan bağımlılığını azaltır. Seçim senin ama kolay proje olmuş.
-
Girilen komutun ilk 3 harfini split et.
Sonrası switch case yapısı :
len ise şunu yap, upp ise bu falan.
Switch-Case sevmem dersen @S2buyuk önerisine bak.
(senin koşuluna göre ilk 3 harf bizi bağlıyor, len de yazsa aynı lengt de length de)
ozgunlu tarafından 25/Ağu/15 01:14 tarihinde düzenlenmiştir -
Öncelikle gerçekten böyle bir soru için sağol oturup yazayım dedim. bunu incelersen sorularına tek tek çözüm getirmeye çalıştım.
Not: Kontrolü yaparsın daha iyi yapan mutlaka çıkacaktır. maksat iş görülsün...
.
import java.util.Scanner; public class KomutSatiri { static String[] komutlar = {"length","reverse","upper","lower","quit"}; public static void main(String[] args) { // TODO Auto-generated method stub Scanner scn = new Scanner(System.in); while(true) { KomutGir(scn.nextLine()); System.out.println("\n"); } } public static void KomutGir(String str) { //Length, reverse, upper, lower, quit. String[] komut = str.split(" "); komut[0].toLowerCase(); if(komut.length==2) { if(tirnakKontrol(komut[1])) { switch (komut[0].substring(0,3)) { case "len": System.out.println(komut[1].substring(1,komut[1].length()-1)+" Kelimesi "+(komut[1].length()-2)+" Karakterden Oluşmuştur!"); break; case "upp": System.out.println(komut[1].substring(1,komut[1].length()-1).toUpperCase()+" Şeklinde Yazılır."); break; case "low": System.out.println(komut[1].substring(1,komut[1].length()-1).toLowerCase()+" Şeklinde Yazılır."); break; case "qui": //Çıkış komutları System.out.println("Çıkış Yaptınız. Tekrar Görüşmek Üzere"); break; case "rev": //Çıkış komutları System.out.println(komut[1].substring(1,komut[1].length()-1)+" Yazısı, "+yaziyiTersle(komut[1].substring(1,komut[1].length()-1).toString())+" şeklinde ters yazılır..."); break; default: System.out.println(komut[0]+" Komutu Bulunamadı!"); break; } } else { System.out.println("Hatalı Kullanım Lütfen (komut \"argüment\") şeklinde giriniz.."); } } else { System.out.println("Herhangi Bir Argüment Girmediniz..."); } } public static boolean tirnakKontrol(String str) { if (str.substring(0,1).equals("\"") && str.substring(str.length()-1, str.length()).equals("\"")) { return true; } return false; } public static boolean komutDogrula(String komut) { if(komut.length() > 2 && komut.length() < 7) { for(int i=0;i<komutlar.length;i++) { if(komut.substring(0,komut.length()).equals(komutlar[i].substring(0,komut.length()))) { return true; } } return false; } return false; } public static String yaziyiTersle(String str) { if(str.length()==0) { return str; } return yaziyiTersle(str.substring(1))+str.charAt(0); } }
