PDA

View Full Version : خروجی گرفتن از توابع داخل یک کلاس مجزا



Aemx-Az
پنج شنبه 03 اردیبهشت 1394, 21:48 عصر
سلام و وقت به خیر

از دوستان کسی هست بتونه گره از کارمون وا کنه ؟ ممنون میشم .

اینکه داخل یک کلاس ، 4 تا متد تعریف کردم .

اولی برای مقایسه عناصر مشترک دو تا آرایه ی تک بعدی و تشکیل آرایه سوم .>> مقدار بازگشتی void

متد دوم برای Sort المان های آرایه سوم . >> مقدار بازگشتی void

متد سوم برای حذف عناصر تکراری >> مقدار بازگشتی int[]

و متد چهارم برای نمایش خروجی از نوع آرایه .

در حالتی که همه اینا رو داخل یه تابع انجام دادم ، تونستم خروجی مورد نظرم رو بگیرم .

اما با 4 تابع ، چیزی چاپ نمیشه !

نمونه کد به این صورت هستش که :

برای خروجی گرفتن از این شیوه استفاده کردم :




public int[] remove_duplicates(){

c1=0;
set3[c1]=set3[0];
for(int i=1;i<c;i++)
{
if(set3[c1] != set3[i])
{
c1++;
set3[c1]=set3[i];
}
}
return set3;
}



public void show_result(){


intsec = remove_duplicates();
System.out.print("Intersection Set is = ");
for(int i=0;i<Intersection.c1;i++)
System.out.print(intsec[i] + " , ");


}

**مقدار c1 از تابع سوم (remove_duplicates) مشخص میشه . متغیرهای مربوط به Object همگی از نوع private تعریف شدن .
** فراخوانی های مربوط به کلاس و متغیر ها نیز در کلاس اصلی و تابع Main به درستی انجام شده .
** همچنین تنها با خروجی گرفتن از تابع اول ( یافتن عناصر مشترک ) جواب داد . اما با استفاده از اخرین تابع هیچی چاپ نمیشه !

-سیّد-
جمعه 04 اردیبهشت 1394, 08:27 صبح
سلام و وقت به خیر

از دوستان کسی هست بتونه گره از کارمون وا کنه ؟ ممنون میشم .

اینکه داخل یک کلاس ، 4 تا متد تعریف کردم .

اولی برای مقایسه عناصر مشترک دو تا آرایه ی تک بعدی و تشکیل آرایه سوم .>> مقدار بازگشتی void

متد دوم برای Sort المان های آرایه سوم . >> مقدار بازگشتی void

متد سوم برای حذف عناصر تکراری >> مقدار بازگشتی int[]

و متد چهارم برای نمایش خروجی از نوع آرایه .

در حالتی که همه اینا رو داخل یه تابع انجام دادم ، تونستم خروجی مورد نظرم رو بگیرم .

اما با 4 تابع ، چیزی چاپ نمیشه !

نمونه کد به این صورت هستش که :

برای خروجی گرفتن از این شیوه استفاده کردم :



public int[] remove_duplicates(){

c1=0;
set3[c1]=set3[0];
for(int i=1;i<c;i++)
{
if(set3[c1] != set3[i])
{
c1++;
set3[c1]=set3[i];
}
}
return set3;
}



public void show_result(){


intsec = remove_duplicates();
System.out.print("Intersection Set is = ");
for(int i=0;i<Intersection.c1;i++)
System.out.print(intsec[i] + " , ");


}


**مقدار c1 از تابع سوم (remove_duplicates) مشخص میشه . متغیرهای مربوط به Object همگی از نوع private تعریف شدن .
** فراخوانی های مربوط به کلاس و متغیر ها نیز در کلاس اصلی و تابع Main به درستی انجام شده .
** همچنین تنها با خروجی گرفتن از تابع اول ( یافتن عناصر مشترک ) جواب داد . اما با استفاده از اخرین تابع هیچی چاپ نمیشه !
اولین نکته این که لطفاً وقتی کد جاوا توی سایت می‌ذارید، اون رو داخل تگ JAVA قرار بدید نه تگ CODE تا syntax highlight بشه (من این بالا این کارو کردم).
دوم این که لطفاً indentation رو توی توابع هم رعایت کنید تا راحت‌تر بشه خوندش. (البته بعضی وقت‌ها پیش میاد که توی کد اصلی رعایت شده، توی کپی-پیست این مشکل پیش میاد).
سوم: لطفاً بقیه‌ی کد رو هم بذارید. اینطوری با یه کد نصفه انتظار دارید ما چطوری بفهمیم مشکل از کجاس؟!
از روی توضیحاتتون من یه کد شبیه‌سازی کردم:

package ir.test;

public class Intersection {
private static int c1;
private int[] set3;
private int c;
private int[] intsec;

public int[] remove_duplicates() {
c1 = 0;
set3[c1] = set3[0];
for (int i = 1; i < c; i++) {
if (set3[c1] != set3[i]) {
c1++;
set3[c1] = set3[i];
}
}
return set3;
}

public void show_result() {
intsec = remove_duplicates();
System.out.print("Intersection Set is = ");
for (int i = 0; i <= Intersection.c1; i++)
System.out.print(intsec[i] + " , ");
}

public static void main(String[] args) {
Intersection in = new Intersection();
in.set3 = new int[] {1, 2, 5, 10, 10, 10, 15, 20, 20, 30};
in.c = in.set3.length;
in.show_result();
}
}

