ساختار و تابع در برنامه نویسی C

در این آموزش به کمک مثال با نحوه ارسال متغیر ساختار به عنوان آرگومان به تابع و همچنین بازگشت ساختار از تابع در برنامه نویسی C آشنا خواهید شد.
مشابه متغیرهای داخلی می توانید متغیرهای ساختار را نیز به یک تابع ارسال کنید.
ترکیب ساختارها (Structures) و توابع (Functions)
در زبان C، توابع به عنوان «موتورهای پردازشی و عملیاتی» و ساختارها به عنوان «بستههای اطلاعاتی» عمل میکنند. ترکیب این دو مفهوم، پایه و اساس ساخت برنامههای بزرگ، تمیز و ماژولار (بخشبندی شده) است.
نحوه تعامل ساختارها و توابع
۱. ارسال ساختار به عنوان ورودی تابع زمانی که یک تابع برای انجام محاسبات به اطلاعات یک ساختار نیاز دارد، برنامهنویس میتواند این اطلاعات را به دو روش در اختیار تابع قرار دهد:
-
ارسال کپی کامل (Pass by Value): در این حالت، یک کپی دقیق و کامل از تمام محتویات ساختار در حافظه ساخته شده و به تابع تحویل داده میشود. این روش بسیار امن است (زیرا تابع نمیتواند اطلاعات اصلی را خراب کند)، اما برای ساختارهای حجیم به شدت کُند و مصرفکننده حافظه است.
-
ارسال آدرس (Pass by Reference/Pointer): در این حالت، به جای کپی کردن کل بسته، تنها «آدرس» محل قرارگیری ساختار در حافظه (از طریق اشارهگرها) به تابع داده میشود. این روش فوقالعاده سریع و بهینه است، اما به تابع اجازه میدهد که مستقیماً روی دادههای اصلی تغییرات ایجاد کند.
۲. استفاده از ساختار به عنوان خروجی تابع یکی از محدودیتهای بزرگ توابع در زبان C این است که در حالت عادی فقط میتوانند یک مقدار (مثلاً فقط یک عدد یا یک کاراکتر) را به عنوان نتیجه نهایی برگردانند. اما اگر برنامهنویس بخواهد یک تابع پس از پایان محاسبات، دهها نتیجه مختلف را برگرداند، میتواند تمام آن نتایج را درون یک «ساختار» بستهبندی کند و سپس کل آن بسته واحد را به عنوان خروجیِ تابع بازگرداند. این کار محدودیت بازگرداندن مقادیر چندگانه را به طور کامل دور میزند.
هدف و فلسفه استفاده مشترک
زبان C فاقد امکانات «برنامهنویسی شیگرا» (مانند کلاسها در C++ یا جاوا) است. با این حال، برنامهنویسان حرفهای با ترکیب ساختارها و توابع، این خلأ را پر میکنند.
آنها تمام اطلاعات و ویژگیهای مرتبط با یک موجودیت را درون یک ساختار (به عنوان دادهها) قرار میدهند و سپس توابعی اختصاصی مینویسند که وظیفهشان فقط کار کردن روی آن ساختار خاص (به عنوان رفتارها و عملیات) است. این هماهنگی، نزدیکترین معماری ممکن به منطق شیگرایی در یک زبان کاملاً رویهای (Procedural) محسوب میشود و کدهای پیچیده را به شدت خوانا و قابل مدیریت میکند.
ارسال ساختار به تابع
توصیه می کنیم قبل از یادگیری شیوه ارسال ساختار به تابع، آموزش های زیر را مرور کنید.
- ساختارها در برنامه نویسی C
- تابع در برنامه نویسی C
- تابع تعریف شده توسط کاربر در C
ارسال ساختارها به تابع:
#include
struct student {
char name[50];
int age;
};
// نمونه اولیه تابع
void display(struct student s);
int main() {
struct student s1;
printf(“Enter name: “);
// خواندن رشته ورودی از کاربر تا زمانیکه کاربر اینتر بزند
// کاراکتر اینتر است n
scanf(“%[^n]%*c”, s1.name);
printf(“Enter age: “);
scanf(“%d”, &s1.age);
display(s1); // ارسال ساختار به عنوان آرگومان
return 0;
}
void display(struct student s) {
printf(“nDisplaying informationn”);
printf(“Name: %s”, s.name);
printf(“nAge: %d”, s.age);
}
خروجی
Enter name: Bond
Enter age: 13
Displaying information
Name: Bond
Age: 13
در اینجا، متغیر ساختار s1 از نوع struct student تعریف شده است. متغیر با دستور ;(display(s1 به تابع ()display ارسال میشود.
بازگشت ساختار از تابع
در برنامه زیر نحوه بازگشت ساختار از تابع نوشته شده است:
#include
struct student
{
char name[50];
int age;
};
// نمونه اولیه تابع
struct student getInformation();
int main()
{
struct student s;
s = getInformation();
printf(“nDisplaying informationn”);
printf(“Name: %s”, s.name);
printf(“nRoll: %d”, s.age);
return 0;
}
struct student getInformation()
{
struct student s1;
printf(“Enter name: “);
scanf (“%[^n]%*c”, s1.name);
printf(“Enter age: “);
scanf(“%d”, &s1.age);
return s1;
}
در اینجا، تابع ()getInformation با دستور ;()s = getInformation فراخوانی می شود. این تابع ساختاری از نوع struct student برمی گرداند. ساختار برگشتی از ابن تابع در تابع ()main نمایش داده می شود.
توجه داشته باشید که نوع متغیری هم که مقدار بازگشتی تابع در آن ذخیره می شود باید از نوع struct student است.
ارسال ساختار با ارجاع
علاوه بر این با استفاده از ارجاع نیز می توانید ساختار را به تابع ارسال کنید (مشابه با ارسال متغیرها از نوع داخلی). پیشنهاد میکنیم آموزش ارسال با ارجاع را مطالعه کنید.
در ارسال با ارجاع، آدرس متغیر ساختار به تابع ارسال می شود.
#include
typedef struct Complex
{
float real;
float imag;
} complex;
void addNumbers(complex c1, complex c2, complex *result);
int main()
{
complex c1, c2, result;
printf(“For first number,n”);
printf(“Enter real part: “);
scanf(“%f”, &c1.real);
printf(“Enter imaginary part: “);
scanf(“%f”, &c1.imag);
printf(“For second number, n”);
printf(“Enter real part: “);
scanf(“%f”, &c2.real);
printf(“Enter imaginary part: “);
scanf(“%f”, &c2.imag);
addNumbers(c1, c2, &result);
printf(“nresult.real = %.1fn”, result.real);
printf(“result.imag = %.1f”, result.imag);
return 0;
}
void addNumbers(complex c1, complex c2, complex *result)
{
result->real = c1.real + c2.real;
result->imag = c1.imag + c2.imag;
}
خروجی
For first number,
Enter real part: 1.1
Enter imaginary part: -2.4
For second number,
Enter real part: 3.4
Enter imaginary part: -3.2
result.real = 4.5
result.imag = -5.6
در این برنامه، سه متغیر ساختار c1 ، c2 و آدرس result به تابع ()addNumbers ارسال می شود. result با ارجاع ارسال می شود.
با تغییر متغیر result در داخل تابع، متغیر result در تابع ()main نیز متناسب با آن تغییر می کند.
