PDA

View Full Version : فرق تابع با رویه در سی شارپ



eletcomp
چهارشنبه 14 خرداد 1393, 17:37 عصر
با سلام
میخواستم بدونم فرق تابع با رویه در سی شارپ دقیقا چی هست؟؟ بعضی جاها به توابع :متد هم می گویند!!

مثلا به این کد دقت کنید!! با استفاده از تابع هست!! که مقداری را بازگشت می دهد!!!

الان این کد دقیقا چی هست؟؟؟ ایا به هر چیزی که ازگومان ورودی داشته باشد و مقداری را بر گشت بدهد تابع می گویند!!


کد 1:



static int add(int x, int y)
{


int m;
m = x + y;


return m;


}



و این هم بدنه ی برنامه:



int total;
Console.WriteLine("two number");
int i = System.Int32.Parse(Console.ReadLine());
int j = System.Int32.Parse(Console.ReadLine());
total = add(i,j);
Console.Clear();
Console.WriteLine(total);
Console.ReadKey();


کد 2:

یا مثلا به این کد نگاه کنید!!! البته گمان کنم :کداش اشتباه هست!! ولی در کل.......
ایا این کد رویه هست؟؟ منظور از رویه چیست؟؟ ایا هر چی که void باشه :رویه محسوب می شود؟؟؟





static void sum(int a , int b) {





int m = a + b;


Console.WriteLine(m);


}





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



int total;
Console.WriteLine("two number");
int i = System.Int32.Parse(Console.ReadLine());
int j = System.Int32.Parse(Console.ReadLine());
total = sum(i,j);
Console.Clear();
Console.WriteLine(total);
Console.ReadKey();





سپاس

CsharpNevisi
چهارشنبه 14 خرداد 1393, 18:32 عصر
فک کنم فرقی بین تابع و رویه نباشه (البته فقط فک کنم ... :لبخند: ) ... !!!
میخواستم یه چیزی بگم ک تو حرفات اشتباه بهشون اشاره کردی ... ما یه ارگومان داریم یه پارامتر ... !!!!
وقتی یه تابع رو مینویسی و ورودیاشو مشخص میکنی ورودیا میشه ارگومان ... ولی وقتی تابع رو فراخوانی میکنی ورودیایی که میدی میشه پارامتر :لبخند:

eletcomp
چهارشنبه 14 خرداد 1393, 18:40 عصر
ممنون دوست عزیز: شما به تعریف و گفتار من کار نداشته باش:گیج: خودم نمیدونم چی گفتم!!!
من در فهم ان کد ها مشکل دارم!!! مثلا توابع ای که return دارند بهشان چی می گویند؟؟؟ از نظر کد نویسی؟؟؟
و انهایی void هستند !! چی می گویند بهشان از نظر کد نویسی؟؟؟ مثلا کد اولی اجرا می شود ولی کد دومی که void هست !! ارور می دهد!! کسی می دانه علت اش چی هست؟؟؟ از تعریف نادرست تابع هست؟؟

سپاس

CsharpNevisi
چهارشنبه 14 خرداد 1393, 18:48 عصر
چ اروری میده ؟؟؟؟

eletcomp
چهارشنبه 14 خرداد 1393, 18:53 عصر
میگه نوع داده void نمیتونه به int تبدیل بشود!! مشکل از تعریف کد ها گمان کنم باشه!!
راستی ایا متد با توابع فرق میکنه؟؟ یا یکی هستند؟؟
سپاس

CsharpNevisi
چهارشنبه 14 خرداد 1393, 19:04 عصر
خب راست میگه ... من تازه توجه کردم ... !!!
برای فراخوانیش نباید تو متغییر بریزی که ... تو اومدی اینجوری فراخوانی کردی :

total = sum(i,j);

بایداینجوری فراخوانی بشه ... !!! :

sum(i,j);

eletcomp
چهارشنبه 14 خرداد 1393, 19:26 عصر
دوست عزیز: ان طوری که گفتید نوشتم!! ولی باز ارور داد!! الان من میخوام نتیجه را در خروجی نمایش بدهم!! باید اینجوری بنویسم!!!


Console.WriteLine(sum);

اینطوری ارور میده که!!
لطفا با دقت کد ها را نگاه کن!!:افسرده:
یک سئوال از شما دارم!! به نظر شما تابع ای که از نوع void هست ! پارامتری از نوع int می گیره!!!؟؟؟ اصلا مقدار خروجی یا بازگشتی داره؟؟؟

سپاس

