• الإعلانات

    • فيصل الحربي

      تسجيل عضوية جديدة في المنتدى   01/31/2016

      السلام عليكم ورحمة الله وبركاته  عزيزي العضو الجديد :  حاليا رسالة الإيميل لتأكيد صحة إيميلكم تذهب للبريد العشوائي ( جاري حل المشكلة )  فإذا لم تجد رسالة التحقق من إيميلكم في صندوق الوارد لديكم إتجه للبريد العشوائي ( JUNK)  وقم بتفعيل إشتراككم من هناك   

البحث في المنتدى

Showing results for tags 'Lesson'.

  • البحث بالتاقات

    اكتب الكلمات المفتاحيه بينها علامه الفاصله
  • البحث بكاتب الموضوع

تم إيجاد 6 نتيجة

  1. السلام عليكم ورحمة الله وبركاته تعتبر خوارزمية Depth First Search أحد الخوارزميات للمرور على جميع النقاط المتصلة connected nodes في مخطط Graph ما .. لا أريد التكرار فالموضوع عليه الكثير من الشروحات الواضحة على youTube  كما أن صفحة wikipedia فيها شرح ممتاز (وفيديو ملحق لإنشاء متاهة أيضاً :) ) ولكن لتبسيط الأمر .. تخيل أن لدينا شجرة كثيرة الفروع , حتى أن فروعها متداخلة , يعني يمكن أن يتقاطع فرعان ويندمجا ! تخيل أن هذه شجرة : هذه الأشجاء التخيلية التي تحوي فروعاً وتقاطعات تُسمّى Graphs (مخططات ) المهم .. تخيل أننا نريد المرور على جميع فروع الشجرة . سنبدأ من الجذر ونصعد .. ثم سيتفرع الجذع الى عدة فروع .. وكل فرع سيتفرع لاحقاً وهكذا .. هناك عدة طرق يمكننا من خلالها ضمان المرور على جميع الفروع .(المرور على جميع الفروع والتقاطعات(العقد) يُسمّى traversing ) إحداها طريقة Depth first Search تحتاج لتطبيقها إلى مكدّس ومعرفة بسيطة في الحلقات والشروط . خوارزمية DFS : 0-نضع الجذر في المكدس ونبدأ الحلقة طالما أن المكدس غير فارغ : 1- نقوم بوضع علامة على العنصر في قمة المكدس للدلالة على انه قد تمت زيارته 2- نقوم باختبار وجود عناصر مرتبطة بالعنصر الحالي(قمة المكدس ) وهل هي صالحة للزيارة (تكون صالحة للزيارة إن كانت مرتبطة بالعنصر ولم تتم زيارتها من قبل ) 3- كل عنصر يحقق الشرط في الخطوة 2 نضعه في المكدس 4- إن لم يحقق أي عنصر الشرط في الخطوة 2 نقوم بإخراج العنصر الحالي من المكدس 5- ان كان المكدس غير فارغ نذهب للخطوة 1   لنحول الخوارزمية إلى كود نحتاج إلى آلية تكديس وسنستعمل std::stack, وآلية loop ويمكن أن نستعمل for  , وسنحتاج آلية لإعادة القيام بالعملية على العقدة الجديدة (يمكن أن نستعمل العودية recursion ولكن سنطبق اليوم بواسطة حلقة while) كما أننا نحتاج وجود المخطط وبه العقد المتصلة (النقاط المتصلة) وسنستعمل ببساطة مصفوفة من بعدين , كل عنصرين متجاورين فيها يكونان مرتبطين مثال للمصفوفة : 1 2 3 4 5 6 7 8 9 نقول أن 1 مع 4 و 2 مرتبطة , وكذلك :  9 مع 6 و 8 وهكذا (يمكن لك أن تعتبر وجود ارتباطات بالمائل مثل 5 و 9 ان أردت ) يمكننا وضع علامة على النقطة التي تمت زيارتها ببساطة بتغيير قيمة المصفوفة مثلاً من 0 إلى 1 أخيراً  : نلاحظ أن الخطوة 4 لم تعد تحتاج إلى for loop  لأن العقد المرتبطة في حالة المصفوفة هي 4 كحد أقصى لذلك سنكتبها يدوياً   لنبدأ ..على بركة الله تحويل الخوارزمية إلى كود : أولا ودوماً أولاً : تطبيق بنية الـGraph ببساطة مصفوفة يمكن ان تحوي 0 أو 1 .. bool :) bool graph[30][30]={false}; القيمة false تعني أننا لم نزر أي عقدة بعد . ثانياً : كيفية الامساك بعقدة ما .. في حالتنا عن طريق الموضع في المصفوفة سنكتب  struct بسيط يُمثّل الموضع struct coord{     int x;     int y;     coord(int x1,int y1){         x=x1;         y=y1;     } }; ولا ننسى آلية التكديس stack <coord> s;والآن  الحلقة التي سنعمل بداخلها الخطوات من 1 إلى 5 , وبها سنتابع بقية العمل , ولكن قبل الدخول إليها علينا دفع الجذر إلى المكدس (أو أي عقدة نرغب في البدء منها ) while(!s.empty()){ }سنقوم بملء التابع السابق كما توضّح الخوارزمية   1-عملية وضع علامة على الفرع الذي تمت زيارته         graph[s.top().y][s.top().x]=true;2-اختبار صلاحية زيارة جميع العقد المرتبطة , وبعد انتهاء العقد المرتبطة ( أو عدم وجودها فالأمر سيان ) أخرج العقدة الحالية من stack سنختبر كل جهة على حدة كما يلي: //look at left        if(valid(s.top().y,s.top().x-1)){            s.push(coord(s.top().y,s.top().x-1));        }        //look at right        else if(valid(s.top().y,s.top().x+1)){            s.push(coord(s.top().y,s.top().x+1));        }        //look up        else if(valid(s.top().y-1,s.top().x)){            s.push(coord(s.top().y-1,s.top().x));        }        //look down        else if(valid(s.top().y+1,s.top().x)){            s.push(coord(s.top().y+1,s.top().x));        }        else{            s.pop();        }الكود بصيغته النهائية : الكود : أولاً : البنى والتوابع المساعدة struct coord{    int x;    int y;    coord(int y1,int x1){        x=x1;        y=y1;    }};const int X=10,Y=10;bool graph[Y][X]={false};stack <coord> s;bool valid(int y,int x){    if(x<X&&x>=0)        if(y<Y&&y>=0)            if(graph[y][x]==false)                return true;    return false;}والتنفيذ في الدالةmain int main(){    //push the current node    s.push(coord(0,0));    while(!s.empty())    {        graph[s.top().y][s.top().x]=true;        //look at left        if(valid(s.top().y,s.top().x-1)){            s.push(coord(s.top().y,s.top().x-1));        }        //look at right        else if(valid(s.top().y,s.top().x+1)){            s.push(coord(s.top().y,s.top().x+1));        }        //look up        else if(valid(s.top().y-1,s.top().x)){            s.push(coord(s.top().y-1,s.top().x));        }        //look down        else if(valid(s.top().y+1,s.top().x)){            s.push(coord(s.top().y+1,s.top().x));        }        else{            s.pop();        }    }    return 0;}كي نتابع عملية السير سنكتب تابع بسيط لإظهار المخطط بعد كل تغيير هذا مثال void printGraph(){/*Put here any implementation to return the pointer to top left*/        cout << s.size() << " " << s.top().x <<" " <<s.top().y<< endl;    for(int i=0;i<Y;i++)    {        for(int j=0;j<X;j++)        {            cout<<(graph[i][j]?'#':' ');        }        cout <<endl;    }/*Put here any implementation to Sleep for 10-100 milli second*/    }في ويندوز سأستعمل تابعين من الـ API void printGraph(){    COORD topLeft={0,0};    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),topLeft);    cout << s.size() << " " << s.top().x <<" " <<s.top().y<< "     " << endl;    for(int i=0;i<Y;i++)    {        for(int j=0;j<X;j++)        {            cout<<(graph[i][j]?' ':'#');        }        cout <<endl;    }    Sleep(30);}ثم ضع استدعاء التابع داخل حلقة while الخاصة بالخوارزمية جرب الكود التالي  في ويندوز (++C) #include<stack>#include<iostream>#include<windows.h>using std::stack;using std::cout;using std::endl;struct coord{    int x;    int y;    coord(int y1,int x1){        x=x1;        y=y1;    }};const int X=10,Y=10;bool graph[Y][X]={false};stack <coord> s;void printGraph(){    COORD topLeft={0,0};    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),topLeft);    cout << s.size() << " " << s.top().x <<" " <<s.top().y<< "     " << endl;    for(int i=0;i<Y;i++)    {        for(int j=0;j<X;j++)        {            cout<<(graph[i][j]?' ':'#');        }        cout <<endl;    }    Sleep(30);}bool valid(int y,int x){    if(x<X&&x>=0)        if(y<Y&&y>=0)            if(graph[y][x]==false)                return true;    return false;}int main(){    //put flag on the visited node    int x=0,y=0;    //push the current node    s.push(coord(x,y));    while(!s.empty())    {        printGraph();        graph[s.top().y][s.top().x]=true;        //look at left        if(valid(s.top().y,s.top().x-1)){            s.push(coord(s.top().y,s.top().x-1));        }        //look at right        else if(valid(s.top().y,s.top().x+1)){            s.push(coord(s.top().y,s.top().x+1));        }        //look up        else if(valid(s.top().y-1,s.top().x)){            s.push(coord(s.top().y-1,s.top().x));        }        //look down        else if(valid(s.top().y+1,s.top().x)){            s.push(coord(s.top().y+1,s.top().x));        }        else{            s.pop();        }    }    return 0;}  تجدر الإشارة إلى فكرة هامّة جداً .. يعتمد المعالج في استدعاء التوابع على مكدّس خاص بالاستدعاءات ويمكننا الاستغناء عن مكدسنا std::stack والاستعانة بالمكدس الخاص بالاستعداءات وذلك عن طريق وضع العملية في تابع بدلاً من while , وبدلاً من عملية push سنقوم باستدعاء التابع مرة أخرى , وبمجرد انتهاء التابع أو عمل return  سيتم عمل pop للقيمة الحالية انظر الكود التالي(أبسط من السابق) #include<iostream>#include<windows.h>using std::cout;using std::endl;const int X=10,Y=10;bool graph[Y][X]={false};void printGraph(){    COORD topLeft={0,0};    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),topLeft);    for(int i=0;i<Y;i++)    {        for(int j=0;j<X;j++)        {            cout<<(graph[i][j]?' ':'#');        }        cout <<endl;    }    Sleep(30);}bool valid(int y,int x){    if(x<X&&x>=0)        if(y<Y&&y>=0)            if(graph[y][x]==false)                return true;    return false;}void function(int y,int x){    printGraph();    graph[y][x]=true;    //look at left    if(valid(y,x-1)){        //s.push(coord(s.top().y,s.top().x-1));        function(y,x-1);    }    //look at right    if(valid(y,x+1)){        //s.push(coord(s.top().y,s.top().x+1));        function(y,x+1);    }    //look up    if(valid(y-1,x)){        //s.push(coord(s.top().y-1,s.top().x));        function(y-1,x);    }    //look down    if(valid(y+1,x)){        //s.push(coord(s.top().y+1,s.top().x));        function(y+1,x);    }//        s.pop();        return ;}int main(){    function(0,0);    return 0;}ولكننا خسرنا ميزة تتبع المكدس فلم يعد بإمكاننا مثلاً كتابة cout << s.size() << " " << s.top().x <<" " <<s.top().y<< "     " << endl;إذا جربت الكود , فستلاحظ أنه يسير بطريقة عادية ليمر على جميع عناصر المصفوفة , ولكن جرب كتابة  function(5,5);وسيبدأ من المنتصف , وعندها ستلاحظ سلوكاً غير متوقع (ربما) في المرور على جميع العناصر .   والآن إلى إنشاء المتاهة: ببساطة سنتحرك خطوتين بدلاً من خطوة واحدة , وبذلك سنترك فراغات تُشكّل الحوائط ! #include<cstdio>#include<windows.h>const int X=21,Y=21;bool graph[Y][X]={false};void printGraph(){    COORD topLeft={0,0};    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),topLeft);    for(int i=0;i<Y;i++)    {        for(int j=0;j<X;j++)        {            putchar(graph[i][j]?' ':'#');        }        putchar('\n');    }}bool valid(int y,int x){    if(x<X&&x>=0)        if(y<Y&&y>=0)            if(graph[y][x]==false)                return true;    return false;}void function(int y,int x){    printGraph();    //look at left    if(valid(y,x-2)){        //s.push(coord(s.top().y,s.top().x-1));        graph[y][x-1]=true;        graph[y][x-2]=true;        function(y,x-2);    }    //look at right    if(valid(y,x+2)){        //s.push(coord(s.top().y,s.top().x+1));        graph[y][x+1]=true;        graph[y][x+2]=true;        function(y,x+2);    }    //look up    if(valid(y-2,x)){        //s.push(coord(s.top().y-1,s.top().x));        graph[y-1][x]=true;        graph[y-2][x]=true;        function(y-2,x);    }    //look down    if(valid(y+2,x)){        //s.push(coord(s.top().y+1,s.top().x));        graph[y+1][x]=true;        graph[y+2][x]=true;        function(y+2,x);    }//        s.pop();        return ;}int main(){    function(5,5);    Sleep(100000);    return 0;}جرب الكود , وستلاحظ أن المتاهة سهلة جداً  للحل ولجعلها صعبة وعشوائية سنغير فقط طريقة الرؤية للكود ! ماذا يعني هذا ؟ يعني أن نجعل اختبارات (اليسارواليمين .. ) غير ثابته , فمثلاً يمكن أن نختبر المرور للأسفل قبل اليمين وهكذا .. لاحظ اختلافات الكود : #include<cstdio>#include<cstdlib>#include<ctime>#include<windows.h>const int X=31,Y=31;bool graph[Y][X]={false};void printGraph(){    COORD topLeft={0,0};    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),topLeft);    for(int i=0;i<Y;i++)    {        for(int j=0;j<X;j++)        {            putchar(graph[i][j]?' ':'#');        }        putchar('\n');    }}bool valid(int y,int x){    if(x<X&&x>=0)        if(y<Y&&y>=0)            if(graph[y][x]==false)                return true;    return false;}void function(int y,int x){    printGraph();    for(int i=0;i<10;i++){//to ensure passing all valid moves        int dx=0,dy=0;        while(dx^dy==0){            dy=rand()%2;//zero or one            dx=rand()%2;//zero or one        }        if(rand()%2==1)            dx*=-1,            dy*=-1;        if(valid(y+2*dy,x+2*dx)){            //s.push(coord(s.top().y,s.top().x-1));            graph[y+dy][x+dx]=true;            graph[y+2*dy][x+2*dx]=true;            function(y+2*dy,x+2*dx);        }    }        return ;}int main(){    srand(time(0));    function(5,5);    Sleep(100000);    return 0;{في الختام أود لفت الانتباه إلى أنه من الأمور الهامة جداً عند دراسة الخوارزميات عدم خلط الخورازمية بالتطبيق , مثلاً فتطبيق رسم المتاهة هو أحد التطبيقات لخوارزمية DFS وليس هو الخوارزمية , وقد وضعته كمثال رسومي جيد لبيان جمال الخوارزمية ليس أكثر .   والله ولي التوفيق
  2. بسم الله الرحمن الرحيم   هذا الموضوع باللغه الانجليزية   يتناول كيفية البحث فى ملفات الحاسب عن طريق الفهرسة Indexing مما يجعل البرنامج قادر على البحث فى ملايين الملفات بسرعه و كفائة و هى الطريقة التى تعتمدها محركات البحث الضخمه مثل جوجل Google و Ping و أيضا يتناول الموضوع طريقة التعامل مع أداة جديده اسمها dtSearch Engine و هى المسؤلة عن الفهرسة و البحث و هى قادرة على البحث فى جميع أنواع الملفات و حتى قواعد البيانات .   من المعروف لمن يعمل فى البرمجه أن معرفة طرق البحث من المؤهلات المطلوبه للعمل فى مجال البرمجه ... معظم البرامج المكلفة تتطلب على الأقل معرفة بسيطه بطريقة الفهرسة و البحث .   للتعرف على الاداه و تحميلها كامله - من هنا   لقراءة الموضوع كاملا باللغة الانجليزيه + تحميل مثال عملى الجزء الأول من هنا  , و يتناول باختصار منطقية البرنامج و طريقة عملة و تصميم الفور . الجزء الثانى من هنا و يتناول باختصار أكواد الفورم و منطقية الأكواد و كيف تتم عملية الفهرسه و البحث عن الملفات ...   الجزء القادم ان شاء الله سيتناول التعامل مع جميع أنواع قواعد البيانات .....
  3. [ltr] Visual Basic 6.0 lesson - Temperature convector ScrollBar control is a very handy tool for Visual Basic programmers. It is used in many tricks like (sizing, scrolling texts .... etc) Visual Basic ScrollBar example Temperature Convector Desktop application source code project is a good example for Visual Basic beginners to start studying ScrollBars and how handy they are for a programmer as a tool on the form. Scrollbars in Visual Basic 6.0 is free to use, easy to place on a form (Horizontally or Vertically) according to your need in the design-time (IDE), in our example we will place one Scrollbar on the form and some labels, TextBoxes and CommandButtons as in the photo below . Temperature Convector VB6 Source Code What is Celsius and Fahrenheit ? - Celsius is a scale and unit of measurement for temperature. It is named after the Swedish astronomer Anders Celsius (1701–1744), who developed a similar temperature scale. The degree Celsius (°C) can refer to a specific temperature on the Celsius scale as well as a unit to indicate a temperature interval, a difference between two temperatures or an uncertainty. The unit was known until 1948 as "centigrade" from the Latin centum translated as 100 and gradus translated as "steps". - Fahrenheit is a temperature scale based on one proposed in 1724 by, and named after, the physicist Daniel Gabriel Fahrenheit (1686–1736).[1] Within this scale, the freezing of water into ice is defined at 32 degrees, while the boiling point of water is defined to be 212 degrees - on Fahrenheit's original scale the freezing point of brine was zero degrees.   Option Explicit' C = (F-32)*5/9Dim TempC As IntegerDim TempF As IntegerPrivate Sub CmdExit_Click ()EndEnd SubPrivate Sub Command1_Click()VsbTemp.Value = 98.6TxtExp.Caption = "Here is Where Body Temp. at 37C Equals F.Temp."End SubPrivate Sub Command1_LostFocus()TxtExp.Caption = ""End SubPrivate Sub Command2_Click()VsbTemp.Value = -40TxtExp.Caption = "Here is Where F.Temp Equals The C.Temp At -40 Point"End SubPrivate Sub Command2_LostFocus()TxtExp.Caption = ""End SubPrivate Sub Command3_Click()VsbTemp.Value = 32TxtExp.Caption = "Scale Resets"End SubPrivate Sub Command4_Click()TxtExp.Caption = "http://evry1falls.freevar.com/vb6/"End SubPrivate Sub Command4_LostFocus()TxtExp.Caption = ""End SubPrivate Sub VsbTemp_Change()'Read F and convert to C.TempF = VsbTemp.ValueLblTempF.Caption = Str(TempF)TempC = CInt(TempF - 32) * 5 / 9LblTempS.Caption = Str(TempC)End SubPrivate Sub VsbTemp_Scroll()'Read F and Convert To C.TempF = VsbTemp.ValueLblTempF.Caption = Str(TempF)TempC = CInt(TempF - 32) * 5 / 9LblTempS.Caption = Str(TempC)End SubSource : Here
  4. بسم الله الرحمن الرحيم الموضوع : كيفية استخدام OCX العد العكسى فى المشروع CountDownTimer.Ocx   1) نقوم بتحميل الأداه من هنا 2) نقل ملف OCX للمسار Windows\System32 3) فتح مشروع فيجوال بيزك 6 جديد 4) استدعاء الأداه عن طريق كليك يمين على شريط الأدوات و اختيار Compnents أو Ctrl+T ثم البحث عنها فى المسار التى حفظناها به 5) وضع الأداه على الفورم ...   الأداه : وظيفتها تقوم بعمل عد عكسى (مثلا 5 - 4 - 3 - 2 - 1) ثم يمكننا عن وصولها للصفر أن نغلق الفورم أو نفتح فورم اخر مثلا أو الانتظار لاستكمال تحميل شىء فهى يمكن أن تحل محل ProgressBar مثلا ... يمكن عرض عملية العد أو اخفائها من على الفورم مع استمرار حدوثها بالطبع . لها خصائص أخرى مثل : 1) سرعة العد (Fast - Norma - Slow) 2) Back_Color 3) Fore_Color 4) بداية العد العكسى (مثلا العد العكسى من 10 الى 0 أو يمكن تحديده من 5) 5) دالة IsShown تعود بقيمة تمثل ظهور العد على الفورم أم لا True أو False   "لا تنسى أن تقوم بعمل Registr للأداه"   تحميل : مثال على الأداه + الأداه نفسها فى المرفقات المرفقات : Count_Down.rar
  5. السلام عليكم ورحمة الله وبركاته اتشرف بإنضمامي الى هذا الصرح الكبير والعظيم (منتديات الفريق العربي للبرمجة) واتمنى له التقدم وان يبقى شامخاً ويتحدى كل الظروف التي تعيق هذا التقدم واحب ان اشكر القائمين على هذا المنتدى من مشرفين وأعضاء يقدمون المواضيع المفيده لجميع اخوانهم المسلمين ( وانا هنا لا اعني الاعضاء الذين يقفون فقط متفرجين او يطرحون الأسئلة فقط ) احبتي انا كنت مشارك باسم اخر وهو linux999 وقد وعدت ان لا اكون من المتفرجين وان اشارك بكل مالدي وبما انني مبتديء في لغة السي ولا ااستطيع الرد على استفسارت الاعضاء احب ان اقدم لكم هذا الشرح في لغة البرمجة المحببة لدي واللغة الرائعة لغة السي والسي++ وهذا رد بعض من الجميل الذي قدمه لي هذا المنتدى هذا الشرح موجود لدي على سيدي وانا اقوم بتنسيقه وسوف اقدم لكم جزء منه والبقية آتية قريبا بعد ان اكمل كتابته وتنسيقه سوف نبدأ بالسي ثم ننتقل الى السي++ ------------------------------------------------------------------------------------- لـــغة الـــــسي الفصل الأول : لغة C … نظرة تاريخية و ملامح عامة لغة C لغة متفردة في ملامحها ومنشآتها، وتتميز بأنها سلاح قوي للمبرمج، فهي تؤدي العديد مما لا تستطيع اللغات الأخرى – عالية المستوى- أن تؤديه كما تتيح للمبرمج التحكم بصورة أفضل في الكمبيوتر، ولذلك فإن لغة ال C قد أصبحت لغة العصر. و على الرغم من أن لغة الC ليست جديدة فإنها لغة سريعة التطور ، حيث أبتكرها " دينيس ريتشي" في أوائل السبعينات وقدمها بالاشتراك مع " بريان كارينجان" في كتابهما ( The C programming language )والذي يعد المرجع الأساسي في اللغة. ومنذ ذلك الحين واللغة في تطور مستمر. وتطورت لغة C تطورا سريعا ليظهر منها الامتداد الذي يطلق عليه C++ وتتميز لغة C++ باعتمادها أساسا جديدا من طرق البرمجة وهو ما يطلق عليه (Object Oriented Programming ).ومهدت لغة C++ الطريق لظهور لغة Visual C++ وهي الصورة الأحدث من اللغة والتي تعمل في بيئة الويندوز. ونتيجة تزايد استخدام لغة C قامت مؤسسة القياسات الأمريكية في عام 1983 بعملية توحيد للهجات المختلفة التي كادت أن تنتشر للغة C فأصدرت اللغة القياسية التي يطلق عليها " ANSI C "وهي تحتوي على بعض الإضافات إلى اللغة الأصلية التي ابتكرها ريتشي. ما هو البرنامج: البرنامج اصطلاح يرمز لعدد محدد من الأوامر التي تعطى للكمبيوتر، بغرض تنفيذ مهمة محددة أو أداء وظيفة مطلوبة. ومن أهم ملامح البرمجة بلغة C أن البرنامج ما هو إلا معمار دقيق التصميم يعتمد في بنائه على البلوكات الجاهزة التي تتكامل معا لتصنع البناء الضخم.و البلوك أو مايسمى بالدالة ( function ) ما هو إلا مجموعة من الأوامر متعلقة بجزء محدد من البرنامج، وتنتج البلوكات من تقسيم البرنامج إلى أجزاء أصغر لكل وظيفته التي يتم تحديدها بالأوامر التي تكتب في البلوك. و استخدام البلوكات الجاهزة يوفر الوقت ولا سيما عندما نرغب في تطوير البرنامج أو إحداث تغيرات جذرية به. وليس هذا هو الحال مع لغة مثل بيسك حيث يبني المبرمج البناء كله من البداية، فإذا أراد المبرمج تعديل البرنامج فإنه يعيد كتابتة أو على الأقل يعيد كتابة أغلب أجزائة. ونستطيع مع لغة C استخدام البلوكات الجاهزة الموجودة بمكتبات المبرمجين الآخرين، أو بناء مكتبة من الدوال للاستعانة بها وقت الحاجة. وهناك خطوات مطلوبة لتنفيذ أي برنامج وهي: 1- كتابة البرنامج وحفظة على القرص باستخدام أحد برامج التحرير ( Editors) 2- عملية الترجمة ( compilation ) وينتج عن هذه العملية البرنامج الهدف الذي يحمل عادة الامتداد " OBJ" . 3- عملية الربط بمكتبة اللغة ( Linking) وينتج عن هذه العملية البرنامج التنفيذي الذي يحمل الامتداد "EXE". والبرنامج التنفيذي هو البرنامج الذي يتم تنفيذه بمجرد إدخال اسمه . وهناك العديد من برامج الترجمة الشهيرة على الكمبيوتر مثل " Terbo C" أو "Quick C" وتلك البرامج تحتوي على بيئة مجمعة تشمل محررا لكتابة البرنامج، و قوائم ذات نوافذ بها أوامر الحفظ والترجمة و الربط و التنفيذ. ------------------------------------------------------------------- الفصل الثاني : مبادئ لغة ال C : 1- البرنامج الأول بلغة ال C من أفضل الطرق للبدء بتعلم لغة جديدة النظر لأحد البرامج البسيطة المكتوبة بهذه اللغة ودراسة أجزاءه كل على حدة، ولنتخذ برنامجا متكاملا جاهزا للتنفيذ. يوضح البرنامج التالي برنامجا صغيرا يطبع على الشاشة عند تشغيله العبارة "Hello C "   #include <stdio.h>main(){ printf ( “Hello C”);}إن البرنامج يعتمد أساسا على الدالة printf فهي المسئولة عن طباعة العبارة المطلوب طباعتها على الشاشة. وعندما تتقدم في اللغة ستجد أن لغة C مبنية من دوال مختلفة لكل وظيفتها المحددة، كما ذكرنا سابقا. ولتؤدي الدالة printf المطلوب منها لا تستخدم بمفردها بل لابد أن تأتي بداخل الإطار الموضح بالشكل السابق حتى تتمكن من القيام بعملها. والإطار الذى يحوي البرنامج يبدأ بكلمة main يعقبها القوس الأيسر " { " والذي تتالى بعده عبارات البرنامج، ثم ينتهي بالقوس الأيمن " } ". ويطلق على الجزء المحتوى بين القوسين " { } " اسم البلوك (block) .و البلوك الذي يبدأ بكلمة (main) يسمى بلوك البرنامج. وفي المثال السابق يتكون البرنامج من بلوك واحد هو بلوك البرنامج. والسطر الأول من البرنامج والمحصور بين العلامتين " /* */" يسمى التعليق ويستخدم التعليق لكتابة الملاحظات على البرنامج، ومن المفيد دوما كتابة التعليقات لتسهيل مراجعة البرنامج . وعند ترجمة هذا البرنامج فإن مترجم لغة C يتجاهل تماما كل ما يأتي بين هاتين العلامتين. ويجوز أن تضيف إلى البرنامج ما تشاء من الملاحظات وفي أي مكان من البرنامج وبأي عدد من السطور مادمت تبدأ وتنتهي بالعلامتين المميزتين" /* " ، " */ ". أما السطر الثاني والذي يبدأ بالعلامة الخاصة " # " فيسمى بالتوجيه ( Directive ) وهو لا يمثل جزءا من منطق البرنامج ولكنه يستخدم لتوجيه المترجم أثناء الترجمة ، حيث يدله على مكان الملف " stdio.h " والذي يطلق عليه اسم ملف العناوين للدخل و الخرج أو (Standard Input Output header file ) ويجب الالتزام بسطور التوجيه لأن هناك دوال لابد لها من إستدعاء ملفات خاصه بها، وعندما نستخدم دالة دون استخدام سطر التوجية الخاص بها نحصل على خطأ من المترجم عند بداية الترجمة. و هناك قواعد بسيطة لكتابة البرنامج بلغة C ولابد من مراعتها عند كتابة البرامج ومن هذه القواعد ما يمكن التسامح فيه فمثلا المسافات الخالية والسطور التي تفصل ما بين الكلمات والعبارات كلها اختيارية ويمكن الأستغناء عنها. ولكن هناك من القواعد ما يجب الإلتزام به : 1-تكتب التوجيهات على سطر مستقل. 2- تستخدم الدوال ( مثل printf ) في تكوين عبارات البرنامج ( staements) وتنتهي كل عبارة بفاصلة منقوطة. والفاصلة المنقوطة لاغنى عنها حتى لو كان البرنامج محتويا على عبارة واحدة، وأغلب الأخطاء التي نحصل عليها تكون نتيجة نسيان فاصلة منقوطة. 3- تتطلب بعض الكلمات الخاصة باللغة أن نعقبها بمسافة خالية على الأقل وإلا تعرضنا لرسالة خطأ من المترجم عند ترجمة البرنامج. 4- تكتب الكلمات المفتاحية للغة ( key words ) مثل أسماء الدوال (مثل printf ) بالحروف الصغيرة ( small letters). 2-الطباعة على الشاشة تستخدم الدالة printf لطابعة النصوص على الشاشة وهي كأي دالة أخرى تأتي متبوعة بقوسين نكتب بينهما النص المطلوب طباعته بين علامتي اقتباس. وكل ما نكتبة بين علامتي الاقتباس يظهر كما هو على الشاشة ولذلك يصطلح على تسميته بالحرفي ( string) . والبرنامج الموضح في الشكل التالي يحتوي على عبارتين تستخدم في كل منهما الدالة printf لطباعة حرفي معين على الشاشة   #include <stdio.h>main(){ printf(“Welcome ”); printf(“ C Programmer”);}وناتج البرنامج موضح بالشكل التالي    WelcomeC Programmerونلاحظ أن العبارتين طبعتا على الشاشة دون أي فاصل بينهما. و لكننا حتما نريد الفصل بين العبارات المختلفة فمثلا ماذا لو أردنا الإنتقال لسطر جديد لتطبع العبارة الثانية على سطر مستقل؟ إن الإنتقال لسطر جديد يستلزم إضافة علامة خاصة إلى نهاية الحرفي الأول، وتسمى هذه العلامة بعلامة السطر الجديد ( new line character ) وتكتب كالآتي ( \n) ولنجرب إستخدام هذه العلامة وذلك كما هو موضح في الشكل التالى #include <stdio.h>main(){ printf(“Welcome \n”); printf(“ C Programmer”);}وعند تنفيذ هذا البرنامج نحصل على النتيجة التالية WelcomeC Programmerومما يجب ملاحظته أن علامة السطر الجديد تكتب بداخل علامتي الاقتباس ولا تظهر على الشاشة كما هي !!! وذلك لأن المترجم يفهم العلامات الخاصة على نحو ما وتعتبر أمرا من الأوامر يقوم بتنفيذها بالصورة المطلوبة. ويمكن استخدام دالة الطباعة لتطبع على الشاشة محتويات بطاقة تحمل الاسم والعنوان كما هو موضح بالشكل التالي   Future Horizons Co.81 emarat othman NasrCityCairoو البرنامج المستخدم لطباعة هذة البطاقة موضح بالمثال التالي #include <stdio.h>main(){printf(“Future Horizons Co.\n”);printf(“81 emarat othman \n“);printf(“NasrCity\n”);printf(“Cairo\n”);} 3- التعامل مع الاعداد يمكن باستخدام عبارة الطباعة و الدالة printf أن نعرض الأرقام على الشاشة بل يمكننا أيضا أن نجري العمليات الحسابية المختلفة فتتولى الدالة printf تقييم التعبيرات الحسابية وطباعة النتيجة على الشاشة.ومن الملاحظ أن الأعداد لا تحتاج لعلامات اقتباس. وفي لغة C يجب أن نفرق بين نوعين من الأعداد: 1-الأعداد الصحيحة ( Integers) 2- الأعداد الحقيقية ( Real numbers) أما الأعداد الصحيحة فهي تلك الأعداد التي لا تحوي كسورا. بينما تحتوي الأعداد الحقيقية على علامة عشرية ( بصرف النظر عن وجود كسر من عدمه). فورمات الأعداد: يلزم إخبار الكمبيوتر دائما عن نوع العدد باستخدام صيغة خاصة (فورمات) تأتي بداخل علامتي الأقتباس، لأن الكمبيوتر يتعامل مع كل نوعية من الأعداد بطريقة مختلفة تماما. ولتوضيح استخدام الفورمات انظر الشكل #include <stdio.h>main(){ printf(“%d \n”,130); printf(“%f\n”,130.5);}وفي هذا البرنامج استخدمنا نوعين من الأعداد و لكل منهما لبفورمات الخاصة به فنجد أن رمز الفورمات المستخدم مع العدد الصحيح هو ( %d) والحرف ( d ) بهذا الرمز هو اختصار كلمة ( decimal ) بمعنى رقم عشري أي مكتوب بالنظام العشري. أما رمز الفورمات المستخدم لطباعة العدد الحقيقي فهو ( %f) والحرف ( f ) بهذا الرمز هو اختصار كلمة ( floating point number ) وهي الأعداد ذات العلامة العشرية. وعند تنفيذ البرنامج السابق نحصل على النتيجة الموضحة بالشكل 130130.5ويجب على المبرمج تحري الدقة التامة عند التعامل مع الفورمات ، فلا نستخدم فورمات الأعداد الحقيقية مع الأعداد الصحيحة أو العكس. لأن الخطأ في الاستخدام ينتج عنه نتائج غير صحيحة. التعبيرات الحسابية: كما ذكرنا سابقا فأن دالة الطباعة يمكنها أيضا أن تجري العمليات الحسابية المختلفة وتطبع النتيجة على الشاشة. وتستخدم المؤثرات الحسابية الموضحة ادناه لبناء التعبيرات الحسابية: مؤثر الجمع + مؤثر الطرح - مؤثر الضرب * مؤثر القسمة / والمثال التالي يوضح استخدام المؤثرات الحسابية مع الدالة (printf )   #include <stdio.h>main(){ printf(“%d\n”,128*2); printf(“%f\n”,128.0/2);}وعند تنفيذ البرنامج نحصل على الناتج الموضح بالشكل التالي 25664.000000 يتبع ......
  6. السلام عليكم بسم الله الحمن الرحيم the c programming languge ----------------------------------------------------------------------------------------------- ---------- تعلم لغة السى من ---------- ------------------------------------------------------------------------------------------ الدرس الاول : كيف تكتب البرامج فى لغة السى ...................... ______شروط هامة _______ لابد من كتابة اى برنامج : 1- من وجود الاومر 2- ولكى ينفذ المترجم الخاص بلغة السى هذه الاومر الذى تكتبها انت فى برنامجك لابد من توفر المكتبة الخاصة بالامر 3- لكى يتم التنفيذ لابد من كتابة كل شفرات البرنامج بعد التعليمة main() void كلام مش مفهوم نطبق عملى # include <stdio.h> هنا يتم كتابة المكتبة void main () هذه الداله لابد من تواجدها لانها المسواله عن تنفيظ شفرات برنامجك { هنا تكتب شفرات او اكواد برنامجك } مشاكل تعلم كيف تتجنبها : ___________________ 1- عندما تقوم بانشاء برنامج وتقوم بعدة عمليات تلاحظ انك لاتستطيع مسح الشاشة لتقوم بمسح كل الحروف والبيانات الموجودة على الشاشة نستخدم الامر CLRSCR() 2- عندما تقوم بتشغيل البرنامج الخاص بك تلاحظ انه يختفى بسرعة ولا يمكنك استخدامه كيف تعالج هذه المشكلة باستخدام الامر GETCH() _________________________________________________________________________________ الهيئه العامة لكتابة اى برنامج ستكون بهذا الشكل : #INCLUDE <STDIO.H> #INCLUDE <CONIO.H> VOID MAIN() { CLRSCR(); هنا اكواد البرنامج GETCH(); } __________________________________________________________________________________ تحدثنا عن كيفية كتابة البرامج فى السى واعتقد انها ستكون مفيدة جدا لمن اراد تعلم هذه اللغة وهو لم يعلم عنها شىء ............................................................................................................................................ تعالى نتكلم شويه عن كيفية استخدام المتغيرات واوامر الطباعة على الشاشة وعملية اخذ قيمة من مستخم برنامجك واجراء العمليات الحسابية عليها المتغيرات : هى مكان يقوم المترجم بحجزه عندما تقوم باستدعاءه انواع المتغيرات : 1- حرفية او نصيه CHAR 2- عدادية او رقمية INT 3- عشرية FLOAT سنقوم الان بعمل برنامج بسيط يعلمك كيف تتعامل مع المستخدم سنستخدم الامر PRINTF(" YOUR MASSEG"); والامر SCANF("%D", VARIBEL NAME); او GETS(VARIBALE NAME); لابد من وجود العلامة ; بعد نهايه كل امر #INCLUDE <STDIO.H> #INCLUDE<CONIO.H> #INCLUDE <STRING.H> VOID MAIN() { CLRSCR(); CHAR NAME; استدعاء متغير حرفى اسمه NAME INT PHONE; استدعاء متغير عددى اسمه PHONE PRINTF("HELLO "); طباعة كلمة على الشاشة PRINTF("ENTR YOUR NAME "); GETS(NAME); قراءة قيمة من المستخدم PRINTF("ENTER YOUR PHONE NUMBER"): (GETS(PHONE; PRINTF("YOUR NAME IS: %C AND YOUR PHONE NUMBER IS :%D"NAME,PHONE); عندما تستخدم %C و%D مع الامر PRINTF(""); لنقوم بطباعة المدخلات التى تم قراتها من المستخدم لكى يتم حفظها واسترجاعها ولكن هذه الامكانية ساقوم بشرحها لاحقا GETCH(); } ساقوم بطرح دروس اكثر ولكن بالتفصيل الممل وعلى كل الفرعيات داخل هذه الغة اذا اردتم ان اكمل هذه الدروس ساضع لكم ملفات ستكون قابلة للقراءة بكل بساطة واشكركم وانتظرو المزيد من الدروس غدا