en
Feedback
PI Team π ❷

PI Team π ❷

Open in Telegram

PI Team فريق تطوعي من طلاب دفعة 2025- 2030 في كلية الهندسة المعلوماتية جامعة حمص، يهدف لمساعدة الطلاب في الدراسة ونشر المحاضرات والملفات الهامة دون مقابل.

Show more
The country is not specifiedEducation63 666
1 427
Subscribers
-124 hours
-37 days
-1330 days
Posts Archive
#include <iostream> using namespace std; class List { public: ~List() { cout << "List destructor" << endl; } }; class ArrayList : public List { public: ~ArrayList() { cout << "ArrayList destructor" << endl; } }; int main() { List* ptr = new ArrayList(); delete ptr; return 0; }

ننوه لوجود خطأ ضمن المحاضرة الرابعة الخطأ الاول : Complex ptr=&a; الصحيح انه يحتاج لنجمة لانه مؤشر Complex *ptr=&a; وكذلك Com
ننوه لوجود خطأ ضمن المحاضرة الرابعة الخطأ الاول :
Complex ptr=&a;
الصحيح انه يحتاج لنجمة لانه مؤشر
Complex *ptr=&a;
وكذلك
Complex ptrN=new Complex;
هذا حجز ديناميكي للذاكرة يحتاج لمؤشر ايضا
Complex *ptrN=new Complex;
ونفس الشي الحجز الديناميكي لمصفوفة :
Complex ptrArray=new Complex[10];
Complex *ptrArray=new Complex[10];

بالمثال الثاني عم قارن بين مكانين بالذاكرة وين المشكلة؟ بس مافيني قارن بين 2 Struct ورح يعطي هاد الشي خطأ ترجمة

الشرح:
f x{1,2}; f &b=x;
هنا تم انشاء x من نوع f ثم تم تعريف b بالمرجع وجعلها نفس x بالتالي اي تعديل سوف يتم على x سوف يتم على b والعكس صحيح لان المتغيرات هم فقط غير اسماء ولكنهم بالواقع يشيرون الى نفس المكان الموجود في الذاكرة

خرج الكود السابق
Anonymous voting

#include <iostream> using namespace std; struct f{ int a,b; }; int main() { f x{1,2}; f &b=x; if(&b==&x)cout<<"Equal"<<endl; else cout<<"Not Equal"<<endl; return 0; }

خرج الكود السابق
Anonymous voting

struct f{ int a,b; }; int main() { f x{1,2}; f &b=x; b.a=10; cout<<x.a<<endl; return 0; }

الشرح : حجم الـ Record 8 بايت
Record r[4] = {{10, 1}, {20, 2}, {30, 3}, {40, 4}}; f.write((char*)r, sizeof(r));
هون كتبنا المصفوفة دفعة واحدة على الملف 8*4=32 نحن حاليا واقفين عند البايت 32
f.seekg(-2 * (long)sizeof(Record), ios::end); cout << f.tellg() << " ";
هون رجعنا لورا بمقدار 8*2 يعني 16 بايت فصرنا واقفين عند البايت رقم 16 فهاد اول جزء من الخرج 16
ملاحظة : العناصر مخزنة كالاتي اول عنصر من 0 الى 7 الثاني من 8 الى 15 الثالث : من 16 الى 23 الرابع من 24 الى 31
بعدها قرأنا عنصر من المصفوفة
Record temp; f.read((char*)&temp, sizeof(Record));
يعني مشي مؤشر القراءة بمقدار 8 بايت للامام يعني وقف عند 24
f.seekg(-(long)sizeof(Record), ios::cur); f.seekg(-(long)sizeof(Record), ios::cur);
بعدها رجعنا 8 بايت مرتين يعني رجعنا اول مرة الى 16 بايت ثم الى 8 كل مرة عم برجع بالنسبة للعنصر يلي واقف عنده
f.read((char*)&temp, sizeof(Record));
هلأ رح ناخذ من 8 الى 15 ونخزنها ضمن الـ temp يلي هو بمثل ثاني عنصر من المصفوفة يعني
20 2
بعد القراءة رح يمشي مؤشر القراءة بمقدار 8 الى الرقم 16 يعني رح يطبع اخر الشي 16
cout << temp.id << " " << temp.val << " " << f.tellg() << endl;

خرج الكود السابق :
Anonymous voting

#include <iostream> #include <fstream> using namespace std; struct Record { int id; int val; }; int main() { fstream f("rec.bin", ios::binary | ios::out | ios::in | ios::trunc); Record r[4] = {{10, 1}, {20, 2}, {30, 3}, {40, 4}}; f.write((char*)r, sizeof(r)); f.seekg(-2 * (long)sizeof(Record), ios::end); cout << f.tellg() << " "; Record temp; f.read((char*)&temp, sizeof(Record)); f.seekg(-(long)sizeof(Record), ios::cur); f.seekg(-(long)sizeof(Record), ios::cur); f.read((char*)&temp, sizeof(Record)); cout << temp.id << " " << temp.val << " " << f.tellg() << endl; return 0; }