aliagamon
چهارشنبه 14 خرداد 1393, 19:33 عصر
تابع void یا هر تابعی محدودیتی تو نوع ورودی ندارن اما خروجیشون محدوده به نوعشون ... برای مثال int خروجی int میده string خروجی String
و void هم خروجی void میده که یعنی همون هیچی ...
تو توابع void شما نمیتونید خروجی بدین
اگه کد دوم رو ببینید توی خود تابع داره خروجی رو چاپ میکنه ... چون خروجی واسه بازگشت (return ) نمیتونه بفرسته .... پس شما فقط اینو بنویسی کار میکنه :
sum(i,j);
خودش خروجی رو هم چاپ میکنه براتون یعنی همینو بنویس دیگه console.write و متغییر استفاده نکن ...
توابع void معمولا برای انجام عملیات هایی استفاده میشن که نیاز به خروجی ندارن ... برای مثال شما فرض کن یه دکمه داری میخوان با اجرای یک تابع اندازه ی اونو تغییر بدی ... این کار که دیگه خروجی نمیخواد ...
امیدوارم متوجه شده باشید .:چشمک:

mehrdad1991h
چهارشنبه 14 خرداد 1393, 19:40 عصر
سلام
void تابعی هست که بدون مقدار بازگشتی هست و فقط یه کار را انجام میدهد
پس این قسمت کد شما اشتباه هست
total = sum(i,j);
چون چیزی بر نمیگرده که بخواهد به total مقدار دهی بشه !
بعد توابعی که یه مقدار را بر میگردونند از یه نوعی باید باشند مثلا int یا string یا هر چیزی دیگه.... نهایتا به این باید توجه کنی که بعد که مقدار بازگشت شد نوعش چیه و چجوریه میخوای استفاده کنی مثلا int بر میگرده ولی میخوای به عنوان رشته string یا کاراکتر یا ... استفاده کنی که خوب باید تبدیلشون کنی

و توضیح دیگه هم این که تابع هم میتونه مقدار بگیره ه نه که برای دو حالت فوق که توضیح دادم امکان پذیر میباشد.


و این که کد را اینجوری کن


Console.WriteLine("two number");
int i = System.Int32.Parse(Console.ReadLine());

int j = System.Int32.Parse(Console.ReadLine());

اول پاک میکنی صفحه را چون تابعت خودش نمایش میدهد

Console.Clear();
حالا تابع را فراخوانی میکنی که خوب خودش نمایش هم توی خودش فراخوانی میکنه
sum(i,j);

eletcomp
چهارشنبه 14 خرداد 1393, 20:28 عصر
ممنون دوستان عزیز: چند ابهام برام وجود داره!! لطفا راهنمایی کنید!
1. ایا تابع ای که مقدار بازگشتی نداره مثل void : می تواند پارامتر ورودی بگیرد؟؟؟
2.کاربرد توایع بازگشتی دقیقا چی هست؟؟؟
3. ایا به توابع :متد می گویند؟؟

سپاس

Mori Bone
چهارشنبه 14 خرداد 1393, 20:35 عصر
1: چرا نمی تونه پارامتر ورودی بگیره. معلا شما می خوای روال برات حاص دو عدد رو چاپ کنه پس باید دو عدد رو بگیره
2: اگه می هوای تابع بعد از محاصبه ی مجموع روش عملیات دگ انجام بدین اول تابع رو فرن خونی می کنید بعد که ماره تابع تموم شد و حاصل رو برگشت داد. حالا کار های دگ رو انجام می دید.

aliagamon
چهارشنبه 14 خرداد 1393, 20:52 عصر
1. بله میتونه ... برای مثال تو همین تابع داره ورودی میگیره دیگه ...
2.والا منضورتون اگه از بازگشتی توابع Recursive هست که کاربردشون تو عملیات های تکراری مثل فاکتوریل هست ... اگه منظور توابعی مثل همین نمونه ها هست ... خب واضحه کاربردش .. شما جای اینکه بیای 100 بار 10 خط کد رو بنویسی یه تابع میکنی هر بار با یه خط اونو فراخونی میکنی و خروجیتو میگیری
3. تو سی شارپ عملا همه ی تابع ها متد هستن ... :لبخند: اما تو همه زبان ها نه ...

eletcomp
چهارشنبه 14 خرداد 1393, 21:04 عصر
3. تو سی شارپ عملا همه ی تابع ها متد هستن ... :لبخند:
اما تو همه زبان ها نه ...
ممنون دوست عزیز: این کلمات من را دیوانه می کنه!! یکی میگه متد! یکی میگه تابع!! یکی میگه روال!!! یگی میگه رویه!!! یکی میگه بازگشتی!:گیج::افسرده:
یکی به ما بگه!! فرق اینها با هم چی هست!!! من این را بفهمم دیگه تمام هست!!!

