المتحدث 1: هذه هي دورة CS50، وهذا هو الأسبوع الأول.
وبنهاية اليوم، ستتعرف على كيفية
إنشاء برامج تشبه هذا.
لذلك فهذا، بالطبع، نظام ثنائي.
هذه هي اللغة الوحيدة التي تفهمها الآلات في النهاية.
لكن ولحسن الحظ، في الأسبوع الماضي، كانت هناك عمليات تجريد كثيرة جدًا
وهناك الكثير من البشر الذين جاؤوا من قبلنا فلم نعد فعليًا
بحاجة لكتابة أي شيء في هذا المستوى.
يمكننا تجريد الطريقة أعلاه مثلما فعلنا مع لغة سكراتش بالفعل
وبالمثل سنبدأ اليوم مع C.
ولكن هل يرغب أي شخص مع ذلك في تخمين
ما يقوم به هذا البرنامج فعليًا، عند تغذيته في جهاز Mac أو الكمبيوتر الشخصي لديك؟
هل يعرف أحدكم؟
هل يرغب أي شخص أن يخمّن؟
إنه ربما يكون أبسط برنامج يمكنك كتابته.
في الواقع، إنه كذلك، عند تغذيته في عقل جهاز الكمبيوتر لديك،
والمسمّى بوحدة المعالجة المركزية بطباعة ذلك البرنامج ببساطة.
إذن كيف نصل فعليًا إلى تلك النقطة؟
حسنًا، تذكروا من أين بدأنا هذه المحادثة آخر مرة
والتي تتحدث عن علوم الكمبيوتر بشكل أعمّ
وحل المشكلات-- اقترحنا أنه يمكن استخلاصها حقيقةً بهذه الصورة.
لديك بعض المدخلات.
وتريد بعض المخرجات.
وفي مكانٍ ما في المنتصف، تحتاج لفعل شيءٍ ما باستخدام تلك المدخلات.
وللوصول إلى تلك النقطة، مع ذلك، كان يتعين علينا تمثيل تلك المدخلات والمخرجات.
كان يتعين تحديدًا علينا أن نقرر كبشر، كيف سنمثل جميع المدخلات
أمام المشكلة الموجودة لدينا عندما يحين وقت جعل جهاز الكمبيوتر يقوم بمعالجتها فعليًا.
وفي نهاية المطاف، فكل من الهواتف وأجهزة الكمبيوتر التي
نستخدمها جميعًا فقط في نهاية اليوم يتم توصيلها في الجدار
لتحصل على موردها المادي، وهو الكهرباء،
وقد تقوم بتخزينها مؤقتًا في بطارية.
لكن ذلك حقيقةً هو مُدخلنا الوحيد.
إما أنها متصلة بالكهرباء أو ليست كذلك.
إما أنها 1 أو 0، صحيحة أو خاطئة.
لذلك يختزل العالم حقيقةً الأمر إلى هاتين الحالتين، إذا صح القول.
وهكذا يمكنك التفكير في تلك الحالات حينئذ تمامًا كمصباح كهربائي، في حالة
تشغيل أو إيقاف.
لقد قمتُ بإيقاف هاتفي الخلوي فجأةً آخر مرة لتشغيل ضوء الفلاش أو إيقافه،
1 أو 0، صحيحة أو خاطئة.
الآن بالطبع، إذا كان لديك مصباح كهربائي واحد فقط،
فيمكنك فقط العدّ من 0 إلى 1.
لكن إذا بدأتَ بالحصول على حزمة منها متصلةً على التوالي مع بعضها البعض،
فيمكنك إعادة ترتيبها مثلما فعلت بإصبعي--
0، 1، 2، 3، وهكذا.
وهكذا بدأنا نتحدث عن النظام الثنائي بشكلٍ أعمّ.
وبالتالي فهنا على سبيل المثال كانت توجد ثلاثة تسلسلات
لحالات 0 وحالات 1 و كل واحدة من تلك الحالات كانت تمثل شيئًا ما،
لكننا لسنا بحاجة للتفكير في العالم عند هذا المستوى.
يمكننا التجريد إضافةً إلى ذلك.
كلنا على دراية أكبر بكثير بالنظام العشري بالطبع،
وبالفعل نذكر أن هذا النظام كان عبارة فقط عن 72، و73، و33، والتي لو يذكر أحدكم،
عندما تستخدمون نظام ASCII--
والتي كانت تُعد هي هذا المعيار العالمي لربط الأرقام
بالحروف--فما الرسالة التي حصلنا عليها؟
أجل، كانت تحديدًا high، حرف H كبير حرف I كبير علامة تعجب.
وذلك إذن تجريد أعلى تلك الأرقام أو بطريقة أخرى الأرقام الثنائية.
لكننا لسنّا مضطرين لنمذجة النص فقط باستخدام الأرقام.
في نهاية المطاف، لا يزال موردنا الوحيد هو الكهرباء،
والطريقة الوحيدة التي نفكر بها فيه رقميًا لا تزال هي الأصفار والواحدات.
لكن إذا أخذنا نفس القيمة--
72، 73، 33-- وقمنا بالتعامل معها في سياق برنامج Photoshop
أو برنامج صور أو برنامج رسومات،
فيمكننا بدلاً من ذلك ترجمتها كمقدار ما من
الأحمر، مقدار ما من الأخضر، مقدار ما من الأزرق،
وهو ما منحنا آخر مرة، لو تذكرون، هذا اللون المائل للاصفرار.
لذلك لدينا الآن تجريد آخر أعلى الألوان الثنائية،
وهذا يمثل وحدة بكسل واحدة فقط.
ما الذي يمكنك فعله بمجرد وجود أكثر من وحدة بكسل لديك؟
ما الذي يمكنك تمثيله بعد ذلك؟
حسنًا، صحيح، الصور.
لذلك نواصل تصعيد المحادثة بدرجة أعلى وأعلى،
ويمكننا تمثيل شيء كرمز مشاعر رسومي على الشاشة،
يحتوي على أكثر من نقطة صفراء واحدة.
لقد كانت به مجموعة كاملة من النقاط الصفراء وألوان أخرى كذلك.
وتذكّروا أيضًا، إذا كنا نريد تحريك الأشياء،
سواءً كان ذلك من خلال أشياء ساذجة مثل رموز مشاعر متحركة على هاتف أو مجرد أفلام
أو مقاطع فيديو مناسبة، جيدًا، فتكون تلك الأشياء عبارة عن مجرد تسلسلات
لصور تمضي أمام عينيك كإنسان بسرعةٍ كبيرةٍ بالفعل.
إذن ذلك هو المكان الذي توقفنا فيه، إلى حد ما، في المرة الأخيرة لنبدأ من المستوى الأساسي
ونقوم بالتجريد حتى نتمكن بعد ذلك من تحديد أننا
يمكننا تمثيل المدخلات، ويمكننا تمثيل
المخرجات، مهما حدثت تلك الأشياء.
ومن الآن فصاعدًا، لسنا بحاجة إلى التفكير عند ذلك المستوى.
يمكننا فقط افتراض أننا جميعًا نعلم كيفية القيام بهذا الأمر.
وحتى لو أصبحت في النهاية ذكرى بعيدة نوعًا ما،
فنحن نعلم أن شخصًا ما يمكنه أن يفعل ذلك في الواقع.
وتلك هي قيمة التجريد.
لكن بداخل هذا الصندوق الأسود ما يُسمى بالخوارزميات،
الخلطة السرية--
هذه هي الحيثية التي يتم بها حل المشكلات بالفعل.
ونحن لم نتحدث فقط عن ماهية هذه الخوارزميات، ولكن على سبيل المثال،
عن مدى فعاليتها.
لذا تذكّروا أن هذا الخط الأحمر كان يمثل خوارزمية بسيطة جدًا تقوم بتقليب
دليل الهاتف صفحةً صفحة في كل مرة.
وسبب كونها خطًا مستقيمًا هو وجود تطابق واحد لواحد
بين عدد الصفحات في الكتاب
وعدد مرات تقليب الصفحات-- صفحة واحدة، صفحة واحدة أخرى، قلب
صفحة أخرى، وهكذا.
إذا انتقلتُ سريعًا خلاله بضعف السرعة--
2، 4، 6، 8--
يمكنني فعل ما هو أفضل.
وهكذا فذلك الخط الأصفر الآن، تذكّروا، كان أكثر انخفاضًا على الرسم البياني.
إذا ألقيت نظرة على أي نقطتين، صفراء وحمراء،
تكون الصفراء أسفل الحمراء، ما يعني أنها تأخذ وقتًا أقل.
لكن هذا لم يكن صحيحًا تمامًا.
كان هناك خطأ واحد عندما كنت أبحث عن مايك بمعدل صفحتين في المرة.
ماذا كانت تلك المشكلة؟
أجل، قد يفوتني.
قد يحصل عن طريق الخطأ وجوده فيما بين صفحتين- ليس هذا بالأمر الجلل
لأنني يمكنني إصلاحه، لكن يتعين عليّ إصلاحه.
يتعين عليّ تطبيق ذلك المنطق الإضافي والرجوع للخلف على نحو مضاعف
لصفحة واحدة على الأقل إذا كنت أتنقل بسرعة كبيرة للغاية.
لكن بالطبع الخوارزمية النهائية- وبصراحة، كل حدسنا الأولي
ربما-- كانت هي خوارزمية فرّق تسُد، افتحه تقريبًا إلى المنتصف،
ثم انظر لأسفل، ثم انتقل يسارًا، وانتقل يمينًا،
وكرّر فقط تلك العملية عندما تصل المسألة إلى
هذا الجزء الكبير إلى هذا الجزء الكبير إلى هذا الجزء الكبير إلى هذا الجزء الكبير إلى مجرد ترك صفحة واحدة.
لذلك كل شيء كان يدور حول الفاعلية.
ولكن للوصول الى تلك النقطة كنا بحاجة للتعبير عن أنفسنا بشكلٍ أكثر دقة.
ولذلك أدخلنا الكود الزائف.
لا يوجد له تعريف رسمي.
يمكن أن يكون مثل الإنجليزية، ما يشبه الإنجليزية.
ويُقصد به تحديدًا أن يكون موجزًا ويوصل معنى النقطة.
وتذكّروا أننا، بطول الطريق، نُدخل مجموعة كاملة من المفاهيم،
العديد منها ربما قمتم بتجربته باستخدام لغة سكراتش، مثل التكرارات الحلقية
والشروط، والتعبيرات المنطقية، والمتغيرات، وما إلى ذلك.
وتلك كانت الكتل البنائية التي ظهرت من هذا النوع من الإثبات الوارد هنا.
لكن بصراحة، حتى في هذا الإثبات، في هذا الرمز الزائف،
كانت هناك مجموعة كاملة من الافتراضات.
إذا قرأت هذه التعليمات بمعدل واحدة في كل مرة
وأنت تمسك بدليل الهاتف في يدك،
فالاحتمالات هي أنك يمكنك تنفيذ هذا الرمز الزائف، هذه الخوارزمية.
ولكن ماذا يعني حقًا، على سبيل المثال، أن تفتح إلى منتصف دليل الهاتف؟
كل واحد منا لديه حدس لفهم ما يعنيه ذلك.
لكن بصراحة، إذا كنت تشرح ذلك
لطفل أو شخص يتعلم اللغة الإنجليزية أو أي لغة
لأول مرة، افتح إلى منتصف دليل الهاتف،
فيجب عليك ربما توضيح بعض الافتراضات.
حسنًا، هذا الشيء أمامكم يحتوي على 1000 صفحة، قطعة من الورق.
اقلب إلى الصفحة رقم 500، ودعونا نسمّيها المنتصف.
هذا من شأنه أن يصير مملاً على نحو سريع جدًا إذا كان كل واحد منا كبشر
يتحدث عند ذلك المستوى من التفصيل.
ولذا نحن نقوم بالتجريد باستخدام عبارات أكثر
تعميمًا مثل افتح إلى منتصف دليل الهاتف،
لكن ذلك يُعتبر تجريدًا.
وهو ليس دقيقًا تمامًا كالمثالي على الأرجح،
خاصةً بتلقين هذه الخوارزمية لمبتدئ أو لروبوت أو لجهاز كمبيوتر.
لكنه مفيد لأننا نستطيع حينئذ تكوين برنامج من 12 خطوة بدلاً من برنامج من 20 خطوة
بتفصيل أكثر من اللازم.
وعلى سبيل المثال، فقد كانت لدينا هنا بالكامل أيضًا التكرارات الحلقية والشروط الخاصة بنا
وهكذا، حتى نتصل بمايك.
ماذا يعني ذلك؟
حسنًا، إذا تخيلت أن الإنسان يعرف كيفية استخدام الهاتف،
فسيمضي الأمر دون ذكر.
ولكن إذا كان هو أو هي أيضًا بحاجة إلى برمجة لاستخدام الهاتف،
فيجب عليك أن توضّح-- ارفعها، اضغط على هذا الزر، اكتب
بهذا التسلسل من الأزرار، وهكذا.
لذا فالاتصال بمايك أيضًا يُعد تجريدًا.
لذلك فإن هذه التجريدات مفيدة، ولكن يمكن أن تكون في بعض الأحيان مزعجة،
خاصةً، إذا لم تكن دقيقًا بما يكفي لبرمجة الكمبيوتر بصورةٍ صحيحة.
ولرسم هذه الصورة، رأيتُ أنه يمكننا أن نبدأ بحماس قليل هنا.
أحضرتُ إفطارًا، إذا لم تكن قد أعددتَه تمامًا هنا أو هناك.
أحتاج فقط لاثنين من المتطوعين إذا شعرتم
بألفة الظهور على المنصة وعلى الإنترنت هنا.
دعوني نوعًا ما-- يوجد كثير من الأضواء هنا.
ماذا عن هناك في الناحية اليسرى وهنا في الأمام؟
أجل، هناك بالضبط.
أعتقد أنك رفعت يدك.
تعال هنا.
وبريان، هل تمانع في مساعدتنا هنا، أيضًا؟
تعال هنا.
إذا كنت ترغب في الإمساك بزمام الأمور هنا، فسأَدَعك تمضي قدمًا
وتقوم بالتبديل إلى برنامج آخر لأجلك.
ما اسمك؟
جان: جان.
ديفيد: جان، أنا ديفيد.
يسرني لقاؤك.
تفضل بالجلوس على المقعد في أقصى اليسار.
واسمك؟
آبي: مرحبًا، أنا آبي.
سعيد للقائك أيضًا.
في أقصى اليمين من فضلك.
إذن جان وآبي، هل تريدان أن تقولا نبذة بسيطة عنكما
بسرعة؟
جان: أنا جان.
أنا مواطن من ولاية ماساشوستس، وأخوض دورة علوم الكمبيوتر لأول مرة.
إنها المرة الأولى لي فيما يخص الترميز أو أي شيء.
أو أنا أفعل ذلك وأستمتع به كثيرًا.
ديفيد: جيد، سعيد بوجودك معنا.
وماذا عنك آبي؟
آبي: مرحبًا، أنا آبي.
أنا أخوض هذه الدورة باعتباري طالبةً في السنة الثانية، ولا أعرف شيئًا
عن أجهزة الكمبيوتر أو علوم الكمبيوتر.
لذا فربما أخوضها إحصاءً تلو الآخر.
ديفيد: حسنًا، جيد، سعيد بوجودكِ معنا أيضًا.
إذن أمامنا مجموعة كاملة من المكونات،
ونأمل أن نتمكن من بدء هذا الفصل الدراسي على مهل.
وإذا نجحنا في هذا، فسنقوم بالفعل بنقلة كبيرة سريعة هنا.
لكنّا كنا نظن أننا سنرجع إلى الجمهور الموجود هنا،
وسيقوم بريان بكتابة نصية لما نقوم به.
وكل ما نريد القيام به هذا الصباح هو فقط
إعداد ساندوتش من زبدة الفول السوداني والمربى، بتعليمة واحدة في كل مرة.
وكل واحدٍ منّا سينفذ فقط ما نسمعه.
كيف يبدو ذلك؟
حسناً، إذا كان هناك شخص يمكن أن يتطوع بالتعليمة الأولى وسيقوم بريان
بتدوينها.
الجمهور: افتح الخبز.
ديفيد: افتح الخبز هو ما سمعناه.
افتح الخبز هو أول تعليمة.
لذا كل واحدٍ منكم سينفذ فتح الخبز.
كلا، لا تنظر إليّ.
حسنًا، نحن نوعًا ما في الطريق الصحيح.
أعتقد أن آبي فعلتها بشكل أفضل بالتأكيد، لكن يمكن القول أننا فعلناها بشكلٍ صحيح.
لذا دعونا ننتقل إلى الخطوة الثانية ولنرَ ما إذا لم نستطع التحسن.
انزع لبابة الخبز.
مرحبًا بك في الفريق الآن.
رائع، حسنًا، الخطوة الثالثة.
أجل.
الجمهور: ضع قطعتين من الخبز على الطاولة.
ديفيد: ضع قطعتين من الخبز على الطاولة.
لا تضع الأطباق في الاعتبار.
حسنًا، الخطوة الرابعة.
الجمهور: قم بلفّ غطاء المربي حتى ينفتح.
ديفيد: قم بلفّ غطاء المربى حتى ينفتح.
شكرًا لك.
ما الخطوة الخامسة؟
أجل؟
الجمهور: ضع الغطاء جانبًا.
ديفيد: شكرًا لك.
ضع الغطاء جانبًا.
أخذتُ بعض الحريات لنفسي.
الجمهور: خذ السكين.
ديفيد: خذ السكين.
انزع ورقة غطاء المربى.
لا توجد أغطية لدينا.
هل نُدخل السكين في الزجاجة؟
من الأعلى.
أدخل-- الخطوة التاسعة.
الجمهور: أدِر يديك حتى تصل المربى إليك.
ديفيد: أدِر يديك حتى تصل المربى إليك--
حسنًا، الخطوة-- بسرعة--
10.
نعم، ما الخطوة العاشرة؟
الجمهور: اسحب السكين للخارج.
ديفيد: اسحب السكين للخارج.
حسنًا، الخطوة رقم 11.
اقلب جانب زجاجة المربى لأسفل على الخبز.
حسنًا. الخطوة رقم 12.
أي واحد، ما الخطوة رقم 12؟
نعم.
شكرًا لك.
الخطوة رقم 13.
اسكب المربى على الخبز.
جان: اسكب المربى--
ديفيد: اسكب المربى، المربى.
هل نسكبها كلها؟
حسنًا، أنتم الآن تلعبون معنا.
الخطوة رقم 14.
الجمهور: ضع المربى جانبًا.
ديفيد: ضع المربى جانبًا.
شكرًا لك.
15؟
التقط زبدة الفول السوداني.
الجمهور: افتح الغطاء.
ديفيد: افتح الغطاء.
شكرًا لك.
انزع الغطاء.
شكرًا لك.
الخطوة رقم 18؟
التقط السكين من الطرف الممسوح، واغرف.
اغرف.
الخطوة رقم 20؟
هل نضع زبدة الفول السوداني على الخبز؟
21؟
الجمهور: حرّك السكين من اليسار إلى اليمين.
ديفيد: حرّك-- حرّك السكين من اليسار إلى اليمين، من فضلك.
من اليسار إلى اليمين.
الخطوة رقم 22؟
الجمهور: ضع السكين جانبًا.
ديفيد: شكرًا لك.
23؟
الجمهور: ضع البرطمان جانبًا.
ديفيد: 24.
ماذا كانت تلك الخطوة؟
كُلْ الساندويتش.
حسنًا، أعتقد أننا--
رائعون، لماذا لا يأخذ كل منا قضمة؟
وعاصفة من التصفيق، رجاءً، لمتطوعينا.
شكرًا لكما.
آبي: هل تمانعين في أن آخذ بعضها للطريق؟
ديفيد: يمكنك أخذ البعض للطريق إذا أردت.
شكرًا لك.
إذن-- شكرًا لك، بريان.
حسنًا، أنا الآن بحاجةٍ إلى دقيقة.
شكرًا لكم.
يكفي أن نقول، أثبت هذا المثال بوضوح أكثر من
مثال دليل الهاتف أين تتواجد الافتراضات المعينة لدينا
وعمليات التجريد لدينا.
وبصراحة، كلها تقريبًا تعتبر مفيدة طوال الوقت.
وبالطبع، لقد عطّلنا الأمور بعض الشيء.
وأعتقد أن التعليمات كانت نوعًا ما تساعدنا في هذا الأمر هنا.
ولكن عندما يحين وقت البرمجة باستخدام لغة سكراتش وبالتأكيد باستخدام لغة C
بدءًا من هذا الأسبوع، لا يمكنك حقيقةً إجراء افتراضات عديدة بذلك العدد
بعد الآن لأنك، إذا لم تتعامل مع هذه الحالات الحرجة
وإذا لم تفكر فيما تعنيه تلك التعليمة،
فستحصل على كرة الشاطيء الدوّارة الشهيرة أو الساعة الرملية
التي تعرفها جيدًا على جهاز Mac أو الكمبيوتر الشخصي لديك.
سيتعطل البرنامج، وسيحدث خطأ ما
فقط لأنك تفتقد لبعض التحديد أو الدقة.
الآن نحن جميعًا ممتلؤون بزبدة الفول السوداني.
لذا وبمرور الوقت، سنكتشف أننا قادرون، بما يشبه إلى حدٍ كبير لغة سكراتش،
على إنشاء الكتل البنائية الخاصة بنا.
يمكنكم تذكر الأمثلة الصغيرة التي قمنا بها مع مثال السعال
عندما كنت أقوم بسعال 0 ثم سعال 1 وسعال 2
حيث كنت أصنع قطع اللغز الخاصة بي داخل لغة سكراتش.
كان هذا مفيدًا لأنه، عقب هذا المثال من الناحية النظرية،
لن أكون بحاجة مرة أخرى مطلقًا للتفكير أو القلق بشأن كيفية تنفيذ السعال.
يمكنني فقط استخدام ذلك التجريد.
لكن لا بد وأن يكون شخص ما قد نفذها، وفي بعض الأحيان يكون ذلك
على يد أشخاص آخرين جاؤوا قبلنا.
وفي أحيانٍ أخرى يكون هذا عملنا نحن.
إذن هذا لا يعني أن البرمجة ينتهي بها الحال لأن تكون مملة
لدرجة أن تضطر للإشارة إلى كل تفصيلة صغيرة،
لكن يتعين عليك أنت أو شخص ما القيام بذلك المستوى من الدقة على الأقل مرةً واحدة.
ومن الجيد بما فيه الكفاية في لغة سكراتش، قيام MIT "معهد ماساشوستس للتكنولوجيا" بمعظم هذا العمل الشاق لأجلك.
لقد كانت لدينا جميعًا الكتل البنائية التي سيتم باستخدامها
إعداد الرسوم المتحركة الخاصة بنا أو الألعاب أو العمل الفني أو ما شابه.
لكن وحتى ذلك الحين، ربما كان يتعين عليك توصيل عشرات من قطع اللغز
أو أكثر من ذلك للحصول على تلك الأساسيات لتقوم
بالشيء الذي أردتَ منها القيام به.
لذا سنبدأ اليوم في الانتقال من لغة سكراتش،
لغة البرمجة الرسومية هذه، التي في حين أنها تستهدف الطلاب الأصغر
سنًا، إلا أنها تعتبر مثالاً نموذجيًا لكثير من
المفاهيم ذاتها التي ستصبح الآن مرتبطة على مدار الفصل الدراسي.
لكننا اليوم بصدد تقديم لغة أقدم وأكثر تقليديةً والتي
تعتمد على النصوص فقط.
وبالتالي فهي أكثر قوة بكثير.
لكن من الوهلة الأولى، ستبدو في الواقع مبهمةً بدرجة أكبر بكثير.
في الواقع، بدلاً من كتابة الأصفار والواحدات ابتداءً من اليوم،
سنكتب بدلاً منها شيئًا مثل هذا.
الآن إذا لم تكن قد قمتَ بالبرمجة من قبل، ستتمثل الاحتمالات، لأول وهلة،
في أن هذه اللغة تبدو غامضةً للغاية، وسيكون هناك
كثير من الرموز بداخلها، وعلامات ترقيم من لوحة المفاتيح.
ربما تكون هناك بعض الكلمات المألوفة الشبيهة باللغة الإنجليزية.
وبصراحة، حتى بعد تنفيذ لغة سكراتش يحتمل لأي شخص، حتى مع عدم وجود خلفية سابقة،
أن يخمّن فيما يتعلق بما يفعله هذا البرنامج المكتوب
بهذه اللغة الأخرى المسمّاة لغة C عندما تقوم بتشغيله.
فهو يقوم فقط بأمر print "طباعة" لجملة hello world.
افترض الآن أنه يوجد قدر جدير بالاحترام من التجاوزات من ناحية بناء الجملة.
توجد لديك مجموعة من الأشياء يتعين عليك كتابتها لتجعل
هذا البرنامج يقوم بما تريد منه القيام به.
لكن في نهاية المطاف، هذا هو كل ما سيفعله.
وهذا يعتبر من بين أبسط البرامج
التي سنقوم بإضافتها إلى قطع اللغز لدينا، إذا
جاز التعبير، اليوم وسنطّلع على بعض من تلك المفاهيم ذاتها
التي رأيناها في المرة الماضية أيضًا.
إذن دعونا مع ذلك نقوم بهذا أولاً.
دعوني أتوقف لدقيقة للمقارنة بين لغة سكراتش ولغة C
لأن العبرة الأهم ليومنا هذا
ستكون كذلك، حتى لو لم يبدُ بناء الجملة واضحًا للغاية--
وبصراحة، حتى لو كانت دقائقك أو ساعاتك الأولى
في كتابة التعليمة البرمجية الخاصة بك في لغة C أمرًا محبطًا لأنك، أوه،
اللعنة، أخطأتَ بإهمال فصلة منقوطة أو، أوه،
وضعتُ زوج أقواس في المكان الخطأ.
توجد كثير من هذه العوائق الغبية المتعلقة ببناء الجملة
التي تجعلك تشعر في كثير من الأحيان أنك لا تصل إليها حقيقةً.
لكن ذلك ليس هو الشيء المهم.
فكثير من بناء الجملة يعد هو الأقل أهمية.
فذلك ليس مثيرًا للاهتمام من الناحية الفكرية أساسًا على الإطلاق.
لذا حاول أن تنظر أبعد من ذلك، وحاول أن تطمئن للحقيقة التي مفادها
أن المبادئ هي التي ستكون مهمة.
وبصراحة، بمجرد تنشيط ذاكرة العضلات وتدريبها، ستكون جميع الأشياء الأخرى
التي كانت في البداية ستمثل إحباطًا عرضيًا،
ستبدأ توًا في التلاشي عندما تبدأ في رؤية هذا
على ما هو عليه وليس لبناء الجملة فقط
الذي تراه لأول وهلة.
لذا فهذا يعني أن البرنامج على اليمين في لغة C
يكافئ ما فعلناه قبل أسبوع واحد مع قطعتي اللغز في لغة سكراتش.
الآن لن يكون هناك علم أخضر على جهاز Mac أو جهاز الكمبيوتر لديّ
كلما تحركنا للأمام حيثما يمكنك فقط النقر.
سنقوم بتشغيل هذه البرامج بطريقة مختلفة قليلاً،
ولكن هذا كل ما تفعله التعليمات البرمجية على اليمين.
إنها مكافئة للتعليمة البرمجية على اليسار.
لذلك دعونا نفعل ذلك مجددًا ومرة ​​أخرى فقط لعدد قليل من تلك المفاهيم
من المرة الماضية، ومن ثم سنبدأ في كتابة بعض البرامج الخاصة بنا.
إذن كان هذا مثالاً، هذه الكتلة الأرجوانية، تمثل أي مفهوم في البرمجة؟
أجل، دالّة.
إذن فقد كانت عبارة عن فعل.
لقد كانت عبارة عن إجراء، وسنطلق على تلك الإجراءات عامةً اسم الدوالّ.
ويكون لها فقط أدائية مدمجة فيها.
إذن كيف نقوم بفعل ذلك في لغة C؟
حسنًا، ربما تذكرون منذ دقيقة فقط،
أنه نظرًا لأن أحد سطور التعليمة البرمجية كان ممثلاً لهذا،
فقد كان لها بعض من بناء الجملة هذا.
لذا وفي الواقع، إذا كان عليّ أن أترجم الكتلة
الموجودة على اليسار في لغة سكراتش إلى التعليمة البرمجية المكافئة في هذه اللغة الأخرى المبنية على
النص المسمّاة لُغة C، فسأبدأ بكتابة كلمة print
ثم أفتح الأقواس ثم أغلق الأقواس.
وتلك الأقواس تمثل الشكل البيضاوي، الشكل البيضاوي الأبيض الموجود على اليسار،
الذي كتبنا بداخله hello world من قبل.
الآن في لغة C، لا يعتبر الأمر حرفيًا كذلك.
الدالّة، أو الفعل، لا تُسمى في الواقع print.
بل تُسمى printf، ويرمز الحرف F إلى formatted "منسق".
وهذا يعني فقط أنك في لغة C يمكنك بالفعل
تنسيق النص الموجود لديك بطرق مختلفة.
لذلك سنرى قريبًا، وسيتضح
أنك لا تكتب فقط hello world بين تلك الأقواس
مثلما فعلنا في لغة سكراتش.
يتعين عليك أيضًا أن تحيطها بعلامات الاقتباس المزدوجة في لغة C.
هذا ليس بالأمر الجلل، لكن هذا شيء لم يكن عليك فعله سابقًا.
لكن في لغة C، أنت أيضًا سترغب عمومًا
في أن تكون محددًا بدرجة فائقة للكمبيوتر.
وعندما تريد من مؤشر النص على الشاشة
أن ينتقل لأسفل إلى السطر التالي، فستحتاج لتخبر الكمبيوتر بذلك
بكتابة /n "خط مائل عكسي وحرف n" حرفيًا.
لن يرى الشخص /n "خطًا مائلاً عكسيًا وحرف n".
بل سيرى في الواقع المؤشر ينتقل
إلى السطر التالي من الشاشة كما هو الحال في برنامج Google Docs
أو في برنامج Microsoft Word أو ما شابه.
لكن هذا يدلّ فقط على الدقة التي
تحتاج إليها عندما تتحدث إلى جهاز كمبيوتر على هذا المستوى
وليس فقط مع قطع اللغز.
ومن ثم شيء أخير-- وقد أشرتُ إليه سابقًا
لأنه يمثل مصدر الإزعاج لكثير من المبرمجين في المراحل الأولى.
يجب أن تنتهي معظم سطور التعليمة البرمجية في لغة C بفصلةٍ منقوطة.
وذلك هو نوع التعليمة البرمجية المكافئ للنقطة في جملة باللغة الإنجليزية
أو ببعض لغات أخرى.
إذن هذه هي.
لقد استغرق الأمر منا قليلاً من الوقت لنطور ذلك.
لكن هذا هو كل ما فيه.
الفكرة على اليسار من قول شيءٍ ما هي نفسها في لغة C
كطباعة شيءٍ ما باستخدام هذه الدالّة التي تُسمى printf.
وقبل أن أمضي قدمًا مع بعض المقارنات الأخرى،
هل توجد أي أسئلة حول هذه الترجمة بالذات؟
الجمهور: كيف تكتب /n "الخط المائل العكسي n"؟
ديفيد: كيف تكتب /n "الخط المائل العكسي وحرف n"؟
هذا جيد، لذا بالتفكير في المستقبل، سيبدو الأمر صعبًا أن يظهر للمستخدم حرفيًا
/n "الخط المائل العكسي وحرف n".
حسنًا، يتضح أن هذا / "الخط المائل العكسي"، نظرًا لأنه ليس
حرفًا شائعًا جدًا، يستخدمه عالم البرمجة
كما يُطلق عليه حرف إلغاء.
إنه الحرف الذي تستخدمه عندما تريد إلغاء معلومات وإظهارها
بطريقة مختلفة قليلاً.
لذا فالطريقة التي ستُظهر بها حرفيًا للشخص
/n "خطًا مائلاً عكسيًا فعليًا وحرف n" هي أن تقوم فعليًا في التعليمة البرمجية لديك
بكتابة //n "خط مائل عكسي خط مائل عكسي حرف n" لأن الخط المائل العاكسي الثاني يمثل
أن تقول، تعامل مع الحرف التالي بشكل خاص
وأظهره فعليًا للشخص.
وهناك أمثلة أخرى من هذا القبيل.
إذن ماذا عن هذه؟
هل هذه الكتلة البرتقالية كانت تعتبر مثالاً لمفهومٍ واحد في لغة سكراتش؟
أجل، إذن كانت هذه بمثابة متغير، مثل x و y في الجبر.
لقد كانت هذه الكتلة مجرد عنصر نائب للبيانات، وكان بإمكانك تخزين الأرقام.
يتضح أيضًا أنه يمكنك تخزين الكلمات.
ويمكنك تخزين أشياء أخرى أيضًا بلغات أخرى.
إذن سنقوم بذلك في لغة C.
سنقول، حرفيًا، أن اسم المتغير الذي نريده-- على سبيل المثال، هو
counter "عداد".
لكن يمكننا أن نطلق على أي شيء نريده--
أنه مساوٍ للصفر إذا حددنا من البداية أنه يساوي الصفر.
لكن لغة C تدقق في التفاصيل بدرجة أكبر قليلاً.
فيجب عليك أيضًا إخبار الكمبيوتر، أن نوع المتغير الذي أريده
يكون على وجه التحديد لعدد صحيح، والإ يتم اختصاره كـ int.
لذلك عليك أن تخبر الكمبيوتر مسبقًا بنوع البيانات
الذي ستخزنها عليه.
وخمّن.
يجب عليك إنهاء الفكرة على لغة C. ما المزيد الذي نحتاج إلى إضافته إلى--
أجل، فقط فصلة منقوطة.
وهذا كل شيء.
يبدو أنه أكثر غموضًا قليلاً، لكن الفكرة هي نفسها في الأساس.
إذن ماذا لو أردنا القيام بهذا في لغة سكراتش؟
غيّر العداد بمعدل 1-- وهذا كان مكافئًا لزيادة أو إضافة 1
إلى counter "العداد".
حسنًا، دعوني أمضي قدمًا وأقترح أنكم قد تقومون بذلك تحديدًا
في لغة C. اضبط العداد ليساوي أي عداد حاليًا زائد 1.
يبدو أن ذلك هو الحدس الصحيح.
والآن لاحظ، ما يعتبر أساسًا للملاحظة هنا هو
أن علامة يساوي هذه لا تعني أن العداد يساوي العداد زائد 1
لأن ذلك تحديدًا لا يبدو ممكنًا.
إذا اخترت أي قيمة للعداد، مثل الرقم 1،
حسنًا، واحد بالتأكيد لا يساوي 1 زائد 1، وهو ما يساوي 2.
و1 لا يساوي 2، ويمكنك التوصل
إلى عدد لا نهائي من المقارنات غير الصحيحة المزعجة.
لذا فعلامة يساوي في لغة C، كمثل كثير من اللغات التي نراها في الصف،
تعني في الواقع التعيين.
انسخ القيمة الموجودة على اليمين إلى القيمة الموجودة على اليسار.
إذن قم بضبط العداد المساوي لأي عداد يساويه زائد 1.
ماذا؟
يجب علينا إنهاء الفكرة.
لذا نحتاج إلى فاصلة منقوطة.
لا أعتقد أننا بحاجة لإعادة ذكر int، ولماذا قد يُستخدم ذلك الاختصار؟
أجل، لقد أخبرتُ الكمبيوتر بالفعل أنه عدد صحيح.
فلا داعي أن تكرر نفسك بذكر int مرة أخرى،
مفترضًا في هذا السياق، أنه حتى على الرغم من أننا ننظر إليه على الشريحة تمامًا،
إلا أنه قد تم إنشاؤه بالفعل من قبل تمامًا كما فعلتَ
مع لغة سكراتش بقول make a variable "اجعله متغيرًا".
لذا يتضح أنه يمكنك أن تكون موجزًا أكثر من ذلك بقليل في لغة C وكثير من اللغات.
إذا وجدتَ كتابة هذا مملة قليلاً-- وأنه مطنب قليلاً.
فهو مجموعة من ضغطات المفاتيح.
يمكنك بالفعل اختصارها باستخدام هذا فقط.
لذا فعلامات زائد يساوي هي مجرد تجميل لغوي، كما سيقول المبرمج.
إنها فقط مجرد ميزة خيالية لطيفة تتيح لنا كتابة كلمات أو أحرف أقل
لكنها تفعل الشيء نفسه.
وبصراحة، يمكننا القيام بما هو أفضل قليلاً.
وإذا ما أخذتَ كائن PCS، فربما تكون قد رأيتَ هذا في لغة Java كذلك.
يمكنك أيضًا تبسيط هذا أكثر فقط إلى عداد زائد زائد فاصلة منقوطة.
إذن هذا هو-- كلها متساوية.
هذا أكثر فاعلية بقليل.
وكلما وصلتَ لبرمجة أكثر راحة،
مع الوضع في الاعتبار أن ضغطات المفاتيح توفر لك الوقت فقط.
الآن كان هذا بالطبع مثالاً على ما يوجد على النقيض في لغة سكراتش؟
أجل، لقد أطلقنا على هذا اسم شرط.
وكان يتضمن تعبيرًا منطقيًا كنا نطرح سؤالاً عنه.
في هذه الحالة، يبدو أننا نسأل في لغة سكراتش هل x أقل من y، وإذا كان الأمر كذلك،
فاذكر الإجابة على الشاشة.
إذن كيف يمكننا ترجمة هذا لمشاهدته؟
حسنًا، من الواضح أننا بكل بساطة ترجمنا هذا نوعًا ما بشكل حرفي.
لقد شاهدنا تقريبًا كل الكتل البنائية حتى الآن،
لكن يجب علينا أن نقدم الآن شيئًا جديدًا نوعًا ما هنا.
لاحظوا أن سطر printf تقريبًا مطابق لما
استخدمتُه من قبل لجملة hello world تحديدًا.
لقد قمتُ بوضوح فقط بتغيير الكلمات فيها، لكن ما يزال /n "الخط المائل العكسي وحرف n" موجودًا لديّ.
ما تزال علامات الاقتباس موجودة لديّ، ولا تزال الفاصلة المنقوطة موجودة.
لذا فالباقي كما هو بالمثل.
الآن تصبح if "إذا" جديدة، لكن هذه ترجمة حرفية.
تسمّيها لغة سكراتش if "إذا".
وتسمّيها لغة C أيضًا if "إذا".
والشيء الوحيد الإضافي الذي تحتاجه في لغة C
هو الأقواس حول التعبير المنطقي.
وذلك هو ما يحل محل الكتلة الخضراء الصغيرة هناك.
ثم بافتراض أن x وy هما بالفعل متغيران
قمنا بإنشائهما سابقًا، فيمكنك فقط مقارنتهما مثل هذا
ويمكنك أيضًا استخدام رمز أكبر من والرموز الأخرى للمقارنة أيضًا.
ولكن يوجد شيء مثير للاهتمام قليلاً، ومعظمنا
غالبًا ليست لديه فرصة حتى لاستخدام هذه المفاتيح الموجودة على لوحة المفاتيح.
فالأقواس المتعرجة، في لوحة مفاتيح الولايات المتحدة كثيرًا ما تكون
موجودة بأعلى اليمين فوق مفتاح Enter.
وهذه الأقواس مكافئة تمامًا لتلك الخاصة بلُغة C من هذا الشكل.
لاحظ أن معظم الكتل الصفراء في لغة سكراتش
كان لها هذا التضمين أو هذا الشكل التضميني لها.
يمكنك محاكاة ذلك في لغة C بوضع ما يطلق عليه قوس متعرج مفتوح
ثم قوس متعرج مغلق.
إذن فتلك هي نفس الفكرة تمامًا.
الآن كملاحظة جانبية، فأنت لستَ بحاجة من الناحية الفنية إلى هذه الأقواس المتعرجة.
إذا كانت لديك فقط طبقة مثل هذه، فيمكنك
حذفها لأنك ربما تراها على الإنترنت أو الكتب المدرسية.
لكننا سنقوم فقط برسمها من أجل التناسق بحيث تبدو التعليمة البرمجية بلغة C
دائمًا كهذا.
ماذا لو أردت التعبير عن هذا، رغم ذلك؟
إذا كانت x أقل من y، فقل إن x أقل من y، وإلا قل إن x ليست أقل من y.
حسنًا، من الواضح أن هذا متطابق تقريبًا.
أول أربعة أسطر، تمامًا هي نفسها كما سبق.
لكن من الواضح أنك في لغة C، يمكنك أن تقول حرفيًا else "وإلا"
بعد إغلاق ذلك القوس المتعرج.
ثم يمكنك بدلاً من ذلك طباعتها كما تريد قولها.
لذا فهذا يشبه مفترق الطرق.
إذا سلكت طريقًا، فقل هذا.
وإذا سلكتَ الطريق الآخر، فقل هذا الشيء الآخر.
هل توجد أي أسئلة حول هذه المقارنات حتى الآن؟
أجل.
الجمهور: هل يجب وضع القوس الأول في نفس السطر الموجود فيه if "إذا"؟
ديفيد: سؤال جيد حقًا.
هل يمكنك أن أو هل تقوم بوضع القوس المتعرج في نفس السطر الموجود فيه if "إذا"؟
يمكنك ذلك، وسنتحدث عن ذلك خلال الأسبوعين المقبلين،
إنها مسألة أسلوب.
هناك طرق مختلفة يمكنني التعبير بها عن هذه التعليمة البرمجية نفسها.
بصراحة، يمكنني كتابة كل هذه التعليمة البرمجية دون مسافات أيًا كانت.
في الواقع، فقط لإيضاح هذه النقطة، إذا مضيتُ قدمًا وقمتُ بفتح محرر نصوص
بسيط هنا--
ليس للبرمجة فعليًا، لكن فقط لكتابة شيء ما--
فيمكنني بالفعل القيام بشيء مثل هذا، إذا كانت x أقل من y.
ثم أمضي قدمًا وأقوم بطباعة x أقل من y خط مائل عكسي n فاصلة منقوطة قوس
متعرج else "وإلا" طباعة وهكذا--
غير قابلة للقراءة تمامًا في نهاية المطاف أو غير قابلة للدعم،
خاصةً عندما تصبح التعليمة البرمجية معقدة.
لكن المسافة لا تفرق كثيرًا مع الكمبيوتر،
لكنها تفرق مع الشخص.
وكما أشرتم إليه سابقًا في بعض اللغات،
فمن المتعارف عليه بالفعل هو القيام بهذا، حيث تُبقون بالفعل
القوس المتعرج على نفس السطر.
وبالفعل، قد ترى الكتب المدرسية تقوم بذلك أيضًا.
حتى بعض الناس سيفعلون هذا.
هذه كلها قصة طويلة، ولكنها مسائل صغيرة كأسلوب.
في دورة CS50، في الأسابيع الأولى لهذا الصف،
سنؤكّد على أن يتبع الجميع نفس الأسلوب بحيث
يكون لدينا بعض الأساس للمقارنة عليه.
لكن في النهاية، هذا نوعًا ما هو الشيء
الذي، يشبه الكتابة بلغتكم الإنجليزية أو أي لغة
كثيرًا ما تكتبون بها، ولديكم ذوق في الأسلوب وذوق لغوي تجاههها.
التعليمة البرمجية كذلك أيضًا.
أي أسئلة أخرى؟
أجل.
الجمهور: عندما تنشئ متغير العداد،
فهل يجب أن تقول ما الذي يساويه،
أم يمكنك فقط قول int counter section "قسم عداد int"؟
ديفيد: سؤال جيد حقًا.
عندما تقوم بإظهار متغير، أو إنشاء متغير،
فهل يجب عليك تعيينه مساويًا لشيء ما مباشرةً؟
إجابة قصيرة، لا.
وسنرى أمثلة على ذلك قريبًا، حيث يمكنك بالفعل
أن تقول أعطني متغيرًا اسمه counter "عداد"، لكن لا تقم فعليًا
بتعيينه مساويًا لقيمة ما.
سنعود لذلك بعد قليل.
إذن ماذا لو أردنا إضافة هذا المنطق؟
بصراحة، في لغة سكراتش، يبدو الأمر في البداية جارفًا قليلاً.
لكن هذا هو مجرد مفترق طرق ثلاثي الاتجاهات.
إذا كانت x أقل من y، فقل ذلك، وإلا إذا كانت x أكبر من y،
فقل ذلك، وإلا إذا كانت x تساوي y، ثم امضِ قدمًا وقل أنهما متساويان.
وفي لغة C، يمكننا أيضًا القيام بهذه الترجمة بشكل مباشر نوعًا ما.
في الواقع، الآن هذه الأسطر الثمانية الأولى من التعليمة البرمجية
متطابقة مع ما قبلها عدا هذا السطر الأوسط
هنا حيث أقوم بإضافة تعبير منطقي ثانٍ.
هل x أكبر من y؟
ثم يصبح لديّ هذا الشرط الثالث، وإلا، إذا كانت x تساوي y.
لكن يبدو أنه قد يكون هناك خطأ مطبعي، أو شيء غريب هنا.
إذن هل يظهر أي شيء؟
أجل.
لدي علامة يساوي مزدوجة، والتي ربما تكون مجرد خطأ مطبعي
من جانبي، لكن من الواضح أنها ليست كذلك.
إنها متعمدة.
لكن لماذا؟
هذا يشبه أول مثال لدينا والخاص بسؤال أين تقوم لغة سكراتش بالفعل
بالربط إلى لغة C بشكل مثالي؟
الجمهور: حسنًا، لأن علامة يساوي تشبه عملية تعيين.
لذا فإن القيام بعدّ علامة يساوي يؤدي بفعالية لتعيينه في حالة يساوي--
ديفيد: بالضبط.
لقد قررنا منذ لحظات كبشر-- أو في الواقع، منذ سنوات-- أن علامات يساوي
ستكون بالفعل في سياق لغة C بمثابة عملية تعيين-- بنسخ
القيمة من اليمين إلى القيمة في اليسار.
ولذا فنحن نوعًا ما وضعنا أنفسنا في موقف صعب.
نحن ما زلنا كبشر، وكمبرمجين، نرغب في أن نكون
قادرين على التعبير عن فكرة التساوي والمقارنة.
لكن إذا كنا بالفعل قد استخدمنا علامة يساوي لعملية تعيين،
فسنحتاج إلى نمط آخر من الرموز لتمثيل التساوي.
وكما هو واضح، فقد اختار البشر علامتي يساوي اثنتين بدلاً من ذلك--
لذا فهي مختلفة قليلاً عن لغة سكراتش.
وسبب قيام لغة سكراتش بذلك بهذه الطريقة هو أنك لا ترغب حقيقةً
في أن تضطر للدخول في تلك التعقيدات بالتأكيد
عندما يكون عمر الجمهور المستهدف 8 سنوات فقط
يتعلمون البرمجة لأول مرة.
فهذا ليس مهمًا أو ليس مهمًا حقيقةً بالنسبة لنا.
لكن بالنسبة لنا، سيكون هناك فرق منطقي
لأن السلوك سيصبح خاطئًا إذا استخدمنا الشيء الخاطئ.
إذا كان لدينا علامة يساوي واحدة، فيمكننا حرفيًا تغيير x لتكون مساوية لـ y
بدلاً من مجرد مقارنتها.
هل كانت هناك يد مرفوعة بسؤال؟
أجل.
الجمهور: فقط سؤال سريع.
إذن إذا أردت التعبير عن أكبر من أو يساوي،
فهل تكتب أكبر من أو يساوي؟
ديفيد: سؤال جيد.
إذا أردت التعبير عن أكبر من أو يساوي، فكيف يمكنك القيام بذلك؟
من الواضح أن هناك طرقًا للقيام بذلك.
وإذا مضيتُ قدمًا وأعطيتُ فقط لنفسي مكانًا للرسم هنا للحظة،
فيمكنك بالفعل إجراء تعيين أصغر من أو يساوي أو أكبر من أو يساوي.
لا توجد طريقة على لوحة المفاتيح النموذجية لوضعهما فوق بعضهما البعض
كما قد تذكرونها في الرياضيات.
أنت فقط تضعهما بجانب بعضهما.
حسنًا، على حسب.
أريد علامة يساوي المزدوجة هنا لأنني
أريد أن أتحقق بشكل صريح من هذه الحالة الثالثة وأقول إن x مساوية لـ y.
إذن ذلك هو هدفي.
لكن من الناحية المنطقية، هذا ليس ضروريًا.
دعونا نصمم البرنامج بشكل أفضل قليلاً.
كم عدد الحالات المتاحة هناك عند مقارنة رقمين صحيحين، x
وy، من حيث أكبر من أو أقل من أو يساوي؟
حسنًا، أنا أجبتُ نوعًا ما عن السؤال للتوّ، أليس كذلك؟
ثلاثة.
ممتاز!
توجد ثلاث سيناريوهات-- x إما أنها أقل من أو أكبر من
أو تساوي.
ومن الصعب عليّ التفكير في سيناريو رابع.
لذا هل أنا بحاجة لهذا القدر من التحديد؟
ما الذي يمكنني فعله لأحقق لنفسي أمثلية طفيفة،
بتحسين التعليمة البرمجية نوعًا ما لأوفر لنفسي
قليلاً من الوقت في كتابتها وربما حتى قليلاً من الوقت
للكمبيوتر لتشغيلها؟
أجل.
الجمهور: لستَ بحاجة للشرط الأخير.
ديفيد: أجل، أنا لستُ بحاجة للشرط الأخير لأنه،
إذا اتفقنا جميعًا من الناحية المنطقية أن x إما أنها أقل من y أو أكبر من y
أو ربما تساوي y، حسنًا، فإذا كانت هناك فقط حالة ثالثة وأخيرة والتي
يمكن أن تكون الحالة المسماة لديّ باسم else "وإلا".
اجعل تلك الحالة فقط هي المسماة باسم الحالة الافتراضية.
وفي الواقع، حتى بالرغم أن هذا هو ما سيطلق عليه أغلب الناس
مسمى أمثلية مفرطة، فإنك توفر بعض الوقت للكمبيوتر.
لأنك بافتراض أن x في الحقيقة تساوي y
ولكل منهما قيمة العدد 1.
فهل 1 أقل من 1 عندما يتم تنفيذ هذا السطر من التعليمة البرمجية؟
نعم أم لا؟
لا، بالطبع لا.
1 ليس أقل من 1.
لذلك لن يتم تنفيذ هذه التعليمة البرمجية.
لكن يتم تقييم التعبير المنطقي، إذا جاز التعبير.
يتم طرح السؤال.
هل 1 أكبر من 1؟
لا، ولذلك لا يتم تنفيذ هذه التعليمة البرمجية، ولكن يتم تنفيذ هذا التعبير المنطقي.
لذا فقد استغرقنا تحديدًا خطوة أخرى أو ثانية أو بأي طريقة يكون الكمبيوتر أسرع بها.
هل 1 يساوي 1؟
أجل، إنها كذلك.
لذا يقوم هذا بالطباعة بالفعل.
لكن بالنسبة للنقطة الخاصة بك، فلا حاجة لطرح ذلك السؤال.
وفي الواقع، لقد قمتَ بالزيادة بعامل 50%
من عدد الأسئلة التي تطرحها.
لذلك فقد أهدرتَ القليل من الوقت.
الآن كملاحظة جانبية، فإن أجهزة Mac وأجهزة الكمبيوتر الشخصي والهواتف لدينا
في هذه الأيام، أعني، مرة أخرى، أننا نقوم بتشغيلها بسرعة ترددية
تقارب 1 غيغاهرتز، أي مليار من الأشياء كل ثانية.
إذن من الناحية العملية، من يهتم إذا قمتَ بطرح هذا السؤال الثالث؟
وبصراحة، فإن جعلت تعليمتك البرمجية قابلة للقراءة بدرجة أكبر أو لزميلك في التدريس
أو لزميل أو لصديق يعمل على البرنامج لأجلك،
فذلك أمر رائع.
وإذا كانت أكثر وضوحًا من التعليمة البرمجية الجارية، فاترك الأمر على هذا النحو.
لكن هذه هي أنواع قرارات التصميم التي سنقوم بها الآن.
ويمكن القول إن هذا الإصدار من لغة سكراتش وهذا الإصدار من التعليمة البرمجية بلُغة C
تم تصميمهما فقط بشكل أفضل قليلاً
بسبب عدم وجود داعٍ لكتابة تعليمة برمجية أكبر مما تحتاجه للتعبير عن الفكرة ذاتها.
إذن ماذا عن هذا؟
كان هذا تكرارًا حلقيًا في لغة سكراتش.
كان هذا بمثابة تكرار حلقي لا نهائي لأنها كانت تقول باستمرار hello world.
الآن في لغة C، تتم ترجمة هذا على نحو أقل مباشرة قليلاً.
من الواضح أن لغة c تستخدم الكلمة الأساسية while "بينما".
لذا لا توجد كلمة أساسية forever "باستمرار" في لغة c، ولكن توجد الكلمة while "بينما".
وبالطبع، سأستخدم الأقواس المتعرجة--
الأقواس المتعرجة، الأقواس المتعرجة لتشمل سطور التعليمة البرمجية التالية.
سيكون سطر التعليمة البرمجية الذي أريدها بداخله هو مجرد سطر printf آخر.
وذلك هو نفسه تمامًا كما كان من قبل، لكن هذا ليس كافيًا لمجرد قول while "بينما".
من الواضح أن كلمة while "بينما" تريد منك طرح سؤال عليها كل مرة
يقوم فيها التكرار الحلقي بالتنفيذ.
وسيتحقق من ذلك السؤال.
وإذا كانت الإجابة هي نعم، فسيقوم بتشغيل التكرار الحلقي.
لكن إذا كانت إجابة السؤال المطروح في لغة C دائمًا هي لا أو خاطئة،
فلن يقوم بتنفيذ التعليمة البرمجية وسيقوم فقط
بالانتقال إلى أي من السطور الأخرى في التعليمة البرمجية لأسفل في الملف.
لذا في لغة C، ستحتاج بالفعل إلى زوج من الأقواس بعد الكلمة الرئيسية while "بينما".
وبعد ذلك ستحتاج إلى طرح سؤال.
ستحتاج إلى طرح سؤال مثل، هل x أقل من y
أو سؤال مثل هل x أكبر من y أو هل x تساوي y.
لكن لا تنطبق أي من تلك الاحتمالات لأن الغرض الإجمالي
لكتلة سكراتش هذه هو القيام حرفيًا بشيء ما باستمرار.
إذن ما هو السؤال الذي يمكننا طرحه لتكون الإجابة دائمًا صحيحة؟
هل 1 يساوي 1؟
يمكننا استنباط سيناريو اعتباطي لكنه صحيح جدًا كمستوفٍ للناحية الرياضية.
يمكننا فقط قول إن 1 يساوي يساوي 1.
لكن من الواضح أنه يمكنك أيضًا أن تكون موجزًا لأنه يوجد في لغة C
زوج من الكلمات الأساسية، إحداهما true "صحيحة"، والأخرى false "خاطئة".
وأن الكلمة true "صحيحة" بحكم تعريفها تكون صحيحة دائمًا،
وأن الكلمة false "خاطئة" بحكم تعريفها تكون خاطئة دائمًا.
لذا فأنت لا تحتاج إلى استنباط فكرة ما اعتباطية لكنها صحيحة
مفادها هل 1 يساوي يساوي 1 أو هل 50 تساوي تساوي 50.
أنت لا تحتاج إلى مجرد التوصل إلى حل ما اعتباطي.
يمكنك حرفيًا فقط قول صحيحة لأن الكلمة الأساسية true "صحيحة" لا تغير القيمة مطلقًا.
لذلك حتى بالرغم من أن هذا يبدو غريبًا قليلاً،
فإنها الطريقة التي تستحث بها شيئًا ما لكي يحدث باستمرار.
لقد طرحتَ نفس السؤال مرة أخرى وتفترض أن السؤال دائمًا
له نفس الإجابة true "صحيحة".
هل هناك أي أسئلة حول هذا الجزء؟
نعم، في الخلف.
الجمهور: هل المسافات مهمة؟
هل يمكنك حذف المسافة بين y و0؟
ديفيد: سؤال جيد.
هل المسافات مهمة؟
إجابة مختصرة، لا، ليست في هذه الحالة.
في الواقع يمكنك حذف جميع المسافات هنا
عدا المسافة الموجودة في العبارة باللغة الإنجليزية،
وستظل من الناحية الوظيفية صحيحة.
يمكنك حتى إضافة مسافات في أي مكان تريده.
يمكنك جعل هذه أطول بالضغط على مفتاح Enter لعدة مرات،
وعلى مفتاح tab لعدة مرات، وعلى مسافات حول الكلمة true "صحيحة".
جميع الأمثلة التي سأعرضها هنا اليوم والتي ستشاهدونها في الأسابيع المقبلة
هي أفضل طريقة للقيام بالأشياء لأنها أكثر قابلية للقراءة.
لكن مرة أخرى، كلما أصبحت أكثر اعتيادًا على التعليمة البرمجية
أو إذا تعرضتَ لتجربة ما سابقة،
فقد تكون لديك بالفعل آراؤك الخاصة.
وبصراحة، فهذه مجرد مناقشة عقائدية
بين المبرمجين، وهي الطريقة الصحيحة لكتابة التعليمة البرمجية الخاصة بك.
وهذا جيد.
فبمجرد اعتيادك، طالما أنك متسّق في عملك فهذا يعتبر أهم شيء.
لستَ بحاجة للتمسك برأي شخص أو بآخر.
إذن كيف تعمل هذه التعليمة البرمجية منطقيًا؟
حسنًا، أول شيء سيقوم به جهاز الكمبيوتر أو جهاز Mac أو الكمبيوتر الشخصي لديك أو هاتفك
أو أي شيء، سيقوم بطرح السؤال.
حسنًا، صحيح.
حسنًا، تكون true "صحيحة" دائمًا صحيحة.
إذن سيشرع في تنفيذ سطر التعليمة البرمجية.
لكن بعد قيامه بهذا، لأن ذلك هو مجمل التعليمة البرمجية الموجودة
بين الأقواس المتعرجة، ويمكن أن تكون لدينا مزيد من الأسطر.
هذه مجرد برامج قصيرة.
سيقوم الكمبيوتر بالتحقق، حسنًا، هل true "صحيحة" ما تزال صحيحة.
أجل.
لذا سيقوم بتنفيذها مرة أخرى.
ثم سيطرح السؤال مرة أخرى.
هل true "صحيحة" ما تزال صحيحة؟
نعم، لذا سيقوم بتنفيذ التعليمة البرمجية مرة أخرى،
وسيكرر هذا حرفيًا باستمرار.
لكن ماذا لو كنت لا تريد تكرار أي شيء باستمرار؟
ماذا لو كنت تريد فقط تكرارها 50 مرة؟
لن تدعك لغة سكراتش تفكر بعناء بشأن هذا.
فالأشخاص يفهمون فقط كيفية الاستمرار في متابعة عدّ الأرقام 1، 2، 3، 4، 5، والاستمرار
بطول الطريق وصولاً إلى 50 ثم يتوقفون.
ذلك أمر لطيف.
إنه يسهّل استخدام الكتلة.
لغة C وكثير من اللغات ليست سهلة الاستخدام نوعًا ما.
ستشاهد لاحقًا في الفصل الدراسي أن اللغات الأحدث هي
أقرب قليلاً لما تقدمه لغة سكراتش.
ولكن في لغة C، نحتاج أن نكون أكثر وضوحًا، لكن هذه
فرصة لاستخدام بعض من الكتل البنائية الأكثر بدائية.
في لغة C، سيكون مكافئ التكرار هو مجرد اقتراح فحسب،
لأنه محدد إلى الآن.
وبعد ذلك، تمامًا كما كان من قبل، إذا أردنا القيام بشيء ما
مرارًا وتكرارًا ضمن هذا التكرار الحلقي، فسوف
نستخدم الأقواس المتعرجة، مماثلة للكتلة الصغيرة البرتقالية هناك.
وبعد ذلك ماذا سأفعل؟
سأقوم بهذا كل مرة، أملاً في الوصول إلى 50 مرة، لطباعة عبارة hello world.
لذلك فأنا الآن أحتاج فقط إلى فهم كيفية التعبير
عن عدد المرات وبالتحديد 50.
لذا من الواضح في لغة C-- استخدام الأقواس مرة أخرى--
وهذه ستصبح سمة شائعة إلى حد ما لكثير من التعليمات البرمجية
التي نكتبها.
وبعد ذلك ستحتاجون للقيام بثلاثة أشياء.
سيكون الآن العبء علينا نحن المبرمجين
لتعقب عدد المرات التي نريد فيها تنفيذ هذه التعليمة البرمجية إلى عدد المرات
التي قمنا فيها بالفعل بتنفيذ هذه التعليمة البرمجية ثم التأكد باستمرار
من عدم تجاوز إحدى التعليمتين البرمجيتين للأخرى.
لذا سنتوقف بمجرد وصولنا إلى 50.
إذن ما هو البناء الرئيسي الذي نستخدمه لتعقب أي شيء
في برنامج ما؟
العداد، والذي كان مثالاً للمتغير.
لذا نحن نحتاج فقط لاستخدام متغير.
الآن، بالفعل سيصبح داخل الأقواس هذه المرة.
لذا فهو ليس بمفرده كما كان منذ وقت قليل من قبل، لكن بناء الجملة هو نفسه.
يمكنني تسميته باسم counter "عداد"، لكن في الواقع أن العُرف في البرمجة
هو مجرد استخدام متغيرات أقصر عندما نقوم بشيء ممل.
وإذا كان كل ما تفعله هو التكرار الحلقي--
فإن حرف i الذي يرمز إلى عدد صحيح، يعتبر نوعًا ما اسم متغير يقصده العديد من المبرمجين
بدلاً من اسم counter "العداد" الأكثر إطنابًا ولكنه صحيح أو أيًا ما كان الاسم.
إذن فهذا يقول، مهلاً، يا كمبيوتر، أعطني متغيرًا يسمى i.
دعوني أقوم بتخزين الأعداد الصحيحة أو ints فيه وضبط القيمة الأولية على 0.
لماذا؟
حسنًا، ربما يبدأ كل شخص تقريبًا في هذه الغرفة بالعد من 1.
تميل فقط أجهزة الكمبيوتر إلى بدء العد من 0.
لكن لماذا؟
ما هو السبب المنطقي لبدء العد من 0
ربما على أساس الأسبوع الماضي؟
لماذا يبدو نوعًا ما منطقيًا؟
أجل، ما رأيكم؟
الجمهور: حسنًا، لأنها واحدات وأصفار، وأنه نظام ثنائي.
ديفيد: نعم، إنها فقط واحدات وأصفار، وما هو
أصغر عدد، باستثناء القيم السالبة،
الذي يمكن تمثيله في النظام الثنائي؟
حسنًا، إنه تحديدًا 0، 0، 0، مجموعة أصفار.
فلماذا ستهدر ذلك التمثيل،
ذلك التبديل لوحدات البت؟
دعونا فقط نبدأ بالعد من 0 ثم نضيف إلى ذلك.
إذن يمكنكم بدء العد من 1 في لغة C، لكن العُرف في معظم اللغات
هو العد من 0.
إذن سنبدأ بدايةً صحيحة كذلك.
وقد تذكرون حتى أنني في المثال الذي قمنا به PBJ، اختصار زبدة الفول السوداني والمربى--
وليس للتعليمة البرمجية PDJ--
اختصار الكود الزائف للهاتف، قمتُ بالفعل عن عمد ببدء
ترقيم السطور من 0 إلى 1 إلى 2 لنفس ذلك الحدس.
لذلك فإليكم هنا الطريقة التي ستقولون بها بعد ذلك للكمبيوتر check "تحقق"، إذا أردتم،
ما إذا كان i أقل من 50.
الآن، مبدئيًا من الواضح أنه سيكون أقل من 50
لأن الصفر أقل من 50 ولكن سيتم التحقق من نفس تلك الحالة
مرارًا وتكرارًا أثناء تنفيذ هذا التكرار الحلقي.
ثم تذكروا مما سبق، أننا يمكننا فقط كتابة زائد زائد متغير لإضافة 1 إليه.
يمكننا القيام بهذا بإسهاب أكبر.
يمكننا قول أن i يساوي 1، لكنها مجرد
طريقة أكثر تقليدية لكتابة i زائد زائد فقط
لقول الشيء نفسه بإيجاز أكثر.
إذن ما الذي يحدث بعد ذلك من الناحية المنطقية؟
تلك هي التعليمة البرمجية التي كتبتُها.
ما الذي يفعله الكمبيوتر باستخدامها؟
حسنًا، إنه يقوم بإعادة i لوضع البداية إلى 0 وإعداده لتخزين الأعداد الصحيحة فيه.
إنه يتحقق من الشرط فقط في حال قمت بإعادته لوضع البداية إلى قيمة أكبر مما ينبغي.
ربما لا تريد تنفيذ التكرار الحلقي على الإطلاق.
لكن من الواضح أن 0 أقل من 50.
إذن يتم تنفيذ هذا السطر في التعليمة البرمجية.
خمّن ما سيحدث بعد ذلك.
أجل، ربما تريد أن تكتب i زائد زائد
لأنك انتهيت من تنفيذ جميع سطور التعليمة البرمجية
الموجودة بين الأقواس المتعرجة، حتى بالرغم من وجود واحدة فقط.
لذا دعونا نمضي قدمًا ونُزيد i.
إذن i يساوي الآن 1.
دعونا الآن نتأكد-- هل 1 أقل من 50؟
بالتأكيد.
قم بتنفيذ التعليمة البرمجية.
i زائد زائد-- يساوي 2 أقل من 50.
بالطبع قم بتنفيذ التعليمة البرمجية. i زائد زائد-- يساوي 3 أقل من 50، بالتأكيد.
الآن امضِ قدمًا وقم بتنفيذ التعليمة البرمجية، مرارًا وتكرارًا.
وعند نقطة ما، سنصل حتى i يساوي 49، وهل 49 أقل من 50؟
بالتأكيد.
إذن نقوم بطباعة عبارة hello world.
ثم يستمر مفعول i زائد زائد، ثم ها هو ذا، 50 أقل من 50.
لا.
إذن انتظر هذا يبدو خطأً منطقيًا، أليس كذلك؟
هل يجب أن أتحقق ما إذا كان i أقل من أو يساوي 50؟
أجل، لأنني لو بدأتُ من 0، فإنني سأكون بالفعل
قد استهلكتُ دورةً إضافية واحدة.
إذن يمكنني العد من 0 حتى 49 وهو ما يبدو أنه يؤدي الغرض أو من 1 حتى 50،
لكن المتعارف عليه في البرمجة بصدق
عادةً ما تبدأ بالعد من قيمة ما
ثم العد تصاعديًا وصولاً إلى قيمة ما ولكن ليس مرورًا بها لذلك السبب فحسب.
لكن من الناحية المنطقية، يمكنك تنفيذ هذه التعليمة بنصف دستة من الطرق المختلفة على
الأرجح.
دعونا ننظر إلى مثال واحد أخير والذي سمح لنا
بجعل المستخدم يقوم بالإدخال في لغة سكراتش.
تذكروا أننا استخدمنا هذه الكتلة للحصول بالفعل على
اسم شخص ما في المحاضرة، وأننا أيضًا
استخدمناه في الرسم المتحرك باستخدام منزل خبز الزنجبيل، للحصول على نعم أو لا--
هل تريد الكَب كيك أم التفاحة أم ما شابه.
إذن هذا هو مثال لدالة في لغة سكراتش
تأخذ بالفعل مُدخلاً مثل جملة ما اسمك،
لكنها أيضًا ترجع بقيمة، والتي كانت في هذه الحالة
مضمنة كتعليمة برمجية ثابتة في لغة سكراتش بواسطة MIT "معهد ماساشوستس للتكنولوجيا" ليُطلق عليها اسم answer "إجابة".
لذلك فإنه يبدو كمتغير خاص يسمى answer "إجابة"،
ولكن على نحو فعال، تجري إعادة تسليمه للمستخدم.
إذن كيف يمكننا التفكير في هذا؟
في لغة C يتضح أنه يمكنك التعبير عن هذا السطر من التعليمة البرمجية بشكل أكثر إطنابًا نوعًا ما
عن ذي قبل ولكن باستخدام دالّة جديدة تسمّى get string--
لذلك فاسم الدالّة هو "get_string".
الشرطة السفلية متعارف عليها في لغة C. إذا كنت ترغب في وضع مسافة لديك،
فلا يمكن أن تضع مسافات لديك في أسماء الدوالّ.
لذا بدأ الأشخاص بالفعل في استخدام الشرطة السفلية كما تقوم أنت بذلك في وسائل التواصل الاجتماعي لديك
لأسماء المستخدمين وما شابه-- هو نفس المتعارف عليه هناك كذلك.
إليكم الجملة التي أريد عرضها، وأنا
سأبدأ تسمية هذه رسميًا بدرجة أكبر باسم string "سلسلة".
السلسلة في لغة البرمجة هي مجرد تسلسل من الأحرف.
إنها كلمة، إنها عبارة، إنها حرف، إنها فقرة.
هذه هي السلسلة.
أي شيء فيما بين علامتي الاقتباس يسمى سلسلة في لغة C،
و/n "الخط المائل العكسي وحرف n"، هو فقط نهاية السطر كما ذُكِر من قبل.
لا تزال لدينا بالفعل الفاصلة المنقوطة، لكن هذا
ليس بمثابة ترجمة حرفية تمامًا لما سيحدث بعد
قليل لأنني أيضًا أحتاج الآن إلى القيام بشيء ما يحمل الإجابة.
لذلك إذا كانت get_string عبارة عن دالّة تحصل على الإدخال من المستخدم،
عن طريق لوحة المفاتيح لديه، تمامًا مثل الكتلة الزرقاء في لغة سكراتش، ففي لغة C
نحتاج لأن نكون أكثر وضوحًا نوعًا ما بشأن المكان
الذي نضع فيه قيمة الإرجاع من تلك الدالّة، أي ما تقوم بتسليمه.
وبذلك يمكنني تخزينه في متغير يسمى answer "إجابة".
ويمكنني تسميته بأي اسم أريده.
لكن من أجل التناسق مع لغة سكراتش، فدعونا نسميه answer "إجابة".
لكن تذكروا ما يجب علينا القيام به في لغة C في أي وقت نقوم فيه بإنشاء متغير.
يجب أن نكون أكثر دقة.
أجل.
الجمهور: تعريف فئته كسلسلة.
ديفيد: يجب أن نعرّفها-- دعوني أطلق عليها اسم type "كتابة" أو class "فئة"،
إذا كنتَ قد أخذت فئة سابقة.
إنه type "كتابة" ولن يكون باسم int "عدد صحيح" لأنه من المحتمل أن تكون الكلمات
التي تجري كتابتها ليست أرقامًا.
وستكون في هذا الوقت ما قد سميتُه للتو باسم string "سلسلة".
وهكذا، بالفعل، سنعلن المتغير الموجود على اليسار
بقول give me a string "أعطني سلسلة"، وسمّها باسم answer "إجابة"،
وخصصّ لها كل ما يوجد على اليمين.
حسنًا، ما الموجود على اليمين؟
ما الموجود على اليمين هي كل ما ترجع به هذه الدالّة
get string ويتم تخزينه من اليمين إلى اليسار.
إذن كيف يمكنني الآن قول اسم هذا الشخص؟
حسنًا، في لغة سكراتش، أنا فقط أقول، ثم أسحب متغير answer "الإجابة" وأسقطه،
وينتهي الأمر.
في لغة C، ما هي الدالّة التي يمكننا بها أن نقول شيئًا ما، ولو أنّي،
على الشاشة؟
إذن printf، لطباعة سلسلة منسقة، حتى لو أننا لم نرَ
بالفعل أي تنسيق بعد حتى الآن.
يتضح في لغة C، أنك يتعين عليك بالفعل ذكر
printf إذا كنت لا تمر في سلسلة أو جملة مضمّنة في تعليمة برمجية ثابتة،
فعليك المرور إلى الدالّة printf والتي تسمى format code "تعليمة برمجية للتنسيق" أو format string "سلسلة تنسيق"--
وهذا هو أول إدخال إلى printf.
يبدو واضحًا الآن أن printf يتمتع بشيئين.
الأول هو هذا الشيء قبل الفاصلة.
والثاني هو الشيء الموجود بعد الفاصلة.
ولم نرَ هذا حتى الآن في لغة C. لذا يُقال لـ printf،
امضِ قُدمًا واطبع سلسلةً تشبه هذا.
النسبة المئوية S هي عنصر نائب، وتشير S إلى سلسلة.
وهذا العنصر النائب يقول حرفيًا،
يا printf، سأقدم لك سلسلة لإدخالها لهذا المدخل الأول.
ما هي تلك السلسلة؟
حرفيًا، متغير الإجابة.
يبدو الأمر الآن كما لو أننا نقفز من خلال أطواق موجودة هنا.
كان من الجيد لو قلنا فقط printf، قم بفتح الأقواس، وإجابة،
وأغلق الأقواس، فاصلة منقوطة، وانتهِ من ذلك.
هذه ليست الطريقة التي يعمل بها printf.
في الإصدارات الأقدم، كان يمكنك القيام بشيء ما
أكثر بساطة من هذا القبيل.
ولكن صراحة، نحن لا نقوم عادة بطباعة
ما يكتبه الإنسان فقط.
على كلٍ، هذا مثال غبي نوعًا ما في هذه اللحظة.
أنا أكتب كلمة.
وأنت تقولها على الشاشة فقط.
لقد قررنا في سكراتش بالفعل هذا النوع من السخافة.
سيكون من الجيد على الأقل جعل البرنامج، لا يقول فقط
ديفيد أو أيًا كان الاسم-- ولكن ما الذي قمنا به المرة الماضية؟
مثل مرحبًا فاصلة ديفيد.
ولكن هذا من شأنه أن يقدم لنا تلك القدرة.
الآن أنا حرفيًا أقوم فقط بطباعة اسم إنسان في لغة C،
ولكن دعوني أغيّر هذا قليلاً فقط كما فعلنا في سكراتش.
أذكر أننا في لغة C استخدمنا هذه الكتلة الخضراء للجمع حيث قمت حرفيًا
قبل ذلك بجمع وسيطتين.
الأولى كانت مرحبًا فاصلة مسافة.
والثانية كانت إجابة، وهذا أمر متسلسل.
يدمج هذا كلا السلسلتين جنبًا إلى جنب.
حسنًا، في لغة C، وبفضل printf، يمكننا القيام بالشيء نفسه.
إنها فقط صيغة مختلفة.
ويستمر Printf في الحصول على وسيطة واحدة أولاً، وهي، السلسلة التي ترغب في تنسيقها،
هذا مايشير إليه حرف F في printf.
ولكن هذه المرة سأقوم حرفيًا بقول م-ر-ح-بً-ا فاصلة مسافة النسبة المئوية S
الذي يشير إلى سلسلة، ثم أعطِ printf وسيطة ثانية،
والتي تنص تعليماتها على المضي قدمًا وإدخال هذا المتغير أيًا كان
إلى هذا العنصر النائب أيًا كان.
لقد جمعنا الآن السلسلتين بشكل فعّال وبالتالي
أنشأنا أول سلسلة منسقة.
حسنًا، أي أسئلة بشأن هذا؟
نعم.
الجمهور: ماذا لو أردت قول أي شيء إضافي بعد ذلك؟
ديفيد: ماذا لو أردت قول أي شيء إضافي بعد ذلك؟
يمكنك بالتأكيد الاستمرار في التسلسل المنطقي.
لا يتوجب عليك إنهاء هذا التعبير المقتبس
بالنسبة المئوية S. يمكنك قول، مرحبًا، فاصلة النسبة المئوية S
فاصلة، سعيد بلقائك.
ثم الشيء الذي سيقوم به printf هو فقط
استبدال المتغير المسمى إجابة حيث توجد النسبة المئوية S.
وإذا كنت تريد تقديم نسبتين مئويتين S، يمكنك فقط إضافة فاصلة أخرى هنا
وتمرير متغير آخر ومتغير ثالث وأكثر من ذلك،
وبالتالي تنسيق السلسلة بصورة أكثر تفصيلاً.
سؤال هنا.
نعم.
أي أسئلة أخرى؟
نعم، في الخلف.
الجمهور: كيف يمكن إجراء تمييز بين العناصر النائبة
إذا كانت لديك متغيرات مختلفة؟
ديفيد: كيف يمكن إجراء تمييز بين العناصر النائبة
إذا كانت لديك متغيرات مختلفة؟
إنه الترتيب من اليسار إلى اليمين.
لذا في هذه الحالة، إنه مثال تافه لأنه يوجد
متغير واحد وعنصر نائب واحد فقط.
ولكن إذا كنت تلمح إلى أن لدي النسبة المئوية S متعددة لشيء ما شيء ما
شيء ما، النسبة المئوية S لشيء ما شيء ما شيء ما،
سأتأكد فقط من إدخال المتغير الأول إلى printf فاصلة
المتغير الثاني فاصلة المتغير الثالث وهكذا من اليسار إلى اليمين.
أي أسئلة أخرى؟
نعم.
الجمهور: لماذا لا يوجد حرف n\؟
ديفيد: أوه، اللعنة.
لأنني أخفقت ولم أدرج ذلك وكنت سأقوم
بإصلاح ذلك بعد الصف الدراسي بسرعة.
خطأ، إنه خطأ.
نعم.
الجمهور: ماذا لو كنت تريد استخدام int مرتين في السلسلة؟
أي أردت أن أقول، مرحبًا، ديفيد، أهلاً، ديفيد.
ديفيد: بالتأكيد، الشيء ذاته بالضبط--
فاصلة إجابة، فاصلة إجابة باستخدام نسبتين مئويتين S. إذا أردت أن تقول المتغير نفسه مرتين
في مكانين أيًا كان السبب، عنصرين نائبين ومن ثم إجابة فاصلة
إجابة لإدخال ذلك مرتين.
سؤال آخر-- نعم.
الجمهور: هل النسبة المئوية عنصر نائب عالمي من حيث الأعداد الصحيحة؟
ديفيد: لا، وسنرى بعض النسب الأخرى خلال لحظات.
اتضح أنه توجد نسب أخرى.
مثل النسبة المئوية i التي تشير للعدد الصحيح، وسيكون
هناك أكثر من ذلك-- النسبة المئوية c التي تشير لحرف واحد والمزيد.
أي أسئلة أخرى؟
نعم.
الجمهور: حيث إن حرف n\ هو متغير، هل ستضعه بعد n؟
هل ستضعه في الاقتباس؟
ديفيد: سؤال جيد.
إذا كان لدي بشكل صحيح-- وإن لم يكن هذا ملف PDF،
لقمت بتحريره بسرعة--
إذا كانت لدي النسبة المئوية n، فيجب أن تنتقل دائمًا إلى السلسلة المنسقة،
في الوسيطة الأولى.
لذا أول شيء يأتي بعد الوسيطة الأولى في printf
هو بشكل اختياري متغير فاصلة متغير فاصلة متغير فاصلة متغير.
أي أسئلة أخرى؟
لذا دعونا نمضي قدمًا ونقوم بشيء ما فعلاً باستخدام التعليمات البرمجية.
سأمضي قدمًا وأفتح نافذة أخرى،
وهذه أداة تسمى CS50 Sandbox،
وهي أداة عبر الويب بواسطتها يمكنك العمل على التعليمات البرمجية.
وسأعرض في غضون لحظات كيف يمكنني الدخول إلى هذا الموقع الخاص،
ولكن دعوني أشرح أولاً واجهة المستخدم مثلما بدأنا
محادثتنا عند استخدام سكراتش.
إذًا أحتاج إلى مكان لأكتب التعليمات البرمجية.
الحقيقة أنه يمكنني فقط استخدام Mac الخاص بي.
يمكنني فقط استخدام كمبيوتري الشخصي.
وبصراحة، يمكنني حتى استخدام بعض الأجهزة المحمولة هذه الأيام.
ولكن فيما بعد قد يكون لدينا مئات الأشخاص الآخرين في الصف الدراسي
ويستخدم كل منهم تكوينات مختلفة قليلاً
على أجهزة Mac لديهم وأجهزة الكمبيوتر والهواتف المحمولة وما شابه ذلك.
ولذا سيكون لكل شخص إعدادات مختلفة وبرامج مختلفة،
ولن تعمل أبدًا بشكل جيد.
لذا في بداية الدورة، نحن نقوم فقط
بتوحيد كل شيء من خلال استخدام بيئة معتمدة على الويب
تمامًا مثل سكراتش، حيث سيكون لدينا جميعًا حق الوصول إلى جهاز الكمبيوتر المحدد نفسه
ولكن بشكل افتراضي في ما يسمى بالسحابة.
إذا تسائلت من قبل ما هي السحابة،
فهي فقط تعني خادم خاص بأشخاص آخرين في مكان ما على الإنترنت
والذي يمكن للأشخاص استخدامه مجانًا أو بإيجار ولا
يتوجب عليهم استضافة هذه الخوادم المادية نفسها.
لذا CS50 Sandbox، تمامًا مثل سكراتش، هو تطبيق قائم على السحابة
والذي قام شخص آخر بكتابته وتتم استضافته على الإنترنت،
وتبدو اجهة المستخدم، للوهلة الأولى مثل هذا.
تحتوي على مكونين فقط.
يوجد في الجزء العلوي من واجهة مستخدم CS50 Sandbox
محرر التعليمات البرمجية فقط، وهو محرر نص بسيط جدًا
يشبه في عمله Google Docs وMicrosoft Word وما إلى ذلك
ولكن أبسط من ذلك بكثير.
لا يوجد تنسيق.
لا يوجد خط غامق وتمركز.
يمكنك فقط كتابة كلمات النص.
في الأسفل هنا ما يسمى بالنافذة الطرفية،
ولكننا سنعود لذلك بعد لحظات.
دعوني أمضي قدمًا وأكتب برنامجي الأول.
دعوني أمضي قدمًا وأكتب "include standard IO.h
int main void افتح أقواسًا متعرجة printf hello world\ وفاصلة منقوطة،
تم.
الآن عدد قليل من الأشخاص الموجودين في هذه الغرفة يمكنه تجهيز برنامج واضح
بهذه السرعة ما لم تكن لديه خلفية مسبقة.
وإذا تناولت APCS أو أي شيء آخر، يبدو مثل Java
ولكن لا يشبهه تمامًا.
ولكن هذا هو برنامجي الأول.
الآن لنتذكر مما مضى أن هذا كان برنامجًا أبيض وأسود
رأيناه على الشريحة منذ قليل.
وحتى لو لم نقدّر ما تقوم به الصيغة غير التقليدية،
من المحتمل أن يكون لدى جميعنا حدس بما يفعله هذا البرنامج،
وهو في نهاية المطاف فقط طبع الكلمات hello world.
ولكننا سنستخلص بعد قليل ما الذي تقوم به جميع هذه السطور المتعددة.
ولكن الجزء المثير للاهتمام هو الجزء المظلل باللون الأخضر هنا،
وهذه إحدى ميزات CS50 Sandbox.
فهو يميز المفاهيم المختلفة للتعليمات البرمجية بلون ما داخل التعليمات البرمجية الخاصة بك
حتى تلاحظها مباشرة.
الألوان ليست موجودة بالفعل.
لا يتوجب عليك تمييز أجزاء التعليمات البرمجية بنفسك.
إنه يقوم بذلك تلقائيًا حتى يمكنك رؤية المكونات المختلفة
تماما مثل ما يقوم معهد MIT بتلوين قطع لغز سكراتش المتعددة، الأمر نفسه.
إذًا هذا برنامج أرغب في تسميته hello.
إنه في ملف.
هذه فقط علامة تبويب في الأعلى تسمى hello.C
لأنه يتبين أنه، عندما تكتب برنامجًا بلغة C،
فأنت تحفظه في ملفات من خلال تحويل بشري أيًا كانت .C كامتداد الملف،
إذا جاز التعبير.
كيف يمكنني تشغيل هذا البرنامج؟
لا يوجد علم أخضر للنقر عليه، كالذي قدمه لنا سكراتش.
لذا كيف يمكنني تشغيل هذا البرنامج فعليًا.
وبصراحة، علاوة على ذلك، يبدو أن أمر العلم الأخضر هو أقل ما يقلقني.
ما هي اللغة التي يفهمها أي جهاز كمبيوتر
سواء كان جهاز Mac الخاص بي هنا أو خادم السحابة حيث يوجد هذا الشيء؟
أصفار وآحاد، أليس كذلك؟
وبدأنا بعرض تلك الشريحة المليئة بالكثير من 0 و1،
وتلك هي النقطة التي نحتاج الوصول إليها.
ولكن نأمل، ألا يتوجب علينا الكتابة بذلك المستوى من الملل.
لذا نحتاج إلى طريقة ما لتحويل التعليمات البرمجية هذه
من لغة C، والتي سنبدأ بتسميتها تعليمات المصدر البرمجية، وهو الرمز الشبيه باللغة الإنجليزية
الذي رأيناه على الشاشة وأقل ما يقال عنه أن كتابته ممتعة على عكس
الأصفار والآحاد فقط.
ولكننا مع ذلك نحتاج إلى تحويله بطريقة ما إلى أصفار وآحاد.
ولذا الطريقة التي يمكننا فعل ذلك بها هي كما يلي.
إذا كان لدينا ما سنبدأ بتسميته تعليمات المصدر الرمجية الخاصة بنا، والذي يمكن أن تكتب،
في حالتنا، بلغة C، ولكن يمكنك كتابة تعليمات المصدر البرمجية بلغة Java، أو C++، أو Python،
بعشرات اللغات الأخرى.
تعليمات المصدر البرمجية هي مصطلح عام.
وهذا يعني أن التعليمات البرمجية هي التي كتبناها نحن البشر.
نحتاج إلى طريقة ما لتحويلها إلى أصفار وآحاد، والتي
من الآن فصاعدًا سنطلق عليها تعليمات برمجية آلية،
والذي يبدو اسمًا منطقيًا.
إنها الأصفار والآحاد التي تفهمها الآلة.
كيف يمكن لآلة أن تفهم ما تعنيه الأصفار والآحاد؟
حسنًا، هذا هو السبب وراء امتلاك CPU، وحدة معالجة
مركزية، أدمغة أجهزة الكمبيوتر.
إنها متأصلة في المصنع،
إذا جاز التعبير، في مصنع Intel لفهم
أنماط معينة من الأصفار والآحاد.
ولكن النقطة المهمة بالنسبة لنا الآن هي أننا بحاجة لتناول تعليمات مصدر برمجية، مثل البرنامج
الذي كتبته بلغة C منذ لحظة والذي من المفترض أن يطبع hello world،
ويحولها بطريقة ما إلى تعليمات برمجية آلية.
إذًا اتضح أن هذه الخطوة قد حلها الأشخاص السابقون
لنا قبل ذلك.
قام الأشخاص الآخرون بكتابة برامج بالفعل
والتي سنطلق عليها اسم مترجم والذي يتيح لنا
تحويل تعليمات مصدر برمجية إلى تعليمات برمجية آلية.
إنها فقط خطوة إضافية واحدة.
هذه الخطوة غير موجودة في سكراتش، ولكننا
سنبدأ في تشغيل برنامج يطلق عليه بشكل عام اسم مترجم والذي سنقوم
بتمرير برنامجنا إليه كمدخل، وسنحصل منه كمخرج على تعليمات برمجية آلية، وبالتالي
يوضح لنا ما هو علم الكمبيوتر
الموجود في سياق البرمجة الآن-- تعليمات مصدر برمجية
كمدخل، تعليمات برمجية آلية كمخرجات.
تسمى الخوارزمية أو البرنامج الخاص الذي سنستخدمه خلال لحظات
مترجم وهو يقوم فقط بتحويل شيء إلى شيء آخر حتى لا يتعين علينا
أن نفكر في 0 و1 أو نكتب بهما.
لذا فهذا يمثل المدرسة القديمة قليلاً في كيفية القيام بهذا.
في سكراتش، تقوم فقط بالضغط بوضوح على العلم الأخضر ومعهد MIT
وباقي الرفاق سيقومون بالأمر لك.
ولكن يجب أن نعمل بشكل يدوي أكثر قليلاً في هذا،
وهذا حيث تدخل القطعة الثانية من واجهة مستخدم CS50 Sandbox
في الموضوع.
لاحظ أن لدي محث وامض هنا.
توجد علامة دولار في الجزء الأيسر، وهي مجرد اتفاقية مشتركة.
وتشير علامة الدولار في هذه الأنواع من أجهزة الكمبيوتر إلى محث.
إنه ينتظرني لكتابة شيء ما، وهو حقًا وحرفيًا يومض،
في انتظاري لكتابة شيء ما.
هذا هو مثال للنافذة الطرفية، ويحتوي جهاز iMac وجهاز الكمبيوتر الشخصي الخاص بك
أو لا يمكن أن يحتوي على هذه الميزة نفسها بالضبط.
إنها فقط ما نقوم بتشغيله باستخدام واجهات المستخدم الرسومية هذه الأيام.
لذا لدينا أزرار وقوائم وأشياء
للسحب والنقر، ولكن سابقًا--
وعادة في البرمجة-- لا تزعج نفسك بهذه الجماليات.
أنت فقط ترهق يديك فعليًا بكتابة أي شيء تريد القيام به
على لوحة المفاتيح وحدها.
وفي البداية، قد يبدو الأمر على أنه تراجع.
مثل، لماذا نتخلى عن جميع هذه المرافق الجميلة
لأجهزة الكمبيوتر الحديثة؟
ولكنها أقوى، وأكثر وضوحًا.
إنها تتيح لنا بالضبط فعل ما نريد فعله بإرسال أوامر إلى جهاز الكمبيوتر.
لذا هذا هو الطرف 1 الخاص بي.
يمكنني إنشاء أخرى فقط ليكون لدي نوافذ متعددة،
ولكن هذا يتيح لي الوصول إلى الخادم الأساسي الذي لدي الآن
حق الوصول إليه.
لذا إذا كان أي منكم، عندما يحين وقت تعيين المشكلة الأولى،
قام بتسجيل الدخول إلى الأداة نفسها، ليس لديكم جميعًا البيئة نفسها.
لديكم جميعًا النسخ المعزولة للبرنامج ذاته الخاصة بكم وليس سعة التخزين
الخاصة بكم، إذا جاز التعبير.
إذًا أحتاج إلى تحويل hello.C بطريقة ما إلى أصفار وآحاد.
والطريقة التي سأقوم بفعل هذا بها هي هكذا--
clang، والتي تشير إلى لغة C، hello.C enter.
وحقيقة أنني لا أرى أي شيء يحدث هو بالفعل أمر مذهل
لأنه يوجد عدد لا نهائي من الأشياء، والتي بصراحة، يمكن أن تحدث بشكل خاطئ،
وجهاز الكمبيوتر سيصرخ بسعادة في وجهك
برسائل أخطاء تبدو مشفرة إذا حدثت أي من هذه الأشياء بطريقة خاطئة.
لذا عدم رؤية أي شيء سوى محث وامض آخر مع علامة
الدولار هو شيء جيد فعليًا.
لقد تم تحويل الرمز الخاص بي بطريقة ما إلى أصفار وآحاد.
أين هي تلك الأصفار والآحاد؟
حسنًا، عادة، يتم تخزينها في ملف يطلق عليه بشكل تاريخي
ومريب a.out، ويمكننا رؤية ذلك.
إذا قمت بالنقر على رمز هذا المجلد هنا، سترى
بالفعل ملفي hello.C وملف آخر الآن باسم a.out.
إنه يشير إلى تركيبة المخرج، ولكن لأسباب تاريخية.
الآن دعوني أغلق رمز المجلد لأننا لن نستخدم
واجهة المستخدم الرسومية بشكل عام.
كيف يمكنني تشغيل ذلك البرنامج؟
لا يمكنني فقط النقر مرتين على الرمز.
هذا ليس جهاز Mac.
هذا ليس جهاز كمبيوتر شخصي.
هذه بيئة Linux القائمة على السحابة.
Linux هو نظام تشغيل شائع جدًا.
يستخدمه العديد من علماء الكمبيوتر، والعديد من المواقع الإلكترونية،
والعديد من الخوادم.
في الواقع، يتم تشغيل كل المواقع تقريبًا التي تزورها هذه الأيام،
إذا لم تكن بواسطة نظام التشغيل Windows فبنظام التشغيل Linux وإصدارات متنوعة من ذلك
تسمى Unix وإصدارات أخرى.
إنه فقط نظام تشغيل مجاني تقريبًا وشائع جدًا
ويستخدمه CS50 Sandbox نفسه.
لتشغيل ملف باسم a.out الموجود في هذا المجلد، لذا إذا جاز التعبير،
وعلى الرغم من عدم رؤيتك للإصدار الرسومي منه.
فأنت تكتب فقط وحرفيًا نقطة خط مائل a.out.
اسم غير واضح تمامًا وغبي نوعًا ما ليتم إطلاقه على البرنامج،
ولكن هذا ما يعادل النقر مرتين على رمز في جهاز Mac أو الكمبيوتر الشخصي الخاص بك.
دعوني أمضي قدمًا وأنقر فوق إدخال.
وعندما أقوم بذلك، فأنا آمل أن أرى ماذا؟
Hello world.
وها نحن ذا.
رائع، هذا هو برنامجنا الأول.
إنه لا يقوم بالكثير، ولكنه على الأقل
يقوم بما وعدنا أنه سيقوم به.
وهذا مايعادل في سكراتش ميزة القول على الشاشة hello world.
الآن لنكون منصفين، توجد المزيد من الخطوات المتضمنة،
والله أعلم أن هناك المزيد من الرموز التي تبدو مشفرة لتتم كتابتها.
ولكن في نهاية الأمر كل ما قمنا به
هو إعادة تنفيذ النظرة المنطقية من الأسبوع الماضي في هذه اللغة الجديدة،
ولكننا سنقدم الآن وبشكل سريع للغاية قطع لغز جديدة ولكن بلغة C.
ولكن أولاً دعونا نحل هذا الصداع الطفيف.
أنا لا أرغب حقًا في إخبار أصدقائي،
مرحبًا، بالجميع، تعالوا لتشغيل برنامجي a.out.
فلنطلق عليه اسمًا حقيقيًا.
فلنفترض أني أريد فقط تسمية برنامجي hello
مثلما قد تقوم بالتنزيل من متجر Google Play أو App Store.
برامج لها أسماء.
إذًا كيف يمكنني فعل ذلك؟
حسنًا، اتضح أنه في نافذة طرفية، ما يسمى ببيئة سطر الأوامر،
هو عبارة عن طريقة رائعة لقول أنك تكتب سطور الأوامر
باستخدام لوحة المفاتيح، يمكنك التمرير بالفعل
في ما يسمى بوسيطات سطور الأوامر، المدخلات الإضافية
للبرامج التي هي مجرد كلمات تكتبها في لوحة المفاتيح الخاصة بك والتي تخبرها
بكيفية التصرف.
لذا بدلاً من تشغيل clang فقط clang hello.C
سأكون فعليًا أكثر وضوحًا
وأخبر clang يُرجى إخراج--
كما هو موضح من خلال الكتابة حرفيًا شرطة 0 للإخراج--
بدلاً من ذلك ملف باسم hello.
الأمر أكثر إطنابًا قليلاً--
مرحبًا شرطة O مرحبًا-- أو، آسف clang شرطة O hello hello.C.
ولكن الذي سيقوم به الآن هو الاستمرار في تحويل
تعليمات المصدر البرمجية إلى تعليمات برمجية آلية، ولكنه سيعمل على
حفظه في ملف باسم hello.
وأنا لدي الآن حقًا hello.C a.out ومرحبًا كما
هي مصورة في المجلد الرسومي الصغير هناك.
لذا الآن يمكنني بدلاً من ذلك تشغيل نقطة خط مائل مرحبًا.
ما الذي يجب أن تقوله؟
آمل أن يكون ذاته، enter.
هذا هو.
هذه تسمى بوسيطات سطر الأوامر، وهي فقط
طريقة المدرسة القديمة لإخبار أمر قائم على نص
بكيفية التصرف بشكل مختلف قليلاً عن إعداداته الافتراضية.
ولكن بصراحة، هذا سيجعل الأمر مملاً بسرعة.
لن نرغب في كتابة التعليمات البرمجية الخاصة بنا
ثم في كل مرة نريد تحويلها إلى أصفار وآحاد لتشغيلها
نتذكر طلاسم الأوامر السحرية هذه.
لذا قام البشر بتجريد تلك بعيدًا أيضًا.
اتضح أنه، إذا كنت تريد تصميم برنامج من تعليمات مصدر برمجية
إلى تعليمات برمجية آلية، فيوجد أمر آخر يمكنك استخدامه.
ويمكنك حرفيًا كتابة make hello، حيث
hello هو اسم البرنامج الذي تريد تصميمه،
هذا البرنامج، الذي اسمه make، سيبحث عن ملف
بشكل افتراضي باسم hello.C، وبالتالي يوفر لك الوقت المخصص لذلك.
اضغط على Enter الآن، يا إلهي، انظروا ما الذي فعله للتو.
لديه المزيد من خيارات التكوين المصممة فيه،
ونحن كموظفي CS50، قمنا بتكوين CS50 sandbox للحصول على هذه الميزات المتنوعة.
ومع ذلك لن نخوض في التفاصيل الخاصة بها الآن،
ولن أتطرق إلى ما الذي يقومون به فعليًا.
إنهم فقط يصممون ميزات إضافية يحتمل أن نصل إليها في النهاية.
ولكن قد يكون هذا بخلاف الأمر الذي يجب عليكم
كتابته في أسبوعين أو ثلاثة أو أربعة أسابيع،
ولن يتمكن أحد من تذكر ذلك.
أنا بالتأكيد لن أتذكر.
لذا تقوم "Make" بجعل الأمر آليًا من أجلك.
ولكن عندما تشغّل Make، فـ Make ليست مترجمًا.
Make ليست ذلك الشيء في المنتصف الذي يحوّل تعليمات المصدر البرمجية إلى تعليمات برمجية آلية.
إنها مجرد برنامج ثانٍ قام بعض الأشخاص بكتابته منذ سنين ويستخدم
clang في طريقة آلية لتحقيق المخرج نفسه.
لأن الأشخاص قد تعبوا من كتابة أشياء كهذه.
لذا قام شخص ما بإعداد برنامج وأطلق عليه "Make" ليقوم لنا بذلك.
أية أسئلة؟
دعونا إذًا نضيف شيئًا صغيرًا إلى هذا البرنامج.
بدلاً من هذا الإصدار من hello، دعوني أحصل على مدخل مستخدم
وأقوم فعليًا بشيء ما باستخدامه.
فلنفترض أنني أريد الحصول على اسم المستخدم ثم طباعته.
حسنًا، لقد رأينا المفسد لهذا منذ بضع دقائق،
ولكن دعوني أمضي قدمًا وأضيف إلى هذا البرنامج هنا.
الآن لدي سطر ثانٍ من التعليمات البرمجية، وأريد الحصول على سلسلة من مستخدم.
وباستخدام أي دالة يمكنني الحصول على سلسلة من المستخدم؟
دالة "Get string"، ولنتذكر أنه يمكنني كتابة
"get_string" ونفتح الأقواس.
ومن ثم يتوجب عليّ تمرير وسيطة، إذا جاز التعبير، مثل عرّفني ما هو اسمك--
أو في الواقع، ما الذي قلناه من قبل؟
ما هو اسمك، أعتقد كان المحث n\ فاصلة منقوطة.
الآن هذا ليس كافيًا للحصول على السلسلة.
ما الذي أريد فعله به؟
نعم، التخزين في متغير.
ما هو نوع المتغير؟
سلسلة.
لذا أحتاج فقط إلى الانتقال إلى الجانب الأيسر من سطر التعليمات البرمجية هذا
وأقول، حسنًا، أعطني سلسلةً.
وسأطلق عليها name، ولكن قد أطلق عليها x أو y أو أي شيء.
ولكن name يبدو واصفًا جيدًا لها،
باستخدام علامة يساوي واحدة للنسخ من اليمين إلى اليسار.
والآن لدي هذا.
الآن ليس من الكافي تخزين القيمة فقط في المتغير.
أحتاج إلى طباعتها.
لذا دعوني أبدأ بهذا.
يقوم Sandbox بالحفظ تلقائيًا.
لذا لا يتوجب عليّ الانتقال إلى الملف، أو حفظ أو أي شيء.
دعوني أمضي قدمًا وأكتب "make hello" الآن--
أوه، يا إلهي، انظروا إلى كل هذه الأخطاء بالفعل.
من الواضح أن هناك شيئًا ما خاطئ، نظرًا لما يظهره جهاز الكمبيوتر باللون الأحمر.
وبصراحة، هذا هو الوقت الذي تصبح فيه
هلعًا أو مزعورًا إلى حد ما بسبب،
يا إلهي، لقد كتبت فقط سطرين من التعليمات البرمجية.
كيف يظهر لي 20 سطرًا من الأخطاء بطريقة ما؟
لذا فجهاز الكمبيوتر في حالة من الارتباك مثلك تمامًا.
وأهم شيء، عندما تواجه هذا النوع من الحالات
حيث يكون مدخلاً خاطئًا ومشفرًا فقط، فابدأ من الأعلى.
حتى لو كانت نافذتك من النوع الصغير وبالتالي تظهر مجموعة كاملة من الأشياء
على الشاشة بسرعة، قم بالتمرير إلى الأعلى
لأن الاحتمالات ستكون أنه يوجد خطأ في الجزء الأعلى
وأن لهذا الخطأ الواحد تأثير متسلسل على المترجم.
وبعد ذلك يصبح الجهاز في حالة ارتباك، ويستمر في إظهار رسائل
لأنه تعثر في مرحلة مبكرة.
لذا فلنقم بالتمرير مجددًا لأعلى هنا.
ويوجد هنا الأمر الطويل جدًا الذي قلت إنه يقوم بالتشغيل الآلي من أجلك.
إذًا فهذا ليس خاطئًا.
يبدو أن الخطأ الأول موجود هنا، ولكنه ما زال مشفرًا قليلاً.
ولكن دعونا نجمع بعض المعلومات.
ها هي عبارة مألوفة--
hello.C دعوني أمضي قدمًا وأقوم بالتكبير في الأسفل هنا.
لذا hello.C يذكرنا باسم الملف الخاص بي.
وإن لم يكن ذلك واضحًا، يخبرني clang أن أنظر في السطر 5 ثم
الحرف الخامس الخاص بك.
إذًا شيء ما نقطتان شيء ما يعني رقم السطر ورقم الحرف أو العمود
إذا كنت تنظر من اليسار إلى اليمين.
وخطأ يعني خطأ.
ثم هذا هو المكان الذي تصبح فيه الأشياء معقدة بعض الشيء.
استخدام سلسلة معرّف غير معلنة--
هل كنت تقصد standard n؟
لا، ولكنني أعرف standard n،
أو بالأحرى يبدو مشابهًا لـ standard I/O. ولكن لا، أنا لم أقصد ذلك.
أنا متأكد من أن هذه التعليمات البرمجية صحيحة.
حسنًا، فلم أحصل على هذا الخطأ؟
يبدو أن السلسلة، على السطر الخامس، الحرف الخامس، هنا تحديدًا،
خاطئة.
حسنًا، اتضح أنه لا توجد سلسلة كهذه.
فلغة C، تشتمل على أعداد صحيحة، وتعبيرات بولينية.
وتشتمل على أحرف وأشياء أخرى قليلة.
لا تشتمل على سلاسل في الواقع.
السلاسل هي كلمة مفيدة لوصف تسلسلات
الأحرف، والفقرات، والكلمات.
ولكن السلسلة ليست نوعًا.
إنها ليست نوعًا لمتغير ما لم تجعلها كذلك.
وفي الحقيقة، هذه إحدى عمليات التبسيط التي نقوم بها.
في أول أسبوعين فقط من الدورة لكي ننطلق،
اتضح أننا بحاجة إلى إضافة سطر واحد من التعليمات البرمجية هنا.
نحتاج ليس إلى تضمين فقط standard I/O-- والذي سنقوم بشرحه بعد قليل--
ولكن أيضًا المكتبة المسماة CS50.
لذا يشتمل CS50 على الكثير من الأشخاص المرتبطين به، وبمرور الوقت قررنا،
أنه يمكننا جعل الساعة الأولى من CS50 أسهل قليلاً
وعلى هذا الجزء بتوضيح بسيط للأشخاص الذين ليست لديهم خلفية عن هذا
من خلال اختراع ميزات قليلة فقط بأنفسنا مثل القدرة
على الحصول على سلاسل من المستخدم.
لذا اتضح أيضًا أن get string ليست دالة
تأتي مع لغة C. فتلك قطعة لغز مخصصة، إذا جاز التعبير، تقدمها CS50.
وأنشأنا تلك الدالة يكون في ملف
يسمى CS50.h.
ولذا من خلال تضمين CS50.h، يمكنك الوصول الآن
إلى المزيد من قطع اللغز، إذا كنت ستفعل، التي قمنا بإنشائها لأجلك.
ويتضح أن هذا السطر من التعليمات البرمجية الذي
كان موجودًا هنا من قبل يقدم لك أيضًا ميزات.
نحن نقوم فقط بما يقوم به كل شخص في البرمجة،
وهو حل مشكلة مرة واحدة ومن ثم جعل الأشخاص الآخرين يستخدمون هذا الحل.
خمّنوا.
ما هي الوظيفة التي يتم تنفيذها في الواقع
في ملف باسم standard I/O input-output.h؟
هذا ملف موجود في مكان ما على الخادم ويأتي في الواقع مع لغة C،
ويقدم لك ميزات مفيدة مثل ماذا؟
انطقها مرة أخرى.
مجددًا.
Printf.
اتضح أن الوسائل التي يسمح لك عن طريقها باستخدام دالة
تسمى Printf هنا يجب عليك تضمين
الملف الذي يتم الإعلان عنه فيه.
لذا بعض الأشخاص، منذ سنوات، كتبوا حرفيًا دالة، قطعة لغز،
تسمى Printf، وأظهروا كيفية رسم
الأحرف على الشاشة.
وقاموا بعد ذلك بتخزين المعلومات عن تلك الدالة في ملف
يسمى standard IO.h.
إذا لم أقم بتضمين سطر التعليمات البرمجية هذا الذي يبدو مشفرًا
في الجزء العلوي من البرنامج السابق الخاص بي، فلم يكن حتى برنامج hello world ليعمل
لأن clang، المترجم، لم
يكن ليعرف ما الذي أتحدث عنه.
ما هو printf؟
لا أعرف ما هذا ما لم تخبروه
بتضمين هذا الملف أيضًا الذي كتبه الأشخاص منذ
سنوات والذي تم إنشاء printf فيه.
والآن إذا كنت أريد استخدام "get string"، بالإضافة إلى سلسلة الكلمات الرئيسية الجديدة،
أحتاج إلى إخبار clang المترجم، امضِ قدمًا أيضًا
وانظر في CS50.h للحصول على المزيد من الوظائف، مثل سلسلة
و"get string".
لذا دعوني أمضي قدمًا الآن وأحاول فعل هذا مجددًا.
سأزيل كل ما في النافذة الطرفية وأحاول القيام بالأمر نفسه مجددًا--
سأكتب make hello، enter، اللعنة.
الآن حصلت على خطأ آخر.
ولكن، ولكن، ولكن، تقدم.
حسنًا، لا، تقريبًا عدد الأخطاء نفسه مثل المرة الماضية، ولكنها أخطاء مختلفة.
لاحظوا الآن-- انتظروا، كان هذا من قبل.
أوه، لا، معذرة.
يشتمل على أخطاء أقل.
هنا حيث قمت بتشغيل الأمر منذ دقائق،
والآن حصلت على هذا الخطأ بدلاً من ذلك.
لذا تقدم.
الآن الخطأ ليس في السطر 5.
إنه في السطر 6، على الرغم من الحقيقة الشيقة، السطر 6 كان هو السطر 5.
لذا فهو على ما يبدو مرتبط بالمشكلة.
إذًا دعونا نقرأ رسالة الخطأ.
المشكلة في السطر 6، والذي ليس من المستغرب أنه هذا السطر هناك.
لكن هذه المرة الأمر مختلف-- خطأ، اسم متغير غير مستخدم.
هذا شيء أفهمه نوعًا ما حتى دون أن أكون مبرمجًا.
ماذا يعني ذلك؟
نعم.
ربما توضيح قبل الاستخدام، لكن يتبين أن هذه هي الطريقة التي نوضح بها ذلك.
لكنني في الواقع-- نعم.
الجمهور: في الواقع أنت لا تستخدم المتغير الذي أعلنته.
ديفيد: نعم، فأنا نوعًا ما أضيع وقت الكمبيوتر.
أنا أنشؤه.
إذًا فالسطر 6 على اليسار صحيح.
مرحبًا، كمبيوتر، أعطني سلسلة متغير،
وأطلق عليه اسمًا وضع قيمة فيه.
لكن ما فائدة هذا التمرين إذا لم تكن أبداً،
كما تقول، تفعل أي شيء به.
وفي الواقع، أذكر من الشريحة منذ لحظة،
كيف أفعل شيئًا به؟
حسنًا، هذه ليست الطريقة التي تفعل بها شيئًا به.
إذا مضيت قدمًا وشغلت هذا البرنامج الآن بنجاح،
ماذا سأرى في الواقع على الشاشة؟
مرحبًا اسم حرفيا، م-ر-ح-ب-ا فاصلة، مسافة ا-س-م، من الواضح أنه غير صحيح.
إذًا كيف أدخل المتغير؟
ماذا كانت الخدعة؟
نعم، النسبة المئوية S أي سلسلة، رمز تنسيق،
إذا جاز التعبير-- ومن هنا جاء اسم printf.
وبعد ذلك أحتاج إلى تمرير وسيطة ثانية إلى printf،
وأفعل ذلك بكتابة فاصلة ثم اسم المتغير الذي أريد إدخاله.
لاحظ الآن أن هناك فاصلتين في هذا السطر هنا.
إذا قمت بالتكبير، لاحظ أن هناك فاصلتين، ولكن هناك فقط
وسيطتين أو مدخلين لـ printf.
عادةً ما يسمى المُدخل إلى وظيفة ما، وسيطة
أو يسمى أيضًا معلمة.
إذًا هناك فاصلتان، لكن هذه الفاصلة هي فاصلة باللغة الإنجليزية فقط تفصل مرحبًا
عن اسم الشخص.
هذه الفاصلة البيضاء هنا، تم ترميزها بالألوان لأن برنامج Sandbox يفعل ذلك لي
تفصل في الواقع-- عفوًا-- الوسيطة الأولى
من الوسيطة الثانية.
إذًا الآن، لثالث مرة، أظهر مرحبًا إدخال.
يا إلهي، شكرًا لك.
الآن نجح الأمر.
ما زال يظهر هذا الأمر الملغز الطويل جدًا باللون الأبيض،
ولكن لا مشكلة.
وهذا هو، مرة أخرى، الأمر الآلي الذي تجعله Make ممكنًا بالنسبة لنا.
ولكن حقيقة أنني لا أرى أي لون أحمر، وأي أخطاء، مجرد مؤشر الكتابة مجددًا
يعني أن برنامجي قد تم.
لذا دعوني أمضي قُدمًا وأفعل هذا--
كيف أشغل برنامجًا إذا كان يسمى مرحبًا؟
نعم، نقطة خط مائل مرحبًا، وسنرى لماذا لدينا
نقطة غبية في البداية.
يعني أساسًا، قم بتشغيل البرنامج المسمى مرحبًا
الموجود هنا في مجلدك الحالي على الخادم--
نقطة خط مائل مرحبًا.
ما اسمك؟
لطيف جدًا.
ديفيد، إدخال.
مرحبًا، ديفيد.
مثير للإعجاب.
دعونا نجري تغييرًا واحدًا، لأنني فعلت هذا مصادفةً في وقت سابق كما لاحظتم.
ماذا لو حذفت مثلًا واحدة من حروف n\
هذا حرفيا الآن لا يخبر الكمبيوتر
أن يحرك المؤشر إلى خط آخر؟
لذلك دعوني أمضي قدمًا وأعيد تشغيل البرنامج.
انتظروا دقيقة.
هذا يبدو الأمر نفسه.
أنا فقط غيرت التعليمات البرمجية، ولكنه لا يزال يتصرف بالطريقة نفسها بالضبط.
أين الالتباس الذي وقعت فيه؟
لم أقم بتجمعيه.
على عكس سكراتش، المذهل لأنك فقط تضغط على العلم الأخضر
وهو يشغّل الرمز مجدّداً، ولدينا خطوة وسيطة ثانية.
يجب عليّ إعادة تشغيل التعليمات البرمجية.
الآن كيف يمكنك الخروج من برنامج؟
يمكنني فقط الضغط على Enter.
يمكنك أيضًا الضغط على Control C للإلغاء، وهذا سيخرجك
مهما كان الالتباس الذي وقعت فيه.
دعوني أمضي قدمًا وأعيد التشغيل، make hello--
يبدو هذا على ما يرام--
نقطة خط مائل مرحبًا، إدخال.
حسنًا، هذا هو سبب وجود كل حروف n\.
دعوني أكبر الصور على ما يحدث.
أعني، لا يبدو الأمر مروعًا، ولكن بصراحة من المزعج نوعًا ما
أن يبدو برنامجي بهذه
الصورة عندما أكتب مدخل المستخدم.
أعني، هذا فقط يبدو غبيًا.
على الأقل، يجب أن أضيف مسافة.
ربما يمكنني وضع حرف n\ لتحريك الحرف.
هذه هي واجهة المستخدم الآن.
هذا ليس منطقيًا حقًا.
إنها مجرد جماليات، ولكن أعتقد أن هذا يبدو غبيًا.
ولهذا السبب كانت هناك حروف n\ طوال الوقت،
ولكن هذا هو السبب في أنهم يجب أن يكونوا هناك لإخبار الكمبيوتر بأن يضع
الأشياء حيث تريد.
بدلاً من ذلك، أتعلم ماذا، حسنًا، أنا لا أحب ذلك.
Control-C للإلغاء.
دعوني أعيد هذا مجدّدًا.
ماذا يحدث لو تخلصت من هذا؟
واسمحوا لي أن أمضي قدمًا وأعيد تجميع التعليمات البرمجية أولاً
كما تلاحظون نقطة خط مائل مرحبًا إدخال.
حسنًا، لقد نظفت هذا الصداع الجمالي، إدخال.
أعني، إنها ليست المشكلة نفسها، لكن هذا يبدو غبيًا أيضًا
لأن علامة الدولار تمثل المحث حيث
من المفترض أن اكتب الأوامر ومع ذلك مرحبًا فاصلة ديفيد محث.
وهذه فوضى.
ولهذا السبب لدينا كل هذه الخطوط الجديدة.
الآن سألتم في وقت سابق، ماذا لو وضعتَ السطر الجديد في مكان آخر في السلسلة.
حسنًا، لنفترض أنني أفعل ذلك.
لنفترض أنني وضعت اثنين منهم.
دعوني أفعل هذا بلا مسافات على الإطلاق.
الآن هذا يبدو غريبًا بعض الشيء، ولكن الكمبيوتر سيفسر
هذا حرفيًا-- طباعة م-ر-ح-ب-ا فاصلة سطر جديد بديل في السلسلة
للنسبة المئوية S ثم خط جديد آخر.
إذًا كم عدد خطوط المُخرج التي سيعرضها هذا؟
سمعت أربعة.
قيم أخرى؟
لنرَ.
دعونا نمضي قدمًا ونكتب أظهر مرحبًا ثم شغل
نقطة خط مائل مرحبًا، ما اسمك كما ظهر من قبل، إدخال مرحبا فاصلة سطر جديد
ديفيد-- إذًا إجمالي أربعة سطور بالتأكيد أو سطرين فقط من الكمبيوتر
نفسه.
إذًا فقط للتلخيص، مع رمز مثل هذا
كم عدد الوظائف التي استخدمتها في هذا البرنامج بالتحديد؟
كم عدد الوظائف؟
إذًا هما اثنتان-- printf، التي كنا نستخدمها واحصل على
السلسلة، وهي الوظيفة الجديدة.
أين يتم إعلان السلسلة؟
CS50 نقطة h،بينما يتم إعلان printf معلنة في مخرج المدخل القياسي IO.h القياسي.
بينما، السلسلة، هذا النوع من البيانات يأتي أيضًا من CS50 نفسه،
ثم استخدمنا رموز التنسيق، وقد استخدمنا
المتغيرات لتحقيق النتيجة نفسها.
ودعونا فقط نوضح هذا الأمر.
بريان وكريم، هل لديكما مانع أن تصعدا لثانية واحدة؟
أو من هناك؟
إيرين، تعالي.
لذلك فقط لجعل هذا واضحًا لأن هناك الآن
بعض المصطلحات التي نريد استخدامها.
لنرَ.
هل تريد أن تكون--
ستحصل على "get string".
إذًا لدينا بعض بطاقات الأسماء هنا كما في الأحداث.
إذًا ستحصل إيرين على "get underscore string".
إذا كنت تريدين المضي قدما وارتداء هذه.
وبريان، تريد أن تكون printf.
إذًا نحن لن نؤدي جميع برامجنا الفعلية
لأن هذا سرعان ما سيتضح.
إذًا بريان هو printf.
حتى الآن رغم ذلك، لا يزال الأمر لطيفًا
أن لدي بعض الزملاء الذين أعمل معهم هنا
لأنني لا أريد حقًا فعل العمل الجاد كله لجعل الأمور تحدث.
فلو كنت بدلاً من ذلك المبرمج أو الموزع الموسيقي
لمجموعة كاملة من الأشياء التي تحدث، يمكنني بالفعل تنفيذ هذا الرمز الآن
مادية أكثر.
ورغم ذلك دعونا نركز، للحظة فقط على ماذا تكون الفوائد الأساسية.
واحد، يمكن للوظائف أخذ المدخلات.
تسمى هذه المدخلات وسيطات أو معلمات،
ويمكن للوظائف إرجاع الأشياء.
يمكنهم الحصول على قيم العودة.
Printf، على سبيل المثال، هل تأخذ المدخل؟
ما هو مدخل printf، على سبيل المثال؟
نعم، مثل مرحباً بالعالم.
أيًا كان ما تريد طباعته حسب التعريف هو المدخل إلى printf.
هل تعيد الطباعة قيمة حتى الآن؟
إنها تفعل شيئًا ما على الشاشة بالتأكيد.
إنها تطبع الأشياء على الشاشة، لكننا لم
نشاهدها تعيد شيئًا لأننا لم نر ذلك مع علامة المساواة
إلى اليسار.
الآن اتضح أن printf تعيد أشياء.
إنها ليست مفيدة للاستخدام في كثير من الأحيان، ولكننا فقط
شاهدنا printf للتو تأخذ مدخلات-- أكثر من تلك المرة الأخرى.
"Get string" في الوقت نفسه-- هل تأخذ "get string" مدخلات؟
كم عدد المدخلات؟
واحد فقط، المحث الذي تريد أن يراه الإنسان.
كان المحث الأول الذي استخدمته هو ما اسمك.
كان يمكنني أن أجعل المحث أي شيء، ولكن هذا
السؤال الذي تسأله "get string".
هل تعيد "get string" قيمة؟
نعم هي كذلك.
هذا بالطبع في سكراتش يسمى إجابة، مرمّز ضمنيًا كإجابة.
يمكننا تخزين أي متغير نريد.
لذلك دعوني أمضي قدمًا وأنفذ هذا البرنامج.
إيرين، اذهبي وأحضري لي سلسلة واسألي شخصًا، ما هو اسمه.
إذًا--
إيرين: ما اسمك؟
الجمهور: إليزابيث.
ديفيد: إذًا هي تكتب إليزابيث الآن.
لكن إيرين أخذت مدخلا مني.
إيرين، اذهبي واحصلي على اسم شخص ما و اسأليه، ما هو اسمه.
والآن أنتِ قد أنتجتِ مخرجًا لي.
شكرًا لكِ.
هذه هي القيمة المعادة، تخزين القيمة إليزابيث،
وأنا سأمضي قدمًا وآخذها بعيدًا
في متغير يسمى الاسم مثل هذه الورقة هنا.
حسنًا، بريان، هل يمكنك المضي قدمًا وإلقاء التحية على إليزابيث.
إذًا ما الذي يحدث هنا؟
أنا فقط أقوم بعمل أقل.
أنا أكتب هذا البرنامج--
إيرين، اذهبي للحصول على اسم شخص ما، بريان، هل يمكنك طباعة هذا.
وهذا ما كنت أفعله، البرمجة،
فقط تفويض الوظائف إلى وظائف أخرى أو في هذه الحالة
البشر الآخرين الذين يعرفون كيفية القيام بذلك.
وبصراحة، لا يتعين عليّ معرفة كيفية حصول إيرين على هذا الاسم.
هي حصلت عليه فقط.
لا يتعين عليّ معرفة كيف كتب بريان بهذا النوع الخاص من الأسلوب
الإنجليزي على الشاشة.
أنا أعرف فقط أنه يستطيع فعل ذلك، والآن برنامجي مكتمل.
شكرًا جزيلاً لكلٍ من هذين هنا.
سوف نستمر في مجرد لحظة على النحو التالي.
إذًا طوال هذا الوقت، كنا نعد من المسلمات
أن لدينا جهاز كمبيوتر فعلي يمكننا تنفيذ الرمز من خلاله،
وأقول دائمًا إن Intel بالداخل هذا الشعار السخيف الذي تراه بداخل
معظم أجهزة Mac والكمبيوتر الشخصي مع ما تملكه من أجهزة.
لكن وحدة المعالجة المركزية هي مجرد عقول للكمبيوتر.
وفي نهاية المطاف، تذكر أن الهدف
هو أن يحول الكمبيوتر فعليًا شيئًا مثل هذا--
رمز المصدر-- إلى رمز جهاز فعلي، أصفار، وأحاد.
وكان هذا كل ما يفعله Clang لنا في الواقع.
بالطبع، قمنا فقط بإظهار قليل مما يمكننا القيام به.
اتضح أنها ستصبح، ليس فقط هذه
الأوامر التي يمكننا تشغيلها، ولكن السمات الأخرى لـ C
وعلى وجه الخصوص مكتبة CS50.
قد رأينا فقط حتى الآن كيفية الحصول على سلسلة،
ولكن يمكنك الحصول على أعداد صحيحة وأحرف وأشياء غير تقليدية
مثل القيم الكسرية والمضاعفات، التي تحاول بالفعل حل الكثير من
المشاكل التي يمكن أن تحدث في جهاز الكمبيوتر.
واتضح أنه يمكنك تخزين أنواع مختلفة من المتغيرات، وليس فقط
الأعداد الصحيحة والسلاسل، ولكن bool تشير لبوليان وchars تشير للحروف.
ويمكنك تنسيق تلك الأشياء في printf.
لم نر سوى النسبة المئوية S. قد ألمحت إلى النسبة المئوية i مسبقًا،
لكن ما يزال هناك عدد قليل منها.
ولكن لدينا الكثير من الاحتمالات هنا.
ولكن دعونا نمضي قدمًا ونأخذ، استراحة، لنقل، خمس دقائق لنمنح الجميع
قسطًا من الراحة، استمعوا إلى بعض الموسيقى، ولنعد بعد خمسة دقائق
ونغوص بشكل أعمق في برامج أكثر تطورًا بلغة C.
إذًا تذكّروا أننا بدأنا بمقارنة بعض كتل سكراتش
مع تعليمات برمجية بلغة C التماثلية، لكننا فى الواقع لم نستخدم
معظم تلك الكتل بلغة C فقط حتى الآن.
إذًا دعونا نجرب عددًا من الأمثلة، سأكتب بعضها بشكل سريع
في كتابة التعليمات البرمجية على لوحة المفاتيح الخاصة بي، بعضها
تناولناه بالفعل على مواقع الويب الخاصة بالدورات.
لذا يمكننا فتحهم لتوفير بعض الوقت.
ولكن اسمحوا لي أن ألفت انتباهكم إلى ما
يكون CS50 Sandbox لأن هذه كانت الخطوة التي تجاوزتها سابقًا.
يمكن استخدام CS50 Sandbox للبرمجة في مجموعة من اللغات.
وسنستخدمه مبدئيًا في الفصل الدراسي لـ C.
ولكن إذا كتبت بلغة Java مسبقًا أو Python أو أي عدد من اللغات،
عندما تنتقل إلى Sandbox.CS50.io، يمكنك ببساطة
اختيار اللغة التى تريد الكتابة بها.
ثم في الجزء السفلي، سترى أنه يمكنك
تحديد الملف الذي ترغب فى إنشائه مسبقًا.
على سبيل المثال، ما قمت به في وقت سابق هو أنني اخترت لغة C في الأعلى، ثم
كتبت في الأسفل Hello.C لأن ذلك
كان اسم الملف الذي أردته.
ثم نقرت فوق ابدأ.
والذى أرشدني إليه هذا بالتحديد هو الواجهة التي كتبنا فيها
hello.C منذ لحظات، حيث يظهر محرر التعليمات البرمجية الخاص بي في الأعلى هنا،
وتظهر النافذة الطرفية الخاصة بي في الجزء السفلي،
ثم يتاح لي بدء كتابة التعليمات البرمجية فقط.
هذا يوضح كيف وصلنا إلى ما كنا عليه.
وإذا كنت ترغب الآن في الاستمرار مع بعض من هذه الأمثلة،
لاحظ أننا أعددناهم مسبقًا على الموقع الإلكتروني للدورة.
ويمكنك بالفعل النقر فوق الروابط الموجودة على موقع الويب الخاص بالدورة
وفتح نسختك الخاصة من sandbox بواسطة تلك التعليمات البرمجية.
لذلك إذا كان Wi-Fi يساعدكم على هذا، فإنكم مرحب بكم لتصلحوا الأوامر نفسها
وتشغلوها وتنفذوها.
ولكن كل شيء أيضًا سيكون على موقع ويب الخاص بالدورة لاحقًا.
لذا لا تحتاجون إلى كتابة كل شيء.
لذلك دعونا نمضي قُدمًا ونقدم مجرد مثال سريع.
سأسمي هذه int.C فقط حتى يمكننا تعزيز
بعضًا مما فعلناه منذ لحظات.
بدلاً من "get a string" مثلما فعلنا مع مثالنا hello، دعوني أمضي قُدمًا
ونأخذ لنقل عددًا صحيحًا، ومن ثم نطبعه
تمامًا مثلما قمنا بطباعة اسم.
لذا يتوجب عليّ المضي قُدمًا، فقط من خلال الذاكرة العضلية،
أتذكر أنني أحتاج إلى standard IO.h من الأعلى
ثم int main void ثم الأقواس المتعرجة.
ثم يمكنني القيام بإجراء الحصول على المدخل فى الواقع.
إذًا كانت هناك دالة من قبل تسمي "get string".
اتضح أن هناك دالة أخرى تسمى
"get int" إذا كنت ترغب في الحصول على عدد صحيح.
يمكنني بالفعل كتابة "get int"، ويمكنني أن أقول شيئًا
مثل العدد الصحيح هو المحث.
مثل، مرحبًا، يا إنسان، يرجى منحي عددًا صحيحًا.
أحتاج إلى فاصلة منقوطة في نهاية هذا السطر.
ثم كيف يمكنني حقًا تخزين القيمة المعادة من "get int" في متغير؟
تمامًا كما سلمتني إيرين صفحة من الورق فيها سلسلة،
استلمت ورقة فيها رقم، كيف يمكنني تخزينها في مكان ما؟
ماذا ينبغي عليّ حرفيًا كتابته في السطر الخامس هنا؟
"Int" مسافة ثم رقمًا أو شيئًا ما.
لذا سأسميه i فقط لأنه عدد صحيح،
ولكن يمكنني أن أسميه رقمًا أو أي شيء آخر.
ثم سأمضي قُدمًا وأطبع هذا.
إذًا printf-- دعنا نقول شيئًا مثل hello i فاصلة منقوطة.
ليس صحيحًا تمامًا، أليس كذلك؟
سيقوم هذا حرفيًا بطباعة hello فاصلة.
كيف يمكنني حقًا استبدال شيء ما؟
حسنًا، رأينا فقط كيفية الاستبدال في "strings"،
ولكن أعتقد أنني أجبت عن السؤال مسبقًا.
إذا كنت تستخدم النسبة المئوية i، فسيقول مرحبًا، يا كمبيوتر، ضع عددًا صحيحًا هنا.
ثم أحتاج فقط إلى وسيطة ثانية من printf
تمامًا كما سلمنا بريان وسيطة كذلك.
وقلت i.
أريد أن أقول i هنا.
ولكن هذا البرنامج ليس صحيحًا تمامًا بعد.
يوجد في ملف يسمى int. C لقد قمت بتضمين standard IO. h.
إنها في "main"، فما هو "main"؟
حسنًا، اليوم على الأرجح لن نلقي بالاً إلى هذا.
لكن "int main void" هو ربما أكثر طريقة ملغزة
يمكنك القول إنها معادل النقر فوق العلم الأخضر.
هذا كل ما يفعل، و سنعود في غضون أسابيع
لمعرفة لماذا هو "int"، لماذا هو "main"، لماذا هو "void".
لكن الآن، قرّر البشر قبل سنوات أنه
عندما تكتب برنامجًا بلغة C وتريد بدء تشغيل البرنامج،
يجب عليك حرفيًا كتابة "int main void" مع تلك الأقواس
مع تلك الأقواس المتعرجة، وهو المعادل ل Scratch
عند النقر فوق العلم الأخضر.
لكن هذا البرنامج لن يجمّع، ولا أريد حتى
أن أشعر بضغط رؤية هذه الأخطاء.
كيف أبطلها؟
نعم، أحتاج أن أعلم الكمبيوتر أن "get int" موجود،
وأنا أعرف مسبقًا كيفية القيام بذلك بواسطة تضمين المكتبة المسمّاة CS50.
من الناحية الفنية، CS50.h هو ملف رأسي.
.h يعني رأس الصفحة، وهو مجرد ملف يحتوي علي تعليمات برمجية بلغة C
حيث يتم إنشاء الدالات فيه.
علاوة على ذلك مرة أخرى، ولكن هذا فقط يعطينا حق الوصول إلى printf.
إذًا إذا لم أقم بأية أخطاء مطبعية، ينبغي عليّ أن أتمكن من تجميع
هذا البرنامج عن طريق تشغيل أي أمر؟
Make int.
يمكنني كتابة Clang.
كان يمكنني عمل Clang dash O. لكن الآن سأقوم بذلك بعملها ببساطة باستخدام
make int فقط واجعل make تقوم بعملية تجميع هذا البرنامج آليًا.
عدم وجود رسائل خطأ أمر جيد.
دعوني أمضي قدمًا وأكبر الصورة--
نقطة int خط مائل أعتقد أن هذا سيقوم بتشغيل البرنامج.
عدد صحيح، ماذا عن 42؟
Hello 42.
ولاحظوا، يمكنني توفير الوقت الآن.
وإذا كنت أريد تشغيله مجدّدًا، لا يتعين عليّ كتابة int خط مائل طوال الوقت.
واتضح أن في هذا النوع من بيئة Linux،
يسمّى نظام التشغيل هذا Linux، يمكنك بالفعل الذهاب لأعلى ولأسفل
ورؤية الأوامر السابقة التي قمت بكتابتها والبعض الآخر الذى
يكون لنظام معين.
وإذا ذهبت لأعلى وضغطت enter، فيمكنك تشغيله مجددًا، وكتابة 50 هذه المرة،
وهذا مخرج آخر أيضًا.
إذًا أي أسئلة على مثال مثل هذا؟
لا؟
حسنا، دعني أمضي قدمًا، وسأقوم بتوفير الوقت في هذه البيئة.
يمكنني بالفعل إنشاء ملفات هنا إذا أردت عن طريق النقر فوق رمز المجلد،
والنقر فوق علامة زائد.
ثم يمكنني بالفعل قول أعطني ملفًا باسم float.C.
هذا يعادل العودة إلى القائمة الرئيسية
وكتابة اسم الملف.
سأفعلها فقط بشكل أسرع
الآن في هذه البيئة الرسومية.
وأريد أن أسميها float.C.
يعد اسمًا غريبًا إلى حد ما لأنه على الأقل عندما كبرتم فإنكم
تعلمتم على الأرجح الأعداد الصحيحة.
ربما تعلمت الأعداد الحقيقية والأرقام
التي يمكن أن تحتوي على نقاط عشرية ثم أشياء بعد النقطة العشرية.
في الكمبيوتر، تلك الأشياء ذات النقاط العشرية
تسمّى قيم كسرية حقيقية أو "floats".
ويمكنك التفكير في الأمر على أن النقطة العشرية يمكنها أن تطفو نوعًا ما
يمينًا أو يسارًا، حسب كبر أو صِغر العدد
أو مدى دقة الأرقام بعد النقطة العشرية.
هذا هو "float".
لذلك اسمحوا لي بالمضي قدمًا وتنفيذ برنامج مشابه جدًا
include CS50.h include, standard IO.h int main void--
وبعد 20 عامًا من القيام بهذا، يمكنك أن تفعله بسرعة كبيرة.
الآن دعوني أحصل على float من المستخدم--
رقم حقيقي قد يحتوي على نقطة عشرية به.
سأفعل ذلك بطريقة مختلفة قليلاً.
سأقوم بالتكبير، وسأقول، أهلاً، كمبيوتر، أعطني float،
كما يسمى نوع البيانات هذا--
ليس int، ولا سلسلة ولكن float.
سأسميه f فقط لأنه يشير إلى float، وهو جيد
وموجز-- يساوي "get float".
ثم سأقول فقط float.
هذا هو المُحث.
يمكنني أن أجعل المحث باللون الأخضر أو أي شيء أريده.
والآن سأطبعه--
printf hello f، لكني لا أريد f.
أريد في الواقع طباعة عنصر نائب وربما يمكنك
التخمين من الآن ما هو النمط--
النسبة المئوية f التي تشير إلى "float" سطر جديد f فاصلة منقوطة.
إذًا هذا مثل البرنامج نفسه ثلاث مرات حتى الآن مع سلسلة، مع int،
وfloat.
ولكن مجدّدًا، إنها مجرد ذاكرة عضلية وانتقال عبر النمط،
لكن دعونا نرى ما يحدث بشكل مختلف هنا.
دعوني أمضي قدمًا وأكتب make float وأضغط enter.
حسنًا، جيد، لا أخطاء.
دعوني أكَبر هذا وأشغله الآن، نقطة خط مائل float.
ودعوني أمضي قدمًا وأكتب عددًا.
سأقول فقط 42.
ولكن الكمبيوتر لديه الآن القدرة على تخزين المزيد من الأعداد.
سابقًا كان مجرد عددًا صحيحًا حسب تعريف "int".
أما الآن فهو قيم كسرية "float".
إذًا برغم أن 42.0000 رقم دقيق جدًا،
هذا حقًا رقم حقيقي الآن، يخزن مقدارًا معينًا من الدقة هناك.
اتضح أنه رغم أننا يمكننا إجراء مزيد من الحسابات المشوقة.
اسمحوا لي بالمضي قدمًا وفتح هذا المثال أولاً.
سيسمّي هذا المثال int.C.
جتى لا يتعين عليّ كتابة كل شيء.
وفي ints.C، سنرى بعض الحسابات المكتوبة في التعليمات البرمجية التي
قمت بإنشائها مسبقًا فقط للتأكيد أنه يمكنكم بالفعل
القيام ببعض الحسابات الأساسية في برنامج.
يمكنني رؤية المزيد من التعليمات البرمجية هنا من خلال التمرير لأسفل،
ودعوني أمرر هذا لأعلى حتى يمكننا التركيز على "main".
واسمحوا لي بتكبير الأسطر القليلة الأولى.
في هذا السطر الأول، حصلت فقط على int، وأسميها x.
لم نستخدم متغيرًا يسمى x مؤخرًا.
لكننا سنستخدم الآن.
لا يختلف منطقيًا عن ذي قبل.
أحضر لي متغيرًا آخر هنا.
الآن نرى أنه يمكنك الحصول على متغيرات متعددة من المستخدم
تمامًا كما في سكراتش.
والآن في هذه السطور، الأشياء الملونة بالأخضر ليست سوى تنسيق
السلاسل-- فقط ماذا أريد أن يعرض printf؟
حرفياً، في هذا السطر البارز هنا، أريد printf أن يعرض x زائد y
يساوي شيئًا ما.
ما هذا الشيء؟
حسنًا، لاحظ أن الأمر الرائع في printf، هو أنه قبل أن يتم تمريره في مدخل،
يمكنك تنفيذ عمليات حسابية بسيطة.
لذا إذا كنت ترغب في إضافة x وy معًا، حرفيًا أجرِ x زائد y.
ثم مجموع هذه الأرقام هو ما سوف يتم تسليمه إلى printf كمدخل له.
تمامًا مثلما سلمت ورقة إيرين إلى بريان كمُدخل،
أنا لا أسلم x وy إلى بريان في هذه الحالة، بل x زائد y
أو قيمة ما، المجموع الفعلي.
وبالمثل، الطرح هو الشرطة الموجودة في لوحة المفاتيح.
وللضرب، لا يستخدم x.
سيكون هذا غريبًا، xxy.
ولكن تستخدم نجمة، أو رمز النجمة على لوحة المفاتيح الخاصة بك.
وللقسمة يستخدم الخط المائل الوحيد، والأخير هذا تقليدي قليلاً،
ولكننا سنستنتج بعض الاستخدامات لهذا.
يمكنك في الواقع إجراء عمليات حسابية معيارية أو ببساطة أكثر باقي القسمة.
إذا قمت بـ x نسبة مئوية y ، فسوف تسترجع ما تبقى من قسمة x على y.
وما هو الباقي؟
إذا كان x 20 و y 10، حسنًا، فتُقسم 20 على 10 على مرتين بشكل مثالي.
لذا المتبقي هو 0، على سبيل المثال.
لكن هذا كان منذ بعض الوقت.
لذا، لاحظ، رغم ذلك ما هو الغريب هنا.
في هذا السياق، لا تعد النسبة المئوية عنصرًا نائبًا.
إنها ليست النسبة المئوية S. إنها ليست النسبة المئوية i.
إنها ليست نسبة مئوية، لاحظ أنها ليست داخل سلسلة تنسيق printf.
هذه هي حرفيًا الرياضيات، مشغّل الرياضيات
كما هو موضح باللون الأزرق المختلف هناك.
إذا قمتُ بالفعل بتشغيل هذا--
لذلك دعوني أمضي قدمًا وأشغل هذا البرنامج.
سأمضي قدمًا وأكتب "make ints" الخاصة بنا --
في صيغة الجمع لأن هذا هو اسم الملف--
لنضغط على enter نقطة خط مائل "ints".
واسمحوا لي بتكبير الشاشة وإزالة ما فيها.
Enter.
أعطوني رقمًا.
سمعت رقم 2.
ورقمًا آخر.
سمعت رقم 10.
إذًا ولعلمكم 2 زائد 10 هو 12، 2 ناقص 10 هو سالب 8، 2 ضرب 10 هو 20،
2 مقسومة على 10 هو--
2 mod y، أو 2، ثم خذ المتبقي عند القسمة على y
هو معني أن mod يساوي 2.
إذًا حصلت على أربعة صواب من أصل خمسة؟
ما هو غير التقليدي قليلاً هنا؟
نعم، 2 مقسومًة على 10؟
مثل، أنا متأكد جدًا أن هذا قد يكون 2/10 أو ربما الخمس أو 0.2.
أعني، سأتقبل أي عدد من الإجابات لكن ليس 0.
إذًا ما الذي يحدث؟
حسنًا، هذا أمر يتعلق التمثيل.
اتضح أنه في برنامج الكمبيوتر، قررنا
مقدمًا أنني سأقوم بتخزين الأعداد الصحيحة.
والأعداد الصحيحة شيء لا يحتوي على نقطة العشرية.
ومع هذا أنا هنا أحاول بصلف
قسمة الرقم 2، وهو عدد صحيح على الرقم 10، عدد صحيح،
وأتوقع شيئًا بخلاف العدد الصحيح.
لا، أنا حرفيًا أقوم بعملية حسابية ذات عدد صحيح.
إذًا ما الذي يفعله الكمبيوتر على مايبدو بصورة حدسية؟
لماذا، عندما قسمة x على y كما فعلت في هذا السطر هنا--
أو تحديدًا في هذا المثال الذي اقترحتموه، 2 مقسومة على 10--
أين ذهب الناتج 2/10؟
أجل، من الناحية التقنية ماذا؟
من المفترض أن يكون 0.2 أو 0.2.
هذا في الواقع هو الحل لأنه، إذا كان 0.2 ولكن الأعداد الصحيحة
لا يمكنها تخزين النقاط العشرية أو أي شيء بعدها، ما الذي يتبقى لك؟
مجرد الصفر في البداية.
إذًا، العمليات الحسابية للأعداد الصحيحة شيء جيد إذا كنت تطبقها مع الأعداد الصحيحة،
ولكن إذا كنت تريد القيام بعمليات حسابية للكسور،
ستحتاج إلى إجراء بعض التغييرات.
ولذا يمكنني إصلاح هذا.
في الواقع، اسمحوا لي بالمضي قدمًا وكتابة برنامج مختلف هنا.
اسمحوا لي بالمضي قدمًا وفتح floats.C من موقع الدورة
التدريبية. هذا سيعطيني هذا المثال،الذي يتم تنفيذه
باستخدام قيم كسرية حقيقية بدلاً من تلك.
لذا بمجرد تحميل هذا، سأرى برنامجًا كتبته مسبقًا.
إنه أقصر قليلاً لأنني الآن أهتم بالنظر في مشكلة واحدة.
ولاحظوا الآن أن x وy قيم كسرية وليست أعدادًا صحيحة،
نوع البيانات الآخر الذي يوجد.
وأنا استخدام "get float"، والذي يأتي أيضًا من من مكتبة CS50.
ثم إن هذا السطر مشابه تقريبًا، ولكن أتعرف ماذا؟
اسمحوا لي بتعديل هذا.
اسمحوا لي بجعله مشابهًا تمامًا.
هذا السطر الآن الذي قمت بتحديده هو السطر نفسه تمامًا كالسابق.
لذلك إذا كتبت في الرقم نفسه--
إذًا دعونا نمضي قُدمًا بالتكبير وmake floats plural and dot خط مائل
floats.
سأقدم 2 و10، ويجب أن آمل في رؤية ماذا الآن؟
0.2.
هذا جيد جدًا ودقيق جدًا.
ولكن أتعرف ماذا؟
أكره أن أقول لكم هذا، ولكن دعونا ننظر أبعد قليلاً.
يتضح بشكل افتراضي، عندما تستخدم النسبة
المئوية f، سترى قليل من الأرقام العشرية، مثل 5 أو هكذا تبدو، بشكل افتراضي.
اسمحوا لي قليلاً برؤية المزيد.
كان هذا واحد واحد، اثنين، ثلاث، أربع، خمس، ست
نقاط بعد العلامة العشرية.
لذلك أتعلم ماذا؟
سأقول، مهلاً، أيها الكمبيوتر، أعطني سبع نقاط عشرية.
هذا يبدو مشفرًا تمامًا ويتعين عليك فقط
تذكر هذا نوعًا ما أو نسخه احتياطيًا إذا نسيت.
إذا قمت بوضع نقطه ورقم بين النسبة المئوية وf،
هذه هي الطريقة المشفرة لإخبار الكمبيوتر بإظهار
float ولكن مع العديد من الأرقام العشرية هذه، رجاءً.
وهذا يعطيني سبع أرقام عشرية، غريب كما يبدو التعبير.
نأمل الآن فقط في رؤية المزيد من الأصفار.
اسمحوا لي بالمضي قُدمًا وmake floats، واسمحوا لي بالمضي قُدمًا
وبالتكبير وعمل نقطة خط مائل floats 2 10 enter.
حسنًا ، لا تزال صحيحة.
اسمحوا لي بالتحلي بالقليل من الفضول.
دعونا نرى الكثير من الأصفار، مثلاً 50 صفرًا.
اسمحوا لي بالنزول هنا وكتابة make floats، لأنني غيرت التعليمات البرمجية،
نقطة خط مائل floats 2 10.
كذب مدرسو المدرسة الابتدائية عليكم.
2 مقسومة على 10 ليست 0.20000 إلى ما لا نهاية.
فهي على ما يبدو 0.20000000298023223876953125 ثم
كل تلك الأصفار.
ماذا يجري حقًا؟
أين الخلل؟
أين خطأي؟
أين سوء الفهم لدي؟
ما هو التفسير لهذا؟
حسنًا، ماذا لو قلت لكم أن داخل جهاز الكمبيوتر الخاص بكم شيئًا كهذا؟
هذه هي ذاكرة الوصول العشوائي أو الذاكرة، وربما كنت تعرف هذه الفكرة بشكل عام.
إتها فقط تخزن الملفات.
تخزن الموسيقى ومقاطع الفيديو.
أنت بحاجة إلى ذاكرة، نوع ما من المساحة.
مساحة القرص الثابت هي التخزين الدائم.
الرام، أو ذاكرة الوصول العشوائي، هي مساحة تخزين مؤقتة.
لذا عندما يكون الكمبيوتر المحمول مفتوحًا وأجهزة كمبيوتر سطح المكتب لديك قيد التشغيل
أو أن هاتفك مزودًا بالطاقة، وكنت تستخدم ذاكرة الوصول العشوائي لجميع البرامج
التي تقوم بتشغيلها في الوقت نفسه.
إذا قمت بفتح ملف، يتم تخزين هذا الملف في ذاكرة الوصول العشوائي،
ولكن يتم تخزينه بشكل دائم على محرك الأقراص الثابت لديك.
لذلك توجد أنواع مختلفة من الذاكرة.
ولكن لاحظ، هذا تم تكبيره.
في الواقع، هذا في حجم بوصتين وربما بوصة من حيث الطول.
إذًا فهي صغيرة جدًا، ولكن لا يهم حقًا مدى حجمها.
ما يهم فقط أنها محدودة من حيث الحجم.
لديكم أجهزة مادية في الدورات لديك أو في جيوبك أو في البيت
التي تكون كبيرة جدًا ولذلك لديها فقط الكثير من الأجزاء
وبالتالي لا يكون لديها إلا الكثير من الترانزستورات
وغيرها من الأجهزة التي تقوم في الواقع
بعمل تخزين المعلومات.
وإذا كان لديك مقدار محدود من الذاكرة، كيف سنقوم
بتمثيل عدد غير محدود من الأرقام؟
لأني أذكر من المدرسة الابتدائية أنني
تعلمت أنه يوجد عدد غير محدود من الأرقام، بالتأكيد الأرقام الحقيقة، حيث
يمكن للنقطة العشرية أن تستمر إلى الأبد.
هذه مشكلة إذا كنت تريد أن تمثل جميع الأرقام الممكنة
في الكون، والذي هو عدد لا نهائي، مع كمية محدودة من الأجهزة.
لذا في مرحلة ما، يبدأ جهاز الكمبيوتر الخاص بك في اختصار الأمور.
وما تراه حقًا هنا هو قريب
كما يمكن للكمبيوتر الوصول إلى تخزين هذا الكسر بالنسبة لك بالضبط،
وتحليت بالقليل من الجشع.
ونظرت قليلا بعيدًا إلي اليمين.
وقلت، هذه قيم صغيرة متناهية الصغر.
إنه ليس خطأ كبيرًا، ولكنه خطأ
لأنه لا يمكن توقع أن يقوم الكمبيوتر بتمثيل
عدد لا نهائي من القيم باستخدام مقدار محدود من الذاكرة.
يجب أن تلتوي هنا أو هناك وتكون غير دقيقة، إذا جاز التعبير.
إذًا هل هذه مشكلة؟
أعني، لم نكن لنعرف يومًا هذا لو لم أكن جشعًا
ونظرت إلى 50 رقمًا عشريًا بدلاً من من 7، والذي كان دقيقًا جدًا.
هل هذه مشكلة؟
نعم، لماذا؟
لماذا؟
الحضور: إذا كنت تستخدم الدالة المساوية، [غير مسموع]..
ديفيد: نعم، هذه إجابة جيدة.
منطقيًا، إذا بدأت في استخدام يساوي يساوي لمقارنة الأشياء من أجل المساواة،
سيكون من الصعب حقًا بالنسبة لي من أي وقت مضى مقارنة شيء لأجل 2/10
كما أنها قيمة لأنني سيتعين عليّ حرفيًا
تذكر أو كتابة أو توضيح هذه القيمة ومقارنتها مع ذلك
وليست مجرد مقارنة على نحو غير مضبوط مع 0.2.
وهذا صحيح، يجب عليك في الواقع عدم مقارنة قيم الـ floating
في التعليمات البرمجية للمساواة.
ربما يمكن أن أنطلق باستخدام أقل من أو أكثر من،
ولكن حتى ذلك الحين سيكون بعيدًا قليلاً عن ما أتوقع.
لماذا قد يكون هذا الخطأ مثيرًا للقلق؟
متى لا تريد أن يكون جهاز الكمبيوتر الخاص بك غير دقيق؟
ما هي المجالات؟
ما هي العوالم خارج الفصل الدراسي؟
أجل؟
ما هذا؟
الجمهور: صاروخ.
ديفيد: نعم، الصواريخ، أو أي شيء يتضمن الرياضيات والفيزياء والخطر.
لا تريد أن تكون الأرقام بعيدة بعض الشيء.
وإذا كنت تفكر في ذلك، فالصواريخ هي مثال جيد
لأنني لا أعرف الكثير عن الصواريخ، لكنني أعرف أنهم ينطلقون بسرعة كبيرة
وربما توجد زوايا متضمنة لأنك
تحاول الحفاظ عليها على مسار ما.
وهذا جيد.
ولكن إذا كان مسارك بعيدًا قليلاً
وسينطلق شيء ما بسرعة كبيرة وبعيدًا جدًا،
أنا متأكد في نهاية المطاف أن صور عدم الدقة الصغيرة تلك ستبدأ في الزيادة.
وبالفعل، كانت توجد حوادث تاريخية
حيث هذا النوع من عدم الدقة، في الواقع، يزداد
في مجال العمليات العسكرية أو في العمليات المالية.
في الواقع، إذا سبق لك أن شاهدت فيلم Office Space أو Way Back أو Superman 3،
هكذا يجمع بعض الناس بعض المال لأنهم فقط
احتفظوا كل كسور السنتات التي كانت أنظمة الكمبيوتر
تتجاهلها.
وفي النهاية، تبدأ في الزيادة.
قصة قصيرة جدًا، في أي وقت لديك مجموعات بيانات كبيرة علمية أو مالية
أو أي نوع من مجموعات البيانات الكبيرة التي تتضمن أعدادًا كبيرة والكثير منها
والكثير من الوقت، هذه مشكلة.
ويقترح هذا تقريبًا عليك عدم استخدام لغة C أو ترك أجهزة الكمبيوتر وحدها
ما لم نطلب هذا بالفعل.
الآن كمفسد لتشويق الأحداث، فقد قام البشر بالتخلص من هذه المشكلة،
ويمكنك استخدام المزيد والمزيد من وحدات البت ولكن ليس عددًا لا نهائيًا.
في مرحلة ما يجب عليك رسم خط، ولكن لهذا
السبب، على سبيل المثال، قد تقوم بورصة الأسهم فقط
بتمثيل اثنتين من النقاط العشرية للدقة
بالنسبة للدولارات أو ربما تكون أربع نقاط عشرية للآلف للدولارات
والسنتات.
وعليهم فقط أن يقرروا، هذه هي الدقة التي
يمكننا بالفعل تخزينها بدقة.
لكن عليك أن تقرر كيف تتعامل مع هذا وليس مجرد تجاهل المشكلة.
لكن يمكننا أن نفعل ما هو أفضل قليلاً.
أتعلم ماذا؟
يتضح أنه في معظم أجهزة الكمبيوتر أن float،
تأخذ كمية محدودة من المساحة، نعم،
ولكن على وجه التحديد للغاية 32 بت من المساحة أو 4 من وحدات البايت.
وحدة بايت، تذكر، تساوي 8 من وحدات البت.
إذًا 4 وحدات بايت تساوي 32 وحدة بت، وهذه مجرد وحدة قياس مشتركة.
لكن توجد واحدة أخرى.
اتضح أنه، إذا كنت تريد ضعف عدد وحدات البت،
يمكنك حرفيًا استخدام نوع بيانات يسمى الضعف.
وفي مكتبة CS50، توجد دالة تسمى "get double".
وإذا مضيت قُدمًا وفعلت ذلك هنا، يمكنني الآن إعادة تجميع هذه التعليمات البرمجية،
make floats، على الرغم من أنها ليست من أنواع الـ float من الناحية التقنية بعد الآن.
واسمحوا لي بالمُضي قُدمًا وكتابة نقطة خط مائل floats enter،
ودعوني أكتب 2 و10.
والآن لا يزال الأمر غير دقيق.
لكن لاحظ، بدلاً من سبعة أصفار، التي أعتقد أنني حصلت عليها من قبل،
الآن لدي 1، 2، 3، 4، 5، 6، 7، 8، 9، 10، 11، 12، 13، 14، 15 من الأصفار.
لذلك فقد دفعت المشكلة نوعًا ما للخارج أكثر، إذا جاز التعبير،
لذلك فهذا أكثر دقة.
لكنها ليست مثالية.
لا يمكنك الحصول على قيم مثالية مؤكدة إذا كنت
تريد أن تكون قادرًا على تمثيل نطاق لا نهائي.
هل توجد أي أسئلة حول هذا؟
وسنعود إلى بعد التضمينات.
أجل، هنا.
الجمهور: إذًا هل سيكون دائمًا أفضل إذا استخدمت
doubles لأنها أكثر دقة؟
ديفيد: سؤال جيد.
هل سيكون من الأفضل دائمًا استخدام doubles نظرًا لأنها أكثر دقة؟
الجواب باختصار، نعم، ولكننا سنعرف بشكل موضوعي في هذه الدورة
وعلوم الكمبيوتر بشكل عام أنه توجد دائمًا مقايضة.
ونعم، إذا كنت تستخدم double، سوف تتجنب هذه المشكلة بشكل أكثر قليلاً،
ولكن ما هو الثمن الذي ستدفعه، إذا جاز التعبير؟
ربما طاقة المعالجة لأنه سيضطر إلى التعامل مع المزيد من وحدات البت في وقت واحد،
وبشكل حرفي أكثر، المزيد من المساحة.
أعني، بالطبع يمكننا أن نأخذ الحل الخاص بك، ولكن أنا
سأحاسبك ضعف عدد وحدات البت.
وقديمًا، منذ عقود مضت، عندما تم اختراع لغة C لأول مرة
وكانت أجهزة الكمبيوتر ظاهرة فعلًا في المشهد، كان إنفاق ضعف عدد وحدات البت،
حتى لو كان فقط 32 أكثر من الأصفار الصغيرة والآحاد،
وكان هذا مكلفًا بالفعل من الجانب المالي، ويمثل زيادة.
وحتى اليوم، إذا أردت أن تشغل المزيد من المساحة،
هذا جيد، لكنك ستنفق.
مساحة أكبر، وبالتالي مال أكثر، وبالتالي
يكون لديك مساحة أقل متوفرة لأشياء أخرى.
إذًا، إنها مجرد مقايضة.
وعليك أن تقرر، باعتبارك بشري ذكي،
حيث تكون نقطة الانعطاف الصحيحة بين ما هو أكثر أهمية.
دعوني أقدم مثالاً مختلفاً جداً يسمى الآن التكافؤ، كمجرد مثال.
ودعني أسأل هذا كيف تعرف إذا كان الرقم زوجي أو فردي؟
ما هي الطريقة؟
نعم، إذا كان مقسومًا على 2-- لذلك 0 و2 و4 و6
تكون زوجية بسبب أنه، إذا قسمتها على 2 لا تحصل على باقي.
لذلك في الواقع، إذا كنت ترغب فقط في رؤية مثال سريع لماذا
قد تستخدم ما تبقى، حتى وإن كان خارج السياق.
إليك مثال عن التكافؤ.
التكافؤ هو مجرد مصطلح يشير إلى إلى زوجي أو فردي في هذا السياق.
كيف يمكننا استخدام هذا؟
حسنًا ، لاحظ أنه يمكنني الحصول على عدد صحيح من المستخدم في الأعلى.
يمكنني بعد ذلك التحقق من تكافؤ العدد الصحيح-- هل هو زوجي
أو فردي-- مع صيغة مثل هذه.
الآن أنا أقوم بجمع بعض من تلك الرموز
لأنك قد تميل بشكل حدسي.
إذا كان n، الرقم المكتوب من قبل المستخدم، أو mod 2، أو مقسومًا عليه
ثم تحقق من الباقي، ولكن هذا يقال أفضل، يساوى يساوي صفرًا،
لقد قلت للتو إنه رقم زوجي--
لذلك اطبع زوجي وإلا اطبع فردي.
لأن ما هو الباقي الآخر الممكن؟
فإذا قمت بإجراء n أو أي قيمة مقسومة على 2، فقد تحصل على باقي من 0 أو 1.
ليس لدي سوى التحقق من واحد من تلك، 0 لأن الآخر يتضمن
الشيء الآخر.
مرة أخرى، مثال بسيط للغاية.
لكن بصراحة، كلنا على الأرجح لدينا فهم بديهي
لما هو الزوجي وما هو الفردي.
يحتاج الكمبيوتر أن يتم تعليمه ذلك، ولهذا
يوجد برنامج يفعل هذا تمامًا.
اسمحوا لي بفتح برنامج أكبر يسمى الشروط،
بدلاً من كتابة هذا خارج البرنامج، لأنه عبارة عن بضعة أسطر من التعليمات البرمجية،
دعوني فقط أفتحه لأنه يختتم
تمامًا التعليمات البرمجية التي رأيناها منذ فترة وجيزة على الشريحة
عندما قمنا بمقارنته مع كتلة C مماثلة.
في هذا البرنامج، في دالتي الرئيسية-- دعوني أركز على السطور القليلة الأولى
هناك--
لدي عدد صحيح يسمى x الذي أحصل عليه عبر "get int"،
عدد صحيح آخر يسمى y الذي أحصل عليه عبر "get int"،
ثم أقوم فقط ببعض المقارنات البسيطة.
لقد رأينا هذا من قبل عندما قمنا بمقارنته مع سكراتش،
ولكن هذه بكل بساطة هي التعليمات البرمجية نفسها في سياق
بدلا من مجرد رؤيتها بشكل ثابت على شريحة.
لذا اسمحوا لي بالمُضي قدمًا وتجميع هذا-- make conditions enter.
يبدو أنه يقوم بالتجميع.
اسمحوا لي بالتكبير وكتابة نقطة خط مائل conditions enter.
x سيكون، لنقل، 2 مرة أخرى، y سيكون 10.
x في الواقع أقل من y.
إذا قمت بتشغيله مرة أخرى-- ويمكنني توفير الوقت عن طريق عرض المحفوظات لدي
وفقط الضغط على Enter.
دعونا نكتب 2 و2، وفي الواقع x تساوي y وهكذا.
مرة أخرى، نوع التعليمات البرمجية نفسه بالضبط كما كان من قبل ولكن الآن
في سياق برنامج يعمل.
ماذا لو كنت أرغب بالفعل في الحصول على مدخل المستخدم مثلما فعل طالبنا السابق
مع الحصول على إجابات نعم أو لا على سؤال التفاح أو الكاب كيك؟
حسنا في answer.C، يتضح أنه يمكنك فعلاً
الحصول على مدخلات نصية من المستخدم، وربما ببساطة نعم أو لا أو فقط y
أو n للإيجاز.
وفي هذه الحالة، إذا حصلت على حرف واحد فقط،
يتضح وجود نوع بيانات منفصل للحرف.
إذا كنت لا تريد سلسلة كاملة، كلمة كاملة مثلاً
أو فقرة أو جملة أو مهما يكن، أنت تريد حرفًا واحدًا فقط.
يمكنك بالفعل استخدام ما يسمى char أو حرفًا.
وهكذا هنا أنا استخدام دالة أخرى باسم مناسب تسمى "get char".
أقوم بتخزينها في متغير يسمى C لأنه حرف من نوع لطيف ومقتضب
من الدالة char ثم لاحظ هذا.
ربما لم تر هذه الصيغة من قبل،
خاصة إذا لم تقم بالبرمجة من قبل حتى في سكراتش.
ولكن ربما تكون قد شاهدت هذه الكتلة المشابهة لتلك الموجودة في سكراتش.
ما الذي يشير إليه الشريط الرأسي المزدوج هنا؟
أو، هذا هو.
إذًا في سكراتش، إنه لطيف وسهل الاستخدام.
إنهم يقولون حرفيًا فقط O-R. في البرمجة، إنها
في كثير من الأحيان الحالة التي تستخدم تسلسلات مشفرة من الحروف أكثر
واثنين من القضبان العمودية، التي عادة ما تكون
فوق مفتاح Enter على لوحة مفاتيح أمريكية.
إذا كان C يساوي يساوي y كبير أو C يساوي يساوي y صغير--
دعونا نفترض أن المستخدم يريد أن يقول نعم والمضي قُدمًا ويقول نعم.
أيضًا إذا كتب المستخدم n بالأحرف الكبيرة أو بالأحرف الصغيرة،
دعونا نفترض أنه أو أنها تعني لا ونقول لا وفقًا لذلك.
وماذا سنفعل غير ذلك؟
على ما يبدو لا شيء، وهذا جيد.
لا تحتاج إلى حالة افتراضية إذا كنت ترغب في ألا يقوم البرنامج بأي شيء.
قد يكون مربكًا بعض الشيء لأنه يمكن للمستخدم كتابة بعض الكلمات العشوائية
ولا يحصل على أي مخرج، ولكن هذا قرار التصميم.
منطقيًا هذا فقط كيف يمكننا التعبير عن هذا.
ماذا حقًا عن بناء الكتل الخاصة بنا؟
هل توجد أي أسئلة، رغم ذلك، قبل أن نبدأ في الإنشاء؟
لذا تذكروا أنه في سكراتش كان لدينا مثال السعال هذا.
اسمحوا لي بالمضي قدمًا وإنشاء ملف هنا بسرعة
يسمى cough0.C ونوع من إعادة إنشاء ما قمنا به الأسبوع الماضي.
Include standard IO .h int main void--
مرة أخرى، مجرد ذاكرة عضلية الآن--
ثم printf اقتباس وإنهاء الاقتباس "cough" فاصلة منقوطة.
أتعلم ماذا؟
اسمحوا لي بالمُضي قُدمًا والسعال ليست مرة واحدة، ولكن مرتين، ثلاث مرات.
في اللحظة التي تبدأ فيها بالنسخ واللصق،
فأنت غالبًا لا تكتب تعليمات برمجية جيدة.
إنه ليس قابل للتعديل بشكل جيد.
الآن إذا كنت أريد تغيير الكلمة أو ترجمتها إلى لغة أخرى،
لا بد لي من تغييرها في ثلاثة أماكن.
قررنا بالفعل الأسبوع الماضي أن هذا سيئ.
فماذا سيكون أفضل في C أو في سكراتش أو بشكل عام
من هذا النهج؟
نعم، التكرار الحلقي.
لذلك اسمحوا لي بفعل ذلك اسمحوا لي بإنشاء ملف آخر.
سأطلق على هذا cough1.C، هو الإصدار الثاني الخاص بي.
اسمحوا لي بالمُضي قدمًا الآن ونسخ الكود الأصلي ولصقه،
ولنقم فقط بتحسينها.
دعونا نتخلص من اثنتين من هذه، ودعونا نرى ما إذا كنا لا نستطيع التعبير عن "for".
لذلك كانت "for"--
دعني أقوم بالتكبير--
int i = 0.
i أقل من رقم ما.
قبل أن يكون 50.
الآن سأجعلها 3.
i++ أقواس متعرجة، والآن اسمحوا لي بتحريك كتلة cough بالداخل هنا
وأضع قبلها مسافة حتى تبدو جميلة.
ولاحظ أسلوبيًا، لقد كنت أفعل هذا بشكل غريزي لبعض الوقت.
كل شيء مسبوق بمسافة بشكل جيد لجعله أكثر قابلية للقراءة،
تماما مثل كتل سكراتش، حتى فالكثير من المساحات البيضاء
لا يهم بالنسبة للكمبيوتر.
لذا في حالة المضي قُدمًا وتشغيل هذا--
دعوني أسحب النافذة الطرفية حتى أتمكن من رؤيتها.
ولنكتب Make cough1, enter--
يبدو جيدًا-- ./cough1 سعال سعال سعال.
هذا أمر جيد، ولكن أذكر أننا قمنا في الواقع بتحسين هذا التصميم بشكل أكثر
من خلال تجريده بعيدًا.
اسمحوا لي بالمُضي قُدمًا وتصميم الدالة الخاصة بي الآن.
اسمحوا لي بالمُضي قُدمًا وفتح ملف جديد، C.cough2
تمامًا مثل ما كان لدي برنامج سكراتش آخر.
مرة أخرى، include standard IO.h int main void، ثم هنا
دعوني أمضي قدمًا وأفعل ماذا؟
حسنًا، for int i get 0, i أقل من 3, i +++ أقواس متعرجة.
ثم اسمحوا لي بالمُضي قُدمًا وأنادي cough.
وسيكون لطيفًا في حالة وجود السعال، ولكن للأسف السعال غير موجود.
كما أنها ليست في مكتبة CS50 أيضًا.
لذلك هذا لن يساعدنا.
يجب علي أن أصمم دالتي الخاصة.
إذًا في سكراتش، تذهب إلى جزء الكتلة
وتصنع الكتلة الخاصة بك ويظهر المحث الكبير
ثم تصنع قطعة اللغز الجديدة.
هنا سيتعين علينا أن نكون عمليين أكثر بقليل،
ويتضح أنه يمكنك القيام بذلك بهذه الطريقة.
وبعض من هذه التفاصيل سيكون غير واضح في البداية،
لكنني سأمضي قُدمًا وأستدعي الدالة cough.
وcough في هذه اللحظة لا يحتاج إلى أخذ أي مدخلات.
لذلك فالكلمة الرئيسية هنا هي void.
وقد رأينا ذلك من قبل بالفعل.
وMain أيضًا لم تأخذ أي مدخلات.
لهذا السبب كانت لدينا كلمة void، ولكنها كانت أكثر في ذلك الوقت.
وcough لن ينتج أي شيء أيضًا.
سيقوم بالطباعة على الشاشة تمامًا مثلما فعل براين.
لكن براين، أذكر، لم يسلم لي أي شيء ماديًا.
لذلك لا توجد قيمة مرتجعة.
لذلك سأقول void على يسار cough.
لذلك لأغراض اليوم، هذا يعني فقط أن cough لا يأخذ
مدخلاً أو يرجع قيمة كمخرج.
هذا هو الأمر، void، void.
الآن هيكل هذه الدالة، إذا جاز التعبير،
أنا فقط سأمضي قُدمًا وأقول ببساطة تمامًا cough فاصلة منقوطة.
هذا هو الأمر.
إذًا الآن لدي قطعة لغز الغرض منها في الحياة
هو السعال، والذي يعني الآن أنني يمكني تسميتها باسمها
هنا عدة مرات كما أريد.
لذا دعوني أمضي قُدمًا وأجمع هذا.
أنا حقًا أبلي بلاءً حسنًا.
كل شيء كان يعمل بشكل جيد حتى الآن-- make cough2, enter، أخطاء حمراء.
إذًا هذا مثير للاهتمام، وهذا يذكرني بالخطأ السابق نوعًا ما.
إذًا أولاً، ما هو السطر الذي يقع فيه خطأي؟
سبعة والحرف تسعة، إذا كنت تهتم، لكنه سبعة، في السطر سبعة--
التصريح الضمني للدالة cough غير صالح في C99.
يشير C99 حرفيًا إلى 1999 عندما تم اختراع هذا الإصدار من C،
إذًا إعلان ضمني لدالة cough.
لكن هذا هنا.
حسنًا، انتظروا دقيقة.
بديهيًا، دعوني فقط أحرك هذا.
دعوني أحركه لأعلى.
دعونا نرى ما سيحدث.
Make cough2-- يا إلهي.
قام هذا بإصلاحه.
لماذا؟
حتى لو كنت لم تقم بالبرمجة من قبل، فكّر في السبب بديهيًا
لماذا حل هذا شيئًا ما.
الجمهور: أنت تحمل الدالة التي
قمت بالإعلان عنها من قبل.
حتى على الرغم من أنك تجعلها فارغة، فأنت على الأقل قد [INAUDIBLE]..
ديفيد: تمام.
لأنني في السابق كنت أحاول استخدام cough في وقت سابق في السطر 7،
لكنني كنت أعلم الكمبيوتر فقط ما هو cough
في أسفل الملف.
بصراحة إن لغة C بكماء نوعًا ما.
إنها تقرأ حرفيًا تعليماتك البرمجية من أعلى إلى أسفل اليسار أو اليمين.
وإذا حاولت القيام بشيء قبل أن تقوم بتعليم الكمبيوتر كيف
تقوم بذلك، ستحصل على هذا النوع من المعرّف غير المصرح به
لأنه لا يعرف ما هي الكلمة حتى الآن.
الآن في سكراتش، هذا ليس أمرًا كبيرًا.
أنت فقط تحرك قطع اللغز في أي مكان تريده.
ترتيب الكتل ماديًا على الشاشة لا يهم.
ولكن في لغة C، مهم.
لكن بصراحة، هذا يبدو مزعجًا بعض الشيء
أن يظل البرنامج الرئيسي في تمدد أبعد وأبعد
لأسفل كلما أضفت تعقيدًا إلى برنامجي.
لذلك هناك حل آخر.
اسمحوا لي فعلا بالمُضي قُدمًا ووضع هذا مرة أخرى في المكان
الذي يكون فيه وهذا لأنني دقيق قليلاً.
أنا فقط أحب بشكل تقليدي أن تكون main في القمة، وبصراحة هذا أسلوب جيد.
إذا كان main هو الدالة الأهم في البرنامج لديك افتراضيًا--
إذا كان الدالة الرئيسية وهو ما يتم استدعاؤه أولاً بشكل افتراضي
عن طريق الكمبيوتر--
فلماذا سأدفعه إلى الأسفل لمجرد
التغلب على هذه التفاصيل الغبية؟
حسنا، أنا فقط بحاجة لتعليم الكمبيوتر ما هي الدالة،
ويمكنني أن أفعل ذلك ببساطة من خلال قول ذلك.
هذا ما سنطلق عليه النموذج الأولي لدالة.
إذا كنت حرفيًا فقط تنسخ السطر الأول
منه، والذي يحتوي على اسمه، ومدخلاته إن وجدت، ومخرجاته إن وجدت،
فيكون نموذجًا أوليًا فاصلة منقوطة.
إنه حرفيًا نسخ ولصق من الدالة نفسها،
ولكن هذا الآن تلميح كافٍ لقول، أهلا، يا كمبيوتر، هذا الهيكل موجود.
هذه معلومات تكفي لك ثم تقوم بتسميتها لأن الكمبيوتر،
طالما أنه قد رأى اسم الدالة من قبل، فإنه
جيد، إذا كانت الأصفار والآحاد، إذا جاز التعبير، التي تتضمنها جاءت في وقت لاحق بعد قليل.
وهذه هي الطريقة التقليدية لحل هذه المشكلة.
حتى لو بمجرد الحدس، خمنوا، إذا لم يكن
الكثير من القفزات غير المباشرة، الموجودة في standard I/O.h، الموجود في CS50.h.
هذه الأنواع التي سنقوم بتسميتها الإعلانات.
لذلك حرفيًا في standard IO.h هناك سطر من التعليمات البرمجية الذي
يعلم الكمبيوتر ما هي مدخلات printf
وما هي مخرجات printf إن وجدت.
في CS50.h، هناك حرفيًا سطر من التعليمات البرمجية
الذي يخبر الكمبيوتر ما هي مدخلات "get strings" وما هي مخرجاته.
والشيء نفسه لـ "get int" و"get float" و"get char" وآخرين--
هذا كل ما في ملفات الرأس تلك.
الأصفار والآحاد، إذا جاز التعبير، هي في الواقع
في الملفات التي تسمى حرفيًا standard IO.C وCS50.C،
على الرغم من أن هذه هي تعليمات المصدر البرمجية من الناحية الفنية.
الأصفار والآحاد موجودة في ملف مُجمع في مكان آخر على النظام.
ولكن كل هذه الأشياء التي أخذناها كمسلمات،
الآن نأمل أن تكون أكثر منطقية
لأن، حقيقة أنني أضع التضمين الحاد
في الأعلى، هو مجرد حل لمشكلة.
في هذا الملف ما يكفي من المعلومات لتعليم الكمبيوتر ما هو printf
أو ما هو "get string" وأشياء أخرى
بحيث لا أتحمل عناء تحريك الأشياء
أو نسخ ولصق الشخص الذي كتب printf، أو رمزه أو رمزها،
في برنامجي.
الآن دعونا نقوم بمثال واحد نهائي مع السعال
ونمضي قُدمًا وندعو هذا cough3.C
ونمضي قُدمًا ونلصق تعليماتي البرمجية نفسها كما حدث منذ لحظة لنبدأ.
وتذكروا أن الخطوة الأخيرة من مثال السعال الخاص بنا
الأسبوع الماضي كان في الواقع إعطاء cough مدخلاً.
أنا أريد ضم هذه التعليمات البرمجية نوعًا ما
حرفيًا إلى cough3 لأن هذا تجريد لطيف حقًا.
لا أريد أن يفكر "main" في عدد المرات--
فقط السعال ثلاث مرات.
هذا تجريد بشري مفيد وجيد.
الآن دعونا نضع الدالة هنا.
لذلك إذا أردت أن يتحمل "cough"
مدخلاً مثل 3، فأي واحد من "void" يحتاج للتغيير؟
هل الموجود على اليسار أو على اليمين؟
اليمين، الموجود بداخل الأقواس.
ويتضح، مثلما يمكنك إعلان المتغيرات داخل دالة،
كما فعلنا، إذًا يمكنك الإعلان عن الوسيطات لدالة هكذا.
لذلك يمكنك مناداته بأي شيء تريد، على الرغم من أهمية نوع البيانات، ولكن هذا
يقول الآن، أهلاً، كمبيوتر، "cough" لا ينتج قيمة،
مثل إرجاع إيرين قطعة من الورق.
أهلاً، كمبيوتر، يأخذ "cough" مدخلاً واحدًا.
إنه عدد صحيح وأطلق عليه n.
والآن بعد أن فعلت هذا، الآن يمكن أن يكون لديك سطر من التعليمات البرمجية هنا
مثل هذا.
For int i = 0, i أصغر من n i زائد زائد--
ثم، موافق، خطأ من خلال الضغط على المفاتيح هنا.
ثم يمكنني نقل هذا بالداخل هنا، ووضع مسافة بادئة بشكل جيد.
والآن لاحظ، كل أشكال تعقيد coughing
تم أخذها في الاعتبار في دالة، قطعة اللغز الخاصة بي،
إذا صح التعبير، سيأخذ حتى وسيطة بحيث يمكنك الآن حرفياً،
إذا قمت بنقل هذا بعيدًا وخارج العقل، الآن
سيصبح البرنامج الخاص بك مثيرًا للاهتمام لأنه حقًا
يفعل ما يقول.
وهذا تجريد دالّي لطيف، إذا صح التعبير،
بحيث الآن لدي فعل جديد، إجراء جديد، دالة جديدة تسمى cough.
أية أسئلة حول هذا الجزء؟
نعم.
عذرًا ، قل مرة أخرى.
الحضور: ما هو الرقم الصحيح الذي سيرجعه "main"؟
ديفيد: ما هو الرقم الصحيح الذي سيرجعه "main"؟
يتضح أننا سوف نعود إلى هذا.
سيرجع 0 تقريبًا دائمًا بشكل افتراضي،
ولكن هذا يُنتج لك تقريبًا عددًا لا نهائيًا من القيم غير الصفرية
التي تمثل الكثير من الأمور التي يمكن أن تكون خطأ.
وأكثر من ذلك عندما نبدأ في إنشاء المزيد من الأخطاء.
دعونا ننظر إلى واحد آخر.
اسمحوا لي بالمضي قدمًا وفتح هذا الملف مقدمًا
نفسي يسمى positive.C على فرض أنني لست
سعيدًا لمجرد الحصول على حق الوصول إلى "get int".
أريد دالة تسمى "get positive int" لأن،
لأي سبب من الأسباب، برنامجي أو لعبتي،
أيًا كان يحتاج لمعرفة قيمة إيجابية.
ربما أطلب من المستخدم عدد اللاعبين هناك،
وهذا لا ينبغي أن يكون سلبيًا.
يجب أن يكون عددًا صحيحًا موجبًا مثل واحد أو اثنين أو أكثر.
لذلك اتضح أن بإمكاني كتابة برنامج إذا أردت، ويبدو مثل هذا.
استدعِ في هذا السطر دالة تسمى "get positive int"، قم بتمريرها في محث،
ثم قم بتخزين القيمة، ثابتة في عدد صحيح، على الجانب الأيسر،
ثم قم بالمُضي قُدمًا وطباعتها.
لدى "Get positive int" هذا النموذج الأولي في الجزء العلوي من الملف.
لاحظ أن هذه ليست الدالة التي تأتي مع مكتبة CS50s، CS50.h.
فالدالة هنا تسمى "get positive int".
كما نأمل، فإنها ترجع رقمًا صحيحًا، وتأخذ سلسلة
لأنها محث، أيًا كانت الكلمات التي تريد أن يراها الإنسان.
دعونا نقوم بالتمرير لأسفل الآن، وهذا يبدو أكثر انخراطًا بدرجة قليلة،
وهذه ليست ميزة يمتلكها سكراتش.
لكن دعونا نلقي نظرة.
السطر الأول متطابق مع النموذج الأولي
لأنني حرفيًا قمت بنسخه ولصقه.
كل شيء بين هذه الأقواس هو الدالة ذاتها.
وهنا، للإجابة على سؤال شخص ما من وقت سابق،
هل يجب عليك الإعلان عن متغير ثم استخدامه على الفور؟
لا، وهذا في الواقع حل مفيد لمشكلة
سنراها في غضون لحظات.
لاحظ هنا هذه الكلمة الرئيسية الجديدة-- التي لم تراها من قبل--
تقوم بما يلي عندما تكون n أقل من 1.
في السابق، لقد شاهدنا حلقة while وشاهدنا حلقة for.
ما لم نشاهده هو حلقة do while.
في حين أن حلقة do while تتطابق بشكل واضح مع حلقة
while، ما الذي يبدو مختلفًا بعض الشيء؟
عندما تمت ترجمة كتلة forever في وقت سابق إلى "while true"،
ماذا كان ترتيب العمليات؟
هل تحققنا من الحالة، صحيحة، ثم قمنا بطبع hello world؟
أو هل قمنا فقط بطباعة hello world، ثم تحققنا من الحالة؟
أجل، قد لا تتذكرون بالضبط، لكن أنا أتذكر تمامًا--
لقد تحققت أنا، صحيح صحيح، وجميعنا قلنا نعم بالتأكيد.
Printf-- هل هو صحيح؟
Printf-- لذا تحقق من الشرط أولاً.
قد نستنتج أن هذه الحلقة مختلفة قليلاً.
لديها كلمة أخرى "do".
سيقوم هذا حرفيًا بفعل هذا أولاً ثم التحقق من الشرط
وفعل ذلك فقط مجددًا إذا كان الشرط صحيحًا.
لذا إنها طريقة لطيفة للتعبير فقط عن الأشياء حولك من حيث الترتيب
للقيام بشيء ما على الأقل مرة واحدة بدلاً من عدم احتمالية فعله مطلقًا
مثل الحالة السابقة.
لذا ما الذي نفعله؟
أحصل على int، الذي يمر في هذا المحث، وقم بتخزينه في n.
وإذا كتب المستخدم قيمة أقل من 1،
هل سيكون هذا صحيحًا أم خاطئًا، إذا كان n أقل من 1؟
لذا إذا قام شخص بكتابة 0، هل 0 أقل من 1؟
صحيح، نعم، لذا ما الذي يحدث، فلنعد للوراء إلى "do" ونقم بذلك مجددًا.
إذا قام المستخدم بكتابة سالب 1، هل سالب 1 أقل من 1؟
نعم أو صحيح.
لذا قم بذلك مجددًا.
إذا قام أو قامت بكتابة سالب 2، مجددًا، مجددًا.
ماذا لو كتب أو كتبت 50؟
حسنًا، 50 ليس أقل من واحد.
لذا هذا خاطئ.
وحتى بعد ذلك ننتقل إلى السطر التالي من التعليمات البرمجية.
ولكن الأمر المثير في السطر التالي من التعليمات البرمجية
هو، على عكس مثال السعال، والذي كان "void" هو نوع إعادته،
"get positive int" بشكل افتراضي والذي من المفترض أن يعيد عددًا صحيحًا،
مثلما، مجددًا، سلمت لي إيرين ورقة بسلسلة عليها.
وإذًا هنا، إذا كنت أريد الدالة المخصصة الخاصة بي المسماة
"get positive int" أن ترجع قيمة، فيوجد
كلمة أخرى في لغة C. فأنت تكتب حرفيًا "return" ثم
اسم المتغير أو القيمة التي
تريد إعادتها على ورقة مجازية إلى أي تعليمات برمجية
تستخدم هذا.
لذا ما هذه الغرابة؟
لماذا لا يمكنني فعل هذا؟
إذا كنت سأحاكي التعليمات البرمجية التي كتبناها في وقت سابق كهذا،
لماذا لا يعمل هذا السطر من التعليمات البرمجية فقط بطريقة منطقية باستخدام
بعض النماذج الذهنية التي لدينا حتى الآن؟
الجمهور: إعلان التعليمات البرمجية مجددًا.
ديفيد: قلها مجددًا.
الجمهور: الإعلان مرارًا وتكرارًا.
ديفيد: نعم، إذًا الإعلان فقط يعني إنشاء،
وهو الطريقة الشيقة في البرمجة لقول إنشاء.
لذا هذا يقول، مرحبًا، يا جهاز الكمبيوتر، أعطني عددًا صحيحًا، وأطلق عليه n،
وعينه مساوٍ لقيمة الإعادة لـ "get int".
لذا أيًا كانت الدالة أو أيًا كان ماسلمتني إياه إيرين، ضَعه هنا.
ولكن المشكلة هي أن المتغيرات في لغة C لها نطاق.
النطاق هو طريقة شيقة لقول أنها موجودة فقط
بين الأقواس المتعرجة والتي تم الإعلان عنها فيها.
لذا هذا يعني أن هذا المتغير n حرفيًا موجود فقط
بين هنا وهنا، ومن ثم يختفي نوعًا ما.
ولا يعرف جهاز الكمبيوتر شيئًا عنه بعد ذلك.
ولكن هذه مشكلة لأن، على أي رقم سطر
نحن بحاجة إلى معرفة n في الواقع؟
يبدو أنه السطر 21، وهذا خارج الأقواس المتعرجة.
لذا بناء على هذا التعريف الأساسي فقط، فالنطاق
هو القوسان المتعرجان الذين يتم الإعلان عن متغير بينهما.
وليس له وجود خارجهما.
لن تعمل التعليمات البرمجية هذه فقط.
وسأصلحه فيما بعد حتى يتسنى لكم رؤية رسالة الخطأ الصحيحة.
لماذا لا يعمل هذا؟
حسنًا، أنت تعلن n داخل هذه الأقواس المتعرجة.
لذا كيف يمكنك تجنب هذا؟
حسنًا، اتضح أن، كما اقترح شخص ما في ما وقت سابق، الإعلان عنه فقط بذاته
دون إعطائه قيمة.
وحقًا الصيغة لذلك هي فقط القيام بنصف التفكير--
int n فاصلة منقوطة.
ليس لديه قيمة نعرفها بعد.
يشتمل على قيمة تافهة، ولكن سنتطرق لهذا بشكل موسع في وقت آخر.
ولكنه غير موجود الآن.
والآن لاحظوا وجوده في أي الأقواس المتعرجة--
هذا وهذا، وهذا يعني الآن أنه قابل للوصول في كل مكان.
وإذا كنت في برامج سكراتش الخاصة بك تستخدم متغيرات فعليًا،
ربما قد لاحظت أنه يجب عليك أن تختار.
يجب أن تتخذ قرارًا بشأن هذا النقش المتحرك أو لجميع النقوش المتحركة.
كان هذا تلميحًا لما يسمى في البرمجة بمتغير
محلي أو عالمي.
هذه ما زالت محلية، وسنعود مرة أخرى لهذا المصطلح في وقت لاحق.
لكن له علاقة بالنطاق لأن، إذا قمت بتحديده لهذا النقش المتحرك فقط،
فيتيح لك فقط معهد ماساتشوستس للتكنولوجيا استخدام هذا المتغير لهذا النقش المتحرك المحدد،
تلك القطة أو الخروف أو أيًا كان ما تبرمجه.
فقط كما هو الحال في لغة C، فهذا يعني الآن أنه يمكن استخدام n هنا وهنا
لكن ليس في مكان آخر مثل أعلى برنامجي.
هذا هو النطاق.
لذا دعونا الآن نشاهد ما يمكن أن يحدث أكثر من هذا.
اسمحوا لي أمضي قدمًا وأفتح هذا لأنه من الواضح،
أثناء القيام بالبرمجة، هناك مشاكل أخرى يمكن أن تحدث،
ليس فقط القيم الكسرية للدقة، كما وصفتها سابقًا.
من الواضح أن هناك مشاكل أخرى يمكن أن تحدث حتى مع الأعداد الصحيحة
التي نوعًا ما نتجنبها كليًا.
لذا تذكروا أننا بدأنا التحدث عن 1، و2، و3، ولماذا هي 123 الأسبوع الماضي.
حسنًا، ماذا يحدث في الأرقام العشرية إذا أضفت 1 إلى 123؟
ما الرقم الذي تحصل عليه؟
بالتأكيد، 124.
إذا فعلتها مرة أخرى، 125، 26، 27، 28، 29.
ماذا يحدث في الأرقام العشرية إذا أضفت 1 إلى 9؟
حسنًا، يجب أن أحصل على 10، لكن هذه ليست الطريقة التي نكتب بها هذا.
تضع 0 بدلاً من ذلك، وتنقل الـ 1.
هل تذكرون هذه المعطيات العقلية؟
هذا كل ما نفعله هنا.
ثم إنها 2 زائد 1.
وهذا سبب أن 129 زائد 1 تساوي 130 لأنك وضعت الـ 0 ونقلت الـ 1،
وهكذا.
لذا نحن الآن نفعل كل ذلك بشكل حدسي.
لكن هذا له آثار على أجهزة الكمبيوتر أيضًا
لأنه افترضوا أن لدينا عددًا أكبر مثل 999.
ما الذي ستحصل عليه عند إضافة 1 إلى 999؟
حسنًا، ستنقل الـ 1، وستنقل الـ 1، وستحصل على 1000.
لكن ماذا لو كان الكمبيوتر لديك به مساحة فقط لثلاثة أرقام؟
أو ماذا لو هاتفك أو ماذا لو منبهك
أو أيًا كان الجهاز حرفيًا لديه فقط
مساحة لـ 3 أرقام، ما هو ناتج 999 زائد 1 إذا كان جهازك يحتوي على ثلاثة أرقام فقط؟
حسنًا، يبدو أنه 0.
حتى تحصل على هذا التدفق 998،999،0.
إنه يتدفق، إذا جاز التعبير.
يسقط الواحد نوعًا ما من الناحية النظرية، وأنت تنتقل إلى القيمة التالية،
والتي هي 000.
ماذا عن النظام الثنائي؟
ما هو هذا العدد في النظام الثنائي إذا قمت بترجمة الأرقام العشرية في رأسك؟
وتذكر، إنه عمود الآحاد، وأعمدة الإثنينات وعمود الأربع.
لذا كان هذا 7 في النظام الثنائي--
1، لذا هو 4 زائد 2 زائد 1، إذًا 7 في النظام الثنائي.
إذن كيف تقوم بالحسابات باستخدام النظام الثنائي؟
إنه بالفعل الشيء نفسه.
ما في الأمر فقط أنك لا تملك اثنينات أو ثلاثوات أو تسعوات أو أي شيء بينهما.
لديك فقط آحاد وأصفار.
إذًا ما الذي ستحصل عليه عند إضافة 1 إلى 111؟
حسنًا، إنها الفكرة نفسها.
أنت وضعت 0 جانبًا ولديك 1 لأن 1 زائد 1
تريد أن تقول 2 بالأرقام العشرية، لكن لا يوجد رقم 2.
لذا يتحول إلى 0.
لكن لديك الرقم 1.
1 زائد 1 يساوي 2، لكن، حسنًا، هذا 0، لديك 1.
1 زائد 1، هذه 2.
لكن لا يوجد 2.
لذا أرجع إلى 0، لديك الرقم 1.
لذا في النظام الثنائي، إذا كان لديك فقط ثلاث وحدات بايت أو وحدات بت بدلاً من ذلك،
إذا كان لديك فقط ثلاث وحدات بت، على ماذا ستحصل عند إضافة 1 إلى 7 في النظام الثنائي؟
يبدو أنك ستحصل على 0.
والآن أصبح الأمر أكثر واقعية.
في جهاز الكمبيوتر الخاص بي، في هاتفي، في جميع الأجهزة الخاصة بك
إنها مجرد كمية محدودة من الذاكرة، ذاكرة الوصول العشوائي، تلك الشريحة الصغيرة
ذات الدوائر الصغيرة التي أظهرتها على الشاشة.
وهذا يحتوى على أكثر من 3 وحدات بت من الذاكرة بالتأكيد، لكنه محدود.
وإذا كنا نستخدم فقط، من باب المتعارف عليه، 32 بت
لتمثيل الأشياء أو 64 بت، ربما إذا استخدمنا الضعف أو أي شيء آخر
تطلق عليها "long"-- و"long" هو 64 بت عدد صحيح، في حين أن العدد الصحيح
عادةً 32 بت.
يبدو أنه، وفي مرحلةٍ ما، قد تتجاوز الأرقام
وسيكون بالفعل لدينا، إذا صح التعبير،
عدم دقة-- وهذا ما يشير إليه، تجاوز العدد الصحيح.
لذا يمكنك بالفعل رؤية هذا أو الدفاعات ضد هذا في العالم الحقيقي.
هذه لقطة شاشة من لعبة شائعة على أنظمة تشغيل مختلفة،
وهي لعبة تسمح لك بجمع القطع النقدية أو النقاط بالفعل،
أو قطع الليجو الصغيرة.
وإذا كنت تجمع هذه النقاط، ستلاحظ أنه في نهاية المطاف،
إذا كان لديك الكثير من وقت الفراغ، يمكنك تسجيل نقاط عالية فقط في هذه اللعبة.
ما هي أعلى نتيجة على ما يبدو، وفقًا
لما يظهر في لقطة الشاشة ممن التقطها بعد أن استغرق في اللعب لمدة طويلة؟
لم أكن أنا.
4 ملايين-- لا، 4 مليارات، 4 مليارات.
لماذا هذا؟
حسنًا، يتضح أنه إذا كانت الأرقام وأجهزة الكمبيوتر، كما اقترحت،
يتم تخزينها بشكل عام باستخدام 32 بت.
هذا يثير سؤالاً نوعًا ما، حسنًا، إلى أي مدى يمكنك العد باستخدام 32 بت؟
حسناً، 32 بت تعني أنك تملك 32 صفرًا وواحدًا.
أكبر ما يمكن الوصول إليه هو 11111، 32 مرة.
وإذا كنت في الواقع تجري الحسابات باستخدام الأعمدة الصغيرة الخاصة بنا وما إلى ذلك،
إنها ما يقرب من 4 مليارات، وأكبر قليلاً من 4 مليارات.
لذا، قرر مخترعو لعبة ليجو هذه،
أتعرف ماذا، دعونا فقط نقول بأن أقصى عدد
من النقاط أو العملات التي يمكنك تجميعها في لعبة ليجو هذه هو 4 مليارات.
لماذا؟
يبدو حتى أنها أكثر نظامًا من القيمة الفعلية أيًا كانت.
لكن لماذا؟
كم عدد وحدات البت التي يستخدمونها لتخزين درجاتك في اللعبة بشكل افتراضي؟
32 وحدة بت أو 4 وحدات بايت، وهذا هو المتعارف عليه.
أيًا كانت اللغة التي تمت بها برمجة هذه اللعبة،
فربما قد تشتمل على نوع بيانات يسمى int، ومن المتعارف عليه أن int
يستخدم 32 وحدة بت.
لذا في مرحلة ما، يجب أن يقرروا، يمكننا أيضًا استخدام المزيد من الذاكرة
كما اقترحت سابقًا باستخدام doubles.
دعونا نستخدم 64 وحدة بت.
بعد ذلك يمكنكم الحصول على رقم ساعات خيالي للعب اللعبة
والحصول على المزيد والمزيد من النقاط.
أو يمكننا فقط أن نقول أن هذه نقاطًا كافية ليتم تجميعها في اللعبة.
الآن عندما تتوقع هذا بالفعل.
فإن هذا لا يحدث في الواقع دومًا.
إذا مضينا قدمًا ونظرنا على مثال تعليمات برمجية ما--
دعوني أمضي قدمًا وأفتح overflow.C. في هذا البرنامج
هنا، ستشاهد في سطر 8 بالفعل صيغة الخط المائل الخط المائل،
ولدي عدد من هذا حتى الآن.
لكن لم أذكرهم بالفعل.
من الواضح أن في لغة C، كما في سكراتش-- ومن المحتمل أنكم لم تلاحظوا هذه
الميزة في سكراتش--
يمكنكم الحصول على ما يسمي تعليقات.
التعليق هو مجرد ملاحظة لك، لرفيق التدريس الخاص بك، لصديقك،
لزميلك، أي شخص تقوم بكتابة الرمز معه.
إنها فقط ملاحظة شخصية لتذكيرك بما تفعله التعليمات البرمجية.
بدون هذا السطر، أستطيع، لو كنت مرتاحًا بما يكفي مع البرمجة،
معرفة ما تفعله سطور التعليمات البرمجية هذه.
لكن بصراحة، إنها مضيعة للوقت، لقد كتبت التعليمات البرمجية مرة واحدة.
وإذا نظرت إليه في الأسابيع أو الشهور اللاحقة أو قام شخص ما بكتابته،
فقط أخبرني ما سيفعله.
لذا، فإن التعليق في البرنامج هو فقط مثل ملخص لطيف لعدد الأسطر القليلة للتعليمات البرمجية،
أو إنه ملخص باللغة الإنجليزية أو أي لغة منطوقة
يصف ما الذي قد تفعله التعليمات البرمجية التي
تبدو مشفرة بالفعل.
لذا ليس عليك أن تفكر بعمق بشأنه لفهم برنامج.
لذا "iteratively double i"-- iteratively تعني هنا بشكل حلقي، مرارًا
وتكرارًا.
هذا غريب.
لم نشاهد هذا من قبل، لكن قد تخمن ما يفعله.
ما الذي تفعله علامة نجمة يساوي؟
إنها تضاعف.
إنها مثل زائد يساوي التي تضيف 1، فإن النجمة يساوي
تضاعف إذا كانت القيمة على اليمين هي 2.
إذًا هذا سيبدأ طباعة 1 ثم 2 ثم 4 ثم 8 وهكذا.
ولاحظ هذه الدالة.
إنها تسمى sleep.
إنها حرفيًا ستنام لمدة ثانية،
دالة sleep هذه بها نموذج أولي قام شخص آخر بكتابته في ملف
يدعى uni standard.h.
أعرف ذلك فقط من خلال البحث عنه في الوثائق.
لكن هذا ملف جديد للنوم فقط.
"Make overflow"، وهو ملائم تمامًا هنا.
واسمحوا لي بالمضي قدمًا وجعل النافذة الطرفية أكبر من
ذلك-- نقطة خط مائل overflow.
حسنًا، سوف يحدث الأمر.
سوف يحدث.
سيحدث أسرع وأسرع، إذا جاز التعبير،
لأننا نضيف المزيد و المزيد في كل مرة من خلال المضاعفة.
2000، 4000، 8000، 16000--
مازال يتضاعف-- 64000، 65000.
نحن الآن وصلنا للملايين--
2 مليون، 4، 8، 16 مليون.
إنها تصبح أكبر وأكبر، كل هذه الأعداد الكبيرة.
أوه، هذا أمر مثير للاهتمام.
ما الذي حدث للتو؟
إذًا يتضح أنه، إذا ضاعفت الأعداد بصورةٍ كبيرةٍ بما يكفي، فستحصل على 0 في النهاية،
وربما أيضًا شيء لم تدرسه.
لذا ما الذي حدث بالفعل؟
Control-C، سنلغي هذا.
ماذا حدث؟
أنا أعني، أن البرنامج يحاول إخباري أنه، على الرغم من أنه يبدو مشفرًا قليلاً،
تجاوز العدد الصحيح قليلاً.
"Signed" تعني أنه انتقل من الإيجابية إلى السلبية بصورةٍ أساسية.
لذا ما الذي حدث؟
ما هذا؟
أجل، لقد نفدت وحدات البت.
أنا أضاعف العدد مرارًا وتكرارًا.
وفي مرحلةٍ ما، ضعّفنا العدد 1 إذا جاز التعبير وأصبح الواحد الثالث والثلاثين،
لذلك تجاوز حدود قيمة 32 بت،
وتحول فقط على ما يبدو إلى السلبية لأنه في مرحلة ما--
ونحن لم نتحدث عن ذلك--
يمكنك استخدام ما يمكن القول أنه الجزء الموجود في أقصى اليسار من البت للقول إنه إيجابي أو سلبي.
لقد تحدثنا للتو عن الإيجابية حتى الآن.
ثم عند هذه النقطة، وبصراحة، الكمبيوتر
سيستسلم حقًا لأنه لا يعرف ما المقصود أكثر من هذا.
لذا إذا لم تكتب تعليمات برمجية لمعالجة هذا الموقف
وتأكدت أن أعدادك أقل من 4 مليارات قبل أن تعمل،
ستحدث الأخطاء فقط.
وهذا قد يبدو مفتعلاً هنا، لكن هذا لم يحدث منذ فترة طويلة.
لذلك كان عام 1999 قبل أن يعتقد الكثير من الناس بقليل
أن العالم سينتهي بسبب ما يسمى بخطأ Y2K،
ولم يكن ذلك حقاً خطأً بينما كان افتقارًا إلى التدبر أو نقص
الميزات.
ماذا كانت مشكلة Y2K باختصار؟
هل يريد شخصٌ ما أن يُجيب؟
حتى ولو كان بمفهوم غير تقني، نعم.
الجمهور: لم يستطع الكمبيوتر عرض الرقم 2000.
ديفيد: أجل، لذا دعوني ألخص لكم هذا هنا.
لذا إذا كانوا يستخدمون فقط رقمين لعرض القيم،
يمكنك الخلط بين عام 2000 و عام 1900 في الواقع لأنه،
خلاصة القول، ما فعله الإنسان كان نوعًا ما معقولاً لأنه على مر العقود--
كانت مساحة التخزين باهظة.
وكانت أجهزة الكمبيوتر باهظة الثمن.
لم تكن الذاكرة متاحة كما هي عليه الآن مع كل هذا التخزين السحابي
وما شابه ذلك.
لذا أتعرف ماذا؟
لو كنا مثلاً في 1970، فهل سنهتم حقًا بعامي 1969، 1968، ناهيك عن عام 1900؟
ليس حقًا لنفترض فقط أننا جميعًا في التسعينيات
ولم نخزن أو نعرض رقم 9 واحد.
دعونا فقط نخزّن رقمين لكل سنة.
لذا 70 تُمثل السبعينيات و99 تمثل 1999.
لكن المشكلة هي أن المطاف انتهى بالإنسان بتشغيل تعليمات
برمجية كتبوها منذ سنوات مضت، منذ عقود مضت، أكثر مما اعتقد البشر
أنهم قد فعلوا، لماذا.
حسنًا، إنه باهظ الثمن، ويعد تغيير تعليمات برمجية مضيعةً للوقت،
التعليمات البرمجية تعمل.
فلماذا نحاول أن نلغيها؟
المشكلة هي، كلما كبر الأشخاص وماتوا،
قل عدد الأشخاص الذين على علمٍ باللغات
التي كتبت بها هذه البرامج أكثر وأكثر.
والآن من حتى الذي سيقوم بتحديث البرنامج؟
لذا كانوا يخشون الكثير من المشاكل، وهذا حقًا
يتلخص في أن عام 1999 ربما كان سيجاوز إلى، ليس
الصفر في حد ذاته لكن يُفهم ضمنيًا عام 1900.
وبالفعل، هذا حدث بالفعل، على الرغم من أنه ليس تقريبًا
على قدر ما اعتقد الأشخاص.
لكنه حدث بقيم فعليةً أكثر منذ بضع سنوات فقط.
هذه طائرة بوينغ 787، طائرة حقيقية
كان لا بد لها من الهبوط لبعض الوقت
لأنه كان لديها خطأ في البرمجة.
وتم تلخيصه هنا في مقال على الإنترنت.
طائرة 787 التي تعمل بقوة وباستمرار لمدة 248 يومًا،
يتضح أنه كان تحذيرًا، حيث بإمكانها فقدان جميع قوتها الكهربائية
لأن المولد سيفشل في الوضع الآمن.
لمَ كان هذا؟
يحدث هذا الشرط بواسطة عداد البرنامج
الداخلي للمولد الذي من شأنه أن يفيض
بعد 248 يومًا من الطاقة المستمرة.
لذا ترجم هذا.
وهذا فقط يعني أن هناك برنامج يعمل في طائرة بوينغ 787 الفعلية.
إنهم يستخدمون 32 بت من الأعداد الصحيحة.
كانوا يستخدمون تلك الأعداد الصحيحة لتخزين مئات الثواني.
وفي مرحلة ما إذا تركت طائرتك لمدة 248 يومًا، كل منها
تحتوي على 24 ساعة، 60 دقيقة في الساعة، 60 ثانية في الدقيقة،
و 100 أعشار من الثانية أو مئات الثواني في كل ثانية،
هذا المنتج الذي يقوم بضرب الأشياء يصبح سريعًا بشكٍل كبير.
وفي اليوم 249، ستغلق الطائرات نظريًا حتى
في منتصف الرحلة لأسباب حقيقيةً جدًا
نظرًا لأن عددًا كبيرًا جدًا من الأعداد ينزل إلى الصفر
وهذا يُربك المولد.
ومهندسو الطائرات الذكية
يقومون بمثل هذه الأنواع من الأخطاء بسبب البرامج،
ولا يتوقعون سطرًا واحدًا من التعليمات البرمجية أو بعض أسطر التعليمات البرمجية.
أو ، كما اقترحت، لماذا لم يستخدموا فقط المزيد من وحدات البت؟
ومجددًا، هذه مخاوف حقيقية.
لذلك تم التعامل مع ذلك لحسن الحظ وتم حله، ولكن بالطبع ليس قبل
انتشار الذعر هناك.
هكذا يتضح، أنه في لعبة قديمة، كانت هذه لعبة Civilization.
ويتضح أن واحدًا من الشخصيات الذي بإمكانك اللعب بها،
هو غاندي، وفي الواقع لا يظهر في اللعبة كشخصيةٍ سلمية
كما قد تعتقد.
ودعونا نلقي نظرة فقط هنا لثانية لفهم السياق.
إذا نظرنا فعلاً على المزيد من النظام الثنائي، وهذا في النظام الثنائي
يعادل أي رقم عشري؟
حسنًا، 1.
وهذه 8 وحدات بت.
إذًا فهي وحدة بايت كامل.
8 وحدات بت تكوّن بايت--
1، 2، 3، 4، 5، 6، 7، 8.
ما الذي ستحصل عليه إذا قمت بإنقاص واحد--
حسنًا، إذا قمت بطرح 1 من هذا، من الواضح أنك تحصل على ماذا؟
أصفار.
إذًا، فإن 1 ناقص 1 يساوي 0 فقط.
ماذا لو قمت بطرح 2 من هذه القيمة؟
ماذا يحدث؟
هذا في الواقع يسمى تجاوز الحد الأدنى للأعداد الصحيحة، وهو على النقيض تمامًَا،
ولكن في الحقيقة لا يوجد خيارات كثيرة للتفكير في هذا الأمر.
إذا كان لديك أصفار وواحدات فقط، يمكنك على الأرجح
فتخيل ما هو السيناريو السيئ.
ففي حال العدد 0000001، إذا طرحتَ 1، فسيتحول إلى أصفار، ثم إذا أعدتَ ذلك،
فأنت الآن تتجاوز الحد الأدنى، والذي يأتيك بناتج يمثل العكس تقريبًا وهو 11111111.
لذا فإن كان لديك 8 واحدات، فما قيمة ذلك إذا قمت بعملية رياضية؟
واحدات، اثنانات، أربعات، ثمانية 16.
يتضح أنه 255 إذا كنت فعلاً تجري جميع الحسابات.
لذا يتضح أن هذه اللعبة Civilization
كانت تستخدم بايت واحد لتمثل مستوى كل شخصية من
العدوانية في اللعبة.
وكان غاندي، كما قد تتوقع، افتراضيًا
يهيئ إلى 1، غير عدواني جدًا.
لسوء الحظ، في هذه اللعبة Civilization،
عندما يطبق اللاعب الديمقراطية في حضارته أو حضارتها،
ستقل عدوانيته تلقائيًا بمعدل اثنين.
وحتى إذا أصبح غاندي ديمقراطيًا، عدوانيته لن تقل إلى سالب واحد.
ولكن سيدور ليصبح رقمًا مرتفعًا جدًا 255،
مما يجعله عدوانيًا كما يمكن للحضارة أن تكون.
إذًا مثال أقل تأثيرًا، للتأكيد، من مثال الطائرة،
لكن هذه المشاكل موجودة في كل مكان.
وإذا بدأت في متابعة وسائل الإعلام الشعبية
أو عندما توجد أخطاء أو اختراقات أو استغلالات،
غالبًا ما يكون ذلك بسبب قيام مبرمج أو مبرمجة بخطأ في التعليمات البرمجية.
لم يتوقعوا سيناريو ما أو اتخذوا قرارات منطقية
منذ سنوات، ولكن هذا أثبت في نهاية المطاف أننا
مازلنا سُذج حيث أننا مازلنا نعمل بالتعليمات البرمجية نفسها، وأصبحت الأرقام كبيرةً جدًا،
وحساباتهم خاطئة.
وهكذا تحدث أشياء خطيرة فعلاً.
ولكن الأهم بالنسبة لنا هو مجرد فهم
كيف ولماذا تحدث هذه الأشياء.
وماذا سنفعل في الأيام القادمة؟
لذا فالواجب المنزلي التالي، مثلما كان مع سكراتش، سيكون بمثابة برمجة شيءٍ ما
لكن هذه المرة بلغة C، ستستخدم بيئة
تسمى مختبر CS50، والذي هو أساسًا CS50 sandbox، والذي
كنا نعمل بواسطته اليوم.
لكنه يضيف الإرشادات ومواصفات المشاكل
التي سترغب في حلها.
وسوف يرشدك في البداية من خلال بعض هذه الخطوات.
لستم بحاجة إلى كتابة كل شيء وحفظ
كل ما كتبته اليوم، ولكن لا تترددوا في هذه الأثناء
للذهاب إلى موقع الدورة واللعب مع أيٍ من هذه الأمثلة.
من بين التحديات القادمة سيكون هناك إعادة إنشاء بعض مقتطفات من الألعاب
من العام الماضي، والتفكير في كيفية ترجمة الأشياء التي قد تكون رأيتها تكبر
إلى تعليمات برمجية فعلية.
ومما لا شك فيه، من بين الأشياء الأولى التي ستشعرون بها، هو الإحباط.
ستنسون الفاصلة المنقوطة الغبية أو أين تذهب الأقواس؟
وستضطرون للنظر إلى التعليمات البرمجية.
ولكن ضعوا في اعتباركم، لا شيء من تلك الأشياء يهم.
أنه أمر محبط للغاية في البداية، ولكن الذي يهم هو الأفكار
وبصراحة، الشعور بالرضا
الذي تشعر به، مثل كل طاقم CS50 قبلك،
في نهاية المطاف عندما تصمم أو تخلق شيءً بالفعل خاصًا بك.
دعونا نتوقف هنا، وسنراكم المرة القادمة.