اشاره گر به تابع - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

اشاره گر به تابع

+5 امتیاز

سلام؛ توی یه کتاب C++ (که به طور خیلی اتفاقی کتاب دایتل و دایتل هست)، یه فصلی هست با عنوان اشاره گر به تابع. (که من هر چه قدر خوندم، نفهمیدم)

می خواستم اگر کسی در مورد این نوع اشاره گر اطلاعی داره، این جا به اشتراک بذاره تا ما هم استفاده کنیم (لطفا به زبان ساده)

سوال شده فروردین 25, 1393  بوسیله ی MaGaroos (امتیاز 658)   11 18 36
دوباره تگ گذاری شد فروردین 27, 1393 بوسیله ی BlueBlade

1 پاسخ

+6 امتیاز
 
بهترین پاسخ

شما فرض کن یک تابع داری که برای مرتب سازی نوشتی

میدونی که مرتب سازی رو به هر شکلی میشه تفسیر کرد مثلا از کوچیک به بزرگ - از بزرگ به کوچیک - 1 در میون و ...

مثلا مرتب سازی حبابی رو در نظر بگیرید :

void bubble_sort1(int *a,int size_)//nozooli
{
    for(int i=0;i<size_;i++)
    {
        for(int j=0;j<size_-1;j++)
        {
            if(a[j]<a[j+1])
            {
                int temp=a[j];
                a[j]=a[j+1];
                a[j+1]=temp;
            }
        }
    }
}
void bubble_sort2(int *a,int size_)//soodi
{
    for(int i=0;i<size_;i++)
    {
        for(int j=0;j<size_-1;j++)
        {
            if(a[j]>a[j+1])
            {
                int temp=a[j];
                a[j]=a[j+1];
                a[j+1]=temp;
            }
        }
    }
}

//توابع بیشتر !...

الان ما برای صعودی و نزولی یک کد نوشتیم فقط فرقشون اینه که شرط if فرق می کنه  حالا اگر به هر دلیلی داخل یکی از این توابع اشتباه کرده باشیم مجبوریم که هر n تا تابع رو عوض کنیم و این که اگر قرار باشه همین مرتب سازی رو به یک شکل دیگه انجام بدیم کد قابل استفاده مجدد نیست و باید یک تابع دیگه رو دوباره مجددا بنویسیم (دلایلی که کد تکراری خوب نیست)

توی c و c++  برای این که این جور مواقع کد بهتری بنویسیم از function pointer استفاده می کنن

به جای n تا تابع بالا یک تابع می نویسیم به این شکل :

void  bubble_sort(int *a,int size_,bool (*comp)(int a,int b))
{
    for(int i=0;i<size_;i++)
    {
        for(int j=0;j<size_-1;j++)
        {
            if(comp(a[j],a[j+1]))
            {
                int temp=a[j];
                a[j]=a[j+1];
                a[j+1]=temp;
            }
        }
    }
}

 

و زمان استفاده نحوه چک کردن رو خودمون به تابع اعلام می کنیم :

#include <iostream>

using namespace std;

void  bubble_sort(int *a,int size_,bool (*comp)(int a,int b))
{
    for(int i=0;i<size_;i++)
    {
        for(int j=0;j<size_-1;j++)
        {
            if(comp(a[j],a[j+1]))
            {
                int temp=a[j];
                a[j]=a[j+1];
                a[j+1]=temp;
            }
        }
    }
}
bool compare1(int a,int b){
    return a<b;
}
bool compare2(int a,int b){
    return a>b;
}


int main()
{
    int a[5]={6,2,7,1,3};
    bubble_sort(a,5,compare1);
    for(auto i:a)
        cout<<i<<"\n";

    cout<<"____\n\n";

    bubble_sort(a,5,compare2);
    for(auto i:a)
        cout<<i<<"\n";

}

 

از c++11 به بعد میشه به جای تعریف تابع بصورت جدا از lambda هم استفاده کرد :

مثلا :

    bubble_sort(a,5,[](int a,int b){return a<b;});

 

الان تابع بالا رو یکبار نوشتیم و به حالت های متفاوتی ازش میشه استفاده کرد .

البته هنوز تابع مرتب سازی ما یک مشکل دیگه هم داره  این که فقط برای آرایه از نوع int کار می کنه برای این که برای انواع داده متفاوت کار کنه از template میشه استفاده کرد یا مثل std::sort در c++ از iterator ها کمک گرفت .

پاسخ داده شده فروردین 26, 1393 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
ویرایش شده مرداد 20, 1393 بوسیله ی BlueBlade
فکر کنم تابع sort1 به صورت نزولی مرتب می کند و sort2 به صورت صعودی
آره ممنون برعکس نوشته بودم
در خط
(bubble_sort(a,5,compare1
چرا تابع compare1 آرگومان ورودی نگرفته است؟ همچنین منظور از این خط return a<b; چیست؟ یعنی اگر a کوچکتر از b باشد آنگاه a را برمی گرداند و اگر نباشد مقداری بر نمی گرداند؟
در مورد سوال اول
compare1 بجای پارامتر سوم
 void  bubble_sort(int *a,int size_,bool (*comp)(int a,int b))

قرار میگیره بعد ما از داخل تابع bubble_sort به این شکل صداش میزنیم
if(comp(a[j],a[j+1]))

یعنی شما تابع رو بصورت یک متغیر در نظیر بگیر که این جا ارسال شده  به تابع بعد داخل تابع ازش استفاده شده.
در مورد سوال دوم  نه به این معنی که گفتید نیست .
return a<b

اول مقدار a<b را حساب می کنه که یا true هست یا false بعد این مقدار برگشت داده میشه
یعنی اگر a<b باشه true برگشت داده میشه در غیر این صورت false
معادله کد زیره :
bool res=a<b ;
return res;
به نوع برگشتی تابع اصلا دقت نکرده بودم که از نوع بولین هست. ممنون
...