eng_3llam

دورة سى بلس بلس من البداية

16 ردود في هذا الموضوع

بسم الله الرحمن الرحيم

والصلاة والسلام على اشرف المرسلين سيدنا محمد الصادق الامين ثم أما بعد

يعنى حبيت افيد الاخوة المبتدئين وكذلك المحترفين بتنشيط الذاكرة

وحبيت أنشط المنتدى الاكثر من رائع وأيضا هذة الدروس من أراد الرجوع الى اصلها يدخل على تللك هذا المنتدى

Cs4all.net/vb

وبالتالى

بأذن الله تعالى سنبدأ معا دورة فى السى بلس بلس من البداية

أولا: مراحل الكورس سيكون الكورس بأذن الله تعالى محتوى على كل من

Introduction in c++ and object oriented programming in c and data structure in c++

طريقة الشرح كتابة الكود اولا ثم شرحة كاملا وبعد نهاية الشرح ستجد مجموعة من الاسئلة البسيطة لتنشيط الذاكرة وتشغيل المخ:D

متطلبات الكورس

أولا الاعتماد على الله والصبـــــــــــــــــــــــــر

ثانيا ان يكون الborland 5.2v مستطب عندك

و

بس

يلا نبدأ

بسم الله

أول شيى لازم تسطب Borland 5.2v

ثم تفتح صفحة كتابة الكود عن طريق start programsborlnad 5.2v

ثم بعد ذلك ستجد أيقونة لونها أخضر أسها Borland c++ وهذة هى الايقونة

سنبدأ

ودة أول كود

#include <iostream>
void main()
{
cout<<"in the name of allah";
}

شرح البرنامج:

أولا عند عمل run للبرنامج وذلك عن طريق قائمة debugrun

أو أتك ctrl+f9

أول شيى يتم تنفيذة هى هذة الدالة التى تسمى main()

وتمسى بhead of program (رأس البرنامج)

على الرغم من ان البرنامج يحتوى على دوال أخرى وclasses ألا ان اول دالة يتم تنفيذها هى الmain function

وفى حالة عدم وجود تلك الدالة سيؤدى ذلك الى حدوث خطأ بعدم وجود main للبرنامج

طب والvoid ودة يسمى بالdata type of function

ومعناها ان تلك الدالة لاترجع اى قيمة

هترجع قيمة لمين؟؟

