الانتقال إلى المحتوى الرئيسي

كيف يمكنني نقل هيكل إلى وظيفة في ج?

الهياكل هي واحدة من المكونات الرئيسية للغة البرمجة ج. إنها تسمح لك بدمج عدة متغيرات من أنواع مختلفة في وحدة بيانات واحدة. ومع ذلك ، عند العمل مع الهياكل ، فإن السؤال الذي يطرح نفسه هو نقلها إلى وظائف. كيف يمكنني نقل هيكل إلى وظيفة في ج وكيف أعمل معها داخل وظيفة?

يمكن استخدام نهجين مختلفين لنقل هيكل إلى دالة في ج. النهج الأول هو نقل الهيكل حسب القيمة. هذا يعني أنه عند تمرير بنية إلى دالة ، تتلقى الوظيفة نسخة من البنية كمدخل ، ولا تؤثر جميع التغييرات التي تحدث داخل الوظيفة على البنية الأصلية التي تم تمريرها. هذا النهج مفيد إذا كنت بحاجة إلى الحفاظ على الحالة الأولية للهيكل.

النهج الثاني هو تمرير الهيكل عن طريق المؤشر. في هذه الحالة ، عند تمرير الهيكل إلى الوظيفة ، تتلقى الوظيفة مؤشر إدخال إلى الهيكل ، وليس الهيكل نفسه. يتيح لك ذلك تغيير محتويات الهيكل داخل الوظيفة والتأثير على الهيكل الأصلي الذي تم تمريره. هذا النهج مفيد إذا كنت بحاجة إلى تغيير الهيكل الأصلي وتمرير نسخته المعدلة مرة أخرى إلى وظيفة الاتصال.

مثال على تمرير هيكل حسب المؤشر:

تعديل باطل_العمود (الهيكل س *بتر) {

بتر - > القيمة = 42;

}

