C++: تمرين: الدوال الشامل
آخر تحديث: 2026-08-26
الدروس السابقة غطت جوانب مختلفة من الدوال بشكل منفصل، لكن في البرامج الحقيقية تُستخدم معًا.
في هذا الدرس، سنتدرب على جعل الدوال تعمل معًا من خلال عدة أمثلة شاملة.
1. مثال 1: مكتبة أدوات رياضية بسيطة
(1) 1.1 تحليل المتطلبات
سنبنى مكتبة أدوات رياضية بالدوال التالية:
int add(int a, int b)— الجمعint subtract(int a, int b)— الطرحint multiply(int a, int b)— الضربdouble divide(int a, int b)— القسمة (تُرجع عدد عائم)int power(int base, int exp)— الأسbool isPrime(int n)— التحقق من الأعداد الأولية
▶ مثال 1: مكتبة الأدوات الرياضية (الصعوبة ⭐⭐)
#include <iostream>
#include <cmath>
// تصاريح الدوال
int add(int a, int b);
int subtract(int a, int b);
int multiply(int a, int b);
double divide(int a, int b);
int power(int base, int exp);
bool isPrime(int n);
int main() {
int x = 10, y = 3;
std::cout << "x + y = " << add(x, y) << std::endl;
std::cout << "x - y = " << subtract(x, y) << std::endl;
std::cout << "x * y = " << multiply(x, y) << std::endl;
std::cout << "x / y = " << divide(x, y) << std::endl;
std::cout << "x ^ y = " << power(x, y) << std::endl;
std::cout << "Is x prime? " << (isPrime(x) ? "Yes" : "No") << std::endl;
return 0;
}
// تعريفات الدوال
int add(int a, int b) {
return a + b;
}
int subtract(int a, int b) {
return a - b;
}
int multiply(int a, int b) {
return a * b;
}
double divide(int a, int b) {
if (b == 0) {
return 0.0;
}
return static_cast<double>(a) / b;
}
int power(int base, int exp) {
if (exp < 0) {
return 0; // مبسط: الأسس السالبة غير مدعومة
}
int result = 1;
for (int i = 0; i < exp; i++) {
result *= base;
}
return result;
}
bool isPrime(int n) {
if (n <= 1) {
return false;
}
for (int i = 2; i * i <= n; i++) {
if (n % i == 0) {
return false;
}
}
return true;
}
الخرج:
x + y =
x - y =
x * y =
x / y =
x ^ y =
Is x prime? YesNo
نموذج تشغيل:
x + y = 13
x - y = 7
x * y = 30
x / y = 3.33333
x ^ y = 1000
Is x prime? No
2. مثال 2: لعبة تخمين الأرقام (نسخة بالدوال)
(1) 2.1 تحليل المتطلبات
أعد كتابة لعبة تخمين الأرقام السابقة باستخدام الدوال:
void printWelcome()— طباعة رسالة ترحيبint getSecretNumber()— توليد الرقم السريint getGuess()— الحصول على تخمين المستخدمvoid printResult(int guess, int secretNumber)— طباعة النتيجة (مرتفع جدًا/منخفض جدًا/صحيح)void playGame()— منطق اللعبة الرئيسي
▶ مثال 2: لعبة تخمين الأرقام (نسخة بالدوال) (الصعوبة ⭐⭐)
#include <iostream>
#include <cstdlib>
#include <ctime>
// تصاريح الدوال
void printWelcome();
int getSecretNumber();
int getGuess();
void printResult(int guess, int secretNumber);
void playGame();
int main() {
std::srand(static_cast<unsigned int>(std::time(nullptr)));
char playAgain;
do {
playGame();
std::cout << "Want to play again? (y/n): ";
std::cin >> playAgain;
} while (playAgain == 'y' || playAgain == 'Y');
std::cout << "Thanks for playing, goodbye!" << std::endl;
return 0;
}
// تعريفات الدوال
void printWelcome() {
std::cout << "=========== Number Guessing Game ===========" << std::endl;
std::cout << "I'm thinking of a number from 1-100, guess it!" << std::endl << std::endl;
}
int getSecretNumber() {
return std::rand() % 100 + 1;
}
int getGuess() {
int guess;
std::cout << "Enter your guess: ";
std::cin >> guess;
return guess;
}
void printResult(int guess, int secretNumber) {
if (guess > secretNumber) {
std::cout << "Too high! Try again." << std::endl;
} else if (guess < secretNumber) {
std::cout << "Too low! Try again." << std::endl;
} else {
std::cout << "🎉 Congratulations! You got it!" << std::endl;
}
}
void playGame() {
printWelcome();
int secretNumber = getSecretNumber();
int guess;
int attempts = 0;
do {
guess = getGuess();
attempts++;
printResult(guess, secretNumber);
} while (guess != secretNumber);
std::cout << "You guessed " << attempts << " times." << std::endl << std::endl;
}
الخرج:
Want to play again? (y/n):
Thanks for playing, goodbye!
=========== Number Guessing Game ===========
I'm thinking of a number from 1-100, guess it!
Enter your guess:
Too high! Try again.
Too low! Try again.
🎉 Congratulations! You got it!
You guessed times.
3. مثال 3: حاسبة بسيطة (نسخة التحميل الزائد للدوال)
(1) 3.1 تحليل المتطلبات
تنفيذ حاسبة باستخدام التحميل الزائد للدوال، دعم نوعي int وdouble.
▶ مثال 3: الحاسبة (نسخة التحميل الزائد للدوال) (الصعوبة ⭐⭐)
#include <iostream>
#include <iomanip>
// تصاريح الدوال (محمّلة زائدًا)
int calculate(int a, int b, char op);
double calculate(double a, double b, char op);
int main() {
int intResult = calculate(10, 3, '+');
double doubleResult = calculate(10.0, 3.0, '/');
std::cout << "10 + 3 = " << intResult << std::endl;
std::cout << std::fixed << std::setprecision(2);
std::cout << "10.0 / 3.0 = " << doubleResult << std::endl;
return 0;
}
// تعريفات الدوال (محمّلة زائدًا)
int calculate(int a, int b, char op) {
switch (op) {
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': return a / b; // قسمة أعداد صحيحة
default: return 0;
}
}
double calculate(double a, double b, char op) {
switch (op) {
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': return b != 0 ? a / b : 0.0;
default: return 0.0;
}
}
الخرج:
10 + 3 =
10.0 / 3.0 =
4. تمرين تطبيقي: إدارة درجات الطلاب (نسخة بالدوال)
▶ مثال 4: إدارة درجات الطلاب (الصعوبة ⭐⭐⭐)
#include <iostream>
#include <string>
// تصاريح الدوال
void printMenu();
void addStudent(std::string names[], int scores[], int& count);
void printStudents(const std::string names[], const int scores[], int count);
double calculateAverage(const int scores[], int count);
int findMaxScore(const int scores[], int count);
int main() {
const int MAX_STUDENTS = 100;
std::string names[MAX_STUDENTS];
int scores[MAX_STUDENTS];
int count = 0;
int choice;
do {
printMenu();
std::cout << "Choose (1-4): ";
std::cin >> choice;
if (choice == 1) {
addStudent(names, scores, count);
} else if (choice == 2) {
printStudents(names, scores, count);
} else if (choice == 3) {
if (count == 0) {
std::cout << "No student data!" << std::endl;
} else {
std::cout << "Average: " << calculateAverage(scores, count) << std::endl;
std::cout << "Highest score: " << findMaxScore(scores, count) << std::endl;
}
} else if (choice == 4) {
std::cout << "Goodbye!" << std::endl;
} else {
std::cout << "Error: Please enter a number between 1-4!" << std::endl;
}
std::cout << std::endl;
} while (choice != 4);
return 0;
}
// تعريفات الدوال
void printMenu() {
std::cout << "=========== Student Grade Management ===========" << std::endl;
std::cout << "1. Add student" << std::endl;
std::cout << "2. Show all students" << std::endl;
std::cout << "3. Statistics" << std::endl;
std::cout << "4. Exit" << std::endl;
}
void addStudent(std::string names[], int scores[], int& count) {
if (count >= 100) {
std::cout << "Maximum number of students reached!" << std::endl;
return;
}
std::cout << "Enter name: ";
std::cin.ignore();
std::getline(std::cin, names[count]);
std::cout << "Enter score: ";
std::cin >> scores[count];
count++;
std::cout << "Added successfully!" << std::endl;
}
void printStudents(const std::string names[], const int scores[], int count) {
if (count == 0) {
std::cout << "No student data!" << std::endl;
return;
}
std::cout << "=========== Student List ==========" << std::endl;
for (int i = 0; i < count; i++) {
std::cout << i + 1 << ". " << names[i] << " - " << scores[i] << std::endl;
}
}
double calculateAverage(const int scores[], int count) {
if (count == 0) {
return 0.0;
}
int sum = 0;
for (int i = 0; i < count; i++) {
sum += scores[i];
}
return static_cast<double>(sum) / count;
}
int findMaxScore(const int scores[], int count) {
if (count == 0) {
return 0;
}
int maxScore = scores[0];
for (int i = 1; i < count; i++) {
if (scores[i] > maxScore) {
maxScore = scores[i];
}
}
return maxScore;
}
الخرج:
Choose (1-4):
No student data!
Average:
Highest score:
Goodbye!
Error: Please enter a number between 1-4!
=========== Student Grade Management ===========
1. Add student
2. Show all students
3. Statistics
4. Exit
Maximum number of students reached!
Enter name:
Enter score:
Added successfully!
No student data!
=========== Student List ==========
. -
❓ أسئلة شائعة
main، لا تحتاج تصريح.📖 ملخص
- في البرامج الحقيقية، الدوال تعمل معًا
- قسّم المشاكل الكبيرة إلى دوال صغيرة، كل منها يفعل شيئًا واحدًا
- استخدم تصاريح الدوال للإعلان، وتعريفات الدوال للتنفيذ
- التحميل الزائد للدوال يسمح بدوال بنفس الاسم للتعامل مع أنواع مختلفة
- التسمية الجيدة للدوال تجعل الكود موثقًا ذاتيًا
📝 تمارين
-
أساسي (الصعوبة ⭐): أعد كتابة برنامج "حساب مساحة المستطيل" السابق كنسخة بالدوال:
- اكتب دالة
double calculateArea(double width, double height) - استدعها في
main
- اكتب دالة
-
متوسط (الصعوبة ⭐⭐): اكتب برنامجًا بالدوال التالية: 3.
int fibonacci(int n)— تُرجع رقم فيبوناتشي رقم n 4.void printFibonacci(int n)— تطبع أول n حدًا 5. فيmain، دع المستخدم يدخل n واستدعِ الدالتين -
متقدم (الصعوبة ⭐⭐⭐): وسّع برنامج "إدارة درجات الطلاب" بالميزات التالية: 6. حذف طالب (بالاسم أو الفهرس) 7. ترتيب حسب الدرجة (من الأعلى للأدنى) 8. حفظ في ملف / تحميل من ملف (اختياري)
- تغليف الدوال يحسن قراءة الكود وقابليته لإعادة الاستخدام
- المصفوفات تتحول إلى مؤشرات عند تمريرها كمعاملات دوال
- تكوين الدوال: دالة تستدعي دالة أخرى
- التطبيقات العودية الشائعة: المضروب، فيبوناتشي، الأس
- بنية البرنامج: إدخال → معالجة → إخراج، كل خطوة مغلقة في دالة
5. 🚀 الخطوات التالية
تهانينا! لقد أكملت جميع دروس المرحلة 2 (الدوال). بعد ذلك، ندخل المرحلة 3 (المصفوفات، السلاسل، البنى)، تعلم كيفية التعامل مع قيم متعددة من نفس النوع وسلاسل C++.