March 5, 2016 "مقدمة إلى البرمجة الكينونية" oop Chapter 11: "" إعداد وتلخيص:- محمد المشرقي **تطلب من )معتز فرعون غرايبة && محمد مارس القرعان( عبر قروب الفيسبوك الخاص بالمادة
مقدمة :- الفكرة في هذا الدرس هو االنتقال من استخدام انواع البيانات الجاهزة المعرفة مسبقا في لغة البرمجة )مثل )int,float,char,double الى نوع بيانات خاص بي يتناسب مع احتياجاتي وهو شكل من اشكال تخزين البيانات ويدعى لنفرض مثال انه طلب مني تخزين معلومات طالب والمعلومات هي )اسم االول,واالسم االخير,ومعدله التراكمي,ومجموع عالماته ) فيما سبق وتعلمناه في كورس ال 111 يتم ذلك من خالل انشاء متغير لكل معلومة وهذه العملية ستكون صعبة في حال تسجيل عالمات طالب جامعة كاملة او مدرسة سنحتاج لمئات المواقع بل اكثر لتخزين هذه المعلومات لذا ال بد من وجود حل والحل هو بناء نوع بيانات خاص بي يتكفل بحجز هذه االماكن من خالل موقع واحد يحتوي على كل المعلومات للطالب الواحد.. لحل هذه المشكلة ==< فيما سبق تم استخدام المصفوفة لكن استخدام المصفوفة مشروط ان يكون نوع البيانات المراد تخزينها من نفس النوع ف بذلك يكون الفرق الجوهري بين ال والمصفوفة ان الستركت يمكن تخزين انواع بيانات مختلفة فيه على عكس المصفوفة.كما انه يتم الوصول لكل عضو من خالل اسمه ومعامل الربط "." dot : collection of a fixed number of components (members), accessed by name. A is a definition عملية تعريف وبناء الستركت كالتالي :- Syntax :
example[1] studenttype string firstname; string lastname; char coursegrade; int testscore; int programmingscore; double GPA; example[2] empolyee string fname; string lname; int sallary; example[3] name string fname; string mname; string lname; في االمثلة السابقة هي عملية بناء نوع البيانات الخاص بي ووضعت فيه العناصر حسب احتياجاتي ورح نوخذ example[1] لنشرح عليه عملية الوصول لكل عنصر وما ينطبق عليه ينطبق على جميع الحاالت. لتسجيل بيانات الطالب رقم "1" يتم تعريف متغير من نوع البيانات التي قمنا بانشائها. فيما سبق عملية تعريف نوع كان البيانات يتم كالتالي :- int x; //double y;// char n; and so on.. بصورة عامة البد من ذكر نوع البيانات بالبداية ثم اسم المتغير متبوع باشارة ";" وبنرجع بنحكي انو عليها من عملية التعريف.. كالتالي :- هي data type وما ينطبق على ال dataالسابقة type الذكر ينطبق االن اريد انشاء متغير يحتوي على العناصر المطلوبة مني كل ما علي فعله هو
studenttype student; studenttype newstudent; كل متغير من المتغيرات التي قمنا بتعريفها يحتوي على جميع العناصر الموجودة في الستركت.مثال للتوضيح :- Accessing Members عملية الوصول لكل عنصر او لكل عضو من اعضاء المتغير تتم من خالل صورة عامة : النقطة هي معامل الوصول لكل عضو من اعضاء المتغير.مثال:- To initialize the members of newstudent: newstudent.gpa = 0.0; newstudent.firstname = "John"; newstudent.lastname = "Brown";
example:- Assignment عملية اسناد متغير من نوع ستركت الى متغير اخر من نوع ستكرت هي عملية صحيحة ومقبولة على عكس المصفوفة لكنها مشروطة بأن يكون المتغيرين من نفس نوع الستركت The statement student = newstudent; student سيقوم المترجم بنسخ البيانات المخزنة في المتغير newstudent بنجاح الن المتغيرين من نوع studenttype الى المتغير وتمت العملية The assignment statement: student = newstudent; is equivalent to the following statements: student.firstname = newstudent.firstname; student.lastname = newstudent.lastname;
student.coursegrade = newstudent.coursegrade; student.testscore = newstudent.testscore; student.programmingscore=newstudent.programmingscore student.gpa = newstudent.gpa; example[] Comparison (Relational Operators) في عملية المقارنة ال يجوز مقارنة متغيرين من نوع ستركت كما انه ال يجوز استخدام relational operator مثل )==,=>,=<,<,>(والحل هو مقارنة كل عضو في المتغير بآخر من المتغير الثاني مثال -:
Variables and Functions هل يجوز استخدام متغير من نوع ستركت ك باريمتر لفنكشن طبعا يجوز الننا سبق وتكلمنا ان المتغير من نوع ستركت هو داتا تايب. A variable can be passed as a parameter by value or by reference ما هو -:by reference هو ارسال النسخة االصلية من المتغير الى الفنكشن وما يجري عليه بالفنكشن من عمليات تبقى محفوظة فيه عند الخروج من الفنكشن علما ان هنالك عملية هدم اوتوماتيكية للذاكرة تحدث لها بمجرد الخروج من الفنكشن ولتجنب هذه العملية في حال الرغبة في حفظ البينات والتغييرات والعمليات التي حدثت للمتغير بالفنكشن يتم ارساله بطريقة.by reference. يمكن للفنكشن ان يقوم بارجاع قيمة من نوع ستركت كالتالي :-
array in نيجي االن لموضوع المصفوفات ومدى امكانية استخدامها بالستركت-: المصفوفات اهميتها بالستركت انو بقدر احجز اكثر من مكان كل مكان بحتوي على كل العناصر والوصول لكل عنصر بكون بنفس الطريقة الي تعلمناها والي رح نرجع نحكي فيها هسا:- student int student_num; string fname; string lname; double gpa;; في حال رغبتي بادخال معلومات اكثر من طالب يتم حجز متغير من نوع student لكل طالب يحتوي هذا المتغير على المعلومات والبيانات والعناصر المعرفة مسبقا بالستركت لتسهيل العملية وحجز هذه االماكن عن طريق جملة واحد نستخدم المصفوفة.كالتالي :- student arr[3]; االن حسب الحجم الي كالتالي :- بحددو بالمصفوفة سوف يتم حجز اماكن بالذاكرة المكان االول يكون arr[0].student_num; arr[0].fname; arr[0].lname; arr[0].gpa; بالنسبة للموقع الثاني الي حجزتو رح يكون كالتالي مع العناصر الي بحتويها arr[1].student_num; arr[1].fname; arr[1].lname; arr[1].gpa;
كما يمكن تعريف مصفوفة داخل ستركت تحتوي االماكن التي يم تحديد نوعها وعددها من خالل عملية التعريف :- s within a في حال كان عندي ستركت يحتوي على معلومات موظف اسمو االول والثاني والخير وعنوانه التفصيلي المنطقة والمحافظة والبلدة والشارع ورقم تلفونو وعنوان بريده االلكتروني وما الى ذلك يعني بصورة اخرى كل مجموعة من البيانات هاي بدل ما احطهم كلهم بستركت واحد ويكون شكلو مش حلو وكبير بعملهم الجزاء كل جزء مختص بطبيعة هذه البيانات وليس نوع هذه البيانات يعني معلومات السكن بحطهم بستركت لحال ومعلومات االسم بستركت لحال وبجمعهم كلهم في ستركت رئيسي يحتوي بداخله الستركت التي قمت بتجزيئها..المثال للتوضيح
االن ليتم فهم ما سبق يجب الدخول الى الميموري ورسمها حتى تصل المعلومة %100 شكل الميموري بعد تعريف متغير من نوع الستركت االرئيسي يكون كالتالي ==>
---------------------------------------------- ---------------------------------------------------------------------------------------------------
1 A int x; ; B int x; A var[2]; ; void fun(int & x, B & obj) x++; obj.x=obj.x+3; obj.var[1].x++; int main() A obj1; B obj2; obj1.x=10; obj2.var[0]=obj1; obj2.var[1].x=20; obj2.x=obj1.x; fun(obj2.x, obj2); cout<<obj2.x<<endl; return 0; 2 A int var1; int Arr[3]; ; B int var1; A varst; ; void main() A obja; B objb; obja.var1=10; for(int i=0; i<3; i++) obja.arr[i]=i+2; objb.var1=100; objb.varst=obja; objb.varst.var1++; cout<<objb.var1<<" "<<objb.varst.var1<<endl; for(int i=0; i<3; i++) cout<<objb.varst.arr[i]<<" "<<endl; 14
A complex int x; int y; ; void fun(complex &a,complex b, int &c) c++; a.x+=5; a.y*=3; cout<<b.x<<" "<<b.y<<endl; void main() complex m; m.x = 2; m.y = -1; fun(m,m, m.x); cout<<m.x<<" "<<m.y<<endl;
B A int x; double y; ; B int x; A Arr[2]; ; void main() A vara; B varb; vara.x=10; varb.x=30; vara.y=20; varb.arr[1].x=100; varb.arr[1].y= varb.x+3; varb.arr[0]=vara; cout<< varb.arr[1].y<<" "; cout<<varb.arr[0].y<<endl; cout<<varb.x<<" "<<vara.x<<endl;
what the output :- #include<iostream> usingnamespace std; A int x,y; ; Output: 5 10 7 12 A add(a s1, int b) s1.x+=b; s1.y+=b; return s1; void main() A d,k; d.x = 5; d.y = 10; cout<<d.x<<" "<<d.y<<endl; k = add(d,2); cout<<k.x<<" "<<k.y<<endl;
من اهم االمور التي يجب إتقانها لتفادي وتالشي الخطأ في حل إسالة االوتبوت المتعلقة بالستركت يجب رسم الميموري وفيما يلي رسم توضيحي لبعض االمثلة لنتعلم من خاللها الية رسم الستركت بالميموري. #include<iostream> usingnamespace std; A ; int x,y[2]; B h n int h,n; A a1; d a1 x Y[0] void main() Y[1] B d; A int x,y; ; d[0] x y void main() A d[2]; d[1] x y
(نظام فواتير) write a program to help a local book store automates its billing system the program should have the following : 1- a BookLabel with the following member :- a-name: string variable for the name of the book. b- price : float variable for the price of the book. )عدد النسخ c-quantity : integer variable for the number of copies sold of the book. المباعة( 2- a Bill with the following members : a- customername: string variable for the customer name. b- Book[5] : an array of type BookLabel with size 5. c- number_sold_books: integer variable for the number of type of sold book 3- function read data :this function reads the name of customer and the book's names,book's price, book's quantity using cin (from user). the function ask first the customer about how many types of books want to buy stores it into the variable number_sold_book. the function has one parameter of type Bill (by reference ) 4- function printbill : this function print the billing amount by printing the name of customer and all information (the book's name,book's prices,book's quantity about the sold book and the finally the total money. if the total money exceeds the 50JD then the book store gives 10% discount 5- in main function :- a-create object called b1 of type Bill b- fill this object b1 by call function readdata. c-display the bill b1 by calling function printbill.
#include<iostream> #include<string> using namespace std; BookLabel string Name; float Price; int quantity; ; Bill string CustomerName; BookLabel Arr[5]; int nunmber_sold_books; ; void ReadData (Bill & b) cout<<"please enter customer name :"<<endl; getline(cin,b.customername); cout<<"enter the number of sold books types[maximum 5]:"<<endl; cin>>b.nunmber_sold_books; int c=1; for (int i=0; i<b.nunmber_sold_books; i++) cout<<"please enter book name for book num "<<c<<endl; cin>>b.arr[i].name; cout<<"please enter book price for book num "<<c<<endl; cin>>b.arr[i].price; cout<<"please enter quantity for book num "<<c<<endl; cin>>b.arr[i].quantity; c++;
void PrintBill (Bill b) float sum=0; cout<<"****************bill******************"<<endl; cout<<"welcome Customer "<<b.customername<<endl; cout<<"bookname\tprice\tquantity"<<endl; for (int i=0; i<b.nunmber_sold_books ; i++) cout<<b.arr[i].name<<"\t\t"<<b.arr[i].price<<"\t"<<b.arr[i].quantity <<endl; sum+=(b.arr[i].price*b.arr[i].quantity); if (sum>50) cout<<"total Money is :"<<sum<<endl; sum=sum-(sum*10/100.0); cout<<"total Money After 10% discount is : "<<sum<<endl; else cout<<"total Money is : "<<sum<<endl; int main () Bill b1; ReadData(b1); PrintBill(b1); الحمدهلل الذي بحمده تتم الصالحات