كثافة العمليات الرئيسية () {

مثال البنية;

مثال.القيمة = 0;

التعديل (&مثال);

برينتف ("٪د

"،على سبيل المثال.القيمة) ؛ / / المخرجات 42

العودة 0;

}

بغض النظر عن الطريقة المختارة لتمرير بنية إلى دالة ، من المهم أن تتذكر أن الهياكل في ج هي أنواع بيانات ، لذلك عند الإعلان عن وسيطات الوظيفة أو قيم الإرجاع ، يجب عليك تحديد نوع بيانات الهيكل.

  1. تحديد وإعلان هيكل
  2. تمرير هيكل حسب القيمة
  3. تمرير الهيكل بالرجوع إليه
  4. إرجاع هيكل من وظيفة
  5. أمثلة على استخدام تمرير بنية إلى وظيفة
  6. سؤال وجواب
  7. كيف يمكنني نقل هيكل إلى وظيفة في ج?
  8. هل من الممكن نقل الهياكل إلى وظيفة بالرجوع إليها?
  9. ما هو نوع البيانات التي يمكن استخدامها لهيكل في ج?
  10. هل من الممكن أن تعلن هياكل أخرى في هيكل?

تحديد وإعلان هيكل

في لغة البرمجة سي ، من الممكن إنشاء أنواع بيانات مخصصة باستخدام الهياكل. الهيكل عبارة عن مجموعة من أنواع البيانات المختلفة مجتمعة في متغير واحد.

يتم الإعلان عن البنية باستخدام الكلمة الأساسية للهيكل ويمكن أن تحتوي على حقل واحد أو أكثر. كل حقل له نوع البيانات الخاصة به والاسم.

مثال على تحديد هيكل يمثل معلومات عن الطالب:

الهيكل الطالب {

معرف كثافة العمليات;

اسم الحرف [50];

المعدل التراكمي العائم;

};

في المثال أعلاه ، أعلنا بنية تسمى طالب ، والتي تحتوي على ثلاثة حقول: معرف نوع كثافة العمليات, اسم نوع شار [50], ومعدل تراكمي من النوع العائم. يتم الإعلان عن الهيكل خارج أي وظيفة ، عادة في بداية البرنامج.

بعد تحديد الهيكل ، يمكننا إنشاء متغير من هذا النوع واستخدامه لتخزين البيانات:

هيكل الطالب الطلاب1;

student1.id = 1;

ستركبي(student1.name ، "إيفانوف إيفان");

طالب1.المعدل التراكمي = 4.5;

في هذا المثال ، أنشأنا متغير طالب 1 من نوع الطالب والقيم المعينة له لكل حقل.

يمكن استخدام الهياكل لإنشاء أنواع بيانات أكثر تعقيدا يمكن تمريرها إلى وظائف أو استخدامها في أجزاء أخرى من البرنامج. أنها توفر وسيلة مريحة لتنظيم البيانات وتحسين قراءة التعليمات البرمجية.

تمرير هيكل حسب القيمة

في ال لغة البرمجة ج ، يمكن تمرير الهياكل إلى وظائف حسب القيمة. هذا يعني أنه عند استدعاء دالة ، يتم إنشاء نسخة مؤقتة من الهيكل ، والتي يتم استخدامها بعد ذلك داخل الوظيفة. عند إنهاء الوظيفة ، يتم إتلاف النسخة المؤقتة ، ويظل الهيكل الأساسي دون تغيير.

عندما يتم تمرير بنية حسب القيمة ، يتم نسخ كافة حقول البنية إلى نسخة مؤقتة. يمكن أن يكون هذا غير فعال ويستهلك المزيد من الذاكرة ، خاصة إذا كانت البنية كبيرة.

يمكن أن يكون تمرير الهيكل حسب القيمة مفيدا عندما لا تحتاج إلى تغيير الهيكل الأساسي وتحتاج إلى تجنب الآثار الجانبية.

على سبيل المثال ، ضع في اعتبارك بنية "الشخص" ، التي تحتوي على حقلي "الاسم" و " العمر:

هيكل "الشخص"
الميدانالنوع
الاسمشار [50]
العمركثافة العمليات

لتمرير بنية "الشخص" حسب القيمة إلى دالة ، يجب أن تعلن عن دالة بمعلمة من نوع " الشخص:

طباعة باطلة (شخص ص) {

برينتف ("الاسم: ٪ ق

", p.name);

برينتف ("العمر: ٪ د

"،ص.العمر);

}

الآن يمكنك استدعاء وظيفة "برينتبرسون" وتمرير هيكل "الشخص" إليها:

شخص ص;

ستركبي(p.name ، "جون");

ص. العمر = 25;

شخص الطباعة (ع);

ستعرض نتيجة تنفيذ وظيفة "برينتبرسون" معلومات حول بنية "الشخص" على الشاشة:

الاسم: جون

العمر: 25

يمكنك أن ترى أن قيم حقول بنية" الشخص "تم نسخها إلى نسخة مؤقتة ، والتي تم استخدامها داخل وظيفة" برينتبرسون". ظل الهيكل الأساسي لـ " ف " دون تغيير.

وبالتالي ، يمكن أن يكون تمرير هيكل حسب القيمة إلى وظيفة أداة مفيدة للعمل مع البيانات بأمان.

تمرير الهيكل بالرجوع إليه

في ال لغة البرمجة ج ، يمكن تمرير الهياكل إلى دالة كمعلمة حسب القيمة أو بالرجوع إليها. يعني المرور بالقيمة أنه يتم إنشاء نسخة من البنية ، والتي يتم تمريرها إلى الوظيفة. أثناء المرور بالرجوع يعني تمرير عنوان الهيكل ، مما يسمح لك بتغييره مباشرة في الوظيفة.

لتمرير بنية بالرجوع إليها ، يجب عليك استخدام المؤشرات. يحتوي مؤشر البنية على عنوان الذاكرة حيث توجد البنية نفسها. في الوظيفة ، يمكننا تغيير قيم حقول الهيكل بالرجوع إليها بواسطة المؤشر.

مثال على تمرير هيكل بالرجوع إليه:

# تشمل

//

تعريف الهيكل شخص الهيكل {

اسم الحرف [50];

كثافة العمليات العمر;

};

// الوظيفة التي تقبل المؤشر إلى بنية كمعلمة

اسم تغيير الفراغ (شخص الهيكل *شخص) {

ستركبي (شخص- > اسم ، "اسم جديد");

}

كثافة العمليات الرئيسية () {

// إنشاء وتهيئة

هيكل الشخص هيكل الشخص;

ستركبي(person.name ، "إيفان");

شخص.العمر = 25;

// استدعاء دالة عن طريق تمرير مؤشر إلى

هيكل تغيير الاسم (والشخص);

// إخراج الاسم الذي تم تغييره

برينتف ("الاسم الجديد: ٪ ق

", person.name );

العودة 0;

}

في هذا المثال ، نقوم بإنشاء بنية الشخص وتهيئة حقوله. ثم نسمي دالة اسم التغيير ، ونمررها بمؤشر إلى بنية الشخص. داخل الوظيفة ، نقوم بتغيير قيمة حقل الاسم باستخدام - > المشغل ، الذي يلغي المؤشر إلى الهيكل ويسمح بالوصول إلى حقوله. ونتيجة لذلك ، فإن الاسم الذي تم تغييره في الوظيفة الرئيسية هو الإخراج.

وبالتالي ، فإن تمرير الهيكل بالرجوع يسمح لك بتغيير قيمه مباشرة في وظيفة ، مما يجعل النقل أكثر كفاءة وملاءمة للاستخدام.

إرجاع هيكل من وظيفة

في لغة البرمجة ، ج يمكن إرجاع الهياكل من الوظائف. يتيح لك ذلك إنشاء وظائف يمكنها إرجاع بيانات أكثر تعقيدا مجمعة في هياكل.

لإرجاع بنية من دالة ، يجب عليك تحديد نوع الوظيفة كهيكل. على سبيل المثال ، إذا كان لدينا بنية شخص تحتوي على حقول الاسم والعمر:

اكتببنية الدفاع {

اسم الحرف [50];

كثافة العمليات العمر;

} شخص;

يمكننا تحديد وظيفة ستعيد بنية الشخص:

شخص يخلق شخص () {

شخص ص;

ستركبي(p.name ، "جون");

ص. العمر = 30;

عودة ص;

}

في هذه الوظيفة ، نقوم بإنشاء ملف ص متغير من النوع شخص وتهيئته بالقيم " جون " و 30. ثم نعود هذا المتغير.

الآن يمكننا الحصول على هذا الهيكل من الوظيفة:

شخص ع = كريتيبرسون();

برينتف ("الاسم: ٪ ق

", p.name);

برينتف ("العمر: ٪ د

"،ص.العمر);

خاتمة:

الاسم: جون

العمر: 30

وبالتالي ، يمكننا إعادة الهيكل من الوظيفة والوصول إلى حقولها باستخدام"."المشغل. هذا يسمح لنا لجعل وظائف أكثر مرونة وحدات ، وأيضا يجعل من الأسهل للعمل مع هياكل البيانات أكثر تعقيدا.

أمثلة على استخدام تمرير بنية إلى وظيفة

مثال 1:

В данном примере мы создаем структуру с полями «имя» и «возраст» и передаем ее в функцию, которая выводит значения этих полей на экран.

Код:

#include

struct Person {

char name[50];

int age;

};

void printPerson(struct Person p) {

printf("Имя: %s

", p.name);

printf("Возраст: %d

", p.age);

}

int main() {

struct Person p;

strcpy(p.name, "Иван");

p.age = 25;

printPerson(p);

return 0;

}

Пример 2:

В этом примере структура «Point» содержит координаты точке на плоскости. Функция «translate» принимает структуру «Point» и сдвигает ее по x и y на заданные значения. Затем результат выводится на экран.

Код:

#include

struct Point {

int x;

int y;

};

void translate(struct Point *p, int dx, int dy) {

p->x += dx;

p->y += dy;

}

int main() {

struct Point p;

p.x = 10;

p.y = 20;

translate(&p, 5, -3);

printf("x: %d

", p.x);

printf("y: %d

", p.y);

العودة 0;

}

المثال 3:

في هذا المثال ، يمثل هيكل "المستطيل "مستطيلا مع الجانبين أ و ب. تأخذ وظيفة" جيتاريا "بنية" المستطيل " وتعيد مساحة المستطيل.

كود:

# تشمل

مستطيل الهيكل {

الباحث أ;

إنت ب;

};

إنت جيتاريا (هيكل مستطيل ص) {

العودة ر. أ * ر. ب;

}

كثافة العمليات الرئيسية () {

هيكل مستطيل ص;

ص. أ = 5;

ص. ب = 10;

إنت منطقة = جيتاريا (ص);

برينتف ("منطقة المستطيل: ٪ د

"،المنطقة);

العودة 0;

}

في هذه الأمثلة ، يتم استخدام الهياكل كوسائط للوظائف لمعالجة البيانات وتمرير النتائج مرة أخرى إلى البرنامج الرئيسي.

سؤال وجواب

كيف يمكنني نقل هيكل إلى وظيفة في ج?

لتمرير بنية إلى دالة في ج ، تحتاج إلى إعلان دالة تأخذ وسيطة من نوع الهيكل. على سبيل المثال ، إذا كان لديك بنية تسمى "شخص" وتريد تمريرها إلى وظيفة "برينتبرسون" ، فيمكنك إعلان الوظيفة على النحو التالي: "برينتبرسون باطل(شخص ص)". عند استدعاء وظيفة" برينتبرسون "، يمكنك تمرير مثيل من بنية" الشخص " إليها. داخل الوظيفة ، يمكنك الوصول إلى حقول الهيكل باستخدام"."المشغل. على سبيل المثال ، " ص.الاسم "سيشير إلى حقل" الاسم "في بنية" الشخص".

هل من الممكن لتمرير الهياكل إلى وظيفة بالرجوع?

نعم ، يمكنك تمرير الهياكل إلى وظائف بالرجوع إليها. للقيام بذلك ، قم بتعريف دالة تقبل مؤشر إلى بنية. على سبيل المثال ، إذا كان لديك هيكل يسمى "سيارة" وتريد تمريره إلى وظيفة "برينتكار" بالرجوع إليها ، يمكنك إعلان الوظيفة على النحو التالي: "باطل برينتكار(سيارة *ج)". عند استدعاء وظيفة "برينتكار" ، يمكنك تمرير مؤشر إلى هيكل" سيارة " لذلك. داخل الوظيفة ، يمكنك الوصول إلى حقول الهيكل باستخدام عامل التشغيل" ->". على سبيل المثال ، سيشير "ج->النموذج" إلى حقل "النموذج" لهيكل "السيارة".

ما هو نوع البيانات التي يمكن استخدامها لهيكل في ج?

في ج ، يمكنك استخدام أنواع مختلفة من البيانات للهيكل ، حسب احتياجاتك. يمكنك استخدام أنواع البيانات البدائية مثل إنت ، تعويم ، شار ، وكذلك النقابات ومؤشرات إلى الهياكل الأخرى. بالإضافة إلى ذلك ، يمكنك استخدام أنواع البيانات المخصصة الخاصة بك داخل الهيكل. فمثلا, يمكنك أن تعلن بنية "شخص" يحتوي على حقل "اسم" من نوع شار[] وحقل "العمر" من نوع كثافة العمليات.

هل من الممكن أن تعلن هياكل أخرى في هيكل?

نعم ، يمكنك الإعلان عن الهياكل الأخرى داخل الهيكل. وهذا ما يسمى الهياكل المتداخلة. على سبيل المثال ، يمكنك الإعلان عن هيكل "سيارة" يحتوي على حقل "محرك" من نوع هيكل "المحرك". يمكن أن تكون الهياكل المتداخلة مفيدة جدا عندما تريد تنظيم البيانات والرمز في مجموعات منطقية.