خوب این کد کار می‌کنه. چند تا نکته بگم:
یکی این که من همونطور که گفتم، بقیه‌ی کد شما رو شبیه‌سازی کردم و در نتیجه مقدار set3 رو دستی بهش دادم: یه آرایه‌ی مرتب‌شده که توش المان تکراری هم هست.
دوم این که یه باگ کوچیک داشتید: توی تابع show_result که می‌خواین تمام مقادیر set3 رو چاپ کنید، به جای i < Intersection.c1 باید از => استفاده می‌کردید.

در نهایت چند تا نکته بگم:
یکی این که چرا متغیر c1 رو static تعریف کردید؟
دوم این که توی تابع show_result که مقدار متغیر intsec رو برابر خروجی تابع remove_duplicates قرار دادید، چرا این متغیر رو محلی تعریف نکردید؟ مگر این که بخواین جای دیگه هم ازش استفاده کنین. که باز سؤالی که پیش میاد اینه که خوب توی تابع remove_duplicates شما دارید مقدار متغیر set3 رو عوض می‌کنید و در نهایت هم خودش رو برمی‌گردونید، پس دیگه نیازی نیست که یه متغیر دیگه به نام intsec تعریف کنید و مساوی خروجی remove_duplicates قرار بدید. یعنی در واقع می‌تونستید تابع remove_duplicates رو void تعریف کنید، و توی تابع show_result از مقدار متغیر set3 استفاده کنید.
سوم این که نامگذاری متغیرهاتون اصلاً خوب نیست! اسم متغیر باید یه جوری باشه که آدم بفهمه چیه! c و c1 اصلاً گویا نیستن!
در نهایت هم این که توی تابع remove_duplicates به جای این که توی حلقه از متغیر c استفاده کنید، چرا از set3.length استفاده نکردید؟

Aemx-Az
جمعه 04 اردیبهشت 1394, 15:37 عصر
اولین نکته این که لطفاً وقتی کد جاوا توی سایت می‌ذارید، اون رو داخل تگ JAVA قرار بدید نه تگ CODE تا syntax highlight بشه (من این بالا این کارو کردم).
دوم این که لطفاً indentation رو توی توابع هم رعایت کنید تا راحت‌تر بشه خوندش. (البته بعضی وقت‌ها پیش میاد که توی کد اصلی رعایت شده، توی کپی-پیست این مشکل پیش میاد).
سوم: لطفاً بقیه‌ی کد رو هم بذارید. اینطوری با یه کد نصفه انتظار دارید ما چطوری بفهمیم مشکل از کجاس؟!
از روی توضیحاتتون من یه کد شبیه‌سازی کردم:

خوب این کد کار می‌کنه. چند تا نکته بگم:
یکی این که من همونطور که گفتم، بقیه‌ی کد شما رو شبیه‌سازی کردم و در نتیجه مقدار set3 رو دستی بهش دادم: یه آرایه‌ی مرتب‌شده که توش المان تکراری هم هست.
دوم این که یه باگ کوچیک داشتید: توی تابع show_result که می‌خواین تمام مقادیر set3 رو چاپ کنید، به جای i < Intersection.c1 باید از => استفاده می‌کردید.

در نهایت چند تا نکته بگم:
یکی این که چرا متغیر c1 رو static تعریف کردید؟
دوم این که توی تابع show_result که مقدار متغیر intsec رو برابر خروجی تابع remove_duplicates قرار دادید، چرا این متغیر رو محلی تعریف نکردید؟ مگر این که بخواین جای دیگه هم ازش استفاده کنین. که باز سؤالی که پیش میاد اینه که خوب توی تابع remove_duplicates شما دارید مقدار متغیر set3 رو عوض می‌کنید و در نهایت هم خودش رو برمی‌گردونید، پس دیگه نیازی نیست که یه متغیر دیگه به نام intsec تعریف کنید و مساوی خروجی remove_duplicates قرار بدید. یعنی در واقع می‌تونستید تابع remove_duplicates رو void تعریف کنید، و توی تابع show_result از مقدار متغیر set3 استفاده کنید.
سوم این که نامگذاری متغیرهاتون اصلاً خوب نیست! اسم متغیر باید یه جوری باشه که آدم بفهمه چیه! c و c1 اصلاً گویا نیستن!
در نهایت هم این که توی تابع remove_duplicates به جای این که توی حلقه از متغیر c استفاده کنید، چرا از set3.length استفاده نکردید؟

سپاس .. نکاتی رو که اشاره کردین رو بذارین پای تازه کار بودنم و اینکه نیاز فوری داشتم به حل مشکل پیش اومده .
در رابطه با محلی تعریف نکردن intsec .. تو یه کلاس‌ دیگه ای باید ازش استفاده میکردم .. منتها مشکل اصلی این بود که مقدار خروجی تابع رو و همچنین مقادیر c , c1 که به عنوان شمارنده تعریف کردم , جای دیگه ای هم باید پاس میکردم .

اما در مورد اینکه چرا از .length استفاده نکردم : تعداد عناصر ارایه را باید 1000 یا در این حد وسیع میگرفتیم ... و با استفاده از حلقه های کنترلی کاربر اعضای ارایه رو وارد میکنه . که ممکنه بخواد از اندیسی به بعد , گرفتن ورودی متوقف بشه . لذا باید از شمارنده استفاده میشد .

نام گذاری متغیر ها بله / تو این قطعه کدی که قرار دادم با عجله فقط کد رو نوشتم که پوزش میخوام ...

و اینکه در نهایت , با ارجاع دادن مقادیر شمارنده ها تونستم خروجی مورد نظر رو بگیرم ...

بازم سپاس بابت لطفی که داشتین :لبخندساده: