ورود

View Full Version : سوال: نوشتن برنامه BinarySearch به صورت شی گرا



Sina.iRoid
دوشنبه 17 آذر 1393, 18:53 عصر
سلام دوستان.

من می خوام برنامه جستجوی دودویی و به صورت شی گرا بنویسم. تا یه جاهایی پیش رفتم، اما به مشکلی که بر خوردم اینه که نمی دونم چطور داده های آرایه رو از ورودی دریافت کنم و بعد داخل آرایه بذارم!؟
خواهشم از شما دوستان اینه که:
ابتدا در مورد نحوه شی گرا نوشتم توضیح بدین. اینکه تا چه حد درست کار کردم!؟
و اینکه چه طور از کاربر ورودی بگیرم.

کد کلاس: BinarySearch


public final class BinarySearch {

private int left = 0;
private int right;
private int sw = 0;
private int key = 0;
private int mid = 0;
private int[] num = new int[5];

//search method
public void search(){
while (sw == 0 && left <= right) {
mid = (left + right) / 2;
if (num[mid] == key) {
sw = 1;
}else if (num[mid] < key) {
left = mid + 1;
}else {
right = mid - 1;
}
}
if (sw == 0) {
System.out.println("Doesn't exist.");
} else {
System.out.println("Exist in: " + (mid + 1));
}
}

//setter
public void setKey(int key){
this.key = key;
}
public int[] getNum(){
return num;
}
public void setNum(int[] num){
this.num = num;
}
}


و کد کلاس اصلی:


import java.util.Scanner;




public class MainClass {

public static void main(String[] args){

Scanner input = new Scanner(System.in);

//object from BinarySearch
BinarySearch searchOb = new BinarySearch();

//get data for array
for (int i = 0; i < searchOb.getNum().length; i++) {
searchOb.setNum();
}

System.out.print("Please type number that you want to search: ");


searchOb.setKey(input.nextInt()); //getting input
}
}


ممنون میشم اگر راهنماییم کنید.

محمد فدوی
دوشنبه 17 آذر 1393, 20:46 عصر
سلام.
برنامه‌ی خوبی نوشتی... برای ورودی هم باید از Scanner استفاده کنی.
اما واقعا از خودت بپرس فرآیند جستجوی دودویی واقعا یک شیء لازم داره؟ اصن آیا این مسئله اونقدر پیچیده هست که شیء‌گرا پیاده‌سازی بشه؟ بهتر نبود تابع search رو خیلی گویا تر از این تعریف میکردی؟

public final class BinarySearch {
public static int find(int[] array, int target) { ... }
public static int[] findAll(int[] array, int target) { ... }
}

find فقط target رو پیدا میکنه و اندیسش رو برمیگردونه. اما findAll همه‌ی اعضایی که با target برابرن رو پیدا میکنه و اندیس‌هاشون رو بر میگردونه. به نظر خودت بستگی داره. اما فکر میکنم این ۲تا تابع ساده‌ای که من پیشنهاد دادم پیچیدگی برنامه‌ت رو کم کنه.
حالا یه پیشنهاد دیگه. کلاست رو ژنریک بنویس که بتونه توی هر آرایه‌ای جستجو کنه...

Sina.iRoid
سه شنبه 18 آذر 1393, 22:00 عصر
سلام.
ابتدا سپاس از راهنماییتون.:لبخندساده:
یکم فک کردم، دیدم تا اینجا که پیش اومدم، بقیش هم بنویسم. الان مشکلم توی ورودی گرفتنه. از Scanner استفاده کردم. اما به کلاس اصلی دقت کنید! در خط 16 چطور ورودی ها رو بگیرم و در آرایه ذخیره کنم. اصلا نمیشه.
در مورد ژنریک هم، ممنون از پیشنهادتون. اما هنوز بلد نیستم اونطوری بنویسم.
ممنون.