Professional Documents
Culture Documents
مدخل الى الخوارزميات والبرمجة PDF
مدخل الى الخوارزميات والبرمجة PDF
نظري 2
النظري:
فيه الساس النظري للبرمجة و بعض التمارين التطبيقية المباشرة .
العملي:
و فيه مجموعة من التمارين الضافية على المواضيع المطروحة في الجزء النظري .
و يحوي على 38سؤال في تلك المواضيع
مقدمة:
بسم ال الرحمن الرحيم و الصلة و السلم على محمد خاتم النبيين ،هذا الكتاب يشكل أساس
بسيطا jيمكنك من خلله الدخول في عالم البرمجة و يوفر لك قاعدة لفهم طريقة عمل البرامج من
خلل بعض المثلة التطبيقية .
الخوارزميات
أنواع الخوارزميات:
-خوارزميات حسابية
y=3x3/3x−4 مثال :خوارزمية حساب القيمة
/1معرفة قيمة الـ ) xالمدخل (
/2حساب قيمة البسط ) ( u=2x3
/3حساب قيمة المقام ) ( v=3x−4
/4حساب قيمة قسمة البسط على المقام ) ( u /v
/5طباعةالنتيجة )خرج(
يمكن صياغة الخوارزميات بطرائق تتفاوت فيما بينها من حيث دقة التعبير و سهولة الفهم و أهم
الطرائق المستخدمة لكتابة الخوارزميات:
– الطريقة اللغوية
– الطريقة الترميزية
– الطريقة البيانية)المخططات التدفقية (flow chart
لدينا 10طلب و نرغب في إدخال درجات الطلب في ثلث مقررات و من ثم حساب و طباعة
معدلت الطلب مع الدرجات لكل طالب .
i<10
الحل:
من المفضKل أن تحاول بنفسك أول. j
و نلحظ هنا أننا فرضنا قيمة ابتدائية للـ sumوهي الصفر التعليل :
لوفرضنا أن الـ sum=1مثل فإن هذا سيؤدي إلى خطأ حتما jو السبب في ذلك هو أن الخوارزمية
عندما ستبدأ بالحالة 0سوف ندخل العدد و بالتالي ستجري الخوارزمية عملية جمع مع sum
القديمة وهي لو فرضناها 1لكان الناتج النهائي سيزداد 1عن القيمة الصحيحة .لذلك فرضنا قيمة
الصفر كقيمة ابتدائية مع العلم أن sum=0هي قيمة الـ sumفقط للحالة 0و بعدها ستصبح قيمتها
من قيمة aالمدخل )(sum=sum+a=0+a=aو في الحالة التي تليها تصبح قيمة الـ sumهي
نظري 14
sum=sum+a=a1+a2
التمرين الثالث:
ارسم مخططا jتدفقيا jلمعرفة أية العداد أكبر من بين 3أعداد مدخلة
قبل البدء بالحل يجب أن نفكر بالحل الرياضي لها ،سنبدأ في إحدى الحتمالت باعتبار أن العداد
هي a، b، cو الن لنفرض هل a>bإذا كان ل هل c>bإذا كان نعم كانت cهي أكبر العداد وإذا
كان ل كان bأكبر العداد وإذا كان a>bمحققة هل a>cإذا كان نعم كانت aهي أكبر عدد و أما إن
كان ل كانت cأكبر العداد و الن نرسم المخطط بعد دراسة الحالت .
نظري 15
نظري 16
لدى مؤسسة كهرباء 10000مشترك و ترغب المؤسسة في جباية قيمة فواتير الكهرباء لدورة ما ،
فإذا كانت كمية الكهرباء )ولتكن ( sizeأقل أو تساوي 1000كيلو فإن سعر الكيلو يكون )ربع دينار (
و إذا كانت كمية الستهلك أكثر من 1000و أقل أو تساوي 2000كيلو فإن سعر الكيلو يكون )نصف
دينار( عدا عن ذلك فإن سعر الكيلو يكون)أربع دنانير( و المطلوب ضع المخطط التدفقي الذي يتضمن
ما يلي :
-قراءة كميات الستهلك لكل المشتركين .
-حساب و طباعة قيمة الفاتورة لكل مشترك )لتكن . (pay
– حساب عدد المشتركين الذين يزيد استهلكهم للكهرباء عن 2000كيلو في الدورة )و ليكن
.(n
– حساب المبلغ الجمالي )و ليكن ( amountالذي سيتم تحصيله من قبل المؤسسة خلل
الدورة النفة الذكر .
– طباعة عدد المشتركين nو المبلغ الجمالي . amount
الحل:
نظري 20
نظري 21
نظري 22
أول و بما أن هذه المسالة معقدة أو متشابكة إلى حد Kما فمن المفضل في هذه الحالت تفريغ
المعطيات بشكل مختصر لكي يسهل الحل.
أول :الرموز
عدد المشتركين ، nو حجم الستهلك لكل مواطن sizeولكل المواطنين ،sumsizeالفاتورة ، pay
المبلغ الجمالي sumpay
ثانيا : jالتعريفات
اكيلو ¼ دينار لمن أقل أو يساوي 1000و ½ دينار لمن أكبر من 1000و أقل أو يساوي 2000
1كيلو 4دنانير لمن أكبر من 2000
التمرين الثاني :ضع المخطط التدفقي اللزم لحساب و طباعة جذور المعادلة
ax 2bxc
و إلى هنا ننهي مقدمتنا حول الخوارزميات و لكن يجب أن ننوه أن بحث الخوارزميات بحث واسع جدا
يشمل جميع جوانب الحياة و فيه تشعبات كثيرة و لكن قد استخدمنا منه هنا ما يفيدنا في التمهيد و
الدخول إلى البرمجة بلغة الـ سي بلس بلس .1
تعد لغة الـ سي بلس بلس لغة عالية المستوى و هناك العديد من لغات البرمجة الخرى عالية
المستوى مثل الجافا و فورتران و تعرف اللغة العالية المستوى بأنها اللغة ذات التعليمات
القريبة من اللغة المحكية و من هذه التسمية لبد ان يخطر إلى بالك أنه هناك لغة منخفضة
المستوى و التي تسمى أحيانا jلغة اللة ،و يجب على أي برنامج مكتوبة بأي لغة عالية المستوى
أن يترجم إلى اللغة منخفضة المستوى و هذا يعد كسلبية صغيرة للغات عالية المستوى لن هذه
2
-1المفسKر :و هو برنامج يقرأ و يترجم البرنامج سطرا jسطرا.j
-2المترجم :compiler
يقرأ كود البرنامج بشكل كامل و من أشهر المترجمات البرنامج الذي تنتجه الشركة الحتكارية
)هناك أنواعا Jأخرى و لكن نستخدم هذا النوع كبداية( )(void main
{
)التعليمات(;statments
}
-2إي Kملحظة أو شرح تريد إضافته على كود البرنامج يمكن إضافته بالشكل التالي :
//adde any comment you want here
أو
/*adde any comment you want here*/
-3إن التعليمة endlتنهي لك السطر و تبدأ بسطر جديد في الظهار و مثال على ذلك البرنامج التالي
اكتب برنامجjا يظهر لك الرسالة التالية في حالتين :
-4إن التعليمة coutتظهر لك على الشاشة كل ما يوجد بين علمتي التنصيص“ “ .و الجدير
بالملحظة أن التعليمة تكتب بالشكل التالي و من الخطأ أن تقلب اتجاه السهم و السبب سيمر Kمعنا
بعد قليل .
>#include <iostream.h
تباعا. j
ملحظة :
ل يشترط أن تكتب البرنامج في هذه اللغة على عدة أسطر بل يمكنك أن تكتب البرنامج كله على
سطر واحد شرط أن تضع الفواصل و القواس اللزمة و لكن من العادات البرمجية الجيدة أن يكون
برنامجك واضحا jللقارئ مزود بمجموعة من الملحظات موزعا jعلى أسطر .
//declaring variables
>#include <iostream.h
الخرج )( void main
{
my name is ahmad .
;char name
i'm a student Press any key
;int age
cout <<”enter the first letter of your
; name .please!”<<endl
; cin>>name
; cout <<”how old are you ?”<<endl
;cin>>age
cout <<”the first letter of your name
; ”<<name<<”---your age is ”<<age<<endl
}
الحل:
نظري 32
الشرح :
إن المفاهيم الجديدة التي أوردناها في هذا البرنامج هي :الدخال و استخدام التصريح عن
المتغيرات و إخراج قيم المتغيرات .
ملحظة :الحالة العامة تقول أن قيمة المتحول متوافقة مع نوعه مع المكانية في بعض الحيان
التحويل من نوع إلى آخر و سيمر Kلحقا jمثال على هذا إن شاء ال تعالى .
المتغير البولي:
Boolean variableيأخذ هذا المتغير قيمتين 0و هي دللة للخطأ و 1دللة لصحيح
مثل في هذا البرنامج البسيط :
>#include<iostream.h
الخرج )(void main
{
test1=1 ;bool test1,test2
test2=0 ;test1=true
press any key to continue. ;test2=false
”<<cout<<”test1= ”<<test1
;test2=”<<test2<<endl
}
و تستخدم المتغيرات البولية كثيرا jفي العبارات الشرطية و ليس من المهم الن أن تستوعب البرنامج
التالي -الذي يتحقق من تساوي عددين مدخلين -لنه يحتوي على بعض التقنيات التي لم نأخذها
بعد و لكن الهم هي الفكرة
نظري 34
نظري 35
نظري 36
الخرج >#include<iostream.h
enter 2 numbers )(void main
6 {
3 ;int x,y
0 ;cout<<"enter 2 numbers "<<endl
not equal ;cin>>x>>y
Press any key to continue ;)bool isequal=(x==y
------------------------------------------- ;cout<<isequal<<endl
enter 2 numbers ;)isequal=equal(x,y
3 )if(isequal
3 ;cout<<"equal"<<endl
1 else
equal ;cout<<"not equal"<<endl
Press any key to continue }
حيث أننا أسندنا للمتغير البولي عبارة علئقية و لها حالتين محققة 1أو غير محققة 0و عندما
استخدمنا المتغير في الشرط ifفإنه عند تحققه فإن البرنامج يطب equalو في حال غير ذلك يطبع
not equal
الدخال:
نستخدم التعليمة cinلدخال القيم )حرفية كانت أو عددية ( و هي من الشكل التالي حيث aمتغير
مصرKح عنه :
; cin>>a
و هنا يجب الشارة أن اتجاه السهم هذا لو ع¶كس أصبح اتجاه أسهم التعليمة coutو بالتالي أصبح
خطأ برمجي .
استخدامنا التعليمة coutلظهار العبارات النصية المحصورة بين ”“ أو قيم المتغيرات و التي نضعها
دون إشارتي التنصيص .
نظري 37
//using Assignment
الخرج
>#include<iostream.h
now it is 4:51:52.p )(void main
Press any key to continue {
; int min,hour,second
; char time
;'hour=4;min=51;second=52;time=' p
cout <<"now it is
"<<hour<<":"<<min<<":"<<second<<"."<<time
;<<endl
}
السناد:
عندما نريد أن نسند قيمة ما إلى متغير يجب أن أن نصرKح عن ذلك بصيغة تختلف بين السناد الحرفي
و الرقمي
السناد الرقمي:
وفق الصيغة
السناد الحرفي:
: الشرح
a+b + + الجمع
نظري 39
الصحيح
a==b المساواة
المساواة
B A أكبر أو
تساوي
Relational operators
عمليات علئقية
ab
أصغر
> <
ab
أكبر
> >
تساوي
)!(x==1 ! نفي
عمليات منطقية
logical operation
5
مثال
>#include<iostream.h
)( void main
{
; cout <<"how tall are you ?"<<endl الخرج
; int tall ? how tall are you
; cin>>tall 162
)if(tall<=160 !! welcom
cout <<"sorry you can't enter. you are under Press any key to continue
; 160 c.m"<<endl
else
; cout<<"welcom !!"<<endl
}
الشرح
-1بنية التحكم : if
if(condition)
statement
أو
if(condition)
{
block of statements
}
غير محقق
شرط
محقق
if جسم
End if
if (condition )
statement
else
statement
if(condition)
{
block of statements
else
{
block of statements
}
نظري 42
غير محقق
شرط
محقق
End if
)if(condition1
statement1
)if else(condition2
statement2
else
statement3
نظري 43
فلو تحقق الشرط الول ن¶فذ statement1ولو تحقق الشرط الثاني ¶نفKذ statement2و إن لم يتحقق
الشرطان يتم تنفيذ statement3
)if(condition1
{
block of statements1
}
)else if(condition2
{
block of statements2
}
else
{
block of statements3
}
الحل :
ربما تذكرون في مقدمة الكتاب استخدما المخططات التدفقية لحل مثل هذه الحالت و الن دعونا
نشاهد الجزء من المخطط التدفقي الذي وضعناه لحل نفس المسألة لتجدوا السهولة في كتابة
الكود المصدري لهذا البرنامج بالنظر إلى الشكل .
نظري 44
نظري 45
نظري 46
نظري 47
ل الخرجK ربما سيجيبك الشكل التالي و الذي يمثbreak التعليمةcase ونلحظ أننا وضعنا بعد كل
في الحالة الولىbreak التفيذي عندما حذفنا
فقامbreak ولكن لم يجد التعليمةr=a+b=9+5 وهذا يدلنا أن البرنامج قام أول بالعملية التالية
تفيد في الخروج من بنية التجكمbreak و هذا يدلنا أن التعليمةr=a*b=5*9:بالحالة الثانية و هي
.switch
switch(expretion)
{
case value 1 : statement1;
break ;
case value 2 : statemen2;
break ;
case value n : statementn;
break;
}
نظري 49
محقق
Case 1 Case1 body
غير محقق
محقق
Case 2 Case2 body
غير محقق
defualt body
defualt
End switch
ملحظة :
يمكن أن نضع التعليمة defaultفي نهاية البنية switchو التي تحوي على الحالة التي يقوم يها
البرنامج في عدم تحقق أي حالة من الخالت السابقة كما يلي :
البرنامج 19قابلة للحل
حتى الن من الجزء العملي
نظري 50
switch(operation)
{
case'+':r=a+b;
break ;
case'*':r=a*b;
break;
case'/':r=a/b;
break;
case'-':r=a-b;
break;
default : cout <<”this operation is not supported”<<endl ;
}
: البرنامج الثامن
. ا يظهر لك العداد من واحد إلى عشرةjاكتب برنامج
نظري 51
نظري 52
: الشرح
:بنى التكرار
غير محقق
شرط التكرار
محقق
جسم for
نهاية for
)while(condition
{
;statement/s
increas or decreas
}
do- جسم
while
غير محقق
شرط التكرار
محقق
do- نهاية
while
:مثال
ملحظه :لقد حددنا قيمة ابتدائية للمتغير iفي المثالين السابقين و لذلك لنه في حال عدم تحديد
قيمة للمتغير ابتدائية فإن الحاسوب سوف يأخذ قيمة عشوائية .
مثال :
احذف من الكود السابق القيمة البتدائية للمتحول iو لحظ أن الحاسوب سوف يبدأ بإظهار أرقام
سالبة صغيرة جدا jو يبدأ بالضافة إليها واحد حتى يصل إلى 11لينتهي البرنامج
نظري 56
نظري 57
:البرنامج التاسع
من ضمنهمb مع عدم إظهار الحرفg إلى الحرفa ا يكتب الحرف منjاكتب برنامج
//continue statement
#include<iostream.h>
void main()
الخرج {
for(char a='a';a<='g';a++)
a {
c if(a=='b')
d continue;
e cout<<a<<endl ;
f }
g }
Press any key to continue
:ملحظة
if(a=='b')
. هذا شرط و ليس إسناد قيمة
نظري 58
البرنامج العاشر:
اكتب برنامجjا بلغة السي بلس بلس يقوم بطباعية العداد من 1إلى 5حيث يتوقف باستخدام
:break
ت¶ستخدم التعليمتان breakو continueمن أجل تغيير مجرى تدفق التحكم ضمن البرنامج .حيث
تسبب التعليمة breakعند تنفيذها مع إحدى البنى التالية .switch, for , while ,do whileالخروج
من هذه البنية و يتابع البرنامج بعدها تنفيذ أول تعليمة تلي البنية و يوضح ذلك الشكل التالي:
نظري 59
غير محقق
شرط
break
داخلي
محقق
End loop
أما التعليمة continueتسبب عند تنفيذها مع إحدى البنى السابقة )ماعدا switchلن الـقرار
continueل يستخدم مع البنية (switch
تجاوز تنفيذ التعليمات داخل الحلقة و ذلك في حالة محددة و يتابع حلقة التكرار من أجل المرة
التالية ،
و باستخدام المخططات التدفقية
المصفوفات :
و هي وسيلة تخزين أساسية حيث تخزن مجموعة من المتحولت من نوع البيانات واحد ضمن كتلة
واحدة داخل الذاكرة و تفيد استخدام تقنية المصفوفات في عدة أمور:
نظري 60
;int a[4]={1,2,3,4},temp
)for(int i=0;i<3;i++
{
)for(int j=0;j<3-i;j++
{
)]if(a[j]<a[j+1
{
;]temp=a[j
;]a[j]=a[j+1
;a[j+1]=temp
}
}
}
نظري 61
2 3 4 انظر في المصفوفة التالية و التي يراد ترتيبها من الصغير إلى الكبير 1
و قبل أي شرح لبد لك أن نلحظ أننا نحتاج حلقتي تكرار متداخلتين لننا سنقارن كل عنصر مع باقي
العناصر و لذلك قد أخذنا iو jو أما بالنسبة لحدود هذين المغيرين فسوف أثبت¶ لك بالتجربة لماذا
أخذنا الـ iمن 0إلى arrsize-1و الـ jمن 0إلى arrsize-1-iوبالتالي بالنسبة لهذا المثال لدينا
الحدود هي
0<i<3 i++
0<j<3-i j++
i=0
[j=[0,3-0
i=1
[j=[0,3-1
نظري 62
i=2
[j=[0,3-2
المؤشرات : pointers
ت¶رى هل تسائلت لماذا نأخذ أول عنصر من المصفوفة بدليل 0أي ] arr[0و لماذا لم نأخذه 1؟
الجواب بالحقيقة مرتبط بالمؤشرات وشرح المؤشرات ليس الصعوبة بقدر ماهو القدرة على توصيل
فكرته وبالتالي لنبدأ على بركة ال :
المؤشر :
هو متغير ي¶خزÄن فيه عنوان جزء الذاكرة الذي يحتله المتغير في الذاكرة.
إذا فإن هذا المؤشر يحمل عنوان المتغير .
; pointee_datatype *pointername
التصريح عن المؤشر :
نوع المتغير الذي يشير إليه *اسم المتغير;
نظري 63
تمهيد المؤشر:
يجب أن نقوم بتمهيد المؤشر بعد أو أثناء التصريح عن المؤشر و يجب أن يكون التمهيد بقيمة
صحيحة و ليست عشوائية مثل المتغيرات العادية و يستخدم عامل الموضع في التمهيد .
;int a=5
;int *p=&a
;cout<<*p<<endl
الخرج:
5
pointee_datatype *pointername ;
pointername=new datatype[size];
و إعادته إلى نظامnew من أجل تحرير الجزء الذي تم تخصيصه عبر العاملdelete و يستخدم العامل
. التشغيل
: مثال
#include<iostream.h>
void main()
{
int nwsize;
cout<<"enter the size : \n";
الخرج cin>>nwsize;
enter the size : int *ptr;
25 ptr=new int[nwsize];
test(1)befor delete:5 *ptr=5;
test(2)after delete:-572662307 cout<<"test(1)befor delete:"<<*ptr<<endl;
delete ptr;
cout<<"test(2)after delete:"<<*ptr<<endl;
}
الخرج >#include<iostream.h
enter the size : )(void main
5 {
0 ;int nwsize
2 ;"cout<<"enter the size : \n
4 ;cin>>nwsize
6 ;int *ptr
8 ;]ptr=new int[nwsize
_Press any key to continue )for(int i=0;i<nwsize;i++
{
;*(ptr+i)=2*i
}
)for(int j=0;j<nwsize;j++
{
;cout<<*(ptr+j)<<endl
}
}
أي أن :
arr=&arr
الشرح:
لنفترض أنه لدينا برنامج يحجز مساحة بين 1024و 2048من عنواين الذاكرة و يبدأ عند 1024
بمصفوفة من نوع intأي كل عنصر سيحجز له بايتين فلو قلنا في البرنامج
;]cout<<arr[0
)*(1024+0
وهكذا
فلو لم يتم البدء من الـ indexصفر لكان أول عنصر أÇهمل
و بالتالي نحن عندما نكتب
]arr[0
>#include<iostream.h
)(void main
{
;}int arr[5]={1,2,3,4,5
;int *ptr=arr
)for(int i=0;i<5;i++
{
;"cout<<arr[i]<<"\t
}
;"cout<<"\n\n\n
;cout<<"now !!! reading array element using pointers"<<endl
)for(int j=0;j<5;j++
{
;"cout<<*(arr+j)<<"\t
}
;cout<<endl
////ptr=arr=&arr
)for(int k=0;k<5;k++
{
;"cout<<*(ptr+k)<<"\t
}
;cout<<endl
]cout<<*arr<<endl;//=arr[0
]cout<<arr<<endl;//=&arr[0
cout<<&arr<<endl;//arr=&arr
}
أدناه .
)(Void main
{
.
.
; )الوسيطات (function name استدعاء التابع
.
.
}
• تعريف مباشرة
أي نقوم مباشرة بتعريف التابع قبل الدالة mainكما يلي :
)(Void main
{
.
.
; )الوسيطات (function name استدعاء التابع
.
.
}
نظري 71
مثال:
اكتب برنامج يطبع حرف عدد ما من المرات باستخدام التوابع.
>#include<iostream.h -
تعريف التابعvoid type(char a,int n)// 3
{ -
)for(int i=0;i<n;i++ -
;"cout<<a<<"\n -
} Press any key to continue
)(void main
{
;char a;int b
;cout<<"enter(char,number)"<<endl
;cin>>a>>b
استدعاء التابع مع تمرير الوسيطات type(a,b);//
}
الخرج
)enter(char,number
نظري 72
و تابع للطباعةASCII اكتب برنامج يطبع لك أحرف البجدية النكليزية باستخدام جدول الـ
#include<iostream.h>
الخرج char typechar(char a)
enter first char and final char {
c return a;
g }
cdefgPress any key to continue void main()
{
char a,b;
cout<<"enter first char and final
char\n";
cin>>a>>b;
for(char i=a;i<=b;i++)
cout<<typechar(i);
}
: تمرين
: احسب المقدار التالي باستخدام التوابع
y− z : y.z0
w= 45 : y.z=0
z− y : y.z0
#include<iostream.h> الخرج
int calc(int y,int z)
{ enter (y,z)
if(y*z>0)
return z-y; 3
else if(y*z<0) 6
return y-z; 3
else if(y*z==0) Press any key to continue
return 45;
}
void main()
{
int y,z;
cout<<"enter (y,z)\n"<<endl;
cin>>y>>z;
cout<<calc(y,z)<<endl;
}
نظري 73
>#include<iostream.h
;)int add(int,int
)(void main
{
;int a,b
;"cout<<"enter 2 numbers ?please!\n
;cin>>a>>b
;cout<<"result:"<<add(a,b)<<endl
}
)int add(int a,int b
{
;return a+b
}
ولصناعة مكتبة تحوي على تعريف بالتابع addعلينا أن ننشئ الملفات التالية:
add.cpp -1
Int add(int a,int b)
{
return a+b;
}
main.cpp-2
. و فيه البرنامج دون استخدام تعريف للتابع
#include<iostream.h>
int add(int,int);
void main()
{
int a,b;
cout<<"enter 2 numbers ?please!\n";
cin>>a>>b;
cout<<"result:"<<add(a,b)<<endl;
}
main.cpp عن ترجمةadd لكي يعلم ما الكومبايلر ما هو عملadd و إننا نستخدم التصريح عن
add.h-3
#ifndef ADD_H
#define ADD_H
int add(int x,int y);
#endif
الخرج #include<iostream.h>
enter 2 numbers ?please! #include"add.h"
2 int add(int,int);
3 void main()
result:5 {
press any key to continue. int a,b;
cout<<"enter 2 numbers ?please!\n";
cin>>a>>b;
cout<<"result:"<<add(a,b)<<endl;
}
نظري 75
أنت الن مستغرب لماذا وضعنا ” “ للـ addو >< للـ . iostream.h
الجابة هي أن القواس الزاوية توضع لتضمين مكتبة مع الكومبايلر أساسا jأم استخدام إشارة
القتباس هي لتضمين مكتبة مزوKدة مما يدفع للبحث عن هذه المكتبة في الـ directoryالدليل الذي
يوجد فيه برنامجنا أول
عندما أنشئت الـ c++كانت جميع الملفات في الـ standard runtime libraryتنتهي بـ .hو كانت
7
النسخة الصلية من coutو cinموضوعة في iostream.hو لكن عندما خضعت اللغة لمعايير ANSI
واجهوا مشكلة و هي أن نقل كل التوابع من مكتبة الـ runtimeإلى std namespaceسيؤدي إلى
عدم عمل البرامج القديمة
فلذلك قاموا بوضع مكتبات بلواحق ، .hلذلك إما أن تستخدم المكتبة عبر الـ standarو بدون لحقة .h
أو تستخدم المكتبة و ليس عبر الـ standarو لكن مع .h
البنى structs
تستخدم البنى لتخزين أكثر من متغير ضمن كينونة واحدة هي البنية فمثل jإننا نحتاج للتعريف
بشخص ما على المعلومات التالية :السم ،العمر ،الجنس و هذا كله يندرج تحت البطاقة التعريفية
للشخص و هذا يترجم برمجيا jباشكل التالي:
Struct ID
{
; int age
;]char name[256
;char sex
;}
للوصول إلى أي متغير في هذه البنى نستخدم الشكل التالي و ذلك بعد أن نعرف عضو من البينية
إنشاء العضو:
;ID ahmad
;ahmad.age=30
;]ahmad.name[256
;ahmad.sex
الخرج >#include<iostream.h
)(void main
{
struct ID
{
enter your name ; int age
ahmad ;]char name[256
name:ahmad ;char sex
age:30 ;}
sex:m ;ID ahmad
Press any key to continue ;ahmad.age=30
;cout<<"enter your name"<<endl
;cin>>ahmad.name
;'ahmad.sex='m
"<<cout<<"name:"<<ahmad.name<<"\nage:"<<ahmad.age
;\nsex:"<<ahmad.sex<<endl
}
نظري 77
الصفوف :class
قبل البدء في شرح هذا المفهوم فإنه علينا أن نتعرف على شيء من تاريخ تطور البرمجة ،لقد بدأت
البرمجة بما يسمى بالبرمجة الجرائية حيث تعتمد على شرد السطور دون العتماد على أي
تقنية بنيوية مثل التوابع مثل jو لكن هذا المسار قد أوصل البرمجة إلى درجة كبيرة من التعقيد و
الطوÏل مما دفع بالمشتغلين في هذا المجال بالتفكير في حل جديد فتوصلو إلى فكرة البرمجة
البنيوية و من سماتها أنها سببت في تفتيت الكود و تصغيره و تسهيل التعامل معه من خلل
استخدام الدوال مثل jو لكن قد وصلت إلى درجة واجهوا فيها تعقيدات مع كثرة التوابع و البنى لذلك
توصلوا في النهاية إلى ماتسمى بالبرمجة الكائنية opject oriented programmingو التي
تعتمد على دمج مجموعة البيانات و الدوال التي تعمل عليها في كينونة واحد تسمى الكائن .
و قبل البدء في شرح الصفوف نعرج على الشرح النظري الخير من خلل مثال يساهم في تقريب
لنفترض أن دار من دور طباعة القرآن الكريم افتتحت عدة فروع في مدبنة القدس الشريف -أعادها ال
إلى عهدة السملين -لبيع المصاحف و انتشرت هذه الفروع في :حي سلوان حي الشيخ جراح و
طريق الشهداء في مدينة القدس القديمة و ط¶لب من كل فرع البيانات التالية ليتم تزويد الفرع
نظري 78
الرئيسي:
و بالتالي لكل فرع بياناته الخاصة و لو أردنا الحصول على أي معلومة فإننا مثل : jنطلب من الفرع الول
أن يخبرنا بعدد الكتب و بالتالي يقوم هو بفعل الجرد و يرسل النتيجة .
و لو أردنا إسقاط هذا على واقع الكلس فإنه يوافق مع التركيب النحوي ما يلي :
نظري 79
Class name
{ بيانات كل فرع
Private:
;Int Book_number
;Int sold
;Int remain
Public:
)(Void input المهام التي يقوم
{ بها كل فرع
إدخال مثل jعدد الكتب المباعة والمتبقية
}
)(Void book
{
عدد الكتب بعد الجرد
}
)(Void main
{
}
نظري 80
#include<iostream.h>
الخرج class readtime
{
private:
int min;
enter the time please int hor;
01 int sec;
29 public:
30 void input();
time .now is: void output();
1:29:30 };
Press any key to continue void time::input()
{
cout<<"enter the time please\n";
cin>>hor>>min>>sec;
}
void time::output()
{
cout<<"time .now is:\n";
cout<<hor<<":"<<min<<":"<<sec<<endl;
}
void main()
{
time obj;
obj.input();
obj.output();
}
بهذه التقنية أن تصنع ملف رأسي للكلس و بالتالي تستخدم في برنامجك أي عضوjو يكنك أيضا
دالي دون كتبة الكلس و ذلك بتضمين الملف الرأسي الذي يحوي الكلس و سنطبق ذلك على
: المثال السابق
: .h ملف المكتبة ذو اللحقة-1
//readtime.h
#ifndef READTIME_H
#define READTIME_H
class time
{
private:
int min;
int hor;
int sec;
public:
void input();
void output();
}
#endif
نظري 81
//readtime.cpp
#include"readtime.h"
void input()
{
cout<<"enter the time please\n";
cin>>hor>>min>>sec;
}
void output()
{
cout<<"time .now is:\n";
cout<<hor<<":"<<min<<":"<<sec<<endl;
}
: الملف الرئيسي-3
main الذي يحوي الدالة
//main.cpp
#include"readtime.h"
#include<iostream.h>
void main()
{
time obj;
obj.input();
obj.output();
}
التحديثات
إن شاء ال تعالى سيتم تحديث الكتاب كل فترة لذلك راسلنا على البريد اللكتروني :
e7aaprj@gmail.comإلى حين أن ننشئ الموقع بإذن ال تعالى .
الحقوق
يحق لك النتفاع بالكتاب بأي وجه مع ذكر اسم الفريق و دون أي استخدام تجاري لن هذا الفرق
وقفي و ل يجوز المتجارة باسمه بأي شكل .
الصور الموجودة من الكتاب ماكان منها من كتب خارجية فقد تم الشارة إليه و ماعدا ذلك فهو من
إنتاجيات الفريق و إن فكرة وضع الكود و بجنبه الخرج مأخوذة من كتاب :
cplusplus.comC++ Language Tutorial
تأكيد
جميع ما يكتب عبر الفريق قابل أن يحتوي على أخطاء لذا يرجى عدم اتخاذ إنتاجياتها مراجع داراسية
و ذلك خوفا jمن هذه المشكلة و كلنا أمل أن ننتج ما هو ل يحوي على الخطاء العلمية .