سپاس

aliagamon
چهارشنبه 14 خرداد 1393, 21:24 عصر
متد یک بلوک کد ئه که توی کلاس یا همون استراکچر نوشته میشه،میتونه مقداری رو بر گردونه یا برنگردونه، یعنی تابع باشه یا نباشه و فقط روتین باشه ..
ولی چون تو سی شارپ نمیشه تابعی بیرون کلاس یا استراکچر تعریف کرد پس عملا همه ی توابع ما متد هستن دیگه ....:لبخند:
من هنوزم نفهمیدم منظورتون از بازگشتی
Recursive هست یا صرفا توابعی که مقداری بر میگردونن ... :لبخند: اما باز هم این دوتا یکیه فقط نحوه استفاده ازشون فرق میکنه همین ...

eletcomp
چهارشنبه 14 خرداد 1393, 21:50 عصر
ممنون دوست عزیز:


من هنوزم نفهمیدم منظورتون از بازگشتی
Recursive هست یا صرفا توابعی که مقداری بر میگردونن .
منظ.رم همان:
Recursive » همانیکه return میده!!
خب الان پس : تعریف روال و رویه چی میشه ؟؟ این دیگه چی هستند؟؟؟
سپاس

aliagamon
چهارشنبه 14 خرداد 1393, 22:03 عصر
روال ها میتونن یک یا چند خروجی برگردونن یا اینکه کلا چیزی بر نگردونن درواقع مثل توابع عمل میکنن ... شما زیاد خودتو درگیر این مسایل نکن مشکل اصلی اینه چندین مفهوم زیرساختی رو با هم دیدی قاتی کردی کدومشون چیه ...
شما در زبان سی شارپ زیاد درگیر این مفاهیم نمیشید ... چون همشون توی سی شارپ عملا یه چیز هستن و یه کار میکنن .. :لبخند: پس شما خیلی به این قضیه کاری نداشته باشین .. :چشمک:
(حداقل تا زمانی که براتون جا بیوفته همین مفاهیم ... )

Victoria.Net
چهارشنبه 14 خرداد 1393, 22:38 عصر
ممنون دوست عزیز: این کلمات من را دیوانه می کنه!! یکی میگه متد! یکی میگه تابع!! یکی میگه روال!!! یگی میگه رویه!!! یکی میگه بازگشتی!:گیج::افسرده:
یکی به ما بگه!! فرق اینها با هم چی هست!!! من این را بفهمم دیگه تمام هست!!!

سپاس
تابع : موجودیت مستقل داره و میتونه خارج کلاس تعریف بشه و بکار بره ؛






//function main in C
void main()
{
int a,b,c;
a=5;
b=6;
c=a+b;
printf("Sum is : %d",c);
}


متد : موجودیت مستقل نداره و همیشه داخل کلاس تعریف میشه ؛ مثلا برای تعریف متد main توسی شارپ باید اونو داخل کلاس بذاری ؛ چون سی شارپ مثل سی و پاسکال یه زبان ساختاری نیست که تابع براش معنی موجودیت مستقل داشته باشه . متد ها د زبانهای شی گرا مثل جاوا و سی شارپ تعریف میشن . متد ها بااستفاده از یک آبجکت یا نمونه صدا زده میشن و روی یک شی یا نمونه دیگه یه سری عملیات رو انجام میدن . مثل :






//method sum in C#‎‎‎‎
class demo
{
int a,b,c;
public void sum()
{
a=5;
b=6;
c=a+b;
Console.WriteLine("Sum is : {0}",c);
}
}



روال : توابعی که به ما یه مقدار رو برنمیگردونن و صرفا جهت اجرای یه سری دستوات از اونها استفاده میشه ؛ کلمه پروسیجر بصورت اختصاری در پاسکال دیدم که استفاده میشه

بازگشتی یا ریکرسیو : توابعی رو میگن که درون خودشون ، خودشون رو باز صدا میزنن

همین :لبخندساده:

lion.heart
سه شنبه 11 آذر 1393, 02:34 صبح
سلام

توابع نماد انکپسولیشن (Encapsulation) هستند و انکپسولیشن که یکی از شرایط زبان های شی گرا است .وقتی کدی نوشتیم مثلا x+13 و از این کد در چند جای مختلف استفاده کردیم پس مجبوریم در همه جا فرمول رو بنویسیم - اگر بخواهیم یک تغییر اعمال کنیم مجبوریم همه ی آنها را تغییر دهیم

ولی اینبار میایم یک تابع تعریف میکنیم مثال سادشو میزنم من یک فیلم تو کامپیوترم و در درایو D دارم حالا میام از این فیلم هزاران shortcut میسازم و روی هر یک از این shortcut ها کلیک کنم فایل اصلی از درایو D باز میشه!

