/******************************************************************************
Welcome to GDB Online.
GDB online is an online compiler and debugger tool for C, C++, Python, Java, PHP, Ruby, Perl,
C#, VB, Swift, Pascal, Fortran, Haskell, Objective-C, Assembly, HTML, CSS, JS, SQLite, Prolog.
Code, Compile, Run and Debug online from anywhere in world.
*******************************************************************************/
#include <iostream>
#include <vector>
using namespace std;
template <typename T> // من أجل إستقبال أي نوع مصفوفة سواء نصية أو عددية أو أي نوع
// دالة مُساعدة لقراءة عناصر مصفوفة
void readArray(T *arr, int n) {
for (int i = 0; i < n; ++i) {
cout << "Enter El[" << i << "]: " << endl;
cin >> arr[i];
}
}
template <typename T> // من أجل إستقبال أي نوع مصفوفة سواء نصية أو عددية أو أي نوع
// دالة مُساعدة لطباعة عناصر مصفوفة
void printArray(T *arr, int n) {
cout << "[";
for (int i = 0; i < n - 1; ++i) {
cout << arr[i] << ", ";
}
cout << arr[n-1] << "]";
}
template <typename T> // من أجل إستقبال أي نوع مصفوفة سواء نصية أو عددية أو أي نوع
// دالة البحث في مصفوفة من أي نوع
// تستقبل مصفوفة من النوع T و تبحث عن معلومة من نوع T
// ترجع الدالة vector يضم جميع أماكن المعلومة في المصفوفة
std::vector<int> search(T *arr, int n, T search) {
std::vector<int> result;
for (int i = 0; i < n; ++i) { // اللف حول عناصر المصفوفة
if (arr[i] == search) { // في حالة تطابق العنصر الحالي من المصفوفة مع المعلومة التي نبحث عنها
result.push_back(i); // نقوم بتخزين الموضع في ال vector
}
}
return result; // نرجع ال vector
}
int main() {
/* المثال الأول حيث عناصر المصفوفة عبارة عن أعداد */
int n_int; // تعريف متغير عدد لتخزين طول المصفوفة العددية
cout << "Enter size of array: " << endl; // طباعة عبارة للمًستخدم تُعلمه بإدخال طول المصفوفة العددية
cin >> n_int; // قراءة مُدخلات المُستخدم
int array[n_int]; // تعريف مصفوفة عددية
readArray(array, n_int); // قراءة عناصر المصفوفة العددية
printArray(array, n_int); // طباعة عناصر المصفوفة التي أدخلها المًستخدم
int s_int; // تعريف مُتغير لتخزين العدد الذي نريد البحث عنه
cout << "\nEnter search: " << endl; // طباعة عبارة للمًستخدم تُعلمه بإدخال العدد الذي يريد البحث عنه في المصفوفة
cin >> s_int; // قراءة العدد الذي سنبحث عنه
std::vector<int> result = search(array, n_int, s_int); // إستدعاء دالة البحث و تمرير المُعاملات المطلوبة لها و تخزين الراجع
cout << "\nresult: "; // طباعة عبارة لنتائج البحث
printArray(&result[0], result.size()); // طباعة عناصر مصفوفة البحث
/*
* ===============================================================================
* */
/* المثال الثاني حيث عناصر المصفوفة عبارة عن سلاسل نصية */
int n_string; // تعريف متغير عدد لتخزين طول المصفوفة النصية
cout << "\nEnter size of array: " << endl; // طباعة عبارة للمًستخدم تُعلمه بإدخال طول المصفوفة النصية
cin >> n_string; // قراءة مُدخلات المُستخدم
string array_string[n_string]; // تعريف مصفوفة نصية
readArray(array_string, n_string); // قراءة عناصر المصفوفة النصية
printArray(array_string, n_string); // طباعة عناصر المصفوفة التي أدخلها المًستخدم
string s_string; // تعريف مُتغير لتخزين السلسلة النصية الذي نريد البحث عنها
cout << "\nEnter search: " << endl; // طباعة عبارة للمًستخدم تُعلمه بإدخال السلسلة النصية الذي يريد البحث عنها في المصفوفة
cin >> s_string; // قراءة السلسلة النصية الذي سنبحث عنها
std::vector<int> result_string = search(array_string, n_string, s_string); // إستدعاء دالة البحث و تمرير المُعاملات المطلوبة لها و تخزين الراجع
cout << "\nresult: "; // طباعة عبارة لنتائج البحث
printArray(&result_string[0], result_string.size()); // طباعة عناصر مصفوفة البحث
}