• الإعلانات

    • فيصل الحربي

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

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

tantie L

اعضاء
  • عدد المشاركات

    156
  • تاريخ الانضمام

  • تاريخ اخر زياره

كل شيء نشر بواسطة tantie L

  1. السلام عليكم و رحمة الله و بركاته  أود استعمال  Bluez لمحاكاة تبادل المعلومات باستعمال ال bluetooth لكني لم اعرف كيف يمكنني استعماله او حتى ما يتوجب علي تثبيته حتى استعمله انا استخدم نظام ubuntu 15.10 و قد علمت ان ال Bluez مثبت على اخر اصدار  كما هو موضح هنا http://www7.0zz0.com/2016/02/10/21/851798821.png و بعد ان بحثت وجدت انه يجب تثبيت  bluez-utils فحاولت تثبيته لكن ظهر لي التالي فحاولت مع غيره و هو  bluez-hcidump و انا حقيقة لا اعرف اي شيء عنه .. نجح تثبيته على ما اعتقد فقد ظهر لي التالي  سؤالي الان هل صار بامكاني الان استعماله للمحاكاة؟  فان كان نعم .. فهلا تفضلتم علي عن كيفية ذلك؟ و ان كان لا فهل يمكنكم اخباري عن الكيفية الصحيحة لتثبيته و عن كيفية استعماله؟ فانا لا اعرف شيئا عنه
  2. عودا حميدا دائما و هنيئا لنا و لكم بهذا فقد افتقدنا منتدانا و خيره الوفير و فضله الغامر ادامه الله لنا و خير الجزاء من الله الكريم لمن تكفل بعودته  بوركتم اساتذتي و اخواني
  3. السلام عليكم و رحمة الله و بركاته  حقيقة لا اعلم ما ان كان هذا هو المكان المناسب لطرح سؤالي او لا لكن عندما وجدت هذا الموضوع http://arabteam2000-forum.com/index.php/topic/294822-%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D9%81%D9%8A-%D8%A8%D8%B1%D9%88%D9%84%D9%88%D8%AC-%D9%88%D8%AD%D9%84-%D9%84%D8%B9%D8%A8%D8%A9-%D8%B3%D9%88%D8%AF%D9%83%D9%88/#entry1403356 ظننت بانه الاقرب لاطرح سؤالي، تم تكليفنا ببحث يدور حول (programmation logique (logic programming و من بين العناصر فهناك المساوئ و المحاسن .. فهلا تفضلتم علي باطلاعي عليها و لكم جزيل الشكر 
  4. السلام عليكم و رحمة الله و بركاته اساتذتي اخوتي   عندما اردت تحميل flex و bison من ال software center حدثت معي مشكلة لم اعرف ما سببها فقمت بتجريب تثبيت برنامج اخر لكن نفس الامر حدث و هو ظهور هذه النافذة فما السبب وراء هذا و كيف احل المشكلة بارك فيكم الله و وفقكم الى ما يرضاه  
  5. مشكلة في ال software center

    طيب قمت بكتابة تلك التعليمات في التارمينال و ظهرت لي الكثير من الكتابات حقيقة لم افهم منها شيئا و فيها روابط انترنت ايضا و في نهاية تلك الكتابة كلها ظهر لي هذا السطر E: Some index files failed to download. They have been ignored, or old ones used instead.فما الذي سافعله بعد هذا؟ فعندما قمت باعادة محاولة التثبيت لم اجد اصلا الزر الخاص بالتثبيت install
  6. مشكلة في ال software center

    اشكرك على اجابتك استاذ لكن لو سمحت هل بامكانك ان توضح لي ما هذا؟ و هل له علاقة بالحل ام ماذا؟! deb-src http://us.archive.ubuntu.com/ubuntu/ precise main restricted #Added by software-properties# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to# newer versions of the distribution.deb http://us.archive.ubuntu.com/ubuntu/ precise main restricted multiversedeb-src http://us.archive.ubuntu.com/ubuntu/ precise multiverse universe #Added by software-properties## Major bug fix updates produced after the final release of the## distribution.deb http://us.archive.ubuntu.com/ubuntu/ precise-updates main restricted multiversedeb-src http://us.archive.ubuntu.com/ubuntu/ precise-updates restricted main multiverse universe #Added by software-properties## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu## team. Also, please note that software in universe WILL NOT receive any## review or updates from the Ubuntu security team.deb http://us.archive.ubuntu.com/ubuntu/ precise universedeb http://us.archive.ubuntu.com/ubuntu/ precise-updates universe## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu ## team, and may not be under a free licence. Please satisfy yourself as to ## your rights to use the software. Also, please note that software in ## multiverse WILL NOT receive any review or updates from the Ubuntu## security team.## N.B. software from this repository may not have been tested as## extensively as that contained in the main release, although it includes## newer versions of some applications which may provide useful features.## Also, please note that software in backports WILL NOT receive any review## or updates from the Ubuntu security team.deb http://us.archive.ubuntu.com/ubuntu/ precise-backports main restricted universe multiversedeb-src http://us.archive.ubuntu.com/ubuntu/ precise-backports main restricted universe multiverse #Added by software-propertiesdeb http://us.archive.ubuntu.com/ubuntu/ precise-security main restricted multiversedeb-src http://us.archive.ubuntu.com/ubuntu/ precise-security restricted main multiverse universe #Added by software-propertiesdeb http://us.archive.ubuntu.com/ubuntu/ precise-security universe## Uncomment the following two lines to add software from Canonical's## 'partner' repository.## This software is not part of Ubuntu, but is offered by Canonical and the## respective vendors as a service to Ubuntu users.deb http://archive.canonical.com/ubuntu precise partnerdeb-src http://archive.canonical.com/ubuntu precise partner## This software is not part of Ubuntu, but is offered by third-party## developers who want to ship their latest software.
  7. السلام عليكم و رحمة الله و بركاته   تم تكليفنا بكتابة كود برنامج ينسق العمل بين 3 من ال process حيث يكون عندنا "إجراء أب" و "إجراء ابن 1" و "أجراء ابن 2" و فقط ملاحظة للعلم : بما ان هذا الكود يستخدم الدالتين () fork و () pipe فهو يشتغل فقط على اللونيكس و هذا على حسب علمي كون تلكما الدالتين خاصتين بنظام التشغيل اللونيكس    نقوم بانشاء الاجراء الابن 1 باستخدام fork و نقوم بعدها بايقاف عمل الاجراء الاب باستخدام wait كي لا ينفذ الاب نفس تعليمات الابن و الاجراء الابن 1 سيقوم بطلب رسالة من المستخدم و يقوم بحفظها في طرف ال pipe الخاص بالكتابة هذه هي التعليمات الخاصة بانشاء الاجراء الابن 1 و جعل الاجراء الاب في حالة انتظار pid = fork(); wait(5);و هذه هي التعليمات الخاصة بالاجراء الابن 1 ليقوم بطلب الرسالة من المستخدم و يقوم بحفظها في الجزء الخاص بالكتابة في ال pipe الاول و الشرط الذي يجعلني اعمل على الاجراء الابن 1 هي القيمة التي ترجعها fork فان كانت 0 معناه اننا نعمل على الاجراء الابن و ان كانت اكبر من الصفر تمام فهذا يعني اننا نعمل على الاجراء الاب if(pid == 0){ printf("le fils_1 :\nentrer le message : "); scanf("%s", sms); close(DT_1[0]); write(DT_1[1], &sms,len); close(DT_1[1]); exit (0); }بعدها يتوقف الاجراء الابن 1 و يعود الاجراء الاب للعمل فيقوم بانشاء اجراء ابن 2 باستعمال fork مرة اخرى و نوقف الاب عن العمل ثانية ليقوم الاجراء الابن 2 بقراءة المعلومة التي قام الاجراء الابن 1 بتسجيلها في ال pipe الاول ثم يقوم بتشفيرها (يقلب الرسالة) و بعدها يقوم بكتابتها في جهة الكتابة الخاصة بال pipe الثاني و هي التعليمات الخاصة بها if(pid > 0){ pid = fork(); wait(); if(pid == 0){ printf("\nle fils_2 :"); read(DT_1[0], &sms, len); codage(); close(DT_2[0]); write(DT_2[1], &sms,len); close(DT_2[1]); exit (0); }بعد ان يقوم الاجراء الابن 2 بانهاء تعليماته يغادر و يبقى الاجراء الاب لوحده يقوم بقراءة ما تركه له الاجراء الابن 2 فيقوم بفك تشفيره و طباعته على الشاشة ثم يغادر هو ايضا و هذه هي التعليمات الخاصة به if(pid > 0){ printf("\nle pere :"); read(DT_2[0], &sms, len); decodage(); //puts(sms); exit (0); }لكن عند التنفيذ فقط الاجراء الابن 1 هو من يؤدي مهمته فيقوم باخذ الرسالة من المستخدم و اما الاجراء الابن 2 و الاجراء الاب فلا يعملان و السبب هو ان محتوى الرسالة لا يصلهم فحاولت اخراج هذه التعليمات خارج الجزء الخاص بالاجراء الابن 1  printf("le fils_1 :\nentrer le message : "); scanf("%s", sms);فوصلت الرسالة للجراء الابن 2 و للاب فقام الاجراء الابن 2 بمهمته بالتشفير لكن الاجراء الاب لم يقم بمهمته بسبب وجود اجراء اخر دخيل يقوم هو بعمل الاب فلم اعرف كيف احل هذا الخطأ فهلا افدتموني و اعنتموني بارك فيك الله و ها هو الكود باكمله حتى يكون التتبع افضل #include <stdio.h>#include <unistd.h>#include <string.h>#include <sys/types.h>char sms[20];int i,len;char im;void codage(){ printf("\ncodage: "); for (i = 0; i < (strlen(sms)) / 2; i++){ im = sms[(strlen(sms)) - i - 1]; sms[(strlen(sms)) - i - 1] = sms[i]; sms[i] = im; } puts(sms);}void decodage(){ printf("\ndecodage: "); for (i = 0; i < (strlen(sms)) / 2; i++){ im = sms[(strlen(sms)) - i - 1]; sms[(strlen(sms)) - i - 1] = sms[i]; sms[i] = im; } puts(sms);}main(){ int DT_1[2], DT_2[2]; int pid; if(pipe(DT_1) == -1){ printf("erreur, le tube n'est cree pas\n"); return (1); } if(pipe(DT_2) == -1){ printf("erreur, le tube n'est cree pas\n"); return (1); } pid = fork(); wait(5); if(pid == 0){ printf("le fils_1 :\nentrer le message : "); scanf("%s", sms); close(DT_1[0]); write(DT_1[1], &sms,len); close(DT_1[1]); exit (0); } if(pid > 0){ pid = fork(); wait(); if(pid == 0){ printf("\nle fils_2 :"); read(DT_1[0], &sms, len); codage(); close(DT_2[0]); write(DT_2[1], &sms,len); close(DT_2[1]); exit (0); } if(pid > 0){ printf("\nle pere :"); read(DT_2[0], &sms, len); decodage(); exit (0); } }}و شكرا لكل من اجابني مسبقا و وفقكم الله الى ما يرضاه
  8. اعتذر عن النصوص الفرنسية فانا لم انتبه لتغييرها اعذر تسرعي استاذي الكريم     بارك فيك الله
  9. السلام عليكم و رحمة الله و بركاته  حقيقة انا جد مبتدئة مع الاندرويد و برمجة تطبيقات الاندرويد و في اثناء برمجتي لاولى البرامج التمهيدية كتعرف على مكونات البيئة التطويرية و بعض المكونات لتطبيقات الاندرويد واجهتني هذه المشكلة و لم اعرف سببها عندما اقوم باستخدام plain text من text fields تواجهني مشكلة و هي ان ال graphical layout تعلق فلا استطيق العمل عليها ثانية باي شكل كان الا ان قمت بحذف plain text لكن في الملف main.xml استطيع العمل بشكل عادي و النتائج تظهر عادي عندما اقوم بتطبيق البرنامج كتطبيق اندرويد على المحاكي (AVD) و هذا الامر لا يتعلق فقط بال plain text و انما مع جميع ما يوجد في ملف text fields و هذا ما يبدو عليه الامر قبل ان يعلق ال graphical layout :     و هذا ما يبدو عليه بعد ان يعلق :     و عندما اشغل البرنامج على المحاكي حتى و ان علق ال graphical layout يشتغل بشكل عادي كما في الصورة     فلم افهم ما السبب و حتى ذلك التحذير الذي ظهر لم استوعبه جيدا  فهل لكم ان تعينوني بمعرفة حل هذه المشكلة و لكم من الله خير الثواب  وفقكم الله الى كل ما يرضاه
  10. السلام عليكم و رحمة الله و بركاته كيف حالكم؟ ان شاء الله بخير؟ انا الحمد لله  ^_^ في الحقيقة موضوعي هذا سيكون مجرد مقدمة صغيرة عن مسير الذاكرة و كيف يقوم بعمله و ما الاستراتيجيات التي يتبعها... اولا كمقدمة صغيرة سأتحدث ب اختصار شديد عن الذاكرة تعريفها و انواعها الذاكرة يتم فيها حفظ المعطيات بشتى انواعها و يتم استخدامها عند الحاجة انواعها هي ذاكرة مركزية و ذاكرة ثانوية أي بشكل معادلة رياضية جميلة  :rolleyes: ذاكرة = ذاكرة مركزية + ذاكرة ثانوية ( و كتحليل لهذه المعادلة ) = DD + ram + rom + cache الذاكرة المركزية فيها : الذاكرة الحية و الميتة  :mellow:  و cache ( لا اعرف مصطلحها العلمي  :blush:  ) الذاكرة الثانوية فيها : القرص الصلب DD كما يمكننا ان نظيف الاقراص المضغوطة و الاقراص المرنة و الفلاش ميموري لكن نكتفي بذكر التي تاتي مرفقة مع الحاسوب  -_- الهدف من مسير الذاكرة هو  ليتم فيها حجز الامكنة من اجل البرامج التي تريد التنفيذ اي بمصطلح بسيط ( التأجير  :D  ) من أجل حماية معطيات البرنامج الموجود بمكانه في الذاكرة مشاركة المعطيات و المعلومات بين البرامج التي في قيد التنفيذ مهامه الرائعة  :wub: مراقبة حالة الذاكرة المركزية ( معرفة المساحة الفارغة و المساحة المحجوزة و حجم المساحات المأجرة  :rolleyes:  ) ايجاد الاستراتيجيات الفعالة لحجز الاماكن في الذاكرة ( و كأنني اتخيله يقول كيف اختار افضل طريقة للتأجير  :lol:  ) ايجاد التقنيات الفعالة لحجز الاماكن في الذاكرة ( و هنا يقول كيف افوم بالحجز ما أفضل طريقة  :lol: ) و في الاخير ايجاد الطرق الفعالة لتحرير الاماكن المحجوزة في الذاكرة حسنا حسنا الى بعض التفصيل ننطلق الان  ;) لنتعرف قليلا على استراتيجيات المسير في حجز الاماكن في الذاكرة المركزية  توجد استراتيجياتان : الاولى : استراتيجية المساحة الواحدة او ما يسمى علميا mono programmation فيها البرنامج لا يتم تقسيمه الى اجزاء او اقسام و انما هنا المسير يأخذ البرنامج باكمله و بحجمه الكامل و يقوم بتحميله الى الذاكرة المركزية و يتم التنفيذ، هيا معي نأخذ مثالا على ذلك صغير  :P فرضا ان ذاكرتنا المركزية سعتها 150 ko و برنامجنا حجمه 100 ko اذن و حسب هذه الاستراتيجية يكون شكل الذاكرة هكذا :     أي انه سيتم تنفيذ برنامج واحد فقط  -_- طبعا طبعا هناك شرط و هو ان تكون سعة البرنامج اقل او مساوية لمساحة الذاكرة و الا فان نظام التشغيل سيعطيك تنبيها و هو ان البرنامج الذي تريد تنفيه اكبر من الذاكرة التي تستعملها و مسيرنا الرائع ( صرت متيمة بمسير الذاكرة و نظام التشغيل  :D  ) ليعرف حالة الذاكرة يكفيه ان يستخدم bit واحد فقط 1 ان كانت محجوزة و 0 ان كانت حرة اتى الان موعد معرفة الايجابيات و السلبيات الخاصة بهذه الاستراتيجية البسيطة : الايجابيات هي ان هذه الاستراتيجية سهلة جدا اذ كل ما يفعله المسير هو مقارنة احجام البرامج التي تنتظر في طابور الانتظار مع مساحة الذاكرة ثم يحجز ان كانت مناسبة  ثم يغير حالة الذاكرة من 0 الى 1 اي ان الذاكرة تعمل الان و ينتظر الى ان ينتهي التنفيذ و ينتقل الى البرنامج التالي ^_^ ، ان لم تكن كافية يرسل تنبيه فتظهر لك نافذة مفادها ان برنامجك اكبر من ذاكرتك ( لذلك عليك ان تجد حلا بنفسك  :rolleyes: ) و ينتقل للبرنامج التالي و من الايجابيات ايضا انها غير مكلفة في الوقت لان برنامجك كاملا موجود في الذاكرة اي ان التنفيذ سيكون سريعا  اما السلبيات  :( فهي ان هذه الاستراتيجية استغلالها سيء جدا سواء للذاكرة ام للمعالج المركزي ام الثانوي  بالنسبة للذاكرة تخيلوا معي ذاكرتنا لها حجم كبير ( و لنبقي ب 150 ko ) و برنامجنا حجمه 20  ko    تعالوا معي لنرى كيف ستكون الذاكرة هذا حقا امر سيء جدا لا يمكننا السكوت عنه  :angry: لقد ضيعنا قدرا كبيرا جدا من الذاكرة لانه لا يمكننا ان نقوم بادراج برنامج ثان تبعا لهذه الاستراتيجية و ايضا ليس هذا فقط فالبرنامج كما تعلمون يستخدم المعالج المركزي و المعالج الثانوي كمصادر ليقوم بعمله اذ ان المعالج المركزي مثلا من مهامه الحساب و المعالج الثانوي او علميا يسمى canal اختصاصه تنظيم وحدات الادخال و الاخراج حتى يحصل البرنامج على معطياته ليعمل لنتخيل البرنامج يستخم الان المعالج المركزي فماذا يفعل الثانوي الان؟ أكيد مرتاح و لا يقوم باي عمل  <_< حسنا انتهى البرنامج من المعالج المركزي، بدأ باسعمال الثانوي فماذا سيفعل المركزي؟ واضح سيبقى بدون عمل ايضا لا لا لا هذا امر سيء جدا بالنسبة لهذه الاستراتيجة اذن سيقول المسير ساغيرها فاستغلالها للموارد او المصادر غير جيد فلنجرب استراتيجة اخرى ملاحظة صغيرة : زمن تنفيذ البرنامج = زمن انتهاء التنفيذ - زمن ولادة التنفيذ اتينا للاستراتيجة الثانية : التجزئة المتعددة او ما تسمى علميا multi programmation : في هذه الاستراتيجة ما يحدث تماما معاكس لسابقتها فالذاكرة تقسم الى اجزاء ( و هذا بتقنيات محددة سنتطرق اليها باختصار فيما بعد  ;) ) اذن فالبرنامج هو ايضا يقسم الى اجزاء ( و سنعرف تقنيات ذلك باختصار ) و منه نستنتج ان المعالج المركزي و الثانوي لن يتوقفا عن العمل ابدا في حالة عامة ( هذه الاستراتيجية مجهدة بشكل كبير للموارد و الطاقات  :D ) و بالتالي شكل الذاكرة سيكون هكذا  رااائع تم استغلال الذاكرة باكملها :lol:  و المعالج الرئيسي و الثانوي لم يرتاحا فهما ينتقلان من جزء الى اخر  :rolleyes: و فقط للتنبيه P1 الى P6 ليست برامج باكملها و انما اجزاء من برامج فقط  تم تقسيمها بتقنيات محددة  حسنا حسنا حان وقت قليل من التفصيل في هذه الاستراتيجية  ;) لدى المسير خياران في هذه الاستراتيجية و هما  التجزئة المتعددة الثابتة : و فيها يقوم المسير بتقسيم الذاكرة الى اجزاء تتساوى سعاتها او تختلف و في معظم الاوقات تختلف سعة كل جزء عن الجزء الاخر ثم يقوم بادراج البرامج من طابور الانتظار الى تلك الاجزاء كل برنامج في جزء يساويه او اكبر منه  و للادراج عنده طريقتين  الطريقة الاولى و هي الثابتة حيث لكل جزء من الذاكرة طابور انتظار خاص به اي مثلا في الذاكرة عندنا 5 اجزاء مخصصة للبرامج و الاستعمال فسيكون عندنا 5 طوابير انتظار و لادراج برنامج بهذه الطريقة فان المسير يقوم بالمقارنة مع عنصر واحد فقط من الذاكرة اي مقارنة الاحجام ( بالمناسبة ليتم ادراج برنامج في طابور معين فان المسير يستند الى ال @ الابتدائية حتى يقوم بذلك و بصراحة فانا اجهل التفصيلات :blush:  و لمن يعلم فليفدنا كلنا ) و الطريقة الثانية تسمى المتحركة (على ما اظن ) هي طابور واحد فقط لكل الذاكرة اي ان كل البرامج في طابور واحد و لتحميل برنامج الى الذاكرة فان المسير يقوم بمقارنة حجم البرنامج مع جميع احجام الاجزاء الموجودة في الذاكرة و يدرجها في المكان المناسب و لكي يقوم مسيرنا بمراقبة حالة الذاكرة فانه يستخدم ما يسمى ب جدول PDT أو جدول حالة الاجزاء فيه 3 خانات  خانة : تبين الوضعية محجوز = 1 او لا  = 0 خانة : فيها حجم البرنامج خانة : فيها ال @ الابتدائية لموقع البرنامج في الذاكرة من بين ايجابيات هذا الخيار  تنفيذ عدة برامج في وقت واحد و السهولة في الادراج  السلبيات وجود الفراغات الداخلية هذه صورة توضح قليلا كما نرى حتى في هذه الاستراتيجية الذاكرة لم تسلم المسكينة فهناك فراغات داخلية لا يمكن استعمالها...امرنا لله فلنحاول بالخيار الثاني  :D الخيار الثاني...يتبع في موضوع اخر ان شاء الله  :lol: ارجو من كل من قرأه ان يصحح لي اخطائي و يفيدني بما يعرف حتى ازيل ما أجهل
  11. بالفعل ذهب المشكل فور تغييري من 20 الى 19 فما السبب لو تفضلت كرما استاذ؟
  12. فيديوهات في برمجة الأندرويد عربي و إنجليزي

    بارك فيك الله استاذي الكريم  ^_^
  13. و عليكم السلام و رحمة الله و بركاته  لا عليك ابدا  ^_^ فانا ايضا مثلك مبتدئة جدا في انظمة التشغيل رغم اني احبها  :lol: مسير الذاكرة هو برنامج يكون مدرجا مع نظام التشغيل او بالاحرى و على حسب ما افهم هو ان مسير الذاكرة برنامج من مجموعة برامج نظام التشغيل اعتقد انه يمكن للمبرمج ان يكتب برنامج لتسيير الذاكرة ففي النهاية مسير الذاكرة هو برنامج فيه استراتيجيات و تقنيات للتسيير و الكود المرفق هو محاكاة لاستراتيجية يستخدمها المسير في حالة التجزئة المتعددة و اسمها FIFO اختصارا ل first in first out  و قد كتبتها بلغة C و ان شئت فانني ايضا املك برنامجا لمحاكاة استراتيجية LRU اختصارا ل least recently used يمكنني ان اطرحها ايضا لكنها ب C هي الاخرى  ... لذلك فانني ارى بانه يمكن للمبرمج ان يبرمج مسيرا للذاكرة لكن ليس بالسهولة المتوقعة و تحتاج للتعمق اكثر في هذا المجال  بالنسبة لسؤالك الاخير فانا لا اعرف الاجابة فعذرا منك لهذا ... و من يعرف فليتفضل و يفدنا مشكورا  #include<stdio.h>#include<stdlib.h>typedef struct liste//القائمة الخاصة بسلسلة المرجع{ int a; struct liste *ptrn;}chaine_ref;typedef struct liste1//القائمة الخاصة بعدد الامكنة المحدد للبرنامج{ int a,age,Dp;//المتغير 1 خاص بمحتوى الخانة و 2 خاص بمدة مكوث جزء البرنامج في تلك الخانة و 3 عدد مرات تحميل الصفحات او اجزاء البرنامج struct liste *ptrn;}case_memoire;chaine_ref *criation_chaine(chaine_ref *tete,int tpage)//ايجاد سلسلة المراجع{ chaine_ref *p,*n_m; int x,i=0; tete=NULL; p=tete; while(i!=-1)//شرط التوقف { p=(chaine_ref*)malloc(sizeof(chaine_ref)); do { printf("entrer le numero de page svp (inferieur a taille de page): "); scanf("%d",&x); }while(x>=tpage); p->a=x; p->ptrn=NULL; if(tete!=NULL) n_m->ptrn=p; else tete=p; n_m=p; printf("(si vous voulez arriter ecrivez -1) : "); scanf("%d",&i); } return tete;}void aff_chain_ref(chaine_ref *tete)//الدالة الخاصة بطباعة السلسة المرجعية{ chaine_ref *p; p=tete; printf("la chaine de reference est :\n"); while(p!=NULL) { printf("%d ",p->a); p=p->ptrn; }}case_memoire *criation_case(case_memoire *tete,int n)//ايجاد القائمة الخاصة بمحتوايات حصة البرنامج من الذاكرة{ case_memoire *p,*n_m; int i=0; tete=NULL; p=tete; while(i<n) { p=(case_memoire*)malloc(sizeof(case_memoire)); p->a=-1;//قيم ابتدائية للمساعدة p->age=0;//نفس الشيء p->Dp=n;//اول قيمة لعدد مرات تحميل صفحات البرنامجو هو عدد الخانات المخصصة للبرنامج في الذاكرة p->ptrn=NULL; if(tete!=NULL) n_m->ptrn=p; else tete=p; n_m=p; i++; } return tete;}case_memoire *nbr_defaut_page(case_memoire *tete)//الدالة التي تحسب عدد مرات تحميل صفحات البرنامج{ case_memoire *p; p=tete; while(p!=NULL) { p->Dp++; p=p->ptrn; } return tete;}void aff_case_memo(case_memoire *tete,int tpage)//الدالة التي تطبع محتويات حصة البرنامج من الذاكرة{ case_memoire *p; p=tete; printf("\n:::::::::::::::::::::::::::::\n"); while(p!=NULL && p->a>=-1 && p->a<tpage && p->age>-1 && p->age<tpage)//شرط طباعة المحتويات لانه في بعض الاحيان عندما تكون هناك خانات متبقية من حصة البرنامج في الذاكرة في المرحلة الاخيرة فانه يظهر محتوى عشوائيو انا لا اريده { printf("%d\n",p->a); p=p->ptrn; }}case_memoire *mis_a_jour(case_memoire *tete)// الدالة التي تقوم بتحديث مدة مكوث مراجع الصفحات في خانات الذاكرة{ case_memoire *p; p=tete; while(p!=NULL) { p->age++; p=p->ptrn; } return tete;}int il_est_repeter(case_memoire *tete,int t)// الدالة الجديدة{ case_memoire *p; int existe=1; p=tete; while(p!=NULL && existe==1) { if(p->a==t) existe=0; else p=p->ptrn; } if(existe==1) return 1;//القيمة ليست موجودة else return 0; // القيمة موجودة}case_memoire *ptr_max(case_memoire *tete,int t,int tpage)//الدالة التي تجد اطول مكوث و تقوم بادراج المرجع الجديد مكانه{ case_memoire *p,*max; int existe; p=tete; max=tete;//متغير لايجاد المكوث الاطول و ياخذ قيمة راس القائمة while(p!=NULL) { if(p->age>=max->age) { max=p; p=p->ptrn; } else p=p->ptrn; } existe=il_est_repeter(tete,t); p=tete; while(p!=NULL && p!=max && existe==1)// اعود و ابحث عن القيمة المساوية لاكبر مكوث في الذاكرة { p=p->ptrn; } if(existe==0) { return tete; } if(p==max && existe==1)//هنا الشرط الثاني لتوقف الحلقة و هو ايجاد قيمة مساوية لاكبر مكوث { //if()//اقوم بشرط و هو اختلاف قيمته عن قيمة اول قيمة للسلة المرجعية { p->age=0;//اعيد عمره صفرا p->a=t;//و اسند اول قيمة في الجدول له tete=nbr_defaut_page(tete);//احسب عدد مرات تحميل الصفحات aff_case_memo(tete,tpage);//اطبع محتوى الذاكرة } tete=mis_a_jour(tete);//ثم اقوم بتحديث فترة مكوث الصفحات في الذاكرة return tete; }}chaine_ref *chaine_ref_organizer(chaine_ref *tete,chaine_ref *tete2)//هذه الدالة تقوم بتنظيم السلسلة المرجعية و تحذف القيم المتكررة بشكل متتال مثل 11 او 222 و هكذا{ chaine_ref *P,*Q,*n_m; int i=0; P=tete2; tete=NULL; Q=tete; while(P!=NULL) { if(P==tete2) { Q=(chaine_ref*)malloc(sizeof(chaine_ref)); Q->a=P->a; Q->ptrn=NULL; tete=Q; P=P->ptrn; } else { if(P->a!=Q->a) { Q=(chaine_ref*)malloc(sizeof(chaine_ref)); Q->a=P->a; Q->ptrn=NULL; n_m->ptrn=Q; P=P->ptrn; } else P=P->ptrn; } n_m=Q; } return tete;}case_memoire *FIFO(chaine_ref *tete,case_memoire *tete2,int n_c,int *t,int l,int tpage)//هذه هي الدالة الخاصة بهذه الاستراتيجية{ chaine_ref *p; case_memoire *q,*old; int i=n_c,j=l-n_c; p=tete; q=tete2; //هنا اقوم بملئ الذاكرة بالقيم المرجعية كاول خطوة ثم اتابع تحميل البقية while(q!=NULL && p!=NULL && i>0) { q->a=p->a; q->age=i; p=p->ptrn; q=q->ptrn; i=i-1; } aff_case_memo(tete2,tpage); //هنا اقوم بحذف القيم التي تم ادراجها في الذاكرة عن طريق ازاحة قيم الجدول بعدد خانات الذاكرة for(i=0;i<l;i++) t[i]=t[i+n_c]; //هنا تأتي المراحل الاخرى و هي تحميل بقية السلسلة المرجعية في الذاكرة while(j>0)// متغير الحلقة اخذ قيمة ابتدائية هي الفرق بين طول السلسلة المرجعية و عدد خانات الذاكرة لانه يبدأ عمله بع ادراج الدفع الاولى { tete2=ptr_max(tete2,t[1],tpage);// انادي الدالة التي تبحث عن اكبر مكوث و تدرج القيمة التالية حيث توابعها هي خانات الذاكرة و جدول السلسلة المرجعية الجديد for(i=0;i<l-j+2;i++)//احذف القيمة التي تم ادراجها t[i]=t[i+1]; j--; } return tete2;}int chaine_ref_lenth(chaine_ref *tete)//الدالة التي تحسب لي طول السلسة المرجعية بعد تنظيمها{ chaine_ref *p; int x; p=tete; while(p!=NULL) { x++; p=p->ptrn; } return x;}//البرنامج الرئيسيmain(){ int n_page,Tpage,nbr_case,Tpgm,i=0,lenth_chaine,Tmc,*t;/*النتغيرات على الترتيب عدد صفحات البرنامج حجم الصفحة الواحدة عدد خانات الذاكرة الخاصة بالبرنامج حجم البرنامج متغير لتحريك الحلقة طول السلسلة المرجعية حجم الذاكرة جدول يحمل السلسلة المرجعية المنظمة و تتم عليه عمليات الحذف*/ chaine_ref *tete_chaine,*chaine_referense,*tete_chaine_or,*p;/*قائمة للمراجع قبل و بعد تنظيمها*/ case_memoire *tete_case_memory,*case_memory,*q;/*قائمة الذاكرة*/ do { printf("entrer la taille de pgm svp : "); scanf("%d",&Tpgm); }while(Tpgm<=0); do { printf("entrer la taille de votre MC svp : "); scanf("%d",&Tmc); }while(Tmc<=0); do { printf("entrer la taille de votre page svp : "); scanf("%d",&Tpage); }while(Tpage<=0); n_page=Tpgm/Tpage;//حساب عدد صفحات البرنامج nbr_case=Tmc/Tpage;//حساب عدد الخانات المخصصة للبرنامج في الذاكرة printf("\n/ remarque / svp entrez les num de pages, non chaine des adresse...\n\n"); chaine_referense=criation_chaine(tete_chaine,Tpage); case_memory=criation_case(tete_case_memory,nbr_case); chaine_referense=chaine_ref_organizer(tete_chaine_or,chaine_referense); lenth_chaine=chaine_ref_lenth(chaine_referense); aff_chain_ref(chaine_referense); aff_case_memo(case_memory,Tpage); // ايجاد الجدول الخاص بالسلسلة المحرفية تبعا للقائمة المنظمة t=(int*)malloc(lenth_chaine*sizeof(int)); p=chaine_referense; while(p!=NULL && i<lenth_chaine) { t[i]=p->a; p=p->ptrn; i++; } case_memory=FIFO(chaine_referense,case_memory,nbr_case,t,lenth_chaine,Tpage); q=case_memory; printf("\nle nbr de defaut de page est : %d\n===================================\n",q->Dp);و الله ولي التوفيق
  14. سلام الله عليكم و رحمته و بركاته...   هذا موضوع جديد تابع لاقتراحي ،كانت أول شيفرة طرحتها في هذا المنتدى الرائع هي شيفرة قيصر و كما لم أتوقع وجدت تفاعلا معها كبير و الشيفرة الثانية التي أردت أن أطرحها هي شيفرة دافينشي   هذه الشيفرة ابتكرها الفنان اللغز ليوناردو دافينشي و قد وجدوا جميع رسائله بعد موته مكتوبة بهذه الشيفرة و قد استغرقوا زمنا طويلا حتى تمكنوا من كشف هذه الشيفرة و طريقة ذلك هي عندما رفعوا رسائل ليوناردوا دافينشي و انعكست صورتها على المرآة توضحت الكتابة فعرفوا أن سر هذه الشيفرة يكمن في عكسها و أفضل طريقة لذلك هي برؤية تلك الرسالة على المرآة... هذا باختصار شديد توضيح بسيط عن شيفرة دافينشي   استعملت هذه الشيفرة في عدة مجاﻻت و من بينها المجال الروائي البوليسي و أشهر هذه الروايات هي رواية Davinci Code  للكاتب دان براون... و لكن كما تعلمون أن تحمل رسالة و تقابلها للمرآة و تحاول كشف تلك الرسالة كلمة كلمة أمر متعب جدا... لذلك وجدت البرمجة لمن يهوى مثل هذه الشيفرات و الألغاز و سأقوم في هذا الموضوع بطرح الكود الخاص بهذه الشيفرة و لكن قبل ذلك سأوضح كيفية عمل هذه الشيفرة لمن ﻻ يعرفها...   1- الخطوة الأولى هي أن تضع الرسالة التي تريد أن تشفرها أمامك مثلا لتكن عبارتنا كالآتي : "عالم البرمجة رائع"  2-الخطوة الثانية هي قم بقلبها : "عئار تجمربلا ملاع" هذا كل ما في الأمر بسيطة صحيح...و لكن للأسف هذه الشيفرة ﻻ تنفع في وقتنا الحالي بل هي فقط يستخدمها الأصدقاء فيما بينهم للتمتع لذلك فهي تحتاج إلى أفكار مبدعة منا حتى تكون أقوى و أروع  مما هي عليه أصارحكم القول أنني لم أجد فكرة خاصة بي الآن لذلك فأنا أنتظر بشوق اقتراحاتكم و أفكاركم سواء في تطوير الكود الخاص بها أو فكرة لتطوير هذه الشيفرة  و اليكم الكود الخاص بهذه الشيفرة #include<stdio.h> #include<string.h> void main() {     char s[100];     int i,l;     printf("enter the word\n");     gets(s);     l=strlen(s);     printf("after rotate\n");     for(i=l-1;i>=0;i--)         {             printf("%c",s[i]);         }       }
  15. السلام عليكم و رحمة الله و بركاته   اريد تعلم الجافا من الصفر و في بحثي المبدئي وجدت هذا الموقع هل يمكنني الان ابدا منه كاول خطوة لتعلمها ام لا؟ http://barmaje.com/topics/6   و الله ولي ثوابكم
  16. شكرا لتفهمك الوضع بالنسبة للدالة memcpy فليس من المفترض ان يتم تدريسنا كل شيء في الجامعات او الاقسام لنطبقه بل هناك يتم اعطاؤنا الاساسيات و البقية نبحث عنها و نتعلمها فكما تعلم البرمجة بحر واسع لا حد له كل يوم تكتشف شيئا جديدا، عمل تلك الدالة هو كما قلت لك نسخ سلسلة محرفية الى اخرى، و string.h هي مكتبة فيها الدوال الخاصة بالعمل على السلاسل المحرفية و ان انت قمت بحذفها فسيقول لك الكومبايلر بان memcpy مجهولة المصدر و فيما يخص ctype.h فهي لا تفيد في برنامجك فقم بحذفها فقد حدث خطا فقط اثناء نسخ الكود لاجربه....تلك الدالة Lecture لا تستعملها مرة اخرى في مثل هذه الحالات و الا فانك سستعرض لمثل هذا المشكل في كل مرة...صحيح ان هناك حل لتغيير قيم اكثر من متغير في دالة لكنها صعبة نوعا ما بارك فينا و اياك
  17. و عليكم السلام و رحمة الله و بركاته من الطبيعي ان لا تحدث قراءة للمدخلات بشكل صحيح لانك قمت بكتابة هذه الدالة E *Lecture(E*tete,char *N,char *Nom,char *Prenom){ printf("\nDonner le numero d'inscription:\t"); scanf("%s",&N); printf("\nDonner le nom de l'eleve:\t"); scanf("%s",&Nom); printf("\nDonner le prenom de l'eleve:\t"); scanf("%s",&Prenom); return tete;}انا برايي لا فائدة ترجى منها خصوصا و ما ترجعه هو tete و انت ترغب بارجاع قيم رقم التسجيل و الاسمو اللقب و لا توجد دالة ترجع 3 قيم في نفس الوقت ... و انا لا ارى في اي مكان من هذه الدالة اي اسناد قيم للمتغير tete لذلك قم بحذف هذه الدالة من الاساس و قم بالقراءة مباشرة في وسط الدالة Creer  و فيما يخص سؤالك امسا اذن فقد كان متعلقا بهذا البرنامج اذن ففي هذه الحالة لا باس بتعريف السلاسل الحرفية في هيكلتك الجديدة بشكل ثابت لانك لست مظطرا لارسال الجداول كتوابع لاي دالة و بعد تعديل الكود قليلا على حسب ما قلته لك الان يصير هكذا #include<stdio.h>#include<stdlib.h>#include<string.h>#include<ctype.h>typedef struct Eleves{ char num[10]; char nom[30]; char prenom[30]; struct Eleves*suivant;}E;E*tete=NULL;//Fonction Lecture:/*E *Lecture(E*tete,char *N,char *Nom,char *Prenom){ printf("\nDonner le numero d'inscription:\t"); scanf("%s",&N); printf("\nDonner le nom de l'eleve:\t"); scanf("%s",&Nom); printf("\nDonner le prenom de l'eleve:\t"); scanf("%s",&Prenom); return tete;}*///Fonction Création liste de n élèves:E *Creer(int n,E *tete){ char N[10],Nom[30],Prenom[30]; E *courant,*p; tete=NULL; p=tete; while(n>0) { printf("\nDonner le numero d'inscription:\t"); scanf("%s",&N); printf("\nDonner le nom de l'eleve:\t"); scanf("%s",&Nom); printf("\nDonner le prenom de l'eleve:\t"); scanf("%s",&Prenom); p=(E*)malloc(sizeof(E)); memcpy(p->num,N,sizeof(N)); memcpy(p->nom,Nom,sizeof(Nom)); memcpy(p->prenom,Prenom,sizeof(Prenom)); p->suivant=NULL; if(tete!=NULL) courant->suivant=p; else tete=p; courant=p; n--; } return tete;}//Fonction Ajout en tête:E*Ajout_tete(E*tete){ E *nouveau; char N[10],Nom[30],Prenom[30]; printf("\nDonner le numero d'inscription:\t"); scanf("%s",&N); printf("\nDonner le nom de l'eleve:\t"); scanf("%s",&Nom); printf("\nDonner le prenom de l'eleve:\t"); scanf("%s",&Prenom); nouveau=(E*)malloc(sizeof(E)); memcpy(nouveau->num,N,sizeof(N)); memcpy(nouveau->nom,Nom,sizeof(Nom)); memcpy(nouveau->prenom,Prenom,sizeof(Prenom)); nouveau->suivant=tete; tete=nouveau; return tete;}//Fonction Ajout à la fin:E *Ajout_fin(E *tete){ E *nouveau; char N[10],Nom[30],Prenom[30]; printf("\nDonner le numero d'inscription:\t"); scanf("%s",&N); printf("\nDonner le nom de l'eleve:\t"); scanf("%s",&Nom); printf("\nDonner le prenom de l'eleve:\t"); scanf("%s",&Prenom); nouveau=(E*)malloc(sizeof(E)); memcpy(nouveau->num,N,sizeof(N)); memcpy(nouveau->nom,Nom,sizeof(Nom)); memcpy(nouveau->prenom,Prenom,sizeof(Prenom)); nouveau->suivant=NULL; if(tete==NULL) { tete=nouveau; }else{ E*courant=tete; while(courant->suivant!=NULL) { courant=courant->suivant; } courant->suivant=nouveau; } return tete;}//Fonction d'affichage:void Affichage(E *tete){ E *courant=tete; while(courant!=NULL) { printf("\neleve = %s %s %s",courant->num,courant->nom,courant->prenom); courant=courant->suivant; }}main(){ //Déclarations: int n,i,R; E *tete,*liste; //Début: do { printf("Donner le nombre d'eleves:\t"); scanf("%d",&n); }while(n<=0); liste=Creer(n,tete); Affichage(liste); do { printf("\nVoulez vous ajouter l'eleve au debut de la liste ou a la fin? 0/1\t"); scanf("%d",&R); }while(R!=0 && R!=1); if(R==0) { //Lecture(tete,N,Nom,Prenom); liste=Ajout_tete(liste); Affichage(liste); }else{ //Lecture(tete,N,Nom,Prenom); liste=Ajout_fin(liste); Affichage(liste); }return 0;system("pause");}كما ترى فقد غيرت حقول بنيتك الجديدة الى جداول ثابتة لاننا لن نرسلها ابدا الى اي دالة، ايضا الخطأ الذي ارتكبته هو التالي tete->num=N;tete->nom=Nom;tete->prenom=Prenom;من المحال ان يتم نسخ سلسلة محرفية الى اخرى باستعمال رمز = لذلك عليك استخدام الدالة memcpy و توابعها 3 و هي الحاوية الجديدة العبارة المنسوخة و حجم الحاوية و نحدده بالدالة  sizeof و بذلك نسخ المحتويات الى حاويتنا الجديدة يكون كالتالي memcpy(p->num,N,sizeof(N));memcpy(p->nom,Nom,sizeof(Nom));memcpy(p->prenom,Prenom,sizeof(Prenom)); و ايضا ان كنت تريد ان تقوم بانشاء قائمة فعليك استخدام متغيرين من بنيتك الجديدة في البرنامج الرئسي و ليس واحدة فقط و هنا قمت بتعريف اثنتين tete و liste الولى كراس للقائمة ارسله لدالة التشكيل Creer  فقط لا غير و ما ترجعه لي اسنده للمتغير  liste و هي القائمة بعد التشكيل و هي التي ساعمل معها في جميع الدوال التالية و هاهو التعريف في البرنامج الرئيسي E *tete,*liste;و هناك خطأ منطقي في برنامجك و هو ان برنامجك يقوم فقط باظافة عنصر وحيد لا غير لذلك عليك بحل هذا المشكل  بالتوفيق اخي الكريم و من فضلك في المرات القادمة حاول ان لا تستعمل الفرنسية كثيرا و اللغة العامية الخاصة بنا حاول ان تستعمل الانجلزية او العربية الفصحى البحتة تجنبا لاي مشكل
  18. و عليكم السلام و رحمة الله و بركاته قبل كل شيء طريقة تعريفك للبنية غير صحيحة و يجب ان تكون هكذا typedef struct Eleves{ char *num; char *nom; char *prenom; struct Eleves*suivant;}E; لا تقم بتعريف السلاسل الحرفية على انها جداول ثابة و انما مؤشرات نحو حرف   ثم اولا لا يمكنك فعل هذا  E*Ajout_tete(E*tete,char N[10],char Nom[30],char Prenom[30])فطريقة ارسالك للتوابع خاطئة فالجداول لا تبعث بهذه الطريقة و انما على شكل مؤشرات هكذا E*Ajout_tete(E*tete,char *N,char *Nom,char *Prenom)ثانيا انت لم تقم بملئ جداولك بمحتواها فكيف تريد ان تسند قيمة غير معروفة الى متغير اخر...اولا عليك بقراءة ما تريد ادخاله ثم ارسله كتابع للدالة ثم اسند القيم و ثالثا الكود الخاص بك يقوم بانشاء عنصر واحد فقط من القائمة اليك الكود بعد تعديله قليلا #include<stdio.h>#include<stdlib.h>typedef struct Eleves{ char *num; char *nom; char *prenom; struct Eleves*suivant;}E;E*tete=NULL;//Fonction Ajout en tête:E*Ajout_tete(E*tete,char *N,char *Nom,char *Prenom){ E *nouveau; nouveau=(E*)malloc(sizeof(E)); nouveau->num=N; nouveau->nom=Nom; nouveau->prenom=Prenom; nouveau->suivant=tete; tete=nouveau; return tete;}main(){ E*tete; char N[10],Nom[30],Prenom[30]; scanf("%s",&N); scanf("%s",&Nom); scanf("%s",&Prenom); tete=Ajout_tete(tete,N,Nom,Prenom); printf("tete = %s %s %s",tete->num,tete->nom,tete->prenom);return 0;system("pause");} ارجو ان يفيدك اخي الكريم  موفق
  19. عذرا على قلة انتباهي اخي الكريم C++er  فقط قمت باظافة دالة اخرى تقوم بالمقارنة بين اول قيمة في مصفوفة المراجع و قيم محتويات قائمة الذاكرة  هذا هو الكود الجديد #include<stdio.h>#include<stdlib.h>typedef struct liste//القائمة الخاصة بسلسلة المرجع{ int a; struct liste *ptrn;}chaine_ref;typedef struct liste1//القائمة الخاصة بعدد الامكنة المحدد للبرنامج{ int a,age,Dp;//المتغير 1 خاص بمحتوى الخانة و 2 خاص بمدة مكوث جزء البرنامج في تلك الخانة و 3 عدد مرات تحميل الصفحات او اجزاء البرنامج struct liste *ptrn;}case_memoire;chaine_ref *criation_chaine(chaine_ref *tete,int tpage)//ايجاد سلسلة المراجع{ chaine_ref *p,*n_m; int x,i=0; tete=NULL; p=tete; while(i!=-1)//شرط التوقف { p=(chaine_ref*)malloc(sizeof(chaine_ref)); do { printf("entrer le numero de page svp (inferieur a taille de page): "); scanf("%d",&x); }while(x>=tpage); p->a=x; p->ptrn=NULL; if(tete!=NULL) n_m->ptrn=p; else tete=p; n_m=p; printf("(si vous voulez arriter ecrivez -1) : "); scanf("%d",&i); } return tete;}void aff_chain_ref(chaine_ref *tete)//الدالة الخاصة بطباعة السلسة المرجعية{ chaine_ref *p; p=tete; printf("la chaine de reference est :\n"); while(p!=NULL) { printf("%d ",p->a); p=p->ptrn; }}case_memoire *criation_case(case_memoire *tete,int n)//ايجاد القائمة الخاصة بمحتوايات حصة البرنامج من الذاكرة{ case_memoire *p,*n_m; int i=0; tete=NULL; p=tete; while(i<n) { p=(case_memoire*)malloc(sizeof(case_memoire)); p->a=-1;//قيم ابتدائية للمساعدة p->age=0;//نفس الشيء p->Dp=n;//اول قيمة لعدد مرات تحميل صفحات البرنامجو هو عدد الخانات المخصصة للبرنامج في الذاكرة p->ptrn=NULL; if(tete!=NULL) n_m->ptrn=p; else tete=p; n_m=p; i++; } return tete;}case_memoire *nbr_defaut_page(case_memoire *tete)//الدالة التي تحسب عدد مرات تحميل صفحات البرنامج{ case_memoire *p; p=tete; while(p!=NULL) { p->Dp++; p=p->ptrn; } return tete;}void aff_case_memo(case_memoire *tete,int tpage)//الدالة التي تطبع محتويات حصة البرنامج من الذاكرة{ case_memoire *p; p=tete; printf("\n:::::::::::::::::::::::::::::\n"); while(p!=NULL && p->a>=-1 && p->a<tpage && p->age>-1 && p->age<tpage)//شرط طباعة المحتويات لانه في بعض الاحيان عندما تكون هناك خانات متبقية من حصة البرنامج في الذاكرة في المرحلة الاخيرة فانه يظهر محتوى عشوائيو انا لا اريده { printf("%d\n",p->a); p=p->ptrn; }}case_memoire *mis_a_jour(case_memoire *tete)// الدالة التي تقوم بتحديث مدة مكوث مراجع الصفحات في خانات الذاكرة{ case_memoire *p; p=tete; while(p!=NULL) { p->age++; p=p->ptrn; } return tete;}int il_est_repeter(case_memoire *tete,int t)// الدالة الجديدة{ case_memoire *p; int existe=1; p=tete; while(p!=NULL && existe==1) { if(p->a==t) existe=0; else p=p->ptrn; } if(existe==1) return 1;//القيمة ليست موجودة else return 0; // القيمة موجودة}case_memoire *ptr_max(case_memoire *tete,int t,int tpage)//الدالة التي تجد اطول مكوث و تقوم بادراج المرجع الجديد مكانه{ case_memoire *p,*max; int existe; p=tete; max=tete;//متغير لايجاد المكوث الاطول و ياخذ قيمة راس القائمة while(p!=NULL) { if(p->age>=max->age) { max=p; p=p->ptrn; } else p=p->ptrn; } existe=il_est_repeter(tete,t); p=tete; while(p!=NULL && p!=max && existe==1)// اعود و ابحث عن القيمة المساوية لاكبر مكوث في الذاكرة { p=p->ptrn; } if(existe==0) { return tete; } if(p==max && existe==1)//هنا الشرط الثاني لتوقف الحلقة و هو ايجاد قيمة مساوية لاكبر مكوث { //if()//اقوم بشرط و هو اختلاف قيمته عن قيمة اول قيمة للسلة المرجعية { p->age=0;//اعيد عمره صفرا p->a=t;//و اسند اول قيمة في الجدول له tete=nbr_defaut_page(tete);//احسب عدد مرات تحميل الصفحات aff_case_memo(tete,tpage);//اطبع محتوى الذاكرة } tete=mis_a_jour(tete);//ثم اقوم بتحديث فترة مكوث الصفحات في الذاكرة return tete; }}chaine_ref *chaine_ref_organizer(chaine_ref *tete,chaine_ref *tete2)//هذه الدالة تقوم بتنظيم السلسلة المرجعية و تحذف القيم المتكررة بشكل متتال مثل 11 او 222 و هكذا{ chaine_ref *P,*Q,*n_m; int i=0; P=tete2; tete=NULL; Q=tete; while(P!=NULL) { if(P==tete2) { Q=(chaine_ref*)malloc(sizeof(chaine_ref)); Q->a=P->a; Q->ptrn=NULL; tete=Q; P=P->ptrn; } else { if(P->a!=Q->a) { Q=(chaine_ref*)malloc(sizeof(chaine_ref)); Q->a=P->a; Q->ptrn=NULL; n_m->ptrn=Q; P=P->ptrn; } else P=P->ptrn; } n_m=Q; } return tete;}case_memoire *FIFO(chaine_ref *tete,case_memoire *tete2,int n_c,int *t,int l,int tpage)//هذه هي الدالة الخاصة بهذه الاستراتيجية{ chaine_ref *p; case_memoire *q,*old; int i=n_c,j=l-n_c; p=tete; q=tete2; //هنا اقوم بملئ الذاكرة بالقيم المرجعية كاول خطوة ثم اتابع تحميل البقية while(q!=NULL && p!=NULL && i>0) { q->a=p->a; q->age=i; p=p->ptrn; q=q->ptrn; i=i-1; } aff_case_memo(tete2,tpage); //هنا اقوم بحذف القيم التي تم ادراجها في الذاكرة عن طريق ازاحة قيم الجدول بعدد خانات الذاكرة for(i=0;i<l;i++) t[i]=t[i+n_c]; //هنا تأتي المراحل الاخرى و هي تحميل بقية السلسلة المرجعية في الذاكرة while(j>0)// متغير الحلقة اخذ قيمة ابتدائية هي الفرق بين طول السلسلة المرجعية و عدد خانات الذاكرة لانه يبدأ عمله بع ادراج الدفع الاولى { tete2=ptr_max(tete2,t[1],tpage);// انادي الدالة التي تبحث عن اكبر مكوث و تدرج القيمة التالية حيث توابعها هي خانات الذاكرة و جدول السلسلة المرجعية الجديد for(i=0;i<l-j+2;i++)//احذف القيمة التي تم ادراجها t[i]=t[i+1]; j--; } return tete2;}int chaine_ref_lenth(chaine_ref *tete)//الدالة التي تحسب لي طول السلسة المرجعية بعد تنظيمها{ chaine_ref *p; int x; p=tete; while(p!=NULL) { x++; p=p->ptrn; } return x;}//البرنامج الرئيسيmain(){ int n_page,Tpage,nbr_case,Tpgm,i=0,lenth_chaine,Tmc,*t;/*النتغيرات على الترتيب عدد صفحات البرنامج حجم الصفحة الواحدة عدد خانات الذاكرة الخاصة بالبرنامج حجم البرنامج متغير لتحريك الحلقة طول السلسلة المرجعية حجم الذاكرة جدول يحمل السلسلة المرجعية المنظمة و تتم عليه عمليات الحذف*/ chaine_ref *tete_chaine,*chaine_referense,*tete_chaine_or,*p;/*قائمة للمراجع قبل و بعد تنظيمها*/ case_memoire *tete_case_memory,*case_memory,*q;/*قائمة الذاكرة*/ do { printf("entrer la taille de pgm svp : "); scanf("%d",&Tpgm); }while(Tpgm<=0); do { printf("entrer la taille de votre MC svp : "); scanf("%d",&Tmc); }while(Tmc<=0); do { printf("entrer la taille de votre page svp : "); scanf("%d",&Tpage); }while(Tpage<=0); n_page=Tpgm/Tpage;//حساب عدد صفحات البرنامج nbr_case=Tmc/Tpage;//حساب عدد الخانات المخصصة للبرنامج في الذاكرة printf("\n/ remarque / svp entrez les num de pages, non chaine des adresse...\n\n"); chaine_referense=criation_chaine(tete_chaine,Tpage); case_memory=criation_case(tete_case_memory,nbr_case); chaine_referense=chaine_ref_organizer(tete_chaine_or,chaine_referense); lenth_chaine=chaine_ref_lenth(chaine_referense); aff_chain_ref(chaine_referense); aff_case_memo(case_memory,Tpage); // ايجاد الجدول الخاص بالسلسلة المحرفية تبعا للقائمة المنظمة t=(int*)malloc(lenth_chaine*sizeof(int)); p=chaine_referense; while(p!=NULL && i<lenth_chaine) { t[i]=p->a; p=p->ptrn; i++; } case_memory=FIFO(chaine_referense,case_memory,nbr_case,t,lenth_chaine,Tpage); q=case_memory; printf("\nle nbr de defaut de page est : %d\n===================================\n",q->Dp);}ارجو ان يكون جيدا نوعا ما  في امان الله
  20. السلام عليكم و رحمة الله و بركاته اخواني اخواتي اساتذتي الكرام من بعد اذنكم ارجو منكم ان تساعدونني على معرفة الخطأ في هذا الكود  هدف هذا الكود هو محاكاة استراتيجية FIFO  التي يتبعها مسير الذاكرة لتحميل البرامج المتربصة الى الذاكرة ليتم تشغيلها و هي تعتمد على طريقة اول الواصلين هو اول الخارجين او المحملين من اجل التنفيذ، كتبت الكود و نفذته مرتين الاولى نجحت و الثانية لم تنجح فحاولت معرفة السبب و اصلاحه لكنني لم استطع ذلك، لذلك فضلا منكم اخوتي اساتذتي هل يمكنكم مساعدتتي على معرفة هذا الخطأ و ما الطريقة لتصحيحه؟ و الله وكيل اجركم و ثوابكم  هذا هو الكود، كله يعتمد على القوائم لانه المطلوب، اعلم انه طويل جدا فاسطره 250 لكن ما باليد حيلة هذا ما تمكنت منه :blush: #include<stdio.h>#include<stdlib.h>typedef struct liste//القائمة الخاصة بسلسلة المرجع{ int a; struct liste *ptrn;}chaine_ref;typedef struct liste1//القائمة الخاصة بعدد الامكنة المحدد للبرنامج{ int a,age,Dp;//المتغير 1 خاص بمحتوى الخانة و 2 خاص بمدة مكوث جزء البرنامج في تلك الخانة و 3 عدد مرات تحميل الصفحات او اجزاء البرنامج struct liste *ptrn;}case_memoire;chaine_ref *criation_chaine(chaine_ref *tete)//ايجاد سلسلة المراجع{ chaine_ref *p,*n_m; int x,i=0; tete=NULL; p=tete; while(i!=-1)//شرط التوقف { p=(chaine_ref*)malloc(sizeof(chaine_ref)); printf("entrer le numero de page svp : "); scanf("%d",&x); p->a=x; p->ptrn=NULL; if(tete!=NULL) n_m->ptrn=p; else tete=p; n_m=p; printf("(si vous voulez arriter ecrivez -1) : "); scanf("%d",&i); } return tete;}void aff_chain_ref(chaine_ref *tete)//الدالة الخاصة بطباعة السلسة المرجعية{ chaine_ref *p; p=tete; printf("la chaine de reference est :\n"); while(p!=NULL) { printf("%d ",p->a); p=p->ptrn; }}case_memoire *criation_case(case_memoire *tete,int n)//ايجاد القائمة الخاصة بمحتوايات حصة البرنامج من الذاكرة{ case_memoire *p,*n_m; int i=0; tete=NULL; p=tete; while(i<n) { p=(case_memoire*)malloc(sizeof(case_memoire)); p->a=-1;//قيم ابتدائية للمساعدة p->age=0;//نفس الشيء p->Dp=n;//اول قيمة لعدد مرات تحميل صفحات البرنامجو هو عدد الخانات المخصصة للبرنامج في الذاكرة p->ptrn=NULL; if(tete!=NULL) n_m->ptrn=p; else tete=p; n_m=p; i++; } return tete;}case_memoire *nbr_defaut_page(case_memoire *tete)//الدالة التي تحسب عدد مرات تحميل صفحات البرنامج{ case_memoire *p; p=tete; while(p!=NULL) { p->Dp++; p=p->ptrn; } return tete;}void aff_case_memo(case_memoire *tete)//الدالة التي تطبع محتويات حصة البرنامج من الذاكرة{ case_memoire *p; p=tete; printf("\n:::::::::::::::::::::::::::::\n"); while(p!=NULL && p->a>=-1 && p->a<=9 && p->age>-1 && p->age<=9)//شرط طباعة المحتويات لانه في بعض الاحيان عندما تكون هناك خانات متبقية من حصة البرنامج في الذاكرة في المرحلة الاخيرة فانه يظهر محتوى عشوائيو انا لا اريده { printf("%d\n",p->a); p=p->ptrn; }}case_memoire *mis_a_jour(case_memoire *tete)// الدالة التي تقوم بتحديث مدة مكوث مراجع الصفحات في خانات الذاكرة{ case_memoire *p; p=tete; while(p!=NULL) { p->age++; p=p->ptrn; } return tete;}case_memoire *ptr_max(case_memoire *tete,int *t)//الدالة التي تجد اطول مكوث و تقوم بادراج المرجع الجديد مكانه{ case_memoire *p,*max; p=tete; max=tete;//متغير لايجاد المكوث الاطول و ياخذ قيمة راس القائمة while(p!=NULL) { if(p->age>=max->age) { max=p; p=p->ptrn; } else p=p->ptrn; } p=tete; while(p!=NULL && p!=max && p->a!=t[1])// اعود و ابحث عن القيمة المساوية لاكبر مكوث في الذاكرة { p=p->ptrn; } if(p->a==t[1])//هنا مشكلتي و هي احيانا تنجح و احيانا ﻻ و هي ان وجد البرنامج اية قيمة مساوية لاول قيمة في جدول السلسلة فانه يعيد القائمة كما هي و يغادر لكنها لا تعمل جيدا { return tete; } if(p==max)//هنا الشرط الثاني لتوقف الحلقة و هو ايجاد قيمة مساوية لاكبر مكوث { if(p->a!=t[1])//اقوم بشرط و هو اختلاف قيمته عن قيمة اول قيمة للسلة المرجعية { p->age=0;//اعيد عمره صفرا p->a=t[1];//و اسند اول قيمة في الجدول له tete=nbr_defaut_page(tete);//احسب عدد مرات تحميل الصفحات aff_case_memo(tete);//اطبع محتوى الذاكرة } tete=mis_a_jour(tete);//ثم اقوم بتحديث فترة مكوث الصفحات في الذاكرة return tete; }}chaine_ref *chaine_ref_organizer(chaine_ref *tete,chaine_ref *tete2)//هذه الدالة تقوم بتنظيم السلسلة المرجعية و تحذف القيم المتكررة بشكل متتال مثل 11 او 222 و هكذا{ chaine_ref *P,*Q,*n_m; int i=0; P=tete2; tete=NULL; Q=tete; while(P!=NULL) { if(P==tete2) { Q=(chaine_ref*)malloc(sizeof(chaine_ref)); Q->a=P->a; Q->ptrn=NULL; tete=Q; P=P->ptrn; } else { if(P->a!=Q->a) { Q=(chaine_ref*)malloc(sizeof(chaine_ref)); Q->a=P->a; Q->ptrn=NULL; n_m->ptrn=Q; P=P->ptrn; } else P=P->ptrn; } n_m=Q; } return tete;}case_memoire *FIFO(chaine_ref *tete,case_memoire *tete2,int n_c,int *t,int l)//هذه هي الدالة الخاصة بهذه الاستراتيجية{ chaine_ref *p; case_memoire *q,*old; int i=n_c,j=l-n_c; p=tete; q=tete2; //هنا اقوم بملئ الذاكرة بالقيم المرجعية كاول خطوة ثم اتابع تحميل البقية while(q!=NULL && p!=NULL && i>0) { q->a=p->a; q->age=i; p=p->ptrn; q=q->ptrn; i=i-1; } aff_case_memo(tete2); //هنا اقوم بحذف القيم التي تم ادراجها في الذاكرة عن طريق ازاحة قيم الجدول بعدد خانات الذاكرة for(i=0;i<l;i++) t[i]=t[i+n_c]; //هنا تأتي المراحل الاخرى و هي تحميل بقية السلسلة المرجعية في الذاكرة while(j>0)// متغير الحلقة اخذ قيمة ابتدائية هي الفرق بين طول السلسلة المرجعية و عدد خانات الذاكرة لانه يبدأ عمله بع ادراج الدفع الاولى { tete2=ptr_max(tete2,t);// انادي الدالة التي تبحث عن اكبر مكوث و تدرج القيمة التالية حيث توابعها هي خانات الذاكرة و جدول السلسلة المرجعية الجديد for(i=0;i<l;i++)//احذف القيمة التي تم ادراجها t[i]=t[i+1]; j--; } return tete2;}int chaine_ref_lenth(chaine_ref *tete)//الدالة التي تحسب لي طول السلسة المرجعية بعد تنظيمها{ chaine_ref *p; int x; p=tete; while(p!=NULL) { x++; p=p->ptrn; } return x;}//البرنامج الرئيسيmain(){ int n_page,Tpage,nbr_case,Tpgm,i=0,lenth_chaine,Tmc,*t;/*النتغيرات على الترتيب عدد صفحات البرنامج حجم الصفحة الواحدة عدد خانات الذاكرة الخاصة بالبرنامج حجم البرنامج متغير لتحريك الحلقة طول السلسلة المرجعية حجم الذاكرة جدول يحمل السلسلة المرجعية المنظمة و تتم عليه عمليات الحذف*/ chaine_ref *tete_chaine,*chaine_referense,*tete_chaine_or,*p;/*قائمة للمراجع قبل و بعد تنظيمها*/ case_memoire *tete_case_memory,*case_memory;/*قائمة الذاكرة*/ do { printf("entrer la taille de pgm svp : "); scanf("%d",&Tpgm); }while(Tpgm<=0); do { printf("entrer la taille de votre MC svp : "); scanf("%d",&Tmc); }while(Tmc<=0); do { printf("entrer la taille de votre page svp : "); scanf("%d",&Tpage); }while(Tpage<=0); n_page=Tpgm/Tpage;//حساب عدد صفحات البرنامج nbr_case=Tmc/Tpage;//حساب عدد الخانات المخصصة للبرنامج في الذاكرة chaine_referense=criation_chaine(tete_chaine); case_memory=criation_case(tete_case_memory,nbr_case); chaine_referense=chaine_ref_organizer(tete_chaine_or,chaine_referense); lenth_chaine=chaine_ref_lenth(chaine_referense); aff_chain_ref(chaine_referense); aff_case_memo(case_memory); // ايجاد الجدول الخاص بالسلسلة المحرفية تبعا للقائمة المنظمة p=chaine_referense; while(p!=NULL) { t[i]=(int*)malloc(sizeof(int)); t[i]=p->a; p=p->ptrn; i++; } case_memory=FIFO(chaine_referense,case_memory,nbr_case,t,lenth_chaine);} و هذه صور للتنفيذ مرتين الاولى ناجحة     و هذه هي الثانية و الخطا في المرحلة الثالثة من المفترض ان لا يدر 6 لانها موجودة لكنه ادرجها      بارك فيكم ربي  بالتوفيق
  21. اخي الكريم لقد تم حل المشكل في هذا الكود اشكر لك حسن مساعدتك لي اخي الكريم مصطفى  ^_^
  22. لا عليك ابدا اخي الكريم هدف الكود هو محاكات تقنية FIFO لمسير الذاكرة عندما يقوم بادراج البرامج في الذاكرة لتنفيذها و هي first in first out تقوم بادخال حجم البرنامج حجم الذاكرة و حجم صفحة البرنامج (فالبرنامج يكون مقسما لصفحات او اجزاء حتى يتم تنفيذ عدة برامج في نفس الوقت) ثم تقوم بادخال ارقام الصفحات او ما يسمى السلسلة المرجعية و هي عبارة عن @ الخاصة بالصفحات خرج الكود هو ان يطبع لك حالة الذاكرة بعد كل ادراج صفحة فيها ثم في الاخير يظهر لك قيمة عدد مرات الادراج و كمثال ساتخذ المثال الذي لم ينجح معي و هو كالاتي  حجم البرنامج 1000 حجم الذاكرة 400 حجم صفحة البرنامج 100 السلسلة المرجعية : 356839612360 من المفترض ان يكون الخرج هكذا : 3            9          9            9               9           6          6 5     ->    5  ->    1   ->      1     ->       1   ->     1   ->    0 6            6         6             2               2           2          2 8            8         8             8               3           3          3 بالاضافة الى عدد مرات الادراج و هو 10 // هذه فقط لم اظهرها لكنها تعمل و بشأن نصيحتك لي اخيالكريم مصطفى فقد فعلت لكنني لم اتمكن من ذلك و قد وضحت ما افكر فيه في هذا الجزء من الكود case_memoire *ptr_max(case_memoire *tete,int *t)//الدالة التي تجد اطول مكوث و تقوم بادراج المرجع الجديد مكانه{ case_memoire *p,*max; p=tete; max=tete;//متغير لايجاد المكوث الاطول و ياخذ قيمة راس القائمة while(p!=NULL) { if(p->age>=max->age) { max=p; p=p->ptrn; } else p=p->ptrn; } p=tete; while(p!=NULL && p!=max && p->a!=t[1])// اعود و ابحث عن القيمة المساوية لاكبر مكوث في الذاكرة { p=p->ptrn; } if(p->a==t[1])//هنا مشكلتي و هي احيانا تنجح و احيانا ﻻ و هي ان وجد البرنامج اية قيمة مساوية لاول قيمة في جدول السلسلة فانه يعيد القائمة كما هي و يغادر لكنها لا تعمل جيدا { return tete; } if(p==max)//هنا الشرط الثاني لتوقف الحلقة و هو ايجاد قيمة مساوية لاكبر مكوث { if(p->a!=t[1])//اقوم بشرط و هو اختلاف قيمته عن قيمة اول قيمة للسلة المرجعية { p->age=0;//اعيد عمره صفرا p->a=t[1];//و اسند اول قيمة في الجدول له tete=nbr_defaut_page(tete);//احسب عدد مرات تحميل الصفحات aff_case_memo(tete);//اطبع محتوى الذاكرة } tete=mis_a_jour(tete);//ثم اقوم بتحديث فترة مكوث الصفحات في الذاكرة return tete; }}وفقك الله اخي الكريم
  23. السلام عليكم و رحمة الله و بركاته  هذا اول موضوع لي هنا و ارجو ان يكون مفيد و لو قليلا  هذا الموضوع يتحدث عن خطوات تنفيذ البرنامج من بداية كتابة الكود الى ان يصير برنامجا قابلا للتنفيذ يعني processus  ^_^ في البداية هذا مخطط توضيحي لتلك المراحل ثم ساحاول ان اوضح المرحلة تلو الاخرى ما استطعت لتنفيذ برنامج قمنا بكتابة الكود الخاص به فهذا يتطلب عدة مراحل قبل التنفيذ و هذه المراحل تتم بشكل آلي تماما و الموقع الذي تدور فيه هذه المراحل هو القرص الصلب disque dure و هي تنفذ بالوسائل التالية : 1- محرر النصوص 2- المترجم 3- editeur de lien ( اظن مهناها الرابط او محرر الروابط ) 4- chargeur ( معناها اللغوي هو الشاحن لكن الاصطلاحي لا اعرفه  :blush: ) 5- débogueur ( مصحح الاخطاء) و الان ساباشر شرح دور كل وسيلة من الوسائل السابقة  ^_^ : 1- محرر النصوص أو (éditeur de textes ( text editor :   ان الهدف من محرر النصوص هو تمكين المبرمج من كتابة الكود الخاص به بلغة متطورة قريبة من لغة البشر اي لغة من مستوى عالي ( haut niveau ) كلغة السي او سي ++  او لغة قريبة من لغة الالة اي لغة من مستوى منخفض ( bas niveau ) كلغة الاسامبلي، و ايضا فان محرر النصوص يمكن المبرمج من التغيير في برنامجه باظافة تعليمات او حذف تعليمات كما يمكنه من طباعته    2- المترجم :   هو عبارة عن خادم او برنامج خدمة يملك دور ترجمة او تحويل برنامج مكتوب بلغة متطورة الى برنامج مكتوب بلغة الالة و هو نتيجة الترجمة (programme objet) و هناك نوعين من المترجم :   1-2- مترجم سطر بسطر ( interpréteur ) : هو برنامج يقوم بالتنفيذ للكود سطر بسطر  و هو يعمل بهذه الطريقة : - قراءة التعليمة من الكود سورس - ترجمة التعليمة النقروؤة لنا الى تعليمة مقروؤة للألة و هذه الخطوة عندها حالتين كنتيجة : --> ترجمة بنجاح : هنا المترجم يقوم بارسال نتيجة الترجمة حتى يتم تنفيذها و ينتقل الى السطر او التعليمة التالية --> ترجمة فاشلة : المترجم هنا لن يوافق على ارسال التعليمة و يقوم باظهار رسالة بان هناك خطأ في السطر او التعليمة التي توقف عندها فهذا المترجم لا ينتقل الى السطر التالي و التعليمة التالية ان كان هناك خطأ في اي تعليمة * و هذا النوع من الترجمة يتطلب تكرار الترجمة في كل مرة نقوم فيها بتنفيذ البرنامج   2-2- مترجم جامع ( compilateur ) : و هو ايضا برنامج يقوم بترجمة الكود من لغة متدورة الى لغة الالة و نتيجته نفسها ايضا لكن بهذه الوسائل : - محلل الصحة اللغوية (analyseur lexical ) : و هو من يقوم بتحليل الكود من الناحية اللغوية و عمله يكون كالاتي ايجاد جدول الرموز :    و هو يحوي اسماء المتغيرات المستعملة او الثوابت المرفقة الى رموزها و الكلمات المفتاحية  و الارقام و توابع الدوال و يصنفها حسب نوعها مستعملا رموزا خاصة به يفهمها، مثلاهذا الكود  : #include <stdio.h>main(){int x;const y=5;// عدد ثابت قيمته 5x=y+2;} لنرى بعض الامثلة الصغيرة من هذا الكود كيف ستكون حالتها في جدول الرموز و هي لن تكون كاملة  : # : symbol -> sym include : كلمة مفتاحية -> mcx : متغير من نوع اعداد صحيحة : idconst : كلمة مفتاحية -> mcy : عدد ثابت قيمته 5 : const+ : عملية : op2 : رقم صحيح موجب : nbr بالاظافة الى انواعها فهناك ايضا مكانها في الذاكرة و احداثيتها في الكود و المحلل اللغوي للقيام بعمله فانه يقوم بحذف الفراغات و التعليقات  و كمثال لنرة الكود السابق كيف سيكون  #include<stdio.h>main(){intx;consty=5x=y+2;} اذن فالمسافة و التعليق قد اختفوا و من الاخطاء التي يعالجها المحلل الغوي اسماء المتغيرات الطويلة جدا و الرموز المجهولة عنده  لنرى ذلك كمثال ##include <stdio.h>هنا ستكون رسالة الخطأ كالاتي D:\exp.c|1|error: stray '##' in program|تحليل من الناحية القاعدية :   هذا المحلل يقوم بمعالجة و ايجاد الاخطاء التي تكسر القواعد الخاصة باللغة و هو يعتمد جدول الرموز  و القواعد المخزنة عنده و نتيجته تكون شجرة العبارة او بالتحديد arbre syntaxique و هي التي تكشف عن الخطأ الذي يكسر القاعدة المستعملة في العبارة مثلا لناخذ هذه العبارات x=y+z;x=+z; شجرة العبارة الاولى  كالاتي   و هي تماما صحيحة  ^_^   اما الثانية فشجرتها هكذا     و هي بالتاكيد خاطئة  -_- لنحلل الخطأ معا رغم انه واضح  ;) اولا = عملية اسناد موجودة في جدول الرموز ثم x القيمة المسند اليها موجود في جدول الرمز بكامل متطلباته exp العبارة المسندة يجب ان نرى مما تتكون op العملية الحسابية + هنا هنا هنا الخطأ فالقاعدة المخزنة عند المترجم هي ان عملية + بها حدين ( حد اول + حد ثاني ) لكن انتظر لحظة الحد الاول مفقود  :excl:  اذن هذا خطأ كسر القاعدة المعتمدة  ; انتهاء التعليمة هنا المترجم يسجل خطأ كسر قاعدة عملية الجمع   و ايضا من الاخطاء التي يعالجها محلل القاعدة لدينا الاتي  - غياب الاقواس  x=(a+b*c; هنا المترجم يقول لك اين القوس الثاني لقد نسيته  - خطأ في بنية هيكلة معينة - و غياب التحديد بالحواضن { } و غيرها الكثير من الاخطاء التي يعالجها * هنا يجدر بنا الاشارة الى كيفية التحليل فالمحلل يستخدم شجرة التعليمة و لا يبدؤها من الاعلى الى الاسفل و انما من الاسفل الى الاعلى   محلل دلالات الالفاظ (anlyseur sémantique): من اسمه نعرف عمله فهذا المحلل يقوم بالتاكد من ان التعليمات المعالجة انها صحيحة او معرفة او مخزنة في ذاكرته و هو في عمله يستعمل جدول الرموز و شجرة التعليمة و من الاخطاء التي يعالجها نذكر 3 : - استعمال متغير لم يتم تعريفه  int x;p=x;رسالة الخطأ هكذا D:\exp.c|147|error: 'p' undeclared (first use in this function)| - تعريف مضاعف لمتغير واحد  int j,j;الرسالة هكذا D:\exp.c|135|error: redeclaration of 'j' with no linkage| - عدم التوافق بين الانماط int x;char y;x=y; انشاء التعليمات البرمجية : هذه اخر مرحلة من عملية الترجمة الكلية و فيها يتم تحويل الكود سورس من لغة برمجية متطورة الى لغة الالة فينتج عن ذلك ما نسميه ب code objet فيتم انشاء ملف جديد كهذا exp.o و هو الملف الذي سيصبح برنامج متربص بعد 3 مراحل قادمة   و هذا مخطط صغير للخطوات السابقة     3- انشاء الروابط (édition de liens / linker) :   هذه المرحلة مهمة جدا حيث تعتبر نوع من نظام التشغيل ففيها يتم اكمال عمل المترجم - باظافة العناوين ( @ adresse )  - نقل اوامر المصادر الداخلية  - دمج الدوال المستعملة من المكاتب التي تم استدعاؤها - الترجمة من لغة الى اخرى ( تعدد اللغات التي تعالجها البيئة البرمجية المستعملة )   4- نقل البرنامج الى الذاكرة المركزية :   هنا في هذه المرحلة يتم تحميل البرنامج الى الذاكرة المركزية حتى يتم تشغيله و تنفيذه لان كل ما حدث سابقا كان في القرص الصلب و لا يمكن تنفيذ البرامج هناك لان سرعته لا تتماشى مع سرعة المعالج processeur و الذاكرة المركزية اسرع من القرص الصلب بكثير    5- المصحح (debogueur / debogger) :   و مهمته مساعدة المبرمج على تطوير برنامجه و وظائفه كالاتي - تمكين المبرمج من تصور محتوى الذاكرة - تمكين المبرمج من تصور محتويات السجلات المختلفة - تطبيق البرنامج خطوة بخطوة   و بهذا و بعد هذه المراحل فاننا حصلنا على برنامح متربص تم ارساله الى الذاكرة المركزية و وضع في طابور الانتظار لانتظار دوره فيتم تشغيله و هذا الامر فيه عدة مراحل اخرى ممتعة فقد انتقلنا الى مدير الذاكرة المركزية و ما الاستراتيجيات الو التكتيكات التي يستعملها في تسيير الذاكرة  ^_^   بالتوفيق للجميع و ارجو ان تصححوا لي اخطائي و تفيدوني بما تعرفون
  24. تطور البرامج

      و عليكم السلام و رحمة اللهو بركاته اخي الكريم شكرا لتصحيح هذا الخطأ لي و بارك الله فيك
  25. اخي الكريم مصطفى و استاذ Mr.B اشكركما حقا على المساعدة بارك الله فيكم