حال توابع هم مثل اینه من یک تابع تعریف میکنم و یک اسم براش میزارم(کپسوله میکنم، چرا میگیم کپسولیشن؟! چونکه مثل یک کپسول گاز که دارای مواد است که محتوای آن نمایش داده نمی شود و با زدن یک کلیک موادش مورد استفاده میشود)

مثال :


static void Z(int x)

{

console.writeLine(x);

}
این یک تابع است که یک مقدار صحیح (x) که به اون پارامتر گفته مبشود را دریافت میکند و آن را در کنسول نمایش میدهد.
حال هرجایی لازم باشد که من مقداری عدد صحیح را نمایش دهم فقط می نویسم (مقداری صحیح که میخواهم نمایش داده شود)Z یا مثلا
; int e
Z(e); //hala e be onvane adade sahih ke be an arguman migim be tabee Z ersal mishe va meghdare e dar x gharar migire va dar console nemayesh dade mishe

یک تابع میتواند پارامتر بپذیر یا نپذیرد اختیار دست ماست(با توجه به کاری که انجام میدهم)
توابع حتما داحل کلاس(Class) تعریف میشود
یک تابع حتما دارای بلاک { } است
توابع void خروجی ندارند منظور از خروجی نه اینکه نمایش داده نمیشوند .. خروجی یعنی اینکه مقداری را پس از انجام عملیات به خود برنامه نویس تحویل میدهد تا روی آن عملیات دیگری انجام دهید مثال : یک تابع که عددی میگیرد و آن را در 5 ضرب میکند و دوباره به برنامه نویس میدهد حال برنامه نویس در استفاده از آن باز حق انتخاب دارد
در توابعی که دارای خروجی هستند یعنی void نیستند باید بعد از کلمه static نوع خروجی را مشخص کنیم

کاربرد return
return در توابع Void فقط از تابع خارج میشود، همین و الزامی برای استفاده نیست
ولی در توابع دارای خروجی استفاده از آن الزامی است چون یک مقدار را بر میگرداند و همچنین از تابع خارج میشود



متد ها :
متد معنی لغویش یعنی روش
و خودش یک تابع است
ولی وقتی به یک تابع میگیم متد که داخل کلاسی باشد که تابع Main در آن نیست(منظور همان کلاسی که اولین بار پروژه ای را ایجاد میکنیم و دارای یک تابع Main است)
و نیاز های عملیاتی یک موجودیت یا Entity را انجام میدهد مثلا ما کلاسی ساخته ایم به اسم دانشجو و این کلاس دارای متدی است برای انتخاب واحد ---


همه ی توابع(متد خود تابع است) داخل کلاس هاس تعریف میشوند و خارج از آن کلا غلط است .
کلاس ها همگی داخل یک Namespace تعریف میشوند و خارج از آن غلط است
متغییر ها حتما داخل توابع تعریف میشوند و اگر متغییری در داخل کلاس و خارج از تابع تعریف شود به آن فیلد (Field) گفته میشود .. یا متغییر global


توبع بازگشتی :
توابع بازگشتی روشی است برای حل مسائل بازگشتی
چرا میگیم بازگشتی چون با هر بار انجام عملیات داخل تابع، تابع خودش را دوباره صدا میزند-- پس دارای Return هست -- بنابر مطالبی که در بالا گفتم چون دارای Retuen هست پس یک تابع دارای خروجی است و به هیچ وجه تابع Void نیست
خیلی کم ازش استفاده میشه .. فقط در جاهایی که پیچدگی حل مسئله با روش دیگر بسیار سخت باشد

rasoolf
سه شنبه 11 آذر 1393, 17:07 عصر
تعریف تابع : ریز برنامه ای(تکه کدی) که دارای یک نام است و می تواند یک یا چند ورودی بگیرد و یک خروجی بر میگرداند;این جمله یعنی یک تابع میتونه ورودی نداشته باشه و خروجی هم نده فقط یک سری کد را اجرا کنه.
تعریف procedure: ریز برنامه ای(تکه کدی) که دارای یک نام است و می تواند یک یا چند ورودی بگیرد ولی خروجی ندارد.
حال در #C تابع و متد هردو یکی هستند که در بحث شی گرایی به آن متد گفته می شود و در بحث برنامه نویسی رویداد گرا به آن تابع گفته می شود. همچنین در #C از نام procedure دیگر استفاده نمی شه. البته در این مورد میان علما همیشه اختلاف نظر هست:قهقهه::قهقهه::قهقهه::قهق ه: