![]() |
|||||||||
|
|
|||||||||
|
||||
|
مشاركة: very simple C/C++ code
للأسف ودي اكتب
بس المشكلة اني ما اعرف الا لغه C++ وكان ودي اني اول من يحلهاااا بس يالله راح اكون اول من رد ![]() والوعد في C++ <<<<<<<< مسوي يهدد ما درى انه توه مخلص البارت الأول من الماده هذي وطالع له شنب فيهاا خخخخ يالله مشكورة اختي\اخوي على الموضوع القيم والجايات اكثر انشالله اخوك العاني |
|
|||||
|
مشاركة: very simple C/C++ code
لو جايب كود من ذي المواد يمكن اقدر اجيب لك الجواب مو يمكن الا اكيـــد بأذن الله على العموم ننتظر حقين السي يجون يحلون الكود أقــــــــرب البعيد |
|
|||||
|
مشاركة: very simple C/C++ code
هذا الكود يتنفذ بالسي أو السي بلس بلس كومبايلر.. بس أغرب كود شفته بحياتي..
والله ما قدرت أعرف وشو بدون ما أنفذ ولكن نفذته وطلعت لي خريطه أحد الدول الشقيقه اللي نستقدم منها.. قعدت أحاول بس يبي له واحد فاضي مره يفكك فيه.. مشكور يا Mutability وحلوه الفكره. |
|
||||
|
مشاركة: very simple C/C++ code
كود عجيب !
.. حاولت أفهمه بصراحة ما قدرت ! .. فيه حاجات غريبه شوي .. ما أدري ليه طلع لي linking error و لا قدرت أشوف المخرجات .. توقعته باترن أو شي زي كذا من طريقة كتابته .. الكوندشنز جد غريبه .. شكراً جزيلاً لعرضه و أتمنى لو تقدر تكلمنا عنه أكثر .. |
|
|||||
|
مشاركة: very simple C/C++ code
وبصراحة الى الحين الكود مبهم بالنسبة لي يمكن لان الفناكيش المستخدمة فى الكود موجودة اصلا فى المكتبة اللى انت استعديتها او بالاحري كلمة ستوديو . بصراحة انا نفذت الكود على كمبايلر السي ++ وكانت المخرجات بالشكل التالي أقــــرب البعيـــد |
|
|||||
|
مشاركة: very simple C/C++ code
طبعا ما احد كان متوقع ان الكود صحيح من الاساس . او على الاقل الاغلبية . اول شي ودي اشوف اللي كتب الكود لأني أطلبه 45 دقيقة من وقتي (حسبي الله عليه) . رح أحاول اشرح اللي فهمته من الكود ، ماني متأكد من فهمي 100% لكن 90% مقتنع انه صحيح ان شاءالله . رح ابدا من البداية وحاول تركز شوي بالقراية حتى ما تفقد الترابط والا بيصير الموضوع يحتاج موضوع ثاني يشرحه . رح ارمز للوب الخارجية بـ outer واللوب الداخلية بـ inner int a,b,c; ما يبي لها شرح في بداية جملة outer حط b = 10 و c = 10 شرط التوقف لـ outer هو انه a = 0 او null او بمعنى ثاني انها توصل لنهاية string الطويلة الجملة [b+++21] تعني حط في المتغير a رقم الاسكي للحرف رقم b + 21 بعد كذا زود b بواحد يعني بالشكل هذا b++ + 21 والزيادة لـ b ما تتم الا بعد اسناد رقم الاسكي للحرف رقم b + 21 إلى المتغير a في أول دورة لـ outer رح يحط في a رقم الاسكي للحرف رقم 31 في النص الطويل العريض واللي يساوي "فراغ" ورقم الاسكي له هو 32 . بعدين رح يزود b بواحد وتصير 11. مازلنا في اول دورة لـ outer واتفقنا انه حط في a رقم 32 وجا دور تنفيذ inner بالشكل هذا كود:
for(; a-- > 64; ) putchar( ++c=='Z'? c/=9:33^b&1); الدورة الثانية لـ outer رح تكون b = 11 بالتالي رح يسند لـ a رقم الاسكي للحرف الموجود في الخانة رقم 11 + 21 اللي هي 32 واللي فيها الحرف T والاسكي حقه يساوي 84 . ورح يزيد b بواحد ورح تكون 12 . الحين رح يجي لتنفيذ inner بالشكل هذا كود:
for(; a-- > 64; ) putchar( ++c=='Z'? c/=9:33^b&1); طيب رح نجي للشرط اللي جوا inner واللي هو نص اللحسة بالكود ، ولكنه بالحقيقة سهل جدا زي ما رح نشوف. اول شي الدالة putchar هذي تعطيها رقم int وتطبع لك الحرف المقابل لهذا الرقم في جدول الاسكي . لازم نتذكر انه القيمة الاساسية لـ c هي 10 (اللي اعطيت له في بداية تنفيذ outer ) طبعا اول حاجة يسويها لما يدخل الشرط انه يزيد c بـواحد يعني رح تكون c تساوي 11 بعد كذا يقارن هل c يساوي رقم الاسكي لحرف Z واللي يعادل 90 ؟ طبعا 11 لا تساوي 90 بالتالي الشرط غير متحقق ورح يعطي الدالة putchar الرقم الناتج من العملية هذي : كود:
33^b&1 أول شي لازم تكون عارف الرمزين & و ^ وش عملهم . كل الرمزين يتعاملون على مستوى البتات للمتغير. الرمز & يعادل AND . مثال بسيط 1&0 هذي يعطي 0 و 1&1 يعطي 1 والرمز ^ يعادل XOR. مثال 1^0 هذي تعطي 1 و 1^1 هذي تعطي 0 بمعنى اذا صارو البتات متشابهين يعطي 0 واذا صارو البتات مختلفين يعطي 1. الجملة هذي تنفذ بالشكل التالي: اذا كان b عدد زوجي فإن ناتج الجملة 33^b&1 يعطي 33 (لأن b&1 تعطي 0 و 33^0 تعطي 33) وإذا كان b عدد فردي فإن ناتج الجملة 33^b&1 يعطي 32 (لأن b&1 تعطي 1 و 33^1 يعطي 32) اللي يحتاج تفصيل في هذي النقطة ما عندي مشكلة ارجع واوضحها زين اذا كان فيها غموض. يعني كأنه يقول اذا كانت b عدد زوجي عط الدالة putchar الرقم 33 وخلها تطبع الرمز المقابل له في جدول الاسكي واللي هو ! واذا كانت b عدد فردي عط الدالة puchar الرقم 32 واللي هو يعادل فراغ . اوكي في حالتنا هذي عندنا b تساوي 12 (زي ما اتفقنا في اخر تغيير لقيمة b ) و بما ان c تساوي 11 فانها تحتاج لـ 79 دورة حتى توصل 90 اللي هو رقم الاسكي لـ Z وتتنفذ الجملة c = c /9 او c/=9 (كلهم زي بعض) يعني كأنه يقول إذا وصلت c للرقم 90 اقسمها على 9 يعني عط c القيمة 10 ، بمعنى اخر سوي لها reset للقيمة 10 . طيب حنا اتفقنا انه رح ينفذ inner 20 مرة (64 – 84 ) واتفقنا انه c ما رح توصل للقيمة 90 الا بعد 79 لفة معناها رح ينفذ الجملة 33^b&1 عدد 20 من المرات وبما انه b تساوي 12 يعني زوجي فانه رح يعطي الدالة putchar الرقم 33 ويخليه يطبع 20 حبة من الرمز "!" بعد كذا رح يرجع لـ outer ويكمل التنفيذ ورح ياخذ الحرف رقم 12 + 21 = 33 اللي هو الحرف F واللي رقم الاسكي له يساوي 70 مع |