C++: تمرين: الدوال الشامل

آخر تحديث: 2026-08-26

الدروس السابقة غطت جوانب مختلفة من الدوال بشكل منفصل، لكن في البرامج الحقيقية تُستخدم معًا.

في هذا الدرس، سنتدرب على جعل الدوال تعمل معًا من خلال عدة أمثلة شاملة.


1. مثال 1: مكتبة أدوات رياضية بسيطة

(1) 1.1 تحليل المتطلبات

سنبنى مكتبة أدوات رياضية بالدوال التالية:

  1. int add(int a, int b) — الجمع
  2. int subtract(int a, int b) — الطرح
  3. int multiply(int a, int b) — الضرب
  4. double divide(int a, int b) — القسمة (تُرجع عدد عائم)
  5. int power(int base, int exp) — الأس
  6. bool isPrime(int n) — التحقق من الأعداد الأولية

▶ مثال 1: مكتبة الأدوات الرياضية (الصعوبة ⭐⭐)

TEXT 📖 للعرض فقط
#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;
}

الخرج:

TEXT 📖 للعرض فقط
x + y = 
x - y = 
x * y = 
x / y = 
x ^ y = 
Is x prime? YesNo

نموذج تشغيل:

TEXT 📖 للعرض فقط
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 تحليل المتطلبات

أعد كتابة لعبة تخمين الأرقام السابقة باستخدام الدوال:

  1. void printWelcome() — طباعة رسالة ترحيب
  2. int getSecretNumber() — توليد الرقم السري
  3. int getGuess() — الحصول على تخمين المستخدم
  4. void printResult(int guess, int secretNumber) — طباعة النتيجة (مرتفع جدًا/منخفض جدًا/صحيح)
  5. void playGame() — منطق اللعبة الرئيسي

▶ مثال 2: لعبة تخمين الأرقام (نسخة بالدوال) (الصعوبة ⭐⭐)

CPP 📖 للعرض فقط
#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;
}
50 سطر من الكود المنطقي (تجاوز الحد 40, للعرض فقط)

الخرج:

TEXT 📖 للعرض فقط
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: الحاسبة (نسخة التحميل الزائد للدوال) (الصعوبة ⭐⭐)

TEXT 📖 للعرض فقط
#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;
	}
}

الخرج:

TEXT 📖 للعرض فقط
10 + 3 = 
10.0 / 3.0 = 


4. تمرين تطبيقي: إدارة درجات الطلاب (نسخة بالدوال)

▶ مثال 4: إدارة درجات الطلاب (الصعوبة ⭐⭐⭐)

CPP 📖 للعرض فقط
#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;
}
87 سطر من الكود المنطقي (تجاوز الحد 40, للعرض فقط)

الخرج:

TEXT 📖 للعرض فقط
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، لا تحتاج تصريح.

📖 ملخص


📝 تمارين

  1. أساسي (الصعوبة ⭐): أعد كتابة برنامج "حساب مساحة المستطيل" السابق كنسخة بالدوال:

    1. اكتب دالة double calculateArea(double width, double height)
    2. استدعها في main
  2. متوسط (الصعوبة ⭐⭐): اكتب برنامجًا بالدوال التالية: 3. int fibonacci(int n) — تُرجع رقم فيبوناتشي رقم n 4. void printFibonacci(int n) — تطبع أول n حدًا 5. في main، دع المستخدم يدخل n واستدعِ الدالتين

  3. متقدم (الصعوبة ⭐⭐⭐): وسّع برنامج "إدارة درجات الطلاب" بالميزات التالية: 6. حذف طالب (بالاسم أو الفهرس) 7. ترتيب حسب الدرجة (من الأعلى للأدنى) 8. حفظ في ملف / تحميل من ملف (اختياري)


5. 🚀 الخطوات التالية

تهانينا! لقد أكملت جميع دروس المرحلة 2 (الدوال). بعد ذلك، ندخل المرحلة 3 (المصفوفات، السلاسل، البنى)، تعلم كيفية التعامل مع قيم متعددة من نفس النوع وسلاسل C++.

Web-Tutorial.com

فريق Web-Tutorial التقني

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

100%