للجملة او المكان اللى مستدعيها وفى (تلك الحالة غالبا ما يكون الcompiler or os

وبأذن الله سنشرح الدوال وكيفية كتابتها فى دروس لاحقة

ثم بعد ذلك فتحت قوس مجموعة وقفلتة لكى اضع كود الدالة داخل هذان الاقواس

وكود هذة الدالة هو

Cout<<"in the name of allah";

أول شيى فى هذة الجملة هو الcout وتنطق (سى أوت)

عبارة عن object معرف فى ملف أسمة input output stream header file

وهو iostream.h وأيضا تلك العلامتين << تسمى بput

أو بال out (أوعى تقلق من الكلام التقيل دة سيشرح بأذن الله فى الover loading operator )

طب وال; (semicolon ) دى تدل على نهاية السطر

طب ما معنى هذا السطر

#include <iostream>



#include <> تسمى preprocessor

معناة ان بقول للcompiler لو سمحت يا عم الcompiler أعمل include لتعريف الcout من الheader file اللى انا كاتبة اى من iostream

حيث أن اى حاجة مكتوبة فى الmain لازم تكون معرفة للcompiler

فاذا كانت دالة مستدعيها يبقى لازم تكون معرفة وأذا كان متغير يبقى لازم يكون متعرف

طب لو كان function or object built in c++ وبالتالى لازم أعمل include للheader file بتاعة حتى يعرف مكان تعريف هذة الدالة او الكائن

طب دلوقتى لو جيت عملت run للبرنامج ستجد ان الشاشة السودة تختفى بسرعة جدا بدون ماتلاحظ الoutput

والحل هو هخلى الشاشة تظهر ثم أنتظلر من المستخدم الضغط على أى button من الكيبورد عند الضغط على اى button وبالتالى تختفى الشاشة السودة

وذلك عن طريق دالة اسمها getch() تسمى get character

حيث هذا الcharacter لا يظهر على الشاشة

أذا حبيت ان يظهر على الشاشة استخدم getche()

طب علشان أستخدم تلك الدالتين لازم أعرف الcompiler مكان تعريفهم

ودلك عن طريق عمل include to conio.h

وبالتالى يكون الكود كذلك

#include <iostream>
#include <conio>
void main()
{
cout<<"in the name of allah";
getch();
}

طب دلوقتى هعمل برنامج يطبع

Welcome

In c++

ودة الكود

#include <iostream>
#include <conio>
void main()
{
cout<<"welcome\nin c++";
getch();
}

والجديد فى هذا الكود هو أستخدام \n أى new line أى أطبع الجملة اللى قبلها واى حاجة بعد كدة اطبعها فى سطر جديد

كذلك وحبيت اطبع

Welcome inc++

عن طريق استخدام \t حيث معناها tap أى أخذ مسافة مقدارها tap أو one space

ودة الكود

#include <iostream>
#include <conio>
void main()
{
cout<<"welcome\t"<<"inc++";
getch();
}
ودة جدول الescape sequence
\n     new line
\t        tab
\a  beeb
\\    print \
\'    print'
\"   print "

ودة برنامج عن استخدام ""

#include <iostream>
#include <conio>
void main()
{
cout<<"\"welcome\"";
getch();
}

يعنى هيطبع "welcome"

طبعأ اى برنامج لازم يحتوى على حبة متغيرات طب ازاى اعرف متغير

عن طريق

Data type NameOfVariable

أولا الdata type

وهو نوع المتغير هل هوة int or double or char or float

أولا الint وهو عبارة عن اختصار ل integer يعنى عدد صحيح

حيث ان العدد الصحيح يمثل فى 4 byte حيث كل بايت تمثل فى 4 bit so it represent at 32bit ودة يعتمد على الsystem اللى انت شغال علية زى الwindows بيحجز للمتغير 32bit

طب والrange of int

-2,147,483,648 to 2,147,483,647

طب وال long أيضا مثل الint أى يحجز 32bit

أما الshort يمثل فى

-32,768 to 32,767

Char 0الى 127

وأيضا وجود unsigned int ومعناها ان الرقم يكون موجب فقط لا يحتوى على اشارة ولكن الsigned int هواللى يحتوى ع اشارة

Float وهو ان الرقم يكون بة كسر عشرى

Ex: float x=1.2;

أما الfloat وهو عبارة عن شيئين رقم صحيح وهو اللى على يسار العلامة وكسر عشرى وهو اللى على يسار العلامة

حيث الfloat ينقسم الى نوعين float or double

حيث ان الfloat يكون بين الارقام 3.4*10^-38 الى 3.4*10^38

وبالتالى تاخذ 4 byte

#include<iostream>
#include <conio>
void main()
{
int x;
 const float f=1.2;
cout<<"enter the value:\t";  cin>>x;
cout<<"the result is:\t"<<f*x;
getch();
}

أما الdouble and long double

زى الfloat ولكن يتطلب مساحة أكبر من الرام حيث يتطلب 8 byte

حيث يتراوح بين ال1.7*10^-308 to 1.7*10^308

أما فى حالة الNamOfVariable

أولا ممكن ان يكون capital or small لا يبدأ برقم

EX: int 1x=12; //error

ممكن يبدأ ب_

EX: int _x=12;

ممكن أن يكون أسم ولكن لا يكون بة مسافات طب أتغلب على المسافات عن طريق _

EX: int a_b=12; //true

Int a b=12; // false ERROR

ملحوظة خلى بالك أوعى تستخدم اى اسم محجوز للغة بمعنى

EX: int cout=12; //ERROR

Int cin =12; //ERROR

عدم تكرار أكتر من متغير بنفس الاسم داخل دالة واحدة يعنى زى المثال دة

void main()
{
int x=1.2;
float x=1;
cout<<x;
getch();
}

أيضا فى حالة المشاريع الضخمة لازم يكون اسماء الدوال والمتغيرات لها معنى بمعنى لا اسمى دالة تعمل جمع بأسم أحمد أو أى اسم غير دال على اسمها

طب دلوقتى نعمل برنامج بسيط يجمع عددين

#include <iostream>
#include <conio>
void main()
{
int x=1;
int y=2;
cout<<"the result is:\t"<<(x+y);
getch();
}

شرح البرنامج

عرفت متغير اسمة x من النوع int وبالتالى يحجز لة فى الرام 4byte

وعملتة initial أى أعطيتة قيمة مبدائية وهى 1

وكذلك مع الy

ثم بعد ذلك عملت جمع لتلك العدين وطبع الناتج عن طريق استخدام الcout المعرفة فى الiostream.h

أما(x+y)

الاقواس علشان لو كان العملية الحسابية كبيرة ممكن يعطى خطأ يسمى

Ambiguous

طب دلوقتى البرنامج دة مقتصر على جمع عددين فقط وهما ال1,2

طب لو عاوز المستخدم يدخل اى رقمين ويتم جمعهم

وذلك عن طريق استخدام cin >>

أنظر الى هذا الكود

#include <iostream>
#include <conio>
void main()
{
int x,y;
cout<<"enter the frist number:\t";
 cin>>x;
cout<<"enter the second number:";
 cin>>y;
cout<<"the result is:\t"<<x+y;
getch();
}

Cin>>x;

منعاها أعمل wait للبرنامج لخد ما المستخدم يدخل قيمة الx

عبارة عن كائن تعريفة يوجد فى الiostream.h header file

ويسمى بinput output stream header file

أول شيى يطبعenter the frist number:

يدخل المستخدم الرقم الاول ويخزن فى x

ثم enter the second number:

ويخزن فى الy

ثم بعد ذلك يطبع the result is sum of x+y

مثال أخر حل تلك الدالة

3x+5y+2x2

ودة هو البرنامج 
#include <iostream>
#include <conio>
#include <math.h>
void main()
{
int x,y;
cout<<"the equation is: 3x+5y+2x2\n";
cout<<"enter the frist number:\t";
 cin>>x;

cout<<"\nenter the second number:";
 cin>>y;
cout<<"\n the result is:\t"<<( (3*x)+(5*y)+(2*pow(x,2)) );
getch();
}

كل ما هو جديد ان استخدمت دالة اسمها pow()

علشان اطلع مربع الx

طب ما هو الفرق بين

++x

++x

لاحظ معى هذا الكود وانت هتعرف الفرق بينهما

#include<iostream>
#include <conio>
void main()
{
int x=12;
cout<<x<<"\n";
cout<<x++<<"\n";
cout<<x<<"\n";
cout<<++x<<"\n";
cout<<x<<"\n";
 getch();
}

طب أفترض وجود متغير float     ووجود متغير int 
EX:
Float x=1.2;
Int y;
Y=x;
Cout<<y;

ستكون قيمة الy=1 وذلك لان الcompiler عمل casting أى تحويلها من floalt to int ودة بواسطة الcompiler

طب لوحبيت اعمل الcast دة عن طريق

static_cast<toDataType I wanna>(variable who made cast

لاحظ ذلك الكود

#include<iostream>
#include <conio>
void main()
{
int x;
float y=1.23;
x=static_cast<int>(y);
cout<<x<<"\n";
 getch();
}

وبكدة يبقى انتهى الدرس الاول ويارب تكونوا أستفدوا

وموعدنا بأذن الله مع الدرس القادم وهو الloop and conditions

أسئلة :

أعمل برنامج يطبع

Welcome in c++ خمس مرات وكل مرة تكون فى سطر جديد

EX:

Welcome in c++  
Welcome in c++  
Welcome in c++  
And so on

وخلى بالك ان البرنامج دة هيكون مدخلنا للدرس القادم

أعمل برنامج يجمع عددين وأيضا أخر يطرح عددين

أعمل برنامج يحل تلك المعادلة

2x+12xy+2x2+5y

و

ممممم

وبس

خلاص

:D

تم تعديل بواسطه HGB
2

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

مشكور أخي على الشرح وياليت يكون فيه واحد ينشط الذاكره مثل أسئلة أخيeng_3llam

وبالنسبه للأسئله

Welcome in c++ خمس مرات وكل مرة تكون فى سطر جديد

هو

#include<iostream>
using std::cout;
using std::endl;
int main()
{
cout<<"Welcome in c++"<<endl
 <<"Welcome in c++"<<endl
 <<"Welcome in c++"<<endl
 <<"Welcome in c++"<<endl
 <<"Welcome in c++"<<endl;
return 0;
}

أعمل برنامج يجمع عددين

هو

#include<iostream.h>
int main()
{
int x,y,z;
cout<<"Enter 2 number:"<<endl;
cin>>x>>y;
z=x+y;
cout<<"The sum is "<<z<<endl;
return 0;
}

وأيضا أخر يطرح عددين

هو

#include<iostream.h>
int main()
{
int x,y,z;
cout<<"Enter 2 number:"<<endl;
cin>>x>>y;
z=x-y;
cout<<"The sub is "<<z<<endl;
return 0;
}

أعمل برنامج يحل تلك المعادلة

2x+12xy+2x2+5y

هو

#include<iostream.h>
int main()
{
int x,y,t;
cout<<"Enter 2 number:"<<endl;
cin>>x>>y;
t=2*x+12*x*y+2*x*2+5*x;
cout<<"The total is "<<t<<endl;
return 0;
}

أنا في أنتظار الدرجات أستاذيeng_3llam :lol:

وكذالك في أنتظار الأسئلة الأخرى :)

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

وهذا حل البرنامج الأخير لأنه الأخ programme عنده خطأ في الباور...

#include <iostream>
#include <math.h>
using namespace std;
void main()
{
int x,y,t;
cout<<"Enter two numbers:"<<endl;
cin>>x>>y;
t=(2*x+12*x*y+2*pow(x,2)+5*x);
cout<<"The total is "<<t<<endl;
}

هاه كم درجتي يامهندس علام :D ؟؟

تحياتي لك أخي العزيز...

مرهف الحس

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

أشكرك يا أخ مهرف الحس وأشكر الاستاذ شمرى على المروركم

using namespace std;

تمام جدا انك كتبتها انا عفوا قد نسيت أن اقولها

ثانيا ممكن الاستغناء عنها ولكن كلتا الاجابتين صح

وملاحظة أخرى أبسط من اللي قبلها وهو استخدامك للـ ( t\ ) فلا داعي لها لأنك تستطيع كتابة مسافة عادية بالـ space key وراح تطلع لك في الآوت بت عادي

صح ما فيش مشكلة ولكن حبيت احطها حتى أكون حاولت الالمام بما يخص تلك الجزئية

t=(2*x+12*x*y+2*pow(x,2)+5*x);

سليم جدا أنا نسيت أصححها

أيوة كدة يسلااااااااااااام على التفاعل

أشكركم جميعا على التفاعل وبأن الله سأضع الدرس الثانى قريبا جدا

ملحوظة بسيطة: الهدف من الاسئلة لتنشيط المخ لا غير والتفكير

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

بسم الله الرحمن الرحيم

بعد ان تكلمنا عن كيفية تعريف متغير وأيضا أزاى أعطيلة قيمة ابتدائية

وأيضا أزاى أطبع على الشاشة جملة وازاى أجعل المستخدم يدخل قيمة

وفى المرة السابقة اخذنا برنامج لطباعة كلمة welcome أكتر من مرة وكان حوالى عدد المرات 5

طب لو كان عدد المرات كبييير جدا حوالى 100 مثلا

هكتتب حوالى ميت سطر علشان تطبع كلمة welcome

طب والحل هو الloop or iterations

دلوقتى هنبدأ فى حاجة جديدة تسمة بiterations or loop

وهى عبارة عن تكرار جملة أو أكثر لفترة محددة عندما يكون الشرط الاختبار صحيح حيث يوجد أربع أشياء ممكن يمثل بها الiteration

وهى for or while or do-while or goto

أولا الfor

تستخدم لتكرار جملة معينة او اكثر (body loop )لفترة محددة (number of time)

يكرر الbody عندما يكون الcodtion is true وعندما يكون false تنتهى عملية التكرار والتحكم ينتقل الى السطر الذى يلى الloop

تكتب

For(intializaton; testing; increment and decrement)

أولا :

ال intializaton

وهو أعاء قيمة ابتدائية لloop variable (حيث هو المتغير المستخدم داخل اللوب فى الذيادة او النقصان )

ثانيا :

الtesting

وهو المستخدم فى عملية اختبار الشرط أذا كان true ينفذ الstatement loop body

واذا كان false

فيخرج من الloop كما قلنا

ثالثا:

هو المستخدم فى ذيادة الloop variable بقدار محدد او نقصانة بمقدار محدد

خلى بالك من الsemi colon التى تفصل بين كل شق فى الloop

وحلى بالك أيضا ان body of loop تكون جملة واحدة

طب لو اكتر من جملة يبقى لازم الbody of loop يضع داخل {}

مثال

#include <iostream>
#include <conio>
void main()
{
int i;
for( i=1;i<10;i++)
 cout<<i<<"\n";
getch();
}

فى بداية الامر عرفت متغير أسمة I من النوع int حيث هذا المتغير يسمى بloop varible

For(i=1;i<10;i++)

فى بداية الامر عملت initial للمتغير I =1

ثم بعد ذلك الجزء الثانى وهو الtesting

أذا كانت قيمة الi

أقل من أو يساوى ال12

ينفذ الbody of loop

ثم بعد ذلك الجزء الثالث هو الincrement

أزود قيمة المتغير I بمقدار واحد

بمعنى ان تلك الجملة i++

تعادل

I=i+1

أو i+=1

وكدة البرنامج دة هيطبع الاعداد من 1 الى 9

حيث عند عمل run للبرنامج

أو شق من الloop سينفذ مرة واحدة

أما عن الشق الاختبار سينفذ n+1 وبما n=10 يعنى سينفذ 11 مرة

أما عن الincrement سينفذ n مرة يعنى 10

وكذلك الbody سينفذ 10 مرات

وبالتالى يكون البرنامج السابق بتاع طباعة كلمة welcome اكتر من مرة سيكون

#include <iostream>
#include <conio>
void main()
{
for(int i=0;i<5;i++)
 cout<<"welcome\n";
getch();

طب لو عندى more statement يعنى اكثر من جملة الحل ان الfor تكتب كما

 
For(initial; testing; increment or decrement )
{
// Body Of The Loop
}

مثال برنامج يجمع الاعداد من 1 الى 5 وكذلك يضربهم

#include <iostream>
#include <conio>
void main()
{
int i=1;
for(;i<=5;i++)
 {
   cout<<i<<"*"<<i<<"="<<(i*i)<<"\n";
   cout<<i<<"+"<<i<<"="<<(i+i)<<"\n";
   cout<<"\n\n";
 }
  getch();
}

الشرح:

اولا : لاحظ طريقة كتابة الloop عملت initial للمتغير قبل اللوب بس لازم يكون لة مكان داخل جسم اللوب وبالتالى تركت مكانة فاضى كما هو فى البرنامج

أنا عاوز البرنامج يضرب الاعداد من 1 الى 5

تبقى عملية اtesting تكون

I<=5

لاحظ وجود ال= حتى يكون ال5 معاى فى عملية الضرب والجمع

طب لو كانت

I<5

يبقى أخرة عند 4 وبس حيث ان ال5 ليست اقل من ال5

طب وجود أكتر من جملة داخل الloop وبالتالى علشان يتنفذوا كلهم وضعت ال body of the loop داخل أقواس {}

كذلك ممكن تكتب اللوب كما يلى

int i=1;
for(;i<=5;)
 {
   cout<<i<<"*"<<i<<"="<<(i*i)<<"\n";
   cout<<i<<"+"<<i<<"="<<(i+i)<<"\n";
   cout<<"\n\n";
   i++;
 }

Nested loop معناها وجود اكتر من loop

مثال بسيط جدا لطباعة شوية نجوم :

#include <iostream>
#include <conio>
void main()
{
int i,j;
for(i=0;i<=10;i++)
 {
   for(j=0;j<i;j++)
    cout<<"*";
  cout<<"\n";
 }
 getch();
}

لاحظ الكود جيدا

فى بداية الامر عند عمل run للبرنامج ستجد

أن الi=0 طب والbody of this loop عبارة عن another loop

وبالتالى سينفذ الj=0 ثم يختبر هل ال0<0

لا طبعا وبالتالى لا ينفذ الbody of inner loop وبالتالى يتجاهل

Cout<<"*";

وينفذ

Cout<<"\n";

ثم يزود الi تبقى بتساوى 1

ثم يدخل يعمل intial to j=0 ويختبر هل ال0<1 تمام وبالتالى

ينفذ

Cout<<"*";

ثم يزود الj تبقى بتساوى j=1

ثم يختبر هل 1<1 لا وبالتالى يطلع من تللك اللوب (المقصود هنا اللوب الداخلية)

ثم ينفذ

Cout<<"\n";

ثم بعد كدة يزود الi تبقى ب 2 ويختبر هل 2<10 نعم

يدخل ينفذ الbody سيجد ان الbody عبارة عن loop وبالتالى يعمل initial

للمتغير j=0

ثم يختبر هل ال0<2 نعم وبالتالى ينفذ

Cout<<"*";

ثم يزود القيمة المتغير jتبقى j=1

ثم يختبر هل 1<2 نعم

وبالتالى يبفذ ال body بتاع اللوب الداخلية يعنى يطبع *

ثم يزود تبقى الj=2 هل ال2<2 لا وبالتالى يخرج من تلك اللوب وينفذ

Cout<<"\n";

حيث هذا السطر تابع للexternal for

و

وهكذا حتى تجد الoutput

ثانى نوع يتم تمثيل بة الiteration هو الwhile loop

وتستخدم فى حالة عدم علمك كم مرة سيتم تنفيذ ذلك الكود

وتكتب

	
//initialize loop variable
While(testing )
{
//Body of While Loop
//increment or decrement
}

مثال لطباعة الاعداد من االى 10

#include <iostream>
#include <conio>
void main()
{
int i=1;
while(i<=10)
 {
  cout<<i<<"\n";
  i++;
 }
 getch();
}

معنى الكود نفذ الbody عندما يكون الشرط صحيحا

طب ممكن يبقى اكتر من while داخل بعض

نعم لاحظ ذلك الكود

void main()
{
int i=0,j;
while(i<=10)
 {
   j=0;
   while(j<i)
    {
      cout<<"*";
      j++;
    }
   cout<<"\n";
   i++;
 }
 getch();
}

طب أما الdo-while()

زى الwhile لووب شرطية نفذ الbody طالما ان الشرط سليم

وتكتب

//initial loop variable
Do
{
//body of loop
}while(condition is true);

بمعنى نفذ ثم أختبر الشرط

مثال لطباعة الاعداد من1 الى 10

#include <iostream>
#include <conio>
void main()
{
int i=0;
do
 {
   cout<<i<<"\n";
   i++;

 }while(i<=10);

 getch();
}

فى بداية الامر أعطيت للمتغير I قيمة أبتدائية وثانيا

كتبت الbody بتاع اللى انا عاوزوة ينفذ اكتر من مرة

داخل

Do{

}while();

لاحظ معى ذلك الكود

#include <iostream>
#include <conio>
#include <process.h>
void main()
{
char w='y';
int x,y;
 do
 {     clrscr();
   cout<<"enter the frist number:\t";
    cin>>x;
   cout<<"enter the second number:\t";
    cin>>y;
  cout<<"the result is\t"<<x+y<<"\n";
  cout<<"are u want to enter another data(y,n)==>";
   cin>>w;
 }while(w!='N'&&w!='n');
 exit(0);
getch();
}

عرفت متغير من النوع char وأعطيتة قيمة ابتداية وهى y

ثم عرفت متغيرين من النوع int وهما x,y

ثم

داخل الdo-while

أول أمر هو clrscr()

وهو clear screen أى يمسح الشاشة

ثم

طبعت رسالة تجعل المستخدم يدخل اول رقم وخزنتة فى الx

وكذلك مع الy

ثم طبعت لة ناتج الجمع

ثم أخبرتة هل انت تريد ادخال بيانات اخرى ام لا فاذا قال نعم يمسح الشاشة ويدخل من جديد اما اذا زهق من البرنامج وقال لا يطلع من البرنامج خالص

عن طريق دالة تسمى exit(0)

ومعرفة فى header file أسمة process.h وأيضا موجودة فى stdlib.h

أخيرا الgoto وقليلة الاستخدام وتكتب

X:
//code
//condition
Goto x;

لاحظ ذلك الكود البسيط وانت هتفمها

#include <iostream>
#include <conio>
void main()
{
int i=0;
x:
  cout<<i;
  cout<<"\n";
  i++;
 if(i<10)
goto x;

 getch();
}

الجديد هو ذلك الشرط

If(i<10)

ودة شرط أذا كان true ينفذ السطر اللى بعدية مباشرا أما اذا كان false

يخرج من الgoto loop

وبأذن الله هنشرح الif condition حالا

If conditions

وتكتب

If(codition u want to testing)
//if true do statement
Else                                      
//do statement

بمعنى مثال بسيط

If(value<=100)
Cout<<"the value is grater than or equal 100";
Else                  
Cout<<"the value is less than 100";

لاحظ ان الشرط الif ينفذ على جملة واحدة فاذا كان أكتر من جملة تكتب

If(condition)
{
//body
}

مثال بسيط:

#include <iostream>
#include <conio>
#include <stdlib.h>
void main()
{
int x;
cout<<"enter the value:\t";
cin>>x;
if(x==1)
 {
   cout<<"hello wolrd\n";
   cout<<"wellcome:)'";
 }
else
 cout<<"good bye\n";
getch();
}

طب ممكن يكون اكتر من شرط

انظر الى ذلك الكود

#include <iostream>
#include <conio>
#include <stdlib.h>
void main()
{
int x;
cout<<"enter the value:\t";
cin>>x;
if(x==1)
 {
   cout<<"hello wolrd\n";
   cout<<"wellcome:)'";
 }
else
if(x==2)
{
 cout<<"good bye";
 cout<<"\n";
}
else
cout<<"try again\n";
getch();
}

وليكن القيمة اللى المستخدم لازم يدخلها تكون محصورة مثلا ما بين ال50 to 100

int x;
 cin>>x;
if(x>=50&&x<=100)
 cout<<"good\n";
else
 cout<<"bad\n";

حيث ان &&

تعنى لازم يكون الشرطين true حتى ينفذ الامر

فاذا كان احدهما true والاخر false

وبالتالى الناتج النهائى false وبالتالى لا ينفذ الامر وبالتالى لا يطبعgood

طب لو كان || ودى تعنى or

أى احداهما يكون صحيح

أى لاحظ ذلك الكود

int x;
 cin>>x;
if(x>=50||x<=100)
 cout<<"good\n";
else
 cout<<"bad\n";

وجاء الuser ودخل 12

بما ان ال12>50 لا وبالتالى يكون ذلك false

طب 12<100 أة وبالتالى يرجع true

وبما ان true | false ==true

وبالتالى يطبع good

لاحظ الفرق بين break and continue

أولا معنى كلمة continue يعنى تخطى تلك المرحلة اى تجاهلها

أما معنى كلمة break يعنى أقف لا تكمل اى ماتعملش اى حاجة

لاحظ تلك الكود:

#include <iostream>
#include <conio>
#include <stdlib.h>
void main()
{
int x;
for(int i=0;i<10;i++)
 {
  if(i==5)
   continue;
  else
   cout<<i<<"\n";
 }
getch();
}

حيث اذا كانت i==5

اعمل continue يعنى تخطى تلك المرحلة اى تجاهلها

ولا تطبع ال5

وبالتالى يطبع البرنامج 1 2 3 4 6 7 8 9

أما break

معناها أقف

لاحظ ذلك الكود

for(int i=0;i<10;i++)
 {
  if(i==5)
   break;
  else
   cout<<i<<"\n";
 }

أى عند ما يكون الi==5 يقف

وبالتالى يطبع 1 2 3 4 ويقف

طب دلوقتى أفرض ان البرنامج محتاج اكتر من condtion

مثل

If(condtion)
{
//do statement
}
Else

If(condtion)
{
//do statement
}
Else

If(condtion)
{
//do statement
}

يعنى اكتر من امر زى ما انت شايف ويكون تلك الاوامر معتمدة على متغير واحد لا غير وبالتالى الافضل ان اعمل switch يعنى اعمل مفتاح يتحكم افضل

وبكدة نستخدم الswitch case

وتكتب

Switch(variable )

{

Case x:

// statement

Break;

Case x:

// statement

Break;

Default:

//print error or do any thing

{

أولا

Switch(variable)

اعملى switch على ذلك المتغير

أما

Case x

كلمة case معناها حالة اى اذا كانت حالة المتغير اللى انت عامله swtch

تساوى تلك الحالة أدخل نفذ الجملة اللى داخل تلك الcase

حيث الx ممكن ان يكون رقم بس لازم يكون ثابث

وممكن ان يكون character

//statement

وهى الجملة التى سينفذها طب لو اكتر من جملة اضعهم فى اقواس مجموعة

{}

طب كلمة break

حتى ينفذ الامر اللى انا محتاجة ولا يدخل على باقى الاوامر

أما كلمة default

أى غير كدة لم يدخل الارقام او البيانات اللى انا عامل عليها switch

أطلع لة رسالة خطأ او أطلعة من البرنامج

مثال : برنامج بسيط اذا اختار المستخدم 1 يطبع welcome

2 يطبع hello

3 يطبعbad

4 يخرج من البرنامج

#include <iostream>
#include <conio>
#include <stdlib.h>
void main()
{
int x;
cout<<"select u wanna:\n";
 cout<<"1- print welcome\n";
 cout<<"2-print hello\n";
 cout<<"3-print bad luck\n";
 cout<<"4-exit from programm\n";
   cin>>x;
switch(x)
 {
   case 1:
     cout<<"welcome";
   break;
   case 2:
     cout<<"hello";
   break;

   case 3:
     cout<<"bad luck";
   break;

   case 4:
     exit(0);
   break;
   default:

     {
         cout<<"SYNTAX ERROR ";
           getch();
          exit(0);
        }
 }
getch();
}

شرح البرنامج

عملت swtch على القيمة اللى يدخلها الuser كما قلت طب لو غير ذلك أى default

يطبع رسالة خطأ وينتظر من المستخدم اى تكة على الكيبور ويخرجة من البرنامج

ودة كدة اكتر من جملة وبالتالى وضعتهم ما بين أقواسtwo braces

طب لو كان الswitch على character وليس متغير int

سيكون

Char x;
Cin>>x;
Switch(x)
{
Case 'a':
Cout<<"hello";
Break;
Case 'b':
Cout<<"god";
Break;
Default:
Cout<<"error";
}

أسئلة بسيطة للتنشيط الذاكرة:

أعمل برنامج ألة حاسبة بسيطة تجمع وتطرح ويعنى جميع العمليات الحسابية

عن طريق استخدام switch case

ويكون الoutput بيتاع البرنامج

Select u want:

1-add

2-sub

3-mul

4-dev

5-exit

وخلى بالك من القسمة على صفر لازم تتطلع لة رسالة خطأ اذا حدث ذلك

أعمل برنامج

لو كانت الدرجة محصورة بين

50 الى 65 بيقى يطبع مقبول

67الى 75 يطبع جيد

وهكذا

أعمل برنامج جدول الضرب يعنى لما المستخدم يعمل run يجد جدول الضرب كلة امامة

أعمل برنامج جدول ضرب بس المرة دى تقول لليوزر انت عاوز جدول الضرب رقم كام

يعنى لو دخل المستخدم 5 يجد جدول الضرب بتاع الخمسة فقط

أعمل يكون الoutput كما يلى

*

***

****

*****

يعنى ترسم هرم من النجوم

ما هو الoutput بتاع ذلك البرامج (ملحوة اوعى تأخذ الكود وتعملة run لا الهدف من ذلك السؤال ازاى تحلل البرنامج وتكتشف الخرج بتاعة)

السؤال الاول:

 int x=1;
while(x<=5)
{
x++;
cout<<"the value of x is :"<<x<<"\n";
}
cout<<"the final x is "<<x;
السؤال الثانى: for(int i=0;i<=10;i++)
{
switch(i)
{
case 1:
cout<<"the value is 1\n";
break;
case 6:
  cout<<"the value is 2\n";
break;
case 8:
 cout<<"the value is 8\n";
break;
default:
cout<<"the value not 1 or 6 or 8\n";
}
}

السؤال الثالث:

int i=1;
for(;i<10;i++)
cout<<"the value is "<<i<<"\n";

أما السؤال دة

صحح الخطأ الموجود فى البرنامج

for(int i=0,j=2;i<=10&&j<=10;i++,j++)
cout<<i<<"+"<<j<<"="<<(i+j)<<"\n";

بحيث يكون الoutput

1+2=3

3+4=7

5+6=11

7+8=15

9+10=19

وبكدة يبقى انتهى الدرس الثانى ويارب تكونوا أستفدتوا

أة ملحوظة للخوة الاعضاء عند حل تلك الاسئلة ياريت لو تكرمتم مش لازم تضعها وتقول أعطينى درجة لا ياأخى نحن ليس فى مدرسة

هذة الاسئلة علشان تقيم مستواك

عندما تعملها وتكون صحيحة كما هو مطلوب يبقى انت كدة مية مية ومستواك جميل جدا ولا داعى ان تضعها فاذا شيى ما وقف معاك مافيش مشكلة ممكن تضع مشكلتك او محاولتك ونحاول ان نصحح لك المعلومة

وأوعوا تنسوا لو فى معلومة خطأ ياريت تصححوها حتى تعم الفائدة وكذلك لو معلومة نقصة ياريت تكملوها

وسأضع الحلول الاسئلة قريب جدا بأذن الله

وشكرا لكم

والسلام خير الختام

والسلام عليكم ورحة الله وبركاتة

1

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

بسم الله الرحمن الرحيم

حين أرى عدد قراء تلك المشاركة ولا تكون هناك رد قد نعتبر هذا أن كل شيء يمشي تمام زسليم ولا يوجد اى مشكلة

انهاردة ماشيئة الله تعالى هنتكلم عن الarray سابقا تكلمنا عن ازاى أعرف متغير

وازاى أدخل قيمتة واطبعها وعرفنا ازاى أستخدم الiteration

سواء كانت for ,do-while, while ,goto

أولا الarray عبارة عن مجموعة من الاعناصر او الitems

التى تكون من نوع واحد (have the same data type)

يعنى يكون جميع عناصر الarray اما ان تكون int ,double, float,char

حيث ان الatrray عكس الstructure حيث الstructure

عبارة عن مجموعة من الitems المختلفة الtype

(سيشرح الstructure قريبا باذن الله)

الarray تكتب

Data type   NameOfArray[Size Of Array]

أولا الDatatype وهو نوع الarray أما ان تكون int ,double,float أى نوع يعنى

ثانيا NameOfArray أسم الarray وزى ما انتوا عارفين اما

ان يكون اى اسم بس اوعى يكون اى أسم محجوز للغة أو built in c++ (راجع الدرس الاول)

ثالثا size of array وهو حجم الarray حيث ان الsize دة لازم يكون ثابت ويكون الcompiler يعرفة فى حالة الcompile أما عن تكون غير ثابتة بمعنى ان المستخدم يحدد حجم الarray فى الrun time (سيتم شرحة فى درس الpointers بأذن الله)

حيث ان الarray أما ان تكون one dimensional or Multi dimensional

أولا الone dimensional array

لاحظ ذلك الكود

#include <iostream>
#include <conio>
void main()
{
int array[3];
for(int i=0;i<=3;i++)
 cin>>array[i];
for(int j=0;j<3;j++)
 cout<<array[j];
getch();
}

أولا تم تعريف الarray عن طريق جملة

int array[3];

حيث الarray من النوع int واسم المصفوفة array وحجمها 3

يعنى يتم حجز لكل عنصر من عناصر الarray ==< 4 byte

طب علشان اعمل access للمصفوفة هعمل loop تمشى على عنصر عنصر من عناصر الarray

وذلك كما موضح فى الكود

for(int i=0;i<=3;i++)
 cin>>array[i];

وأيضا السطر الثانى علشان أبدأ أعمل access لعناصر الarray

فمثلا

array[0]   يدل على العنصر الاول للarray
array[1] يدل على العنصر الثانى فى الarray
array[2] يدل على العنصر الثالث ف الarray
وهكذا

for(int j=0;j<3;j++)
 cout<<array[j];

أما ذلك السطرين علشان أطبع عناصر الarray

مثال اخر أخلى الuser يدخل 5 أرقام ويجمعهم ويطبع المتوسط

#include <iostream>
#include <conio>
void main()
{
const int n=3;
int array[n];
int total=0;
float avg;
cout<<"enter the elements:\n\n";
for(int i=1;i<=n;i++)
 {
  cout<<"enter the element num:["<<i<<"]";
   cin>>array[i];
  total+=array[i];
 }
avg=total/n;
cout<<"the total is:\t"<<total<<"\n";
cout<<"the avg is:\t"<<avg<<"\n";
getch();
}

const int n=3;
int array[n];
int total=0;
float avg;

فى بداية الامر عرفت متغير أسمة n من النوع int وأيضا const يعنى ثابت ماينفعش التغير

ثم عرفت المصفوفة بأسم array والحجم بتاعها هو n

وعرفت متغير total من النوع int واعطيتة قيمة ابتدائية

وأما الavg دة علشان الناتج القسمة وعلشان كدة عملتة من النوع float حتى يقبل الكسور

for(int i=1;i<=n;i++)
 {
  cout<<"enter the element num:["<<i<<"]";
   cin>>array[i];
  total+=array[i];
 }

ثم بعد ذلك خليت الuser يدخل القيم ويضيفها فى الtotal

avg=total/n;
cout<<"the total is:\t"<<total<<"\n";
cout<<"the avg is:\t"<<avg<<"\n";

ثم بعد ذلك طبعت قيمة الtotal and avg

طب ملحوظة

فى بداية البرنامج تجد ذلك السطر

const int n=3;

ودة علشان الsize بتاع الarray طب ودة لية طب ما كنت كتبت int array[3]

علشان يبقى سهل أغير حجم ال array and limit loop

INITALIZING ARRAY

أى أعطاء قيم ابتدائية للarray

لاحظ ذلك الكود هو عبارة عن أعطاء قيم أبتدائية للarray

وأيضا حساب المضروب لكل عنصر من عناصر الarray

#include <iostream>
#include <conio>
void main()
{
const int n=5;
int i,fac,j;
int array[n]={12,2,5,4,6};
cout<<"the factorial of array element is:\n\n";
for(i=0;i<n;i++)
{
  fac=1;
 cout<<array[i]<<"\t";;
 for( j=array[i];j>0;j--)
 {
  fac*=j;
 }
 cout<<fac<<"\n";
 }
getch();
}

Num5
const int n=5;
int i,fac,j;
int array[n]={12,2,5,4,6};

عرفت متغير const زى ماقولنا

ثم عرفت متغير Iوj علشان الelement loop والfac أخزن فية الناتج العملية الحسابية

for(i=0;i<n;i++)
{
  fac=1;
 cout<<array[i]<<"\t";;
 for( j=array[i];j>0;j--)
 {
  fac*=j;
 }
 cout<<fac<<"\n";
 }

ودة علشان أجيب المضروب لمتغيرات الarray

ودة برنامج بحث فى الarray عن قيمة محددة ويعطيك الindex بتاع القيمة

#include <iostream>
#include <conio>
void main()
{
const int n=5;
int array[n];
int num,i;
int found=-1;
for(i=0;i<5;i++)
{
 cout<<"enter the  element num ["<<(i+1)<<"]:  ";
 cin>>array[i];
}

cout<<"enter the num u wanna 2 search:\t";
 cin>>num;
for(int j=0;j<n;j++)
 {
   if(num==array[j])
   {
     cout<<"the index is:\t"<<j<<"\n the number is:\t"<<array[j]<<"\n\n";
     found=1;
   }
 }
 if(found==-1)
  cout<<"NOT FOUND\n";
getch();
}

int found=-1;

وهذا المتغير زى الflag مثلا اذا وجد القيمة المحددة يخلى القيمة بتاعتة ب1 واذا لم يجد سيكون قيمتة -1 وبالتالى يطبع خطأ ويخرج من البرنامج

if(num==array[j])

حيث هذا الcondition لمعرفة القيمة التى تساوى القيمة التى ادخلها المستخدم

ودة يسمى بsequential access

يعنى بيمشى خطوة خطوة على عناصر الarray

ودة برنامج يطبع نجوم كما بالشكل

Element value stars

*** 3 1

***** 5 2

** 2 3

الكود:

#include <iostream>
#include <conio>
void main()
{
const int n=6;
int array[n]={12,1,3,4,9,9};
cout<<"element\tvalue\tstars\n";
for(int i=0;i<n;i++)
 {
   cout<<"\n"<<i<<"\t"<<array[i]<<"\t";
   for(int j=0;j<array[i];j++)
    cout<<"*";
 }
getch();
}

MULTI|DIMENSIONAL ARRAYS

وهو شبية بالمحددات

زى

1 2 3

4 5 6

7 8 9

عبارة عن array صفوفها 3 واعمدتها 3 برضة

وتكتب

 Data type  Name of array[row][coulm]

يعنى مثال انظر الى ذلك المثال

دة برنامج عبارة عن two dimensional array يدخل الuser القيم ثم بعد ذلك يحسب مجموع كل صف ويخزن مجموع كل صف فى array جديدة وبعد ذلك يطبع الarray الجديدة

#include <iostream>
#include <conio>
void main()
{
const int n=3;
int MulArray[n][n];
int TotalRow[n]={0,0,0};
int i,j;
for( i=0;i<n;i++)
{

 for( j=0;j<n;j++)
  {
    cout<<"enter the element nmu ["<<i<<"]["<<j<<"]: ";
     cin>>MulArray[i][j];
    TotalRow[i]+=MulArray[i][j];
  }
  cout<<"\n";
}
 cout<<"u have entered:\n\n";
for( i=0;i<n;i++)
{
 for( j=0;j<n;j++)
  {
     cout<<"enter the element nmu ["<<i<<"]["<<j<<"]: "<<MulArray[i][j]<<"\n";
  }
 cout<<"\n";
}
  cout<<"\nthe sum is:\n\n";
 for(i=0;i<n;i++)
  cout<<"the sum of row num: "<<(i+1)<<" is "<<TotalRow[i]<<"\n";
getch();
}

const int n=3;
int MulArray[n][n];

أولا السطر الاول حجم الarray زى ما قلت سابقا يبقى متغير علشان يبقى سهل اغير حجم الarray

أما السطر الثانى عرفت الarray ونوعها int والarray هنا 3*3 يعنى اكتر من بعد واحد

int TotalRow[n]={0,0,0};

عرفت الarray جديدة اللى هخزن فيها مجموع الصفوف وعملت لها initial

for( i=0;i<n;i++)
{

 for( j=0;j<n;j++)
  {


    cout<<"enter the element nmu ["<<i<<"]["<<j<<"]: ";
     cin>>MulArray[i][j];
    TotalRow[i]+=MulArray[i][j];
  }
  cout<<"\n";
}

ودة علشان أخلى الuser يدخل قيم الarray

ثم بعد ذلك اخزن تلك القيم فى الtotalRow علشان اجيب مجموع كل صف على حدة

  cout<<"u have entered:\n\n";
for( i=0;i<n;i++)
{
 for( j=0;j<n;j++)
  {
     cout<<"enter the element nmu ["<<i<<"]["<<j<<"]: "<<MulArray[i][j]<<"\n";
  }
 cout<<"\n";
}

علشان اطبع قيم الarray

  cout<<"\nthe sum is:\n\n";
 for(i=0;i<n;i++)
  cout<<"the sum of row num: "<<(i+1)<<" is "<<TotalRow[i]<<"\n

أما ذلك علشان اطبع قيم الtotal row التى تم تخزين النواتج فيها

ودة مثال على الmulti dimensional

حيث البرنامج عبارة عن المستخدم يدخل مجموعة اسماء ثم بعد ذلك يبحث عن اسم محدد ويطبع لة الindex بتاعة

#include <iostream>
#include <conio>
#include <process.h>
void main()
{
const int row=5;
const int n=20;
char Name[row][n];
char SName[n];
int i;
int found=-1;
for(i=0;i<row;i++)
 {
   cout<<"enter the name of["<<(i+1)<<"] ";
    cin>>Name[i];
 }
clrscr();
cout<<"u have entered :\n\n";
 for(i=0;i<row;i++)
  cout<<Name[i]<<"\t";
 cout<<"\n\nenter the name u wanna 2 search: ";
  cin>>SName;
 for(i=0;i<row;i++)
  {
   if(  ( strcmp( SName,Name[i]  )==0 )  )
    {
      cout<<"the index of the name is: "<<i<<"\n";
      found=1;
    }
  }
 if(found==-1)
  {
    cout<<"SORRY NOT FOUND.......!";
    getch();
    exit(0);
  }

getch();
}

char Name[row][n];

هنا عرفت array أسمها Name ونوعها char

وصفوفها 5 يعنى المستخدم هيدخل خمسة اسماء

وn عدد الاعمدة وهو 20 يعنى علشان لو المستخدم حب يدخل اسم كبير حبتين

char SName[n];

ودى الarray اللى هدخل فيها الاسم اللى الuser يحب يبحث عنة

for(i=0;i<row;i++)
 {
   cout<<"enter the name of["<<(i+1)<<"] ";
    cin>>Name[i];
 }

وبذلك الكود اخلى المستخدم يدخل الاسماء اللى نفسة فيهم

ثم بعد ذلك اطبعهم اماة عن طريق ذلك الكود

clrscr();	
cout<<"u have entered :\n\n";
 for(i=0;i<row;i++)
  cout<<Name[i]<<"\t";

cout<<"\n\nenter the name u wanna 2 search: ";
  cin>>SName;
ودة علشان الاسم اللى المستخدم يحب يبحث عنة

for(i=0;i<row;i++)
  {
   if(  ( strcmp( SName,Name[i]  )==0 )  )
    {
      cout<<"the index of the name is: "<<i<<"\n";
      found=1;
    }
  }

وهنا الloop علشان امشى على الarray خطوة خطوة

وعن طريق دالة تسمى string compare

أقارن الاسم اللى المستخدم دخلة بالاسماء الموجودة فى الarray

واذا وجدهم يخلى الfound=1 واذا لم يجد يبقى الfound زى ما هوة قيمتة ب-1 وبالتالى يطبع خطأ

طب دلوقتى بعد ان تعرفنا عن الarray

لاحظ ذلك الكود حيث انة يدخل اسم كبير اى يحتوى على اكتر من كلمة

#include <iostream>
#include <conio>
void main()
{
const int n=60;
char Name[n];
cout<<"enter the name\n";
cin>>Name;
cout<<"u have entered\n"<<Name;
getch();
}

عرفت array of char

ثم افرض ان دخلت

أسمى مثلا

Mohammed allam

ماذا سيطبع ???

هيطبع mohammed فقط طب وallam فين تجاهلها علشان الcompiler ما بيعرفش المسافات وبالتالى كلمة allam جاءت بعد مسافة وبالتالى كدة يتجاهلها (compiler وحش :angry: )

طب الحل استخدم دالة

 cin.get()

ويتم مباصة لها two parammter هم

أسم الarray وحجم الarray

يعنى بص ع المثال دة وانت هتفهم

#include <iostream>
#include <conio>
void main()
{
const int n=60;
char Name[n];
cout<<"enter the name\n";
cin.get(Name,n);
cout<<"u have entered\n"<<Name;
getch();
}

طب كدة هيطبع mohammed allam

ويبقى كدة مية مية طب لو حبيت يطبع اكتر من سطر

سهلة برضة بنفس الدالة دى ولكن

هحط parammter تالت فيدتة أكتب يا user زى ماانت عاوز ولما تحب تخلص دخلى الحرف اللى موجود فى الparammter التالت

أنظر الى ذلك الكود وتأمل <_<

#include <iostream>
#include <conio>
void main()
{
const int n=300;
char Name[n];
cout<<"enter the string and if u wanna to exit entred @\n";
cin.get(Name,n,'@');
cout<<"u have entered\n"<<Name;
getch();
}

	cin.get(Name,n,'@');

يعنى بقولة أكتب زى ماانت عاوز بس اهم حاجة مايزدش عن الحجم اللى انا محددة ليك يا عم المستخدم

ولما تزهق خالص دخل علامة ال@ وبكدة يعرف الcompiler أنك أنهيت كتابة

طب لو حبيت اعمل copy متغير لاخر عن طريق دالة تسمى ب

String copy وهى strcpy()

لاحظ ذلك الكود

#include <iostream>
#include <conio>
void main()
{
const int n=300;
char Name[n];
char val[n];
cout<<"enter the string and if u wanna to exit entred @\n";
 cin.get(Name,n,'@');
strcpy(val,Name);
cout<<"u have entered\n"<<val;
getch();
}

وبكدة يبقى انتهى الدرس الثالث معكم بخير واشوف وشكم بخير مع الدرس القادم وهو عن الfunctions أو الmethods

شوية أسئلة لتنشيط المخ

أعمل برنامج يقلب الكلمة يعنى مثلا لو دخلة المستخدم

Nemo يطبع omen

أعمل برنامج يرتب مصفوفة (بأذن الله سيتم شرحة أغلب الalgorithms المستخدمة فى ذلك المرة القادمة)

أعمل برنامج يدخل قيم محددة ولتكن 5 قيم

ثم يخلى المستخدم يعمل delete لاى قيمة يدخلها

يعنى لو دخلت مثلا عناصر الarray

وهى 1,2,3,4,5,6,7,5,3

والمستخدم حب يعمل delete لل5

تيقى عناصر المصفوفة 1و2و3و4و6و7و3

أعمل برنامج two dimensional array

يجمع عناصر الاعمدة

أعمل برنامج يحول من binary الى dicemal

اى لو المستخدم دخل 8

يبقى الناتج1000

ودى الاكواد التى تم شرحها

array.rar

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

دروس جميلة ومفيدة في نفس الوقت الله يعطيك ألف عافية أخوي مهندس علام...

لكن فيه ملاحظة بسيطة هنا : -

int array[3];
for(int i=0;i<=3;i++)
cin>>array[i];

فيه خطأ منطقي يامهندس علام في هذا الكود اللي أنت كاتبه حاول تكتشفه...

تحياتي لك أخوي...

مرهف الحس

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه
i<=3

هوة هنا هيبقى عدد اللوب من 0الى 3 يعنى هيمشى 4 مرات ودة overflow وعلى فكرة الcompiler لم يعترض عليها

وسوف نحل تلك المشكلة فى دروس لاحقة بأذن الله حيث سيتم انشأ وتعريف ال[] operator

أأسف على ذلك الخطأ :s

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

بسم الله الرحمن الرحيم

بعد أن تكلمنا عن إزاي أعرف متغير من أي نوع .

وبعد أن تعلمنا أيضا إزاي استخدم ال Iteration وهي :

For , While , Do-While , Goto .

وبعد أن تعلمنا إزاي أنشئ Array حيث ال Array إما أن يكون One Dimension وتكتب كذلك

Data type  NameOfArray [SizeOfArray];

وتعلمنا أيضا إزاي أنشئ Array عبارة عن Two Dimension

وتكتب كذلك

Data Type  ArrayName [Row][Column]

النهاردة بأذن الله نتكلم عن الFunction

ال functions عبارة عن مجموعه من الجمل التي توضع في وحدة معينة ويكون لها أسم وهي تلك الوحده ممكن يتم أستدعائها في أي مكان في البرنامج .

طب لية أتعملت الFunction

أفترض أن عندك برنامج معين هذا البرنامج أكتر من Array وليكن Five Arrays ويتم عمل عمليات حسابية على كل Array وبعد تلك العمليات يتم طباعة كل Array عن طريق For Loop وجملة cout للطباعة وبما أن عندك خمسة array وبالتالى يتم تكرار جملتي الطباعة خمس مرات وبالتالي سيكون الكود كبير وضخم وفظيع ويصعب فهمه

طب والحل

أحط الجملتى الطباعة داخل دالة محددة وأنادى تلك الدالة بعد كل array

وبالتالى من مميزات الFunction أنها تقلل من الكود ويسهل على اى مبرمج اخر فهم الكود

كتابة الFunction عن طريق طريقتين

أولا ممكن كتابة كود الدالة قبل الmain function

أو ممكن بعد الmain function وهنشوف تلك الحالتين

أولا لو كان كود الدالة قبل الmain

Data Type    FuncitonName  (argument passing)
{
// code implementation   it contain
// Method Variables such int or char or any thing u wanna
}  
Void main ()
{
Function name (if using);

  // calling function
}

أولاً data Type

وهو عبارة عن نوع الدالة يعني ممكن أن تكون

Void >> تعني أن الدالة لا ترجع أي قيمة .

Int , double , float , bool , char كل نوع من الأنواع التالية يرجع قيمة علي حسب نوعة مثلا int يرجع int وهكذا

Function name وهو يمكن أن يكون أي اسم بس التزم بقواعد الاسماء (راجع الدرس الأول ) .

في حالة وجود اكتر من دالة بنفس الأسم سيتم شرح ذلك في الدرس القادم .

(argument passing) هي عبارة عن ال parameter اللي مرمية للدالة

في حالة الmain عند استخدام الدالة يتم عمل calling وذلك عن طريق اسم الدالة متبوع ب (Two parentheses)

code implementation

هو الكود الذى يتم كتابتة داخل الدالة ويحتوى على Method Variables وهى المتغيرات المعرفة داخل الbody of method وفى حالة بعد تنفيذ الدالة يتعم تدمير تلك المتغيرات

والmemory are reclaimed يعنى يتم تحريرها من تلك المتغيرات

وهذا يعنى out of scope وتعنى ايضا بlife time of variables

أما في الحاله الثانية إذا كان كتابة الداله بعد ال main فتمر بثلاث مراحل وهي :-

Prototype calling Declaration

لاحظ ذلك :

Data type   FunctionName(argument passing);
// this is prototype
Main()
{
NameFunction (argument passing if using );
//calling function

}
Data type   FunctionName(argument passing)
{
// Body Of Function
}

دعنا نأخذ مثال للتوضيح

البرنامج الحالي عبارة عن برنامج بسيط بة دالة تلك الداله تحتوي علي For LoOp لتكرار جملة معينة ولتكن In The Name Of AllAh

وهذا هو الكود

#include <iostream.h>
#include <conio.h>
void print()
{
for(int i=0;i<6;i++)
 cout<<"in the name of allah\n";
}
void main()
{
print();
getch();
}

أولا فى بداية الامر أستخدمت الطريقة الاولى وهى كتابة الدالة قبل الmain

حيث تلك الدالة من النوع void يعنى لا ترجع اى شيى

for(int i=0;i<6;i++)
 cout<<"in the name of allah\n";

ودة الbody بتاع الدالة

حيث يتم استدعاء الدالة ف الmain عن طريق أسم الدلة بدون كتابة نوع الدالة

طب لو على الحالة الثانية وهى كتابة الدالة بعد الmain

لاحظ الكود السابق :

	#include <iostream.h>
#include <conio.h>
void print();

void main()
{
print();
getch();
}
void print()
{
for(int i=0;i<6;i++)
 cout<<"in the name of allah\n";
}

حيث تم عمل الproto type للدالة وفيدتة ان

بقول للcompiler يا عم الcomplier انا هعرف دالة أسمها print وانا معرفها بعد ال main function

تمام جدا بس اللغات الحديثة ممكن تعرف دالة بعد الmain وبدون عمل prototype لها

ولكن فى شرحى هذا أفضل الطريقة الاولى وهى تعريف الدالة قبل الmain

تعالى نوضح اكتر بشوية امثلة

المثال دة عبارة عن دالة بسيطة داخلها يتم جمع عدين وطباعة الحل

#include <iostream.h>
#include <conio.h>
void sum()
{
int x,y;
cout<<"enter the number: ";   cin>>x;
cout<<"enter the second number: ";  cin>>y;
cout<<"the result is: "<<(x+y);
}
void main()
{
sum();
getch();
}

بدايتا الدالة تسمى sum من النوع void يعنى لاترجع اى قيمة

والbody of this function is easy

وتم أستدعائها عن طريق أسم الدالة بدون نوعها

Sum();

Passing argument and returning the result

لاحظ ذلك الكود حيث انة عبارة عن دالة تاخذ رقمين من المستخدم ويتم تمرير تلك الرقمين الى الدالة وعمل عملية جمع عليهم ثم ارجاع الناتج

#include <iostream.h>
#include <conio.h>
int sum( int x,int y)
{
int re;
re=x+y;
return re;
}
void main()
{
int a,b;
cout<<"enter the frist number: ";  cin >>a;
cout<<"\nenter the second number: ";  cin >>b;
int z=sum(a,b);
cout<<"the sum is:\t"<<z;
getch();
}

فى بداية الامر عرفت الدالة وتأخذ متغيرين من النوع int وهم x,y

ولا تكتب

Int sum(int x,y)   //ERROR

حيث عند استدعاء تلك الدالة ف الmain يتم تمرير متغيرين هما a,b حيث يتم أخذ تلك المتغيرات وعمل العملية الحسابية وهى الجمع وارجاع الناتج الى الى الmain وطباعتة

لاحظ ف البداية ذلك السطر

Z=sum(x,y)

يتم عمل copyمن المتغيرات الموجودة ف الmain الى المتغيرات الموجودة او المستخدمة ف الدالة ثم يتم عملية الجمع وبعد ذلك يتم ارجاع القيمة عن طريق عمل assigned للمتغير z حيث عند ارجاع الناتج يتم عمل copy لة ف الz

لا حظ ذلك البرنامج حيث يوجد بة دالة تأخذ متغيرين وترجع الاكبر فيهم

#include <iostream.h>
#include <conio.h>
int Max( int x,int y)
{
return x>=y?x:y;
}
void main()
{
int a,b;
cout<<"enter the frist number: ";  cin >>a;
cout<<"\nenter the second number: ";  cin >>b;
int z=Max(a,b);
cout<<"the Max is:\t"<<z;
getch();
}

يتم عمل copy للمتغيرات الى الدالة ويتم الاختبار عن طريق ذلك السطر

Rerurn x>=y?x:y;

يعنى لو كان الxاكبر من او يساوى الy رجع الx غير ذلك رجع الy

أنظر الى ذلك المثال الاخر حيث عبارة عن دالة لتحل تلك المعادلة:

Z=1/5!+1/4!+1/3!+1/2!+1/1!

#include <iostream.h>
#include <conio.h>
double vac(double );
void main()
{
double re=0;
 double s;
 for(int i=1;i<=3;i++)
 {
       s=vac(i);
   re+=1/s;       }
 //System.out.println("the result is:"+re);
  cout<<"the result is:\t"<<re;
getch();
}
double vac(double i)
   {
   double sum=1;
   for(double j=i;j>=1;j--)
   {
   sum*=j;
   //--i;
        }
        return sum;
   }

لاحظ ذلك البرنامج تم استخدام الطريقة الثانية ف اعريف الدالةvac

double re=0;
 double s

فى بداية الامر عرفت متغير أسمة re حتى اضع بة حل تلك المعادلة السابقة

والs حتى ارجع فية القيمة الناتجة عن (أو الراجعة من) الدالة الvac حيث تلك الدالة تجيب المضروب للرقم المراد حاسب المضروب لة

  for(int i=1;i<=3;i++)
 {
       s=vac(i);
   re+=1/s;       }
 //System.out.println("the result is:"+re);
  cout<<"the result is:\t"<<re;

for loop علشان اجيب المضروب للاعداد من 1 الى 3

وتم امرار الرقم الى دالة vac وارجاع القيمة ف المتغير s

ثم يتم عمل عملية القسمة

وجمعة على الre وبالتالى عملت للre intial حتى يكون كصندوق اضع بة الارقام

أما دالة vac فهى دالة من النوع doble وترجع قيمة من النوع double أيضا وهى لحساب المضروب

أما البرنامج الحالى لايجاد الاس يعنى زى دالة pow

أكيد انتوا عارفينها

لاحظ ذلك الكود

	
#include <iostream.h>
#include <conio.h>
int Pow( int x,int y)
{
int re=1;
for(int i=0;i<y;i++)
 re*=x;
return re;
}
void main()
{
int a,b;
cout<<"enter the frist number: ";  cin >>a;
cout<<"\nenter the second number: ";  cin >>b;
int z=Pow(a,b);
cout<<"the pow is:\t"<<z;
getch();
}

فى حالة استدعاء الدالة تم عن طريق تمرير المتغيرين

ويتم عمل copy منهما وليس أستخدام تلك المتغيرين

Pass by value and pass by reference

أولا الpass by value زى جميع البرامج اللى فاتت

يعنى أى تغير يحدث يعنى يتم عمل copy من المتغيرات كما قلنا

يعنى اى تغير يحدث للمتغير اللى معمول لة passing لا ينعكس هذا التغير على المتغير الاصلى (التغير المستخدم ف الmain )

أما عند أستخدام reference

يتم اشارة الى الmemory location حيث المتغير موجود

أى تغير يحدث يكون منعكس على المتغير الاصلى

لاحظ ذلك البرنامج حيث فكرتة عمل swap يعنى تبديل بين متغيرين يتم عمل passing لهما

لاحظ ذلك الكود

#include <iostream.h>
#include <conio>
void swap(int x,int y)
{
 int tmp;
 cout<<"in \"function\" before swaping the val of x is: "<<x<<"  and the val of y is:  "<<y<<"\n\n";
 tmp=x;
 x=y;
 y=tmp;
 cout<<"in \"function\" after swaping the val of x is: "<<x<<"  and the val of y is:  "<<y<<"\n\n";
}
void main()
{
int x=10,y=12;
cout<<"in \"main\" before swaping the val of x is: "<<x<<"  and the val of y is:  "<<y<<"\n\n";
 swap(x,y);
cout<<"in \"main\" after swaping the val of x is: "<<x<<"  and the val of y is:  "<<y<<"\n\n";
getch();
}

يعنى من الصورة التى امامك

WithOutRef.jpg

لم يحدث اى تغير داخل الmain ولم تتأثر المتغيرات الموجودة داخل الmain بالتغير الذى حدث داخل الدالة

طب هنستخدم ال reference

لاحظ ذلك الكود

#include <iostream.h>
#include <conio>
void swap(int& x,int& y)
{
 int tmp;
 cout<<"in \"function\" before swaping the val of x is: "<<x<<"  and the val of y is:  "<<y<<"\n\n";
 tmp=x;
 x=y;
 y=tmp;
 cout<<"in \"function\" after swaping the val of x is: "<<x<<"  and the val of y is:  "<<y<<"\n\n";
}
void main()
{
int x=10,y=12;
cout<<"in \"main\" before swaping the val of x is: "<<x<<"  and the val of y is:  "<<y<<"\n\n";
 swap(x,y);
cout<<"in \"main\" after swaping the val of x is: "<<x<<"  and the val of y is:  "<<y<<"\n\n";
getch();
}

حيث عند استخدام الreference يتم عن طريق أستخدام تلك العملامة&

يعنى من الصورة التى امامك

With.jpg

وبالتالى اى تغير يحدث ف الfuinction يحس بة المتغيرا الموجودة ف الmain وأيضا فى عملية pass by reference

لا يتم عمل copy ولكن يستخدم actual variables وبالتالى من مميزات الpass by ref يقلل من الspace of memory which program is occupied

طب علشان العملية توضح اكتر تعالى نشوف المثال التالى

#include <iostream>
#include <conio>

void Demo2(int x,  int& y)
{
  cout<<"\"in method\" before calling method the val of x is:  "<<x<<"  the val of y is:  "<<y<<"\n\n";
  x = x + y;
  y = y + x;
  cout<<"\"in method\" after calling method the val of x is:  "<<x<<"  the val of y is:  "<<y<<"\n\n";
}
void main()
{
  int x,y;
  x = 15;
  y = 20;
  cout<<"\"in main\" before calling method the val of x is:  "<<x<<"  the val of y is:  "<<y<<"\n\n";
  // This line calls the Demo2 method (see below)
  Demo2(x, y);
  // What values will x and y have now?
cout<<"\"in main\" after calling method the val of x is:  "<<x<<"  the val of y is:  "<<y;
getch();
}

فى بداية الامر عرفت متغيرين من النوع int وهم x,y وأعطيت لكل منهما قيمة ابتدائية هم 15و20 على التوالى

ثم عملت passing for this two variables

واحد عن طريق pass by val وهو x

والاخر عن طريق pass by ref وهوy

وبالتالى سيتم عمل copy من القيمة x للتعامل معها داخل الدالة

وأى تغير يحدث داخل الدالة ذلك المتغير لا يشعر بية

أما الاخر لا يتم عمل copy منة ولكن يتم العمل على ذلك المتغير كما قلنا واى تغير يحدث ينعكس على ذلك المتغير

فى الدالة تم عمل تغير لكل منهما ولكن المتغير x معمول منة copy وبالتالى التغير الذى حدث لا يحس بة ولكن العكس تماما مع المتغير الy

وأيضا من فوائد الpass by reference ان ارجاع اكتر من قيمة الى الmain كما لاحظنا ف المثال بتاع الswap

طب كما قلنا ان من مميزات الpass by ref انة لا يعمل copy

وبالتالى يشتغل على المتغير الاساسى طب لو كان الدالة يتم عمل عمليات حسابية ضخمة وانا خايف ان بسبب الpass by ref يحدث تغير ف احدى المتغيرا المعمول لها passing by ref

والحل أكتب

Const   DataType   &NameOfVariable    

يعنى اخلى المتغير const وبالتالى لا يتم عمل اى تعديل فية

لاحظ ذلك الكود

#include <iostream>
#include <conio>
void fun(int &x,const int &y)
{
x=40;  //ok thats true as the value is passing by reference
y=60;  /*error cant modify constant argument as although this variable
   is passing by reference but it is const so u cant change this value */
}
void main()
{
int x=12;
int y=23;
/*i create two variable and initialize them */
fun(x,y);
getch();
}

Scope (local,global variables)

تعنى كلمة الscope

The scope of the variable determines which parts of the program can access it .

وتعني الحيز أو الجزء المسموح أن يتم عمل access للمتغير . ويوجد نوعان من الscope هي

1. Local variable وتعني أنها مرئية أو متاح عمل access داخل البلوك.

2. Global variable وتعني أنها مرئية أو متاح عمل access داخل البرنامج .

انظر الى ذلك الكود

void print()
{
int x;
x=12;
cout<<x;
}

حيث تم تعريف المتغير x داخل الدالة print وبالتالى يكون

Local variable يعنى لا يمكن عمل access لذلك المتغير الا داخل تلك الدالة فقط وينتهى الlifetime عند نهاية تنفيذ الدالة

أما عن الvisible of local variable

بيكون visible فقط للدالة المعرف داخلها

لاحظ ذلك الكود

void print()
{
int x;
x=12;
cout<<x;
}
void show()
{
int y=90;
int z=80;
x=12;//error as not visible to this function
}

أما الglobal variable

سابقا قلنا ان الlocal Variable بيتعرف داخل أي دالة بينما ال Global بيتعرف خارج أي دالة (وأيضا يعرف خارج ال classes كما سنعرف لاحقاً).

Global variable بيكون visible لجميع الدوال الموجودة داخل البرنامج.

أنظر الي ذلك البرنامج

حيث تم تعريف متغير اسمة x وهو global variable

وتم عمل initial لة عن طريق دالة calc وتم عمل زيادة للمتغير عن طريق دالة ADD وأيضا تم طباعتة عن طريق دالة الmain

حيث يكون accessible لجميع الدوال الموجودة ف البرنامج

ملحوظة : اذا لم تضع initial لمتغير global يتم اعطاء قيمة default لة وهى الصفر عكس الlocal حيث يتم اعطائة اى قيم من الram وغالبا تكونgarbage value

لاحظ ذلك الكود وانت تفهم

#include <iostream>
#include <conio>
int  x;
void print()
{
cout<<x;
}
void main()
{
int c;   //Comment about variable c as it is defined and not used
cout<<"the val of global is: "<<x<<"\n";
cout<<"the local variable is: "<<c<<"\n";
getch();
}

أما عن الlifetime بتاع ال Global variable ينتهي عند الخروج من البرنامج .

ويتم عند بداية تشغيل البرنامج يتم حجز space to this variable .

Static variable

وهو عبارة عن static local var && Static global var وسنتحدث عن static local var وسنتحدث في دروس لاحقة عن ال static global var .

بالنسبة ل static local var تكون ال visibility مثل local variable العادي يعنى يتم أستخدامة فقط داخل البلوك أو الداله المعرف فيها . أما عن ال life Time يكون مماثل لل global variable العادي . وعادة يستخدم لمعرفة كم مرة تم استدعاء الدالة لاحظ ذلك الكود

#include <iostream>
#include <conio>
int StaticVal(int x,int y)
{
static int z=1;
cout<<"the result is: "<<(x+y)<<"\t";
cout<<"the number of calling this funcrion is "<<z<<"\n";
z++;
return 0;

}
void main()
{
StaticVal(1,2);
StaticVal(3,4);
StaticVal(5,6);
StaticVal(7,5);
getch();
}

حيث أنه عبارة عن دالة تجمع عددين وتعرف المستخدم بعدد المرات التي تم عمل calling للدالة وإذا لم تعطي قيمة initial للمتغير ال Static يكون ال default = 0

أنظر إلي ذلك الجدول وهو عبارة عن ملخص لما سبق

table.jpg

وبكدة يبقى انتهى الدرس الرابع ويارب تكونوا أستفدتوا من هذا الدرس وإلي اللقاء في الدرس القادم

والسلام عليكم ورحمة الله وبركاتة

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

أنا نسيت احط عنوان الدرس القادم

وهو تطبيقات علي ال Functions :D

-----------------------------------

والبرامج المستخدمة موجودة بالمرفقات

FunctionsProg.rar

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

بسم الله الرحمن الرحيم

بعد ان تكلمنا عن ازاى أنشئ function وأزاى أستدعيها وازاى أعمل passing by reference

دلوقتى هنتكلم عن returning by reference

من مميزاتة تجنب copying large object وأيضا لجعل الfunction على يسارالعلامة

أنظر الى ذلك الكود

#include <iostream>
#include <conio>
int x;  //global variable
int &Return()
{
return x;
}
void PrintVal()
{
cout<<"the value of x is: "<<x<<"\n";
}
void main()
{
Return()=10;
PrintVal();
getch();
}

Int &Return()  // return a  reference to variable

يعنى الدالة ترجع قيمة من النوع int بواسطة ال reference

Return ()=10

معناها ان الvariable x يتم إرجاعة ثم عمل assigned للقيمة يعنى ذلك السطر السابق يعادل x=10

ملحوظة : لو كتبت

Int &Return ()
{
Return 3;
}

]

ثم فى الmain كتبت Return()=10

سيعطى خطأ وذلك لانها ترجع const

وأيضا لو كان

Int & Return()
{
Int x=3;
Return 3;
}

لأن الدالة تحتوى على local variable وذلك لانة يتم عمل Destroy عند عمل return وبالتالى لا يتم عمل return a reference

حيث تلك الطريقة ليست مستخدمة كثيرا ولكن حبيت أوضحها لكم حتى يكون تم المام بالfunctions

Recursion

معناها ان الدالة تنادى نفسها

يعنى مثال لو حبيت أعمل برنامج factorial كان بة لووب for loop لاحظ ذلك الكود

#include <iostream>
#include <conio>
int Fac(int x)
{
if(x>1)
 return x*Fac(x-1);
else
 return 1;

}
void main()
{
 cout<<"the result is: "<<Fac(5);
 getch();
}

داخل الدالة Fac()

لو كان x أكبر 1 وبالتالى call it self لاحظ ان عندما تنادى نفسها تستخدم argument أقل من الargument السابق الذى تم منادة بة سابقا يعنى لو كان الدالة فى الmain ثم عمل pass للargument بقيمة 5 سيكون فى الحالة الثانية عند مناداة الدالة

سيكون بقيمة وبعد ذلك سيكون بقيمة وهكذا حيث يتم تخزين القيم .

في الحالات الأربعة يتم مناداة ذلك السطر

Return x* fac (x-1);

وفي المرة الخامسة يتم مناداة ذلك السطر return 1 ;

لاحظ ذلك الجدول

صورة Table

للاسف انا لم أستطع تحميل تلك الصورة :s

ستجدونها فى المرفقات

Inline function

سابقاً كان البرنامج يوجد بة عده دوال في حالة استدعاء أى دالة يتم عمل jumping إلى الدالة ثم تنفيذها وفي حالة الوصول إلى نهاية الدالة يرجع إلي following instruction in main

وهذا يسبب memory Space And Lost Time

ولحل تلك المشكلة عن طريق كتابة ال keyword inline كما يلي

Inline DataType NameOfFun()
{
//code implementation
}

حيث عند عمل calling لل line function لا يتم عمل jumping لكن عمل insert

للكود بتاع الداله داخل ال main وبالتالى يقلل من ال wast space وال Lost Time لاحظ ذلك الكود

#include <iostream>
#include <conio>
inline int sum(const int& x,const int& y)
{
return x+y;
}
void main()
{
cout<<"the result is: "<<sum(1,2);
getch();
}

حيث تم عمل دالة أسمها sum من النوع int وهى inline function

ويتم عمل passing for two argument by reference and made it const for not change this values

في حالة عمل calling للدالة لا يتم عمل jumping ولكن يتم عمل insert لكود الدلة داخل الmain()

أما عن الoverloading

وهو ان اكتر من دالة لها نفس الاسم ولكن معتمدة على arguments

لاحظ ذلك المثال

#include <iostream>
#include <conio>
void print(int val1)
{
cout<<"the val of value is:\t"<<val1<<"\n";
}

void print(char val1)
{
cout<<"the val of value is:\t"<<val1<<"\n";
}

void print(float val1)
{
cout<<"the val of value is:\t"<<val1<<"\n";
}


void main()
{
float x=1.2;
int a=12;
char b='a';
print(x);
print(a);
print(b);
getch();
}

حيث تم عمل ثلاث دوال بنفس الأسم ولكن مختلفين في الarguments

.

مثال شامل ال recursion وال overloading وهو عبارة عن binary search

فكرة عملة لتلاشي عيوب ال sequential access حيث ال sequential access

عبارة عن بحث فى الarray ولكن عن طريق

يقارن القيمة المراد البحث عنها وبكل عنصر موجود فى الarray

يعنى لو عندى array بها 13 عنصر

يقارن العنصر الاول بالعنصر المراد البحث عنة فإن لم يكن هو فيقارنة بالعنصر الثانى فإن لم يكن يقارن العنصر الثالث بالعنصر المراد البحث عنة وهكذا حتى يصل إلى العنصر الاخير

أفترض لو عندى array مكونة من 1000 عنصر وبالتالى سيقارن sequential

وبالتالى دة يأخذ وقت طويل وهذا غير مرغوب فية فت عمل الbinary search

حيث فكرة عملة ويتم ترتيب ال array أولاً مثلا نفترض ان ال array بعد الترتيب هي (2-4-7-10-11-45-50-59-60-66-69-70-79)

حيث ال binary search يقارن الرقم المطلوب البحث عنة (Key)بال element الموجود في منتصف ال array وهو (50) فإذا كان ذلك ال key أقل من ال middle element سيبحث عن ال key في النصف الأول من ال array

ولو كان = الmiddle element سيتم وقف البحث .

ولو كان ال key اكبر من ال middle element سيبحث عنة في النصف الاخر من ال array

لاحظ تلك الصورة حيث تم البحث عن index of number 11 وهو 4

صورة أسمها

binarysearch.jpg

للاسف انا لم أستطع تحميل تلك الصورة :s

ستجدونها فى المرفقات

#include <iostream>
#include <conio>
const int Size=13;
int array[13]={2,4,7,10,11,45,50,59,60,66,69,70,79};
int binarysearch(int key,int list[] ,int low,int high);


int binarysearch(int key,int  list[] )
 {

   int low=0;
   int  high=Size-1;
   return binarysearch(key,list,low,high);
 }
int binarysearch(int key,int list[] ,int low,int high)
 {
   if(low>high)   return -1;
   int mid=(low+high)/2;
   if(key<list[mid])
   {
    return binarysearch(key,list,low,mid-1);
   }
   else
    if(key==list[mid])     return mid;
    else
     return binarysearch(key,list,mid+1,high);
 }
void main()
{
  cout<<"the index of number is "<<binarysearch(11,array );
getch();
}

حيث تم عمل دالتين بأسم binarysearch وهذا ما يسمى بال overloading

الدالة الأولى تم عمل passing لل array وال Size بتاعها

داخل الدالة تم تعريف ال low وال high حيث ال low وهو أول عنصر في الarray وال high أخر عنصر في ال array ثم في ذلك السطر

return binarysearch(key,list,low,high);

تم عمل calling للدالة الثانية ويتم عمل passing لل key المراد البحث عنة و الarray وأيضاً تم تمرير index أول عنصر وهو0 وindex اخر عنصر وهو 12

في الداله الثانية تم اختبار هل الlow اكبر من الhigh يبقي return -1

غير ذلك يحسب الmiddle من ذلك السطر

int mid=(low+high)/2;

فإذا كان الkey المراد البحث عنة اقل من العنصر الmid وهو 50 كما موضح في السطر التالي if(key<list[mid]

سيتم عمل recursion حيث يتم تمرير ال key و ال array و ال low والmid-1

يعني يكون الmid =5 وهو ال index بتاع الرقم الى قبل ال50

كما موضح فى ذلك السطر

return binarysearch(key,list,low,mid-1);

غير ذلك

إذا كان الkey بيساوى الlist[mid]

يرجع الindex يعنى يرجع الmid كما موضح فى ذلك السطر

    else
    if(key==list[mid])     return mid;

غير ذلك يبقى الkey المراد البحث عنة أكبر من الlist[mid]

كما موضح فى ذلك السطر

      return binarysearch(key,list,mid+1,high);

وبكدة يبقى إنتهى درس الfunctions على خير ويارب تكونوا إستفدتوا

و أأسف على التاخير فى وضع الدروس بسبب إنشغالى فى تلك الفترة الحالية

الدرس القادم عن الstructure

وشكرا لكم والسلام عليكم ورحمة الله وبركاتة

functions.rar

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

شكرا لك

أولا بالنسبة للreturning by reference

لاحظ ذلك المثال وانت أكيد عارفة

#include <iostream>
#include <conio>
int z;
int ∑(int& x,int&y)
{
z=x+y;
return z;
}


void main()
{
int a=12,b=11;
 cout<<"the result is "<<sum(a,b);
 getch();
}

دة فى الحالة العادية وناقشنا سابقا لية أستخدم pass by ref and return by ref

ولكن الهدف من المثال السابق هو كما انت رأيت وضع إسم الدالة على يسار علامة اليساوى حتى يكون ذلك الشكل مألوف للاخوة الاعضاء ولكن فى الاغلب ليس مستخدم ولا أنا استخدمتة فى جميع برامجى

حبيت أوضحة حتى لو أى عضو وجد ذلك فى أى برنامج ما ينخضيش

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

فى ذلك الدرس بإذن الله نتكلم عن الstructure

After this lesson u will be able to know:

1- introduction

2- Describe the struct

3- How to write struct

4- Initialize structure

5- Inner Structure

6- Problem

مقدمة بسيطة عن الstruct

من أهم تطبيقات البرمجة هى الdataBase حيث كل file عبارة عن مجموعة من الrecords وكل record عبارة عن مجموعة من الfields حيث فى الDB يتم التعامل مع السجل كوحدة واحدة وبالتالى لو حبيت أعمل DB صغيرة بالسى بلس بلس يعنى أكتب فى file وأعمل عمليات الDB على ذلك الملف من حيث search and delete and update and so on وبالتالى سأحتاج الى التعامل مع السجل أو الRecord كوحدة وبالتالى أستخدم فى تلك الحالة الStructure

تعريف الstruct عبارة عن مجموعة من الvariables حيث تلك الvariables ممكن تكون مختلفة يعنى ممكن تكون (int or float or double or char or string)

كنا فى الarray سابقا كنا نقول أنها عبارة عن مجموعة من الvariables المتحدة فى النوع يعنى الarray إما أن تكون من النوع int or floa or double or char

ولكن لا توجد array بها two variables إحداهما من النوع int والاخر من النوع float !!!!

Struct structName
{
//members of struct and functions if u have
};

structName يكون أى إسم أهم حاج لا يعترض مع الاسماء المحجوزة للغة البرمجة يعنى ما أسميش الstruct بإسم cout or power

وهكذا للتفصيل عن تلك النقطة إرجع الى الدرس الاول

ثم بعج ذلك يتم كتابة المتغيرات التى سيحتويها ذلك الstruct

وخلى بالك من الsemicolonاللى بعد الclosing braces أحسن لو نسيتها هتبهدل الدنيا :D

وزى ما قلنا أى حاجة ممكن أن تكون Global وممكن أن تكون local

وبالتالى لو حبيت أعملة local يتم كتابتة داخل الmain ولكن أفضل أن يكون Global بحيث يتم عمل access لة عن طريق أى دالة

(جميع البرامج اللى هكتبها سيكون الstruct فيها global حتى يكون سهل إستخدام

متغيراتة داخل أى دالة )

حيث أن أى struct يتم تعريفة يمر بثلاث مراحل وهى :

Define the Structure

Define the the structure variables

Accessing the members of structure

لاحظ ذلك المثال حيث عبارة struct يحتوى على two variables وهما من النوع

Int,char ثم يتم عمل initial لهم

#include <iostream>
#include <conio>
struct Data
{
int x;
int y;

};
void main()
{
Data D;
D.x = 21;
D.y = 23;
cout<<D.x<<endl<<D.y;
getch();

}

بدايتا تم تعريف الstruct

كما موضح

Struct Data 
{
Int x;
Int y;
};

حيث عند تعريف الstruct يبدأ بالkeywordstruct ثم يتبعة إسم الstruct

حيث يتعرف الcompiler أن ذلك عبارة عن structure

ثم أكتب الData Members بتاعت الstruct وهى عبارة عن two variables

X,y

ثم فى الmain عرفت متغير من النوع Data وبالتالى يتم حجز لة مساحة فى الmemory مماثلة لحجم الstruct يعنى لو كان الint يحجز لة فى الmemory 4 bytes

بحيث ذلك المتغير سيكون لة x,y خاصين بية

ملحوظة عند تعريف الstruct فى السى وليس السى بلس بلس يتم ذلك عن طريق ذلك السطر

struct Data d;

حيث يتم كتابة الkeyword struct قبل إسم الstruct

أما فى السى بلس بلس يتم كتابتها كما موضح فى البرنامج

Data D;

بعد أن تم تعريف variable from struct or instance from struct

حيث يتم عمل access للمتغيرات الموجودة فى الstruct عن طريق إستخدام

الDot operator(.) كما موضح فى ذلك السطر:

cout<<D.x<<endl<<D.y<<endl;

لاحظ ذلك البرنامج حيث أنة مماثل للبرنامج الاخر ولكن القيم بتاعت الx,y هيدخلها الuser وأيضا وجود دالة بسيطة إسمها print داخل الstruct

لاحظ ذلك البرنامج

#include <iostream>
#include <conio>
struct Data
{

int x;
int y;
void print()
{
 cout<<x<<" "<<y<<"\n";
}

};
void main()
{
Data D;
cout<<"plz enter two numbers\n";
 cin>>D.x>>D.y;
//cout<<D.x<<endl<<D.y<<endl;
D.print();
getch();


}

حيث تم تعريف دالة تسمى print داخل ال struct حيث يتم طباعة المتغيرات

حيث فى ذلك السطر

cin>>D.x>>D.y;

حيث ذلك السطر يكمن المستخدم من إدخال قيم الx,y

ويتم طباعتهم عن طريق إستخدام دالة print ويت عمل access للData members عن طريق Dot Operator(.)

Initialize structure

يعنى أعمل intial

لاحظ ذلك البرنامج

#include <iostream>
#include <conio>
struct Data
{

int x;
int y;
void print()
{
 cout<<x<<" "<<y<<"\n";
}

};
void main()
{
Data D1 = {11,22};
Data D2 = D1;
D1.print();
D2.print();
getch();


}

فى ذلك السطر

Data D = {11,22};

تم عمل initial للمتغيرات x,y الخاصة بالD1

وبالتالى أول ما يشوف الcompiler ذلك السطر

Data D2 = D1;

يتم حجز لة مساحة فى الmemory ثم بعد ذلك

يتم عمل assignment للذلك المتغير بالمتغير اللى أسمة, D1 وبالتاللى القيم الموجودة فى الD2 هى نفس القيم الموجودة فى D2

ولو كان المتغيرين ليسوا من نفس النوع يعنى إحداهما مثلا من النوعData والاخر مثلا من النوع Demo وبالتالى سيحدث خطأ ويعترض الcompiler على ذلك

وعيوب الassignment لو كان الstructure ضخم جدا جدا ممكن يودى الى تهنيج الجهاز

هل ممكن يتم عمل عمليات حسابية على عناصر الstruct ؟؟

نعم لاحظ ذلك البرنامج

عبارة عن struct إسمة calc يحتوى على two variables من النوع int

ويتم جمعهم وإخراج الناتج

Array OF Struct

#include <iostream>
#include <conio>
struct Data   //create struct its Data member is x
{

int x;
};
void main()
{
Data array[5];   //i create array of struct from Data
for(int i = 0;i < 5; i++)  //to access it Data by using  Dot operator
 {
   cout<<"enter the element num: "<<(i+1)<<"   ";
   cin>>array[i].x;

 }
cout<<"u ahve entered the element num: ";
for(int i = 0;i < 5; i++)                // to print the values
 {
   cout<<"\n"<<array[i].x<<"\n";


 }
  getch();
}

Inner Structure

ومعناها struct داخل struct

لا حظ ذلك البرنامج

#include <iostream>
#include <conio>
#include <stdio>
struct Inner
{

int age;
char Name[20];
void print()
{
 cout<<age<<" "<<Name<<"\n";
}

};
struct Outer
{
Inner In1;

};

void main()
{
Outer Out;
cout<<"enter the age:\n";
 cin>>Out.In1.age;
cout<<"enter the Name:\n";
 cin>>Out.In1.Name;
Out.In1.print();
getch();
}

حيث عرفت struct his Name is Outer

And anthor struct his Name is Inner

كما موضح بالشكل

struct Inner
{

int age;
char Name[20];
void print()
{
 cout<<age<<" "<<Name<<"\n";
}

};
struct Outer
{
Inner In1;

};

حيث فى الOuter عرفت variable his Data type is Inner

وعند عمل access للOuter struct حيث قمت بتعريف variable أسمة Out

حيث يتم عمل access للمتغيرات الموجودة داخل الstruct Outer عن طريق الDot Operator(.)

وبما أن الvariable الموجود داخل الOuter من النوع Inner وبالتالى لازم أعمل access لجميع المتغيرات الموجودة فى الinner وذلك عن طريق ذلك السطر

cin>>Out.In1.age;

وذلك فى السطر التالى

cin>>Out.In1.Name;

حيث عند عمل initial لمتغير مأخوذ من الOuter يتم ذلك عن طريق ذلك السطر

Outer Out ={{12,"allam"}};

وكدة الدرس خلص ويارب تكونوا إستفادتوا ولو بمعلومة بسيطة

Problem

أعمل struct إسمة Person الData members عبارة عن Name,age,Phone,Mail

حيث يتم إدخال ذلك عن طريق array من النوع Person ويتم عمل Sort لتلك البيانات

الدرس القادم بإذن الله عن الpointers

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

حين أرى عدد قراء تلك المشاركة ولا تكون هناك رد قد نعتبر هذا أن كل شيء يمشي تمام وسليم ولا يوجد اى مشكلة

بسم الله الرحمن الرحيم

سنتكلم اليوم بإذن الله عن (hobgoblin of c,c++ programming) ألا وهى الPointers حيث يعتبر من أهم الدروس المهمة سواء كانت فى السى أو السى بلس بلس ويجب إتقان الpointers . مهم جدا لمبرمج السى والسى بلس بلس بمعرفتة التامة بالpointers وكيفية إستخدامها . حيث أن بعض لغات البرمجة لا تدعم الPointers مثل الjava والvb ولكن الJava تحتوى على reference بدون الpointers أكيد هتعرف تبرمج على السى أو على السى بلس بلس ولكن فى بعض المهام التى لاتتم إلا عن طريق الpointers من مميزات الpointers :

تستخدم لعمل access for array element كذلك Passing array to function وأيضا لعمل create for linked list

After this lesson u will be able to:

• ماهو الaddress وكيفية طباعة عنوان متغير معين

• ماهو الpointers ولماذا تستخدم وكيفية إستخدامها

• إزاى أعمل Pointer to void

• إية العلاقة بين ال Pointers and arrays وإزاى أستغلهما فى برامجى وإزاى أمرر array الى دالة ما

• إية العلاقة بين ال Pointers and functions

• الفرق بين const int* ptr and int* const ptr

• Multidemision array& pointers

• Memory Management

• Lesson summary

Estimated lesson time bektero awi awi 60 minutes

بدايتا كل Byte فى الmemory لة عنوان (Address ) حيث الaddress عبارة عن رقم دال على ذلك المكان الموجود فى الMemory زى عنوان المنزل حيث ذلك الرقم(address ) يمثل hexadecimal كما سنعرف

أى برنامج يبدأ تحيلة فى الMemory يتم حجز لة مدى محدد من الaddresses

علشان أعرف عنوان أى متغير فى الram أستخدم الOperator & لاحظ ذلك المثال:

#include <iostream>
#include <conio>
void main()
{                
int x = 22;
int y = 33;
int z = 44;
int a = 44;
cout<<&x<<"  "<<&y<<"  "<<&z;
getch();
}

حيث تم تعريف ثلاث متغيرات من النوع integer وتم إعطاء قيم لهم حيثفى ذلك السطر:

cout<<&x<<"  "<<&y<<"  "<<&z;

يتم طباعة عنوان كل متغير بإستخدام الaddress Operator & حيث يتم كتابة تلك العلامة قبل المتغير كما أنت ملاحظ

وخلى بالك أن العنوان العلى لكل متغير من تلك المتغيرات يعتمد على عدة عوامل

البرامج التى فى مرحلة الRunning والحجم المحجوز للos فى الmemory ولهذة الاسباب مش لازم أن الoutput بتاع البرنامج عند عمل run لة على عدة أجهزة يكون واحد .

حيث الaddress فى الذاكرة يمثل بالhexadecimal لاحظ أن الفرق بين الaddress والاخر 4bytes لان تلك المتغيرات من النوع الint

حيث الint يتم حجز لة 4bytes

ولو لاحظت الoutput ستجدة مترتب تصاعديا وذلك بسبب أن المتغيرا المخزونة فى الstack ولكن لو عرفت تلك المتغيرات global ستجد أن تلك المتغيرات مرتبة تنازليا لان متغيرا الglobal تخزن فى الheap not stack

لاحظ ذلك البرنامج لتلاحظ الفرق بينهما

//this programm show difference between store local variable and global variables in memory 
#include <iostream>
#include <conio>
int a = 46;    //Define three Global Variables
int b = 12;
int c = 13;
void main()
{
int x = 22;  //Define three local variables
int y = 33;
int z = 44;
int a = 44;
cout<<"the Address of three local variables is:\n"<<&x<<"  "<<&y<<"  "<<&z<<"\n\n\n\n";
cout<<"the Address of three global variables is:\n"<<&a<<"  "<<&b<<"  "<<&c<<"\n";
getch();
}

بعد أن تكلمنا عن الaddress وإزاى أطبع العنوان لمتغير ما وعرفنا أن الlocal variables store in stack but global variables store in Global

تعالى نكلم على الPointers عفريت البرمجة كما يقولون:D

زماااااااااان كنا بنعرف متغيرات من النوع char تخزن فيها characters وأيضا كنا بنعرف متغيرات من النوع int لتخزن فيها قيم صحيحة وأيضا متغيرات من النوع float لتخزين فيها كسور عشرية

طب هل يوجد متغيرات يتم تخزين فيها عناوين ما(addresses ) ؟؟؟؟؟؟؟ نعم ألا وهى الpointers

طب تعالى نفكر شوية إن تلك المؤشرات يكون الdata type بتاعها هو pointers يعنى علشان أعرف pointers أعرفة كما يلى

Pointer ptr;

؟؟؟؟؟؟؟؟؟؟؟؟؟؟

طب لو كان كدة إزاى الcompiler هيعرف إن ذلك المؤشر شايل عنوان لمتغير نوعة إية ؟؟؟؟؟؟

تعالى نشوف ذلك المثال الجاى دة وهوة اللى هيحكم على ذلك السؤال

#include <iostream>
#include <conio>
void main()
{
int x = 22,y=13,z=56;
int* ptr;   //pointer to integer as it will store addresses of integer variables
ptr = &x;   //pointer point to x
cout<<"the address of x is:\t"<<&x<<endl;
cout<<ptr<<endl;
ptr = &y;   //pointer point to y
 cout<<"the address of y is:\t"<<&y<<endl;
cout<<ptr<<endl;
ptr = &z;   //pointer point to z
 cout<<"the address of y is:\t"<<&y<<endl;
cout<<ptr<<endl;

getch();
}

عرفت متغير من ثلاثة متغيرات من النوع int وهمx,y,z وعملت لهم initial ثم بعد ذلك طبعت عناوين تلك المتغيرات عن طريق إستخدام الAddress operator &

ثم بعد ذلك عرفت مؤشر كما فى ذلك السطر:

Int* ptr;

حيث الasterisk أو تلك العلامة(*) تعنى أن ذلك المتغير مؤشر لشيى معين ومن ذلك السطر نستنتج أن ذلك سيتم تخزين فية عناوين لمتغيرات من النوع int

وبالتالى أنا لازم أحدد نوع المؤشر هل هوة من النوع int or double or float وهكذا

وبالتالى لازم الcompiler يعرف نوع المتغير اللى المؤشر هيشاور علية.

بالنسبة لتعريف الpointer يكتب كما يلى

DataType*     pointerName;
أمثلة لذلك :
int* ptr;         //pointer to integer
char* ptr;         //pointer to character
double* ptr;         //pointer to double
float* ptr;         //pointer to float

لاحظ عند تعريف الpointer أن تكون الasterisk بجوار الDatatype يعنى ماتكونش بجوار الاسم زى كدة

Int *ptr;

لايعترض الcompiler على ذلك ولكن يساعد ذلك على التأكيد أن ذلك المؤشر يشير الى datatype معين وليس يشير الى إسم المتغير.

لو أنت هتعرف أكثر من pointer ممكن تكتب كما يلى :

int* a,* b,* c,* d;
int *a, *b, *c, *d;

عند بداية تعريف أى متغير وليكن كذلك

Int x;

ولم يتم عمل إعطاء لة قيمة أو لم يتم عمل لة initial تكون قيمة ذلك المتغير Garbage value

وكذلك مع الpointers لم أعطى لة قيمة معينة تكون قيمتة Garbage value حيث تعنى أى عنوان موجود فى الذاكرة يتم تخزينة داخل الpointer

وبالتالى ينصح قبل إستخدام أى pointer يجب أن تعطية أو تحدد لة عنوان اللى هيشاور علية كما موضح فى ذلك السطر

Ptr = &x;

حيث فى ذلك البرنامج يتم تخزين عنوان أى متغير من المتغيرا المعرفة سابقا داخل الptr  كما موضح فى ذلك السطر
ptr = &x;   //pointer point to x
ptr = &y;   //pointer point to y
ptr = &z;   //pointer point to z
ويتم طباعة كل القيم المخزنة داخل المؤشر كما يلى
cout<<"the address of x is:\t"<<&x<<endl;


ملخص فى السريع لما سبق
إن الpointers يتم تخزين فيها عناوين لاى متغير من نفس نوع الpointer  وخلى بالك وانت بتعطى قيمة للمؤشر يعنى مثلا
أعرف مؤشر من النوع int وأخزن فية عنوان لمتغير من النوع float or char وبالتالى سيسبب تصادم(crash ) مع الos ويسبب Exceptions and compiler will give u error
وبالتالى لازم تكون حريص جدا وانت بتتعامل مع الpointers !!!!!

طب دلوقتى عرفت أعرف مؤشر وأعطية عنوان محدد يتم تخزينة فية ثم يتم طباعة محتوى المؤشر (context of pointer )
بس أنا مش عاوز المعنوان اللى المؤشر مخزنة  دا انا عاوز القيمة اللى المؤشر يشير إليها (وهى القيمة المخزنة داخل المتغير اللى المؤشر يشير إلية)
لاحظ ذلك المثال
[CODE]
#include <iostream>
#include <conio>
void main()
{
int x = 22,y=13,z=56;
int* ptr;   //pointer to integer as it will store addresses of integer variables
ptr = &x;   //pointer point to x
cout<<*ptr<<endl;
ptr = &y;   //pointer point to y
cout<<*ptr<<endl;
ptr = &z;   //pointer point to z
cout<<*ptr<<endl;

getch();
}

وبالتالى علشان أطبع القيم اللى المؤشر يشير إليها أستخدم الDereference Operator or indirection Operator

وهى تعنى هاتلى القيمة اللى أنت بتشاور عليها يا ptr كما موضح فى ذلك السطر:

cout<<*ptr<<endl;

وبالتالى لاحظ ذلك

عند تعريف أى مؤشر يأخذ قيمة بZero or the address of the variable which pointer is pointed to it

Zero هنا تعنى Null

حيث فى تلك الحالة يكون الpointer لم يتم عمل لة initial ويسمى بذلك Dangling pointer

أما عند الحالة الثانية يكون تم إعطاء للptr قيمة

وعند عمل access لذلك الpointer يتم ذلك عن طريق إستخدام Dereference operator كما قلت سابقا

طب هل الpointers ممكن يتم عمل عمليات حسابية عليها؟؟؟

تعالى نشوف البرنامج دة :

#include <iostream>
#include <conio>
void main()
{
int x = 22,y=13;
int* ptr;   //pointer to integer as it will store addresses of integer variables
ptr = &x;
*ptr+= y;
cout<<*ptr;
getch();
}

حيث تم تعريف two variables من النوع integer وتم عمل إعطاء قيم إبتدائية لهم

ثم خزنت قيمة المتغير x فى المؤشر كما فى ذلك السطر

ptr = &x;

ثم بعد ذلك علشان أجيث القيمة المخزنة فى المؤشر أستخدم ال Dereference operator كما يلى

*ptr

بعد أن جيبت القيمة الموجودة فى المؤشر جمعت عليها القيمة الموجودة فى المتغير y كما موضح

*ptr+= y;

ثم بعد ذلك طبعت قيمة الptr

لاحظ ذلك المثال أيضا

#include <iostream>
#include <conio>
void main()
{
int x,y;
int* ptr;   //pointer to integer as it will store addresses of integer variables
ptr = &x;
*ptr = 12;
 y  = *ptr;
cout<<x<<"   "<<y;
getch();
}

حيث عرفت متغيرين هما x,y ثم بعد ذلك عرفت pointer إسمة ptr و خزنت فية عنوان الx ثم خليت المحتوى المؤشر يساوى 12 وبالتالى تكون قيمة ال

X=12 ثم ليت قيمة الy=12 عن طريق ذلك السطر

  y  = *ptr;

Pointer to void

كما قلنا سابقا ماينفعش أحط عنوان متغير من النوع double فى مؤشر نوعة int ولكن ممكن يكون المؤشر من النوعvoid وبالتالى متاح لة أن يشير على أى متغير من أى نوع

حيث يعرف ذلك المؤشر كما يلى

void* ptr;   //pointer to void  as it will store addresses of any variables

لاحظ ذلك المثال:

#include <iostream>
#include <conio>
void main()
{
int x = 12;
float y;
char z = 'a';
int* intptr;
float* floatptr;
char* charptr;
void* ptr;   //pointer to void  as it will store addresses of any variables
intptr = &x;           //ok int* to int*
//intptr = &y;          error can't convert float* to int*
//intptr = &z;          error can't convert char* to int*

ptr = &x;      //ok int* to void
cout<<ptr<<endl;
ptr = &y;      //ok float to void
cout<<ptr<<endl;
ptr = &z;      //ok char to void
cout<<ptr<<endl;
getch();
}

Pointers and arrays

لاحظ ذلك المثال حيث عبارة عن array ويتم طباعتها

#include <iostream>
#include <conio>
void main()
{
int array1[6] ={1,2,3,4,5,6};
for(int i=0;i<6;i++)
 cout<<array1[i]<<endl;
 cout<<"\n\n\n";
 for(int i=0;i<6; i++)
  cout<<*(array1+i)<<endl;
getch();
}

حيث يتم طباعة عنار المصفوفة إفترض أن الi = 4وبالتالى ستكون الarray1 عبارة عن array1[5] وبالتالى يتم طباعة 6 حيث الarray يبدأ الindex بتاعها من 0 to n-1 حيث الn=6 وبما أن إسم الarray ما هو إلا address (عنوان للarray ) وبالتالى ممكن يتم عمل access لل array عن طريق pointers كمايلى

for(int i=0;i<6; i++)
  cout<<*(array1+i)<<endl;

حيث ذلك التعبير*(array1+i)<< يعادل array إفترض ان الi = 5 وبالتالى يكون التعبير كما يلى

*(array1+5) وال5 هنا لاتعنى 5byte ولكن تعنى هاتلى العنصر رقم 5 حيث الcompiler هيفهم بأنك تريد العنصر السادس (لو بدات العد من 1الى 6)

وبالتالى array+5 ما هو إلا الindex العنصر ولكن أنا عاوز القيمة وليس العنوان وبالتالى أستخدم ل Dereference operator كما موضح

*(array1+i)

معنى كدة إن إسم الarray ما هو إلا عنوان للarray وبما أن ذلك التعبير *(array1+i) لة نفس تأثير array

هل من الممكن أن تكتب *(array1++) ؟؟؟؟؟

الاجابة NOoO لانك ماينفعش تزود حاجة ثابتة حيث الarray تعتبر ثابتة الحجم حيث عنوان الarray يحددة الos وهوة اللى فى الMEMORY

ولكن ممكن أزود pointer يحتوى على address كما فى المثال الموضح

#include <iostream>
#include <conio>
void main()
{
int array1[6] ={1,2,3,4,5,6};
int* ptr = array1;   //give apointer the address of the array
for(int i=0;i<6;i++)
 cout<<*(ptr++)<<endl;  
getch();
}

حيث فى بداية الامر يكون الptr يبدأ بأول عنوان للarray وهو array1[0] وحتى أجيب القيم المخزنة داخل المؤشر أستخدم ا ل Dereference operator وبالتالى يطبع أول عنصر فى المصفوفة ثم يتم عمل لة increment (وبما أن ذلك المتغير ليس ثابت ) وبالتالى سيشير الى العنصر الثانى

وهكذا

Pointers and functions

عند عمل passing argument يتم ذلك بثلاث أنواع هم

Pass by value

Pass by reference

Pass by Pointers

لو انت عاوز الدالة تعمل تغير فى المتغير أستخدم الطريقة الثانية أو الثالثة أما عن Pass By Value يتم عمل copy للمتغيرات وأى تغير يحدث لتلك المتغيرات دخال الدالة لا تحس بة الmain

تعالى نفتكر الPass By reference عن طريق ذلك المثال

#include <iostream>
#include <conio>
void incremnet(int &x)
{
x++;
}
void main()
{
int X = 12;
cout<<"Before calling the method x is: "<<X<<endl<<endl;
incremnet(X);
cout<<"After calling the method x is: "<<X<<endl;

getch();
}

وعند عمل ذلك البرنامج عن طريق الpointers لاحظ التغير البسيط

#include <iostream>
#include <conio>
void incremnet(int* x)
{
*x+=1;
//(*x)++;    this statement equal *x+=1;

}
void main()
{
int X = 12;
cout<<"Before calling the method x is: "<<X<<endl<<endl;
incremnet(&X);
cout<<"After calling the method x is: "<<X<<endl;

getch();
}

حيث الargument بتاع الدالة عبارة عن مؤشر Pointer to int وبالتالى عند عمل Passing يتم مباصاة عنوان المتغير وليس المتغير نفسة كما يحدث عند الPass by reference

حيث الPass by pointers شبية جدا بPass by reference

حيث الReference is an-alias of the variable but Pointers is address of variable

Passing array

بما أن إسم الarray ما هو الا عنوان لها لو باصيت إسم الarray الى الدالة التى يكون الParameter بتاعها Pointer وبالتالى أقدر أعمل access

للarray عن طريق ذلك الpointer

كما قى المثال الحالى

#include <iostream>
#include <conio>
void Print(int* ptr,int size)
{
for(int i=0;i<size;i++)
cout<<  *(ptr++)<<endl;
}
void main()
{
int arr[6] = {1,2,3,4,5,6};
Print(arr,6);
getch();
}

حيث ذلك السطر

void Print(int* ptr,int size)

مشابة ل

Void print(int array[],int size)

وكما قلنا أن إسم الarray ما هو الا عنوان لها وبالتالى لا داعى الى إستخدام الaddress Operator &

وذلك السطر معناه

*(ptr++)

ذود الاول وبعد كدة هاتلى القيمة اللى انت بتشارو عليها

Pointers and string

بما أن الstring ما هو إلا مجموعة من الاحرف وبالتالى ممكن أعمل pointer يشاور على مجموعة من الحروف كما فى ذلك البرنامج

#include <iostream>
#include <conio>

void main()
{
char arr[] = "hello world ";
char* ptr = "hello world ";
//arr++;   Error as its const
ptr++;     //u can increment it as it not constant
cout<<ptr;

getch();
}

مثال أخر على الstring وهو عمل دالة الstrcpy

#include <iostream>
#include <conio>
void Strcpy(char* ptr1,const char* ptr2)
{
while(*ptr2)

  *ptr1++ = *ptr2++;
}
void main()
{
char* arr = "hello world";
char ptr[10];
Strcpy(ptr,arr);
cout<<ptr;
getch();
}

أعتقد أن المثال واضح وصريح جدا جدا

طب ما هو الفرق بين

Int* const ptr;
Const int* ptr;

لو عاوز تعرف الفرق ومانتساهوش إقراء الجملة من اليمين الى الشمال

كما يلى

الجملة الاولى

Pointer const to int

يعنى ماينفعش أغير محتوى الptr ويعنى لو كان بيشير الى متغير إسمة مثلا x ما ينفعش كمان شوية أخلية يشاور على قيمة أخرى ولكن ممكن أغير قيمة المتغير x

أما الجملة الثانية

Pointer to const integer

يعنى مؤشر يشير الى قيمة متغير معين ويكون ذلك المتغير ثابت const ماينفعش أغير فى قيمتة

لاحظ ذلك المثال يفرق بينهما

#include <iostream>
#include <conio>
void main()
{
int x= 1;
const int y =12;
int* const ptr1 =&x;  //pointer const so u must initial it
 //ptr1 = &y;   cant modify const object
 x =3;          //i can change the value of x but cant d it with ptr1 as it is const
cout<<*ptr1;

const int* ptr2;
ptr2 = &y;
y = 87;   //u cant change the value where ptr2 point to it but u can change the ptr itself
cout<<*ptr2;
getch();
}

Multidemision array& pointers

كان فى الMulti كان لازم أحدد عدد الاعمدة يعنى أقصى كلمة فى الarray هتوصل عدد حروفها لكام ولو فى كلمة حروفها أقل من أكبر كلمة يبقى الباقى دة

Waste space وبالتالى سيتم إستهلاك الmemory يعنى مثلا

لو عندى Multi dimension array وتلك الarray تحتوى على أيام الاسبوع حيث أكبر إسم هوWendnesday عدد حروفة 9 حروف وبالتالى لو يوجد أأقل من9 حروف زى Sunday الباقى سيكون waste space

وحل تلك المشكلة يكون عن طريق array of pointers

لاحظ ذلك البرنامج

#include <iostream>
#include <conio>
void main()
{
const int d = 7;
char* Days[d]={"saturday","sunday","monday","tuesday","wenesday","thursday","friday"};
for(int i=0;i<d;i++)
  cout<<Days[i]<<endl;
getch();
}

حيث الarray تحتوى على عنوان كل كلمة موجودة فى الarray كما لو نشأت لكل كلمة فى الarray مؤشر لها

Memory Management

زمااااااااااااااان لو ما كونتش عارف حجم المصفوفة كنت بكتب الحجم بتاعها رقم كبيييييير جدا جدا يفوق إحتمالات المستخدم زى مثلا لو بعمل

مصفوفة ليخزن فيها أسماء المعلاء كنت بعمل حجمها 100 حتى يكون أكبر إسم يدخلة المستخدم يكون مكون من 100 حرف

طب لو دخل إسم مكون من 20 حرف يبقى ال80 الباقيين عبارة عن waste space and garbage value !!!!!

طب الحل أستخدم الحجز الديناميكى عن طريق New Operator كما فى المثال الحالى

#include <iostream>
#include <conio>
#include <cstring>
void main()
{
 char* s = "in the name of allah";
 int Length = strlen(s);
 char* ptr = new char [Length];
 strcpy(ptr,s);
 cout<<ptr;
 delete []ptr;
getch();
}

فى ذلك السطر

char* ptr = new char [Length];

حجزت Dynamic array وعملت الsize بتاعهافى الRun Time

حيث عملت create لمساحة فى الmemory عن طريق New وحجمها كما هو محدد عن طريق المتغير اللى إسمة Length

حيث أن الNew Operator شبية جدا بالدالة الmalloc() الموجودة فى السى ولكن من مميزات الnew أنها ترجع مؤشر الى المساحة التى تم حجزها بواسطة new أما فى الmalloc يتم عمل casting الى الdatatype المحدد

وأيضا توجد فى السى دالة تسمى realloc() التى عن طريقها أقدر أعمل Resize للarray ولكن لايوجد نظير لها فى السى بلس بلس وبالتالى تنشأ array

جديدة بالحجم اللى أنت عاوزوة وتضع فيها الold Data

أما عن الDelete Operator

Delete[]ptr

معناها رجع المساحة اللى أنت كنت واخدها ياعم الptr الى الsystem

حيث فى تلك العبارة لا يتم حذف المؤشر ولا تغير الaddress الموجود دخالة ولكن الذاكرة تترك كاليتيم أو يتم تغيرها الى أى شيى أخر أو إستخدامها فى برنامج أخر (كما يقول Lafore :D )

ولكن حقيقا مافيش داعى للDelete لان أوتوماتيك بيتم عمل terminates for process ولكن أفترض أن الptr داخل دالة وتم حجزة عن طريق ال

New Operator سيتم عمل terminate أو destroy لة عندمما يتم عمل terminate for method ولكن

من الافضل ومن الضرورى إستخدام الdelete حيث عند عمل

ومعنى [] التى بعد الdelete أن يتم عمل delete ل array ولكن لو إنت عملت Single object بإستخدام New مالهاش لزمة إستخدام الBrackets

Ptr = new someClass

Delete ptr

Lesson summary:

• علشان أطبع عنوان لمتغير معين أستخدم الAddress Operator مثال

int x; cout<<&x;

• الpointers ما هو إلا متغير يحمل بداخلة عنوان معين لمتغير

• يتم تعريف المؤشر بذلك الشكل العام

DataType* NameOfPointer

مثال بسيط : int* ptr; //pointer to integer

• حيث فى الحالة يكون الpointer لم يتم عمل لة initial ويسمى بذلك Dangling pointer

أما عندما يكون تم إعطاء للptr قيمة وعند عمل access لذلك الpointer يتم ذلك عن طريق إستخدام Dereference operator

• إسم الarray ما هو إلا عنوان لتلك الarray

• لايمكن عمل increment للarray كما يلى *array++ أما الpointer ممكن كما يلى *ptr++ ولكن قبل عمل increment للpointer يجب إعطائة قيمة إبتدائية

• أنواع الPassing : Pass by value and pass by reference and pass by Pointers

• علشان أعمل Dynamic array أستخدم new operator وبعد إستخدام الarray لازم يتم عمل delete لها عن طريق إستخدام الDelete Operator

وبكدة يبقى إنتهى درس الPointers يارب تكونوا إستفادتوا ولو بمعلومة صغنونة(زى ما بيقول معتز شمس :P )

الدرس القادم عن الClasses وأيضا عن pointer to pointer and small application such linked list

شكرا لكم

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

ودى بعض التطبيقات البسيطة جدا

أول برنامج عبارة عن إزاى أعمل appand for two array

#include <iostream>
#include <conio>

int* Appand(int *array2,int n,const int* array1,int s)   //this method is used to appand array to anthor array
{
  int* tmp = new int [n+s];  //i create
 for(int i=0;i<s;i++)
  tmp[i] = array2[i];
 for(int j=0;j<n;j++)
  tmp[j+s] = array1[j];
  return tmp;

}
void main()
{
int n,s;          
cout<<"plz enter the size of two array:\n";
  cin>>n>>s;
int* array1 = new int[n];
 int* array2 = new int[s];
 cout<<"plz enter the elements of frist array:\n";
 for(int i =0;i<n;i++)
 {
   cout<<"enter the element Number"<<(i+1)<<"  ";
    cin>>array1[i];
 }

 cout<<"/n/n/nplz enter the elements of second  array:\n";
 for(int i =0;i<s;i++)
 {
   cout<<"enter the element Number"<<(i+1)<<"  ";
    cin>>array2[i];
 }
int*ptr = Appand(array2,n,array1,s);
clrscr();
cout<<"After Appand the array is:\n";
for(int i = 0;i<s+n;i++)
cout<<ptr[i]<<" ";
getch();
}

والتطبيق الثانى عبارة عن how to delete from the array

#include <iostream>
#include <conio>
#include <process.h>
//return the numbers of this element which u want to delete and to check is the number is exist
int IsNumberFound(int* array,int size,int Number)
{
int n=0;
for(int i =0;i<size;i++)
 {
   if(array[i] == Number) //check if the number is exist
     n++;                  //count for counting this number
 }
// cout<<"\n\n"<<n<<"\n\n\n";
 return n;
}

void print(int* ptr,int Size) //this function for printing the array
{
for(int i = 0;i<Size;i++)
cout<<ptr[i]<<" ";

}


int* Delete(int* ptr,int Size,int Number,int N)//for delete the number u have entered
{
int j = 0;
int* tmp = new int[N]; //create adynamic array for store the new data with the new size
for(int i=0;i<Size;i++)
 {
   if(ptr[i] == Number) //if this condition is true ignore this number else store it in the new array tmp
      continue;
   else
   {
     tmp[j] = ptr[i];
   j++;
   }

 }
// cout<<j;
  //print(tmp,j);
  return tmp;  //return this array


}

//entry point for execute the program main function
void main()
{
int Size;   //for the size of the array
int Number; //this the number which the user entered to deleted from array
cout<<"enter the size of array:\t";
 cin>>Size;
int* array = new int [Size];  //create adynamic array as the user want
cout<<"Now Plz enter the array element:\n";
for(int i=0;i<Size;i++)       //get the element of the array from the user
 cin>>array[i];
cout<<"ur array is:";
print(array,Size);  //print this array
cout<<"\nenter the Number u wanna to delete it from array:\t";
 cin>>Number;
int n = IsNumberFound(array,Size,Number);
if(n!=0)    //check if the number is found delete it else print error message
{
  int*ptr = Delete(array,Size,Number,Size-n);  //calling the Delete method
  cout<<"\nthe array element is:\t";
  print(ptr,Size-n);     //print the new array
}
else
{
 cerr<<"\n\nthe Number u have entered isnt Found.......!";  //error message
 getch();
 exit(0);  //for exit from program its definition in two header files    stdlib.h  and  process.h
}
getch();
}

وفى المرفقات ستجدوا جميع البرامج التى تم عملها وشرحها فى ذلك الدرس

Pointers.rar

0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

بسم الله الرحمن الرحيم شكرا ليك اخويا المبدع على هذه الدوره

التطبيق الاول

Welcome in c++ خمس مرات وكل مرة تكون فى سطر جديد


#include <iostream.h>
main()
{
cout<<"Welcome in c++ "<<endl;
cout<<"Welcome in c++ "<<endl;
cout<<"Welcome in c++ "<<endl;
cout<<"Welcome in c++ "<<endl;
cout<<"Welcome in c++ "<<endl;
}

أعمل برنامج يجمع عددين


#include <iostream.h>
main()
{
int x,y,z;
cout<<"enter first number:= ";
cin>>x;
cout<<"enter 2nd number:= ";
cin>>y;
z=x+y;
cout<<"the result="<<z<<endl;

}

وأيضا أخر يطرح عددين


#include <iostream.h>
main()
{
int x,y,z;
cout<<"enter first number:= ";
cin>>x;
cout<<"enter 2nd number:= ";
cin>>y;
z=x-y;
cout<<"the result="<<z<<endl;

}

أعمل برنامج يحل تلك المعادلة


//2x+12xy+2x2+5y

#include<iostream.h>
#include<math.h>
main()
{
int x,y,z;
cout<<"enter x =";
cin>>x;
cout<<"enter y =";
cin>>y;
z=(2*x)+(12*x*y)+(2*pow(x,2))+(5*y);
cout<<"the result="<<z<<endl;
}

}

:blink: :blink:

وكده خلص تطبيقى الاول جارى فهم الموضوع الثانى وانشاء تطبيقه

تم تعديل بواسطه omar_obida
0

شارك هذا الرد


رابط المشاركة
شارك الرد من خلال المواقع ادناه

  • يستعرض القسم حالياً   0 members

    لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .