سلام!

در این جلسه قرار است به یک مبحث بسیار کاربردی بپردازیم. فرض کنید که به شما گفته اند که دو تابع مرتب سازی بنویسید؛ یک تابع یک آرایه از int به عنوان ورودی بگیرد و به صورت صعودی مرتب کند و تابع دیگر یک آرایه از int گرفته و آن را به صورت نزولی مرتب کند. کار بهتر این است که شما یک تابع بنویسید که یک تابع (برای تشخیص وضعیت اعداد نسبت به یک دیگر) را نیز به عنوان ورودی بگیرد و سپس آن را بر اساس آن تابع مرتب کند.

برای این که منظورم را بهتر متوجه شوید، بهتر است ابتدا با روش استفاده از یک تابع به عنوان ورودی یک تابع دیگر آشنا شوید، برای این کار می نویسیم:

void NAME(OUTPUT_TYPE (*NAME) (INPUTS) );

مثلا اگر بخواهید به تابعی به نام sort، تابعی ورودی بدهید که نام آن در تابع sort مثلا compare باشد باید بنویسید:

void sort( bool (*compare) (int a, int b) );

برای این که با کاربرد این قابلیت بیشتر آشنا شوید، می توانید از مثال زیر کمک بگیرید؛

#include <iostream>

using namespace std;

bool ascending(int a, int b){
    return a > b; //returns true if a > b
}

bool descending(int a, int b){
    return a < b; //returns true if a < b
}

int tashkhis(int a, int b, bool (*compare) (int, int)){
    if (compare(a, b))
        return a;
    return b;
}

int main(){
    cout << tashkhis(4, 32, ascending) << endl;
    return 0;
}

کد بالا شامل یک تابع است که دو عدد ورودی می گیرد و سپس روش مقایسه ی آن ها را نیز ورودی می گیرد. بعد از آن با کمک این روش، خروجی می دهد.

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

1. یک تابع بنویسید که دو عدد به علاوه ی یک تابع (که روش مقایسه ی دو عدد است) به عنوان ورودی بگیرد و دو عدد را بر اساس تابع با هم مقایسه کند. نتیجه را چاپ کنید.

2. یک تابع مرتب سازی بنویسید که بر اساس روش مقایسه (که آن هم ورودی تابع مرتب سازی است) اعداد یک آرایه ی n تایی را مرتب کند.

پاسخ این تمرین ها در آینده ی نزدیک بر روی وبلاگ قرار خواهد گرفت. سعی کنید بدون این که پاسخ ها را نگاه کنید، تمرین ها را حل کنید.

موفق باشید!