أمثلة محلولة بلغة C++
مقدمة
تعد لغة C++ واحدة من أهم لغات البرمجة التي تُستخدم على نطاق واسع في تطوير البرمجيات. تم تصميمها لتكون لغة متعددة الاستخدامات تدعم البرمجة الكائنية التوجه والبرمجة الإجرائية. توفر لغة C++ مجموعة غنية من الميزات، مما يجعلها خيارًا مثاليًا لتطوير تطبيقات تتراوح بين أنظمة التشغيل والألعاب إلى البرمجيات الهندسية والذكاء الاصطناعي.
في هذا المقال، سنقدم شرحًا مفصلًا مع أمثلة محلولة تغطي أساسيات البرمجة باستخدام C++، بالإضافة إلى موضوعات متقدمة. سيكون المقال مفيدًا لكل من المبتدئين والمحترفين الذين يرغبون في تحسين مهاراتهم البرمجية.
أساسيات لغة C++
تركيب البرنامج الأساسي
#include <iostream>
using namespace std;
int main() {
cout << "مرحبًا بك في لغة C++!" << endl;
return 0;
}
الشرح:
#include <iostream>
: مكتبة الإدخال والإخراج.using namespace std;
: تسهيل استخدام أسماء الدوال من مكتبة std.int main()
: نقطة البداية للبرنامج.cout
: تستخدم لطباعة النصوص.
المتغيرات وأنواع البيانات
#include <iostream>
using namespace std;
int main() {
int age = 25; // نوع بيانات عدد صحيح
float height = 175.5; // نوع بيانات عشري
char grade = 'A'; // نوع بيانات حرف
bool isPassed = true; // نوع بيانات منطقي
cout << "العمر: " << age << endl;
cout << "الطول: " << height << endl;
cout << "التقدير: " << grade << endl;
cout << "نجاح: " << isPassed << endl;
return 0;
}
الحلقات والشروط
الجمل الشرطية
#include <iostream>
using namespace std;
int main() {
int number;
cout << "أدخل رقمًا: ";
cin >> number;
if (number > 0) {
cout << "الرقم موجب." << endl;
} else if (number < 0) {
cout << "الرقم سالب." << endl;
} else {
cout << "الرقم صفر." << endl;
}
return 0;
}
الشرح:
- يتم استخدام جملة
if
للتحقق من الشرط. else if
وelse
تُستخدمان للتعامل مع الحالات البديلة.
الحلقات التكرارية
مثال على حلقة for
#include <iostream>
using namespace std;
int main() {
for (int i = 1; i <= 5; i++) {
cout << "العدد: " << i << endl;
}
return 0;
}
مثال على حلقة while
#include <iostream>
using namespace std;
int main() {
int i = 1;
while (i <= 5) {
cout << "العدد: " << i << endl;
i++;
}
return 0;
}
الدوال
تعريف الدوال
#include <iostream>
using namespace std;
int add(int a, int b) {
return a + b;
}
int main() {
int num1 = 10, num2 = 20;
cout << "المجموع: " << add(num1, num2) << endl;
return 0;
}
البرمجة الكائنية التوجه
تعريف الفئات والكائنات
#include <iostream>
using namespace std;
class Car {
public:
string brand;
int year;
void displayInfo() {
cout << "الماركة: " << brand << ", السنة: " << year << endl;
}
};
int main() {
Car car1;
car1.brand = "Toyota";
car1.year = 2022;
car1.displayInfo();
return 0;
}
الوراثة
#include <iostream>
using namespace std;
class Animal {
public:
void eat() {
cout << "أنا آكل." << endl;
}
};
class Dog : public Animal {
public:
void bark() {
cout << "أنا أنبح." << endl;
}
};
int main() {
Dog dog1;
dog1.eat();
dog1.bark();
return 0;
}
أمثلة متقدمة
العمل مع الملفات
#include <iostream>
#include <fstream>
using namespace std;
int main() {
ofstream file("example.txt");
file << "مرحبًا بكم في C++!" << endl;
file.close();
ifstream readFile("example.txt");
string line;
while (getline(readFile, line)) {
cout << line << endl;
}
readFile.close();
return 0;
}
جدول لمقارنة الحلقات
نوع الحلقة | الوصف | مثال الاستخدام |
---|---|---|
for |
تُستخدم عندما يكون عدد التكرارات معروفًا. | حساب مجموع الأرقام. |
while |
تُستخدم عندما يكون الشرط مطلوبًا لفترة غير معروفة. | التحقق من كلمة مرور. |
do-while |
تُنفذ الكود مرة واحدة على الأقل. | قائمة الخيارات. |
المزيد من الأمثلة المحلولة في لغة C++
فيما يلي مجموعة إضافية من الأمثلة المحلولة تغطي موضوعات متقدمة في C++ مثل المؤشرات، القوالب، المعالجة المتعددة، والبرمجة الديناميكية.
1. المؤشرات (Pointers)
تعريف المؤشر واستخدامه
#include <iostream>
using namespace std;
int main() {
int num = 10;
int* ptr = # // تخزين عنوان المتغير num في المؤشر
cout << "قيمة num: " << num << endl;
cout << "عنوان num: " << &num << endl;
cout << "المؤشر ptr: " << ptr << endl;
cout << "القيمة المخزنة في ptr: " << *ptr << endl;
return 0;
}
الشرح:
&
: ترجع عنوان المتغير.*
: ترجع القيمة المخزنة في العنوان.
2. القوالب (Templates)
تعريف قالب دالة
#include <iostream>
using namespace std;
template <typename T>
T add(T a, T b) {
return a + b;
}
int main() {
cout << "جمع أعداد صحيحة: " << add<int>(5, 10) << endl;
cout << "جمع أعداد عشرية: " << add<float>(5.5, 10.3) << endl;
return 0;
}
الشرح:
- القوالب تسمح بكتابة دوال أو فئات عامة تدعم أنواع بيانات متعددة.
تعريف قالب فئة
#include <iostream>
using namespace std;
template <class T>
class Box {
private:
T value;
public:
void setValue(T v) {
value = v;
}
T getValue() {
return value;
}
};
int main() {
Box<int> intBox;
intBox.setValue(100);
cout << "القيمة المخزنة: " << intBox.getValue() << endl;
Box<string> strBox;
strBox.setValue("مرحباً");
cout << "القيمة المخزنة: " << strBox.getValue() << endl;
return 0;
}
3. المصفوفات الديناميكية
تخصيص المصفوفات ديناميكيًا
#include <iostream>
using namespace std;
int main() {
int n;
cout << "أدخل عدد العناصر: ";
cin >> n;
int* arr = new int[n]; // تخصيص مصفوفة ديناميكية
for (int i = 0; i < n; i++) {
cout << "أدخل العنصر " << i + 1 << ": ";
cin >> arr[i];
}
cout << "العناصر المدخلة: ";
for (int i = 0; i < n; i++) {
cout << arr[i] << " ";
}
cout << endl;
delete[] arr; // تحرير الذاكرة
return 0;
}
4. البرمجة الديناميكية (Dynamic Programming)
مثال لحساب متتالية فيبوناتشي
#include <iostream>
using namespace std;
int fibonacci(int n) {
int* dp = new int[n + 1];
dp[0] = 0;
dp[1] = 1;
for (int i = 2; i <= n; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
int result = dp[n];
delete[] dp; // تحرير الذاكرة
return result;
}
int main() {
int n;
cout << "أدخل الرقم n: ";
cin >> n;
cout << "العدد في متتالية فيبوناتشي هو: " << fibonacci(n) << endl;
return 0;
}
5. الملفات المتقدمة
إضافة وقراءة البيانات من ملف
#include <iostream>
#include <fstream>
using namespace std;
int main() {
fstream file;
file.open("data.txt", ios::out | ios::app); // فتح الملف للإضافة
if (!file) {
cout << "فشل في فتح الملف!" << endl;
return 1;
}
file << "مرحباً بكم في لغة C++!" << endl;
file.close();
file.open("data.txt", ios::in); // فتح الملف للقراءة
if (!file) {
cout << "فشل في فتح الملف!" << endl;
return 1;
}
string line;
while (getline(file, line)) {
cout << line << endl;
}
file.close();
return 0;
}
6. الخيوط (Threads)
تنفيذ المهام المتعددة
#include <iostream>
#include <thread>
using namespace std;
void task1() {
for (int i = 1; i <= 5; i++) {
cout << "المهمة 1: " << i << endl;
}
}
void task2() {
for (int i = 1; i <= 5; i++) {
cout << "المهمة 2: " << i << endl;
}
}
int main() {
thread t1(task1);
thread t2(task2);
t1.join(); // انتظار انتهاء الخيط الأول
t2.join(); // انتظار انتهاء الخيط الثاني
return 0;
}
الشرح:
- مكتبة
thread
تسمح بإنشاء وتنفيذ المهام في خيوط متعددة. join()
يضمن انتهاء تنفيذ الخيط قبل استكمال البرنامج.
7. البرمجة بالكائنات
استخدام تعددية الأشكال
#include <iostream>
using namespace std;
class Shape {
public:
virtual void draw() {
cout << "رسم شكل عام." << endl;
}
};
class Circle : public Shape {
public:
void draw() override {
cout << "رسم دائرة." << endl;
}
};
class Rectangle : public Shape {
public:
void draw() override {
cout << "رسم مستطيل." << endl;
}
};
int main() {
Shape* shape;
Circle circle;
Rectangle rectangle;
shape = &circle;
shape->draw();
shape = &rectangle;
shape->draw();
return 0;
}
الشرح:
- الكلمة
virtual
تجعل الدالة تدعم تعددية الأشكال. override
للتأكد من إعادة تعريف الدالة.
جدول مقارنة بين أنواع المعالجة
النوع | الوصف | مثال الاستخدام |
---|---|---|
المؤشرات | الوصول المباشر للذاكرة | تخصيص مصفوفات ديناميكيًا. |
القوالب | دعم الأنواع العامة | قوالب الدوال والفئات. |
البرمجة الكائنية | استخدام الكائنات والفئات | تعددية الأشكال. |
البرمجة الديناميكية | تحسين الأداء باستخدام الحفظ المسبق | متتالية فيبوناتشي. |
المزيد من الأمثلة المحلولة بلغة C++
فيما يلي مجموعة إضافية من الأمثلة تغطي مفاهيم أكثر تعمقًا في لغة C++، مثل التعامل مع الاستثناءات، معالجة السلاسل النصية، استخدام المصفوفات المتقدمة، والمكتبات القياسية.
8. التعامل مع الاستثناءات (Exceptions Handling)
استخدام try-catch لرصد الأخطاء
#include <iostream>
using namespace std;
int divide(int a, int b) {
if (b == 0) {
throw runtime_error("لا يمكن القسمة على صفر!");
}
return a / b;
}
int main() {
int x, y;
cout << "أدخل الرقم الأول: ";
cin >> x;
cout << "أدخل الرقم الثاني: ";
cin >> y;
try {
int result = divide(x, y);
cout << "الناتج: " << result << endl;
} catch (runtime_error &e) {
cout << "خطأ: " << e.what() << endl;
}
return 0;
}
الشرح:
- يتم استخدام
throw
لرمي استثناء عند وجود خطأ. - يتم التقاط الاستثناء باستخدام
try-catch
.
9. معالجة السلاسل النصية (Strings)
عكس سلسلة نصية
#include <iostream>
#include <string>
using namespace std;
int main() {
string str;
cout << "أدخل نصاً: ";
cin >> str;
string reversedStr = string(str.rbegin(), str.rend());
cout << "النص المعكوس: " << reversedStr << endl;
return 0;
}
حساب تكرار الأحرف
#include <iostream>
#include <string>
#include <map>
using namespace std;
int main() {
string text;
cout << "أدخل نصاً: ";
cin >> text;
map<char, int> freq;
for (char c : text) {
freq[c]++;
}
cout << "تكرار الأحرف:" << endl;
for (auto &pair : freq) {
cout << pair.first << ": " << pair.second << endl;
}
return 0;
}
10. المصفوفات المتقدمة
إيجاد العنصر الأكبر في مصفوفة ثنائية الأبعاد
#include <iostream>
using namespace std;
int main() {
const int rows = 3;
const int cols = 3;
int matrix[rows][cols] = {
{5, 1, 9},
{3, 6, 7},
{4, 2, 8}
};
int maxVal = matrix[0][0];
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
if (matrix[i][j] > maxVal) {
maxVal = matrix[i][j];
}
}
}
cout << "أكبر قيمة في المصفوفة: " << maxVal << endl;
return 0;
}
جمع مصفوفتين
#include <iostream>
using namespace std;
int main() {
const int rows = 2, cols = 2;
int matrix1[rows][cols] = {{1, 2}, {3, 4}};
int matrix2[rows][cols] = {{5, 6}, {7, 8}};
int sum[rows][cols];
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
sum[i][j] = matrix1[i][j] + matrix2[i][j];
}
}
cout << "مصفوفة المجموع:" << endl;
for (int i = 0; i < rows; i++) {
for (int j = 0; j < cols; j++) {
cout << sum[i][j] << " ";
}
cout << endl;
}
return 0;
}
11. البرمجة الكائنية المتقدمة
إنشاء مشغل زائد (Overloading Operator)
#include <iostream>
using namespace std;
class Complex {
private:
double real, imag;
public:
Complex(double r, double i) : real(r), imag(i) {}
Complex operator+(const Complex &c) {
return Complex(real + c.real, imag + c.imag);
}
void display() {
cout << real << " + " << imag << "i" << endl;
}
};
int main() {
Complex c1(3.5, 2.5), c2(1.5, 4.5);
Complex sum = c1 + c2;
cout << "المجموع: ";
sum.display();
return 0;
}
12. البرمجة باستخدام المصفوفات الديناميكية (Vectors)
استخدام المكتبة القياسية STL
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> nums;
nums.push_back(10);
nums.push_back(20);
nums.push_back(30);
cout << "عناصر المصفوفة الديناميكية:" << endl;
for (int num : nums) {
cout << num << " ";
}
cout << endl;
nums.pop_back();
cout << "بعد إزالة العنصر الأخير:" << endl;
for (int num : nums) {
cout << num << " ";
}
cout << endl;
return 0;
}
13. المكتبات القياسية (STL: Standard Template Library)
استخدام قائمة (List)
#include <iostream>
#include <list>
using namespace std;
int main() {
list<int> numbers = {1, 2, 3, 4};
numbers.push_front(0); // إضافة عنصر في بداية القائمة
numbers.push_back(5); // إضافة عنصر في نهاية القائمة
cout << "عناصر القائمة:" << endl;
for (int num : numbers) {
cout << num << " ";
}
cout << endl;
numbers.pop_front();
numbers.pop_back();
cout << "بعد الإزالة:" << endl;
for (int num : numbers) {
cout << num << " ";
}
cout << endl;
return 0;
}
14. استخدام الخريطة (Map)
تطبيق خريطة لتخزين القيم باستخدام المفاتيح
#include <iostream>
#include <map>
using namespace std;
int main() {
map<string, int> phoneBook;
phoneBook["أحمد"] = 12345;
phoneBook["محمد"] = 67890;
cout << "رقم أحمد: " << phoneBook["أحمد"] << endl;
cout << "رقم محمد: " << phoneBook["محمد"] << endl;
for (auto &entry : phoneBook) {
cout << "الاسم: " << entry.first << ", الرقم: " << entry.second << endl;
}
return 0;
}
نماذج أسئلة مع حلول بلغة C++
فيما يلي مجموعة من الأسئلة الشائعة التي يتم طرحها في تعلم لغة C++، مع حلول مفصلة لكل سؤال.
السؤال الأول: كتابة برنامج لجمع رقمين
السؤال:
اكتب برنامجًا يأخذ رقمين كمدخل من المستخدم ويقوم بجمعهما وعرض النتيجة.
الحل:
#include <iostream>
using namespace std;
int main() {
int num1, num2, sum;
cout << "أدخل الرقم الأول: ";
cin >> num1;
cout << "أدخل الرقم الثاني: ";
cin >> num2;
sum = num1 + num2;
cout << "المجموع: " << sum << endl;
return 0;
}
السؤال الثاني: برنامج لتحديد إذا كان الرقم زوجيًا أو فرديًا
السؤال:
اكتب برنامجًا يطلب من المستخدم إدخال رقم، ثم يحدد ما إذا كان الرقم زوجيًا أو فرديًا.
الحل:
#include <iostream>
using namespace std;
int main() {
int num;
cout << "أدخل رقمًا: ";
cin >> num;
if (num % 2 == 0) {
cout << "الرقم زوجي." << endl;
} else {
cout << "الرقم فردي." << endl;
}
return 0;
}
السؤال الثالث: طباعة الأرقام من 1 إلى 10 باستخدام حلقة
السؤال:
اكتب برنامجًا يقوم بطباعة الأرقام من 1 إلى 10 باستخدام حلقة.
الحل:
#include <iostream>
using namespace std;
int main() {
for (int i = 1; i <= 10; i++) {
cout << i << " ";
}
cout << endl;
return 0;
}
السؤال الرابع: برنامج لإيجاد أكبر رقم بين ثلاثة أرقام
السؤال:
اكتب برنامجًا يطلب من المستخدم إدخال ثلاثة أرقام، ثم يحدد أكبر رقم بينها.
الحل:
#include <iostream>
using namespace std;
int main() {
int num1, num2, num3;
cout << "أدخل الرقم الأول: ";
cin >> num1;
cout << "أدخل الرقم الثاني: ";
cin >> num2;
cout << "أدخل الرقم الثالث: ";
cin >> num3;
int maxNum = num1;
if (num2 > maxNum) {
maxNum = num2;
}
if (num3 > maxNum) {
maxNum = num3;
}
cout << "أكبر رقم هو: " << maxNum << endl;
return 0;
}
السؤال الخامس: برنامج لحساب مضروب عدد (Factorial)
السؤال:
اكتب برنامجًا يحسب مضروب عدد يتم إدخاله من قبل المستخدم.
الحل:
#include <iostream>
using namespace std;
int main() {
int num, factorial = 1;
cout << "أدخل رقمًا: ";
cin >> num;
for (int i = 1; i <= num; i++) {
factorial *= i;
}
cout << "المضروب: " << factorial << endl;
return 0;
}
السؤال السادس: إيجاد العدد الأكبر في مصفوفة
السؤال:
اكتب برنامجًا يطلب من المستخدم إدخال أرقام في مصفوفة، ثم يحدد أكبر عدد في المصفوفة.
الحل:
#include <iostream>
using namespace std;
int main() {
int n;
cout << "أدخل عدد العناصر في المصفوفة: ";
cin >> n;
int arr[n];
cout << "أدخل عناصر المصفوفة: ";
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
int maxNum = arr[0];
for (int i = 1; i < n; i++) {
if (arr[i] > maxNum) {
maxNum = arr[i];
}
}
cout << "أكبر عدد في المصفوفة هو: " << maxNum << endl;
return 0;
}
السؤال السابع: برنامج للتحقق من عدد أولي
السؤال:
اكتب برنامجًا يحدد ما إذا كان الرقم المدخل عددًا أوليًا أم لا.
الحل:
#include <iostream>
using namespace std;
bool isPrime(int num) {
if (num <= 1) return false;
for (int i = 2; i <= num / 2; i++) {
if (num % i == 0) return false;
}
return true;
}
int main() {
int num;
cout << "أدخل رقمًا: ";
cin >> num;
if (isPrime(num)) {
cout << "الرقم أولي." << endl;
} else {
cout << "الرقم ليس أوليًا." << endl;
}
return 0;
}
السؤال الثامن: حساب مجموع الأرقام في مصفوفة
السؤال:
اكتب برنامجًا يحسب مجموع العناصر في مصفوفة.
الحل:
#include <iostream>
using namespace std;
int main() {
int n;
cout << "أدخل عدد العناصر في المصفوفة: ";
cin >> n;
int arr[n], sum = 0;
cout << "أدخل عناصر المصفوفة: ";
for (int i = 0; i < n; i++) {
cin >> arr[i];
sum += arr[i];
}
cout << "مجموع العناصر هو: " << sum << endl;
return 0;
}
السؤال التاسع: برنامج لحساب متوسط الأرقام
السؤال:
اكتب برنامجًا يطلب من المستخدم إدخال مجموعة من الأرقام، ثم يحسب المتوسط.
الحل:
#include <iostream>
using namespace std;
int main() {
int n;
cout << "أدخل عدد الأرقام: ";
cin >> n;
double sum = 0;
for (int i = 0; i < n; i++) {
double num;
cout << "أدخل الرقم " << i + 1 << ": ";
cin >> num;
sum += num;
}
double average = sum / n;
cout << "المتوسط: " << average << endl;
return 0;
}
السؤال العاشر: حساب عدد الأحرف في سلسلة نصية
السؤال:
اكتب برنامجًا يطلب من المستخدم إدخال سلسلة نصية، ثم يحسب عدد الأحرف في هذه السلسلة.
الحل:
#include <iostream>
#include <string>
using namespace std;
int main() {
string text;
cout << "أدخل نصًا: ";
cin >> text;
cout << "عدد الأحرف: " << text.length() << endl;
return 0;
}
المزيد من نماذج الأسئلة المحلولة بلغة C++
إليك مجموعة جديدة من الأسئلة التي تغطي مواضيع متقدمة وأفكارًا إضافية لتحسين مهاراتك في البرمجة باستخدام C++.
السؤال الحادي عشر: حساب عدد الأرقام الفردية والزوجية في مصفوفة
السؤال:
اكتب برنامجًا يطلب من المستخدم إدخال مجموعة من الأرقام، ثم يحسب عدد الأرقام الفردية والزوجية.
الحل:
#include <iostream>
using namespace std;
int main() {
int n;
cout << "أدخل عدد العناصر في المصفوفة: ";
cin >> n;
int arr[n], oddCount = 0, evenCount = 0;
cout << "أدخل عناصر المصفوفة: ";
for (int i = 0; i < n; i++) {
cin >> arr[i];
if (arr[i] % 2 == 0) {
evenCount++;
} else {
oddCount++;
}
}
cout << "عدد الأرقام الزوجية: " << evenCount << endl;
cout << "عدد الأرقام الفردية: " << oddCount << endl;
return 0;
}
السؤال الثاني عشر: عكس ترتيب العناصر في مصفوفة
السؤال:
اكتب برنامجًا يقوم بعكس ترتيب العناصر في مصفوفة.
الحل:
#include <iostream>
using namespace std;
int main() {
int n;
cout << "أدخل عدد العناصر في المصفوفة: ";
cin >> n;
int arr[n];
cout << "أدخل عناصر المصفوفة: ";
for (int i = 0; i < n; i++) {
cin >> arr[i];
}
cout << "المصفوفة بعد عكس الترتيب: ";
for (int i = n - 1; i >= 0; i--) {
cout << arr[i] << " ";
}
cout << endl;
return 0;
}
السؤال الثالث عشر: حساب مجموع الأرقام في سلسلة نصية
السؤال:
اكتب برنامجًا يطلب من المستخدم إدخال سلسلة نصية تحتوي على أرقام، ثم يحسب مجموع هذه الأرقام.
الحل:
#include <iostream>
#include <string>
using namespace std;
int main() {
string text;
int sum = 0;
cout << "أدخل نصًا يحتوي على أرقام: ";
cin >> text;
for (char c : text) {
if (isdigit(c)) {
sum += c - '0'; // تحويل الحرف إلى رقم
}
}
cout << "مجموع الأرقام: " << sum << endl;
return 0;
}
السؤال الرابع عشر: التحقق من كلمة مرور صحيحة
السؤال:
اكتب برنامجًا يتحقق مما إذا كانت كلمة المرور المدخلة من المستخدم صحيحة بناءً على شرط معين.
الحل:
#include <iostream>
#include <string>
using namespace std;
bool isValidPassword(string password) {
if (password.length() < 8) return false;
bool hasDigit = false, hasUpper = false, hasLower = false;
for (char c : password) {
if (isdigit(c)) hasDigit = true;
if (isupper(c)) hasUpper = true;
if (islower(c)) hasLower = true;
}
return hasDigit && hasUpper && hasLower;
}
int main() {
string password;
cout << "أدخل كلمة المرور: ";
cin >> password;
if (isValidPassword(password)) {
cout << "كلمة المرور صحيحة!" << endl;
} else {
cout << "كلمة المرور غير صحيحة. يجب أن تحتوي على 8 أحرف على الأقل، وحرف كبير، وحرف صغير، ورقم." << endl;
}
return 0;
}
السؤال الخامس عشر: برنامج لإيجاد المضاعف المشترك الأصغر
السؤال:
اكتب برنامجًا يحسب المضاعف المشترك الأصغر لرقمين.
الحل:
#include <iostream>
using namespace std;
int gcd(int a, int b) {
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}
int lcm(int a, int b) {
return (a * b) / gcd(a, b);
}
int main() {
int num1, num2;
cout << "أدخل الرقم الأول: ";
cin >> num1;
cout << "أدخل الرقم الثاني: ";
cin >> num2;
cout << "المضاعف المشترك الأصغر: " << lcm(num1, num2) << endl;
return 0;
}
السؤال السادس عشر: إنشاء مثلث نجوم
السؤال:
اكتب برنامجًا يرسم مثلثًا من النجوم بناءً على عدد المستويات المدخلة من المستخدم.
الحل:
#include <iostream>
using namespace std;
int main() {
int levels;
cout << "أدخل عدد المستويات: ";
cin >> levels;
for (int i = 1; i <= levels; i++) {
for (int j = 1; j <= i; j++) {
cout << "*";
}
cout << endl;
}
return 0;
}
السؤال السابع عشر: التحقق من سلسلة نصية كـ “Palindrome”
السؤال:
اكتب برنامجًا يتحقق مما إذا كانت السلسلة النصية المدخلة عبارة عن Palindrome أم لا.
الحل:
#include <iostream>
#include <string>
using namespace std;
bool isPalindrome(string str) {
int start = 0, end = str.length() - 1;
while (start < end) {
if (str[start] != str[end]) {
return false;
}
start++;
end--;
}
return true;
}
int main() {
string text;
cout << "أدخل نصًا: ";
cin >> text;
if (isPalindrome(text)) {
cout << "النص هو Palindrome." << endl;
} else {
cout << "النص ليس Palindrome." << endl;
}
return 0;
}
السؤال الثامن عشر: إيجاد الرقم المفقود في مصفوفة مرتبة
السؤال:
اكتب برنامجًا يحدد الرقم المفقود في مصفوفة تحتوي على تسلسل من الأرقام.
الحل:
#include <iostream>
using namespace std;
int findMissingNumber(int arr[], int n) {
int totalSum = (n * (n + 1)) / 2; // مجموع التسلسل الكامل
int arraySum = 0;
for (int i = 0; i < n - 1; i++) {
arraySum += arr[i];
}
return totalSum - arraySum;
}
int main() {
int n;
cout << "أدخل عدد العناصر (بما في ذلك الرقم المفقود): ";
cin >> n;
int arr[n - 1];
cout << "أدخل العناصر: ";
for (int i = 0; i < n - 1; i++) {
cin >> arr[i];
}
cout << "الرقم المفقود هو: " << findMissingNumber(arr, n) << endl;
return 0;
}
السؤال التاسع عشر: تحويل درجة الحرارة بين مئوية وفهرنهايت
السؤال:
اكتب برنامجًا لتحويل درجة الحرارة بين المئوية والفهرنهايت.
الحل:
#include <iostream>
using namespace std;
int main() {
double temp;
char choice;
cout << "أدخل درجة الحرارة: ";
cin >> temp;
cout << "أدخل النوع (C للمئوية، F للفهرنهايت): ";
cin >> choice;
if (choice == 'C' || choice == 'c') {
double fahrenheit = (temp * 9 / 5) + 32;
cout << "الدرجة بالفهرنهايت: " << fahrenheit << endl;
} else if (choice == 'F' || choice == 'f') {
double celsius = (temp - 32) * 5 / 9;
cout << "الدرجة بالمئوية: " << celsius << endl;
} else {
cout << "اختيار غير صحيح!" << endl;
}
return 0;
}
أمثلة برمجية باستخدام الواجهة المرئية (GUI) في C++
استخدام الواجهات الرسومية (GUI) في C++ يتطلب مكتبات خارجية مثل Qt أو SFML أو GTK. هنا سنركز على مكتبة Qt لكونها واحدة من أكثر المكتبات شيوعًا وسهولة للاستخدام في تطوير التطبيقات المرئية.
المثال الأول: نافذة بسيطة تحتوي على زر
الوصف:
هذا البرنامج ينشئ نافذة GUI تحتوي على زر عند الضغط عليه يظهر رسالة.
الكود:
#include <QApplication>
#include <QPushButton>
#include <QMessageBox>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
// إنشاء النافذة والزر
QWidget window;
window.setWindowTitle("نافذة بسيطة");
QPushButton button("اضغط هنا", &window);
button.setGeometry(50, 50, 200, 50); // تحديد موقع وحجم الزر
// التعامل مع حدث الضغط على الزر
QObject::connect(&button, &QPushButton::clicked, [&]() {
QMessageBox::information(&window, "رسالة", "تم الضغط على الزر!");
});
window.resize(300, 200); // تغيير حجم النافذة
window.show();
return app.exec();
}
المخرجات:
- نافذة صغيرة تظهر بها زر مكتوب عليه “اضغط هنا”.
- عند الضغط على الزر، تظهر رسالة بعنوان “رسالة” ومحتوى “تم الضغط على الزر!”.
المثال الثاني: برنامج إدخال النصوص
الوصف:
برنامج يحتوي على مربع إدخال نص وزر، يعرض النص المدخل في نافذة منبثقة عند الضغط على الزر.
الكود:
#include <QApplication>
#include <QWidget>
#include <QLineEdit>
#include <QPushButton>
#include <QVBoxLayout>
#include <QMessageBox>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
// إنشاء النافذة الرئيسية
QWidget window;
window.setWindowTitle("إدخال النصوص");
// مكونات الواجهة
QLineEdit *textInput = new QLineEdit(&window);
textInput->setPlaceholderText("أدخل النص هنا...");
QPushButton *submitButton = new QPushButton("عرض النص", &window);
// التخطيط
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(textInput);
layout->addWidget(submitButton);
window.setLayout(layout);
// التعامل مع حدث الضغط على الزر
QObject::connect(submitButton, &QPushButton::clicked, [&]() {
QString text = textInput->text();
if (text.isEmpty()) {
QMessageBox::warning(&window, "خطأ", "الرجاء إدخال النص!");
} else {
QMessageBox::information(&window, "النص المدخل", text);
}
});
window.resize(300, 200);
window.show();
return app.exec();
}
المخرجات:
- نافذة تحتوي على مربع إدخال نص وزر مكتوب عليه “عرض النص”.
- عند إدخال نص والضغط على الزر، يتم عرض النص المدخل في نافذة منبثقة.
- إذا لم يتم إدخال أي نص، تظهر رسالة خطأ.
المثال الثالث: تطبيق آلة حاسبة بسيطة
الوصف:
برنامج GUI يحسب مجموع رقمين يتم إدخالهما من قبل المستخدم.
الكود:
#include <QApplication>
#include <QWidget>
#include <QLineEdit>
#include <QPushButton>
#include <QVBoxLayout>
#include <QHBoxLayout>
#include <QLabel>
#include <QMessageBox>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
// إنشاء النافذة الرئيسية
QWidget window;
window.setWindowTitle("آلة حاسبة بسيطة");
// مكونات الواجهة
QLineEdit *input1 = new QLineEdit(&window);
input1->setPlaceholderText("الرقم الأول");
QLineEdit *input2 = new QLineEdit(&window);
input2->setPlaceholderText("الرقم الثاني");
QPushButton *calculateButton = new QPushButton("حساب المجموع", &window);
QLabel *resultLabel = new QLabel("الناتج: ", &window);
// التخطيط
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(input1);
layout->addWidget(input2);
layout->addWidget(calculateButton);
layout->addWidget(resultLabel);
window.setLayout(layout);
// التعامل مع حدث الضغط على الزر
QObject::connect(calculateButton, &QPushButton::clicked, [&]() {
bool ok1, ok2;
double num1 = input1->text().toDouble(&ok1);
double num2 = input2->text().toDouble(&ok2);
if (!ok1 || !ok2) {
QMessageBox::warning(&window, "خطأ", "الرجاء إدخال أرقام صحيحة!");
} else {
double sum = num1 + num2;
resultLabel->setText("الناتج: " + QString::number(sum));
}
});
window.resize(300, 200);
window.show();
return app.exec();
}
المخرجات:
- نافذة تحتوي على مربعين لإدخال الأرقام، زر “حساب المجموع”، ونتيجة تظهر تحت الزر.
- عند إدخال رقمين والضغط على الزر، يتم عرض الناتج أسفل الزر.
- إذا لم يتم إدخال أرقام صحيحة، تظهر رسالة خطأ.
المثال الرابع: تغيير لون النافذة
الوصف:
برنامج يحتوي على ثلاثة أزرار لتغيير لون خلفية النافذة إلى الأحمر، الأخضر، أو الأزرق.
الكود:
#include <QApplication>
#include <QWidget>
#include <QPushButton>
#include <QVBoxLayout>
#include <QPalette>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
// إنشاء النافذة الرئيسية
QWidget window;
window.setWindowTitle("تغيير لون النافذة");
// الأزرار
QPushButton *redButton = new QPushButton("أحمر", &window);
QPushButton *greenButton = new QPushButton("أخضر", &window);
QPushButton *blueButton = new QPushButton("أزرق", &window);
// التخطيط
QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(redButton);
layout->addWidget(greenButton);
layout->addWidget(blueButton);
window.setLayout(layout);
// التعامل مع الأحداث
QObject::connect(redButton, &QPushButton::clicked, [&]() {
QPalette palette = window.palette();
palette.setColor(QPalette::Window, Qt::red);
window.setPalette(palette);
});
QObject::connect(greenButton, &QPushButton::clicked, [&]() {
QPalette palette = window.palette();
palette.setColor(QPalette::Window, Qt::green);
window.setPalette(palette);
});
QObject::connect(blueButton, &QPushButton::clicked, [&]() {
QPalette palette = window.palette();
palette.setColor(QPalette::Window, Qt::blue);
window.setPalette(palette);
});
window.resize(300, 200);
window.show();
return app.exec();
}
المخرجات:
- نافذة تحتوي على ثلاثة أزرار: “أحمر”، “أخضر”، “أزرق”.
- عند الضغط على أي زر، يتغير لون خلفية النافذة إلى اللون المحدد.
خاتمة
تغطي هذه الأمثلة نماذج متنوعة من الأسئلة الشائعة التي تساهم في بناء المهارات الأساسية والمتقدمة في البرمجة باستخدام لغة C++. مع التمرين المستمر على هذه الأسئلة، يمكن تطوير الفهم العميق للغة وتحسين الأداء البرمجي.
تتناول الأمثلة أعلاه العديد من المواضيع المهمة والمفيدة في C++، بما في ذلك البرمجة الكائنية، المعالجة المتقدمة للبيانات، والتعامل مع المكتبات القياسية. الممارسة المستمرة لهذه الأمثلة ستساعدك في بناء برامج أكثر تعقيدًا وقوة.