PI Team π ❷
Open in Telegram
PI Team فريق تطوعي من طلاب دفعة 2025- 2030 في كلية الهندسة المعلوماتية جامعة حمص، يهدف لمساعدة الطلاب في الدراسة ونشر المحاضرات والملفات الهامة دون مقابل.
Show moreThe country is not specifiedEducation63 666
1 427
Subscribers
-124 hours
-37 days
-1330 days
Posts Archive
1 427
#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; }
1 427
ننوه لوجود خطأ ضمن المحاضرة الرابعة
الخطأ الاول :
Complex ptr=&a;الصحيح انه يحتاج لنجمة لانه مؤشر
Complex *ptr=&a;وكذلك
Complex ptrN=new Complex;هذا حجز ديناميكي للذاكرة يحتاج لمؤشر ايضا
Complex *ptrN=new Complex;ونفس الشي الحجز الديناميكي لمصفوفة :
Complex ptrArray=new Complex[10];
Complex *ptrArray=new Complex[10];
1 427
بالمثال الثاني عم قارن بين مكانين بالذاكرة
وين المشكلة؟
بس مافيني قارن بين 2 Struct
ورح يعطي هاد الشي خطأ ترجمة
1 427
الشرح:
f x{1,2}; f &b=x;هنا تم انشاء x من نوع f ثم تم تعريف b بالمرجع وجعلها نفس x بالتالي اي تعديل سوف يتم على x سوف يتم على b والعكس صحيح لان المتغيرات هم فقط غير اسماء ولكنهم بالواقع يشيرون الى نفس المكان الموجود في الذاكرة
1 427
#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; }
1 427
struct f{ int a,b; }; int main() { f x{1,2}; f &b=x; b.a=10; cout<<x.a<<endl; return 0; }
1 427
الشرح :
حجم الـ 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;
1 427
#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; }
1 427
الشرح:
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
1 427
#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; }
1 427
اول شي حجم ال 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
1 427
#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; }
1 427
هاد شرح احد زملائكم لهاد التمرين:
عنا 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
1 427
ما بعرف اذا الدكتور رح يجيب شي دقيق لهي الدرجة
بس تابع
eof()
while(!in.eof()){ in>>x>>y; cout<<x<<' '<<y<<endl; }بهيك مثال رح ينطبع اخر سطر من الملف مرتين على شاشة الخرج