الشرح:
Student arr[3] = {{1, 80}, {2, 90}, {3, 100}}; f.write((char*)arr, sizeof(arr));
هون الشي يلي عملنا اننا عملنا مصفوفة من نوع Student وكتبناها كلها دفعة وحدة بالملف
1 80 2 90 3 100
f.seekp(sizeof(Student));
هون يعني اننا رح نتحرك للبايت يلي رقمه 8
Student temp{4, 95}; f.write((char*)&temp, sizeof(Student));
رح نستبدله بـ 4,95
1 80 4 95 3 100
f.seekg(0, ios::end); int count = f.tellg() / sizeof(Student);
بعدها اتحركنا الى اخر بايت يلي هو رقمه 24 وقسمنا على حجم الـ Student يلي هو 8 وطلع عنا 3 عناصر لما بقول :
f.seekg(0, ios::end);
المؤشر رح يوقف بعد اخر بايت مباشرة اخر بايت مستخدم هو 23 فهو رح يوقف عند 24
f.seekg(sizeof(Student), ios::beg);
هون رح يوقف مؤشر القراءة عند البايت رقم 8 بيمشي من الصفر +8
Student st2; f.read((char*)&st2, sizeof(Student));
رح يخزن البيانات ضمن الـ st2 يلي هي بيانات ثاني student يلي هو نفسه بدلناه من شوي
1 80 4 95 3 100
يعني رح نطبع 3 4 95

خرج الكود السابق
Anonymous voting

#include <iostream> #include <fstream> using namespace std; struct Student { int id; int mark; }; int main() { fstream f("st.bin", ios::binary | ios::out | ios::in | ios::trunc); Student arr[3] = {{1, 80}, {2, 90}, {3, 100}}; f.write((char*)arr, sizeof(arr)); f.seekp(sizeof(Student)); Student temp{4, 95}; f.write((char*)&temp, sizeof(Student)); f.seekg(0, ios::end); int count = f.tellg() / sizeof(Student); f.seekg(sizeof(Student), ios::beg); Student st2; f.read((char*)&st2, sizeof(Student)); cout << count << " " << st2.id << " " << st2.mark << endl; return 0; }

اول شي حجم ال struct يلي اسمه point 8 بايت مكون من int ,int ثاني شي فتحنا الملف
fstream f("pi.bin", ios::binary | ios::out | ios::in | ios::trunc);
كتابة p1 محتويات الملف:
10 20
صار مؤشر الكتابة tellp() عند الـ 8 بالبداية كان 0 ونحن كتبنا 8 بايتات من الـ 0 لعند الـ 7 يعني كتبنا 8 بايت فالمؤشر رح يوقف عند البايت الثامن يلي لسا ما كتبنا عليه شي ثاني شي كتبنا p2
10 20 30 40
صار مؤشر الكتابة عند الـ 16 يعني كتبنا على البايتات من رقم 8 الى 15 ثالث شي رجعنا لورا من المكان يلي واقفين فيه 16 بمقدار 8 بايت يعني وقفنا عند الـ 8 رجعنا كتبنا P3 يلي هي حجمها 8 بايت فرح تنكتب فوق 30 40
10 20 50 60
اخر الشي رح نحط مؤشر القراءة عند الـ 0 ونقرأ اول 8 بايت تلقائياََ رح يوقف مؤشر القراءة عند البايت الثامن بعد ما نقرأ اول 8 بايت(من 0 الى 7) بعدها رح نقرأ 8 بايت كمان فرح يوقف المؤشر عند البايت رقم 16 ويقرأ ثاني point بالملف يلي هي 50 60

محدا يتسرع بالاجابة لان عدد الاسئلة يلي رح ننشرها (اذا كملنا ) محدود جدا

خرج الكود السابق
Anonymous voting

#include <iostream> #include <fstream> using namespace std; struct Point { int x; int y; }; // sizeof(Point) = 8 bytes int main() { fstream f("pi.bin", ios::binary | ios::out | ios::in | ios::trunc); Point p1{10, 20}, p2{30, 40}, p3{50, 60}; f.write((char*)&p1, sizeof(Point)); f.write((char*)&p2, sizeof(Point)); f.seekp(-8, ios::cur); f.write((char*)&p3, sizeof(Point)); Point res; f.seekg(0, ios::beg); f.read((char*)&res, sizeof(Point)); f.read((char*)&res, sizeof(Point)); cout << res.x << " " << res.y << " " << f.tellg() << endl; return 0; }

هاد شرح احد زملائكم لهاد التمرين:
عنا p1=2* لانو عم يأشر على x وعنا p2=3* لانو عم يأشر على y واخر شي p3=3* لانو هوي عم يأشر على المؤشر p2 وp2 عم يأشر على y
طيب بالاستدعاء عنا
Text(p1, z, p3) بطريقة ثانية Text(2,4,3
) هلأ منمشي بالتابع سطر سطر اول شي ال ٢ بدنا نضفلها ٥ بتصير ٧ x=7 ثاني شي ال ٤ بدنا نضفلها قيمة x بتصير ١١ z=11 ثالث شي تذكروا c** بتعني p3 يعني p2* يعني y ويلي قيمتها ٣ من وين جبت هالحكي؟؟ من هون: int* p2 = &y; int** p3 = &p2; يعني y بدنا نضيف عليها b يلي هيي عنا ياها z وقيمتها ١١ فبتصير ١٤ y=14 أهم سطر "c=a*" هون يلي صار ان p2 اخدت عنوان x يعني اي تعديل على p2 رح يصير بس على قيمة x ووقيمة p2 يلي هيي y رح تضل على حالها آخر سطر c+=10** يعني x بدنا نضفلها ١٠ وبتصير ١٧ x =17 هلأ للطباعة بالترتيب x=17 y=14 z=11 *p2=17 تذكروا p2 نفسها يلي سرقت عنوان x فصارت تأشر على x

ما بعرف اذا الدكتور رح يجيب شي دقيق لهي الدرجة بس تابع eof()
while(!in.eof()){ in>>x>>y; cout<<x<<' '<<y<<endl; }
بهيك مثال رح ينطبع اخر سطر من الملف مرتين على شاشة الخرج