1 00:00:51,830 --> 00:00:55,130 المتحدث 1: هذه هي دورة CS50، وهذا هو الأسبوع الأول. 2 00:00:55,130 --> 00:00:58,250 وبنهاية اليوم، ستتعرف على كيفية 3 00:00:58,250 --> 00:01:01,110 إنشاء برامج تشبه هذا. 4 00:01:01,110 --> 00:01:02,360 لذلك فهذا، بالطبع، نظام ثنائي. 5 00:01:02,360 --> 00:01:05,150 هذه هي اللغة الوحيدة التي تفهمها الآلات في النهاية. 6 00:01:05,150 --> 00:01:07,710 لكن ولحسن الحظ، في الأسبوع الماضي، كانت هناك عمليات تجريد كثيرة جدًا 7 00:01:07,710 --> 00:01:10,880 وهناك الكثير من البشر الذين جاؤوا من قبلنا فلم نعد فعليًا 8 00:01:10,880 --> 00:01:12,420 بحاجة لكتابة أي شيء في هذا المستوى. 9 00:01:12,420 --> 00:01:15,410 يمكننا تجريد الطريقة أعلاه مثلما فعلنا مع لغة سكراتش بالفعل 10 00:01:15,410 --> 00:01:17,840 وبالمثل سنبدأ اليوم مع C. 11 00:01:17,840 --> 00:01:20,000 ولكن هل يرغب أي شخص مع ذلك في تخمين 12 00:01:20,000 --> 00:01:26,870 ما يقوم به هذا البرنامج فعليًا، عند تغذيته في جهاز Mac أو الكمبيوتر الشخصي لديك؟ 13 00:01:26,870 --> 00:01:30,260 هل يعرف أحدكم؟ 14 00:01:30,260 --> 00:01:31,810 هل يرغب أي شخص أن يخمّن؟ 15 00:01:31,810 --> 00:01:34,640 إنه ربما يكون أبسط برنامج يمكنك كتابته. 16 00:01:34,640 --> 00:01:38,880 في الواقع، إنه كذلك، عند تغذيته في عقل جهاز الكمبيوتر لديك، 17 00:01:38,880 --> 00:01:41,870 والمسمّى بوحدة المعالجة المركزية بطباعة ذلك البرنامج ببساطة. 18 00:01:41,870 --> 00:01:43,780 إذن كيف نصل فعليًا إلى تلك النقطة؟ 19 00:01:43,780 --> 00:01:46,160 حسنًا، تذكروا من أين بدأنا هذه المحادثة آخر مرة 20 00:01:46,160 --> 00:01:48,030 والتي تتحدث عن علوم الكمبيوتر بشكل أعمّ 21 00:01:48,030 --> 00:01:50,960 وحل المشكلات-- اقترحنا أنه يمكن استخلاصها حقيقةً بهذه الصورة. 22 00:01:50,960 --> 00:01:52,040 لديك بعض المدخلات. 23 00:01:52,040 --> 00:01:53,180 وتريد بعض المخرجات. 24 00:01:53,180 --> 00:01:56,300 وفي مكانٍ ما في المنتصف، تحتاج لفعل شيءٍ ما باستخدام تلك المدخلات. 25 00:01:56,300 --> 00:02:00,440 وللوصول إلى تلك النقطة، مع ذلك، كان يتعين علينا تمثيل تلك المدخلات والمخرجات. 26 00:02:00,440 --> 00:02:04,130 كان يتعين تحديدًا علينا أن نقرر كبشر، كيف سنمثل جميع المدخلات 27 00:02:04,130 --> 00:02:07,520 أمام المشكلة الموجودة لدينا عندما يحين وقت جعل جهاز الكمبيوتر يقوم بمعالجتها فعليًا. 28 00:02:07,520 --> 00:02:10,730 وفي نهاية المطاف، فكل من الهواتف وأجهزة الكمبيوتر التي 29 00:02:10,730 --> 00:02:13,460 نستخدمها جميعًا فقط في نهاية اليوم يتم توصيلها في الجدار 30 00:02:13,460 --> 00:02:15,680 لتحصل على موردها المادي، وهو الكهرباء، 31 00:02:15,680 --> 00:02:17,960 وقد تقوم بتخزينها مؤقتًا في بطارية. 32 00:02:17,960 --> 00:02:19,460 لكن ذلك حقيقةً هو مُدخلنا الوحيد. 33 00:02:19,460 --> 00:02:21,770 إما أنها متصلة بالكهرباء أو ليست كذلك. 34 00:02:21,770 --> 00:02:24,670 إما أنها 1 أو 0، صحيحة أو خاطئة. 35 00:02:24,670 --> 00:02:27,710 لذلك يختزل العالم حقيقةً الأمر إلى هاتين الحالتين، إذا صح القول. 36 00:02:27,710 --> 00:02:30,800 وهكذا يمكنك التفكير في تلك الحالات حينئذ تمامًا كمصباح كهربائي، في حالة 37 00:02:30,800 --> 00:02:31,710 تشغيل أو إيقاف. 38 00:02:31,710 --> 00:02:34,760 لقد قمتُ بإيقاف هاتفي الخلوي فجأةً آخر مرة لتشغيل ضوء الفلاش أو إيقافه، 39 00:02:34,760 --> 00:02:37,040 1 أو 0، صحيحة أو خاطئة. 40 00:02:37,040 --> 00:02:39,450 الآن بالطبع، إذا كان لديك مصباح كهربائي واحد فقط، 41 00:02:39,450 --> 00:02:41,650 فيمكنك فقط العدّ من 0 إلى 1. 42 00:02:41,650 --> 00:02:44,570 لكن إذا بدأتَ بالحصول على حزمة منها متصلةً على التوالي مع بعضها البعض، 43 00:02:44,570 --> 00:02:47,000 فيمكنك إعادة ترتيبها مثلما فعلت بإصبعي-- 44 00:02:47,000 --> 00:02:50,850 0، 1، 2، 3، وهكذا. 45 00:02:50,850 --> 00:02:53,970 وهكذا بدأنا نتحدث عن النظام الثنائي بشكلٍ أعمّ. 46 00:02:53,970 --> 00:02:57,560 وبالتالي فهنا على سبيل المثال كانت توجد ثلاثة تسلسلات 47 00:02:57,560 --> 00:03:01,190 لحالات 0 وحالات 1 و كل واحدة من تلك الحالات كانت تمثل شيئًا ما، 48 00:03:01,190 --> 00:03:03,610 لكننا لسنا بحاجة للتفكير في العالم عند هذا المستوى. 49 00:03:03,610 --> 00:03:04,910 يمكننا التجريد إضافةً إلى ذلك. 50 00:03:04,910 --> 00:03:07,520 كلنا على دراية أكبر بكثير بالنظام العشري بالطبع، 51 00:03:07,520 --> 00:03:12,650 وبالفعل نذكر أن هذا النظام كان عبارة فقط عن 72، و73، و33، والتي لو يذكر أحدكم، 52 00:03:12,650 --> 00:03:13,760 عندما تستخدمون نظام ASCII-- 53 00:03:13,760 --> 00:03:15,950 والتي كانت تُعد هي هذا المعيار العالمي لربط الأرقام 54 00:03:15,950 --> 00:03:17,960 بالحروف--فما الرسالة التي حصلنا عليها؟ 55 00:03:17,960 --> 00:03:21,740 أجل، كانت تحديدًا high، حرف H كبير حرف I كبير علامة تعجب. 56 00:03:21,740 --> 00:03:26,120 وذلك إذن تجريد أعلى تلك الأرقام أو بطريقة أخرى الأرقام الثنائية. 57 00:03:26,120 --> 00:03:29,300 لكننا لسنّا مضطرين لنمذجة النص فقط باستخدام الأرقام. 58 00:03:29,300 --> 00:03:32,150 في نهاية المطاف، لا يزال موردنا الوحيد هو الكهرباء، 59 00:03:32,150 --> 00:03:35,030 والطريقة الوحيدة التي نفكر بها فيه رقميًا لا تزال هي الأصفار والواحدات. 60 00:03:35,030 --> 00:03:36,400 لكن إذا أخذنا نفس القيمة-- 61 00:03:36,400 --> 00:03:41,510 72، 73، 33-- وقمنا بالتعامل معها في سياق برنامج Photoshop 62 00:03:41,510 --> 00:03:43,450 أو برنامج صور أو برنامج رسومات، 63 00:03:43,450 --> 00:03:45,500 فيمكننا بدلاً من ذلك ترجمتها كمقدار ما من 64 00:03:45,500 --> 00:03:47,870 الأحمر، مقدار ما من الأخضر، مقدار ما من الأزرق، 65 00:03:47,870 --> 00:03:50,540 وهو ما منحنا آخر مرة، لو تذكرون، هذا اللون المائل للاصفرار. 66 00:03:50,540 --> 00:03:54,140 لذلك لدينا الآن تجريد آخر أعلى الألوان الثنائية، 67 00:03:54,140 --> 00:03:55,440 وهذا يمثل وحدة بكسل واحدة فقط. 68 00:03:55,440 --> 00:03:57,530 ما الذي يمكنك فعله بمجرد وجود أكثر من وحدة بكسل لديك؟ 69 00:03:57,530 --> 00:04:00,410 ما الذي يمكنك تمثيله بعد ذلك؟ 70 00:04:00,410 --> 00:04:01,790 حسنًا، صحيح، الصور. 71 00:04:01,790 --> 00:04:04,040 لذلك نواصل تصعيد المحادثة بدرجة أعلى وأعلى، 72 00:04:04,040 --> 00:04:06,860 ويمكننا تمثيل شيء كرمز مشاعر رسومي على الشاشة، 73 00:04:06,860 --> 00:04:08,360 يحتوي على أكثر من نقطة صفراء واحدة. 74 00:04:08,360 --> 00:04:11,240 لقد كانت به مجموعة كاملة من النقاط الصفراء وألوان أخرى كذلك. 75 00:04:11,240 --> 00:04:13,700 وتذكّروا أيضًا، إذا كنا نريد تحريك الأشياء، 76 00:04:13,700 --> 00:04:17,090 سواءً كان ذلك من خلال أشياء ساذجة مثل رموز مشاعر متحركة على هاتف أو مجرد أفلام 77 00:04:17,090 --> 00:04:20,660 أو مقاطع فيديو مناسبة، جيدًا، فتكون تلك الأشياء عبارة عن مجرد تسلسلات 78 00:04:20,660 --> 00:04:23,870 لصور تمضي أمام عينيك كإنسان بسرعةٍ كبيرةٍ بالفعل. 79 00:04:23,870 --> 00:04:26,990 إذن ذلك هو المكان الذي توقفنا فيه، إلى حد ما، في المرة الأخيرة لنبدأ من المستوى الأساسي 80 00:04:26,990 --> 00:04:30,320 ونقوم بالتجريد حتى نتمكن بعد ذلك من تحديد أننا 81 00:04:30,320 --> 00:04:33,530 يمكننا تمثيل المدخلات، ويمكننا تمثيل 82 00:04:33,530 --> 00:04:35,120 المخرجات، مهما حدثت تلك الأشياء. 83 00:04:35,120 --> 00:04:37,370 ومن الآن فصاعدًا، لسنا بحاجة إلى التفكير عند ذلك المستوى. 84 00:04:37,370 --> 00:04:39,410 يمكننا فقط افتراض أننا جميعًا نعلم كيفية القيام بهذا الأمر. 85 00:04:39,410 --> 00:04:42,450 وحتى لو أصبحت في النهاية ذكرى بعيدة نوعًا ما، 86 00:04:42,450 --> 00:04:44,330 فنحن نعلم أن شخصًا ما يمكنه أن يفعل ذلك في الواقع. 87 00:04:44,330 --> 00:04:46,490 وتلك هي قيمة التجريد. 88 00:04:46,490 --> 00:04:49,350 لكن بداخل هذا الصندوق الأسود ما يُسمى بالخوارزميات، 89 00:04:49,350 --> 00:04:50,870 الخلطة السرية-- 90 00:04:50,870 --> 00:04:53,000 هذه هي الحيثية التي يتم بها حل المشكلات بالفعل. 91 00:04:53,000 --> 00:04:57,630 ونحن لم نتحدث فقط عن ماهية هذه الخوارزميات، ولكن على سبيل المثال، 92 00:04:57,630 --> 00:04:58,970 عن مدى فعاليتها. 93 00:04:58,970 --> 00:05:03,050 لذا تذكّروا أن هذا الخط الأحمر كان يمثل خوارزمية بسيطة جدًا تقوم بتقليب 94 00:05:03,050 --> 00:05:05,320 دليل الهاتف صفحةً صفحة في كل مرة. 95 00:05:05,320 --> 00:05:08,320 وسبب كونها خطًا مستقيمًا هو وجود تطابق واحد لواحد 96 00:05:08,320 --> 00:05:10,820 بين عدد الصفحات في الكتاب 97 00:05:10,820 --> 00:05:13,730 وعدد مرات تقليب الصفحات-- صفحة واحدة، صفحة واحدة أخرى، قلب 98 00:05:13,730 --> 00:05:15,030 صفحة أخرى، وهكذا. 99 00:05:15,030 --> 00:05:17,060 إذا انتقلتُ سريعًا خلاله بضعف السرعة-- 100 00:05:17,060 --> 00:05:18,920 2، 4، 6، 8-- 101 00:05:18,920 --> 00:05:20,040 يمكنني فعل ما هو أفضل. 102 00:05:20,040 --> 00:05:23,840 وهكذا فذلك الخط الأصفر الآن، تذكّروا، كان أكثر انخفاضًا على الرسم البياني. 103 00:05:23,840 --> 00:05:26,310 إذا ألقيت نظرة على أي نقطتين، صفراء وحمراء، 104 00:05:26,310 --> 00:05:28,760 تكون الصفراء أسفل الحمراء، ما يعني أنها تأخذ وقتًا أقل. 105 00:05:28,760 --> 00:05:30,650 لكن هذا لم يكن صحيحًا تمامًا. 106 00:05:30,650 --> 00:05:34,880 كان هناك خطأ واحد عندما كنت أبحث عن مايك بمعدل صفحتين في المرة. 107 00:05:34,880 --> 00:05:37,020 ماذا كانت تلك المشكلة؟ 108 00:05:37,020 --> 00:05:37,980 أجل، قد يفوتني. 109 00:05:37,980 --> 00:05:41,210 قد يحصل عن طريق الخطأ وجوده فيما بين صفحتين- ليس هذا بالأمر الجلل 110 00:05:41,210 --> 00:05:43,170 لأنني يمكنني إصلاحه، لكن يتعين عليّ إصلاحه. 111 00:05:43,170 --> 00:05:45,380 يتعين عليّ تطبيق ذلك المنطق الإضافي والرجوع للخلف على نحو مضاعف 112 00:05:45,380 --> 00:05:47,090 لصفحة واحدة على الأقل إذا كنت أتنقل بسرعة كبيرة للغاية. 113 00:05:47,090 --> 00:05:51,290 لكن بالطبع الخوارزمية النهائية- وبصراحة، كل حدسنا الأولي 114 00:05:51,290 --> 00:05:54,650 ربما-- كانت هي خوارزمية فرّق تسُد، افتحه تقريبًا إلى المنتصف، 115 00:05:54,650 --> 00:05:56,700 ثم انظر لأسفل، ثم انتقل يسارًا، وانتقل يمينًا، 116 00:05:56,700 --> 00:05:58,700 وكرّر فقط تلك العملية عندما تصل المسألة إلى 117 00:05:58,700 --> 00:06:02,030 هذا الجزء الكبير إلى هذا الجزء الكبير إلى هذا الجزء الكبير إلى هذا الجزء الكبير إلى مجرد ترك صفحة واحدة. 118 00:06:02,030 --> 00:06:04,890 لذلك كل شيء كان يدور حول الفاعلية. 119 00:06:04,890 --> 00:06:08,240 ولكن للوصول الى تلك النقطة كنا بحاجة للتعبير عن أنفسنا بشكلٍ أكثر دقة. 120 00:06:08,240 --> 00:06:09,620 ولذلك أدخلنا الكود الزائف. 121 00:06:09,620 --> 00:06:11,160 لا يوجد له تعريف رسمي. 122 00:06:11,160 --> 00:06:12,500 يمكن أن يكون مثل الإنجليزية، ما يشبه الإنجليزية. 123 00:06:12,500 --> 00:06:14,960 ويُقصد به تحديدًا أن يكون موجزًا ويوصل معنى النقطة. 124 00:06:14,960 --> 00:06:18,290 وتذكّروا أننا، بطول الطريق، نُدخل مجموعة كاملة من المفاهيم، 125 00:06:18,290 --> 00:06:21,590 العديد منها ربما قمتم بتجربته باستخدام لغة سكراتش، مثل التكرارات الحلقية 126 00:06:21,590 --> 00:06:26,280 والشروط، والتعبيرات المنطقية، والمتغيرات، وما إلى ذلك. 127 00:06:26,280 --> 00:06:30,800 وتلك كانت الكتل البنائية التي ظهرت من هذا النوع من الإثبات الوارد هنا. 128 00:06:30,800 --> 00:06:34,010 لكن بصراحة، حتى في هذا الإثبات، في هذا الرمز الزائف، 129 00:06:34,010 --> 00:06:35,950 كانت هناك مجموعة كاملة من الافتراضات. 130 00:06:35,950 --> 00:06:37,790 إذا قرأت هذه التعليمات بمعدل واحدة في كل مرة 131 00:06:37,790 --> 00:06:39,580 وأنت تمسك بدليل الهاتف في يدك، 132 00:06:39,580 --> 00:06:42,840 فالاحتمالات هي أنك يمكنك تنفيذ هذا الرمز الزائف، هذه الخوارزمية. 133 00:06:42,840 --> 00:06:48,410 ولكن ماذا يعني حقًا، على سبيل المثال، أن تفتح إلى منتصف دليل الهاتف؟ 134 00:06:48,410 --> 00:06:51,230 كل واحد منا لديه حدس لفهم ما يعنيه ذلك. 135 00:06:51,230 --> 00:06:52,940 لكن بصراحة، إذا كنت تشرح ذلك 136 00:06:52,940 --> 00:06:55,560 لطفل أو شخص يتعلم اللغة الإنجليزية أو أي لغة 137 00:06:55,560 --> 00:06:58,010 لأول مرة، افتح إلى منتصف دليل الهاتف، 138 00:06:58,010 --> 00:07:00,150 فيجب عليك ربما توضيح بعض الافتراضات. 139 00:07:00,150 --> 00:07:03,810 حسنًا، هذا الشيء أمامكم يحتوي على 1000 صفحة، قطعة من الورق. 140 00:07:03,810 --> 00:07:07,490 اقلب إلى الصفحة رقم 500، ودعونا نسمّيها المنتصف. 141 00:07:07,490 --> 00:07:10,160 هذا من شأنه أن يصير مملاً على نحو سريع جدًا إذا كان كل واحد منا كبشر 142 00:07:10,160 --> 00:07:11,940 يتحدث عند ذلك المستوى من التفصيل. 143 00:07:11,940 --> 00:07:13,950 ولذا نحن نقوم بالتجريد باستخدام عبارات أكثر 144 00:07:13,950 --> 00:07:16,160 تعميمًا مثل افتح إلى منتصف دليل الهاتف، 145 00:07:16,160 --> 00:07:17,840 لكن ذلك يُعتبر تجريدًا. 146 00:07:17,840 --> 00:07:20,450 وهو ليس دقيقًا تمامًا كالمثالي على الأرجح، 147 00:07:20,450 --> 00:07:24,600 خاصةً بتلقين هذه الخوارزمية لمبتدئ أو لروبوت أو لجهاز كمبيوتر. 148 00:07:24,600 --> 00:07:28,370 لكنه مفيد لأننا نستطيع حينئذ تكوين برنامج من 12 خطوة بدلاً من برنامج من 20 خطوة 149 00:07:28,370 --> 00:07:30,450 بتفصيل أكثر من اللازم. 150 00:07:30,450 --> 00:07:33,380 وعلى سبيل المثال، فقد كانت لدينا هنا بالكامل أيضًا التكرارات الحلقية والشروط الخاصة بنا 151 00:07:33,380 --> 00:07:35,480 وهكذا، حتى نتصل بمايك. 152 00:07:35,480 --> 00:07:36,510 ماذا يعني ذلك؟ 153 00:07:36,510 --> 00:07:39,140 حسنًا، إذا تخيلت أن الإنسان يعرف كيفية استخدام الهاتف، 154 00:07:39,140 --> 00:07:40,340 فسيمضي الأمر دون ذكر. 155 00:07:40,340 --> 00:07:43,190 ولكن إذا كان هو أو هي أيضًا بحاجة إلى برمجة لاستخدام الهاتف، 156 00:07:43,190 --> 00:07:45,710 فيجب عليك أن توضّح-- ارفعها، اضغط على هذا الزر، اكتب 157 00:07:45,710 --> 00:07:47,580 بهذا التسلسل من الأزرار، وهكذا. 158 00:07:47,580 --> 00:07:50,610 لذا فالاتصال بمايك أيضًا يُعد تجريدًا. 159 00:07:50,610 --> 00:07:55,250 لذلك فإن هذه التجريدات مفيدة، ولكن يمكن أن تكون في بعض الأحيان مزعجة، 160 00:07:55,250 --> 00:08:01,430 خاصةً، إذا لم تكن دقيقًا بما يكفي لبرمجة الكمبيوتر بصورةٍ صحيحة. 161 00:08:01,430 --> 00:08:06,830 ولرسم هذه الصورة، رأيتُ أنه يمكننا أن نبدأ بحماس قليل هنا. 162 00:08:06,830 --> 00:08:10,340 أحضرتُ إفطارًا، إذا لم تكن قد أعددتَه تمامًا هنا أو هناك. 163 00:08:10,340 --> 00:08:12,090 أحتاج فقط لاثنين من المتطوعين إذا شعرتم 164 00:08:12,090 --> 00:08:14,840 بألفة الظهور على المنصة وعلى الإنترنت هنا. 165 00:08:14,840 --> 00:08:16,760 دعوني نوعًا ما-- يوجد كثير من الأضواء هنا. 166 00:08:16,760 --> 00:08:20,510 ماذا عن هناك في الناحية اليسرى وهنا في الأمام؟ 167 00:08:20,510 --> 00:08:21,260 أجل، هناك بالضبط. 168 00:08:21,260 --> 00:08:22,300 أعتقد أنك رفعت يدك. 169 00:08:22,300 --> 00:08:24,180 تعال هنا. 170 00:08:24,180 --> 00:08:27,110 وبريان، هل تمانع في مساعدتنا هنا، أيضًا؟ 171 00:08:27,110 --> 00:08:29,420 تعال هنا. 172 00:08:29,420 --> 00:08:31,820 إذا كنت ترغب في الإمساك بزمام الأمور هنا، فسأَدَعك تمضي قدمًا 173 00:08:31,820 --> 00:08:36,150 وتقوم بالتبديل إلى برنامج آخر لأجلك. 174 00:08:36,150 --> 00:08:36,860 ما اسمك؟ 175 00:08:36,860 --> 00:08:37,290 جان: جان. 176 00:08:37,290 --> 00:08:37,860 ديفيد: جان، أنا ديفيد. 177 00:08:37,860 --> 00:08:38,210 يسرني لقاؤك. 178 00:08:38,210 --> 00:08:39,470 تفضل بالجلوس على المقعد في أقصى اليسار. 179 00:08:39,470 --> 00:08:40,050 واسمك؟ 180 00:08:40,050 --> 00:08:40,840 آبي: مرحبًا، أنا آبي. 181 00:08:40,840 --> 00:08:41,880 سعيد للقائك أيضًا. 182 00:08:41,880 --> 00:08:43,220 في أقصى اليمين من فضلك. 183 00:08:43,220 --> 00:08:46,670 إذن جان وآبي، هل تريدان أن تقولا نبذة بسيطة عنكما 184 00:08:46,670 --> 00:08:48,360 بسرعة؟ 185 00:08:48,360 --> 00:08:49,190 جان: أنا جان. 186 00:08:49,190 --> 00:08:52,990 أنا مواطن من ولاية ماساشوستس، وأخوض دورة علوم الكمبيوتر لأول مرة. 187 00:08:52,990 --> 00:08:54,900 إنها المرة الأولى لي فيما يخص الترميز أو أي شيء. 188 00:08:54,900 --> 00:08:56,680 أو أنا أفعل ذلك وأستمتع به كثيرًا. 189 00:08:56,680 --> 00:08:58,260 ديفيد: جيد، سعيد بوجودك معنا. 190 00:08:58,260 --> 00:08:59,790 وماذا عنك آبي؟ 191 00:08:59,790 --> 00:09:00,590 آبي: مرحبًا، أنا آبي. 192 00:09:00,590 --> 00:09:03,230 أنا أخوض هذه الدورة باعتباري طالبةً في السنة الثانية، ولا أعرف شيئًا 193 00:09:03,230 --> 00:09:04,760 عن أجهزة الكمبيوتر أو علوم الكمبيوتر. 194 00:09:04,760 --> 00:09:06,740 لذا فربما أخوضها إحصاءً تلو الآخر. 195 00:09:06,740 --> 00:09:08,720 ديفيد: حسنًا، جيد، سعيد بوجودكِ معنا أيضًا. 196 00:09:08,720 --> 00:09:11,050 إذن أمامنا مجموعة كاملة من المكونات، 197 00:09:11,050 --> 00:09:13,220 ونأمل أن نتمكن من بدء هذا الفصل الدراسي على مهل. 198 00:09:13,220 --> 00:09:16,010 وإذا نجحنا في هذا، فسنقوم بالفعل بنقلة كبيرة سريعة هنا. 199 00:09:16,010 --> 00:09:17,720 لكنّا كنا نظن أننا سنرجع إلى الجمهور الموجود هنا، 200 00:09:17,720 --> 00:09:19,280 وسيقوم بريان بكتابة نصية لما نقوم به. 201 00:09:19,280 --> 00:09:21,230 وكل ما نريد القيام به هذا الصباح هو فقط 202 00:09:21,230 --> 00:09:25,150 إعداد ساندوتش من زبدة الفول السوداني والمربى، بتعليمة واحدة في كل مرة. 203 00:09:25,150 --> 00:09:27,290 وكل واحدٍ منّا سينفذ فقط ما نسمعه. 204 00:09:27,290 --> 00:09:28,370 كيف يبدو ذلك؟ 205 00:09:28,370 --> 00:09:31,450 حسناً، إذا كان هناك شخص يمكن أن يتطوع بالتعليمة الأولى وسيقوم بريان 206 00:09:31,450 --> 00:09:33,670 بتدوينها. 207 00:09:33,670 --> 00:09:36,530 الجمهور: افتح الخبز. 208 00:09:36,530 --> 00:09:37,660 ديفيد: افتح الخبز هو ما سمعناه. 209 00:09:37,660 --> 00:09:39,020 افتح الخبز هو أول تعليمة. 210 00:09:39,020 --> 00:09:41,010 لذا كل واحدٍ منكم سينفذ فتح الخبز. 211 00:09:46,980 --> 00:09:47,860 كلا، لا تنظر إليّ. 212 00:09:51,010 --> 00:09:53,140 حسنًا، نحن نوعًا ما في الطريق الصحيح. 213 00:09:57,150 --> 00:10:01,290 أعتقد أن آبي فعلتها بشكل أفضل بالتأكيد، لكن يمكن القول أننا فعلناها بشكلٍ صحيح. 214 00:10:01,290 --> 00:10:05,370 لذا دعونا ننتقل إلى الخطوة الثانية ولنرَ ما إذا لم نستطع التحسن. 215 00:10:05,370 --> 00:10:06,410 انزع لبابة الخبز. 216 00:10:12,100 --> 00:10:14,980 مرحبًا بك في الفريق الآن. 217 00:10:14,980 --> 00:10:17,240 رائع، حسنًا، الخطوة الثالثة. 218 00:10:17,240 --> 00:10:17,740 أجل. 219 00:10:17,740 --> 00:10:20,380 الجمهور: ضع قطعتين من الخبز على الطاولة. 220 00:10:20,380 --> 00:10:22,400 ديفيد: ضع قطعتين من الخبز على الطاولة. 221 00:10:26,710 --> 00:10:28,430 لا تضع الأطباق في الاعتبار. 222 00:10:28,430 --> 00:10:31,240 حسنًا، الخطوة الرابعة. 223 00:10:31,240 --> 00:10:34,580 الجمهور: قم بلفّ غطاء المربي حتى ينفتح. 224 00:10:34,580 --> 00:10:36,870 ديفيد: قم بلفّ غطاء المربى حتى ينفتح. 225 00:10:36,870 --> 00:10:37,370 شكرًا لك. 226 00:10:42,290 --> 00:10:43,000 ما الخطوة الخامسة؟ 227 00:10:45,780 --> 00:10:46,410 ما الخطوة الخامسة؟ 228 00:10:46,410 --> 00:10:47,440 أجل؟ 229 00:10:47,440 --> 00:10:48,940 الجمهور: ضع الغطاء جانبًا. 230 00:10:48,940 --> 00:10:49,640 ديفيد: شكرًا لك. 231 00:10:49,640 --> 00:10:51,550 ضع الغطاء جانبًا. 232 00:10:51,550 --> 00:10:52,900 أخذتُ بعض الحريات لنفسي. 233 00:10:52,900 --> 00:10:53,950 الجمهور: خذ السكين. 234 00:10:53,950 --> 00:10:54,860 ديفيد: خذ السكين. 235 00:11:01,490 --> 00:11:03,230 انزع ورقة غطاء المربى. 236 00:11:06,500 --> 00:11:07,380 لا توجد أغطية لدينا. 237 00:11:11,870 --> 00:11:17,180 هل نُدخل السكين في الزجاجة؟ 238 00:11:17,180 --> 00:11:18,830 من الأعلى. 239 00:11:18,830 --> 00:11:25,320 أدخل-- الخطوة التاسعة. 240 00:11:25,320 --> 00:11:28,110 الجمهور: أدِر يديك حتى تصل المربى إليك. 241 00:11:28,110 --> 00:11:30,570 ديفيد: أدِر يديك حتى تصل المربى إليك-- 242 00:11:36,030 --> 00:11:38,410 حسنًا، الخطوة-- بسرعة-- 243 00:11:38,410 --> 00:11:38,910 10. 244 00:11:42,410 --> 00:11:44,470 نعم، ما الخطوة العاشرة؟ 245 00:11:44,470 --> 00:11:45,960 الجمهور: اسحب السكين للخارج. 246 00:11:45,960 --> 00:11:47,410 ديفيد: اسحب السكين للخارج. 247 00:11:47,410 --> 00:11:50,220 حسنًا، الخطوة رقم 11. 248 00:11:52,850 --> 00:11:55,860 اقلب جانب زجاجة المربى لأسفل على الخبز. 249 00:12:02,140 --> 00:12:04,680 حسنًا. الخطوة رقم 12. 250 00:12:09,400 --> 00:12:10,780 أي واحد، ما الخطوة رقم 12؟ 251 00:12:10,780 --> 00:12:12,460 نعم. 252 00:12:12,460 --> 00:12:14,850 شكرًا لك. 253 00:12:14,850 --> 00:12:18,630 الخطوة رقم 13. 254 00:12:18,630 --> 00:12:20,220 اسكب المربى على الخبز. 255 00:12:24,780 --> 00:12:25,530 جان: اسكب المربى-- 256 00:12:25,530 --> 00:12:28,020 ديفيد: اسكب المربى، المربى. 257 00:12:28,020 --> 00:12:28,590 هل نسكبها كلها؟ 258 00:12:28,590 --> 00:12:30,090 حسنًا، أنتم الآن تلعبون معنا. 259 00:12:36,410 --> 00:12:38,680 الخطوة رقم 14. 260 00:12:38,680 --> 00:12:40,420 الجمهور: ضع المربى جانبًا. 261 00:12:40,420 --> 00:12:41,340 ديفيد: ضع المربى جانبًا. 262 00:12:41,340 --> 00:12:42,600 شكرًا لك. 263 00:12:42,600 --> 00:12:45,090 15؟ 264 00:12:45,090 --> 00:12:46,740 التقط زبدة الفول السوداني. 265 00:12:46,740 --> 00:12:48,100 الجمهور: افتح الغطاء. 266 00:12:48,100 --> 00:12:48,940 ديفيد: افتح الغطاء. 267 00:12:48,940 --> 00:12:49,440 شكرًا لك. 268 00:12:52,850 --> 00:12:54,550 انزع الغطاء. 269 00:12:54,550 --> 00:12:55,050 شكرًا لك. 270 00:12:57,570 --> 00:13:00,130 الخطوة رقم 18؟ 271 00:13:00,130 --> 00:13:08,050 التقط السكين من الطرف الممسوح، واغرف. 272 00:13:13,730 --> 00:13:15,280 اغرف. 273 00:13:15,280 --> 00:13:18,770 الخطوة رقم 20؟ 274 00:13:18,770 --> 00:13:20,130 هل نضع زبدة الفول السوداني على الخبز؟ 275 00:13:25,570 --> 00:13:26,560 21؟ 276 00:13:26,560 --> 00:13:28,190 الجمهور: حرّك السكين من اليسار إلى اليمين. 277 00:13:28,190 --> 00:13:32,150 ديفيد: حرّك-- حرّك السكين من اليسار إلى اليمين، من فضلك. 278 00:13:32,150 --> 00:13:32,750 من اليسار إلى اليمين. 279 00:13:38,410 --> 00:13:39,200 الخطوة رقم 22؟ 280 00:13:41,970 --> 00:13:43,410 الجمهور: ضع السكين جانبًا. 281 00:13:43,410 --> 00:13:44,380 ديفيد: شكرًا لك. 282 00:13:44,380 --> 00:13:45,460 23؟ 283 00:13:45,460 --> 00:13:47,080 الجمهور: ضع البرطمان جانبًا. 284 00:13:47,080 --> 00:13:49,080 ديفيد: 24. 285 00:13:49,080 --> 00:13:50,040 ماذا كانت تلك الخطوة؟ 286 00:13:53,900 --> 00:13:55,280 كُلْ الساندويتش. 287 00:13:55,280 --> 00:13:57,370 حسنًا، أعتقد أننا-- 288 00:13:57,370 --> 00:13:58,860 رائعون، لماذا لا يأخذ كل منا قضمة؟ 289 00:13:58,860 --> 00:14:01,240 وعاصفة من التصفيق، رجاءً، لمتطوعينا. 290 00:14:07,200 --> 00:14:09,950 شكرًا لكما. 291 00:14:09,950 --> 00:14:11,650 آبي: هل تمانعين في أن آخذ بعضها للطريق؟ 292 00:14:11,650 --> 00:14:14,690 ديفيد: يمكنك أخذ البعض للطريق إذا أردت. 293 00:14:14,690 --> 00:14:15,190 شكرًا لك. 294 00:14:15,190 --> 00:14:17,820 إذن-- شكرًا لك، بريان. 295 00:14:17,820 --> 00:14:18,820 حسنًا، أنا الآن بحاجةٍ إلى دقيقة. 296 00:14:21,580 --> 00:14:22,750 شكرًا لكم. 297 00:14:22,750 --> 00:14:28,690 يكفي أن نقول، أثبت هذا المثال بوضوح أكثر من 298 00:14:28,690 --> 00:14:32,050 مثال دليل الهاتف أين تتواجد الافتراضات المعينة لدينا 299 00:14:32,050 --> 00:14:33,680 وعمليات التجريد لدينا. 300 00:14:33,680 --> 00:14:35,810 وبصراحة، كلها تقريبًا تعتبر مفيدة طوال الوقت. 301 00:14:35,810 --> 00:14:37,290 وبالطبع، لقد عطّلنا الأمور بعض الشيء. 302 00:14:37,290 --> 00:14:39,990 وأعتقد أن التعليمات كانت نوعًا ما تساعدنا في هذا الأمر هنا. 303 00:14:39,990 --> 00:14:43,450 ولكن عندما يحين وقت البرمجة باستخدام لغة سكراتش وبالتأكيد باستخدام لغة C 304 00:14:43,450 --> 00:14:46,480 بدءًا من هذا الأسبوع، لا يمكنك حقيقةً إجراء افتراضات عديدة بذلك العدد 305 00:14:46,480 --> 00:14:49,450 بعد الآن لأنك، إذا لم تتعامل مع هذه الحالات الحرجة 306 00:14:49,450 --> 00:14:51,930 وإذا لم تفكر فيما تعنيه تلك التعليمة، 307 00:14:51,930 --> 00:14:54,850 فستحصل على كرة الشاطيء الدوّارة الشهيرة أو الساعة الرملية 308 00:14:54,850 --> 00:14:56,320 التي تعرفها جيدًا على جهاز Mac أو الكمبيوتر الشخصي لديك. 309 00:14:56,320 --> 00:14:58,070 سيتعطل البرنامج، وسيحدث خطأ ما 310 00:14:58,070 --> 00:15:03,240 فقط لأنك تفتقد لبعض التحديد أو الدقة. 311 00:15:03,240 --> 00:15:05,440 الآن نحن جميعًا ممتلؤون بزبدة الفول السوداني. 312 00:15:05,440 --> 00:15:09,250 لذا وبمرور الوقت، سنكتشف أننا قادرون، بما يشبه إلى حدٍ كبير لغة سكراتش، 313 00:15:09,250 --> 00:15:11,230 على إنشاء الكتل البنائية الخاصة بنا. 314 00:15:11,230 --> 00:15:14,500 يمكنكم تذكر الأمثلة الصغيرة التي قمنا بها مع مثال السعال 315 00:15:14,500 --> 00:15:17,080 عندما كنت أقوم بسعال 0 ثم سعال 1 وسعال 2 316 00:15:17,080 --> 00:15:20,030 حيث كنت أصنع قطع اللغز الخاصة بي داخل لغة سكراتش. 317 00:15:20,030 --> 00:15:22,450 كان هذا مفيدًا لأنه، عقب هذا المثال من الناحية النظرية، 318 00:15:22,450 --> 00:15:26,710 لن أكون بحاجة مرة أخرى مطلقًا للتفكير أو القلق بشأن كيفية تنفيذ السعال. 319 00:15:26,710 --> 00:15:28,210 يمكنني فقط استخدام ذلك التجريد. 320 00:15:28,210 --> 00:15:30,420 لكن لا بد وأن يكون شخص ما قد نفذها، وفي بعض الأحيان يكون ذلك 321 00:15:30,420 --> 00:15:32,470 على يد أشخاص آخرين جاؤوا قبلنا. 322 00:15:32,470 --> 00:15:33,900 وفي أحيانٍ أخرى يكون هذا عملنا نحن. 323 00:15:33,900 --> 00:15:36,760 إذن هذا لا يعني أن البرمجة ينتهي بها الحال لأن تكون مملة 324 00:15:36,760 --> 00:15:38,930 لدرجة أن تضطر للإشارة إلى كل تفصيلة صغيرة، 325 00:15:38,930 --> 00:15:43,210 لكن يتعين عليك أنت أو شخص ما القيام بذلك المستوى من الدقة على الأقل مرةً واحدة. 326 00:15:43,210 --> 00:15:47,200 ومن الجيد بما فيه الكفاية في لغة سكراتش، قيام MIT "معهد ماساشوستس للتكنولوجيا" بمعظم هذا العمل الشاق لأجلك. 327 00:15:47,200 --> 00:15:48,910 لقد كانت لدينا جميعًا الكتل البنائية التي سيتم باستخدامها 328 00:15:48,910 --> 00:15:51,520 إعداد الرسوم المتحركة الخاصة بنا أو الألعاب أو العمل الفني أو ما شابه. 329 00:15:51,520 --> 00:15:54,640 لكن وحتى ذلك الحين، ربما كان يتعين عليك توصيل عشرات من قطع اللغز 330 00:15:54,640 --> 00:15:57,430 أو أكثر من ذلك للحصول على تلك الأساسيات لتقوم 331 00:15:57,430 --> 00:15:59,890 بالشيء الذي أردتَ منها القيام به. 332 00:15:59,890 --> 00:16:02,270 لذا سنبدأ اليوم في الانتقال من لغة سكراتش، 333 00:16:02,270 --> 00:16:05,060 لغة البرمجة الرسومية هذه، التي في حين أنها تستهدف الطلاب الأصغر 334 00:16:05,060 --> 00:16:07,570 سنًا، إلا أنها تعتبر مثالاً نموذجيًا لكثير من 335 00:16:07,570 --> 00:16:10,880 المفاهيم ذاتها التي ستصبح الآن مرتبطة على مدار الفصل الدراسي. 336 00:16:10,880 --> 00:16:14,290 لكننا اليوم بصدد تقديم لغة أقدم وأكثر تقليديةً والتي 337 00:16:14,290 --> 00:16:15,550 تعتمد على النصوص فقط. 338 00:16:15,550 --> 00:16:17,140 وبالتالي فهي أكثر قوة بكثير. 339 00:16:17,140 --> 00:16:20,140 لكن من الوهلة الأولى، ستبدو في الواقع مبهمةً بدرجة أكبر بكثير. 340 00:16:20,140 --> 00:16:23,530 في الواقع، بدلاً من كتابة الأصفار والواحدات ابتداءً من اليوم، 341 00:16:23,530 --> 00:16:25,900 سنكتب بدلاً منها شيئًا مثل هذا. 342 00:16:25,900 --> 00:16:28,880 الآن إذا لم تكن قد قمتَ بالبرمجة من قبل، ستتمثل الاحتمالات، لأول وهلة، 343 00:16:28,880 --> 00:16:31,000 في أن هذه اللغة تبدو غامضةً للغاية، وسيكون هناك 344 00:16:31,000 --> 00:16:34,060 كثير من الرموز بداخلها، وعلامات ترقيم من لوحة المفاتيح. 345 00:16:34,060 --> 00:16:36,730 ربما تكون هناك بعض الكلمات المألوفة الشبيهة باللغة الإنجليزية. 346 00:16:36,730 --> 00:16:40,390 وبصراحة، حتى بعد تنفيذ لغة سكراتش يحتمل لأي شخص، حتى مع عدم وجود خلفية سابقة، 347 00:16:40,390 --> 00:16:43,570 أن يخمّن فيما يتعلق بما يفعله هذا البرنامج المكتوب 348 00:16:43,570 --> 00:16:47,310 بهذه اللغة الأخرى المسمّاة لغة C عندما تقوم بتشغيله. 349 00:16:47,310 --> 00:16:48,940 فهو يقوم فقط بأمر print "طباعة" لجملة hello world. 350 00:16:48,940 --> 00:16:52,200 افترض الآن أنه يوجد قدر جدير بالاحترام من التجاوزات من ناحية بناء الجملة. 351 00:16:52,200 --> 00:16:54,250 توجد لديك مجموعة من الأشياء يتعين عليك كتابتها لتجعل 352 00:16:54,250 --> 00:16:56,240 هذا البرنامج يقوم بما تريد منه القيام به. 353 00:16:56,240 --> 00:16:58,750 لكن في نهاية المطاف، هذا هو كل ما سيفعله. 354 00:16:58,750 --> 00:17:00,820 وهذا يعتبر من بين أبسط البرامج 355 00:17:00,820 --> 00:17:03,100 التي سنقوم بإضافتها إلى قطع اللغز لدينا، إذا 356 00:17:03,100 --> 00:17:05,770 جاز التعبير، اليوم وسنطّلع على بعض من تلك المفاهيم ذاتها 357 00:17:05,770 --> 00:17:07,760 التي رأيناها في المرة الماضية أيضًا. 358 00:17:07,760 --> 00:17:09,520 إذن دعونا مع ذلك نقوم بهذا أولاً. 359 00:17:09,520 --> 00:17:13,210 دعوني أتوقف لدقيقة للمقارنة بين لغة سكراتش ولغة C 360 00:17:13,210 --> 00:17:15,080 لأن العبرة الأهم ليومنا هذا 361 00:17:15,080 --> 00:17:18,070 ستكون كذلك، حتى لو لم يبدُ بناء الجملة واضحًا للغاية-- 362 00:17:18,070 --> 00:17:20,410 وبصراحة، حتى لو كانت دقائقك أو ساعاتك الأولى 363 00:17:20,410 --> 00:17:23,410 في كتابة التعليمة البرمجية الخاصة بك في لغة C أمرًا محبطًا لأنك، أوه، 364 00:17:23,410 --> 00:17:25,560 اللعنة، أخطأتَ بإهمال فصلة منقوطة أو، أوه، 365 00:17:25,560 --> 00:17:27,190 وضعتُ زوج أقواس في المكان الخطأ. 366 00:17:27,190 --> 00:17:29,280 توجد كثير من هذه العوائق الغبية المتعلقة ببناء الجملة 367 00:17:29,280 --> 00:17:31,990 التي تجعلك تشعر في كثير من الأحيان أنك لا تصل إليها حقيقةً. 368 00:17:31,990 --> 00:17:33,440 لكن ذلك ليس هو الشيء المهم. 369 00:17:33,440 --> 00:17:35,980 فكثير من بناء الجملة يعد هو الأقل أهمية. 370 00:17:35,980 --> 00:17:38,440 فذلك ليس مثيرًا للاهتمام من الناحية الفكرية أساسًا على الإطلاق. 371 00:17:38,440 --> 00:17:41,350 لذا حاول أن تنظر أبعد من ذلك، وحاول أن تطمئن للحقيقة التي مفادها 372 00:17:41,350 --> 00:17:44,110 أن المبادئ هي التي ستكون مهمة. 373 00:17:44,110 --> 00:17:47,560 وبصراحة، بمجرد تنشيط ذاكرة العضلات وتدريبها، ستكون جميع الأشياء الأخرى 374 00:17:47,560 --> 00:17:50,290 التي كانت في البداية ستمثل إحباطًا عرضيًا، 375 00:17:50,290 --> 00:17:52,450 ستبدأ توًا في التلاشي عندما تبدأ في رؤية هذا 376 00:17:52,450 --> 00:17:55,110 على ما هو عليه وليس لبناء الجملة فقط 377 00:17:55,110 --> 00:17:57,430 الذي تراه لأول وهلة. 378 00:17:57,430 --> 00:18:01,830 لذا فهذا يعني أن البرنامج على اليمين في لغة C 379 00:18:01,830 --> 00:18:05,410 يكافئ ما فعلناه قبل أسبوع واحد مع قطعتي اللغز في لغة سكراتش. 380 00:18:05,410 --> 00:18:08,260 الآن لن يكون هناك علم أخضر على جهاز Mac أو جهاز الكمبيوتر لديّ 381 00:18:08,260 --> 00:18:10,060 كلما تحركنا للأمام حيثما يمكنك فقط النقر. 382 00:18:10,060 --> 00:18:12,130 سنقوم بتشغيل هذه البرامج بطريقة مختلفة قليلاً، 383 00:18:12,130 --> 00:18:14,150 ولكن هذا كل ما تفعله التعليمات البرمجية على اليمين. 384 00:18:14,150 --> 00:18:15,680 إنها مكافئة للتعليمة البرمجية على اليسار. 385 00:18:15,680 --> 00:18:17,800 لذلك دعونا نفعل ذلك مجددًا ومرة ​​أخرى فقط لعدد قليل من تلك المفاهيم 386 00:18:17,800 --> 00:18:21,080 من المرة الماضية، ومن ثم سنبدأ في كتابة بعض البرامج الخاصة بنا. 387 00:18:21,080 --> 00:18:26,800 إذن كان هذا مثالاً، هذه الكتلة الأرجوانية، تمثل أي مفهوم في البرمجة؟ 388 00:18:26,800 --> 00:18:27,610 أجل، دالّة. 389 00:18:27,610 --> 00:18:28,480 إذن فقد كانت عبارة عن فعل. 390 00:18:28,480 --> 00:18:30,610 لقد كانت عبارة عن إجراء، وسنطلق على تلك الإجراءات عامةً اسم الدوالّ. 391 00:18:30,610 --> 00:18:32,510 ويكون لها فقط أدائية مدمجة فيها. 392 00:18:32,510 --> 00:18:34,000 إذن كيف نقوم بفعل ذلك في لغة C؟ 393 00:18:34,000 --> 00:18:35,990 حسنًا، ربما تذكرون منذ دقيقة فقط، 394 00:18:35,990 --> 00:18:38,560 أنه نظرًا لأن أحد سطور التعليمة البرمجية كان ممثلاً لهذا، 395 00:18:38,560 --> 00:18:40,430 فقد كان لها بعض من بناء الجملة هذا. 396 00:18:40,430 --> 00:18:42,520 لذا وفي الواقع، إذا كان عليّ أن أترجم الكتلة 397 00:18:42,520 --> 00:18:45,610 الموجودة على اليسار في لغة سكراتش إلى التعليمة البرمجية المكافئة في هذه اللغة الأخرى المبنية على 398 00:18:45,610 --> 00:18:48,250 النص المسمّاة لُغة C، فسأبدأ بكتابة كلمة print 399 00:18:48,250 --> 00:18:50,830 ثم أفتح الأقواس ثم أغلق الأقواس. 400 00:18:50,830 --> 00:18:54,610 وتلك الأقواس تمثل الشكل البيضاوي، الشكل البيضاوي الأبيض الموجود على اليسار، 401 00:18:54,610 --> 00:18:56,920 الذي كتبنا بداخله hello world من قبل. 402 00:18:56,920 --> 00:18:59,260 الآن في لغة C، لا يعتبر الأمر حرفيًا كذلك. 403 00:18:59,260 --> 00:19:02,200 الدالّة، أو الفعل، لا تُسمى في الواقع print. 404 00:19:02,200 --> 00:19:04,870 بل تُسمى printf، ويرمز الحرف F إلى formatted "منسق". 405 00:19:04,870 --> 00:19:07,030 وهذا يعني فقط أنك في لغة C يمكنك بالفعل 406 00:19:07,030 --> 00:19:08,840 تنسيق النص الموجود لديك بطرق مختلفة. 407 00:19:08,840 --> 00:19:11,270 لذلك سنرى قريبًا، وسيتضح 408 00:19:11,270 --> 00:19:13,900 أنك لا تكتب فقط hello world بين تلك الأقواس 409 00:19:13,900 --> 00:19:15,100 مثلما فعلنا في لغة سكراتش. 410 00:19:15,100 --> 00:19:18,730 يتعين عليك أيضًا أن تحيطها بعلامات الاقتباس المزدوجة في لغة C. 411 00:19:18,730 --> 00:19:21,400 هذا ليس بالأمر الجلل، لكن هذا شيء لم يكن عليك فعله سابقًا. 412 00:19:21,400 --> 00:19:24,460 لكن في لغة C، أنت أيضًا سترغب عمومًا 413 00:19:24,460 --> 00:19:26,500 في أن تكون محددًا بدرجة فائقة للكمبيوتر. 414 00:19:26,500 --> 00:19:29,140 وعندما تريد من مؤشر النص على الشاشة 415 00:19:29,140 --> 00:19:32,290 أن ينتقل لأسفل إلى السطر التالي، فستحتاج لتخبر الكمبيوتر بذلك 416 00:19:32,290 --> 00:19:34,330 بكتابة /n "خط مائل عكسي وحرف n" حرفيًا. 417 00:19:34,330 --> 00:19:36,670 لن يرى الشخص /n "خطًا مائلاً عكسيًا وحرف n". 418 00:19:36,670 --> 00:19:38,830 بل سيرى في الواقع المؤشر ينتقل 419 00:19:38,830 --> 00:19:41,650 إلى السطر التالي من الشاشة كما هو الحال في برنامج Google Docs 420 00:19:41,650 --> 00:19:43,210 أو في برنامج Microsoft Word أو ما شابه. 421 00:19:43,210 --> 00:19:45,610 لكن هذا يدلّ فقط على الدقة التي 422 00:19:45,610 --> 00:19:48,220 تحتاج إليها عندما تتحدث إلى جهاز كمبيوتر على هذا المستوى 423 00:19:48,220 --> 00:19:49,730 وليس فقط مع قطع اللغز. 424 00:19:49,730 --> 00:19:51,940 ومن ثم شيء أخير-- وقد أشرتُ إليه سابقًا 425 00:19:51,940 --> 00:19:54,550 لأنه يمثل مصدر الإزعاج لكثير من المبرمجين في المراحل الأولى. 426 00:19:54,550 --> 00:19:58,720 يجب أن تنتهي معظم سطور التعليمة البرمجية في لغة C بفصلةٍ منقوطة. 427 00:19:58,720 --> 00:20:01,570 وذلك هو نوع التعليمة البرمجية المكافئ للنقطة في جملة باللغة الإنجليزية 428 00:20:01,570 --> 00:20:03,440 أو ببعض لغات أخرى. 429 00:20:03,440 --> 00:20:04,200 إذن هذه هي. 430 00:20:04,200 --> 00:20:06,030 لقد استغرق الأمر منا قليلاً من الوقت لنطور ذلك. 431 00:20:06,030 --> 00:20:06,910 لكن هذا هو كل ما فيه. 432 00:20:06,910 --> 00:20:09,550 الفكرة على اليسار من قول شيءٍ ما هي نفسها في لغة C 433 00:20:09,550 --> 00:20:13,350 كطباعة شيءٍ ما باستخدام هذه الدالّة التي تُسمى printf. 434 00:20:13,350 --> 00:20:15,730 وقبل أن أمضي قدمًا مع بعض المقارنات الأخرى، 435 00:20:15,730 --> 00:20:18,620 هل توجد أي أسئلة حول هذه الترجمة بالذات؟ 436 00:20:18,620 --> 00:20:20,570 الجمهور: كيف تكتب /n "الخط المائل العكسي n"؟ 437 00:20:20,570 --> 00:20:22,070 ديفيد: كيف تكتب /n "الخط المائل العكسي وحرف n"؟ 438 00:20:22,070 --> 00:20:26,000 هذا جيد، لذا بالتفكير في المستقبل، سيبدو الأمر صعبًا أن يظهر للمستخدم حرفيًا 439 00:20:26,000 --> 00:20:28,010 /n "الخط المائل العكسي وحرف n". 440 00:20:28,010 --> 00:20:30,860 حسنًا، يتضح أن هذا / "الخط المائل العكسي"، نظرًا لأنه ليس 441 00:20:30,860 --> 00:20:33,530 حرفًا شائعًا جدًا، يستخدمه عالم البرمجة 442 00:20:33,530 --> 00:20:35,600 كما يُطلق عليه حرف إلغاء. 443 00:20:35,600 --> 00:20:39,260 إنه الحرف الذي تستخدمه عندما تريد إلغاء معلومات وإظهارها 444 00:20:39,260 --> 00:20:40,620 بطريقة مختلفة قليلاً. 445 00:20:40,620 --> 00:20:43,210 لذا فالطريقة التي ستُظهر بها حرفيًا للشخص 446 00:20:43,210 --> 00:20:46,790 /n "خطًا مائلاً عكسيًا فعليًا وحرف n" هي أن تقوم فعليًا في التعليمة البرمجية لديك 447 00:20:46,790 --> 00:20:51,470 بكتابة //n "خط مائل عكسي خط مائل عكسي حرف n" لأن الخط المائل العاكسي الثاني يمثل 448 00:20:51,470 --> 00:20:53,630 أن تقول، تعامل مع الحرف التالي بشكل خاص 449 00:20:53,630 --> 00:20:55,430 وأظهره فعليًا للشخص. 450 00:20:55,430 --> 00:20:57,330 وهناك أمثلة أخرى من هذا القبيل. 451 00:20:57,330 --> 00:20:58,400 إذن ماذا عن هذه؟ 452 00:20:58,400 --> 00:21:02,840 هل هذه الكتلة البرتقالية كانت تعتبر مثالاً لمفهومٍ واحد في لغة سكراتش؟ 453 00:21:02,840 --> 00:21:05,850 أجل، إذن كانت هذه بمثابة متغير، مثل x و y في الجبر. 454 00:21:05,850 --> 00:21:08,830 لقد كانت هذه الكتلة مجرد عنصر نائب للبيانات، وكان بإمكانك تخزين الأرقام. 455 00:21:08,830 --> 00:21:10,220 يتضح أيضًا أنه يمكنك تخزين الكلمات. 456 00:21:10,220 --> 00:21:12,660 ويمكنك تخزين أشياء أخرى أيضًا بلغات أخرى. 457 00:21:12,660 --> 00:21:14,550 إذن سنقوم بذلك في لغة C. 458 00:21:14,550 --> 00:21:17,000 سنقول، حرفيًا، أن اسم المتغير الذي نريده-- على سبيل المثال، هو 459 00:21:17,000 --> 00:21:17,550 counter "عداد". 460 00:21:17,550 --> 00:21:19,340 لكن يمكننا أن نطلق على أي شيء نريده-- 461 00:21:19,340 --> 00:21:22,760 أنه مساوٍ للصفر إذا حددنا من البداية أنه يساوي الصفر. 462 00:21:22,760 --> 00:21:24,770 لكن لغة C تدقق في التفاصيل بدرجة أكبر قليلاً. 463 00:21:24,770 --> 00:21:28,170 فيجب عليك أيضًا إخبار الكمبيوتر، أن نوع المتغير الذي أريده 464 00:21:28,170 --> 00:21:31,820 يكون على وجه التحديد لعدد صحيح، والإ يتم اختصاره كـ int. 465 00:21:31,820 --> 00:21:34,370 لذلك عليك أن تخبر الكمبيوتر مسبقًا بنوع البيانات 466 00:21:34,370 --> 00:21:35,530 الذي ستخزنها عليه. 467 00:21:35,530 --> 00:21:36,470 وخمّن. 468 00:21:36,470 --> 00:21:40,620 يجب عليك إنهاء الفكرة على لغة C. ما المزيد الذي نحتاج إلى إضافته إلى-- 469 00:21:40,620 --> 00:21:41,900 أجل، فقط فصلة منقوطة. 470 00:21:41,900 --> 00:21:42,490 وهذا كل شيء. 471 00:21:42,490 --> 00:21:46,580 يبدو أنه أكثر غموضًا قليلاً، لكن الفكرة هي نفسها في الأساس. 472 00:21:46,580 --> 00:21:48,590 إذن ماذا لو أردنا القيام بهذا في لغة سكراتش؟ 473 00:21:48,590 --> 00:21:53,240 غيّر العداد بمعدل 1-- وهذا كان مكافئًا لزيادة أو إضافة 1 474 00:21:53,240 --> 00:21:54,170 إلى counter "العداد". 475 00:21:54,170 --> 00:21:56,790 حسنًا، دعوني أمضي قدمًا وأقترح أنكم قد تقومون بذلك تحديدًا 476 00:21:56,790 --> 00:22:03,500 في لغة C. اضبط العداد ليساوي أي عداد حاليًا زائد 1. 477 00:22:03,500 --> 00:22:05,330 يبدو أن ذلك هو الحدس الصحيح. 478 00:22:05,330 --> 00:22:07,520 والآن لاحظ، ما يعتبر أساسًا للملاحظة هنا هو 479 00:22:07,520 --> 00:22:12,680 أن علامة يساوي هذه لا تعني أن العداد يساوي العداد زائد 1 480 00:22:12,680 --> 00:22:15,230 لأن ذلك تحديدًا لا يبدو ممكنًا. 481 00:22:15,230 --> 00:22:17,930 إذا اخترت أي قيمة للعداد، مثل الرقم 1، 482 00:22:17,930 --> 00:22:22,430 حسنًا، واحد بالتأكيد لا يساوي 1 زائد 1، وهو ما يساوي 2. 483 00:22:22,430 --> 00:22:24,440 و1 لا يساوي 2، ويمكنك التوصل 484 00:22:24,440 --> 00:22:28,080 إلى عدد لا نهائي من المقارنات غير الصحيحة المزعجة. 485 00:22:28,080 --> 00:22:31,160 لذا فعلامة يساوي في لغة C، كمثل كثير من اللغات التي نراها في الصف، 486 00:22:31,160 --> 00:22:32,330 تعني في الواقع التعيين. 487 00:22:32,330 --> 00:22:35,750 انسخ القيمة الموجودة على اليمين إلى القيمة الموجودة على اليسار. 488 00:22:35,750 --> 00:22:38,880 إذن قم بضبط العداد المساوي لأي عداد يساويه زائد 1. 489 00:22:38,880 --> 00:22:39,380 ماذا؟ 490 00:22:39,380 --> 00:22:41,090 يجب علينا إنهاء الفكرة. 491 00:22:41,090 --> 00:22:42,560 لذا نحتاج إلى فاصلة منقوطة. 492 00:22:42,560 --> 00:22:48,220 لا أعتقد أننا بحاجة لإعادة ذكر int، ولماذا قد يُستخدم ذلك الاختصار؟ 493 00:22:48,220 --> 00:22:50,350 أجل، لقد أخبرتُ الكمبيوتر بالفعل أنه عدد صحيح. 494 00:22:50,350 --> 00:22:52,760 فلا داعي أن تكرر نفسك بذكر int مرة أخرى، 495 00:22:52,760 --> 00:22:55,960 مفترضًا في هذا السياق، أنه حتى على الرغم من أننا ننظر إليه على الشريحة تمامًا، 496 00:22:55,960 --> 00:22:58,900 إلا أنه قد تم إنشاؤه بالفعل من قبل تمامًا كما فعلتَ 497 00:22:58,900 --> 00:23:00,880 مع لغة سكراتش بقول make a variable "اجعله متغيرًا". 498 00:23:00,880 --> 00:23:04,540 لذا يتضح أنه يمكنك أن تكون موجزًا أكثر من ذلك بقليل في لغة C وكثير من اللغات. 499 00:23:04,540 --> 00:23:07,910 إذا وجدتَ كتابة هذا مملة قليلاً-- وأنه مطنب قليلاً. 500 00:23:07,910 --> 00:23:09,040 فهو مجموعة من ضغطات المفاتيح. 501 00:23:09,040 --> 00:23:10,950 يمكنك بالفعل اختصارها باستخدام هذا فقط. 502 00:23:10,950 --> 00:23:15,700 لذا فعلامات زائد يساوي هي مجرد تجميل لغوي، كما سيقول المبرمج. 503 00:23:15,700 --> 00:23:19,360 إنها فقط مجرد ميزة خيالية لطيفة تتيح لنا كتابة كلمات أو أحرف أقل 504 00:23:19,360 --> 00:23:20,270 لكنها تفعل الشيء نفسه. 505 00:23:20,270 --> 00:23:21,900 وبصراحة، يمكننا القيام بما هو أفضل قليلاً. 506 00:23:21,900 --> 00:23:24,860 وإذا ما أخذتَ كائن PCS، فربما تكون قد رأيتَ هذا في لغة Java كذلك. 507 00:23:24,860 --> 00:23:29,830 يمكنك أيضًا تبسيط هذا أكثر فقط إلى عداد زائد زائد فاصلة منقوطة. 508 00:23:29,830 --> 00:23:31,160 إذن هذا هو-- كلها متساوية. 509 00:23:31,160 --> 00:23:32,710 هذا أكثر فاعلية بقليل. 510 00:23:32,710 --> 00:23:34,540 وكلما وصلتَ لبرمجة أكثر راحة، 511 00:23:34,540 --> 00:23:36,460 مع الوضع في الاعتبار أن ضغطات المفاتيح توفر لك الوقت فقط. 512 00:23:36,460 --> 00:23:40,630 الآن كان هذا بالطبع مثالاً على ما يوجد على النقيض في لغة سكراتش؟ 513 00:23:40,630 --> 00:23:42,140 أجل، لقد أطلقنا على هذا اسم شرط. 514 00:23:42,140 --> 00:23:45,610 وكان يتضمن تعبيرًا منطقيًا كنا نطرح سؤالاً عنه. 515 00:23:45,610 --> 00:23:49,660 في هذه الحالة، يبدو أننا نسأل في لغة سكراتش هل x أقل من y، وإذا كان الأمر كذلك، 516 00:23:49,660 --> 00:23:51,040 فاذكر الإجابة على الشاشة. 517 00:23:51,040 --> 00:23:52,930 إذن كيف يمكننا ترجمة هذا لمشاهدته؟ 518 00:23:52,930 --> 00:23:56,530 حسنًا، من الواضح أننا بكل بساطة ترجمنا هذا نوعًا ما بشكل حرفي. 519 00:23:56,530 --> 00:23:59,110 لقد شاهدنا تقريبًا كل الكتل البنائية حتى الآن، 520 00:23:59,110 --> 00:24:01,630 لكن يجب علينا أن نقدم الآن شيئًا جديدًا نوعًا ما هنا. 521 00:24:01,630 --> 00:24:04,840 لاحظوا أن سطر printf تقريبًا مطابق لما 522 00:24:04,840 --> 00:24:06,340 استخدمتُه من قبل لجملة hello world تحديدًا. 523 00:24:06,340 --> 00:24:09,970 لقد قمتُ بوضوح فقط بتغيير الكلمات فيها، لكن ما يزال /n "الخط المائل العكسي وحرف n" موجودًا لديّ. 524 00:24:09,970 --> 00:24:12,160 ما تزال علامات الاقتباس موجودة لديّ، ولا تزال الفاصلة المنقوطة موجودة. 525 00:24:12,160 --> 00:24:14,410 لذا فالباقي كما هو بالمثل. 526 00:24:14,410 --> 00:24:17,440 الآن تصبح if "إذا" جديدة، لكن هذه ترجمة حرفية. 527 00:24:17,440 --> 00:24:18,370 تسمّيها لغة سكراتش if "إذا". 528 00:24:18,370 --> 00:24:19,120 وتسمّيها لغة C أيضًا if "إذا". 529 00:24:19,120 --> 00:24:20,910 والشيء الوحيد الإضافي الذي تحتاجه في لغة C 530 00:24:20,910 --> 00:24:22,820 هو الأقواس حول التعبير المنطقي. 531 00:24:22,820 --> 00:24:25,900 وذلك هو ما يحل محل الكتلة الخضراء الصغيرة هناك. 532 00:24:25,900 --> 00:24:28,600 ثم بافتراض أن x وy هما بالفعل متغيران 533 00:24:28,600 --> 00:24:31,660 قمنا بإنشائهما سابقًا، فيمكنك فقط مقارنتهما مثل هذا 534 00:24:31,660 --> 00:24:34,690 ويمكنك أيضًا استخدام رمز أكبر من والرموز الأخرى للمقارنة أيضًا. 535 00:24:34,690 --> 00:24:37,140 ولكن يوجد شيء مثير للاهتمام قليلاً، ومعظمنا 536 00:24:37,140 --> 00:24:40,060 غالبًا ليست لديه فرصة حتى لاستخدام هذه المفاتيح الموجودة على لوحة المفاتيح. 537 00:24:40,060 --> 00:24:42,580 فالأقواس المتعرجة، في لوحة مفاتيح الولايات المتحدة كثيرًا ما تكون 538 00:24:42,580 --> 00:24:45,190 موجودة بأعلى اليمين فوق مفتاح Enter. 539 00:24:45,190 --> 00:24:49,520 وهذه الأقواس مكافئة تمامًا لتلك الخاصة بلُغة C من هذا الشكل. 540 00:24:49,520 --> 00:24:52,360 لاحظ أن معظم الكتل الصفراء في لغة سكراتش 541 00:24:52,360 --> 00:24:55,990 كان لها هذا التضمين أو هذا الشكل التضميني لها. 542 00:24:55,990 --> 00:24:59,530 يمكنك محاكاة ذلك في لغة C بوضع ما يطلق عليه قوس متعرج مفتوح 543 00:24:59,530 --> 00:25:00,800 ثم قوس متعرج مغلق. 544 00:25:00,800 --> 00:25:02,140 إذن فتلك هي نفس الفكرة تمامًا. 545 00:25:02,140 --> 00:25:06,100 الآن كملاحظة جانبية، فأنت لستَ بحاجة من الناحية الفنية إلى هذه الأقواس المتعرجة. 546 00:25:06,100 --> 00:25:08,200 إذا كانت لديك فقط طبقة مثل هذه، فيمكنك 547 00:25:08,200 --> 00:25:10,730 حذفها لأنك ربما تراها على الإنترنت أو الكتب المدرسية. 548 00:25:10,730 --> 00:25:13,780 لكننا سنقوم فقط برسمها من أجل التناسق بحيث تبدو التعليمة البرمجية بلغة C 549 00:25:13,780 --> 00:25:17,240 دائمًا كهذا. 550 00:25:17,240 --> 00:25:20,050 ماذا لو أردت التعبير عن هذا، رغم ذلك؟ 551 00:25:20,050 --> 00:25:25,390 إذا كانت x أقل من y، فقل إن x أقل من y، وإلا قل إن x ليست أقل من y. 552 00:25:25,390 --> 00:25:27,700 حسنًا، من الواضح أن هذا متطابق تقريبًا. 553 00:25:27,700 --> 00:25:31,330 أول أربعة أسطر، تمامًا هي نفسها كما سبق. 554 00:25:31,330 --> 00:25:33,550 لكن من الواضح أنك في لغة C، يمكنك أن تقول حرفيًا else "وإلا" 555 00:25:33,550 --> 00:25:35,600 بعد إغلاق ذلك القوس المتعرج. 556 00:25:35,600 --> 00:25:38,890 ثم يمكنك بدلاً من ذلك طباعتها كما تريد قولها. 557 00:25:38,890 --> 00:25:40,570 لذا فهذا يشبه مفترق الطرق. 558 00:25:40,570 --> 00:25:41,860 إذا سلكت طريقًا، فقل هذا. 559 00:25:41,860 --> 00:25:45,070 وإذا سلكتَ الطريق الآخر، فقل هذا الشيء الآخر. 560 00:25:45,070 --> 00:25:47,350 هل توجد أي أسئلة حول هذه المقارنات حتى الآن؟ 561 00:25:47,350 --> 00:25:48,030 أجل. 562 00:25:48,030 --> 00:25:52,500 الجمهور: هل يجب وضع القوس الأول في نفس السطر الموجود فيه if "إذا"؟ 563 00:25:52,500 --> 00:25:54,060 ديفيد: سؤال جيد حقًا. 564 00:25:54,060 --> 00:25:56,760 هل يمكنك أن أو هل تقوم بوضع القوس المتعرج في نفس السطر الموجود فيه if "إذا"؟ 565 00:25:56,760 --> 00:25:59,640 يمكنك ذلك، وسنتحدث عن ذلك خلال الأسبوعين المقبلين، 566 00:25:59,640 --> 00:26:00,930 إنها مسألة أسلوب. 567 00:26:00,930 --> 00:26:04,350 هناك طرق مختلفة يمكنني التعبير بها عن هذه التعليمة البرمجية نفسها. 568 00:26:04,350 --> 00:26:09,190 بصراحة، يمكنني كتابة كل هذه التعليمة البرمجية دون مسافات أيًا كانت. 569 00:26:09,190 --> 00:26:13,560 في الواقع، فقط لإيضاح هذه النقطة، إذا مضيتُ قدمًا وقمتُ بفتح محرر نصوص 570 00:26:13,560 --> 00:26:14,430 بسيط هنا-- 571 00:26:14,430 --> 00:26:17,370 ليس للبرمجة فعليًا، لكن فقط لكتابة شيء ما-- 572 00:26:17,370 --> 00:26:22,470 فيمكنني بالفعل القيام بشيء مثل هذا، إذا كانت x أقل من y. 573 00:26:22,470 --> 00:26:28,590 ثم أمضي قدمًا وأقوم بطباعة x أقل من y خط مائل عكسي n فاصلة منقوطة قوس 574 00:26:28,590 --> 00:26:31,110 متعرج else "وإلا" طباعة وهكذا-- 575 00:26:31,110 --> 00:26:33,840 غير قابلة للقراءة تمامًا في نهاية المطاف أو غير قابلة للدعم، 576 00:26:33,840 --> 00:26:35,610 خاصةً عندما تصبح التعليمة البرمجية معقدة. 577 00:26:35,610 --> 00:26:38,430 لكن المسافة لا تفرق كثيرًا مع الكمبيوتر، 578 00:26:38,430 --> 00:26:39,780 لكنها تفرق مع الشخص. 579 00:26:39,780 --> 00:26:42,000 وكما أشرتم إليه سابقًا في بعض اللغات، 580 00:26:42,000 --> 00:26:45,060 فمن المتعارف عليه بالفعل هو القيام بهذا، حيث تُبقون بالفعل 581 00:26:45,060 --> 00:26:47,100 القوس المتعرج على نفس السطر. 582 00:26:47,100 --> 00:26:50,290 وبالفعل، قد ترى الكتب المدرسية تقوم بذلك أيضًا. 583 00:26:50,290 --> 00:26:51,990 حتى بعض الناس سيفعلون هذا. 584 00:26:51,990 --> 00:26:54,030 هذه كلها قصة طويلة، ولكنها مسائل صغيرة كأسلوب. 585 00:26:54,030 --> 00:26:56,610 في دورة CS50، في الأسابيع الأولى لهذا الصف، 586 00:26:56,610 --> 00:26:59,250 سنؤكّد على أن يتبع الجميع نفس الأسلوب بحيث 587 00:26:59,250 --> 00:27:01,150 يكون لدينا بعض الأساس للمقارنة عليه. 588 00:27:01,150 --> 00:27:02,910 لكن في النهاية، هذا نوعًا ما هو الشيء 589 00:27:02,910 --> 00:27:05,530 الذي، يشبه الكتابة بلغتكم الإنجليزية أو أي لغة 590 00:27:05,530 --> 00:27:09,690 كثيرًا ما تكتبون بها، ولديكم ذوق في الأسلوب وذوق لغوي تجاههها. 591 00:27:09,690 --> 00:27:11,330 التعليمة البرمجية كذلك أيضًا. 592 00:27:11,330 --> 00:27:13,210 أي أسئلة أخرى؟ 593 00:27:13,210 --> 00:27:14,410 أجل. 594 00:27:14,410 --> 00:27:16,890 الجمهور: عندما تنشئ متغير العداد، 595 00:27:16,890 --> 00:27:19,620 فهل يجب أن تقول ما الذي يساويه، 596 00:27:19,620 --> 00:27:21,880 أم يمكنك فقط قول int counter section "قسم عداد int"؟ 597 00:27:21,880 --> 00:27:23,050 ديفيد: سؤال جيد حقًا. 598 00:27:23,050 --> 00:27:25,540 عندما تقوم بإظهار متغير، أو إنشاء متغير، 599 00:27:25,540 --> 00:27:28,210 فهل يجب عليك تعيينه مساويًا لشيء ما مباشرةً؟ 600 00:27:28,210 --> 00:27:29,130 إجابة قصيرة، لا. 601 00:27:29,130 --> 00:27:31,880 وسنرى أمثلة على ذلك قريبًا، حيث يمكنك بالفعل 602 00:27:31,880 --> 00:27:35,140 أن تقول أعطني متغيرًا اسمه counter "عداد"، لكن لا تقم فعليًا 603 00:27:35,140 --> 00:27:36,790 بتعيينه مساويًا لقيمة ما. 604 00:27:36,790 --> 00:27:39,040 سنعود لذلك بعد قليل. 605 00:27:39,040 --> 00:27:41,110 إذن ماذا لو أردنا إضافة هذا المنطق؟ 606 00:27:41,110 --> 00:27:44,410 بصراحة، في لغة سكراتش، يبدو الأمر في البداية جارفًا قليلاً. 607 00:27:44,410 --> 00:27:46,330 لكن هذا هو مجرد مفترق طرق ثلاثي الاتجاهات. 608 00:27:46,330 --> 00:27:51,130 إذا كانت x أقل من y، فقل ذلك، وإلا إذا كانت x أكبر من y، 609 00:27:51,130 --> 00:27:56,950 فقل ذلك، وإلا إذا كانت x تساوي y، ثم امضِ قدمًا وقل أنهما متساويان. 610 00:27:56,950 --> 00:28:00,590 وفي لغة C، يمكننا أيضًا القيام بهذه الترجمة بشكل مباشر نوعًا ما. 611 00:28:00,590 --> 00:28:02,980 في الواقع، الآن هذه الأسطر الثمانية الأولى من التعليمة البرمجية 612 00:28:02,980 --> 00:28:05,890 متطابقة مع ما قبلها عدا هذا السطر الأوسط 613 00:28:05,890 --> 00:28:08,380 هنا حيث أقوم بإضافة تعبير منطقي ثانٍ. 614 00:28:08,380 --> 00:28:10,390 هل x أكبر من y؟ 615 00:28:10,390 --> 00:28:13,720 ثم يصبح لديّ هذا الشرط الثالث، وإلا، إذا كانت x تساوي y. 616 00:28:13,720 --> 00:28:19,080 لكن يبدو أنه قد يكون هناك خطأ مطبعي، أو شيء غريب هنا. 617 00:28:19,080 --> 00:28:19,960 إذن هل يظهر أي شيء؟ 618 00:28:19,960 --> 00:28:22,400 أجل. 619 00:28:22,400 --> 00:28:26,230 لدي علامة يساوي مزدوجة، والتي ربما تكون مجرد خطأ مطبعي 620 00:28:26,230 --> 00:28:27,940 من جانبي، لكن من الواضح أنها ليست كذلك. 621 00:28:27,940 --> 00:28:29,710 إنها متعمدة. 622 00:28:29,710 --> 00:28:30,480 لكن لماذا؟ 623 00:28:30,480 --> 00:28:33,190 هذا يشبه أول مثال لدينا والخاص بسؤال أين تقوم لغة سكراتش بالفعل 624 00:28:33,190 --> 00:28:34,800 بالربط إلى لغة C بشكل مثالي؟ 625 00:28:34,800 --> 00:28:37,340 الجمهور: حسنًا، لأن علامة يساوي تشبه عملية تعيين. 626 00:28:37,340 --> 00:28:40,500 لذا فإن القيام بعدّ علامة يساوي يؤدي بفعالية لتعيينه في حالة يساوي-- 627 00:28:40,500 --> 00:28:41,130 ديفيد: بالضبط. 628 00:28:41,130 --> 00:28:45,750 لقد قررنا منذ لحظات كبشر-- أو في الواقع، منذ سنوات-- أن علامات يساوي 629 00:28:45,750 --> 00:28:48,450 ستكون بالفعل في سياق لغة C بمثابة عملية تعيين-- بنسخ 630 00:28:48,450 --> 00:28:50,820 القيمة من اليمين إلى القيمة في اليسار. 631 00:28:50,820 --> 00:28:52,950 ولذا فنحن نوعًا ما وضعنا أنفسنا في موقف صعب. 632 00:28:52,950 --> 00:28:54,960 نحن ما زلنا كبشر، وكمبرمجين، نرغب في أن نكون 633 00:28:54,960 --> 00:28:58,110 قادرين على التعبير عن فكرة التساوي والمقارنة. 634 00:28:58,110 --> 00:29:00,510 لكن إذا كنا بالفعل قد استخدمنا علامة يساوي لعملية تعيين، 635 00:29:00,510 --> 00:29:03,800 فسنحتاج إلى نمط آخر من الرموز لتمثيل التساوي. 636 00:29:03,800 --> 00:29:07,350 وكما هو واضح، فقد اختار البشر علامتي يساوي اثنتين بدلاً من ذلك-- 637 00:29:07,350 --> 00:29:09,090 لذا فهي مختلفة قليلاً عن لغة سكراتش. 638 00:29:09,090 --> 00:29:11,190 وسبب قيام لغة سكراتش بذلك بهذه الطريقة هو أنك لا ترغب حقيقةً 639 00:29:11,190 --> 00:29:13,140 في أن تضطر للدخول في تلك التعقيدات بالتأكيد 640 00:29:13,140 --> 00:29:15,030 عندما يكون عمر الجمهور المستهدف 8 سنوات فقط 641 00:29:15,030 --> 00:29:16,380 يتعلمون البرمجة لأول مرة. 642 00:29:16,380 --> 00:29:18,780 فهذا ليس مهمًا أو ليس مهمًا حقيقةً بالنسبة لنا. 643 00:29:18,780 --> 00:29:22,500 لكن بالنسبة لنا، سيكون هناك فرق منطقي 644 00:29:22,500 --> 00:29:25,340 لأن السلوك سيصبح خاطئًا إذا استخدمنا الشيء الخاطئ. 645 00:29:25,340 --> 00:29:29,970 إذا كان لدينا علامة يساوي واحدة، فيمكننا حرفيًا تغيير x لتكون مساوية لـ y 646 00:29:29,970 --> 00:29:31,960 بدلاً من مجرد مقارنتها. 647 00:29:31,960 --> 00:29:34,020 هل كانت هناك يد مرفوعة بسؤال؟ 648 00:29:34,020 --> 00:29:34,520 أجل. 649 00:29:34,520 --> 00:29:35,460 الجمهور: فقط سؤال سريع. 650 00:29:35,460 --> 00:29:37,810 إذن إذا أردت التعبير عن أكبر من أو يساوي، 651 00:29:37,810 --> 00:29:39,830 فهل تكتب أكبر من أو يساوي؟ 652 00:29:39,830 --> 00:29:40,710 ديفيد: سؤال جيد. 653 00:29:40,710 --> 00:29:43,950 إذا أردت التعبير عن أكبر من أو يساوي، فكيف يمكنك القيام بذلك؟ 654 00:29:43,950 --> 00:29:45,990 من الواضح أن هناك طرقًا للقيام بذلك. 655 00:29:45,990 --> 00:29:49,820 وإذا مضيتُ قدمًا وأعطيتُ فقط لنفسي مكانًا للرسم هنا للحظة، 656 00:29:49,820 --> 00:29:55,740 فيمكنك بالفعل إجراء تعيين أصغر من أو يساوي أو أكبر من أو يساوي. 657 00:29:55,740 --> 00:29:58,470 لا توجد طريقة على لوحة المفاتيح النموذجية لوضعهما فوق بعضهما البعض 658 00:29:58,470 --> 00:29:59,770 كما قد تذكرونها في الرياضيات. 659 00:29:59,770 --> 00:30:01,310 أنت فقط تضعهما بجانب بعضهما. 660 00:30:04,960 --> 00:30:05,800 حسنًا، على حسب. 661 00:30:05,800 --> 00:30:08,650 أريد علامة يساوي المزدوجة هنا لأنني 662 00:30:08,650 --> 00:30:14,770 أريد أن أتحقق بشكل صريح من هذه الحالة الثالثة وأقول إن x مساوية لـ y. 663 00:30:14,770 --> 00:30:15,820 إذن ذلك هو هدفي. 664 00:30:15,820 --> 00:30:17,620 لكن من الناحية المنطقية، هذا ليس ضروريًا. 665 00:30:17,620 --> 00:30:20,140 دعونا نصمم البرنامج بشكل أفضل قليلاً. 666 00:30:20,140 --> 00:30:24,520 كم عدد الحالات المتاحة هناك عند مقارنة رقمين صحيحين، x 667 00:30:24,520 --> 00:30:28,390 وy، من حيث أكبر من أو أقل من أو يساوي؟ 668 00:30:28,390 --> 00:30:32,250 حسنًا، أنا أجبتُ نوعًا ما عن السؤال للتوّ، أليس كذلك؟ 669 00:30:32,250 --> 00:30:32,830 ثلاثة. 670 00:30:32,830 --> 00:30:33,430 ممتاز! 671 00:30:33,430 --> 00:30:37,180 توجد ثلاث سيناريوهات-- x إما أنها أقل من أو أكبر من 672 00:30:37,180 --> 00:30:37,960 أو تساوي. 673 00:30:37,960 --> 00:30:41,050 ومن الصعب عليّ التفكير في سيناريو رابع. 674 00:30:41,050 --> 00:30:46,150 لذا هل أنا بحاجة لهذا القدر من التحديد؟ 675 00:30:46,150 --> 00:30:48,940 ما الذي يمكنني فعله لأحقق لنفسي أمثلية طفيفة، 676 00:30:48,940 --> 00:30:51,190 بتحسين التعليمة البرمجية نوعًا ما لأوفر لنفسي 677 00:30:51,190 --> 00:30:53,640 قليلاً من الوقت في كتابتها وربما حتى قليلاً من الوقت 678 00:30:53,640 --> 00:30:54,770 للكمبيوتر لتشغيلها؟ 679 00:30:54,770 --> 00:30:55,450 أجل. 680 00:30:55,450 --> 00:30:56,390 الجمهور: لستَ بحاجة للشرط الأخير. 681 00:30:56,390 --> 00:30:58,590 ديفيد: أجل، أنا لستُ بحاجة للشرط الأخير لأنه، 682 00:30:58,590 --> 00:31:02,650 إذا اتفقنا جميعًا من الناحية المنطقية أن x إما أنها أقل من y أو أكبر من y 683 00:31:02,650 --> 00:31:05,890 أو ربما تساوي y، حسنًا، فإذا كانت هناك فقط حالة ثالثة وأخيرة والتي 684 00:31:05,890 --> 00:31:07,270 يمكن أن تكون الحالة المسماة لديّ باسم else "وإلا". 685 00:31:07,270 --> 00:31:09,370 اجعل تلك الحالة فقط هي المسماة باسم الحالة الافتراضية. 686 00:31:09,370 --> 00:31:12,250 وفي الواقع، حتى بالرغم أن هذا هو ما سيطلق عليه أغلب الناس 687 00:31:12,250 --> 00:31:15,640 مسمى أمثلية مفرطة، فإنك توفر بعض الوقت للكمبيوتر. 688 00:31:15,640 --> 00:31:18,190 لأنك بافتراض أن x في الحقيقة تساوي y 689 00:31:18,190 --> 00:31:20,020 ولكل منهما قيمة العدد 1. 690 00:31:20,020 --> 00:31:25,150 فهل 1 أقل من 1 عندما يتم تنفيذ هذا السطر من التعليمة البرمجية؟ 691 00:31:25,150 --> 00:31:26,200 نعم أم لا؟ 692 00:31:26,200 --> 00:31:27,200 لا، بالطبع لا. 693 00:31:27,200 --> 00:31:28,330 1 ليس أقل من 1. 694 00:31:28,330 --> 00:31:29,830 لذلك لن يتم تنفيذ هذه التعليمة البرمجية. 695 00:31:29,830 --> 00:31:32,170 لكن يتم تقييم التعبير المنطقي، إذا جاز التعبير. 696 00:31:32,170 --> 00:31:33,550 يتم طرح السؤال. 697 00:31:33,550 --> 00:31:35,500 هل 1 أكبر من 1؟ 698 00:31:35,500 --> 00:31:39,190 لا، ولذلك لا يتم تنفيذ هذه التعليمة البرمجية، ولكن يتم تنفيذ هذا التعبير المنطقي. 699 00:31:39,190 --> 00:31:43,270 لذا فقد استغرقنا تحديدًا خطوة أخرى أو ثانية أو بأي طريقة يكون الكمبيوتر أسرع بها. 700 00:31:43,270 --> 00:31:45,520 هل 1 يساوي 1؟ 701 00:31:45,520 --> 00:31:46,100 أجل، إنها كذلك. 702 00:31:46,100 --> 00:31:47,470 لذا يقوم هذا بالطباعة بالفعل. 703 00:31:47,470 --> 00:31:49,770 لكن بالنسبة للنقطة الخاصة بك، فلا حاجة لطرح ذلك السؤال. 704 00:31:49,770 --> 00:31:52,730 وفي الواقع، لقد قمتَ بالزيادة بعامل 50% 705 00:31:52,730 --> 00:31:54,700 من عدد الأسئلة التي تطرحها. 706 00:31:54,700 --> 00:31:56,560 لذلك فقد أهدرتَ القليل من الوقت. 707 00:31:56,560 --> 00:31:58,450 الآن كملاحظة جانبية، فإن أجهزة Mac وأجهزة الكمبيوتر الشخصي والهواتف لدينا 708 00:31:58,450 --> 00:32:01,120 في هذه الأيام، أعني، مرة أخرى، أننا نقوم بتشغيلها بسرعة ترددية 709 00:32:01,120 --> 00:32:03,380 تقارب 1 غيغاهرتز، أي مليار من الأشياء كل ثانية. 710 00:32:03,380 --> 00:32:06,760 إذن من الناحية العملية، من يهتم إذا قمتَ بطرح هذا السؤال الثالث؟ 711 00:32:06,760 --> 00:32:11,020 وبصراحة، فإن جعلت تعليمتك البرمجية قابلة للقراءة بدرجة أكبر أو لزميلك في التدريس 712 00:32:11,020 --> 00:32:13,900 أو لزميل أو لصديق يعمل على البرنامج لأجلك، 713 00:32:13,900 --> 00:32:14,650 فذلك أمر رائع. 714 00:32:14,650 --> 00:32:17,960 وإذا كانت أكثر وضوحًا من التعليمة البرمجية الجارية، فاترك الأمر على هذا النحو. 715 00:32:17,960 --> 00:32:20,800 لكن هذه هي أنواع قرارات التصميم التي سنقوم بها الآن. 716 00:32:20,800 --> 00:32:25,060 ويمكن القول إن هذا الإصدار من لغة سكراتش وهذا الإصدار من التعليمة البرمجية بلُغة C 717 00:32:25,060 --> 00:32:27,280 تم تصميمهما فقط بشكل أفضل قليلاً 718 00:32:27,280 --> 00:32:32,530 بسبب عدم وجود داعٍ لكتابة تعليمة برمجية أكبر مما تحتاجه للتعبير عن الفكرة ذاتها. 719 00:32:32,530 --> 00:32:33,580 إذن ماذا عن هذا؟ 720 00:32:33,580 --> 00:32:35,140 كان هذا تكرارًا حلقيًا في لغة سكراتش. 721 00:32:35,140 --> 00:32:38,560 كان هذا بمثابة تكرار حلقي لا نهائي لأنها كانت تقول باستمرار hello world. 722 00:32:38,560 --> 00:32:41,270 الآن في لغة C، تتم ترجمة هذا على نحو أقل مباشرة قليلاً. 723 00:32:41,270 --> 00:32:43,870 من الواضح أن لغة c تستخدم الكلمة الأساسية while "بينما". 724 00:32:43,870 --> 00:32:47,650 لذا لا توجد كلمة أساسية forever "باستمرار" في لغة c، ولكن توجد الكلمة while "بينما". 725 00:32:47,650 --> 00:32:50,710 وبالطبع، سأستخدم الأقواس المتعرجة-- 726 00:32:50,710 --> 00:32:54,700 الأقواس المتعرجة، الأقواس المتعرجة لتشمل سطور التعليمة البرمجية التالية. 727 00:32:54,700 --> 00:32:57,070 سيكون سطر التعليمة البرمجية الذي أريدها بداخله هو مجرد سطر printf آخر. 728 00:32:57,070 --> 00:33:01,450 وذلك هو نفسه تمامًا كما كان من قبل، لكن هذا ليس كافيًا لمجرد قول while "بينما". 729 00:33:01,450 --> 00:33:06,130 من الواضح أن كلمة while "بينما" تريد منك طرح سؤال عليها كل مرة 730 00:33:06,130 --> 00:33:07,280 يقوم فيها التكرار الحلقي بالتنفيذ. 731 00:33:07,280 --> 00:33:08,870 وسيتحقق من ذلك السؤال. 732 00:33:08,870 --> 00:33:11,180 وإذا كانت الإجابة هي نعم، فسيقوم بتشغيل التكرار الحلقي. 733 00:33:11,180 --> 00:33:15,280 لكن إذا كانت إجابة السؤال المطروح في لغة C دائمًا هي لا أو خاطئة، 734 00:33:15,280 --> 00:33:17,280 فلن يقوم بتنفيذ التعليمة البرمجية وسيقوم فقط 735 00:33:17,280 --> 00:33:20,590 بالانتقال إلى أي من السطور الأخرى في التعليمة البرمجية لأسفل في الملف. 736 00:33:20,590 --> 00:33:24,370 لذا في لغة C، ستحتاج بالفعل إلى زوج من الأقواس بعد الكلمة الرئيسية while "بينما". 737 00:33:24,370 --> 00:33:26,620 وبعد ذلك ستحتاج إلى طرح سؤال. 738 00:33:26,620 --> 00:33:29,710 ستحتاج إلى طرح سؤال مثل، هل x أقل من y 739 00:33:29,710 --> 00:33:33,370 أو سؤال مثل هل x أكبر من y أو هل x تساوي y. 740 00:33:33,370 --> 00:33:36,370 لكن لا تنطبق أي من تلك الاحتمالات لأن الغرض الإجمالي 741 00:33:36,370 --> 00:33:39,910 لكتلة سكراتش هذه هو القيام حرفيًا بشيء ما باستمرار. 742 00:33:39,910 --> 00:33:44,510 إذن ما هو السؤال الذي يمكننا طرحه لتكون الإجابة دائمًا صحيحة؟ 743 00:33:47,180 --> 00:33:48,230 هل 1 يساوي 1؟ 744 00:33:48,230 --> 00:33:52,040 يمكننا استنباط سيناريو اعتباطي لكنه صحيح جدًا كمستوفٍ للناحية الرياضية. 745 00:33:52,040 --> 00:33:54,350 يمكننا فقط قول إن 1 يساوي يساوي 1. 746 00:33:54,350 --> 00:33:57,740 لكن من الواضح أنه يمكنك أيضًا أن تكون موجزًا لأنه يوجد في لغة C 747 00:33:57,740 --> 00:34:01,730 زوج من الكلمات الأساسية، إحداهما true "صحيحة"، والأخرى false "خاطئة". 748 00:34:01,730 --> 00:34:04,580 وأن الكلمة true "صحيحة" بحكم تعريفها تكون صحيحة دائمًا، 749 00:34:04,580 --> 00:34:06,710 وأن الكلمة false "خاطئة" بحكم تعريفها تكون خاطئة دائمًا. 750 00:34:06,710 --> 00:34:09,920 لذا فأنت لا تحتاج إلى استنباط فكرة ما اعتباطية لكنها صحيحة 751 00:34:09,920 --> 00:34:13,270 مفادها هل 1 يساوي يساوي 1 أو هل 50 تساوي تساوي 50. 752 00:34:13,270 --> 00:34:15,770 أنت لا تحتاج إلى مجرد التوصل إلى حل ما اعتباطي. 753 00:34:15,770 --> 00:34:20,960 يمكنك حرفيًا فقط قول صحيحة لأن الكلمة الأساسية true "صحيحة" لا تغير القيمة مطلقًا. 754 00:34:20,960 --> 00:34:22,880 لذلك حتى بالرغم من أن هذا يبدو غريبًا قليلاً، 755 00:34:22,880 --> 00:34:26,510 فإنها الطريقة التي تستحث بها شيئًا ما لكي يحدث باستمرار. 756 00:34:26,510 --> 00:34:29,750 لقد طرحتَ نفس السؤال مرة أخرى وتفترض أن السؤال دائمًا 757 00:34:29,750 --> 00:34:31,300 له نفس الإجابة true "صحيحة". 758 00:34:31,300 --> 00:34:34,560 هل هناك أي أسئلة حول هذا الجزء؟ 759 00:34:34,560 --> 00:34:37,000 نعم، في الخلف. 760 00:34:37,000 --> 00:34:38,130 الجمهور: هل المسافات مهمة؟ 761 00:34:38,130 --> 00:34:40,350 هل يمكنك حذف المسافة بين y و0؟ 762 00:34:40,350 --> 00:34:41,230 ديفيد: سؤال جيد. 763 00:34:41,230 --> 00:34:42,790 هل المسافات مهمة؟ 764 00:34:42,790 --> 00:34:44,980 إجابة مختصرة، لا، ليست في هذه الحالة. 765 00:34:44,980 --> 00:34:47,980 في الواقع يمكنك حذف جميع المسافات هنا 766 00:34:47,980 --> 00:34:49,690 عدا المسافة الموجودة في العبارة باللغة الإنجليزية، 767 00:34:49,690 --> 00:34:51,940 وستظل من الناحية الوظيفية صحيحة. 768 00:34:51,940 --> 00:34:53,950 يمكنك حتى إضافة مسافات في أي مكان تريده. 769 00:34:53,950 --> 00:34:56,410 يمكنك جعل هذه أطول بالضغط على مفتاح Enter لعدة مرات، 770 00:34:56,410 --> 00:34:58,570 وعلى مفتاح tab لعدة مرات، وعلى مسافات حول الكلمة true "صحيحة". 771 00:34:58,570 --> 00:35:02,320 جميع الأمثلة التي سأعرضها هنا اليوم والتي ستشاهدونها في الأسابيع المقبلة 772 00:35:02,320 --> 00:35:04,920 هي أفضل طريقة للقيام بالأشياء لأنها أكثر قابلية للقراءة. 773 00:35:04,920 --> 00:35:06,610 لكن مرة أخرى، كلما أصبحت أكثر اعتيادًا على التعليمة البرمجية 774 00:35:06,610 --> 00:35:08,190 أو إذا تعرضتَ لتجربة ما سابقة، 775 00:35:08,190 --> 00:35:09,760 فقد تكون لديك بالفعل آراؤك الخاصة. 776 00:35:09,760 --> 00:35:11,680 وبصراحة، فهذه مجرد مناقشة عقائدية 777 00:35:11,680 --> 00:35:14,230 بين المبرمجين، وهي الطريقة الصحيحة لكتابة التعليمة البرمجية الخاصة بك. 778 00:35:14,230 --> 00:35:14,810 وهذا جيد. 779 00:35:14,810 --> 00:35:18,010 فبمجرد اعتيادك، طالما أنك متسّق في عملك فهذا يعتبر أهم شيء. 780 00:35:18,010 --> 00:35:20,650 لستَ بحاجة للتمسك برأي شخص أو بآخر. 781 00:35:20,650 --> 00:35:22,380 إذن كيف تعمل هذه التعليمة البرمجية منطقيًا؟ 782 00:35:22,380 --> 00:35:25,120 حسنًا، أول شيء سيقوم به جهاز الكمبيوتر أو جهاز Mac أو الكمبيوتر الشخصي لديك أو هاتفك 783 00:35:25,120 --> 00:35:27,940 أو أي شيء، سيقوم بطرح السؤال. 784 00:35:27,940 --> 00:35:28,510 حسنًا، صحيح. 785 00:35:28,510 --> 00:35:29,810 حسنًا، تكون true "صحيحة" دائمًا صحيحة. 786 00:35:29,810 --> 00:35:32,020 إذن سيشرع في تنفيذ سطر التعليمة البرمجية. 787 00:35:32,020 --> 00:35:35,050 لكن بعد قيامه بهذا، لأن ذلك هو مجمل التعليمة البرمجية الموجودة 788 00:35:35,050 --> 00:35:37,300 بين الأقواس المتعرجة، ويمكن أن تكون لدينا مزيد من الأسطر. 789 00:35:37,300 --> 00:35:39,280 هذه مجرد برامج قصيرة. 790 00:35:39,280 --> 00:35:42,190 سيقوم الكمبيوتر بالتحقق، حسنًا، هل true "صحيحة" ما تزال صحيحة. 791 00:35:42,190 --> 00:35:42,900 أجل. 792 00:35:42,900 --> 00:35:44,400 لذا سيقوم بتنفيذها مرة أخرى. 793 00:35:44,400 --> 00:35:45,610 ثم سيطرح السؤال مرة أخرى. 794 00:35:45,610 --> 00:35:46,750 هل true "صحيحة" ما تزال صحيحة؟ 795 00:35:46,750 --> 00:35:48,880 نعم، لذا سيقوم بتنفيذ التعليمة البرمجية مرة أخرى، 796 00:35:48,880 --> 00:35:52,800 وسيكرر هذا حرفيًا باستمرار. 797 00:35:52,800 --> 00:35:55,100 لكن ماذا لو كنت لا تريد تكرار أي شيء باستمرار؟ 798 00:35:55,100 --> 00:35:56,930 ماذا لو كنت تريد فقط تكرارها 50 مرة؟ 799 00:35:56,930 --> 00:35:59,160 لن تدعك لغة سكراتش تفكر بعناء بشأن هذا. 800 00:35:59,160 --> 00:36:03,160 فالأشخاص يفهمون فقط كيفية الاستمرار في متابعة عدّ الأرقام 1، 2، 3، 4، 5، والاستمرار 801 00:36:03,160 --> 00:36:04,660 بطول الطريق وصولاً إلى 50 ثم يتوقفون. 802 00:36:04,660 --> 00:36:05,170 ذلك أمر لطيف. 803 00:36:05,170 --> 00:36:06,910 إنه يسهّل استخدام الكتلة. 804 00:36:06,910 --> 00:36:11,350 لغة C وكثير من اللغات ليست سهلة الاستخدام نوعًا ما. 805 00:36:11,350 --> 00:36:14,050 ستشاهد لاحقًا في الفصل الدراسي أن اللغات الأحدث هي 806 00:36:14,050 --> 00:36:16,090 أقرب قليلاً لما تقدمه لغة سكراتش. 807 00:36:16,090 --> 00:36:18,430 ولكن في لغة C، نحتاج أن نكون أكثر وضوحًا، لكن هذه 808 00:36:18,430 --> 00:36:21,090 فرصة لاستخدام بعض من الكتل البنائية الأكثر بدائية. 809 00:36:21,090 --> 00:36:27,160 في لغة C، سيكون مكافئ التكرار هو مجرد اقتراح فحسب، 810 00:36:27,160 --> 00:36:28,090 لأنه محدد إلى الآن. 811 00:36:28,090 --> 00:36:30,910 وبعد ذلك، تمامًا كما كان من قبل، إذا أردنا القيام بشيء ما 812 00:36:30,910 --> 00:36:32,890 مرارًا وتكرارًا ضمن هذا التكرار الحلقي، فسوف 813 00:36:32,890 --> 00:36:36,280 نستخدم الأقواس المتعرجة، مماثلة للكتلة الصغيرة البرتقالية هناك. 814 00:36:36,280 --> 00:36:37,580 وبعد ذلك ماذا سأفعل؟ 815 00:36:37,580 --> 00:36:42,160 سأقوم بهذا كل مرة، أملاً في الوصول إلى 50 مرة، لطباعة عبارة hello world. 816 00:36:42,160 --> 00:36:45,070 لذلك فأنا الآن أحتاج فقط إلى فهم كيفية التعبير 817 00:36:45,070 --> 00:36:47,890 عن عدد المرات وبالتحديد 50. 818 00:36:47,890 --> 00:36:50,740 لذا من الواضح في لغة C-- استخدام الأقواس مرة أخرى-- 819 00:36:50,740 --> 00:36:53,890 وهذه ستصبح سمة شائعة إلى حد ما لكثير من التعليمات البرمجية 820 00:36:53,890 --> 00:36:54,770 التي نكتبها. 821 00:36:54,770 --> 00:36:56,710 وبعد ذلك ستحتاجون للقيام بثلاثة أشياء. 822 00:36:56,710 --> 00:36:59,710 سيكون الآن العبء علينا نحن المبرمجين 823 00:36:59,710 --> 00:37:04,960 لتعقب عدد المرات التي نريد فيها تنفيذ هذه التعليمة البرمجية إلى عدد المرات 824 00:37:04,960 --> 00:37:08,350 التي قمنا فيها بالفعل بتنفيذ هذه التعليمة البرمجية ثم التأكد باستمرار 825 00:37:08,350 --> 00:37:09,910 من عدم تجاوز إحدى التعليمتين البرمجيتين للأخرى. 826 00:37:09,910 --> 00:37:12,040 لذا سنتوقف بمجرد وصولنا إلى 50. 827 00:37:12,040 --> 00:37:15,940 إذن ما هو البناء الرئيسي الذي نستخدمه لتعقب أي شيء 828 00:37:15,940 --> 00:37:18,050 في برنامج ما؟ 829 00:37:18,050 --> 00:37:20,260 العداد، والذي كان مثالاً للمتغير. 830 00:37:20,260 --> 00:37:22,030 لذا نحن نحتاج فقط لاستخدام متغير. 831 00:37:22,030 --> 00:37:24,820 الآن، بالفعل سيصبح داخل الأقواس هذه المرة. 832 00:37:24,820 --> 00:37:28,620 لذا فهو ليس بمفرده كما كان منذ وقت قليل من قبل، لكن بناء الجملة هو نفسه. 833 00:37:28,620 --> 00:37:32,100 يمكنني تسميته باسم counter "عداد"، لكن في الواقع أن العُرف في البرمجة 834 00:37:32,100 --> 00:37:35,200 هو مجرد استخدام متغيرات أقصر عندما نقوم بشيء ممل. 835 00:37:35,200 --> 00:37:36,690 وإذا كان كل ما تفعله هو التكرار الحلقي-- 836 00:37:36,690 --> 00:37:40,590 فإن حرف i الذي يرمز إلى عدد صحيح، يعتبر نوعًا ما اسم متغير يقصده العديد من المبرمجين 837 00:37:40,590 --> 00:37:43,740 بدلاً من اسم counter "العداد" الأكثر إطنابًا ولكنه صحيح أو أيًا ما كان الاسم. 838 00:37:43,740 --> 00:37:47,580 إذن فهذا يقول، مهلاً، يا كمبيوتر، أعطني متغيرًا يسمى i. 839 00:37:47,580 --> 00:37:52,530 دعوني أقوم بتخزين الأعداد الصحيحة أو ints فيه وضبط القيمة الأولية على 0. 840 00:37:52,530 --> 00:37:53,250 لماذا؟ 841 00:37:53,250 --> 00:37:56,790 حسنًا، ربما يبدأ كل شخص تقريبًا في هذه الغرفة بالعد من 1. 842 00:37:56,790 --> 00:37:59,580 تميل فقط أجهزة الكمبيوتر إلى بدء العد من 0. 843 00:37:59,580 --> 00:38:00,080 لكن لماذا؟ 844 00:38:00,080 --> 00:38:02,120 ما هو السبب المنطقي لبدء العد من 0 845 00:38:02,120 --> 00:38:03,250 ربما على أساس الأسبوع الماضي؟ 846 00:38:07,070 --> 00:38:08,490 لماذا يبدو نوعًا ما منطقيًا؟ 847 00:38:08,490 --> 00:38:09,710 أجل، ما رأيكم؟ 848 00:38:09,710 --> 00:38:12,260 الجمهور: حسنًا، لأنها واحدات وأصفار، وأنه نظام ثنائي. 849 00:38:12,260 --> 00:38:15,080 ديفيد: نعم، إنها فقط واحدات وأصفار، وما هو 850 00:38:15,080 --> 00:38:16,880 أصغر عدد، باستثناء القيم السالبة، 851 00:38:16,880 --> 00:38:18,290 الذي يمكن تمثيله في النظام الثنائي؟ 852 00:38:18,290 --> 00:38:21,050 حسنًا، إنه تحديدًا 0، 0، 0، مجموعة أصفار. 853 00:38:21,050 --> 00:38:23,630 فلماذا ستهدر ذلك التمثيل، 854 00:38:23,630 --> 00:38:24,680 ذلك التبديل لوحدات البت؟ 855 00:38:24,680 --> 00:38:27,380 دعونا فقط نبدأ بالعد من 0 ثم نضيف إلى ذلك. 856 00:38:27,380 --> 00:38:31,670 إذن يمكنكم بدء العد من 1 في لغة C، لكن العُرف في معظم اللغات 857 00:38:31,670 --> 00:38:32,330 هو العد من 0. 858 00:38:32,330 --> 00:38:33,920 إذن سنبدأ بدايةً صحيحة كذلك. 859 00:38:33,920 --> 00:38:38,400 وقد تذكرون حتى أنني في المثال الذي قمنا به PBJ، اختصار زبدة الفول السوداني والمربى-- 860 00:38:38,400 --> 00:38:40,850 وليس للتعليمة البرمجية PDJ-- 861 00:38:40,850 --> 00:38:43,880 اختصار الكود الزائف للهاتف، قمتُ بالفعل عن عمد ببدء 862 00:38:43,880 --> 00:38:47,780 ترقيم السطور من 0 إلى 1 إلى 2 لنفس ذلك الحدس. 863 00:38:47,780 --> 00:38:51,320 لذلك فإليكم هنا الطريقة التي ستقولون بها بعد ذلك للكمبيوتر check "تحقق"، إذا أردتم، 864 00:38:51,320 --> 00:38:52,480 ما إذا كان i أقل من 50. 865 00:38:52,480 --> 00:38:54,730 الآن، مبدئيًا من الواضح أنه سيكون أقل من 50 866 00:38:54,730 --> 00:38:57,050 لأن الصفر أقل من 50 ولكن سيتم التحقق من نفس تلك الحالة 867 00:38:57,050 --> 00:39:00,980 مرارًا وتكرارًا أثناء تنفيذ هذا التكرار الحلقي. 868 00:39:00,980 --> 00:39:06,370 ثم تذكروا مما سبق، أننا يمكننا فقط كتابة زائد زائد متغير لإضافة 1 إليه. 869 00:39:06,370 --> 00:39:08,330 يمكننا القيام بهذا بإسهاب أكبر. 870 00:39:08,330 --> 00:39:11,150 يمكننا قول أن i يساوي 1، لكنها مجرد 871 00:39:11,150 --> 00:39:13,760 طريقة أكثر تقليدية لكتابة i زائد زائد فقط 872 00:39:13,760 --> 00:39:15,590 لقول الشيء نفسه بإيجاز أكثر. 873 00:39:15,590 --> 00:39:17,020 إذن ما الذي يحدث بعد ذلك من الناحية المنطقية؟ 874 00:39:17,020 --> 00:39:18,230 تلك هي التعليمة البرمجية التي كتبتُها. 875 00:39:18,230 --> 00:39:19,740 ما الذي يفعله الكمبيوتر باستخدامها؟ 876 00:39:19,740 --> 00:39:23,940 حسنًا، إنه يقوم بإعادة i لوضع البداية إلى 0 وإعداده لتخزين الأعداد الصحيحة فيه. 877 00:39:23,940 --> 00:39:27,620 إنه يتحقق من الشرط فقط في حال قمت بإعادته لوضع البداية إلى قيمة أكبر مما ينبغي. 878 00:39:27,620 --> 00:39:29,570 ربما لا تريد تنفيذ التكرار الحلقي على الإطلاق. 879 00:39:29,570 --> 00:39:31,890 لكن من الواضح أن 0 أقل من 50. 880 00:39:31,890 --> 00:39:34,250 إذن يتم تنفيذ هذا السطر في التعليمة البرمجية. 881 00:39:34,250 --> 00:39:37,770 خمّن ما سيحدث بعد ذلك. 882 00:39:37,770 --> 00:39:39,640 أجل، ربما تريد أن تكتب i زائد زائد 883 00:39:39,640 --> 00:39:41,970 لأنك انتهيت من تنفيذ جميع سطور التعليمة البرمجية 884 00:39:41,970 --> 00:39:44,410 الموجودة بين الأقواس المتعرجة، حتى بالرغم من وجود واحدة فقط. 885 00:39:44,410 --> 00:39:45,910 لذا دعونا نمضي قدمًا ونُزيد i. 886 00:39:45,910 --> 00:39:47,690 إذن i يساوي الآن 1. 887 00:39:47,690 --> 00:39:49,660 دعونا الآن نتأكد-- هل 1 أقل من 50؟ 888 00:39:49,660 --> 00:39:50,620 بالتأكيد. 889 00:39:50,620 --> 00:39:51,890 قم بتنفيذ التعليمة البرمجية. 890 00:39:51,890 --> 00:39:54,670 i زائد زائد-- يساوي 2 أقل من 50. 891 00:39:54,670 --> 00:39:59,890 بالطبع قم بتنفيذ التعليمة البرمجية. i زائد زائد-- يساوي 3 أقل من 50، بالتأكيد. 892 00:39:59,890 --> 00:40:03,790 الآن امضِ قدمًا وقم بتنفيذ التعليمة البرمجية، مرارًا وتكرارًا. 893 00:40:03,790 --> 00:40:10,120 وعند نقطة ما، سنصل حتى i يساوي 49، وهل 49 أقل من 50؟ 894 00:40:10,120 --> 00:40:10,690 بالتأكيد. 895 00:40:10,690 --> 00:40:13,000 إذن نقوم بطباعة عبارة hello world. 896 00:40:13,000 --> 00:40:18,070 ثم يستمر مفعول i زائد زائد، ثم ها هو ذا، 50 أقل من 50. 897 00:40:18,070 --> 00:40:18,670 لا. 898 00:40:18,670 --> 00:40:20,980 إذن انتظر هذا يبدو خطأً منطقيًا، أليس كذلك؟ 899 00:40:20,980 --> 00:40:24,940 هل يجب أن أتحقق ما إذا كان i أقل من أو يساوي 50؟ 900 00:40:24,940 --> 00:40:27,130 أجل، لأنني لو بدأتُ من 0، فإنني سأكون بالفعل 901 00:40:27,130 --> 00:40:28,690 قد استهلكتُ دورةً إضافية واحدة. 902 00:40:28,690 --> 00:40:34,600 إذن يمكنني العد من 0 حتى 49 وهو ما يبدو أنه يؤدي الغرض أو من 1 حتى 50، 903 00:40:34,600 --> 00:40:36,820 لكن المتعارف عليه في البرمجة بصدق 904 00:40:36,820 --> 00:40:38,830 عادةً ما تبدأ بالعد من قيمة ما 905 00:40:38,830 --> 00:40:43,870 ثم العد تصاعديًا وصولاً إلى قيمة ما ولكن ليس مرورًا بها لذلك السبب فحسب. 906 00:40:43,870 --> 00:40:46,960 لكن من الناحية المنطقية، يمكنك تنفيذ هذه التعليمة بنصف دستة من الطرق المختلفة على 907 00:40:46,960 --> 00:40:48,060 الأرجح. 908 00:40:48,060 --> 00:40:50,020 دعونا ننظر إلى مثال واحد أخير والذي سمح لنا 909 00:40:50,020 --> 00:40:52,540 بجعل المستخدم يقوم بالإدخال في لغة سكراتش. 910 00:40:52,540 --> 00:40:55,090 تذكروا أننا استخدمنا هذه الكتلة للحصول بالفعل على 911 00:40:55,090 --> 00:40:57,640 اسم شخص ما في المحاضرة، وأننا أيضًا 912 00:40:57,640 --> 00:41:01,450 استخدمناه في الرسم المتحرك باستخدام منزل خبز الزنجبيل، للحصول على نعم أو لا-- 913 00:41:01,450 --> 00:41:03,620 هل تريد الكَب كيك أم التفاحة أم ما شابه. 914 00:41:03,620 --> 00:41:05,890 إذن هذا هو مثال لدالة في لغة سكراتش 915 00:41:05,890 --> 00:41:09,670 تأخذ بالفعل مُدخلاً مثل جملة ما اسمك، 916 00:41:09,670 --> 00:41:12,640 لكنها أيضًا ترجع بقيمة، والتي كانت في هذه الحالة 917 00:41:12,640 --> 00:41:15,700 مضمنة كتعليمة برمجية ثابتة في لغة سكراتش بواسطة MIT "معهد ماساشوستس للتكنولوجيا" ليُطلق عليها اسم answer "إجابة". 918 00:41:15,700 --> 00:41:17,740 لذلك فإنه يبدو كمتغير خاص يسمى answer "إجابة"، 919 00:41:17,740 --> 00:41:21,110 ولكن على نحو فعال، تجري إعادة تسليمه للمستخدم. 920 00:41:21,110 --> 00:41:23,080 إذن كيف يمكننا التفكير في هذا؟ 921 00:41:23,080 --> 00:41:27,340 في لغة C يتضح أنه يمكنك التعبير عن هذا السطر من التعليمة البرمجية بشكل أكثر إطنابًا نوعًا ما 922 00:41:27,340 --> 00:41:30,940 عن ذي قبل ولكن باستخدام دالّة جديدة تسمّى get string-- 923 00:41:30,940 --> 00:41:33,340 لذلك فاسم الدالّة هو "get_string". 924 00:41:33,340 --> 00:41:36,340 الشرطة السفلية متعارف عليها في لغة C. إذا كنت ترغب في وضع مسافة لديك، 925 00:41:36,340 --> 00:41:38,340 فلا يمكن أن تضع مسافات لديك في أسماء الدوالّ. 926 00:41:38,340 --> 00:41:42,460 لذا بدأ الأشخاص بالفعل في استخدام الشرطة السفلية كما تقوم أنت بذلك في وسائل التواصل الاجتماعي لديك 927 00:41:42,460 --> 00:41:45,280 لأسماء المستخدمين وما شابه-- هو نفس المتعارف عليه هناك كذلك. 928 00:41:45,280 --> 00:41:48,700 إليكم الجملة التي أريد عرضها، وأنا 929 00:41:48,700 --> 00:41:51,010 سأبدأ تسمية هذه رسميًا بدرجة أكبر باسم string "سلسلة". 930 00:41:51,010 --> 00:41:54,370 السلسلة في لغة البرمجة هي مجرد تسلسل من الأحرف. 931 00:41:54,370 --> 00:41:57,110 إنها كلمة، إنها عبارة، إنها حرف، إنها فقرة. 932 00:41:57,110 --> 00:41:57,820 هذه هي السلسلة. 933 00:41:57,820 --> 00:42:00,040 أي شيء فيما بين علامتي الاقتباس يسمى سلسلة في لغة C، 934 00:42:00,040 --> 00:42:03,520 و/n "الخط المائل العكسي وحرف n"، هو فقط نهاية السطر كما ذُكِر من قبل. 935 00:42:03,520 --> 00:42:05,620 لا تزال لدينا بالفعل الفاصلة المنقوطة، لكن هذا 936 00:42:05,620 --> 00:42:09,250 ليس بمثابة ترجمة حرفية تمامًا لما سيحدث بعد 937 00:42:09,250 --> 00:42:13,520 قليل لأنني أيضًا أحتاج الآن إلى القيام بشيء ما يحمل الإجابة. 938 00:42:13,520 --> 00:42:17,320 لذلك إذا كانت get_string عبارة عن دالّة تحصل على الإدخال من المستخدم، 939 00:42:17,320 --> 00:42:21,490 عن طريق لوحة المفاتيح لديه، تمامًا مثل الكتلة الزرقاء في لغة سكراتش، ففي لغة C 940 00:42:21,490 --> 00:42:23,530 نحتاج لأن نكون أكثر وضوحًا نوعًا ما بشأن المكان 941 00:42:23,530 --> 00:42:29,020 الذي نضع فيه قيمة الإرجاع من تلك الدالّة، أي ما تقوم بتسليمه. 942 00:42:29,020 --> 00:42:31,450 وبذلك يمكنني تخزينه في متغير يسمى answer "إجابة". 943 00:42:31,450 --> 00:42:33,220 ويمكنني تسميته بأي اسم أريده. 944 00:42:33,220 --> 00:42:36,480 لكن من أجل التناسق مع لغة سكراتش، فدعونا نسميه answer "إجابة". 945 00:42:36,480 --> 00:42:41,210 لكن تذكروا ما يجب علينا القيام به في لغة C في أي وقت نقوم فيه بإنشاء متغير. 946 00:42:41,210 --> 00:42:42,340 يجب أن نكون أكثر دقة. 947 00:42:42,340 --> 00:42:42,940 أجل. 948 00:42:42,940 --> 00:42:44,570 الجمهور: تعريف فئته كسلسلة. 949 00:42:44,570 --> 00:42:46,850 ديفيد: يجب أن نعرّفها-- دعوني أطلق عليها اسم type "كتابة" أو class "فئة"، 950 00:42:46,850 --> 00:42:48,370 إذا كنتَ قد أخذت فئة سابقة. 951 00:42:48,370 --> 00:42:51,680 إنه type "كتابة" ولن يكون باسم int "عدد صحيح" لأنه من المحتمل أن تكون الكلمات 952 00:42:51,680 --> 00:42:52,910 التي تجري كتابتها ليست أرقامًا. 953 00:42:52,910 --> 00:42:55,410 وستكون في هذا الوقت ما قد سميتُه للتو باسم string "سلسلة". 954 00:42:55,410 --> 00:42:58,520 وهكذا، بالفعل، سنعلن المتغير الموجود على اليسار 955 00:42:58,520 --> 00:43:01,400 بقول give me a string "أعطني سلسلة"، وسمّها باسم answer "إجابة"، 956 00:43:01,400 --> 00:43:04,030 وخصصّ لها كل ما يوجد على اليمين. 957 00:43:04,030 --> 00:43:05,120 حسنًا، ما الموجود على اليمين؟ 958 00:43:05,120 --> 00:43:07,040 ما الموجود على اليمين هي كل ما ترجع به هذه الدالّة 959 00:43:07,040 --> 00:43:12,660 get string ويتم تخزينه من اليمين إلى اليسار. 960 00:43:12,660 --> 00:43:16,160 إذن كيف يمكنني الآن قول اسم هذا الشخص؟ 961 00:43:16,160 --> 00:43:19,430 حسنًا، في لغة سكراتش، أنا فقط أقول، ثم أسحب متغير answer "الإجابة" وأسقطه، 962 00:43:19,430 --> 00:43:20,480 وينتهي الأمر. 963 00:43:20,480 --> 00:43:23,180 في لغة C، ما هي الدالّة التي يمكننا بها أن نقول شيئًا ما، ولو أنّي، 964 00:43:23,180 --> 00:43:24,270 على الشاشة؟ 965 00:43:24,270 --> 00:43:27,230 إذن printf، لطباعة سلسلة منسقة، حتى لو أننا لم نرَ 966 00:43:27,230 --> 00:43:29,000 بالفعل أي تنسيق بعد حتى الآن. 967 00:43:29,000 --> 00:43:33,200 يتضح في لغة C، أنك يتعين عليك بالفعل ذكر 968 00:43:33,200 --> 00:43:39,260 printf إذا كنت لا تمر في سلسلة أو جملة مضمّنة في تعليمة برمجية ثابتة، 969 00:43:39,260 --> 00:43:44,300 فعليك المرور إلى الدالّة printf والتي تسمى format code "تعليمة برمجية للتنسيق" أو format string "سلسلة تنسيق"-- 970 00:43:44,300 --> 00:43:46,550 وهذا هو أول إدخال إلى printf. 971 00:43:46,550 --> 00:43:49,110 يبدو واضحًا الآن أن printf يتمتع بشيئين. 972 00:43:49,110 --> 00:43:51,080 الأول هو هذا الشيء قبل الفاصلة. 973 00:43:51,080 --> 00:43:52,880 والثاني هو الشيء الموجود بعد الفاصلة. 974 00:43:52,880 --> 00:43:56,240 ولم نرَ هذا حتى الآن في لغة C. لذا يُقال لـ printf، 975 00:43:56,240 --> 00:44:00,340 امضِ قُدمًا واطبع سلسلةً تشبه هذا. 976 00:44:00,340 --> 00:44:04,490 النسبة المئوية S هي عنصر نائب، وتشير S إلى سلسلة. 977 00:44:04,490 --> 00:44:06,290 وهذا العنصر النائب يقول حرفيًا، 978 00:44:06,290 --> 00:44:11,900 يا printf، سأقدم لك سلسلة لإدخالها لهذا المدخل الأول. 979 00:44:11,900 --> 00:44:12,920 ما هي تلك السلسلة؟ 980 00:44:12,920 --> 00:44:14,720 حرفيًا، متغير الإجابة. 981 00:44:14,720 --> 00:44:16,850 يبدو الأمر الآن كما لو أننا نقفز من خلال أطواق موجودة هنا. 982 00:44:16,850 --> 00:44:19,720 كان من الجيد لو قلنا فقط printf، قم بفتح الأقواس، وإجابة، 983 00:44:19,720 --> 00:44:22,170 وأغلق الأقواس، فاصلة منقوطة، وانتهِ من ذلك. 984 00:44:22,170 --> 00:44:23,920 هذه ليست الطريقة التي يعمل بها printf. 985 00:44:23,920 --> 00:44:25,880 في الإصدارات الأقدم، كان يمكنك القيام بشيء ما 986 00:44:25,880 --> 00:44:27,080 أكثر بساطة من هذا القبيل. 987 00:44:27,080 --> 00:44:29,490 ولكن صراحة، نحن لا نقوم عادة بطباعة 988 00:44:29,490 --> 00:44:30,700 ما يكتبه الإنسان فقط. 989 00:44:30,700 --> 00:44:33,120 على كلٍ، هذا مثال غبي نوعًا ما في هذه اللحظة. 990 00:44:33,120 --> 00:44:34,070 أنا أكتب كلمة. 991 00:44:34,070 --> 00:44:35,390 وأنت تقولها على الشاشة فقط. 992 00:44:35,390 --> 00:44:37,470 لقد قررنا في سكراتش بالفعل هذا النوع من السخافة. 993 00:44:37,470 --> 00:44:40,310 سيكون من الجيد على الأقل جعل البرنامج، لا يقول فقط 994 00:44:40,310 --> 00:44:45,140 ديفيد أو أيًا كان الاسم-- ولكن ما الذي قمنا به المرة الماضية؟ 995 00:44:45,140 --> 00:44:47,160 مثل مرحبًا فاصلة ديفيد. 996 00:44:47,160 --> 00:44:50,780 ولكن هذا من شأنه أن يقدم لنا تلك القدرة. 997 00:44:50,780 --> 00:44:54,710 الآن أنا حرفيًا أقوم فقط بطباعة اسم إنسان في لغة C، 998 00:44:54,710 --> 00:44:58,190 ولكن دعوني أغيّر هذا قليلاً فقط كما فعلنا في سكراتش. 999 00:44:58,190 --> 00:45:03,530 أذكر أننا في لغة C استخدمنا هذه الكتلة الخضراء للجمع حيث قمت حرفيًا 1000 00:45:03,530 --> 00:45:05,310 قبل ذلك بجمع وسيطتين. 1001 00:45:05,310 --> 00:45:07,920 الأولى كانت مرحبًا فاصلة مسافة. 1002 00:45:07,920 --> 00:45:10,340 والثانية كانت إجابة، وهذا أمر متسلسل. 1003 00:45:10,340 --> 00:45:12,910 يدمج هذا كلا السلسلتين جنبًا إلى جنب. 1004 00:45:12,910 --> 00:45:16,500 حسنًا، في لغة C، وبفضل printf، يمكننا القيام بالشيء نفسه. 1005 00:45:16,500 --> 00:45:18,290 إنها فقط صيغة مختلفة. 1006 00:45:18,290 --> 00:45:23,690 ويستمر Printf في الحصول على وسيطة واحدة أولاً، وهي، السلسلة التي ترغب في تنسيقها، 1007 00:45:23,690 --> 00:45:25,490 هذا مايشير إليه حرف F في printf. 1008 00:45:25,490 --> 00:45:31,430 ولكن هذه المرة سأقوم حرفيًا بقول م-ر-ح-بً-ا فاصلة مسافة النسبة المئوية S 1009 00:45:31,430 --> 00:45:35,280 الذي يشير إلى سلسلة، ثم أعطِ printf وسيطة ثانية، 1010 00:45:35,280 --> 00:45:39,020 والتي تنص تعليماتها على المضي قدمًا وإدخال هذا المتغير أيًا كان 1011 00:45:39,020 --> 00:45:42,940 إلى هذا العنصر النائب أيًا كان. 1012 00:45:42,940 --> 00:45:46,150 لقد جمعنا الآن السلسلتين بشكل فعّال وبالتالي 1013 00:45:46,150 --> 00:45:51,170 أنشأنا أول سلسلة منسقة. 1014 00:45:51,170 --> 00:45:54,250 حسنًا، أي أسئلة بشأن هذا؟ 1015 00:45:54,250 --> 00:45:55,170 نعم. 1016 00:45:55,170 --> 00:45:58,620 الجمهور: ماذا لو أردت قول أي شيء إضافي بعد ذلك؟ 1017 00:45:58,620 --> 00:46:01,070 ديفيد: ماذا لو أردت قول أي شيء إضافي بعد ذلك؟ 1018 00:46:01,070 --> 00:46:02,760 يمكنك بالتأكيد الاستمرار في التسلسل المنطقي. 1019 00:46:02,760 --> 00:46:05,570 لا يتوجب عليك إنهاء هذا التعبير المقتبس 1020 00:46:05,570 --> 00:46:09,020 بالنسبة المئوية S. يمكنك قول، مرحبًا، فاصلة النسبة المئوية S 1021 00:46:09,020 --> 00:46:10,940 فاصلة، سعيد بلقائك. 1022 00:46:10,940 --> 00:46:13,190 ثم الشيء الذي سيقوم به printf هو فقط 1023 00:46:13,190 --> 00:46:17,480 استبدال المتغير المسمى إجابة حيث توجد النسبة المئوية S. 1024 00:46:17,480 --> 00:46:21,320 وإذا كنت تريد تقديم نسبتين مئويتين S، يمكنك فقط إضافة فاصلة أخرى هنا 1025 00:46:21,320 --> 00:46:23,990 وتمرير متغير آخر ومتغير ثالث وأكثر من ذلك، 1026 00:46:23,990 --> 00:46:27,230 وبالتالي تنسيق السلسلة بصورة أكثر تفصيلاً. 1027 00:46:27,230 --> 00:46:28,080 سؤال هنا. 1028 00:46:28,080 --> 00:46:28,580 نعم. 1029 00:46:28,580 --> 00:46:29,340 أي أسئلة أخرى؟ 1030 00:46:29,340 --> 00:46:31,220 نعم، في الخلف. 1031 00:46:31,220 --> 00:46:33,890 الجمهور: كيف يمكن إجراء تمييز بين العناصر النائبة 1032 00:46:33,890 --> 00:46:35,220 إذا كانت لديك متغيرات مختلفة؟ 1033 00:46:35,220 --> 00:46:37,840 ديفيد: كيف يمكن إجراء تمييز بين العناصر النائبة 1034 00:46:37,840 --> 00:46:39,190 إذا كانت لديك متغيرات مختلفة؟ 1035 00:46:39,190 --> 00:46:40,910 إنه الترتيب من اليسار إلى اليمين. 1036 00:46:40,910 --> 00:46:43,210 لذا في هذه الحالة، إنه مثال تافه لأنه يوجد 1037 00:46:43,210 --> 00:46:45,490 متغير واحد وعنصر نائب واحد فقط. 1038 00:46:45,490 --> 00:46:48,610 ولكن إذا كنت تلمح إلى أن لدي النسبة المئوية S متعددة لشيء ما شيء ما 1039 00:46:48,610 --> 00:46:51,040 شيء ما، النسبة المئوية S لشيء ما شيء ما شيء ما، 1040 00:46:51,040 --> 00:46:55,450 سأتأكد فقط من إدخال المتغير الأول إلى printf فاصلة 1041 00:46:55,450 --> 00:46:59,590 المتغير الثاني فاصلة المتغير الثالث وهكذا من اليسار إلى اليمين. 1042 00:46:59,590 --> 00:47:00,510 أي أسئلة أخرى؟ 1043 00:47:00,510 --> 00:47:01,690 نعم. 1044 00:47:01,690 --> 00:47:03,530 الجمهور: لماذا لا يوجد حرف n\؟ 1045 00:47:03,530 --> 00:47:04,330 ديفيد: أوه، اللعنة. 1046 00:47:04,330 --> 00:47:06,580 لأنني أخفقت ولم أدرج ذلك وكنت سأقوم 1047 00:47:06,580 --> 00:47:09,380 بإصلاح ذلك بعد الصف الدراسي بسرعة. 1048 00:47:09,380 --> 00:47:11,420 خطأ، إنه خطأ. 1049 00:47:11,420 --> 00:47:11,920 نعم. 1050 00:47:11,920 --> 00:47:14,770 الجمهور: ماذا لو كنت تريد استخدام int مرتين في السلسلة؟ 1051 00:47:14,770 --> 00:47:17,640 أي أردت أن أقول، مرحبًا، ديفيد، أهلاً، ديفيد. 1052 00:47:17,640 --> 00:47:19,440 ديفيد: بالتأكيد، الشيء ذاته بالضبط-- 1053 00:47:19,440 --> 00:47:24,210 فاصلة إجابة، فاصلة إجابة باستخدام نسبتين مئويتين S. إذا أردت أن تقول المتغير نفسه مرتين 1054 00:47:24,210 --> 00:47:28,290 في مكانين أيًا كان السبب، عنصرين نائبين ومن ثم إجابة فاصلة 1055 00:47:28,290 --> 00:47:30,680 إجابة لإدخال ذلك مرتين. 1056 00:47:30,680 --> 00:47:32,180 سؤال آخر-- نعم. 1057 00:47:32,180 --> 00:47:34,990 الجمهور: هل النسبة المئوية عنصر نائب عالمي من حيث الأعداد الصحيحة؟ 1058 00:47:34,990 --> 00:47:37,490 ديفيد: لا، وسنرى بعض النسب الأخرى خلال لحظات. 1059 00:47:37,490 --> 00:47:38,650 اتضح أنه توجد نسب أخرى. 1060 00:47:38,650 --> 00:47:40,720 مثل النسبة المئوية i التي تشير للعدد الصحيح، وسيكون 1061 00:47:40,720 --> 00:47:44,730 هناك أكثر من ذلك-- النسبة المئوية c التي تشير لحرف واحد والمزيد. 1062 00:47:44,730 --> 00:47:46,300 أي أسئلة أخرى؟ 1063 00:47:46,300 --> 00:47:47,180 نعم. 1064 00:47:47,180 --> 00:47:50,200 الجمهور: حيث إن حرف n\ هو متغير، هل ستضعه بعد n؟ 1065 00:47:50,200 --> 00:47:51,700 هل ستضعه في الاقتباس؟ 1066 00:47:51,700 --> 00:47:52,200 ديفيد: سؤال جيد. 1067 00:47:52,200 --> 00:47:54,690 إذا كان لدي بشكل صحيح-- وإن لم يكن هذا ملف PDF، 1068 00:47:54,690 --> 00:47:56,070 لقمت بتحريره بسرعة-- 1069 00:47:56,070 --> 00:48:01,980 إذا كانت لدي النسبة المئوية n، فيجب أن تنتقل دائمًا إلى السلسلة المنسقة، 1070 00:48:01,980 --> 00:48:03,640 في الوسيطة الأولى. 1071 00:48:03,640 --> 00:48:06,960 لذا أول شيء يأتي بعد الوسيطة الأولى في printf 1072 00:48:06,960 --> 00:48:12,090 هو بشكل اختياري متغير فاصلة متغير فاصلة متغير فاصلة متغير. 1073 00:48:12,090 --> 00:48:15,120 أي أسئلة أخرى؟ 1074 00:48:15,120 --> 00:48:18,650 لذا دعونا نمضي قدمًا ونقوم بشيء ما فعلاً باستخدام التعليمات البرمجية. 1075 00:48:18,650 --> 00:48:20,700 سأمضي قدمًا وأفتح نافذة أخرى، 1076 00:48:20,700 --> 00:48:23,040 وهذه أداة تسمى CS50 Sandbox، 1077 00:48:23,040 --> 00:48:27,360 وهي أداة عبر الويب بواسطتها يمكنك العمل على التعليمات البرمجية. 1078 00:48:27,360 --> 00:48:30,450 وسأعرض في غضون لحظات كيف يمكنني الدخول إلى هذا الموقع الخاص، 1079 00:48:30,450 --> 00:48:33,550 ولكن دعوني أشرح أولاً واجهة المستخدم مثلما بدأنا 1080 00:48:33,550 --> 00:48:34,800 محادثتنا عند استخدام سكراتش. 1081 00:48:34,800 --> 00:48:36,360 إذًا أحتاج إلى مكان لأكتب التعليمات البرمجية. 1082 00:48:36,360 --> 00:48:38,580 الحقيقة أنه يمكنني فقط استخدام Mac الخاص بي. 1083 00:48:38,580 --> 00:48:40,200 يمكنني فقط استخدام كمبيوتري الشخصي. 1084 00:48:40,200 --> 00:48:43,030 وبصراحة، يمكنني حتى استخدام بعض الأجهزة المحمولة هذه الأيام. 1085 00:48:43,030 --> 00:48:46,380 ولكن فيما بعد قد يكون لدينا مئات الأشخاص الآخرين في الصف الدراسي 1086 00:48:46,380 --> 00:48:48,180 ويستخدم كل منهم تكوينات مختلفة قليلاً 1087 00:48:48,180 --> 00:48:50,790 على أجهزة Mac لديهم وأجهزة الكمبيوتر والهواتف المحمولة وما شابه ذلك. 1088 00:48:50,790 --> 00:48:53,670 ولذا سيكون لكل شخص إعدادات مختلفة وبرامج مختلفة، 1089 00:48:53,670 --> 00:48:55,230 ولن تعمل أبدًا بشكل جيد. 1090 00:48:55,230 --> 00:48:56,970 لذا في بداية الدورة، نحن نقوم فقط 1091 00:48:56,970 --> 00:48:59,670 بتوحيد كل شيء من خلال استخدام بيئة معتمدة على الويب 1092 00:48:59,670 --> 00:49:05,450 تمامًا مثل سكراتش، حيث سيكون لدينا جميعًا حق الوصول إلى جهاز الكمبيوتر المحدد نفسه 1093 00:49:05,450 --> 00:49:07,560 ولكن بشكل افتراضي في ما يسمى بالسحابة. 1094 00:49:07,560 --> 00:49:09,510 إذا تسائلت من قبل ما هي السحابة، 1095 00:49:09,510 --> 00:49:12,450 فهي فقط تعني خادم خاص بأشخاص آخرين في مكان ما على الإنترنت 1096 00:49:12,450 --> 00:49:15,210 والذي يمكن للأشخاص استخدامه مجانًا أو بإيجار ولا 1097 00:49:15,210 --> 00:49:17,980 يتوجب عليهم استضافة هذه الخوادم المادية نفسها. 1098 00:49:17,980 --> 00:49:22,110 لذا CS50 Sandbox، تمامًا مثل سكراتش، هو تطبيق قائم على السحابة 1099 00:49:22,110 --> 00:49:24,780 والذي قام شخص آخر بكتابته وتتم استضافته على الإنترنت، 1100 00:49:24,780 --> 00:49:27,690 وتبدو اجهة المستخدم، للوهلة الأولى مثل هذا. 1101 00:49:27,690 --> 00:49:29,520 تحتوي على مكونين فقط. 1102 00:49:29,520 --> 00:49:33,010 يوجد في الجزء العلوي من واجهة مستخدم CS50 Sandbox 1103 00:49:33,010 --> 00:49:35,640 محرر التعليمات البرمجية فقط، وهو محرر نص بسيط جدًا 1104 00:49:35,640 --> 00:49:38,910 يشبه في عمله Google Docs وMicrosoft Word وما إلى ذلك 1105 00:49:38,910 --> 00:49:39,640 ولكن أبسط من ذلك بكثير. 1106 00:49:39,640 --> 00:49:40,560 لا يوجد تنسيق. 1107 00:49:40,560 --> 00:49:42,100 لا يوجد خط غامق وتمركز. 1108 00:49:42,100 --> 00:49:44,070 يمكنك فقط كتابة كلمات النص. 1109 00:49:44,070 --> 00:49:46,410 في الأسفل هنا ما يسمى بالنافذة الطرفية، 1110 00:49:46,410 --> 00:49:48,580 ولكننا سنعود لذلك بعد لحظات. 1111 00:49:48,580 --> 00:49:51,030 دعوني أمضي قدمًا وأكتب برنامجي الأول. 1112 00:49:51,030 --> 00:49:57,960 دعوني أمضي قدمًا وأكتب "include standard IO.h 1113 00:49:57,960 --> 00:50:04,740 int main void افتح أقواسًا متعرجة printf hello world\ وفاصلة منقوطة، 1114 00:50:04,740 --> 00:50:05,970 تم. 1115 00:50:05,970 --> 00:50:10,460 الآن عدد قليل من الأشخاص الموجودين في هذه الغرفة يمكنه تجهيز برنامج واضح 1116 00:50:10,460 --> 00:50:12,510 بهذه السرعة ما لم تكن لديه خلفية مسبقة. 1117 00:50:12,510 --> 00:50:15,990 وإذا تناولت APCS أو أي شيء آخر، يبدو مثل Java 1118 00:50:15,990 --> 00:50:17,520 ولكن لا يشبهه تمامًا. 1119 00:50:17,520 --> 00:50:19,200 ولكن هذا هو برنامجي الأول. 1120 00:50:19,200 --> 00:50:22,140 الآن لنتذكر مما مضى أن هذا كان برنامجًا أبيض وأسود 1121 00:50:22,140 --> 00:50:24,750 رأيناه على الشريحة منذ قليل. 1122 00:50:24,750 --> 00:50:28,290 وحتى لو لم نقدّر ما تقوم به الصيغة غير التقليدية، 1123 00:50:28,290 --> 00:50:31,500 من المحتمل أن يكون لدى جميعنا حدس بما يفعله هذا البرنامج، 1124 00:50:31,500 --> 00:50:34,980 وهو في نهاية المطاف فقط طبع الكلمات hello world. 1125 00:50:34,980 --> 00:50:38,670 ولكننا سنستخلص بعد قليل ما الذي تقوم به جميع هذه السطور المتعددة. 1126 00:50:38,670 --> 00:50:41,220 ولكن الجزء المثير للاهتمام هو الجزء المظلل باللون الأخضر هنا، 1127 00:50:41,220 --> 00:50:44,640 وهذه إحدى ميزات CS50 Sandbox. 1128 00:50:44,640 --> 00:50:48,210 فهو يميز المفاهيم المختلفة للتعليمات البرمجية بلون ما داخل التعليمات البرمجية الخاصة بك 1129 00:50:48,210 --> 00:50:49,690 حتى تلاحظها مباشرة. 1130 00:50:49,690 --> 00:50:52,540 الألوان ليست موجودة بالفعل. 1131 00:50:52,540 --> 00:50:54,420 لا يتوجب عليك تمييز أجزاء التعليمات البرمجية بنفسك. 1132 00:50:54,420 --> 00:50:57,290 إنه يقوم بذلك تلقائيًا حتى يمكنك رؤية المكونات المختلفة 1133 00:50:57,290 --> 00:51:01,450 تماما مثل ما يقوم معهد MIT بتلوين قطع لغز سكراتش المتعددة، الأمر نفسه. 1134 00:51:01,450 --> 00:51:06,330 إذًا هذا برنامج أرغب في تسميته hello. 1135 00:51:06,330 --> 00:51:07,150 إنه في ملف. 1136 00:51:07,150 --> 00:51:09,560 هذه فقط علامة تبويب في الأعلى تسمى hello.C 1137 00:51:09,560 --> 00:51:11,730 لأنه يتبين أنه، عندما تكتب برنامجًا بلغة C، 1138 00:51:11,730 --> 00:51:17,430 فأنت تحفظه في ملفات من خلال تحويل بشري أيًا كانت .C كامتداد الملف، 1139 00:51:17,430 --> 00:51:18,910 إذا جاز التعبير. 1140 00:51:18,910 --> 00:51:21,490 كيف يمكنني تشغيل هذا البرنامج؟ 1141 00:51:21,490 --> 00:51:26,310 لا يوجد علم أخضر للنقر عليه، كالذي قدمه لنا سكراتش. 1142 00:51:26,310 --> 00:51:28,290 لذا كيف يمكنني تشغيل هذا البرنامج فعليًا. 1143 00:51:28,290 --> 00:51:32,280 وبصراحة، علاوة على ذلك، يبدو أن أمر العلم الأخضر هو أقل ما يقلقني. 1144 00:51:32,280 --> 00:51:34,590 ما هي اللغة التي يفهمها أي جهاز كمبيوتر 1145 00:51:34,590 --> 00:51:38,840 سواء كان جهاز Mac الخاص بي هنا أو خادم السحابة حيث يوجد هذا الشيء؟ 1146 00:51:38,840 --> 00:51:40,310 أصفار وآحاد، أليس كذلك؟ 1147 00:51:40,310 --> 00:51:43,880 وبدأنا بعرض تلك الشريحة المليئة بالكثير من 0 و1، 1148 00:51:43,880 --> 00:51:46,340 وتلك هي النقطة التي نحتاج الوصول إليها. 1149 00:51:46,340 --> 00:51:50,240 ولكن نأمل، ألا يتوجب علينا الكتابة بذلك المستوى من الملل. 1150 00:51:50,240 --> 00:51:53,180 لذا نحتاج إلى طريقة ما لتحويل التعليمات البرمجية هذه 1151 00:51:53,180 --> 00:51:58,100 من لغة C، والتي سنبدأ بتسميتها تعليمات المصدر البرمجية، وهو الرمز الشبيه باللغة الإنجليزية 1152 00:51:58,100 --> 00:52:01,670 الذي رأيناه على الشاشة وأقل ما يقال عنه أن كتابته ممتعة على عكس 1153 00:52:01,670 --> 00:52:03,170 الأصفار والآحاد فقط. 1154 00:52:03,170 --> 00:52:06,840 ولكننا مع ذلك نحتاج إلى تحويله بطريقة ما إلى أصفار وآحاد. 1155 00:52:06,840 --> 00:52:09,540 ولذا الطريقة التي يمكننا فعل ذلك بها هي كما يلي. 1156 00:52:09,540 --> 00:52:14,840 إذا كان لدينا ما سنبدأ بتسميته تعليمات المصدر الرمجية الخاصة بنا، والذي يمكن أن تكتب، 1157 00:52:14,840 --> 00:52:20,300 في حالتنا، بلغة C، ولكن يمكنك كتابة تعليمات المصدر البرمجية بلغة Java، أو C++، أو Python، 1158 00:52:20,300 --> 00:52:21,580 بعشرات اللغات الأخرى. 1159 00:52:21,580 --> 00:52:22,790 تعليمات المصدر البرمجية هي مصطلح عام. 1160 00:52:22,790 --> 00:52:25,020 وهذا يعني أن التعليمات البرمجية هي التي كتبناها نحن البشر. 1161 00:52:25,020 --> 00:52:28,950 نحتاج إلى طريقة ما لتحويلها إلى أصفار وآحاد، والتي 1162 00:52:28,950 --> 00:52:31,250 من الآن فصاعدًا سنطلق عليها تعليمات برمجية آلية، 1163 00:52:31,250 --> 00:52:32,450 والذي يبدو اسمًا منطقيًا. 1164 00:52:32,450 --> 00:52:35,090 إنها الأصفار والآحاد التي تفهمها الآلة. 1165 00:52:35,090 --> 00:52:38,030 كيف يمكن لآلة أن تفهم ما تعنيه الأصفار والآحاد؟ 1166 00:52:38,030 --> 00:52:41,420 حسنًا، هذا هو السبب وراء امتلاك CPU، وحدة معالجة 1167 00:52:41,420 --> 00:52:42,950 مركزية، أدمغة أجهزة الكمبيوتر. 1168 00:52:42,950 --> 00:52:45,110 إنها متأصلة في المصنع، 1169 00:52:45,110 --> 00:52:47,610 إذا جاز التعبير، في مصنع Intel لفهم 1170 00:52:47,610 --> 00:52:49,560 أنماط معينة من الأصفار والآحاد. 1171 00:52:49,560 --> 00:52:54,170 ولكن النقطة المهمة بالنسبة لنا الآن هي أننا بحاجة لتناول تعليمات مصدر برمجية، مثل البرنامج 1172 00:52:54,170 --> 00:52:56,690 الذي كتبته بلغة C منذ لحظة والذي من المفترض أن يطبع hello world، 1173 00:52:56,690 --> 00:53:00,830 ويحولها بطريقة ما إلى تعليمات برمجية آلية. 1174 00:53:00,830 --> 00:53:04,250 إذًا اتضح أن هذه الخطوة قد حلها الأشخاص السابقون 1175 00:53:04,250 --> 00:53:05,300 لنا قبل ذلك. 1176 00:53:05,300 --> 00:53:08,060 قام الأشخاص الآخرون بكتابة برامج بالفعل 1177 00:53:08,060 --> 00:53:11,420 والتي سنطلق عليها اسم مترجم والذي يتيح لنا 1178 00:53:11,420 --> 00:53:14,150 تحويل تعليمات مصدر برمجية إلى تعليمات برمجية آلية. 1179 00:53:14,150 --> 00:53:15,450 إنها فقط خطوة إضافية واحدة. 1180 00:53:15,450 --> 00:53:17,420 هذه الخطوة غير موجودة في سكراتش، ولكننا 1181 00:53:17,420 --> 00:53:22,160 سنبدأ في تشغيل برنامج يطلق عليه بشكل عام اسم مترجم والذي سنقوم 1182 00:53:22,160 --> 00:53:29,150 بتمرير برنامجنا إليه كمدخل، وسنحصل منه كمخرج على تعليمات برمجية آلية، وبالتالي 1183 00:53:29,150 --> 00:53:32,180 يوضح لنا ما هو علم الكمبيوتر 1184 00:53:32,180 --> 00:53:34,490 الموجود في سياق البرمجة الآن-- تعليمات مصدر برمجية 1185 00:53:34,490 --> 00:53:36,290 كمدخل، تعليمات برمجية آلية كمخرجات. 1186 00:53:36,290 --> 00:53:39,590 تسمى الخوارزمية أو البرنامج الخاص الذي سنستخدمه خلال لحظات 1187 00:53:39,590 --> 00:53:42,800 مترجم وهو يقوم فقط بتحويل شيء إلى شيء آخر حتى لا يتعين علينا 1188 00:53:42,800 --> 00:53:45,710 أن نفكر في 0 و1 أو نكتب بهما. 1189 00:53:45,710 --> 00:53:48,200 لذا فهذا يمثل المدرسة القديمة قليلاً في كيفية القيام بهذا. 1190 00:53:48,200 --> 00:53:51,110 في سكراتش، تقوم فقط بالضغط بوضوح على العلم الأخضر ومعهد MIT 1191 00:53:51,110 --> 00:53:53,280 وباقي الرفاق سيقومون بالأمر لك. 1192 00:53:53,280 --> 00:53:56,420 ولكن يجب أن نعمل بشكل يدوي أكثر قليلاً في هذا، 1193 00:53:56,420 --> 00:53:59,630 وهذا حيث تدخل القطعة الثانية من واجهة مستخدم CS50 Sandbox 1194 00:53:59,630 --> 00:54:00,680 في الموضوع. 1195 00:54:00,680 --> 00:54:02,750 لاحظ أن لدي محث وامض هنا. 1196 00:54:02,750 --> 00:54:05,460 توجد علامة دولار في الجزء الأيسر، وهي مجرد اتفاقية مشتركة. 1197 00:54:05,460 --> 00:54:10,430 وتشير علامة الدولار في هذه الأنواع من أجهزة الكمبيوتر إلى محث. 1198 00:54:10,430 --> 00:54:13,520 إنه ينتظرني لكتابة شيء ما، وهو حقًا وحرفيًا يومض، 1199 00:54:13,520 --> 00:54:15,290 في انتظاري لكتابة شيء ما. 1200 00:54:15,290 --> 00:54:19,310 هذا هو مثال للنافذة الطرفية، ويحتوي جهاز iMac وجهاز الكمبيوتر الشخصي الخاص بك 1201 00:54:19,310 --> 00:54:22,130 أو لا يمكن أن يحتوي على هذه الميزة نفسها بالضبط. 1202 00:54:22,130 --> 00:54:25,390 إنها فقط ما نقوم بتشغيله باستخدام واجهات المستخدم الرسومية هذه الأيام. 1203 00:54:25,390 --> 00:54:27,090 لذا لدينا أزرار وقوائم وأشياء 1204 00:54:27,090 --> 00:54:28,940 للسحب والنقر، ولكن سابقًا-- 1205 00:54:28,940 --> 00:54:33,020 وعادة في البرمجة-- لا تزعج نفسك بهذه الجماليات. 1206 00:54:33,020 --> 00:54:37,220 أنت فقط ترهق يديك فعليًا بكتابة أي شيء تريد القيام به 1207 00:54:37,220 --> 00:54:38,330 على لوحة المفاتيح وحدها. 1208 00:54:38,330 --> 00:54:40,250 وفي البداية، قد يبدو الأمر على أنه تراجع. 1209 00:54:40,250 --> 00:54:43,700 مثل، لماذا نتخلى عن جميع هذه المرافق الجميلة 1210 00:54:43,700 --> 00:54:45,450 لأجهزة الكمبيوتر الحديثة؟ 1211 00:54:45,450 --> 00:54:47,630 ولكنها أقوى، وأكثر وضوحًا. 1212 00:54:47,630 --> 00:54:51,750 إنها تتيح لنا بالضبط فعل ما نريد فعله بإرسال أوامر إلى جهاز الكمبيوتر. 1213 00:54:51,750 --> 00:54:52,950 لذا هذا هو الطرف 1 الخاص بي. 1214 00:54:52,950 --> 00:54:55,070 يمكنني إنشاء أخرى فقط ليكون لدي نوافذ متعددة، 1215 00:54:55,070 --> 00:54:59,090 ولكن هذا يتيح لي الوصول إلى الخادم الأساسي الذي لدي الآن 1216 00:54:59,090 --> 00:55:00,240 حق الوصول إليه. 1217 00:55:00,240 --> 00:55:03,440 لذا إذا كان أي منكم، عندما يحين وقت تعيين المشكلة الأولى، 1218 00:55:03,440 --> 00:55:06,420 قام بتسجيل الدخول إلى الأداة نفسها، ليس لديكم جميعًا البيئة نفسها. 1219 00:55:06,420 --> 00:55:11,150 لديكم جميعًا النسخ المعزولة للبرنامج ذاته الخاصة بكم وليس سعة التخزين 1220 00:55:11,150 --> 00:55:12,870 الخاصة بكم، إذا جاز التعبير. 1221 00:55:12,870 --> 00:55:18,350 إذًا أحتاج إلى تحويل hello.C بطريقة ما إلى أصفار وآحاد. 1222 00:55:18,350 --> 00:55:21,020 والطريقة التي سأقوم بفعل هذا بها هي هكذا-- 1223 00:55:21,020 --> 00:55:29,120 clang، والتي تشير إلى لغة C، hello.C enter. 1224 00:55:29,120 --> 00:55:32,730 وحقيقة أنني لا أرى أي شيء يحدث هو بالفعل أمر مذهل 1225 00:55:32,730 --> 00:55:35,780 لأنه يوجد عدد لا نهائي من الأشياء، والتي بصراحة، يمكن أن تحدث بشكل خاطئ، 1226 00:55:35,780 --> 00:55:37,490 وجهاز الكمبيوتر سيصرخ بسعادة في وجهك 1227 00:55:37,490 --> 00:55:40,850 برسائل أخطاء تبدو مشفرة إذا حدثت أي من هذه الأشياء بطريقة خاطئة. 1228 00:55:40,850 --> 00:55:44,240 لذا عدم رؤية أي شيء سوى محث وامض آخر مع علامة 1229 00:55:44,240 --> 00:55:45,560 الدولار هو شيء جيد فعليًا. 1230 00:55:45,560 --> 00:55:48,890 لقد تم تحويل الرمز الخاص بي بطريقة ما إلى أصفار وآحاد. 1231 00:55:48,890 --> 00:55:50,750 أين هي تلك الأصفار والآحاد؟ 1232 00:55:50,750 --> 00:55:54,860 حسنًا، عادة، يتم تخزينها في ملف يطلق عليه بشكل تاريخي 1233 00:55:54,860 --> 00:55:58,370 ومريب a.out، ويمكننا رؤية ذلك. 1234 00:55:58,370 --> 00:56:00,770 إذا قمت بالنقر على رمز هذا المجلد هنا، سترى 1235 00:56:00,770 --> 00:56:06,500 بالفعل ملفي hello.C وملف آخر الآن باسم a.out. 1236 00:56:06,500 --> 00:56:09,530 إنه يشير إلى تركيبة المخرج، ولكن لأسباب تاريخية. 1237 00:56:09,530 --> 00:56:12,560 الآن دعوني أغلق رمز المجلد لأننا لن نستخدم 1238 00:56:12,560 --> 00:56:14,940 واجهة المستخدم الرسومية بشكل عام. 1239 00:56:14,940 --> 00:56:16,130 كيف يمكنني تشغيل ذلك البرنامج؟ 1240 00:56:16,130 --> 00:56:17,630 لا يمكنني فقط النقر مرتين على الرمز. 1241 00:56:17,630 --> 00:56:18,350 هذا ليس جهاز Mac. 1242 00:56:18,350 --> 00:56:19,430 هذا ليس جهاز كمبيوتر شخصي. 1243 00:56:19,430 --> 00:56:22,070 هذه بيئة Linux القائمة على السحابة. 1244 00:56:22,070 --> 00:56:23,850 Linux هو نظام تشغيل شائع جدًا. 1245 00:56:23,850 --> 00:56:26,810 يستخدمه العديد من علماء الكمبيوتر، والعديد من المواقع الإلكترونية، 1246 00:56:26,810 --> 00:56:27,530 والعديد من الخوادم. 1247 00:56:27,530 --> 00:56:30,320 في الواقع، يتم تشغيل كل المواقع تقريبًا التي تزورها هذه الأيام، 1248 00:56:30,320 --> 00:56:33,650 إذا لم تكن بواسطة نظام التشغيل Windows فبنظام التشغيل Linux وإصدارات متنوعة من ذلك 1249 00:56:33,650 --> 00:56:36,080 تسمى Unix وإصدارات أخرى. 1250 00:56:36,080 --> 00:56:38,570 إنه فقط نظام تشغيل مجاني تقريبًا وشائع جدًا 1251 00:56:38,570 --> 00:56:40,880 ويستخدمه CS50 Sandbox نفسه. 1252 00:56:40,880 --> 00:56:45,700 لتشغيل ملف باسم a.out الموجود في هذا المجلد، لذا إذا جاز التعبير، 1253 00:56:45,700 --> 00:56:47,870 وعلى الرغم من عدم رؤيتك للإصدار الرسومي منه. 1254 00:56:47,870 --> 00:56:51,320 فأنت تكتب فقط وحرفيًا نقطة خط مائل a.out. 1255 00:56:51,320 --> 00:56:55,670 اسم غير واضح تمامًا وغبي نوعًا ما ليتم إطلاقه على البرنامج، 1256 00:56:55,670 --> 00:56:59,520 ولكن هذا ما يعادل النقر مرتين على رمز في جهاز Mac أو الكمبيوتر الشخصي الخاص بك. 1257 00:56:59,520 --> 00:57:00,770 دعوني أمضي قدمًا وأنقر فوق إدخال. 1258 00:57:00,770 --> 00:57:04,410 وعندما أقوم بذلك، فأنا آمل أن أرى ماذا؟ 1259 00:57:04,410 --> 00:57:05,160 Hello world. 1260 00:57:05,160 --> 00:57:06,780 وها نحن ذا. 1261 00:57:06,780 --> 00:57:09,510 رائع، هذا هو برنامجنا الأول. 1262 00:57:09,510 --> 00:57:11,700 إنه لا يقوم بالكثير، ولكنه على الأقل 1263 00:57:11,700 --> 00:57:13,600 يقوم بما وعدنا أنه سيقوم به. 1264 00:57:13,600 --> 00:57:17,450 وهذا مايعادل في سكراتش ميزة القول على الشاشة hello world. 1265 00:57:17,450 --> 00:57:19,410 الآن لنكون منصفين، توجد المزيد من الخطوات المتضمنة، 1266 00:57:19,410 --> 00:57:22,710 والله أعلم أن هناك المزيد من الرموز التي تبدو مشفرة لتتم كتابتها. 1267 00:57:22,710 --> 00:57:24,900 ولكن في نهاية الأمر كل ما قمنا به 1268 00:57:24,900 --> 00:57:27,690 هو إعادة تنفيذ النظرة المنطقية من الأسبوع الماضي في هذه اللغة الجديدة، 1269 00:57:27,690 --> 00:57:31,620 ولكننا سنقدم الآن وبشكل سريع للغاية قطع لغز جديدة ولكن بلغة C. 1270 00:57:31,620 --> 00:57:34,300 ولكن أولاً دعونا نحل هذا الصداع الطفيف. 1271 00:57:34,300 --> 00:57:36,480 أنا لا أرغب حقًا في إخبار أصدقائي، 1272 00:57:36,480 --> 00:57:39,540 مرحبًا، بالجميع، تعالوا لتشغيل برنامجي a.out. 1273 00:57:39,540 --> 00:57:40,800 فلنطلق عليه اسمًا حقيقيًا. 1274 00:57:40,800 --> 00:57:42,630 فلنفترض أني أريد فقط تسمية برنامجي hello 1275 00:57:42,630 --> 00:57:45,300 مثلما قد تقوم بالتنزيل من متجر Google Play أو App Store. 1276 00:57:45,300 --> 00:57:47,010 برامج لها أسماء. 1277 00:57:47,010 --> 00:57:48,430 إذًا كيف يمكنني فعل ذلك؟ 1278 00:57:48,430 --> 00:57:53,160 حسنًا، اتضح أنه في نافذة طرفية، ما يسمى ببيئة سطر الأوامر، 1279 00:57:53,160 --> 00:57:55,830 هو عبارة عن طريقة رائعة لقول أنك تكتب سطور الأوامر 1280 00:57:55,830 --> 00:57:58,080 باستخدام لوحة المفاتيح، يمكنك التمرير بالفعل 1281 00:57:58,080 --> 00:58:02,730 في ما يسمى بوسيطات سطور الأوامر، المدخلات الإضافية 1282 00:58:02,730 --> 00:58:06,990 للبرامج التي هي مجرد كلمات تكتبها في لوحة المفاتيح الخاصة بك والتي تخبرها 1283 00:58:06,990 --> 00:58:07,740 بكيفية التصرف. 1284 00:58:07,740 --> 00:58:11,200 لذا بدلاً من تشغيل clang فقط clang hello.C 1285 00:58:11,200 --> 00:58:13,650 سأكون فعليًا أكثر وضوحًا 1286 00:58:13,650 --> 00:58:16,800 وأخبر clang يُرجى إخراج-- 1287 00:58:16,800 --> 00:58:20,040 كما هو موضح من خلال الكتابة حرفيًا شرطة 0 للإخراج-- 1288 00:58:20,040 --> 00:58:23,170 بدلاً من ذلك ملف باسم hello. 1289 00:58:23,170 --> 00:58:24,600 الأمر أكثر إطنابًا قليلاً-- 1290 00:58:24,600 --> 00:58:29,630 مرحبًا شرطة O مرحبًا-- أو، آسف clang شرطة O hello hello.C. 1291 00:58:29,630 --> 00:58:32,460 ولكن الذي سيقوم به الآن هو الاستمرار في تحويل 1292 00:58:32,460 --> 00:58:34,260 تعليمات المصدر البرمجية إلى تعليمات برمجية آلية، ولكنه سيعمل على 1293 00:58:34,260 --> 00:58:37,200 حفظه في ملف باسم hello. 1294 00:58:37,200 --> 00:58:40,980 وأنا لدي الآن حقًا hello.C a.out ومرحبًا كما 1295 00:58:40,980 --> 00:58:43,440 هي مصورة في المجلد الرسومي الصغير هناك. 1296 00:58:43,440 --> 00:58:47,230 لذا الآن يمكنني بدلاً من ذلك تشغيل نقطة خط مائل مرحبًا. 1297 00:58:47,230 --> 00:58:48,030 ما الذي يجب أن تقوله؟ 1298 00:58:48,030 --> 00:58:50,950 آمل أن يكون ذاته، enter. 1299 00:58:50,950 --> 00:58:51,580 هذا هو. 1300 00:58:51,580 --> 00:58:53,830 هذه تسمى بوسيطات سطر الأوامر، وهي فقط 1301 00:58:53,830 --> 00:58:56,700 طريقة المدرسة القديمة لإخبار أمر قائم على نص 1302 00:58:56,700 --> 00:58:59,080 بكيفية التصرف بشكل مختلف قليلاً عن إعداداته الافتراضية. 1303 00:58:59,080 --> 00:59:01,590 ولكن بصراحة، هذا سيجعل الأمر مملاً بسرعة. 1304 00:59:01,590 --> 00:59:03,550 لن نرغب في كتابة التعليمات البرمجية الخاصة بنا 1305 00:59:03,550 --> 00:59:06,640 ثم في كل مرة نريد تحويلها إلى أصفار وآحاد لتشغيلها 1306 00:59:06,640 --> 00:59:10,780 نتذكر طلاسم الأوامر السحرية هذه. 1307 00:59:10,780 --> 00:59:13,570 لذا قام البشر بتجريد تلك بعيدًا أيضًا. 1308 00:59:13,570 --> 00:59:16,510 اتضح أنه، إذا كنت تريد تصميم برنامج من تعليمات مصدر برمجية 1309 00:59:16,510 --> 00:59:19,180 إلى تعليمات برمجية آلية، فيوجد أمر آخر يمكنك استخدامه. 1310 00:59:19,180 --> 00:59:22,030 ويمكنك حرفيًا كتابة make hello، حيث 1311 00:59:22,030 --> 00:59:24,820 hello هو اسم البرنامج الذي تريد تصميمه، 1312 00:59:24,820 --> 00:59:28,900 هذا البرنامج، الذي اسمه make، سيبحث عن ملف 1313 00:59:28,900 --> 00:59:35,020 بشكل افتراضي باسم hello.C، وبالتالي يوفر لك الوقت المخصص لذلك. 1314 00:59:35,020 --> 00:59:38,680 اضغط على Enter الآن، يا إلهي، انظروا ما الذي فعله للتو. 1315 00:59:38,680 --> 00:59:43,450 لديه المزيد من خيارات التكوين المصممة فيه، 1316 00:59:43,450 --> 00:59:48,130 ونحن كموظفي CS50، قمنا بتكوين CS50 sandbox للحصول على هذه الميزات المتنوعة. 1317 00:59:48,130 --> 00:59:50,800 ومع ذلك لن نخوض في التفاصيل الخاصة بها الآن، 1318 00:59:50,800 --> 00:59:52,820 ولن أتطرق إلى ما الذي يقومون به فعليًا. 1319 00:59:52,820 --> 00:59:55,860 إنهم فقط يصممون ميزات إضافية يحتمل أن نصل إليها في النهاية. 1320 00:59:55,860 --> 00:59:58,120 ولكن قد يكون هذا بخلاف الأمر الذي يجب عليكم 1321 00:59:58,120 --> 01:00:02,020 كتابته في أسبوعين أو ثلاثة أو أربعة أسابيع، 1322 01:00:02,020 --> 01:00:03,610 ولن يتمكن أحد من تذكر ذلك. 1323 01:00:03,610 --> 01:00:04,800 أنا بالتأكيد لن أتذكر. 1324 01:00:04,800 --> 01:00:07,330 لذا تقوم "Make" بجعل الأمر آليًا من أجلك. 1325 01:00:07,330 --> 01:00:10,520 ولكن عندما تشغّل Make، فـ Make ليست مترجمًا. 1326 01:00:10,520 --> 01:00:15,410 Make ليست ذلك الشيء في المنتصف الذي يحوّل تعليمات المصدر البرمجية إلى تعليمات برمجية آلية. 1327 01:00:15,410 --> 01:00:20,260 إنها مجرد برنامج ثانٍ قام بعض الأشخاص بكتابته منذ سنين ويستخدم 1328 01:00:20,260 --> 01:00:24,110 clang في طريقة آلية لتحقيق المخرج نفسه. 1329 01:00:24,110 --> 01:00:26,240 لأن الأشخاص قد تعبوا من كتابة أشياء كهذه. 1330 01:00:26,240 --> 01:00:30,270 لذا قام شخص ما بإعداد برنامج وأطلق عليه "Make" ليقوم لنا بذلك. 1331 01:00:30,270 --> 01:00:32,840 أية أسئلة؟ 1332 01:00:32,840 --> 01:00:35,480 دعونا إذًا نضيف شيئًا صغيرًا إلى هذا البرنامج. 1333 01:00:35,480 --> 01:00:39,020 بدلاً من هذا الإصدار من hello، دعوني أحصل على مدخل مستخدم 1334 01:00:39,020 --> 01:00:40,910 وأقوم فعليًا بشيء ما باستخدامه. 1335 01:00:40,910 --> 01:00:44,090 فلنفترض أنني أريد الحصول على اسم المستخدم ثم طباعته. 1336 01:00:44,090 --> 01:00:46,550 حسنًا، لقد رأينا المفسد لهذا منذ بضع دقائق، 1337 01:00:46,550 --> 01:00:48,830 ولكن دعوني أمضي قدمًا وأضيف إلى هذا البرنامج هنا. 1338 01:00:48,830 --> 01:00:52,460 الآن لدي سطر ثانٍ من التعليمات البرمجية، وأريد الحصول على سلسلة من مستخدم. 1339 01:00:52,460 --> 01:00:56,570 وباستخدام أي دالة يمكنني الحصول على سلسلة من المستخدم؟ 1340 01:00:56,570 --> 01:00:58,880 دالة "Get string"، ولنتذكر أنه يمكنني كتابة 1341 01:00:58,880 --> 01:01:01,880 "get_string" ونفتح الأقواس. 1342 01:01:01,880 --> 01:01:06,200 ومن ثم يتوجب عليّ تمرير وسيطة، إذا جاز التعبير، مثل عرّفني ما هو اسمك-- 1343 01:01:06,200 --> 01:01:08,070 أو في الواقع، ما الذي قلناه من قبل؟ 1344 01:01:08,070 --> 01:01:12,530 ما هو اسمك، أعتقد كان المحث n\ فاصلة منقوطة. 1345 01:01:12,530 --> 01:01:14,330 الآن هذا ليس كافيًا للحصول على السلسلة. 1346 01:01:14,330 --> 01:01:16,470 ما الذي أريد فعله به؟ 1347 01:01:16,470 --> 01:01:17,780 نعم، التخزين في متغير. 1348 01:01:17,780 --> 01:01:19,370 ما هو نوع المتغير؟ 1349 01:01:19,370 --> 01:01:20,580 سلسلة. 1350 01:01:20,580 --> 01:01:23,660 لذا أحتاج فقط إلى الانتقال إلى الجانب الأيسر من سطر التعليمات البرمجية هذا 1351 01:01:23,660 --> 01:01:25,820 وأقول، حسنًا، أعطني سلسلةً. 1352 01:01:25,820 --> 01:01:28,970 وسأطلق عليها name، ولكن قد أطلق عليها x أو y أو أي شيء. 1353 01:01:28,970 --> 01:01:31,070 ولكن name يبدو واصفًا جيدًا لها، 1354 01:01:31,070 --> 01:01:34,010 باستخدام علامة يساوي واحدة للنسخ من اليمين إلى اليسار. 1355 01:01:34,010 --> 01:01:35,700 والآن لدي هذا. 1356 01:01:35,700 --> 01:01:39,410 الآن ليس من الكافي تخزين القيمة فقط في المتغير. 1357 01:01:39,410 --> 01:01:40,770 أحتاج إلى طباعتها. 1358 01:01:40,770 --> 01:01:44,900 لذا دعوني أبدأ بهذا. 1359 01:01:44,900 --> 01:01:46,070 يقوم Sandbox بالحفظ تلقائيًا. 1360 01:01:46,070 --> 01:01:48,410 لذا لا يتوجب عليّ الانتقال إلى الملف، أو حفظ أو أي شيء. 1361 01:01:48,410 --> 01:01:51,140 دعوني أمضي قدمًا وأكتب "make hello" الآن-- 1362 01:01:51,140 --> 01:01:55,460 أوه، يا إلهي، انظروا إلى كل هذه الأخطاء بالفعل. 1363 01:01:55,460 --> 01:01:58,970 من الواضح أن هناك شيئًا ما خاطئ، نظرًا لما يظهره جهاز الكمبيوتر باللون الأحمر. 1364 01:01:58,970 --> 01:02:00,770 وبصراحة، هذا هو الوقت الذي تصبح فيه 1365 01:02:00,770 --> 01:02:02,330 هلعًا أو مزعورًا إلى حد ما بسبب، 1366 01:02:02,330 --> 01:02:04,260 يا إلهي، لقد كتبت فقط سطرين من التعليمات البرمجية. 1367 01:02:04,260 --> 01:02:06,710 كيف يظهر لي 20 سطرًا من الأخطاء بطريقة ما؟ 1368 01:02:06,710 --> 01:02:09,900 لذا فجهاز الكمبيوتر في حالة من الارتباك مثلك تمامًا. 1369 01:02:09,900 --> 01:02:12,650 وأهم شيء، عندما تواجه هذا النوع من الحالات 1370 01:02:12,650 --> 01:02:15,260 حيث يكون مدخلاً خاطئًا ومشفرًا فقط، فابدأ من الأعلى. 1371 01:02:15,260 --> 01:02:18,260 حتى لو كانت نافذتك من النوع الصغير وبالتالي تظهر مجموعة كاملة من الأشياء 1372 01:02:18,260 --> 01:02:20,660 على الشاشة بسرعة، قم بالتمرير إلى الأعلى 1373 01:02:20,660 --> 01:02:23,360 لأن الاحتمالات ستكون أنه يوجد خطأ في الجزء الأعلى 1374 01:02:23,360 --> 01:02:26,900 وأن لهذا الخطأ الواحد تأثير متسلسل على المترجم. 1375 01:02:26,900 --> 01:02:29,900 وبعد ذلك يصبح الجهاز في حالة ارتباك، ويستمر في إظهار رسائل 1376 01:02:29,900 --> 01:02:31,590 لأنه تعثر في مرحلة مبكرة. 1377 01:02:31,590 --> 01:02:35,140 لذا فلنقم بالتمرير مجددًا لأعلى هنا. 1378 01:02:35,140 --> 01:02:39,280 ويوجد هنا الأمر الطويل جدًا الذي قلت إنه يقوم بالتشغيل الآلي من أجلك. 1379 01:02:39,280 --> 01:02:40,720 إذًا فهذا ليس خاطئًا. 1380 01:02:40,720 --> 01:02:45,190 يبدو أن الخطأ الأول موجود هنا، ولكنه ما زال مشفرًا قليلاً. 1381 01:02:45,190 --> 01:02:47,220 ولكن دعونا نجمع بعض المعلومات. 1382 01:02:47,220 --> 01:02:48,970 ها هي عبارة مألوفة-- 1383 01:02:48,970 --> 01:02:52,220 hello.C دعوني أمضي قدمًا وأقوم بالتكبير في الأسفل هنا. 1384 01:02:52,220 --> 01:02:54,790 لذا hello.C يذكرنا باسم الملف الخاص بي. 1385 01:02:54,790 --> 01:02:59,440 وإن لم يكن ذلك واضحًا، يخبرني clang أن أنظر في السطر 5 ثم 1386 01:02:59,440 --> 01:03:00,830 الحرف الخامس الخاص بك. 1387 01:03:00,830 --> 01:03:04,160 إذًا شيء ما نقطتان شيء ما يعني رقم السطر ورقم الحرف أو العمود 1388 01:03:04,160 --> 01:03:05,710 إذا كنت تنظر من اليسار إلى اليمين. 1389 01:03:05,710 --> 01:03:06,880 وخطأ يعني خطأ. 1390 01:03:06,880 --> 01:03:10,600 ثم هذا هو المكان الذي تصبح فيه الأشياء معقدة بعض الشيء. 1391 01:03:10,600 --> 01:03:14,350 استخدام سلسلة معرّف غير معلنة-- 1392 01:03:14,350 --> 01:03:16,720 هل كنت تقصد standard n؟ 1393 01:03:16,720 --> 01:03:20,320 لا، ولكنني أعرف standard n، 1394 01:03:20,320 --> 01:03:23,470 أو بالأحرى يبدو مشابهًا لـ standard I/O. ولكن لا، أنا لم أقصد ذلك. 1395 01:03:23,470 --> 01:03:26,010 أنا متأكد من أن هذه التعليمات البرمجية صحيحة. 1396 01:03:26,010 --> 01:03:27,550 حسنًا، فلم أحصل على هذا الخطأ؟ 1397 01:03:27,550 --> 01:03:32,110 يبدو أن السلسلة، على السطر الخامس، الحرف الخامس، هنا تحديدًا، 1398 01:03:32,110 --> 01:03:33,730 خاطئة. 1399 01:03:33,730 --> 01:03:37,200 حسنًا، اتضح أنه لا توجد سلسلة كهذه. 1400 01:03:37,200 --> 01:03:41,320 فلغة C، تشتمل على أعداد صحيحة، وتعبيرات بولينية. 1401 01:03:41,320 --> 01:03:43,510 وتشتمل على أحرف وأشياء أخرى قليلة. 1402 01:03:43,510 --> 01:03:45,280 لا تشتمل على سلاسل في الواقع. 1403 01:03:45,280 --> 01:03:48,190 السلاسل هي كلمة مفيدة لوصف تسلسلات 1404 01:03:48,190 --> 01:03:49,840 الأحرف، والفقرات، والكلمات. 1405 01:03:49,840 --> 01:03:51,580 ولكن السلسلة ليست نوعًا. 1406 01:03:51,580 --> 01:03:54,610 إنها ليست نوعًا لمتغير ما لم تجعلها كذلك. 1407 01:03:54,610 --> 01:03:58,250 وفي الحقيقة، هذه إحدى عمليات التبسيط التي نقوم بها. 1408 01:03:58,250 --> 01:04:01,300 في أول أسبوعين فقط من الدورة لكي ننطلق، 1409 01:04:01,300 --> 01:04:05,950 اتضح أننا بحاجة إلى إضافة سطر واحد من التعليمات البرمجية هنا. 1410 01:04:05,950 --> 01:04:09,850 نحتاج ليس إلى تضمين فقط standard I/O-- والذي سنقوم بشرحه بعد قليل-- 1411 01:04:09,850 --> 01:04:13,950 ولكن أيضًا المكتبة المسماة CS50. 1412 01:04:13,950 --> 01:04:17,650 لذا يشتمل CS50 على الكثير من الأشخاص المرتبطين به، وبمرور الوقت قررنا، 1413 01:04:17,650 --> 01:04:21,430 أنه يمكننا جعل الساعة الأولى من CS50 أسهل قليلاً 1414 01:04:21,430 --> 01:04:24,940 وعلى هذا الجزء بتوضيح بسيط للأشخاص الذين ليست لديهم خلفية عن هذا 1415 01:04:24,940 --> 01:04:28,150 من خلال اختراع ميزات قليلة فقط بأنفسنا مثل القدرة 1416 01:04:28,150 --> 01:04:29,600 على الحصول على سلاسل من المستخدم. 1417 01:04:29,600 --> 01:04:31,850 لذا اتضح أيضًا أن get string ليست دالة 1418 01:04:31,850 --> 01:04:36,130 تأتي مع لغة C. فتلك قطعة لغز مخصصة، إذا جاز التعبير، تقدمها CS50. 1419 01:04:36,130 --> 01:04:40,240 وأنشأنا تلك الدالة يكون في ملف 1420 01:04:40,240 --> 01:04:41,800 يسمى CS50.h. 1421 01:04:41,800 --> 01:04:45,040 ولذا من خلال تضمين CS50.h، يمكنك الوصول الآن 1422 01:04:45,040 --> 01:04:48,440 إلى المزيد من قطع اللغز، إذا كنت ستفعل، التي قمنا بإنشائها لأجلك. 1423 01:04:48,440 --> 01:04:50,290 ويتضح أن هذا السطر من التعليمات البرمجية الذي 1424 01:04:50,290 --> 01:04:54,010 كان موجودًا هنا من قبل يقدم لك أيضًا ميزات. 1425 01:04:54,010 --> 01:04:56,510 نحن نقوم فقط بما يقوم به كل شخص في البرمجة، 1426 01:04:56,510 --> 01:05:00,040 وهو حل مشكلة مرة واحدة ومن ثم جعل الأشخاص الآخرين يستخدمون هذا الحل. 1427 01:05:00,040 --> 01:05:01,210 خمّنوا. 1428 01:05:01,210 --> 01:05:03,970 ما هي الوظيفة التي يتم تنفيذها في الواقع 1429 01:05:03,970 --> 01:05:08,170 في ملف باسم standard I/O input-output.h؟ 1430 01:05:08,170 --> 01:05:12,370 هذا ملف موجود في مكان ما على الخادم ويأتي في الواقع مع لغة C، 1431 01:05:12,370 --> 01:05:15,650 ويقدم لك ميزات مفيدة مثل ماذا؟ 1432 01:05:15,650 --> 01:05:17,600 انطقها مرة أخرى. 1433 01:05:17,600 --> 01:05:18,710 مجددًا. 1434 01:05:18,710 --> 01:05:19,510 Printf. 1435 01:05:19,510 --> 01:05:23,860 اتضح أن الوسائل التي يسمح لك عن طريقها باستخدام دالة 1436 01:05:23,860 --> 01:05:26,710 تسمى Printf هنا يجب عليك تضمين 1437 01:05:26,710 --> 01:05:28,810 الملف الذي يتم الإعلان عنه فيه. 1438 01:05:28,810 --> 01:05:32,560 لذا بعض الأشخاص، منذ سنوات، كتبوا حرفيًا دالة، قطعة لغز، 1439 01:05:32,560 --> 01:05:34,990 تسمى Printf، وأظهروا كيفية رسم 1440 01:05:34,990 --> 01:05:36,310 الأحرف على الشاشة. 1441 01:05:36,310 --> 01:05:39,280 وقاموا بعد ذلك بتخزين المعلومات عن تلك الدالة في ملف 1442 01:05:39,280 --> 01:05:41,050 يسمى standard IO.h. 1443 01:05:41,050 --> 01:05:44,470 إذا لم أقم بتضمين سطر التعليمات البرمجية هذا الذي يبدو مشفرًا 1444 01:05:44,470 --> 01:05:48,520 في الجزء العلوي من البرنامج السابق الخاص بي، فلم يكن حتى برنامج hello world ليعمل 1445 01:05:48,520 --> 01:05:51,270 لأن clang، المترجم، لم 1446 01:05:51,270 --> 01:05:52,690 يكن ليعرف ما الذي أتحدث عنه. 1447 01:05:52,690 --> 01:05:53,470 ما هو printf؟ 1448 01:05:53,470 --> 01:05:56,200 لا أعرف ما هذا ما لم تخبروه 1449 01:05:56,200 --> 01:05:58,660 بتضمين هذا الملف أيضًا الذي كتبه الأشخاص منذ 1450 01:05:58,660 --> 01:06:01,450 سنوات والذي تم إنشاء printf فيه. 1451 01:06:01,450 --> 01:06:05,860 والآن إذا كنت أريد استخدام "get string"، بالإضافة إلى سلسلة الكلمات الرئيسية الجديدة، 1452 01:06:05,860 --> 01:06:08,740 أحتاج إلى إخبار clang المترجم، امضِ قدمًا أيضًا 1453 01:06:08,740 --> 01:06:12,670 وانظر في CS50.h للحصول على المزيد من الوظائف، مثل سلسلة 1454 01:06:12,670 --> 01:06:13,970 و"get string". 1455 01:06:13,970 --> 01:06:17,140 لذا دعوني أمضي قدمًا الآن وأحاول فعل هذا مجددًا. 1456 01:06:17,140 --> 01:06:20,950 سأزيل كل ما في النافذة الطرفية وأحاول القيام بالأمر نفسه مجددًا-- 1457 01:06:20,950 --> 01:06:25,530 سأكتب make hello، enter، اللعنة. 1458 01:06:25,530 --> 01:06:26,750 الآن حصلت على خطأ آخر. 1459 01:06:26,750 --> 01:06:29,170 ولكن، ولكن، ولكن، تقدم. 1460 01:06:29,170 --> 01:06:33,620 حسنًا، لا، تقريبًا عدد الأخطاء نفسه مثل المرة الماضية، ولكنها أخطاء مختلفة. 1461 01:06:33,620 --> 01:06:37,170 لاحظوا الآن-- انتظروا، كان هذا من قبل. 1462 01:06:37,170 --> 01:06:37,980 أوه، لا، معذرة. 1463 01:06:37,980 --> 01:06:38,920 يشتمل على أخطاء أقل. 1464 01:06:38,920 --> 01:06:40,980 هنا حيث قمت بتشغيل الأمر منذ دقائق، 1465 01:06:40,980 --> 01:06:43,860 والآن حصلت على هذا الخطأ بدلاً من ذلك. 1466 01:06:43,860 --> 01:06:44,760 لذا تقدم. 1467 01:06:44,760 --> 01:06:46,230 الآن الخطأ ليس في السطر 5. 1468 01:06:46,230 --> 01:06:50,160 إنه في السطر 6، على الرغم من الحقيقة الشيقة، السطر 6 كان هو السطر 5. 1469 01:06:50,160 --> 01:06:52,920 لذا فهو على ما يبدو مرتبط بالمشكلة. 1470 01:06:52,920 --> 01:06:54,660 إذًا دعونا نقرأ رسالة الخطأ. 1471 01:06:54,660 --> 01:06:58,590 المشكلة في السطر 6، والذي ليس من المستغرب أنه هذا السطر هناك. 1472 01:06:58,590 --> 01:07:03,510 لكن هذه المرة الأمر مختلف-- خطأ، اسم متغير غير مستخدم. 1473 01:07:03,510 --> 01:07:07,020 هذا شيء أفهمه نوعًا ما حتى دون أن أكون مبرمجًا. 1474 01:07:07,020 --> 01:07:09,460 ماذا يعني ذلك؟ 1475 01:07:09,460 --> 01:07:09,960 نعم. 1476 01:07:13,400 --> 01:07:16,870 ربما توضيح قبل الاستخدام، لكن يتبين أن هذه هي الطريقة التي نوضح بها ذلك. 1477 01:07:16,870 --> 01:07:18,610 لكنني في الواقع-- نعم. 1478 01:07:18,610 --> 01:07:21,200 الجمهور: في الواقع أنت لا تستخدم المتغير الذي أعلنته. 1479 01:07:21,200 --> 01:07:23,610 ديفيد: نعم، فأنا نوعًا ما أضيع وقت الكمبيوتر. 1480 01:07:23,610 --> 01:07:24,400 أنا أنشؤه. 1481 01:07:24,400 --> 01:07:25,910 إذًا فالسطر 6 على اليسار صحيح. 1482 01:07:25,910 --> 01:07:28,180 مرحبًا، كمبيوتر، أعطني سلسلة متغير، 1483 01:07:28,180 --> 01:07:30,460 وأطلق عليه اسمًا وضع قيمة فيه. 1484 01:07:30,460 --> 01:07:32,740 لكن ما فائدة هذا التمرين إذا لم تكن أبداً، 1485 01:07:32,740 --> 01:07:34,750 كما تقول، تفعل أي شيء به. 1486 01:07:34,750 --> 01:07:37,280 وفي الواقع، أذكر من الشريحة منذ لحظة، 1487 01:07:37,280 --> 01:07:38,720 كيف أفعل شيئًا به؟ 1488 01:07:38,720 --> 01:07:40,820 حسنًا، هذه ليست الطريقة التي تفعل بها شيئًا به. 1489 01:07:40,820 --> 01:07:43,330 إذا مضيت قدمًا وشغلت هذا البرنامج الآن بنجاح، 1490 01:07:43,330 --> 01:07:46,270 ماذا سأرى في الواقع على الشاشة؟ 1491 01:07:46,270 --> 01:07:51,460 مرحبًا اسم حرفيا، م-ر-ح-ب-ا فاصلة، مسافة ا-س-م، من الواضح أنه غير صحيح. 1492 01:07:51,460 --> 01:07:52,840 إذًا كيف أدخل المتغير؟ 1493 01:07:52,840 --> 01:07:54,670 ماذا كانت الخدعة؟ 1494 01:07:54,670 --> 01:07:57,920 نعم، النسبة المئوية S أي سلسلة، رمز تنسيق، 1495 01:07:57,920 --> 01:07:59,800 إذا جاز التعبير-- ومن هنا جاء اسم printf. 1496 01:07:59,800 --> 01:08:03,010 وبعد ذلك أحتاج إلى تمرير وسيطة ثانية إلى printf، 1497 01:08:03,010 --> 01:08:06,670 وأفعل ذلك بكتابة فاصلة ثم اسم المتغير الذي أريد إدخاله. 1498 01:08:06,670 --> 01:08:09,020 لاحظ الآن أن هناك فاصلتين في هذا السطر هنا. 1499 01:08:09,020 --> 01:08:11,890 إذا قمت بالتكبير، لاحظ أن هناك فاصلتين، ولكن هناك فقط 1500 01:08:11,890 --> 01:08:14,680 وسيطتين أو مدخلين لـ printf. 1501 01:08:14,680 --> 01:08:17,830 عادةً ما يسمى المُدخل إلى وظيفة ما، وسيطة 1502 01:08:17,830 --> 01:08:19,730 أو يسمى أيضًا معلمة. 1503 01:08:19,730 --> 01:08:24,640 إذًا هناك فاصلتان، لكن هذه الفاصلة هي فاصلة باللغة الإنجليزية فقط تفصل مرحبًا 1504 01:08:24,640 --> 01:08:26,260 عن اسم الشخص. 1505 01:08:26,260 --> 01:08:30,400 هذه الفاصلة البيضاء هنا، تم ترميزها بالألوان لأن برنامج Sandbox يفعل ذلك لي 1506 01:08:30,400 --> 01:08:33,340 تفصل في الواقع-- عفوًا-- الوسيطة الأولى 1507 01:08:33,340 --> 01:08:35,300 من الوسيطة الثانية. 1508 01:08:35,300 --> 01:08:39,400 إذًا الآن، لثالث مرة، أظهر مرحبًا إدخال. 1509 01:08:39,400 --> 01:08:40,630 يا إلهي، شكرًا لك. 1510 01:08:40,630 --> 01:08:41,620 الآن نجح الأمر. 1511 01:08:41,620 --> 01:08:44,680 ما زال يظهر هذا الأمر الملغز الطويل جدًا باللون الأبيض، 1512 01:08:44,680 --> 01:08:45,340 ولكن لا مشكلة. 1513 01:08:45,340 --> 01:08:49,520 وهذا هو، مرة أخرى، الأمر الآلي الذي تجعله Make ممكنًا بالنسبة لنا. 1514 01:08:49,520 --> 01:08:52,900 ولكن حقيقة أنني لا أرى أي لون أحمر، وأي أخطاء، مجرد مؤشر الكتابة مجددًا 1515 01:08:52,900 --> 01:08:54,980 يعني أن برنامجي قد تم. 1516 01:08:54,980 --> 01:08:56,410 لذا دعوني أمضي قُدمًا وأفعل هذا-- 1517 01:08:56,410 --> 01:09:00,170 كيف أشغل برنامجًا إذا كان يسمى مرحبًا؟ 1518 01:09:00,170 --> 01:09:02,440 نعم، نقطة خط مائل مرحبًا، وسنرى لماذا لدينا 1519 01:09:02,440 --> 01:09:03,990 نقطة غبية في البداية. 1520 01:09:03,990 --> 01:09:06,330 يعني أساسًا، قم بتشغيل البرنامج المسمى مرحبًا 1521 01:09:06,330 --> 01:09:09,620 الموجود هنا في مجلدك الحالي على الخادم-- 1522 01:09:09,620 --> 01:09:10,850 نقطة خط مائل مرحبًا. 1523 01:09:10,850 --> 01:09:11,600 ما اسمك؟ 1524 01:09:11,600 --> 01:09:12,850 لطيف جدًا. 1525 01:09:12,850 --> 01:09:14,880 ديفيد، إدخال. 1526 01:09:14,880 --> 01:09:16,020 مرحبًا، ديفيد. 1527 01:09:16,020 --> 01:09:16,950 مثير للإعجاب. 1528 01:09:16,950 --> 01:09:20,390 دعونا نجري تغييرًا واحدًا، لأنني فعلت هذا مصادفةً في وقت سابق كما لاحظتم. 1529 01:09:20,390 --> 01:09:23,500 ماذا لو حذفت مثلًا واحدة من حروف n\ 1530 01:09:23,500 --> 01:09:26,250 هذا حرفيا الآن لا يخبر الكمبيوتر 1531 01:09:26,250 --> 01:09:28,210 أن يحرك المؤشر إلى خط آخر؟ 1532 01:09:28,210 --> 01:09:31,330 لذلك دعوني أمضي قدمًا وأعيد تشغيل البرنامج. 1533 01:09:31,330 --> 01:09:31,920 انتظروا دقيقة. 1534 01:09:31,920 --> 01:09:33,990 هذا يبدو الأمر نفسه. 1535 01:09:33,990 --> 01:09:37,770 أنا فقط غيرت التعليمات البرمجية، ولكنه لا يزال يتصرف بالطريقة نفسها بالضبط. 1536 01:09:37,770 --> 01:09:40,680 أين الالتباس الذي وقعت فيه؟ 1537 01:09:40,680 --> 01:09:41,840 لم أقم بتجمعيه. 1538 01:09:41,840 --> 01:09:44,670 على عكس سكراتش، المذهل لأنك فقط تضغط على العلم الأخضر 1539 01:09:44,670 --> 01:09:47,390 وهو يشغّل الرمز مجدّداً، ولدينا خطوة وسيطة ثانية. 1540 01:09:47,390 --> 01:09:49,080 يجب عليّ إعادة تشغيل التعليمات البرمجية. 1541 01:09:49,080 --> 01:09:50,580 الآن كيف يمكنك الخروج من برنامج؟ 1542 01:09:50,580 --> 01:09:51,530 يمكنني فقط الضغط على Enter. 1543 01:09:51,530 --> 01:09:54,430 يمكنك أيضًا الضغط على Control C للإلغاء، وهذا سيخرجك 1544 01:09:54,430 --> 01:09:56,120 مهما كان الالتباس الذي وقعت فيه. 1545 01:09:56,120 --> 01:09:58,550 دعوني أمضي قدمًا وأعيد التشغيل، make hello-- 1546 01:09:58,550 --> 01:09:59,870 يبدو هذا على ما يرام-- 1547 01:09:59,870 --> 01:10:02,500 نقطة خط مائل مرحبًا، إدخال. 1548 01:10:02,500 --> 01:10:05,540 حسنًا، هذا هو سبب وجود كل حروف n\. 1549 01:10:05,540 --> 01:10:07,830 دعوني أكبر الصور على ما يحدث. 1550 01:10:07,830 --> 01:10:11,560 أعني، لا يبدو الأمر مروعًا، ولكن بصراحة من المزعج نوعًا ما 1551 01:10:11,560 --> 01:10:13,580 أن يبدو برنامجي بهذه 1552 01:10:13,580 --> 01:10:15,070 الصورة عندما أكتب مدخل المستخدم. 1553 01:10:15,070 --> 01:10:16,370 أعني، هذا فقط يبدو غبيًا. 1554 01:10:16,370 --> 01:10:18,290 على الأقل، يجب أن أضيف مسافة. 1555 01:10:18,290 --> 01:10:20,460 ربما يمكنني وضع حرف n\ لتحريك الحرف. 1556 01:10:20,460 --> 01:10:21,680 هذه هي واجهة المستخدم الآن. 1557 01:10:21,680 --> 01:10:22,840 هذا ليس منطقيًا حقًا. 1558 01:10:22,840 --> 01:10:25,180 إنها مجرد جماليات، ولكن أعتقد أن هذا يبدو غبيًا. 1559 01:10:25,180 --> 01:10:27,850 ولهذا السبب كانت هناك حروف n\ طوال الوقت، 1560 01:10:27,850 --> 01:10:31,430 ولكن هذا هو السبب في أنهم يجب أن يكونوا هناك لإخبار الكمبيوتر بأن يضع 1561 01:10:31,430 --> 01:10:32,560 الأشياء حيث تريد. 1562 01:10:32,560 --> 01:10:34,810 بدلاً من ذلك، أتعلم ماذا، حسنًا، أنا لا أحب ذلك. 1563 01:10:34,810 --> 01:10:36,220 Control-C للإلغاء. 1564 01:10:36,220 --> 01:10:37,550 دعوني أعيد هذا مجدّدًا. 1565 01:10:37,550 --> 01:10:39,640 ماذا يحدث لو تخلصت من هذا؟ 1566 01:10:39,640 --> 01:10:42,290 واسمحوا لي أن أمضي قدمًا وأعيد تجميع التعليمات البرمجية أولاً 1567 01:10:42,290 --> 01:10:45,830 كما تلاحظون نقطة خط مائل مرحبًا إدخال. 1568 01:10:45,830 --> 01:10:50,840 حسنًا، لقد نظفت هذا الصداع الجمالي، إدخال. 1569 01:10:50,840 --> 01:10:54,960 أعني، إنها ليست المشكلة نفسها، لكن هذا يبدو غبيًا أيضًا 1570 01:10:54,960 --> 01:10:57,260 لأن علامة الدولار تمثل المحث حيث 1571 01:10:57,260 --> 01:11:00,150 من المفترض أن اكتب الأوامر ومع ذلك مرحبًا فاصلة ديفيد محث. 1572 01:11:00,150 --> 01:11:01,070 وهذه فوضى. 1573 01:11:01,070 --> 01:11:03,120 ولهذا السبب لدينا كل هذه الخطوط الجديدة. 1574 01:11:03,120 --> 01:11:06,290 الآن سألتم في وقت سابق، ماذا لو وضعتَ السطر الجديد في مكان آخر في السلسلة. 1575 01:11:06,290 --> 01:11:07,470 حسنًا، لنفترض أنني أفعل ذلك. 1576 01:11:07,470 --> 01:11:08,870 لنفترض أنني وضعت اثنين منهم. 1577 01:11:08,870 --> 01:11:11,580 دعوني أفعل هذا بلا مسافات على الإطلاق. 1578 01:11:11,580 --> 01:11:14,930 الآن هذا يبدو غريبًا بعض الشيء، ولكن الكمبيوتر سيفسر 1579 01:11:14,930 --> 01:11:19,790 هذا حرفيًا-- طباعة م-ر-ح-ب-ا فاصلة سطر جديد بديل في السلسلة 1580 01:11:19,790 --> 01:11:21,900 للنسبة المئوية S ثم خط جديد آخر. 1581 01:11:21,900 --> 01:11:26,340 إذًا كم عدد خطوط المُخرج التي سيعرضها هذا؟ 1582 01:11:26,340 --> 01:11:27,260 سمعت أربعة. 1583 01:11:30,040 --> 01:11:30,770 قيم أخرى؟ 1584 01:11:30,770 --> 01:11:31,390 لنرَ. 1585 01:11:31,390 --> 01:11:34,380 دعونا نمضي قدمًا ونكتب أظهر مرحبًا ثم شغل 1586 01:11:34,380 --> 01:11:39,840 نقطة خط مائل مرحبًا، ما اسمك كما ظهر من قبل، إدخال مرحبا فاصلة سطر جديد 1587 01:11:39,840 --> 01:11:43,540 ديفيد-- إذًا إجمالي أربعة سطور بالتأكيد أو سطرين فقط من الكمبيوتر 1588 01:11:43,540 --> 01:11:44,990 نفسه. 1589 01:11:44,990 --> 01:11:48,400 إذًا فقط للتلخيص، مع رمز مثل هذا 1590 01:11:48,400 --> 01:11:52,450 كم عدد الوظائف التي استخدمتها في هذا البرنامج بالتحديد؟ 1591 01:11:55,030 --> 01:11:56,320 كم عدد الوظائف؟ 1592 01:11:59,440 --> 01:12:01,610 إذًا هما اثنتان-- printf، التي كنا نستخدمها واحصل على 1593 01:12:01,610 --> 01:12:02,810 السلسلة، وهي الوظيفة الجديدة. 1594 01:12:02,810 --> 01:12:05,870 أين يتم إعلان السلسلة؟ 1595 01:12:05,870 --> 01:12:11,040 CS50 نقطة h،بينما يتم إعلان printf معلنة في مخرج المدخل القياسي IO.h القياسي. 1596 01:12:11,040 --> 01:12:15,270 بينما، السلسلة، هذا النوع من البيانات يأتي أيضًا من CS50 نفسه، 1597 01:12:15,270 --> 01:12:17,310 ثم استخدمنا رموز التنسيق، وقد استخدمنا 1598 01:12:17,310 --> 01:12:19,210 المتغيرات لتحقيق النتيجة نفسها. 1599 01:12:19,210 --> 01:12:20,550 ودعونا فقط نوضح هذا الأمر. 1600 01:12:20,550 --> 01:12:23,620 بريان وكريم، هل لديكما مانع أن تصعدا لثانية واحدة؟ 1601 01:12:23,620 --> 01:12:24,520 أو من هناك؟ 1602 01:12:24,520 --> 01:12:26,360 إيرين، تعالي. 1603 01:12:26,360 --> 01:12:28,320 لذلك فقط لجعل هذا واضحًا لأن هناك الآن 1604 01:12:28,320 --> 01:12:31,210 بعض المصطلحات التي نريد استخدامها. 1605 01:12:31,210 --> 01:12:31,710 لنرَ. 1606 01:12:31,710 --> 01:12:32,880 هل تريد أن تكون-- 1607 01:12:32,880 --> 01:12:34,200 ستحصل على "get string". 1608 01:12:34,200 --> 01:12:37,750 إذًا لدينا بعض بطاقات الأسماء هنا كما في الأحداث. 1609 01:12:37,750 --> 01:12:42,490 إذًا ستحصل إيرين على "get underscore string". 1610 01:12:42,490 --> 01:12:45,630 إذا كنت تريدين المضي قدما وارتداء هذه. 1611 01:12:45,630 --> 01:12:49,230 وبريان، تريد أن تكون printf. 1612 01:12:49,230 --> 01:12:51,510 إذًا نحن لن نؤدي جميع برامجنا الفعلية 1613 01:12:51,510 --> 01:12:53,270 لأن هذا سرعان ما سيتضح. 1614 01:12:53,270 --> 01:12:54,330 إذًا بريان هو printf. 1615 01:12:54,330 --> 01:12:58,010 حتى الآن رغم ذلك، لا يزال الأمر لطيفًا 1616 01:12:58,010 --> 01:13:00,060 أن لدي بعض الزملاء الذين أعمل معهم هنا 1617 01:13:00,060 --> 01:13:04,630 لأنني لا أريد حقًا فعل العمل الجاد كله لجعل الأمور تحدث. 1618 01:13:04,630 --> 01:13:07,320 فلو كنت بدلاً من ذلك المبرمج أو الموزع الموسيقي 1619 01:13:07,320 --> 01:13:10,920 لمجموعة كاملة من الأشياء التي تحدث، يمكنني بالفعل تنفيذ هذا الرمز الآن 1620 01:13:10,920 --> 01:13:11,700 مادية أكثر. 1621 01:13:11,700 --> 01:13:15,420 ورغم ذلك دعونا نركز، للحظة فقط على ماذا تكون الفوائد الأساسية. 1622 01:13:15,420 --> 01:13:18,420 واحد، يمكن للوظائف أخذ المدخلات. 1623 01:13:18,420 --> 01:13:21,630 تسمى هذه المدخلات وسيطات أو معلمات، 1624 01:13:21,630 --> 01:13:23,640 ويمكن للوظائف إرجاع الأشياء. 1625 01:13:23,640 --> 01:13:25,370 يمكنهم الحصول على قيم العودة. 1626 01:13:25,370 --> 01:13:27,540 Printf، على سبيل المثال، هل تأخذ المدخل؟ 1627 01:13:30,000 --> 01:13:31,710 ما هو مدخل printf، على سبيل المثال؟ 1628 01:13:34,370 --> 01:13:35,480 نعم، مثل مرحباً بالعالم. 1629 01:13:35,480 --> 01:13:39,680 أيًا كان ما تريد طباعته حسب التعريف هو المدخل إلى printf. 1630 01:13:39,680 --> 01:13:43,820 هل تعيد الطباعة قيمة حتى الآن؟ 1631 01:13:43,820 --> 01:13:45,720 إنها تفعل شيئًا ما على الشاشة بالتأكيد. 1632 01:13:45,720 --> 01:13:47,600 إنها تطبع الأشياء على الشاشة، لكننا لم 1633 01:13:47,600 --> 01:13:51,800 نشاهدها تعيد شيئًا لأننا لم نر ذلك مع علامة المساواة 1634 01:13:51,800 --> 01:13:52,390 إلى اليسار. 1635 01:13:52,390 --> 01:13:54,190 الآن اتضح أن printf تعيد أشياء. 1636 01:13:54,190 --> 01:13:56,780 إنها ليست مفيدة للاستخدام في كثير من الأحيان، ولكننا فقط 1637 01:13:56,780 --> 01:14:00,140 شاهدنا printf للتو تأخذ مدخلات-- أكثر من تلك المرة الأخرى. 1638 01:14:00,140 --> 01:14:04,210 "Get string" في الوقت نفسه-- هل تأخذ "get string" مدخلات؟ 1639 01:14:04,210 --> 01:14:06,350 كم عدد المدخلات؟ 1640 01:14:06,350 --> 01:14:09,470 واحد فقط، المحث الذي تريد أن يراه الإنسان. 1641 01:14:09,470 --> 01:14:11,450 كان المحث الأول الذي استخدمته هو ما اسمك. 1642 01:14:11,450 --> 01:14:12,950 كان يمكنني أن أجعل المحث أي شيء، ولكن هذا 1643 01:14:12,950 --> 01:14:14,570 السؤال الذي تسأله "get string". 1644 01:14:14,570 --> 01:14:16,730 هل تعيد "get string" قيمة؟ 1645 01:14:16,730 --> 01:14:17,330 نعم هي كذلك. 1646 01:14:17,330 --> 01:14:20,840 هذا بالطبع في سكراتش يسمى إجابة، مرمّز ضمنيًا كإجابة. 1647 01:14:20,840 --> 01:14:22,800 يمكننا تخزين أي متغير نريد. 1648 01:14:22,800 --> 01:14:24,920 لذلك دعوني أمضي قدمًا وأنفذ هذا البرنامج. 1649 01:14:24,920 --> 01:14:30,080 إيرين، اذهبي وأحضري لي سلسلة واسألي شخصًا، ما هو اسمه. 1650 01:14:30,080 --> 01:14:31,250 إذًا-- 1651 01:14:31,250 --> 01:14:32,250 إيرين: ما اسمك؟ 1652 01:14:32,250 --> 01:14:33,210 الجمهور: إليزابيث. 1653 01:14:38,460 --> 01:14:41,010 ديفيد: إذًا هي تكتب إليزابيث الآن. 1654 01:14:41,010 --> 01:14:42,420 لكن إيرين أخذت مدخلا مني. 1655 01:14:42,420 --> 01:14:44,960 إيرين، اذهبي واحصلي على اسم شخص ما و اسأليه، ما هو اسمه. 1656 01:14:44,960 --> 01:14:46,630 والآن أنتِ قد أنتجتِ مخرجًا لي. 1657 01:14:46,630 --> 01:14:47,670 شكرًا لكِ. 1658 01:14:47,670 --> 01:14:49,920 هذه هي القيمة المعادة، تخزين القيمة إليزابيث، 1659 01:14:49,920 --> 01:14:50,940 وأنا سأمضي قدمًا وآخذها بعيدًا 1660 01:14:50,940 --> 01:14:53,520 في متغير يسمى الاسم مثل هذه الورقة هنا. 1661 01:14:53,520 --> 01:14:56,450 حسنًا، بريان، هل يمكنك المضي قدمًا وإلقاء التحية على إليزابيث. 1662 01:15:09,450 --> 01:15:11,700 إذًا ما الذي يحدث هنا؟ 1663 01:15:11,700 --> 01:15:13,680 أنا فقط أقوم بعمل أقل. 1664 01:15:13,680 --> 01:15:15,180 أنا أكتب هذا البرنامج-- 1665 01:15:15,180 --> 01:15:17,780 إيرين، اذهبي للحصول على اسم شخص ما، بريان، هل يمكنك طباعة هذا. 1666 01:15:17,780 --> 01:15:19,620 وهذا ما كنت أفعله، البرمجة، 1667 01:15:19,620 --> 01:15:22,680 فقط تفويض الوظائف إلى وظائف أخرى أو في هذه الحالة 1668 01:15:22,680 --> 01:15:24,330 البشر الآخرين الذين يعرفون كيفية القيام بذلك. 1669 01:15:24,330 --> 01:15:27,120 وبصراحة، لا يتعين عليّ معرفة كيفية حصول إيرين على هذا الاسم. 1670 01:15:27,120 --> 01:15:28,050 هي حصلت عليه فقط. 1671 01:15:28,050 --> 01:15:31,650 لا يتعين عليّ معرفة كيف كتب بريان بهذا النوع الخاص من الأسلوب 1672 01:15:31,650 --> 01:15:33,090 الإنجليزي على الشاشة. 1673 01:15:33,090 --> 01:15:37,020 أنا أعرف فقط أنه يستطيع فعل ذلك، والآن برنامجي مكتمل. 1674 01:15:37,020 --> 01:15:39,030 شكرًا جزيلاً لكلٍ من هذين هنا. 1675 01:15:39,030 --> 01:15:42,280 سوف نستمر في مجرد لحظة على النحو التالي. 1676 01:15:42,280 --> 01:15:44,730 إذًا طوال هذا الوقت، كنا نعد من المسلمات 1677 01:15:44,730 --> 01:15:48,420 أن لدينا جهاز كمبيوتر فعلي يمكننا تنفيذ الرمز من خلاله، 1678 01:15:48,420 --> 01:15:52,920 وأقول دائمًا إن Intel بالداخل هذا الشعار السخيف الذي تراه بداخل 1679 01:15:52,920 --> 01:15:55,290 معظم أجهزة Mac والكمبيوتر الشخصي مع ما تملكه من أجهزة. 1680 01:15:55,290 --> 01:15:57,970 لكن وحدة المعالجة المركزية هي مجرد عقول للكمبيوتر. 1681 01:15:57,970 --> 01:16:00,300 وفي نهاية المطاف، تذكر أن الهدف 1682 01:16:00,300 --> 01:16:02,860 هو أن يحول الكمبيوتر فعليًا شيئًا مثل هذا-- 1683 01:16:02,860 --> 01:16:07,140 رمز المصدر-- إلى رمز جهاز فعلي، أصفار، وأحاد. 1684 01:16:07,140 --> 01:16:10,150 وكان هذا كل ما يفعله Clang لنا في الواقع. 1685 01:16:10,150 --> 01:16:13,110 بالطبع، قمنا فقط بإظهار قليل مما يمكننا القيام به. 1686 01:16:13,110 --> 01:16:15,100 اتضح أنها ستصبح، ليس فقط هذه 1687 01:16:15,100 --> 01:16:18,480 الأوامر التي يمكننا تشغيلها، ولكن السمات الأخرى لـ C 1688 01:16:18,480 --> 01:16:20,190 وعلى وجه الخصوص مكتبة CS50. 1689 01:16:20,190 --> 01:16:22,110 قد رأينا فقط حتى الآن كيفية الحصول على سلسلة، 1690 01:16:22,110 --> 01:16:24,440 ولكن يمكنك الحصول على أعداد صحيحة وأحرف وأشياء غير تقليدية 1691 01:16:24,440 --> 01:16:26,990 مثل القيم الكسرية والمضاعفات، التي تحاول بالفعل حل الكثير من 1692 01:16:26,990 --> 01:16:29,280 المشاكل التي يمكن أن تحدث في جهاز الكمبيوتر. 1693 01:16:29,280 --> 01:16:32,610 واتضح أنه يمكنك تخزين أنواع مختلفة من المتغيرات، وليس فقط 1694 01:16:32,610 --> 01:16:36,870 الأعداد الصحيحة والسلاسل، ولكن bool تشير لبوليان وchars تشير للحروف. 1695 01:16:36,870 --> 01:16:38,820 ويمكنك تنسيق تلك الأشياء في printf. 1696 01:16:38,820 --> 01:16:42,750 لم نر سوى النسبة المئوية S. قد ألمحت إلى النسبة المئوية i مسبقًا، 1697 01:16:42,750 --> 01:16:44,430 لكن ما يزال هناك عدد قليل منها. 1698 01:16:44,430 --> 01:16:46,190 ولكن لدينا الكثير من الاحتمالات هنا. 1699 01:16:46,190 --> 01:16:49,110 ولكن دعونا نمضي قدمًا ونأخذ، استراحة، لنقل، خمس دقائق لنمنح الجميع 1700 01:16:49,110 --> 01:16:51,940 قسطًا من الراحة، استمعوا إلى بعض الموسيقى، ولنعد بعد خمسة دقائق 1701 01:16:51,940 --> 01:16:56,910 ونغوص بشكل أعمق في برامج أكثر تطورًا بلغة C. 1702 01:16:56,910 --> 01:17:00,220 إذًا تذكّروا أننا بدأنا بمقارنة بعض كتل سكراتش 1703 01:17:00,220 --> 01:17:02,850 مع تعليمات برمجية بلغة C التماثلية، لكننا فى الواقع لم نستخدم 1704 01:17:02,850 --> 01:17:05,730 معظم تلك الكتل بلغة C فقط حتى الآن. 1705 01:17:05,730 --> 01:17:09,450 إذًا دعونا نجرب عددًا من الأمثلة، سأكتب بعضها بشكل سريع 1706 01:17:09,450 --> 01:17:11,610 في كتابة التعليمات البرمجية على لوحة المفاتيح الخاصة بي، بعضها 1707 01:17:11,610 --> 01:17:13,360 تناولناه بالفعل على مواقع الويب الخاصة بالدورات. 1708 01:17:13,360 --> 01:17:15,430 لذا يمكننا فتحهم لتوفير بعض الوقت. 1709 01:17:15,430 --> 01:17:17,220 ولكن اسمحوا لي أن ألفت انتباهكم إلى ما 1710 01:17:17,220 --> 01:17:20,140 يكون CS50 Sandbox لأن هذه كانت الخطوة التي تجاوزتها سابقًا. 1711 01:17:20,140 --> 01:17:23,610 يمكن استخدام CS50 Sandbox للبرمجة في مجموعة من اللغات. 1712 01:17:23,610 --> 01:17:25,920 وسنستخدمه مبدئيًا في الفصل الدراسي لـ C. 1713 01:17:25,920 --> 01:17:30,210 ولكن إذا كتبت بلغة Java مسبقًا أو Python أو أي عدد من اللغات، 1714 01:17:30,210 --> 01:17:33,510 عندما تنتقل إلى Sandbox.CS50.io، يمكنك ببساطة 1715 01:17:33,510 --> 01:17:35,220 اختيار اللغة التى تريد الكتابة بها. 1716 01:17:35,220 --> 01:17:37,200 ثم في الجزء السفلي، سترى أنه يمكنك 1717 01:17:37,200 --> 01:17:39,760 تحديد الملف الذي ترغب فى إنشائه مسبقًا. 1718 01:17:39,760 --> 01:17:44,340 على سبيل المثال، ما قمت به في وقت سابق هو أنني اخترت لغة C في الأعلى، ثم 1719 01:17:44,340 --> 01:17:46,770 كتبت في الأسفل Hello.C لأن ذلك 1720 01:17:46,770 --> 01:17:48,240 كان اسم الملف الذي أردته. 1721 01:17:48,240 --> 01:17:49,320 ثم نقرت فوق ابدأ. 1722 01:17:49,320 --> 01:17:53,680 والذى أرشدني إليه هذا بالتحديد هو الواجهة التي كتبنا فيها 1723 01:17:53,680 --> 01:17:57,720 hello.C منذ لحظات، حيث يظهر محرر التعليمات البرمجية الخاص بي في الأعلى هنا، 1724 01:17:57,720 --> 01:17:59,880 وتظهر النافذة الطرفية الخاصة بي في الجزء السفلي، 1725 01:17:59,880 --> 01:18:02,190 ثم يتاح لي بدء كتابة التعليمات البرمجية فقط. 1726 01:18:02,190 --> 01:18:04,120 هذا يوضح كيف وصلنا إلى ما كنا عليه. 1727 01:18:04,120 --> 01:18:07,080 وإذا كنت ترغب الآن في الاستمرار مع بعض من هذه الأمثلة، 1728 01:18:07,080 --> 01:18:09,780 لاحظ أننا أعددناهم مسبقًا على الموقع الإلكتروني للدورة. 1729 01:18:09,780 --> 01:18:13,320 ويمكنك بالفعل النقر فوق الروابط الموجودة على موقع الويب الخاص بالدورة 1730 01:18:13,320 --> 01:18:15,930 وفتح نسختك الخاصة من sandbox بواسطة تلك التعليمات البرمجية. 1731 01:18:15,930 --> 01:18:18,810 لذلك إذا كان Wi-Fi يساعدكم على هذا، فإنكم مرحب بكم لتصلحوا الأوامر نفسها 1732 01:18:18,810 --> 01:18:19,550 وتشغلوها وتنفذوها. 1733 01:18:19,550 --> 01:18:22,160 ولكن كل شيء أيضًا سيكون على موقع ويب الخاص بالدورة لاحقًا. 1734 01:18:22,160 --> 01:18:24,160 لذا لا تحتاجون إلى كتابة كل شيء. 1735 01:18:24,160 --> 01:18:26,080 لذلك دعونا نمضي قُدمًا ونقدم مجرد مثال سريع. 1736 01:18:26,080 --> 01:18:30,090 سأسمي هذه int.C فقط حتى يمكننا تعزيز 1737 01:18:30,090 --> 01:18:31,980 بعضًا مما فعلناه منذ لحظات. 1738 01:18:31,980 --> 01:18:35,880 بدلاً من "get a string" مثلما فعلنا مع مثالنا hello، دعوني أمضي قُدمًا 1739 01:18:35,880 --> 01:18:40,110 ونأخذ لنقل عددًا صحيحًا، ومن ثم نطبعه 1740 01:18:40,110 --> 01:18:41,660 تمامًا مثلما قمنا بطباعة اسم. 1741 01:18:41,660 --> 01:18:44,370 لذا يتوجب عليّ المضي قُدمًا، فقط من خلال الذاكرة العضلية، 1742 01:18:44,370 --> 01:18:47,610 أتذكر أنني أحتاج إلى standard IO.h من الأعلى 1743 01:18:47,610 --> 01:18:51,200 ثم int main void ثم الأقواس المتعرجة. 1744 01:18:51,200 --> 01:18:55,110 ثم يمكنني القيام بإجراء الحصول على المدخل فى الواقع. 1745 01:18:55,110 --> 01:18:57,330 إذًا كانت هناك دالة من قبل تسمي "get string". 1746 01:18:57,330 --> 01:18:59,160 اتضح أن هناك دالة أخرى تسمى 1747 01:18:59,160 --> 01:19:01,030 "get int" إذا كنت ترغب في الحصول على عدد صحيح. 1748 01:19:01,030 --> 01:19:03,480 يمكنني بالفعل كتابة "get int"، ويمكنني أن أقول شيئًا 1749 01:19:03,480 --> 01:19:04,890 مثل العدد الصحيح هو المحث. 1750 01:19:04,890 --> 01:19:07,110 مثل، مرحبًا، يا إنسان، يرجى منحي عددًا صحيحًا. 1751 01:19:07,110 --> 01:19:09,610 أحتاج إلى فاصلة منقوطة في نهاية هذا السطر. 1752 01:19:09,610 --> 01:19:15,060 ثم كيف يمكنني حقًا تخزين القيمة المعادة من "get int" في متغير؟ 1753 01:19:15,060 --> 01:19:18,240 تمامًا كما سلمتني إيرين صفحة من الورق فيها سلسلة، 1754 01:19:18,240 --> 01:19:23,010 استلمت ورقة فيها رقم، كيف يمكنني تخزينها في مكان ما؟ 1755 01:19:23,010 --> 01:19:26,970 ماذا ينبغي عليّ حرفيًا كتابته في السطر الخامس هنا؟ 1756 01:19:26,970 --> 01:19:28,590 "Int" مسافة ثم رقمًا أو شيئًا ما. 1757 01:19:28,590 --> 01:19:30,880 لذا سأسميه i فقط لأنه عدد صحيح، 1758 01:19:30,880 --> 01:19:32,750 ولكن يمكنني أن أسميه رقمًا أو أي شيء آخر. 1759 01:19:32,750 --> 01:19:34,840 ثم سأمضي قُدمًا وأطبع هذا. 1760 01:19:34,840 --> 01:19:42,340 إذًا printf-- دعنا نقول شيئًا مثل hello i فاصلة منقوطة. 1761 01:19:42,340 --> 01:19:43,540 ليس صحيحًا تمامًا، أليس كذلك؟ 1762 01:19:43,540 --> 01:19:45,750 سيقوم هذا حرفيًا بطباعة hello فاصلة. 1763 01:19:45,750 --> 01:19:47,500 كيف يمكنني حقًا استبدال شيء ما؟ 1764 01:19:47,500 --> 01:19:49,780 حسنًا، رأينا فقط كيفية الاستبدال في "strings"، 1765 01:19:49,780 --> 01:19:51,840 ولكن أعتقد أنني أجبت عن السؤال مسبقًا. 1766 01:19:51,840 --> 01:19:55,780 إذا كنت تستخدم النسبة المئوية i، فسيقول مرحبًا، يا كمبيوتر، ضع عددًا صحيحًا هنا. 1767 01:19:55,780 --> 01:19:58,630 ثم أحتاج فقط إلى وسيطة ثانية من printf 1768 01:19:58,630 --> 01:20:02,200 تمامًا كما سلمنا بريان وسيطة كذلك. 1769 01:20:02,200 --> 01:20:04,040 وقلت i. 1770 01:20:04,040 --> 01:20:05,980 أريد أن أقول i هنا. 1771 01:20:05,980 --> 01:20:08,110 ولكن هذا البرنامج ليس صحيحًا تمامًا بعد. 1772 01:20:08,110 --> 01:20:11,410 يوجد في ملف يسمى int. C لقد قمت بتضمين standard IO. h. 1773 01:20:11,410 --> 01:20:13,660 إنها في "main"، فما هو "main"؟ 1774 01:20:13,660 --> 01:20:16,240 حسنًا، اليوم على الأرجح لن نلقي بالاً إلى هذا. 1775 01:20:16,240 --> 01:20:19,750 لكن "int main void" هو ربما أكثر طريقة ملغزة 1776 01:20:19,750 --> 01:20:22,300 يمكنك القول إنها معادل النقر فوق العلم الأخضر. 1777 01:20:22,300 --> 01:20:24,550 هذا كل ما يفعل، و سنعود في غضون أسابيع 1778 01:20:24,550 --> 01:20:27,640 لمعرفة لماذا هو "int"، لماذا هو "main"، لماذا هو "void". 1779 01:20:27,640 --> 01:20:29,770 لكن الآن، قرّر البشر قبل سنوات أنه 1780 01:20:29,770 --> 01:20:33,370 عندما تكتب برنامجًا بلغة C وتريد بدء تشغيل البرنامج، 1781 01:20:33,370 --> 01:20:36,410 يجب عليك حرفيًا كتابة "int main void" مع تلك الأقواس 1782 01:20:36,410 --> 01:20:38,870 مع تلك الأقواس المتعرجة، وهو المعادل ل Scratch 1783 01:20:38,870 --> 01:20:40,570 عند النقر فوق العلم الأخضر. 1784 01:20:40,570 --> 01:20:43,050 لكن هذا البرنامج لن يجمّع، ولا أريد حتى 1785 01:20:43,050 --> 01:20:45,100 أن أشعر بضغط رؤية هذه الأخطاء. 1786 01:20:45,100 --> 01:20:47,110 كيف أبطلها؟ 1787 01:20:47,110 --> 01:20:50,800 نعم، أحتاج أن أعلم الكمبيوتر أن "get int" موجود، 1788 01:20:50,800 --> 01:20:55,390 وأنا أعرف مسبقًا كيفية القيام بذلك بواسطة تضمين المكتبة المسمّاة CS50. 1789 01:20:55,390 --> 01:20:58,050 من الناحية الفنية، CS50.h هو ملف رأسي. 1790 01:20:58,050 --> 01:21:01,990 .h يعني رأس الصفحة، وهو مجرد ملف يحتوي علي تعليمات برمجية بلغة C 1791 01:21:01,990 --> 01:21:03,500 حيث يتم إنشاء الدالات فيه. 1792 01:21:03,500 --> 01:21:07,090 علاوة على ذلك مرة أخرى، ولكن هذا فقط يعطينا حق الوصول إلى printf. 1793 01:21:07,090 --> 01:21:09,310 إذًا إذا لم أقم بأية أخطاء مطبعية، ينبغي عليّ أن أتمكن من تجميع 1794 01:21:09,310 --> 01:21:13,430 هذا البرنامج عن طريق تشغيل أي أمر؟ 1795 01:21:13,430 --> 01:21:14,120 Make int. 1796 01:21:14,120 --> 01:21:15,290 يمكنني كتابة Clang. 1797 01:21:15,290 --> 01:21:19,040 كان يمكنني عمل Clang dash O. لكن الآن سأقوم بذلك بعملها ببساطة باستخدام 1798 01:21:19,040 --> 01:21:23,870 make int فقط واجعل make تقوم بعملية تجميع هذا البرنامج آليًا. 1799 01:21:23,870 --> 01:21:25,680 عدم وجود رسائل خطأ أمر جيد. 1800 01:21:25,680 --> 01:21:26,970 دعوني أمضي قدمًا وأكبر الصورة-- 1801 01:21:26,970 --> 01:21:30,080 نقطة int خط مائل أعتقد أن هذا سيقوم بتشغيل البرنامج. 1802 01:21:30,080 --> 01:21:32,450 عدد صحيح، ماذا عن 42؟ 1803 01:21:32,450 --> 01:21:33,770 Hello 42. 1804 01:21:33,770 --> 01:21:35,110 ولاحظوا، يمكنني توفير الوقت الآن. 1805 01:21:35,110 --> 01:21:38,450 وإذا كنت أريد تشغيله مجدّدًا، لا يتعين عليّ كتابة int خط مائل طوال الوقت. 1806 01:21:38,450 --> 01:21:41,030 واتضح أن في هذا النوع من بيئة Linux، 1807 01:21:41,030 --> 01:21:44,300 يسمّى نظام التشغيل هذا Linux، يمكنك بالفعل الذهاب لأعلى ولأسفل 1808 01:21:44,300 --> 01:21:47,380 ورؤية الأوامر السابقة التي قمت بكتابتها والبعض الآخر الذى 1809 01:21:47,380 --> 01:21:48,870 يكون لنظام معين. 1810 01:21:48,870 --> 01:21:52,700 وإذا ذهبت لأعلى وضغطت enter، فيمكنك تشغيله مجددًا، وكتابة 50 هذه المرة، 1811 01:21:52,700 --> 01:21:54,980 وهذا مخرج آخر أيضًا. 1812 01:21:54,980 --> 01:21:59,420 إذًا أي أسئلة على مثال مثل هذا؟ 1813 01:21:59,420 --> 01:21:59,920 لا؟ 1814 01:21:59,920 --> 01:22:02,830 حسنا، دعني أمضي قدمًا، وسأقوم بتوفير الوقت في هذه البيئة. 1815 01:22:02,830 --> 01:22:07,130 يمكنني بالفعل إنشاء ملفات هنا إذا أردت عن طريق النقر فوق رمز المجلد، 1816 01:22:07,130 --> 01:22:07,940 والنقر فوق علامة زائد. 1817 01:22:07,940 --> 01:22:10,530 ثم يمكنني بالفعل قول أعطني ملفًا باسم float.C. 1818 01:22:10,530 --> 01:22:12,880 هذا يعادل العودة إلى القائمة الرئيسية 1819 01:22:12,880 --> 01:22:13,870 وكتابة اسم الملف. 1820 01:22:13,870 --> 01:22:15,140 سأفعلها فقط بشكل أسرع 1821 01:22:15,140 --> 01:22:17,030 الآن في هذه البيئة الرسومية. 1822 01:22:17,030 --> 01:22:18,580 وأريد أن أسميها float.C. 1823 01:22:18,580 --> 01:22:21,760 يعد اسمًا غريبًا إلى حد ما لأنه على الأقل عندما كبرتم فإنكم 1824 01:22:21,760 --> 01:22:23,890 تعلمتم على الأرجح الأعداد الصحيحة. 1825 01:22:23,890 --> 01:22:26,050 ربما تعلمت الأعداد الحقيقية والأرقام 1826 01:22:26,050 --> 01:22:28,450 التي يمكن أن تحتوي على نقاط عشرية ثم أشياء بعد النقطة العشرية. 1827 01:22:28,450 --> 01:22:30,400 في الكمبيوتر، تلك الأشياء ذات النقاط العشرية 1828 01:22:30,400 --> 01:22:33,420 تسمّى قيم كسرية حقيقية أو "floats". 1829 01:22:33,420 --> 01:22:36,010 ويمكنك التفكير في الأمر على أن النقطة العشرية يمكنها أن تطفو نوعًا ما 1830 01:22:36,010 --> 01:22:38,880 يمينًا أو يسارًا، حسب كبر أو صِغر العدد 1831 01:22:38,880 --> 01:22:41,440 أو مدى دقة الأرقام بعد النقطة العشرية. 1832 01:22:41,440 --> 01:22:42,460 هذا هو "float". 1833 01:22:42,460 --> 01:22:44,890 لذلك اسمحوا لي بالمضي قدمًا وتنفيذ برنامج مشابه جدًا 1834 01:22:44,890 --> 01:22:51,120 include CS50.h include, standard IO.h int main void-- 1835 01:22:51,120 --> 01:22:54,280 وبعد 20 عامًا من القيام بهذا، يمكنك أن تفعله بسرعة كبيرة. 1836 01:22:54,280 --> 01:22:57,350 الآن دعوني أحصل على float من المستخدم-- 1837 01:22:57,350 --> 01:23:00,670 رقم حقيقي قد يحتوي على نقطة عشرية به. 1838 01:23:00,670 --> 01:23:02,810 سأفعل ذلك بطريقة مختلفة قليلاً. 1839 01:23:02,810 --> 01:23:05,950 سأقوم بالتكبير، وسأقول، أهلاً، كمبيوتر، أعطني float، 1840 01:23:05,950 --> 01:23:07,750 كما يسمى نوع البيانات هذا-- 1841 01:23:07,750 --> 01:23:09,680 ليس int، ولا سلسلة ولكن float. 1842 01:23:09,680 --> 01:23:12,490 سأسميه f فقط لأنه يشير إلى float، وهو جيد 1843 01:23:12,490 --> 01:23:16,210 وموجز-- يساوي "get float". 1844 01:23:16,210 --> 01:23:17,830 ثم سأقول فقط float. 1845 01:23:17,830 --> 01:23:18,610 هذا هو المُحث. 1846 01:23:18,610 --> 01:23:20,860 يمكنني أن أجعل المحث باللون الأخضر أو أي شيء أريده. 1847 01:23:20,860 --> 01:23:22,160 والآن سأطبعه-- 1848 01:23:22,160 --> 01:23:26,110 printf hello f، لكني لا أريد f. 1849 01:23:26,110 --> 01:23:28,840 أريد في الواقع طباعة عنصر نائب وربما يمكنك 1850 01:23:28,840 --> 01:23:30,790 التخمين من الآن ما هو النمط-- 1851 01:23:30,790 --> 01:23:37,540 النسبة المئوية f التي تشير إلى "float" سطر جديد f فاصلة منقوطة. 1852 01:23:37,540 --> 01:23:41,380 إذًا هذا مثل البرنامج نفسه ثلاث مرات حتى الآن مع سلسلة، مع int، 1853 01:23:41,380 --> 01:23:42,050 وfloat. 1854 01:23:42,050 --> 01:23:44,590 ولكن مجدّدًا، إنها مجرد ذاكرة عضلية وانتقال عبر النمط، 1855 01:23:44,590 --> 01:23:46,420 لكن دعونا نرى ما يحدث بشكل مختلف هنا. 1856 01:23:46,420 --> 01:23:49,090 دعوني أمضي قدمًا وأكتب make float وأضغط enter. 1857 01:23:49,090 --> 01:23:50,360 حسنًا، جيد، لا أخطاء. 1858 01:23:50,360 --> 01:23:58,640 دعوني أكَبر هذا وأشغله الآن، نقطة خط مائل float. 1859 01:23:58,640 --> 01:24:00,350 ودعوني أمضي قدمًا وأكتب عددًا. 1860 01:24:00,350 --> 01:24:02,090 سأقول فقط 42. 1861 01:24:02,090 --> 01:24:05,650 ولكن الكمبيوتر لديه الآن القدرة على تخزين المزيد من الأعداد. 1862 01:24:05,650 --> 01:24:08,170 سابقًا كان مجرد عددًا صحيحًا حسب تعريف "int". 1863 01:24:08,170 --> 01:24:09,230 أما الآن فهو قيم كسرية "float". 1864 01:24:09,230 --> 01:24:12,940 إذًا برغم أن 42.0000 رقم دقيق جدًا، 1865 01:24:12,940 --> 01:24:17,500 هذا حقًا رقم حقيقي الآن، يخزن مقدارًا معينًا من الدقة هناك. 1866 01:24:17,500 --> 01:24:21,670 اتضح أنه رغم أننا يمكننا إجراء مزيد من الحسابات المشوقة. 1867 01:24:21,670 --> 01:24:25,180 اسمحوا لي بالمضي قدمًا وفتح هذا المثال أولاً. 1868 01:24:25,180 --> 01:24:26,970 سيسمّي هذا المثال int.C. 1869 01:24:26,970 --> 01:24:29,590 جتى لا يتعين عليّ كتابة كل شيء. 1870 01:24:29,590 --> 01:24:33,820 وفي ints.C، سنرى بعض الحسابات المكتوبة في التعليمات البرمجية التي 1871 01:24:33,820 --> 01:24:36,340 قمت بإنشائها مسبقًا فقط للتأكيد أنه يمكنكم بالفعل 1872 01:24:36,340 --> 01:24:38,320 القيام ببعض الحسابات الأساسية في برنامج. 1873 01:24:38,320 --> 01:24:41,550 يمكنني رؤية المزيد من التعليمات البرمجية هنا من خلال التمرير لأسفل، 1874 01:24:41,550 --> 01:24:43,960 ودعوني أمرر هذا لأعلى حتى يمكننا التركيز على "main". 1875 01:24:43,960 --> 01:24:46,510 واسمحوا لي بتكبير الأسطر القليلة الأولى. 1876 01:24:46,510 --> 01:24:50,020 في هذا السطر الأول، حصلت فقط على int، وأسميها x. 1877 01:24:50,020 --> 01:24:51,860 لم نستخدم متغيرًا يسمى x مؤخرًا. 1878 01:24:51,860 --> 01:24:52,480 لكننا سنستخدم الآن. 1879 01:24:52,480 --> 01:24:54,970 لا يختلف منطقيًا عن ذي قبل. 1880 01:24:54,970 --> 01:24:56,170 أحضر لي متغيرًا آخر هنا. 1881 01:24:56,170 --> 01:24:58,960 الآن نرى أنه يمكنك الحصول على متغيرات متعددة من المستخدم 1882 01:24:58,960 --> 01:25:00,010 تمامًا كما في سكراتش. 1883 01:25:00,010 --> 01:25:04,690 والآن في هذه السطور، الأشياء الملونة بالأخضر ليست سوى تنسيق 1884 01:25:04,690 --> 01:25:07,360 السلاسل-- فقط ماذا أريد أن يعرض printf؟ 1885 01:25:07,360 --> 01:25:12,580 حرفياً، في هذا السطر البارز هنا، أريد printf أن يعرض x زائد y 1886 01:25:12,580 --> 01:25:14,410 يساوي شيئًا ما. 1887 01:25:14,410 --> 01:25:15,370 ما هذا الشيء؟ 1888 01:25:15,370 --> 01:25:21,040 حسنًا، لاحظ أن الأمر الرائع في printf، هو أنه قبل أن يتم تمريره في مدخل، 1889 01:25:21,040 --> 01:25:23,040 يمكنك تنفيذ عمليات حسابية بسيطة. 1890 01:25:23,040 --> 01:25:26,140 لذا إذا كنت ترغب في إضافة x وy معًا، حرفيًا أجرِ x زائد y. 1891 01:25:26,140 --> 01:25:30,520 ثم مجموع هذه الأرقام هو ما سوف يتم تسليمه إلى printf كمدخل له. 1892 01:25:30,520 --> 01:25:33,430 تمامًا مثلما سلمت ورقة إيرين إلى بريان كمُدخل، 1893 01:25:33,430 --> 01:25:37,750 أنا لا أسلم x وy إلى بريان في هذه الحالة، بل x زائد y 1894 01:25:37,750 --> 01:25:39,910 أو قيمة ما، المجموع الفعلي. 1895 01:25:39,910 --> 01:25:43,510 وبالمثل، الطرح هو الشرطة الموجودة في لوحة المفاتيح. 1896 01:25:43,510 --> 01:25:45,540 وللضرب، لا يستخدم x. 1897 01:25:45,540 --> 01:25:46,780 سيكون هذا غريبًا، xxy. 1898 01:25:46,780 --> 01:25:49,660 ولكن تستخدم نجمة، أو رمز النجمة على لوحة المفاتيح الخاصة بك. 1899 01:25:49,660 --> 01:25:52,720 وللقسمة يستخدم الخط المائل الوحيد، والأخير هذا تقليدي قليلاً، 1900 01:25:52,720 --> 01:25:54,470 ولكننا سنستنتج بعض الاستخدامات لهذا. 1901 01:25:54,470 --> 01:25:58,810 يمكنك في الواقع إجراء عمليات حسابية معيارية أو ببساطة أكثر باقي القسمة. 1902 01:25:58,810 --> 01:26:05,990 إذا قمت بـ x نسبة مئوية y ، فسوف تسترجع ما تبقى من قسمة x على y. 1903 01:26:05,990 --> 01:26:07,040 وما هو الباقي؟ 1904 01:26:07,040 --> 01:26:14,530 إذا كان x 20 و y 10، حسنًا، فتُقسم 20 على 10 على مرتين بشكل مثالي. 1905 01:26:14,530 --> 01:26:16,100 لذا المتبقي هو 0، على سبيل المثال. 1906 01:26:16,100 --> 01:26:17,080 لكن هذا كان منذ بعض الوقت. 1907 01:26:17,080 --> 01:26:19,120 لذا، لاحظ، رغم ذلك ما هو الغريب هنا. 1908 01:26:19,120 --> 01:26:21,720 في هذا السياق، لا تعد النسبة المئوية عنصرًا نائبًا. 1909 01:26:21,720 --> 01:26:23,350 إنها ليست النسبة المئوية S. إنها ليست النسبة المئوية i. 1910 01:26:23,350 --> 01:26:27,340 إنها ليست نسبة مئوية، لاحظ أنها ليست داخل سلسلة تنسيق printf. 1911 01:26:27,340 --> 01:26:30,400 هذه هي حرفيًا الرياضيات، مشغّل الرياضيات 1912 01:26:30,400 --> 01:26:32,710 كما هو موضح باللون الأزرق المختلف هناك. 1913 01:26:32,710 --> 01:26:33,950 إذا قمتُ بالفعل بتشغيل هذا-- 1914 01:26:33,950 --> 01:26:36,000 لذلك دعوني أمضي قدمًا وأشغل هذا البرنامج. 1915 01:26:36,000 --> 01:26:37,840 سأمضي قدمًا وأكتب "make ints" الخاصة بنا -- 1916 01:26:37,840 --> 01:26:39,700 في صيغة الجمع لأن هذا هو اسم الملف-- 1917 01:26:39,700 --> 01:26:42,010 لنضغط على enter نقطة خط مائل "ints". 1918 01:26:42,010 --> 01:26:44,860 واسمحوا لي بتكبير الشاشة وإزالة ما فيها. 1919 01:26:44,860 --> 01:26:45,790 Enter. 1920 01:26:45,790 --> 01:26:47,780 أعطوني رقمًا. 1921 01:26:47,780 --> 01:26:48,620 سمعت رقم 2. 1922 01:26:48,620 --> 01:26:50,740 ورقمًا آخر. 1923 01:26:50,740 --> 01:26:52,120 سمعت رقم 10. 1924 01:26:52,120 --> 01:26:59,420 إذًا ولعلمكم 2 زائد 10 هو 12، 2 ناقص 10 هو سالب 8، 2 ضرب 10 هو 20، 1925 01:26:59,420 --> 01:27:03,460 2 مقسومة على 10 هو-- 1926 01:27:03,460 --> 01:27:07,960 2 mod y، أو 2، ثم خذ المتبقي عند القسمة على y 1927 01:27:07,960 --> 01:27:10,690 هو معني أن mod يساوي 2. 1928 01:27:10,690 --> 01:27:14,530 إذًا حصلت على أربعة صواب من أصل خمسة؟ 1929 01:27:14,530 --> 01:27:15,980 ما هو غير التقليدي قليلاً هنا؟ 1930 01:27:18,970 --> 01:27:23,090 نعم، 2 مقسومًة على 10؟ 1931 01:27:23,090 --> 01:27:27,850 مثل، أنا متأكد جدًا أن هذا قد يكون 2/10 أو ربما الخمس أو 0.2. 1932 01:27:27,850 --> 01:27:30,340 أعني، سأتقبل أي عدد من الإجابات لكن ليس 0. 1933 01:27:30,340 --> 01:27:31,450 إذًا ما الذي يحدث؟ 1934 01:27:31,450 --> 01:27:33,160 حسنًا، هذا أمر يتعلق التمثيل. 1935 01:27:33,160 --> 01:27:35,680 اتضح أنه في برنامج الكمبيوتر، قررنا 1936 01:27:35,680 --> 01:27:38,230 مقدمًا أنني سأقوم بتخزين الأعداد الصحيحة. 1937 01:27:38,230 --> 01:27:40,540 والأعداد الصحيحة شيء لا يحتوي على نقطة العشرية. 1938 01:27:40,540 --> 01:27:43,420 ومع هذا أنا هنا أحاول بصلف 1939 01:27:43,420 --> 01:27:46,660 قسمة الرقم 2، وهو عدد صحيح على الرقم 10، عدد صحيح، 1940 01:27:46,660 --> 01:27:48,860 وأتوقع شيئًا بخلاف العدد الصحيح. 1941 01:27:48,860 --> 01:27:53,150 لا، أنا حرفيًا أقوم بعملية حسابية ذات عدد صحيح. 1942 01:27:53,150 --> 01:27:56,080 إذًا ما الذي يفعله الكمبيوتر على مايبدو بصورة حدسية؟ 1943 01:27:56,080 --> 01:28:00,960 لماذا، عندما قسمة x على y كما فعلت في هذا السطر هنا-- 1944 01:28:00,960 --> 01:28:04,420 أو تحديدًا في هذا المثال الذي اقترحتموه، 2 مقسومة على 10-- 1945 01:28:04,420 --> 01:28:08,500 أين ذهب الناتج 2/10؟ 1946 01:28:08,500 --> 01:28:10,410 أجل، من الناحية التقنية ماذا؟ 1947 01:28:10,410 --> 01:28:13,210 من المفترض أن يكون 0.2 أو 0.2. 1948 01:28:13,210 --> 01:28:16,870 هذا في الواقع هو الحل لأنه، إذا كان 0.2 ولكن الأعداد الصحيحة 1949 01:28:16,870 --> 01:28:20,380 لا يمكنها تخزين النقاط العشرية أو أي شيء بعدها، ما الذي يتبقى لك؟ 1950 01:28:20,380 --> 01:28:22,330 مجرد الصفر في البداية. 1951 01:28:22,330 --> 01:28:25,300 إذًا، العمليات الحسابية للأعداد الصحيحة شيء جيد إذا كنت تطبقها مع الأعداد الصحيحة، 1952 01:28:25,300 --> 01:28:27,550 ولكن إذا كنت تريد القيام بعمليات حسابية للكسور، 1953 01:28:27,550 --> 01:28:29,630 ستحتاج إلى إجراء بعض التغييرات. 1954 01:28:29,630 --> 01:28:31,000 ولذا يمكنني إصلاح هذا. 1955 01:28:31,000 --> 01:28:34,240 في الواقع، اسمحوا لي بالمضي قدمًا وكتابة برنامج مختلف هنا. 1956 01:28:34,240 --> 01:28:37,110 اسمحوا لي بالمضي قدمًا وفتح floats.C من موقع الدورة 1957 01:28:37,110 --> 01:28:44,080 التدريبية. هذا سيعطيني هذا المثال،الذي يتم تنفيذه 1958 01:28:44,080 --> 01:28:46,720 باستخدام قيم كسرية حقيقية بدلاً من تلك. 1959 01:28:46,720 --> 01:28:49,470 لذا بمجرد تحميل هذا، سأرى برنامجًا كتبته مسبقًا. 1960 01:28:49,470 --> 01:28:53,320 إنه أقصر قليلاً لأنني الآن أهتم بالنظر في مشكلة واحدة. 1961 01:28:53,320 --> 01:28:56,500 ولاحظوا الآن أن x وy قيم كسرية وليست أعدادًا صحيحة، 1962 01:28:56,500 --> 01:28:57,790 نوع البيانات الآخر الذي يوجد. 1963 01:28:57,790 --> 01:29:00,700 وأنا استخدام "get float"، والذي يأتي أيضًا من من مكتبة CS50. 1964 01:29:00,700 --> 01:29:03,730 ثم إن هذا السطر مشابه تقريبًا، ولكن أتعرف ماذا؟ 1965 01:29:03,730 --> 01:29:04,780 اسمحوا لي بتعديل هذا. 1966 01:29:04,780 --> 01:29:06,610 اسمحوا لي بجعله مشابهًا تمامًا. 1967 01:29:06,610 --> 01:29:10,670 هذا السطر الآن الذي قمت بتحديده هو السطر نفسه تمامًا كالسابق. 1968 01:29:10,670 --> 01:29:12,710 لذلك إذا كتبت في الرقم نفسه-- 1969 01:29:12,710 --> 01:29:18,460 إذًا دعونا نمضي قُدمًا بالتكبير وmake floats plural and dot خط مائل 1970 01:29:18,460 --> 01:29:19,180 floats. 1971 01:29:19,180 --> 01:29:23,850 سأقدم 2 و10، ويجب أن آمل في رؤية ماذا الآن؟ 1972 01:29:23,850 --> 01:29:25,590 0.2. 1973 01:29:25,590 --> 01:29:27,780 هذا جيد جدًا ودقيق جدًا. 1974 01:29:27,780 --> 01:29:30,090 ولكن أتعرف ماذا؟ 1975 01:29:30,090 --> 01:29:35,060 أكره أن أقول لكم هذا، ولكن دعونا ننظر أبعد قليلاً. 1976 01:29:35,060 --> 01:29:36,770 يتضح بشكل افتراضي، عندما تستخدم النسبة 1977 01:29:36,770 --> 01:29:41,630 المئوية f، سترى قليل من الأرقام العشرية، مثل 5 أو هكذا تبدو، بشكل افتراضي. 1978 01:29:41,630 --> 01:29:43,760 اسمحوا لي قليلاً برؤية المزيد. 1979 01:29:43,760 --> 01:29:48,380 كان هذا واحد واحد، اثنين، ثلاث، أربع، خمس، ست 1980 01:29:48,380 --> 01:29:49,750 نقاط بعد العلامة العشرية. 1981 01:29:49,750 --> 01:29:50,450 لذلك أتعلم ماذا؟ 1982 01:29:50,450 --> 01:29:53,000 سأقول، مهلاً، أيها الكمبيوتر، أعطني سبع نقاط عشرية. 1983 01:29:53,000 --> 01:29:54,920 هذا يبدو مشفرًا تمامًا ويتعين عليك فقط 1984 01:29:54,920 --> 01:29:57,470 تذكر هذا نوعًا ما أو نسخه احتياطيًا إذا نسيت. 1985 01:29:57,470 --> 01:30:01,220 إذا قمت بوضع نقطه ورقم بين النسبة المئوية وf، 1986 01:30:01,220 --> 01:30:03,680 هذه هي الطريقة المشفرة لإخبار الكمبيوتر بإظهار 1987 01:30:03,680 --> 01:30:06,350 float ولكن مع العديد من الأرقام العشرية هذه، رجاءً. 1988 01:30:06,350 --> 01:30:10,600 وهذا يعطيني سبع أرقام عشرية، غريب كما يبدو التعبير. 1989 01:30:10,600 --> 01:30:12,770 نأمل الآن فقط في رؤية المزيد من الأصفار. 1990 01:30:12,770 --> 01:30:15,950 اسمحوا لي بالمضي قُدمًا وmake floats، واسمحوا لي بالمضي قُدمًا 1991 01:30:15,950 --> 01:30:20,600 وبالتكبير وعمل نقطة خط مائل floats 2 10 enter. 1992 01:30:20,600 --> 01:30:23,430 حسنًا ، لا تزال صحيحة. 1993 01:30:23,430 --> 01:30:25,820 اسمحوا لي بالتحلي بالقليل من الفضول. 1994 01:30:25,820 --> 01:30:28,730 دعونا نرى الكثير من الأصفار، مثلاً 50 صفرًا. 1995 01:30:28,730 --> 01:30:33,020 اسمحوا لي بالنزول هنا وكتابة make floats، لأنني غيرت التعليمات البرمجية، 1996 01:30:33,020 --> 01:30:37,400 نقطة خط مائل floats 2 10. 1997 01:30:37,400 --> 01:30:41,750 كذب مدرسو المدرسة الابتدائية عليكم. 1998 01:30:41,750 --> 01:30:50,150 2 مقسومة على 10 ليست 0.20000 إلى ما لا نهاية. 1999 01:30:50,150 --> 01:30:59,510 فهي على ما يبدو 0.20000000298023223876953125 ثم 2000 01:30:59,510 --> 01:31:00,560 كل تلك الأصفار. 2001 01:31:00,560 --> 01:31:03,600 ماذا يجري حقًا؟ 2002 01:31:03,600 --> 01:31:04,670 أين الخلل؟ 2003 01:31:04,670 --> 01:31:05,750 أين خطأي؟ 2004 01:31:05,750 --> 01:31:07,450 أين سوء الفهم لدي؟ 2005 01:31:10,050 --> 01:31:13,580 ما هو التفسير لهذا؟ 2006 01:31:13,580 --> 01:31:18,710 حسنًا، ماذا لو قلت لكم أن داخل جهاز الكمبيوتر الخاص بكم شيئًا كهذا؟ 2007 01:31:18,710 --> 01:31:21,800 هذه هي ذاكرة الوصول العشوائي أو الذاكرة، وربما كنت تعرف هذه الفكرة بشكل عام. 2008 01:31:21,800 --> 01:31:23,360 إتها فقط تخزن الملفات. 2009 01:31:23,360 --> 01:31:24,710 تخزن الموسيقى ومقاطع الفيديو. 2010 01:31:24,710 --> 01:31:26,300 أنت بحاجة إلى ذاكرة، نوع ما من المساحة. 2011 01:31:26,300 --> 01:31:28,310 مساحة القرص الثابت هي التخزين الدائم. 2012 01:31:28,310 --> 01:31:31,830 الرام، أو ذاكرة الوصول العشوائي، هي مساحة تخزين مؤقتة. 2013 01:31:31,830 --> 01:31:34,330 لذا عندما يكون الكمبيوتر المحمول مفتوحًا وأجهزة كمبيوتر سطح المكتب لديك قيد التشغيل 2014 01:31:34,330 --> 01:31:37,250 أو أن هاتفك مزودًا بالطاقة، وكنت تستخدم ذاكرة الوصول العشوائي لجميع البرامج 2015 01:31:37,250 --> 01:31:38,210 التي تقوم بتشغيلها في الوقت نفسه. 2016 01:31:38,210 --> 01:31:40,730 إذا قمت بفتح ملف، يتم تخزين هذا الملف في ذاكرة الوصول العشوائي، 2017 01:31:40,730 --> 01:31:42,690 ولكن يتم تخزينه بشكل دائم على محرك الأقراص الثابت لديك. 2018 01:31:42,690 --> 01:31:44,230 لذلك توجد أنواع مختلفة من الذاكرة. 2019 01:31:44,230 --> 01:31:45,860 ولكن لاحظ، هذا تم تكبيره. 2020 01:31:45,860 --> 01:31:49,740 في الواقع، هذا في حجم بوصتين وربما بوصة من حيث الطول. 2021 01:31:49,740 --> 01:31:52,850 إذًا فهي صغيرة جدًا، ولكن لا يهم حقًا مدى حجمها. 2022 01:31:52,850 --> 01:31:55,460 ما يهم فقط أنها محدودة من حيث الحجم. 2023 01:31:55,460 --> 01:31:58,850 لديكم أجهزة مادية في الدورات لديك أو في جيوبك أو في البيت 2024 01:31:58,850 --> 01:32:02,390 التي تكون كبيرة جدًا ولذلك لديها فقط الكثير من الأجزاء 2025 01:32:02,390 --> 01:32:05,300 وبالتالي لا يكون لديها إلا الكثير من الترانزستورات 2026 01:32:05,300 --> 01:32:07,280 وغيرها من الأجهزة التي تقوم في الواقع 2027 01:32:07,280 --> 01:32:09,390 بعمل تخزين المعلومات. 2028 01:32:09,390 --> 01:32:14,120 وإذا كان لديك مقدار محدود من الذاكرة، كيف سنقوم 2029 01:32:14,120 --> 01:32:18,530 بتمثيل عدد غير محدود من الأرقام؟ 2030 01:32:18,530 --> 01:32:20,330 لأني أذكر من المدرسة الابتدائية أنني 2031 01:32:20,330 --> 01:32:23,490 تعلمت أنه يوجد عدد غير محدود من الأرقام، بالتأكيد الأرقام الحقيقة، حيث 2032 01:32:23,490 --> 01:32:25,590 يمكن للنقطة العشرية أن تستمر إلى الأبد. 2033 01:32:25,590 --> 01:32:29,120 هذه مشكلة إذا كنت تريد أن تمثل جميع الأرقام الممكنة 2034 01:32:29,120 --> 01:32:35,250 في الكون، والذي هو عدد لا نهائي، مع كمية محدودة من الأجهزة. 2035 01:32:35,250 --> 01:32:39,620 لذا في مرحلة ما، يبدأ جهاز الكمبيوتر الخاص بك في اختصار الأمور. 2036 01:32:39,620 --> 01:32:42,530 وما تراه حقًا هنا هو قريب 2037 01:32:42,530 --> 01:32:47,150 كما يمكن للكمبيوتر الوصول إلى تخزين هذا الكسر بالنسبة لك بالضبط، 2038 01:32:47,150 --> 01:32:48,240 وتحليت بالقليل من الجشع. 2039 01:32:48,240 --> 01:32:50,520 ونظرت قليلا بعيدًا إلي اليمين. 2040 01:32:50,520 --> 01:32:53,450 وقلت، هذه قيم صغيرة متناهية الصغر. 2041 01:32:53,450 --> 01:32:56,440 إنه ليس خطأ كبيرًا، ولكنه خطأ 2042 01:32:56,440 --> 01:32:58,560 لأنه لا يمكن توقع أن يقوم الكمبيوتر بتمثيل 2043 01:32:58,560 --> 01:33:01,980 عدد لا نهائي من القيم باستخدام مقدار محدود من الذاكرة. 2044 01:33:01,980 --> 01:33:07,430 يجب أن تلتوي هنا أو هناك وتكون غير دقيقة، إذا جاز التعبير. 2045 01:33:07,430 --> 01:33:08,390 إذًا هل هذه مشكلة؟ 2046 01:33:11,490 --> 01:33:14,160 أعني، لم نكن لنعرف يومًا هذا لو لم أكن جشعًا 2047 01:33:14,160 --> 01:33:19,070 ونظرت إلى 50 رقمًا عشريًا بدلاً من من 7، والذي كان دقيقًا جدًا. 2048 01:33:19,070 --> 01:33:19,820 هل هذه مشكلة؟ 2049 01:33:22,400 --> 01:33:24,230 نعم، لماذا؟ 2050 01:33:24,230 --> 01:33:25,390 لماذا؟ 2051 01:33:25,390 --> 01:33:28,410 الحضور: إذا كنت تستخدم الدالة المساوية، [غير مسموع].. 2052 01:33:28,410 --> 01:33:29,710 ديفيد: نعم، هذه إجابة جيدة. 2053 01:33:29,710 --> 01:33:33,910 منطقيًا، إذا بدأت في استخدام يساوي يساوي لمقارنة الأشياء من أجل المساواة، 2054 01:33:33,910 --> 01:33:37,110 سيكون من الصعب حقًا بالنسبة لي من أي وقت مضى مقارنة شيء لأجل 2/10 2055 01:33:37,110 --> 01:33:39,160 كما أنها قيمة لأنني سيتعين عليّ حرفيًا 2056 01:33:39,160 --> 01:33:43,060 تذكر أو كتابة أو توضيح هذه القيمة ومقارنتها مع ذلك 2057 01:33:43,060 --> 01:33:45,680 وليست مجرد مقارنة على نحو غير مضبوط مع 0.2. 2058 01:33:45,680 --> 01:33:49,090 وهذا صحيح، يجب عليك في الواقع عدم مقارنة قيم الـ floating 2059 01:33:49,090 --> 01:33:50,740 في التعليمات البرمجية للمساواة. 2060 01:33:50,740 --> 01:33:53,770 ربما يمكن أن أنطلق باستخدام أقل من أو أكثر من، 2061 01:33:53,770 --> 01:33:57,850 ولكن حتى ذلك الحين سيكون بعيدًا قليلاً عن ما أتوقع. 2062 01:33:57,850 --> 01:34:00,460 لماذا قد يكون هذا الخطأ مثيرًا للقلق؟ 2063 01:34:03,270 --> 01:34:06,330 متى لا تريد أن يكون جهاز الكمبيوتر الخاص بك غير دقيق؟ 2064 01:34:06,330 --> 01:34:07,140 ما هي المجالات؟ 2065 01:34:07,140 --> 01:34:08,870 ما هي العوالم خارج الفصل الدراسي؟ 2066 01:34:08,870 --> 01:34:10,560 أجل؟ 2067 01:34:10,560 --> 01:34:11,180 ما هذا؟ 2068 01:34:11,180 --> 01:34:12,020 الجمهور: صاروخ. 2069 01:34:12,020 --> 01:34:18,120 ديفيد: نعم، الصواريخ، أو أي شيء يتضمن الرياضيات والفيزياء والخطر. 2070 01:34:18,120 --> 01:34:21,320 لا تريد أن تكون الأرقام بعيدة بعض الشيء. 2071 01:34:21,320 --> 01:34:23,490 وإذا كنت تفكر في ذلك، فالصواريخ هي مثال جيد 2072 01:34:23,490 --> 01:34:26,580 لأنني لا أعرف الكثير عن الصواريخ، لكنني أعرف أنهم ينطلقون بسرعة كبيرة 2073 01:34:26,580 --> 01:34:28,710 وربما توجد زوايا متضمنة لأنك 2074 01:34:28,710 --> 01:34:30,490 تحاول الحفاظ عليها على مسار ما. 2075 01:34:30,490 --> 01:34:31,230 وهذا جيد. 2076 01:34:31,230 --> 01:34:33,210 ولكن إذا كان مسارك بعيدًا قليلاً 2077 01:34:33,210 --> 01:34:35,580 وسينطلق شيء ما بسرعة كبيرة وبعيدًا جدًا، 2078 01:34:35,580 --> 01:34:40,590 أنا متأكد في نهاية المطاف أن صور عدم الدقة الصغيرة تلك ستبدأ في الزيادة. 2079 01:34:40,590 --> 01:34:43,320 وبالفعل، كانت توجد حوادث تاريخية 2080 01:34:43,320 --> 01:34:46,350 حيث هذا النوع من عدم الدقة، في الواقع، يزداد 2081 01:34:46,350 --> 01:34:50,050 في مجال العمليات العسكرية أو في العمليات المالية. 2082 01:34:50,050 --> 01:34:53,280 في الواقع، إذا سبق لك أن شاهدت فيلم Office Space أو Way Back أو Superman 3، 2083 01:34:53,280 --> 01:34:56,580 هكذا يجمع بعض الناس بعض المال لأنهم فقط 2084 01:34:56,580 --> 01:35:00,480 احتفظوا كل كسور السنتات التي كانت أنظمة الكمبيوتر 2085 01:35:00,480 --> 01:35:01,360 تتجاهلها. 2086 01:35:01,360 --> 01:35:02,910 وفي النهاية، تبدأ في الزيادة. 2087 01:35:02,910 --> 01:35:06,660 قصة قصيرة جدًا، في أي وقت لديك مجموعات بيانات كبيرة علمية أو مالية 2088 01:35:06,660 --> 01:35:10,770 أو أي نوع من مجموعات البيانات الكبيرة التي تتضمن أعدادًا كبيرة والكثير منها 2089 01:35:10,770 --> 01:35:13,140 والكثير من الوقت، هذه مشكلة. 2090 01:35:13,140 --> 01:35:16,770 ويقترح هذا تقريبًا عليك عدم استخدام لغة C أو ترك أجهزة الكمبيوتر وحدها 2091 01:35:16,770 --> 01:35:18,180 ما لم نطلب هذا بالفعل. 2092 01:35:18,180 --> 01:35:21,180 الآن كمفسد لتشويق الأحداث، فقد قام البشر بالتخلص من هذه المشكلة، 2093 01:35:21,180 --> 01:35:25,890 ويمكنك استخدام المزيد والمزيد من وحدات البت ولكن ليس عددًا لا نهائيًا. 2094 01:35:25,890 --> 01:35:27,890 في مرحلة ما يجب عليك رسم خط، ولكن لهذا 2095 01:35:27,890 --> 01:35:29,940 السبب، على سبيل المثال، قد تقوم بورصة الأسهم فقط 2096 01:35:29,940 --> 01:35:31,860 بتمثيل اثنتين من النقاط العشرية للدقة 2097 01:35:31,860 --> 01:35:35,500 بالنسبة للدولارات أو ربما تكون أربع نقاط عشرية للآلف للدولارات 2098 01:35:35,500 --> 01:35:36,000 والسنتات. 2099 01:35:36,000 --> 01:35:38,250 وعليهم فقط أن يقرروا، هذه هي الدقة التي 2100 01:35:38,250 --> 01:35:39,610 يمكننا بالفعل تخزينها بدقة. 2101 01:35:39,610 --> 01:35:43,350 لكن عليك أن تقرر كيف تتعامل مع هذا وليس مجرد تجاهل المشكلة. 2102 01:35:43,350 --> 01:35:44,700 لكن يمكننا أن نفعل ما هو أفضل قليلاً. 2103 01:35:44,700 --> 01:35:45,450 أتعلم ماذا؟ 2104 01:35:45,450 --> 01:35:48,240 يتضح أنه في معظم أجهزة الكمبيوتر أن float، 2105 01:35:48,240 --> 01:35:50,080 تأخذ كمية محدودة من المساحة، نعم، 2106 01:35:50,080 --> 01:35:54,000 ولكن على وجه التحديد للغاية 32 بت من المساحة أو 4 من وحدات البايت. 2107 01:35:54,000 --> 01:35:55,440 وحدة بايت، تذكر، تساوي 8 من وحدات البت. 2108 01:35:55,440 --> 01:35:59,580 إذًا 4 وحدات بايت تساوي 32 وحدة بت، وهذه مجرد وحدة قياس مشتركة. 2109 01:35:59,580 --> 01:36:00,630 لكن توجد واحدة أخرى. 2110 01:36:00,630 --> 01:36:03,450 اتضح أنه، إذا كنت تريد ضعف عدد وحدات البت، 2111 01:36:03,450 --> 01:36:07,020 يمكنك حرفيًا استخدام نوع بيانات يسمى الضعف. 2112 01:36:07,020 --> 01:36:11,550 وفي مكتبة CS50، توجد دالة تسمى "get double". 2113 01:36:11,550 --> 01:36:17,070 وإذا مضيت قُدمًا وفعلت ذلك هنا، يمكنني الآن إعادة تجميع هذه التعليمات البرمجية، 2114 01:36:17,070 --> 01:36:20,820 make floats، على الرغم من أنها ليست من أنواع الـ float من الناحية التقنية بعد الآن. 2115 01:36:20,820 --> 01:36:24,210 واسمحوا لي بالمُضي قُدمًا وكتابة نقطة خط مائل floats enter، 2116 01:36:24,210 --> 01:36:26,700 ودعوني أكتب 2 و10. 2117 01:36:26,700 --> 01:36:29,460 والآن لا يزال الأمر غير دقيق. 2118 01:36:29,460 --> 01:36:32,890 لكن لاحظ، بدلاً من سبعة أصفار، التي أعتقد أنني حصلت عليها من قبل، 2119 01:36:32,890 --> 01:36:39,000 الآن لدي 1، 2، 3، 4، 5، 6، 7، 8، 9، 10، 11، 12، 13، 14، 15 من الأصفار. 2120 01:36:39,000 --> 01:36:42,090 لذلك فقد دفعت المشكلة نوعًا ما للخارج أكثر، إذا جاز التعبير، 2121 01:36:42,090 --> 01:36:43,010 لذلك فهذا أكثر دقة. 2122 01:36:43,010 --> 01:36:43,890 لكنها ليست مثالية. 2123 01:36:43,890 --> 01:36:46,290 لا يمكنك الحصول على قيم مثالية مؤكدة إذا كنت 2124 01:36:46,290 --> 01:36:49,770 تريد أن تكون قادرًا على تمثيل نطاق لا نهائي. 2125 01:36:49,770 --> 01:36:53,340 هل توجد أي أسئلة حول هذا؟ 2126 01:36:53,340 --> 01:36:55,180 وسنعود إلى بعد التضمينات. 2127 01:36:55,180 --> 01:36:56,610 أجل، هنا. 2128 01:36:56,610 --> 01:36:58,490 الجمهور: إذًا هل سيكون دائمًا أفضل إذا استخدمت 2129 01:36:58,490 --> 01:37:00,390 doubles لأنها أكثر دقة؟ 2130 01:37:00,390 --> 01:37:01,270 ديفيد: سؤال جيد. 2131 01:37:01,270 --> 01:37:03,880 هل سيكون من الأفضل دائمًا استخدام doubles نظرًا لأنها أكثر دقة؟ 2132 01:37:03,880 --> 01:37:06,910 الجواب باختصار، نعم، ولكننا سنعرف بشكل موضوعي في هذه الدورة 2133 01:37:06,910 --> 01:37:09,530 وعلوم الكمبيوتر بشكل عام أنه توجد دائمًا مقايضة. 2134 01:37:09,530 --> 01:37:13,660 ونعم، إذا كنت تستخدم double، سوف تتجنب هذه المشكلة بشكل أكثر قليلاً، 2135 01:37:13,660 --> 01:37:16,380 ولكن ما هو الثمن الذي ستدفعه، إذا جاز التعبير؟ 2136 01:37:16,380 --> 01:37:19,340 ربما طاقة المعالجة لأنه سيضطر إلى التعامل مع المزيد من وحدات البت في وقت واحد، 2137 01:37:19,340 --> 01:37:22,630 وبشكل حرفي أكثر، المزيد من المساحة. 2138 01:37:22,630 --> 01:37:24,590 أعني، بالطبع يمكننا أن نأخذ الحل الخاص بك، ولكن أنا 2139 01:37:24,590 --> 01:37:26,210 سأحاسبك ضعف عدد وحدات البت. 2140 01:37:26,210 --> 01:37:29,240 وقديمًا، منذ عقود مضت، عندما تم اختراع لغة C لأول مرة 2141 01:37:29,240 --> 01:37:33,140 وكانت أجهزة الكمبيوتر ظاهرة فعلًا في المشهد، كان إنفاق ضعف عدد وحدات البت، 2142 01:37:33,140 --> 01:37:35,840 حتى لو كان فقط 32 أكثر من الأصفار الصغيرة والآحاد، 2143 01:37:35,840 --> 01:37:38,870 وكان هذا مكلفًا بالفعل من الجانب المالي، ويمثل زيادة. 2144 01:37:38,870 --> 01:37:40,870 وحتى اليوم، إذا أردت أن تشغل المزيد من المساحة، 2145 01:37:40,870 --> 01:37:42,500 هذا جيد، لكنك ستنفق. 2146 01:37:42,500 --> 01:37:44,450 مساحة أكبر، وبالتالي مال أكثر، وبالتالي 2147 01:37:44,450 --> 01:37:46,250 يكون لديك مساحة أقل متوفرة لأشياء أخرى. 2148 01:37:46,250 --> 01:37:47,300 إذًا، إنها مجرد مقايضة. 2149 01:37:47,300 --> 01:37:51,650 وعليك أن تقرر، باعتبارك بشري ذكي، 2150 01:37:51,650 --> 01:37:55,200 حيث تكون نقطة الانعطاف الصحيحة بين ما هو أكثر أهمية. 2151 01:37:55,200 --> 01:37:59,890 دعوني أقدم مثالاً مختلفاً جداً يسمى الآن التكافؤ، كمجرد مثال. 2152 01:37:59,890 --> 01:38:06,320 ودعني أسأل هذا كيف تعرف إذا كان الرقم زوجي أو فردي؟ 2153 01:38:06,320 --> 01:38:08,160 ما هي الطريقة؟ 2154 01:38:08,160 --> 01:38:12,280 نعم، إذا كان مقسومًا على 2-- لذلك 0 و2 و4 و6 2155 01:38:12,280 --> 01:38:15,640 تكون زوجية بسبب أنه، إذا قسمتها على 2 لا تحصل على باقي. 2156 01:38:15,640 --> 01:38:18,100 لذلك في الواقع، إذا كنت ترغب فقط في رؤية مثال سريع لماذا 2157 01:38:18,100 --> 01:38:20,720 قد تستخدم ما تبقى، حتى وإن كان خارج السياق. 2158 01:38:20,720 --> 01:38:21,940 إليك مثال عن التكافؤ. 2159 01:38:21,940 --> 01:38:25,750 التكافؤ هو مجرد مصطلح يشير إلى إلى زوجي أو فردي في هذا السياق. 2160 01:38:25,750 --> 01:38:26,960 كيف يمكننا استخدام هذا؟ 2161 01:38:26,960 --> 01:38:30,070 حسنًا ، لاحظ أنه يمكنني الحصول على عدد صحيح من المستخدم في الأعلى. 2162 01:38:30,070 --> 01:38:32,470 يمكنني بعد ذلك التحقق من تكافؤ العدد الصحيح-- هل هو زوجي 2163 01:38:32,470 --> 01:38:33,910 أو فردي-- مع صيغة مثل هذه. 2164 01:38:33,910 --> 01:38:36,390 الآن أنا أقوم بجمع بعض من تلك الرموز 2165 01:38:36,390 --> 01:38:38,140 لأنك قد تميل بشكل حدسي. 2166 01:38:38,140 --> 01:38:43,210 إذا كان n، الرقم المكتوب من قبل المستخدم، أو mod 2، أو مقسومًا عليه 2167 01:38:43,210 --> 01:38:46,990 ثم تحقق من الباقي، ولكن هذا يقال أفضل، يساوى يساوي صفرًا، 2168 01:38:46,990 --> 01:38:48,910 لقد قلت للتو إنه رقم زوجي-- 2169 01:38:48,910 --> 01:38:51,210 لذلك اطبع زوجي وإلا اطبع فردي. 2170 01:38:51,210 --> 01:38:53,050 لأن ما هو الباقي الآخر الممكن؟ 2171 01:38:53,050 --> 01:38:58,780 فإذا قمت بإجراء n أو أي قيمة مقسومة على 2، فقد تحصل على باقي من 0 أو 1. 2172 01:38:58,780 --> 01:39:02,620 ليس لدي سوى التحقق من واحد من تلك، 0 لأن الآخر يتضمن 2173 01:39:02,620 --> 01:39:03,370 الشيء الآخر. 2174 01:39:03,370 --> 01:39:05,020 مرة أخرى، مثال بسيط للغاية. 2175 01:39:05,020 --> 01:39:07,690 لكن بصراحة، كلنا على الأرجح لدينا فهم بديهي 2176 01:39:07,690 --> 01:39:08,830 لما هو الزوجي وما هو الفردي. 2177 01:39:08,830 --> 01:39:11,170 يحتاج الكمبيوتر أن يتم تعليمه ذلك، ولهذا 2178 01:39:11,170 --> 01:39:13,520 يوجد برنامج يفعل هذا تمامًا. 2179 01:39:13,520 --> 01:39:16,730 اسمحوا لي بفتح برنامج أكبر يسمى الشروط، 2180 01:39:16,730 --> 01:39:19,570 بدلاً من كتابة هذا خارج البرنامج، لأنه عبارة عن بضعة أسطر من التعليمات البرمجية، 2181 01:39:19,570 --> 01:39:21,850 دعوني فقط أفتحه لأنه يختتم 2182 01:39:21,850 --> 01:39:24,490 تمامًا التعليمات البرمجية التي رأيناها منذ فترة وجيزة على الشريحة 2183 01:39:24,490 --> 01:39:27,610 عندما قمنا بمقارنته مع كتلة C مماثلة. 2184 01:39:27,610 --> 01:39:31,570 في هذا البرنامج، في دالتي الرئيسية-- دعوني أركز على السطور القليلة الأولى 2185 01:39:31,570 --> 01:39:32,320 هناك-- 2186 01:39:32,320 --> 01:39:36,340 لدي عدد صحيح يسمى x الذي أحصل عليه عبر "get int"، 2187 01:39:36,340 --> 01:39:39,010 عدد صحيح آخر يسمى y الذي أحصل عليه عبر "get int"، 2188 01:39:39,010 --> 01:39:41,470 ثم أقوم فقط ببعض المقارنات البسيطة. 2189 01:39:41,470 --> 01:39:43,600 لقد رأينا هذا من قبل عندما قمنا بمقارنته مع سكراتش، 2190 01:39:43,600 --> 01:39:47,320 ولكن هذه بكل بساطة هي التعليمات البرمجية نفسها في سياق 2191 01:39:47,320 --> 01:39:50,480 بدلا من مجرد رؤيتها بشكل ثابت على شريحة. 2192 01:39:50,480 --> 01:39:53,660 لذا اسمحوا لي بالمُضي قدمًا وتجميع هذا-- make conditions enter. 2193 01:39:53,660 --> 01:39:55,000 يبدو أنه يقوم بالتجميع. 2194 01:39:55,000 --> 01:39:59,200 اسمحوا لي بالتكبير وكتابة نقطة خط مائل conditions enter. 2195 01:39:59,200 --> 01:40:02,770 x سيكون، لنقل، 2 مرة أخرى، y سيكون 10. 2196 01:40:02,770 --> 01:40:04,210 x في الواقع أقل من y. 2197 01:40:04,210 --> 01:40:07,840 إذا قمت بتشغيله مرة أخرى-- ويمكنني توفير الوقت عن طريق عرض المحفوظات لدي 2198 01:40:07,840 --> 01:40:08,920 وفقط الضغط على Enter. 2199 01:40:08,920 --> 01:40:13,430 دعونا نكتب 2 و2، وفي الواقع x تساوي y وهكذا. 2200 01:40:13,430 --> 01:40:16,390 مرة أخرى، نوع التعليمات البرمجية نفسه بالضبط كما كان من قبل ولكن الآن 2201 01:40:16,390 --> 01:40:18,310 في سياق برنامج يعمل. 2202 01:40:18,310 --> 01:40:22,180 ماذا لو كنت أرغب بالفعل في الحصول على مدخل المستخدم مثلما فعل طالبنا السابق 2203 01:40:22,180 --> 01:40:25,930 مع الحصول على إجابات نعم أو لا على سؤال التفاح أو الكاب كيك؟ 2204 01:40:25,930 --> 01:40:29,560 حسنا في answer.C، يتضح أنه يمكنك فعلاً 2205 01:40:29,560 --> 01:40:34,150 الحصول على مدخلات نصية من المستخدم، وربما ببساطة نعم أو لا أو فقط y 2206 01:40:34,150 --> 01:40:35,800 أو n للإيجاز. 2207 01:40:35,800 --> 01:40:38,140 وفي هذه الحالة، إذا حصلت على حرف واحد فقط، 2208 01:40:38,140 --> 01:40:40,580 يتضح وجود نوع بيانات منفصل للحرف. 2209 01:40:40,580 --> 01:40:42,850 إذا كنت لا تريد سلسلة كاملة، كلمة كاملة مثلاً 2210 01:40:42,850 --> 01:40:45,820 أو فقرة أو جملة أو مهما يكن، أنت تريد حرفًا واحدًا فقط. 2211 01:40:45,820 --> 01:40:48,730 يمكنك بالفعل استخدام ما يسمى char أو حرفًا. 2212 01:40:48,730 --> 01:40:54,520 وهكذا هنا أنا استخدام دالة أخرى باسم مناسب تسمى "get char". 2213 01:40:54,520 --> 01:40:58,870 أقوم بتخزينها في متغير يسمى C لأنه حرف من نوع لطيف ومقتضب 2214 01:40:58,870 --> 01:41:02,020 من الدالة char ثم لاحظ هذا. 2215 01:41:02,020 --> 01:41:04,270 ربما لم تر هذه الصيغة من قبل، 2216 01:41:04,270 --> 01:41:07,450 خاصة إذا لم تقم بالبرمجة من قبل حتى في سكراتش. 2217 01:41:07,450 --> 01:41:10,570 ولكن ربما تكون قد شاهدت هذه الكتلة المشابهة لتلك الموجودة في سكراتش. 2218 01:41:10,570 --> 01:41:14,670 ما الذي يشير إليه الشريط الرأسي المزدوج هنا؟ 2219 01:41:14,670 --> 01:41:15,320 أو، هذا هو. 2220 01:41:15,320 --> 01:41:17,120 إذًا في سكراتش، إنه لطيف وسهل الاستخدام. 2221 01:41:17,120 --> 01:41:19,600 إنهم يقولون حرفيًا فقط O-R. في البرمجة، إنها 2222 01:41:19,600 --> 01:41:22,810 في كثير من الأحيان الحالة التي تستخدم تسلسلات مشفرة من الحروف أكثر 2223 01:41:22,810 --> 01:41:25,000 واثنين من القضبان العمودية، التي عادة ما تكون 2224 01:41:25,000 --> 01:41:27,370 فوق مفتاح Enter على لوحة مفاتيح أمريكية. 2225 01:41:27,370 --> 01:41:32,020 إذا كان C يساوي يساوي y كبير أو C يساوي يساوي y صغير-- 2226 01:41:32,020 --> 01:41:35,930 دعونا نفترض أن المستخدم يريد أن يقول نعم والمضي قُدمًا ويقول نعم. 2227 01:41:35,930 --> 01:41:39,730 أيضًا إذا كتب المستخدم n بالأحرف الكبيرة أو بالأحرف الصغيرة، 2228 01:41:39,730 --> 01:41:42,950 دعونا نفترض أنه أو أنها تعني لا ونقول لا وفقًا لذلك. 2229 01:41:42,950 --> 01:41:45,600 وماذا سنفعل غير ذلك؟ 2230 01:41:45,600 --> 01:41:47,500 على ما يبدو لا شيء، وهذا جيد. 2231 01:41:47,500 --> 01:41:50,660 لا تحتاج إلى حالة افتراضية إذا كنت ترغب في ألا يقوم البرنامج بأي شيء. 2232 01:41:50,660 --> 01:41:54,750 قد يكون مربكًا بعض الشيء لأنه يمكن للمستخدم كتابة بعض الكلمات العشوائية 2233 01:41:54,750 --> 01:41:57,120 ولا يحصل على أي مخرج، ولكن هذا قرار التصميم. 2234 01:41:57,120 --> 01:41:59,850 منطقيًا هذا فقط كيف يمكننا التعبير عن هذا. 2235 01:42:03,380 --> 01:42:06,680 ماذا حقًا عن بناء الكتل الخاصة بنا؟ 2236 01:42:06,680 --> 01:42:11,780 هل توجد أي أسئلة، رغم ذلك، قبل أن نبدأ في الإنشاء؟ 2237 01:42:11,780 --> 01:42:15,510 لذا تذكروا أنه في سكراتش كان لدينا مثال السعال هذا. 2238 01:42:15,510 --> 01:42:18,020 اسمحوا لي بالمضي قدمًا وإنشاء ملف هنا بسرعة 2239 01:42:18,020 --> 01:42:23,120 يسمى cough0.C ونوع من إعادة إنشاء ما قمنا به الأسبوع الماضي. 2240 01:42:23,120 --> 01:42:26,840 Include standard IO .h int main void-- 2241 01:42:26,840 --> 01:42:28,400 مرة أخرى، مجرد ذاكرة عضلية الآن-- 2242 01:42:28,400 --> 01:42:33,200 ثم printf اقتباس وإنهاء الاقتباس "cough" فاصلة منقوطة. 2243 01:42:33,200 --> 01:42:33,950 أتعلم ماذا؟ 2244 01:42:33,950 --> 01:42:38,240 اسمحوا لي بالمُضي قُدمًا والسعال ليست مرة واحدة، ولكن مرتين، ثلاث مرات. 2245 01:42:38,240 --> 01:42:40,310 في اللحظة التي تبدأ فيها بالنسخ واللصق، 2246 01:42:40,310 --> 01:42:42,960 فأنت غالبًا لا تكتب تعليمات برمجية جيدة. 2247 01:42:42,960 --> 01:42:44,090 إنه ليس قابل للتعديل بشكل جيد. 2248 01:42:44,090 --> 01:42:46,710 الآن إذا كنت أريد تغيير الكلمة أو ترجمتها إلى لغة أخرى، 2249 01:42:46,710 --> 01:42:48,200 لا بد لي من تغييرها في ثلاثة أماكن. 2250 01:42:48,200 --> 01:42:50,390 قررنا بالفعل الأسبوع الماضي أن هذا سيئ. 2251 01:42:50,390 --> 01:42:54,650 فماذا سيكون أفضل في C أو في سكراتش أو بشكل عام 2252 01:42:54,650 --> 01:42:56,590 من هذا النهج؟ 2253 01:42:56,590 --> 01:42:57,730 نعم، التكرار الحلقي. 2254 01:42:57,730 --> 01:42:59,920 لذلك اسمحوا لي بفعل ذلك اسمحوا لي بإنشاء ملف آخر. 2255 01:42:59,920 --> 01:43:03,450 سأطلق على هذا cough1.C، هو الإصدار الثاني الخاص بي. 2256 01:43:03,450 --> 01:43:07,040 اسمحوا لي بالمُضي قدمًا الآن ونسخ الكود الأصلي ولصقه، 2257 01:43:07,040 --> 01:43:08,130 ولنقم فقط بتحسينها. 2258 01:43:08,130 --> 01:43:11,760 دعونا نتخلص من اثنتين من هذه، ودعونا نرى ما إذا كنا لا نستطيع التعبير عن "for". 2259 01:43:11,760 --> 01:43:13,620 لذلك كانت "for"-- 2260 01:43:13,620 --> 01:43:15,170 دعني أقوم بالتكبير-- 2261 01:43:15,170 --> 01:43:17,090 int i = 0. 2262 01:43:17,090 --> 01:43:18,750 i أقل من رقم ما. 2263 01:43:18,750 --> 01:43:19,660 قبل أن يكون 50. 2264 01:43:19,660 --> 01:43:21,350 الآن سأجعلها 3. 2265 01:43:21,350 --> 01:43:27,930 i++ أقواس متعرجة، والآن اسمحوا لي بتحريك كتلة cough بالداخل هنا 2266 01:43:27,930 --> 01:43:29,580 وأضع قبلها مسافة حتى تبدو جميلة. 2267 01:43:29,580 --> 01:43:34,110 ولاحظ أسلوبيًا، لقد كنت أفعل هذا بشكل غريزي لبعض الوقت. 2268 01:43:34,110 --> 01:43:37,260 كل شيء مسبوق بمسافة بشكل جيد لجعله أكثر قابلية للقراءة، 2269 01:43:37,260 --> 01:43:40,260 تماما مثل كتل سكراتش، حتى فالكثير من المساحات البيضاء 2270 01:43:40,260 --> 01:43:42,250 لا يهم بالنسبة للكمبيوتر. 2271 01:43:42,250 --> 01:43:44,340 لذا في حالة المضي قُدمًا وتشغيل هذا-- 2272 01:43:44,340 --> 01:43:46,650 دعوني أسحب النافذة الطرفية حتى أتمكن من رؤيتها. 2273 01:43:46,650 --> 01:43:49,860 ولنكتب Make cough1, enter-- 2274 01:43:49,860 --> 01:43:54,090 يبدو جيدًا-- ./cough1 سعال سعال سعال. 2275 01:43:54,090 --> 01:43:57,720 هذا أمر جيد، ولكن أذكر أننا قمنا في الواقع بتحسين هذا التصميم بشكل أكثر 2276 01:43:57,720 --> 01:43:59,040 من خلال تجريده بعيدًا. 2277 01:43:59,040 --> 01:44:01,290 اسمحوا لي بالمُضي قُدمًا وتصميم الدالة الخاصة بي الآن. 2278 01:44:01,290 --> 01:44:06,370 اسمحوا لي بالمُضي قُدمًا وفتح ملف جديد، C.cough2 2279 01:44:06,370 --> 01:44:10,560 تمامًا مثل ما كان لدي برنامج سكراتش آخر. 2280 01:44:10,560 --> 01:44:20,050 مرة أخرى، include standard IO.h int main void، ثم هنا 2281 01:44:20,050 --> 01:44:22,150 دعوني أمضي قدمًا وأفعل ماذا؟ 2282 01:44:22,150 --> 01:44:30,490 حسنًا، for int i get 0, i أقل من 3, i +++ أقواس متعرجة. 2283 01:44:30,490 --> 01:44:33,160 ثم اسمحوا لي بالمُضي قُدمًا وأنادي cough. 2284 01:44:33,160 --> 01:44:36,400 وسيكون لطيفًا في حالة وجود السعال، ولكن للأسف السعال غير موجود. 2285 01:44:36,400 --> 01:44:37,870 كما أنها ليست في مكتبة CS50 أيضًا. 2286 01:44:37,870 --> 01:44:39,340 لذلك هذا لن يساعدنا. 2287 01:44:39,340 --> 01:44:41,400 يجب علي أن أصمم دالتي الخاصة. 2288 01:44:41,400 --> 01:44:43,240 إذًا في سكراتش، تذهب إلى جزء الكتلة 2289 01:44:43,240 --> 01:44:45,580 وتصنع الكتلة الخاصة بك ويظهر المحث الكبير 2290 01:44:45,580 --> 01:44:46,930 ثم تصنع قطعة اللغز الجديدة. 2291 01:44:46,930 --> 01:44:49,260 هنا سيتعين علينا أن نكون عمليين أكثر بقليل، 2292 01:44:49,260 --> 01:44:52,480 ويتضح أنه يمكنك القيام بذلك بهذه الطريقة. 2293 01:44:52,480 --> 01:44:54,850 وبعض من هذه التفاصيل سيكون غير واضح في البداية، 2294 01:44:54,850 --> 01:44:57,550 لكنني سأمضي قُدمًا وأستدعي الدالة cough. 2295 01:44:57,550 --> 01:45:00,430 وcough في هذه اللحظة لا يحتاج إلى أخذ أي مدخلات. 2296 01:45:00,430 --> 01:45:01,960 لذلك فالكلمة الرئيسية هنا هي void. 2297 01:45:01,960 --> 01:45:03,460 وقد رأينا ذلك من قبل بالفعل. 2298 01:45:03,460 --> 01:45:05,320 وMain أيضًا لم تأخذ أي مدخلات. 2299 01:45:05,320 --> 01:45:08,340 لهذا السبب كانت لدينا كلمة void، ولكنها كانت أكثر في ذلك الوقت. 2300 01:45:08,340 --> 01:45:10,390 وcough لن ينتج أي شيء أيضًا. 2301 01:45:10,390 --> 01:45:12,670 سيقوم بالطباعة على الشاشة تمامًا مثلما فعل براين. 2302 01:45:12,670 --> 01:45:15,310 لكن براين، أذكر، لم يسلم لي أي شيء ماديًا. 2303 01:45:15,310 --> 01:45:17,030 لذلك لا توجد قيمة مرتجعة. 2304 01:45:17,030 --> 01:45:20,140 لذلك سأقول void على يسار cough. 2305 01:45:20,140 --> 01:45:23,530 لذلك لأغراض اليوم، هذا يعني فقط أن cough لا يأخذ 2306 01:45:23,530 --> 01:45:26,320 مدخلاً أو يرجع قيمة كمخرج. 2307 01:45:26,320 --> 01:45:28,520 هذا هو الأمر، void، void. 2308 01:45:28,520 --> 01:45:31,270 الآن هيكل هذه الدالة، إذا جاز التعبير، 2309 01:45:31,270 --> 01:45:36,070 أنا فقط سأمضي قُدمًا وأقول ببساطة تمامًا cough فاصلة منقوطة. 2310 01:45:36,070 --> 01:45:36,670 هذا هو الأمر. 2311 01:45:36,670 --> 01:45:39,340 إذًا الآن لدي قطعة لغز الغرض منها في الحياة 2312 01:45:39,340 --> 01:45:43,480 هو السعال، والذي يعني الآن أنني يمكني تسميتها باسمها 2313 01:45:43,480 --> 01:45:46,430 هنا عدة مرات كما أريد. 2314 01:45:46,430 --> 01:45:48,240 لذا دعوني أمضي قُدمًا وأجمع هذا. 2315 01:45:48,240 --> 01:45:49,330 أنا حقًا أبلي بلاءً حسنًا. 2316 01:45:49,330 --> 01:45:55,890 كل شيء كان يعمل بشكل جيد حتى الآن-- make cough2, enter، أخطاء حمراء. 2317 01:45:55,890 --> 01:45:59,390 إذًا هذا مثير للاهتمام، وهذا يذكرني بالخطأ السابق نوعًا ما. 2318 01:45:59,390 --> 01:46:03,130 إذًا أولاً، ما هو السطر الذي يقع فيه خطأي؟ 2319 01:46:03,130 --> 01:46:07,030 سبعة والحرف تسعة، إذا كنت تهتم، لكنه سبعة، في السطر سبعة-- 2320 01:46:07,030 --> 01:46:10,400 التصريح الضمني للدالة cough غير صالح في C99. 2321 01:46:10,400 --> 01:46:15,070 يشير C99 حرفيًا إلى 1999 عندما تم اختراع هذا الإصدار من C، 2322 01:46:15,070 --> 01:46:18,220 إذًا إعلان ضمني لدالة cough. 2323 01:46:18,220 --> 01:46:20,740 لكن هذا هنا. 2324 01:46:20,740 --> 01:46:22,240 حسنًا، انتظروا دقيقة. 2325 01:46:22,240 --> 01:46:25,990 بديهيًا، دعوني فقط أحرك هذا. 2326 01:46:25,990 --> 01:46:27,250 دعوني أحركه لأعلى. 2327 01:46:27,250 --> 01:46:28,730 دعونا نرى ما سيحدث. 2328 01:46:28,730 --> 01:46:31,300 Make cough2-- يا إلهي. 2329 01:46:31,300 --> 01:46:33,130 قام هذا بإصلاحه. 2330 01:46:33,130 --> 01:46:34,960 لماذا؟ 2331 01:46:34,960 --> 01:46:38,290 حتى لو كنت لم تقم بالبرمجة من قبل، فكّر في السبب بديهيًا 2332 01:46:38,290 --> 01:46:39,900 لماذا حل هذا شيئًا ما. 2333 01:46:39,900 --> 01:46:42,190 الجمهور: أنت تحمل الدالة التي 2334 01:46:42,190 --> 01:46:44,020 قمت بالإعلان عنها من قبل. 2335 01:46:44,020 --> 01:46:48,560 حتى على الرغم من أنك تجعلها فارغة، فأنت على الأقل قد [INAUDIBLE].. 2336 01:46:48,560 --> 01:46:49,520 ديفيد: تمام. 2337 01:46:49,520 --> 01:46:54,230 لأنني في السابق كنت أحاول استخدام cough في وقت سابق في السطر 7، 2338 01:46:54,230 --> 01:46:56,270 لكنني كنت أعلم الكمبيوتر فقط ما هو cough 2339 01:46:56,270 --> 01:46:58,130 في أسفل الملف. 2340 01:46:58,130 --> 01:46:59,330 بصراحة إن لغة C بكماء نوعًا ما. 2341 01:46:59,330 --> 01:47:01,740 إنها تقرأ حرفيًا تعليماتك البرمجية من أعلى إلى أسفل اليسار أو اليمين. 2342 01:47:01,740 --> 01:47:04,580 وإذا حاولت القيام بشيء قبل أن تقوم بتعليم الكمبيوتر كيف 2343 01:47:04,580 --> 01:47:07,640 تقوم بذلك، ستحصل على هذا النوع من المعرّف غير المصرح به 2344 01:47:07,640 --> 01:47:10,020 لأنه لا يعرف ما هي الكلمة حتى الآن. 2345 01:47:10,020 --> 01:47:11,610 الآن في سكراتش، هذا ليس أمرًا كبيرًا. 2346 01:47:11,610 --> 01:47:13,690 أنت فقط تحرك قطع اللغز في أي مكان تريده. 2347 01:47:13,690 --> 01:47:16,370 ترتيب الكتل ماديًا على الشاشة لا يهم. 2348 01:47:16,370 --> 01:47:17,600 ولكن في لغة C، مهم. 2349 01:47:17,600 --> 01:47:19,850 لكن بصراحة، هذا يبدو مزعجًا بعض الشيء 2350 01:47:19,850 --> 01:47:24,200 أن يظل البرنامج الرئيسي في تمدد أبعد وأبعد 2351 01:47:24,200 --> 01:47:27,290 لأسفل كلما أضفت تعقيدًا إلى برنامجي. 2352 01:47:27,290 --> 01:47:28,850 لذلك هناك حل آخر. 2353 01:47:28,850 --> 01:47:30,850 اسمحوا لي فعلا بالمُضي قُدمًا ووضع هذا مرة أخرى في المكان 2354 01:47:30,850 --> 01:47:33,350 الذي يكون فيه وهذا لأنني دقيق قليلاً. 2355 01:47:33,350 --> 01:47:37,780 أنا فقط أحب بشكل تقليدي أن تكون main في القمة، وبصراحة هذا أسلوب جيد. 2356 01:47:37,780 --> 01:47:40,580 إذا كان main هو الدالة الأهم في البرنامج لديك افتراضيًا-- 2357 01:47:40,580 --> 01:47:45,320 إذا كان الدالة الرئيسية وهو ما يتم استدعاؤه أولاً بشكل افتراضي 2358 01:47:45,320 --> 01:47:46,460 عن طريق الكمبيوتر-- 2359 01:47:46,460 --> 01:47:48,640 فلماذا سأدفعه إلى الأسفل لمجرد 2360 01:47:48,640 --> 01:47:51,440 التغلب على هذه التفاصيل الغبية؟ 2361 01:47:51,440 --> 01:47:56,030 حسنا، أنا فقط بحاجة لتعليم الكمبيوتر ما هي الدالة، 2362 01:47:56,030 --> 01:48:01,590 ويمكنني أن أفعل ذلك ببساطة من خلال قول ذلك. 2363 01:48:01,590 --> 01:48:05,100 هذا ما سنطلق عليه النموذج الأولي لدالة. 2364 01:48:05,100 --> 01:48:08,100 إذا كنت حرفيًا فقط تنسخ السطر الأول 2365 01:48:08,100 --> 01:48:12,660 منه، والذي يحتوي على اسمه، ومدخلاته إن وجدت، ومخرجاته إن وجدت، 2366 01:48:12,660 --> 01:48:14,400 فيكون نموذجًا أوليًا فاصلة منقوطة. 2367 01:48:14,400 --> 01:48:16,680 إنه حرفيًا نسخ ولصق من الدالة نفسها، 2368 01:48:16,680 --> 01:48:21,630 ولكن هذا الآن تلميح كافٍ لقول، أهلا، يا كمبيوتر، هذا الهيكل موجود. 2369 01:48:21,630 --> 01:48:25,830 هذه معلومات تكفي لك ثم تقوم بتسميتها لأن الكمبيوتر، 2370 01:48:25,830 --> 01:48:28,830 طالما أنه قد رأى اسم الدالة من قبل، فإنه 2371 01:48:28,830 --> 01:48:34,540 جيد، إذا كانت الأصفار والآحاد، إذا جاز التعبير، التي تتضمنها جاءت في وقت لاحق بعد قليل. 2372 01:48:34,540 --> 01:48:37,900 وهذه هي الطريقة التقليدية لحل هذه المشكلة. 2373 01:48:37,900 --> 01:48:41,970 حتى لو بمجرد الحدس، خمنوا، إذا لم يكن 2374 01:48:41,970 --> 01:48:49,050 الكثير من القفزات غير المباشرة، الموجودة في standard I/O.h، الموجود في CS50.h. 2375 01:48:51,970 --> 01:48:54,620 هذه الأنواع التي سنقوم بتسميتها الإعلانات. 2376 01:48:54,620 --> 01:48:59,560 لذلك حرفيًا في standard IO.h هناك سطر من التعليمات البرمجية الذي 2377 01:48:59,560 --> 01:49:02,890 يعلم الكمبيوتر ما هي مدخلات printf 2378 01:49:02,890 --> 01:49:05,080 وما هي مخرجات printf إن وجدت. 2379 01:49:05,080 --> 01:49:07,420 في CS50.h، هناك حرفيًا سطر من التعليمات البرمجية 2380 01:49:07,420 --> 01:49:11,560 الذي يخبر الكمبيوتر ما هي مدخلات "get strings" وما هي مخرجاته. 2381 01:49:11,560 --> 01:49:15,490 والشيء نفسه لـ "get int" و"get float" و"get char" وآخرين-- 2382 01:49:15,490 --> 01:49:17,360 هذا كل ما في ملفات الرأس تلك. 2383 01:49:17,360 --> 01:49:19,240 الأصفار والآحاد، إذا جاز التعبير، هي في الواقع 2384 01:49:19,240 --> 01:49:23,590 في الملفات التي تسمى حرفيًا standard IO.C وCS50.C، 2385 01:49:23,590 --> 01:49:25,360 على الرغم من أن هذه هي تعليمات المصدر البرمجية من الناحية الفنية. 2386 01:49:25,360 --> 01:49:28,660 الأصفار والآحاد موجودة في ملف مُجمع في مكان آخر على النظام. 2387 01:49:28,660 --> 01:49:31,110 ولكن كل هذه الأشياء التي أخذناها كمسلمات، 2388 01:49:31,110 --> 01:49:32,860 الآن نأمل أن تكون أكثر منطقية 2389 01:49:32,860 --> 01:49:34,610 لأن، حقيقة أنني أضع التضمين الحاد 2390 01:49:34,610 --> 01:49:37,090 في الأعلى، هو مجرد حل لمشكلة. 2391 01:49:37,090 --> 01:49:41,140 في هذا الملف ما يكفي من المعلومات لتعليم الكمبيوتر ما هو printf 2392 01:49:41,140 --> 01:49:44,530 أو ما هو "get string" وأشياء أخرى 2393 01:49:44,530 --> 01:49:48,280 بحيث لا أتحمل عناء تحريك الأشياء 2394 01:49:48,280 --> 01:49:51,580 أو نسخ ولصق الشخص الذي كتب printf، أو رمزه أو رمزها، 2395 01:49:51,580 --> 01:49:52,960 في برنامجي. 2396 01:49:52,960 --> 01:49:55,450 الآن دعونا نقوم بمثال واحد نهائي مع السعال 2397 01:49:55,450 --> 01:49:58,360 ونمضي قُدمًا وندعو هذا cough3.C 2398 01:49:58,360 --> 01:50:01,600 ونمضي قُدمًا ونلصق تعليماتي البرمجية نفسها كما حدث منذ لحظة لنبدأ. 2399 01:50:01,600 --> 01:50:04,060 وتذكروا أن الخطوة الأخيرة من مثال السعال الخاص بنا 2400 01:50:04,060 --> 01:50:06,670 الأسبوع الماضي كان في الواقع إعطاء cough مدخلاً. 2401 01:50:06,670 --> 01:50:09,280 أنا أريد ضم هذه التعليمات البرمجية نوعًا ما 2402 01:50:09,280 --> 01:50:13,510 حرفيًا إلى cough3 لأن هذا تجريد لطيف حقًا. 2403 01:50:13,510 --> 01:50:16,090 لا أريد أن يفكر "main" في عدد المرات-- 2404 01:50:16,090 --> 01:50:17,440 فقط السعال ثلاث مرات. 2405 01:50:17,440 --> 01:50:19,970 هذا تجريد بشري مفيد وجيد. 2406 01:50:19,970 --> 01:50:22,520 الآن دعونا نضع الدالة هنا. 2407 01:50:22,520 --> 01:50:25,090 لذلك إذا أردت أن يتحمل "cough" 2408 01:50:25,090 --> 01:50:29,800 مدخلاً مثل 3، فأي واحد من "void" يحتاج للتغيير؟ 2409 01:50:29,800 --> 01:50:31,630 هل الموجود على اليسار أو على اليمين؟ 2410 01:50:31,630 --> 01:50:33,890 اليمين، الموجود بداخل الأقواس. 2411 01:50:33,890 --> 01:50:38,330 ويتضح، مثلما يمكنك إعلان المتغيرات داخل دالة، 2412 01:50:38,330 --> 01:50:43,310 كما فعلنا، إذًا يمكنك الإعلان عن الوسيطات لدالة هكذا. 2413 01:50:43,310 --> 01:50:46,610 لذلك يمكنك مناداته بأي شيء تريد، على الرغم من أهمية نوع البيانات، ولكن هذا 2414 01:50:46,610 --> 01:50:50,450 يقول الآن، أهلاً، كمبيوتر، "cough" لا ينتج قيمة، 2415 01:50:50,450 --> 01:50:52,910 مثل إرجاع إيرين قطعة من الورق. 2416 01:50:52,910 --> 01:50:55,910 أهلاً، كمبيوتر، يأخذ "cough" مدخلاً واحدًا. 2417 01:50:55,910 --> 01:50:58,130 إنه عدد صحيح وأطلق عليه n. 2418 01:50:58,130 --> 01:51:01,200 والآن بعد أن فعلت هذا، الآن يمكن أن يكون لديك سطر من التعليمات البرمجية هنا 2419 01:51:01,200 --> 01:51:01,700 مثل هذا. 2420 01:51:01,700 --> 01:51:10,490 For int i = 0, i أصغر من n i زائد زائد-- 2421 01:51:10,490 --> 01:51:13,880 ثم، موافق، خطأ من خلال الضغط على المفاتيح هنا. 2422 01:51:13,880 --> 01:51:16,920 ثم يمكنني نقل هذا بالداخل هنا، ووضع مسافة بادئة بشكل جيد. 2423 01:51:16,920 --> 01:51:19,730 والآن لاحظ، كل أشكال تعقيد coughing 2424 01:51:19,730 --> 01:51:22,770 تم أخذها في الاعتبار في دالة، قطعة اللغز الخاصة بي، 2425 01:51:22,770 --> 01:51:27,020 إذا صح التعبير، سيأخذ حتى وسيطة بحيث يمكنك الآن حرفياً، 2426 01:51:27,020 --> 01:51:29,390 إذا قمت بنقل هذا بعيدًا وخارج العقل، الآن 2427 01:51:29,390 --> 01:51:32,870 سيصبح البرنامج الخاص بك مثيرًا للاهتمام لأنه حقًا 2428 01:51:32,870 --> 01:51:34,070 يفعل ما يقول. 2429 01:51:34,070 --> 01:51:37,610 وهذا تجريد دالّي لطيف، إذا صح التعبير، 2430 01:51:37,610 --> 01:51:42,720 بحيث الآن لدي فعل جديد، إجراء جديد، دالة جديدة تسمى cough. 2431 01:51:42,720 --> 01:51:44,670 أية أسئلة حول هذا الجزء؟ 2432 01:51:44,670 --> 01:51:47,300 نعم. 2433 01:51:47,300 --> 01:51:48,020 عذرًا ، قل مرة أخرى. 2434 01:51:48,020 --> 01:51:49,730 الحضور: ما هو الرقم الصحيح الذي سيرجعه "main"؟ 2435 01:51:49,730 --> 01:51:51,020 ديفيد: ما هو الرقم الصحيح الذي سيرجعه "main"؟ 2436 01:51:51,020 --> 01:51:52,560 يتضح أننا سوف نعود إلى هذا. 2437 01:51:52,560 --> 01:51:54,860 سيرجع 0 تقريبًا دائمًا بشكل افتراضي، 2438 01:51:54,860 --> 01:51:57,770 ولكن هذا يُنتج لك تقريبًا عددًا لا نهائيًا من القيم غير الصفرية 2439 01:51:57,770 --> 01:52:00,510 التي تمثل الكثير من الأمور التي يمكن أن تكون خطأ. 2440 01:52:00,510 --> 01:52:03,540 وأكثر من ذلك عندما نبدأ في إنشاء المزيد من الأخطاء. 2441 01:52:03,540 --> 01:52:04,850 دعونا ننظر إلى واحد آخر. 2442 01:52:04,850 --> 01:52:07,520 اسمحوا لي بالمضي قدمًا وفتح هذا الملف مقدمًا 2443 01:52:07,520 --> 01:52:11,270 نفسي يسمى positive.C على فرض أنني لست 2444 01:52:11,270 --> 01:52:13,970 سعيدًا لمجرد الحصول على حق الوصول إلى "get int". 2445 01:52:13,970 --> 01:52:16,430 أريد دالة تسمى "get positive int" لأن، 2446 01:52:16,430 --> 01:52:18,260 لأي سبب من الأسباب، برنامجي أو لعبتي، 2447 01:52:18,260 --> 01:52:20,460 أيًا كان يحتاج لمعرفة قيمة إيجابية. 2448 01:52:20,460 --> 01:52:22,780 ربما أطلب من المستخدم عدد اللاعبين هناك، 2449 01:52:22,780 --> 01:52:24,080 وهذا لا ينبغي أن يكون سلبيًا. 2450 01:52:24,080 --> 01:52:26,720 يجب أن يكون عددًا صحيحًا موجبًا مثل واحد أو اثنين أو أكثر. 2451 01:52:26,720 --> 01:52:31,610 لذلك اتضح أن بإمكاني كتابة برنامج إذا أردت، ويبدو مثل هذا. 2452 01:52:31,610 --> 01:52:37,400 استدعِ في هذا السطر دالة تسمى "get positive int"، قم بتمريرها في محث، 2453 01:52:37,400 --> 01:52:40,880 ثم قم بتخزين القيمة، ثابتة في عدد صحيح، على الجانب الأيسر، 2454 01:52:40,880 --> 01:52:43,370 ثم قم بالمُضي قُدمًا وطباعتها. 2455 01:52:43,370 --> 01:52:47,780 لدى "Get positive int" هذا النموذج الأولي في الجزء العلوي من الملف. 2456 01:52:47,780 --> 01:52:51,450 لاحظ أن هذه ليست الدالة التي تأتي مع مكتبة CS50s، CS50.h. 2457 01:52:51,450 --> 01:52:53,120 فالدالة هنا تسمى "get positive int". 2458 01:52:53,120 --> 01:52:56,510 كما نأمل، فإنها ترجع رقمًا صحيحًا، وتأخذ سلسلة 2459 01:52:56,510 --> 01:52:59,630 لأنها محث، أيًا كانت الكلمات التي تريد أن يراها الإنسان. 2460 01:52:59,630 --> 01:53:03,560 دعونا نقوم بالتمرير لأسفل الآن، وهذا يبدو أكثر انخراطًا بدرجة قليلة، 2461 01:53:03,560 --> 01:53:06,410 وهذه ليست ميزة يمتلكها سكراتش. 2462 01:53:06,410 --> 01:53:07,640 لكن دعونا نلقي نظرة. 2463 01:53:07,640 --> 01:53:10,550 السطر الأول متطابق مع النموذج الأولي 2464 01:53:10,550 --> 01:53:12,410 لأنني حرفيًا قمت بنسخه ولصقه. 2465 01:53:12,410 --> 01:53:16,200 كل شيء بين هذه الأقواس هو الدالة ذاتها. 2466 01:53:16,200 --> 01:53:18,550 وهنا، للإجابة على سؤال شخص ما من وقت سابق، 2467 01:53:18,550 --> 01:53:22,190 هل يجب عليك الإعلان عن متغير ثم استخدامه على الفور؟ 2468 01:53:22,190 --> 01:53:24,920 لا، وهذا في الواقع حل مفيد لمشكلة 2469 01:53:24,920 --> 01:53:26,460 سنراها في غضون لحظات. 2470 01:53:26,460 --> 01:53:29,210 لاحظ هنا هذه الكلمة الرئيسية الجديدة-- التي لم تراها من قبل-- 2471 01:53:29,210 --> 01:53:33,590 تقوم بما يلي عندما تكون n أقل من 1. 2472 01:53:33,590 --> 01:53:37,370 في السابق، لقد شاهدنا حلقة while وشاهدنا حلقة for. 2473 01:53:37,370 --> 01:53:39,150 ما لم نشاهده هو حلقة do while. 2474 01:53:39,150 --> 01:53:42,230 في حين أن حلقة do while تتطابق بشكل واضح مع حلقة 2475 01:53:42,230 --> 01:53:44,690 while، ما الذي يبدو مختلفًا بعض الشيء؟ 2476 01:53:44,690 --> 01:53:49,400 عندما تمت ترجمة كتلة forever في وقت سابق إلى "while true"، 2477 01:53:49,400 --> 01:53:52,190 ماذا كان ترتيب العمليات؟ 2478 01:53:52,190 --> 01:53:55,760 هل تحققنا من الحالة، صحيحة، ثم قمنا بطبع hello world؟ 2479 01:53:55,760 --> 01:54:00,270 أو هل قمنا فقط بطباعة hello world، ثم تحققنا من الحالة؟ 2480 01:54:00,270 --> 01:54:02,820 أجل، قد لا تتذكرون بالضبط، لكن أنا أتذكر تمامًا-- 2481 01:54:02,820 --> 01:54:06,330 لقد تحققت أنا، صحيح صحيح، وجميعنا قلنا نعم بالتأكيد. 2482 01:54:06,330 --> 01:54:09,090 Printf-- هل هو صحيح؟ 2483 01:54:09,090 --> 01:54:11,610 Printf-- لذا تحقق من الشرط أولاً. 2484 01:54:11,610 --> 01:54:14,640 قد نستنتج أن هذه الحلقة مختلفة قليلاً. 2485 01:54:14,640 --> 01:54:16,410 لديها كلمة أخرى "do". 2486 01:54:16,410 --> 01:54:21,480 سيقوم هذا حرفيًا بفعل هذا أولاً ثم التحقق من الشرط 2487 01:54:21,480 --> 01:54:23,800 وفعل ذلك فقط مجددًا إذا كان الشرط صحيحًا. 2488 01:54:23,800 --> 01:54:26,970 لذا إنها طريقة لطيفة للتعبير فقط عن الأشياء حولك من حيث الترتيب 2489 01:54:26,970 --> 01:54:31,710 للقيام بشيء ما على الأقل مرة واحدة بدلاً من عدم احتمالية فعله مطلقًا 2490 01:54:31,710 --> 01:54:33,190 مثل الحالة السابقة. 2491 01:54:33,190 --> 01:54:34,530 لذا ما الذي نفعله؟ 2492 01:54:34,530 --> 01:54:37,530 أحصل على int، الذي يمر في هذا المحث، وقم بتخزينه في n. 2493 01:54:37,530 --> 01:54:40,830 وإذا كتب المستخدم قيمة أقل من 1، 2494 01:54:40,830 --> 01:54:44,850 هل سيكون هذا صحيحًا أم خاطئًا، إذا كان n أقل من 1؟ 2495 01:54:44,850 --> 01:54:49,710 لذا إذا قام شخص بكتابة 0، هل 0 أقل من 1؟ 2496 01:54:49,710 --> 01:54:54,060 صحيح، نعم، لذا ما الذي يحدث، فلنعد للوراء إلى "do" ونقم بذلك مجددًا. 2497 01:54:54,060 --> 01:54:57,360 إذا قام المستخدم بكتابة سالب 1، هل سالب 1 أقل من 1؟ 2498 01:54:57,360 --> 01:54:58,470 نعم أو صحيح. 2499 01:54:58,470 --> 01:54:59,490 لذا قم بذلك مجددًا. 2500 01:54:59,490 --> 01:55:02,220 إذا قام أو قامت بكتابة سالب 2، مجددًا، مجددًا. 2501 01:55:02,220 --> 01:55:04,020 ماذا لو كتب أو كتبت 50؟ 2502 01:55:04,020 --> 01:55:06,210 حسنًا، 50 ليس أقل من واحد. 2503 01:55:06,210 --> 01:55:08,020 لذا هذا خاطئ. 2504 01:55:08,020 --> 01:55:11,170 وحتى بعد ذلك ننتقل إلى السطر التالي من التعليمات البرمجية. 2505 01:55:11,170 --> 01:55:13,260 ولكن الأمر المثير في السطر التالي من التعليمات البرمجية 2506 01:55:13,260 --> 01:55:18,300 هو، على عكس مثال السعال، والذي كان "void" هو نوع إعادته، 2507 01:55:18,300 --> 01:55:20,970 "get positive int" بشكل افتراضي والذي من المفترض أن يعيد عددًا صحيحًا، 2508 01:55:20,970 --> 01:55:24,720 مثلما، مجددًا، سلمت لي إيرين ورقة بسلسلة عليها. 2509 01:55:24,720 --> 01:55:27,870 وإذًا هنا، إذا كنت أريد الدالة المخصصة الخاصة بي المسماة 2510 01:55:27,870 --> 01:55:29,850 "get positive int" أن ترجع قيمة، فيوجد 2511 01:55:29,850 --> 01:55:33,030 كلمة أخرى في لغة C. فأنت تكتب حرفيًا "return" ثم 2512 01:55:33,030 --> 01:55:35,340 اسم المتغير أو القيمة التي 2513 01:55:35,340 --> 01:55:39,870 تريد إعادتها على ورقة مجازية إلى أي تعليمات برمجية 2514 01:55:39,870 --> 01:55:41,970 تستخدم هذا. 2515 01:55:41,970 --> 01:55:43,920 لذا ما هذه الغرابة؟ 2516 01:55:43,920 --> 01:55:47,370 لماذا لا يمكنني فعل هذا؟ 2517 01:55:47,370 --> 01:55:52,390 إذا كنت سأحاكي التعليمات البرمجية التي كتبناها في وقت سابق كهذا، 2518 01:55:52,390 --> 01:55:56,340 لماذا لا يعمل هذا السطر من التعليمات البرمجية فقط بطريقة منطقية باستخدام 2519 01:55:56,340 --> 01:56:00,970 بعض النماذج الذهنية التي لدينا حتى الآن؟ 2520 01:56:00,970 --> 01:56:02,430 الجمهور: إعلان التعليمات البرمجية مجددًا. 2521 01:56:02,430 --> 01:56:03,130 ديفيد: قلها مجددًا. 2522 01:56:03,130 --> 01:56:04,770 الجمهور: الإعلان مرارًا وتكرارًا. 2523 01:56:04,770 --> 01:56:06,820 ديفيد: نعم، إذًا الإعلان فقط يعني إنشاء، 2524 01:56:06,820 --> 01:56:08,940 وهو الطريقة الشيقة في البرمجة لقول إنشاء. 2525 01:56:08,940 --> 01:56:11,730 لذا هذا يقول، مرحبًا، يا جهاز الكمبيوتر، أعطني عددًا صحيحًا، وأطلق عليه n، 2526 01:56:11,730 --> 01:56:13,730 وعينه مساوٍ لقيمة الإعادة لـ "get int". 2527 01:56:13,730 --> 01:56:17,660 لذا أيًا كانت الدالة أو أيًا كان ماسلمتني إياه إيرين، ضَعه هنا. 2528 01:56:17,660 --> 01:56:21,340 ولكن المشكلة هي أن المتغيرات في لغة C لها نطاق. 2529 01:56:21,340 --> 01:56:24,180 النطاق هو طريقة شيقة لقول أنها موجودة فقط 2530 01:56:24,180 --> 01:56:28,750 بين الأقواس المتعرجة والتي تم الإعلان عنها فيها. 2531 01:56:28,750 --> 01:56:32,830 لذا هذا يعني أن هذا المتغير n حرفيًا موجود فقط 2532 01:56:32,830 --> 01:56:36,550 بين هنا وهنا، ومن ثم يختفي نوعًا ما. 2533 01:56:36,550 --> 01:56:38,470 ولا يعرف جهاز الكمبيوتر شيئًا عنه بعد ذلك. 2534 01:56:38,470 --> 01:56:40,660 ولكن هذه مشكلة لأن، على أي رقم سطر 2535 01:56:40,660 --> 01:56:44,290 نحن بحاجة إلى معرفة n في الواقع؟ 2536 01:56:44,290 --> 01:56:47,960 يبدو أنه السطر 21، وهذا خارج الأقواس المتعرجة. 2537 01:56:47,960 --> 01:56:50,380 لذا بناء على هذا التعريف الأساسي فقط، فالنطاق 2538 01:56:50,380 --> 01:56:52,930 هو القوسان المتعرجان الذين يتم الإعلان عن متغير بينهما. 2539 01:56:52,930 --> 01:56:54,310 وليس له وجود خارجهما. 2540 01:56:54,310 --> 01:56:55,580 لن تعمل التعليمات البرمجية هذه فقط. 2541 01:56:55,580 --> 01:56:58,250 وسأصلحه فيما بعد حتى يتسنى لكم رؤية رسالة الخطأ الصحيحة. 2542 01:56:58,250 --> 01:56:59,470 لماذا لا يعمل هذا؟ 2543 01:56:59,470 --> 01:57:02,360 حسنًا، أنت تعلن n داخل هذه الأقواس المتعرجة. 2544 01:57:02,360 --> 01:57:03,580 لذا كيف يمكنك تجنب هذا؟ 2545 01:57:03,580 --> 01:57:07,690 حسنًا، اتضح أن، كما اقترح شخص ما في ما وقت سابق، الإعلان عنه فقط بذاته 2546 01:57:07,690 --> 01:57:09,680 دون إعطائه قيمة. 2547 01:57:09,680 --> 01:57:13,070 وحقًا الصيغة لذلك هي فقط القيام بنصف التفكير-- 2548 01:57:13,070 --> 01:57:14,590 int n فاصلة منقوطة. 2549 01:57:14,590 --> 01:57:16,510 ليس لديه قيمة نعرفها بعد. 2550 01:57:16,510 --> 01:57:19,120 يشتمل على قيمة تافهة، ولكن سنتطرق لهذا بشكل موسع في وقت آخر. 2551 01:57:19,120 --> 01:57:20,140 ولكنه غير موجود الآن. 2552 01:57:20,140 --> 01:57:23,470 والآن لاحظوا وجوده في أي الأقواس المتعرجة-- 2553 01:57:23,470 --> 01:57:27,780 هذا وهذا، وهذا يعني الآن أنه قابل للوصول في كل مكان. 2554 01:57:27,780 --> 01:57:30,280 وإذا كنت في برامج سكراتش الخاصة بك تستخدم متغيرات فعليًا، 2555 01:57:30,280 --> 01:57:32,190 ربما قد لاحظت أنه يجب عليك أن تختار. 2556 01:57:32,190 --> 01:57:35,800 يجب أن تتخذ قرارًا بشأن هذا النقش المتحرك أو لجميع النقوش المتحركة. 2557 01:57:35,800 --> 01:57:40,180 كان هذا تلميحًا لما يسمى في البرمجة بمتغير 2558 01:57:40,180 --> 01:57:41,380 محلي أو عالمي. 2559 01:57:41,380 --> 01:57:44,050 هذه ما زالت محلية، وسنعود مرة أخرى لهذا المصطلح في وقت لاحق. 2560 01:57:44,050 --> 01:57:48,190 لكن له علاقة بالنطاق لأن، إذا قمت بتحديده لهذا النقش المتحرك فقط، 2561 01:57:48,190 --> 01:57:52,110 فيتيح لك فقط معهد ماساتشوستس للتكنولوجيا استخدام هذا المتغير لهذا النقش المتحرك المحدد، 2562 01:57:52,110 --> 01:57:55,510 تلك القطة أو الخروف أو أيًا كان ما تبرمجه. 2563 01:57:55,510 --> 01:57:59,620 فقط كما هو الحال في لغة C، فهذا يعني الآن أنه يمكن استخدام n هنا وهنا 2564 01:57:59,620 --> 01:58:03,010 لكن ليس في مكان آخر مثل أعلى برنامجي. 2565 01:58:03,010 --> 01:58:06,010 هذا هو النطاق. 2566 01:58:06,010 --> 01:58:09,640 لذا دعونا الآن نشاهد ما يمكن أن يحدث أكثر من هذا. 2567 01:58:09,640 --> 01:58:12,870 اسمحوا لي أمضي قدمًا وأفتح هذا لأنه من الواضح، 2568 01:58:12,870 --> 01:58:15,840 أثناء القيام بالبرمجة، هناك مشاكل أخرى يمكن أن تحدث، 2569 01:58:15,840 --> 01:58:19,260 ليس فقط القيم الكسرية للدقة، كما وصفتها سابقًا. 2570 01:58:19,260 --> 01:58:24,120 من الواضح أن هناك مشاكل أخرى يمكن أن تحدث حتى مع الأعداد الصحيحة 2571 01:58:24,120 --> 01:58:25,620 التي نوعًا ما نتجنبها كليًا. 2572 01:58:25,620 --> 01:58:30,270 لذا تذكروا أننا بدأنا التحدث عن 1، و2، و3، ولماذا هي 123 الأسبوع الماضي. 2573 01:58:30,270 --> 01:58:34,200 حسنًا، ماذا يحدث في الأرقام العشرية إذا أضفت 1 إلى 123؟ 2574 01:58:34,200 --> 01:58:35,640 ما الرقم الذي تحصل عليه؟ 2575 01:58:35,640 --> 01:58:36,340 بالتأكيد، 124. 2576 01:58:36,340 --> 01:58:40,360 إذا فعلتها مرة أخرى، 125، 26، 27، 28، 29. 2577 01:58:40,360 --> 01:58:44,940 ماذا يحدث في الأرقام العشرية إذا أضفت 1 إلى 9؟ 2578 01:58:44,940 --> 01:58:48,270 حسنًا، يجب أن أحصل على 10، لكن هذه ليست الطريقة التي نكتب بها هذا. 2579 01:58:48,270 --> 01:58:51,420 تضع 0 بدلاً من ذلك، وتنقل الـ 1. 2580 01:58:51,420 --> 01:58:53,790 هل تذكرون هذه المعطيات العقلية؟ 2581 01:58:53,790 --> 01:58:54,960 هذا كل ما نفعله هنا. 2582 01:58:54,960 --> 01:58:56,430 ثم إنها 2 زائد 1. 2583 01:58:56,430 --> 01:59:02,940 وهذا سبب أن 129 زائد 1 تساوي 130 لأنك وضعت الـ 0 ونقلت الـ 1، 2584 01:59:02,940 --> 01:59:03,580 وهكذا. 2585 01:59:03,580 --> 01:59:05,430 لذا نحن الآن نفعل كل ذلك بشكل حدسي. 2586 01:59:05,430 --> 01:59:08,190 لكن هذا له آثار على أجهزة الكمبيوتر أيضًا 2587 01:59:08,190 --> 01:59:11,940 لأنه افترضوا أن لدينا عددًا أكبر مثل 999. 2588 01:59:11,940 --> 01:59:15,660 ما الذي ستحصل عليه عند إضافة 1 إلى 999؟ 2589 01:59:15,660 --> 01:59:20,010 حسنًا، ستنقل الـ 1، وستنقل الـ 1، وستحصل على 1000. 2590 01:59:20,010 --> 01:59:24,780 لكن ماذا لو كان الكمبيوتر لديك به مساحة فقط لثلاثة أرقام؟ 2591 01:59:24,780 --> 01:59:26,940 أو ماذا لو هاتفك أو ماذا لو منبهك 2592 01:59:26,940 --> 01:59:29,010 أو أيًا كان الجهاز حرفيًا لديه فقط 2593 01:59:29,010 --> 01:59:37,570 مساحة لـ 3 أرقام، ما هو ناتج 999 زائد 1 إذا كان جهازك يحتوي على ثلاثة أرقام فقط؟ 2594 01:59:37,570 --> 01:59:39,010 حسنًا، يبدو أنه 0. 2595 01:59:39,010 --> 01:59:44,500 حتى تحصل على هذا التدفق 998،999،0. 2596 01:59:44,500 --> 01:59:46,060 إنه يتدفق، إذا جاز التعبير. 2597 01:59:46,060 --> 01:59:50,110 يسقط الواحد نوعًا ما من الناحية النظرية، وأنت تنتقل إلى القيمة التالية، 2598 01:59:50,110 --> 01:59:52,220 والتي هي 000. 2599 01:59:52,220 --> 01:59:54,320 ماذا عن النظام الثنائي؟ 2600 01:59:54,320 --> 01:59:57,940 ما هو هذا العدد في النظام الثنائي إذا قمت بترجمة الأرقام العشرية في رأسك؟ 2601 01:59:57,940 --> 02:00:02,470 وتذكر، إنه عمود الآحاد، وأعمدة الإثنينات وعمود الأربع. 2602 02:00:02,470 --> 02:00:04,000 لذا كان هذا 7 في النظام الثنائي-- 2603 02:00:04,000 --> 02:00:07,850 1، لذا هو 4 زائد 2 زائد 1، إذًا 7 في النظام الثنائي. 2604 02:00:07,850 --> 02:00:09,820 إذن كيف تقوم بالحسابات باستخدام النظام الثنائي؟ 2605 02:00:09,820 --> 02:00:11,030 إنه بالفعل الشيء نفسه. 2606 02:00:11,030 --> 02:00:15,000 ما في الأمر فقط أنك لا تملك اثنينات أو ثلاثوات أو تسعوات أو أي شيء بينهما. 2607 02:00:15,000 --> 02:00:16,210 لديك فقط آحاد وأصفار. 2608 02:00:16,210 --> 02:00:19,870 إذًا ما الذي ستحصل عليه عند إضافة 1 إلى 111؟ 2609 02:00:19,870 --> 02:00:21,100 حسنًا، إنها الفكرة نفسها. 2610 02:00:21,100 --> 02:00:23,860 أنت وضعت 0 جانبًا ولديك 1 لأن 1 زائد 1 2611 02:00:23,860 --> 02:00:26,410 تريد أن تقول 2 بالأرقام العشرية، لكن لا يوجد رقم 2. 2612 02:00:26,410 --> 02:00:27,640 لذا يتحول إلى 0. 2613 02:00:27,640 --> 02:00:28,700 لكن لديك الرقم 1. 2614 02:00:28,700 --> 02:00:32,500 1 زائد 1 يساوي 2، لكن، حسنًا، هذا 0، لديك 1. 2615 02:00:32,500 --> 02:00:33,460 1 زائد 1، هذه 2. 2616 02:00:33,460 --> 02:00:34,330 لكن لا يوجد 2. 2617 02:00:34,330 --> 02:00:36,090 لذا أرجع إلى 0، لديك الرقم 1. 2618 02:00:36,090 --> 02:00:42,200 لذا في النظام الثنائي، إذا كان لديك فقط ثلاث وحدات بايت أو وحدات بت بدلاً من ذلك، 2619 02:00:42,200 --> 02:00:47,590 إذا كان لديك فقط ثلاث وحدات بت، على ماذا ستحصل عند إضافة 1 إلى 7 في النظام الثنائي؟ 2620 02:00:47,590 --> 02:00:49,090 يبدو أنك ستحصل على 0. 2621 02:00:49,090 --> 02:00:50,570 والآن أصبح الأمر أكثر واقعية. 2622 02:00:50,570 --> 02:00:52,960 في جهاز الكمبيوتر الخاص بي، في هاتفي، في جميع الأجهزة الخاصة بك 2623 02:00:52,960 --> 02:00:55,420 إنها مجرد كمية محدودة من الذاكرة، ذاكرة الوصول العشوائي، تلك الشريحة الصغيرة 2624 02:00:55,420 --> 02:00:57,850 ذات الدوائر الصغيرة التي أظهرتها على الشاشة. 2625 02:00:57,850 --> 02:01:02,260 وهذا يحتوى على أكثر من 3 وحدات بت من الذاكرة بالتأكيد، لكنه محدود. 2626 02:01:02,260 --> 02:01:04,960 وإذا كنا نستخدم فقط، من باب المتعارف عليه، 32 بت 2627 02:01:04,960 --> 02:01:08,320 لتمثيل الأشياء أو 64 بت، ربما إذا استخدمنا الضعف أو أي شيء آخر 2628 02:01:08,320 --> 02:01:12,280 تطلق عليها "long"-- و"long" هو 64 بت عدد صحيح، في حين أن العدد الصحيح 2629 02:01:12,280 --> 02:01:14,260 عادةً 32 بت. 2630 02:01:14,260 --> 02:01:17,650 يبدو أنه، وفي مرحلةٍ ما، قد تتجاوز الأرقام 2631 02:01:17,650 --> 02:01:20,130 وسيكون بالفعل لدينا، إذا صح التعبير، 2632 02:01:20,130 --> 02:01:23,050 عدم دقة-- وهذا ما يشير إليه، تجاوز العدد الصحيح. 2633 02:01:23,050 --> 02:01:26,270 لذا يمكنك بالفعل رؤية هذا أو الدفاعات ضد هذا في العالم الحقيقي. 2634 02:01:26,270 --> 02:01:30,580 هذه لقطة شاشة من لعبة شائعة على أنظمة تشغيل مختلفة، 2635 02:01:30,580 --> 02:01:34,410 وهي لعبة تسمح لك بجمع القطع النقدية أو النقاط بالفعل، 2636 02:01:34,410 --> 02:01:35,870 أو قطع الليجو الصغيرة. 2637 02:01:35,870 --> 02:01:38,620 وإذا كنت تجمع هذه النقاط، ستلاحظ أنه في نهاية المطاف، 2638 02:01:38,620 --> 02:01:43,540 إذا كان لديك الكثير من وقت الفراغ، يمكنك تسجيل نقاط عالية فقط في هذه اللعبة. 2639 02:01:43,540 --> 02:01:45,610 ما هي أعلى نتيجة على ما يبدو، وفقًا 2640 02:01:45,610 --> 02:01:49,000 لما يظهر في لقطة الشاشة ممن التقطها بعد أن استغرق في اللعب لمدة طويلة؟ 2641 02:01:49,000 --> 02:01:51,040 لم أكن أنا. 2642 02:01:51,040 --> 02:01:54,460 4 ملايين-- لا، 4 مليارات، 4 مليارات. 2643 02:01:54,460 --> 02:01:55,720 لماذا هذا؟ 2644 02:01:55,720 --> 02:01:59,260 حسنًا، يتضح أنه إذا كانت الأرقام وأجهزة الكمبيوتر، كما اقترحت، 2645 02:01:59,260 --> 02:02:01,510 يتم تخزينها بشكل عام باستخدام 32 بت. 2646 02:02:01,510 --> 02:02:04,720 هذا يثير سؤالاً نوعًا ما، حسنًا، إلى أي مدى يمكنك العد باستخدام 32 بت؟ 2647 02:02:04,720 --> 02:02:08,230 حسناً، 32 بت تعني أنك تملك 32 صفرًا وواحدًا. 2648 02:02:08,230 --> 02:02:11,350 أكبر ما يمكن الوصول إليه هو 11111، 32 مرة. 2649 02:02:11,350 --> 02:02:15,100 وإذا كنت في الواقع تجري الحسابات باستخدام الأعمدة الصغيرة الخاصة بنا وما إلى ذلك، 2650 02:02:15,100 --> 02:02:18,460 إنها ما يقرب من 4 مليارات، وأكبر قليلاً من 4 مليارات. 2651 02:02:18,460 --> 02:02:20,630 لذا، قرر مخترعو لعبة ليجو هذه، 2652 02:02:20,630 --> 02:02:22,900 أتعرف ماذا، دعونا فقط نقول بأن أقصى عدد 2653 02:02:22,900 --> 02:02:26,510 من النقاط أو العملات التي يمكنك تجميعها في لعبة ليجو هذه هو 4 مليارات. 2654 02:02:26,510 --> 02:02:27,010 لماذا؟ 2655 02:02:27,010 --> 02:02:30,940 يبدو حتى أنها أكثر نظامًا من القيمة الفعلية أيًا كانت. 2656 02:02:30,940 --> 02:02:31,840 لكن لماذا؟ 2657 02:02:31,840 --> 02:02:38,380 كم عدد وحدات البت التي يستخدمونها لتخزين درجاتك في اللعبة بشكل افتراضي؟ 2658 02:02:38,380 --> 02:02:40,830 32 وحدة بت أو 4 وحدات بايت، وهذا هو المتعارف عليه. 2659 02:02:40,830 --> 02:02:42,790 أيًا كانت اللغة التي تمت بها برمجة هذه اللعبة، 2660 02:02:42,790 --> 02:02:47,230 فربما قد تشتمل على نوع بيانات يسمى int، ومن المتعارف عليه أن int 2661 02:02:47,230 --> 02:02:48,310 يستخدم 32 وحدة بت. 2662 02:02:48,310 --> 02:02:51,550 لذا في مرحلة ما، يجب أن يقرروا، يمكننا أيضًا استخدام المزيد من الذاكرة 2663 02:02:51,550 --> 02:02:53,050 كما اقترحت سابقًا باستخدام doubles. 2664 02:02:53,050 --> 02:02:53,970 دعونا نستخدم 64 وحدة بت. 2665 02:02:53,970 --> 02:02:56,350 بعد ذلك يمكنكم الحصول على رقم ساعات خيالي للعب اللعبة 2666 02:02:56,350 --> 02:02:57,720 والحصول على المزيد والمزيد من النقاط. 2667 02:02:57,720 --> 02:03:00,800 أو يمكننا فقط أن نقول أن هذه نقاطًا كافية ليتم تجميعها في اللعبة. 2668 02:03:00,800 --> 02:03:02,680 الآن عندما تتوقع هذا بالفعل. 2669 02:03:02,680 --> 02:03:04,660 فإن هذا لا يحدث في الواقع دومًا. 2670 02:03:04,660 --> 02:03:08,590 إذا مضينا قدمًا ونظرنا على مثال تعليمات برمجية ما-- 2671 02:03:08,590 --> 02:03:13,360 دعوني أمضي قدمًا وأفتح overflow.C. في هذا البرنامج 2672 02:03:13,360 --> 02:03:17,730 هنا، ستشاهد في سطر 8 بالفعل صيغة الخط المائل الخط المائل، 2673 02:03:17,730 --> 02:03:19,280 ولدي عدد من هذا حتى الآن. 2674 02:03:19,280 --> 02:03:20,680 لكن لم أذكرهم بالفعل. 2675 02:03:20,680 --> 02:03:23,970 من الواضح أن في لغة C، كما في سكراتش-- ومن المحتمل أنكم لم تلاحظوا هذه 2676 02:03:23,970 --> 02:03:24,820 الميزة في سكراتش-- 2677 02:03:24,820 --> 02:03:26,400 يمكنكم الحصول على ما يسمي تعليقات. 2678 02:03:26,400 --> 02:03:29,710 التعليق هو مجرد ملاحظة لك، لرفيق التدريس الخاص بك، لصديقك، 2679 02:03:29,710 --> 02:03:32,370 لزميلك، أي شخص تقوم بكتابة الرمز معه. 2680 02:03:32,370 --> 02:03:36,010 إنها فقط ملاحظة شخصية لتذكيرك بما تفعله التعليمات البرمجية. 2681 02:03:36,010 --> 02:03:39,400 بدون هذا السطر، أستطيع، لو كنت مرتاحًا بما يكفي مع البرمجة، 2682 02:03:39,400 --> 02:03:41,320 معرفة ما تفعله سطور التعليمات البرمجية هذه. 2683 02:03:41,320 --> 02:03:43,780 لكن بصراحة، إنها مضيعة للوقت، لقد كتبت التعليمات البرمجية مرة واحدة. 2684 02:03:43,780 --> 02:03:46,570 وإذا نظرت إليه في الأسابيع أو الشهور اللاحقة أو قام شخص ما بكتابته، 2685 02:03:46,570 --> 02:03:47,780 فقط أخبرني ما سيفعله. 2686 02:03:47,780 --> 02:03:52,930 لذا، فإن التعليق في البرنامج هو فقط مثل ملخص لطيف لعدد الأسطر القليلة للتعليمات البرمجية، 2687 02:03:52,930 --> 02:03:54,970 أو إنه ملخص باللغة الإنجليزية أو أي لغة منطوقة 2688 02:03:54,970 --> 02:03:59,160 يصف ما الذي قد تفعله التعليمات البرمجية التي 2689 02:03:59,160 --> 02:04:00,160 تبدو مشفرة بالفعل. 2690 02:04:00,160 --> 02:04:03,160 لذا ليس عليك أن تفكر بعمق بشأنه لفهم برنامج. 2691 02:04:03,160 --> 02:04:07,270 لذا "iteratively double i"-- iteratively تعني هنا بشكل حلقي، مرارًا 2692 02:04:07,270 --> 02:04:08,440 وتكرارًا. 2693 02:04:08,440 --> 02:04:09,250 هذا غريب. 2694 02:04:09,250 --> 02:04:12,420 لم نشاهد هذا من قبل، لكن قد تخمن ما يفعله. 2695 02:04:12,420 --> 02:04:15,330 ما الذي تفعله علامة نجمة يساوي؟ 2696 02:04:15,330 --> 02:04:16,020 إنها تضاعف. 2697 02:04:16,020 --> 02:04:19,200 إنها مثل زائد يساوي التي تضيف 1، فإن النجمة يساوي 2698 02:04:19,200 --> 02:04:21,150 تضاعف إذا كانت القيمة على اليمين هي 2. 2699 02:04:21,150 --> 02:04:26,640 إذًا هذا سيبدأ طباعة 1 ثم 2 ثم 4 ثم 8 وهكذا. 2700 02:04:26,640 --> 02:04:28,230 ولاحظ هذه الدالة. 2701 02:04:28,230 --> 02:04:29,100 إنها تسمى sleep. 2702 02:04:29,100 --> 02:04:31,200 إنها حرفيًا ستنام لمدة ثانية، 2703 02:04:31,200 --> 02:04:35,100 دالة sleep هذه بها نموذج أولي قام شخص آخر بكتابته في ملف 2704 02:04:35,100 --> 02:04:37,260 يدعى uni standard.h. 2705 02:04:37,260 --> 02:04:39,670 أعرف ذلك فقط من خلال البحث عنه في الوثائق. 2706 02:04:39,670 --> 02:04:42,000 لكن هذا ملف جديد للنوم فقط. 2707 02:04:42,000 --> 02:04:45,200 "Make overflow"، وهو ملائم تمامًا هنا. 2708 02:04:45,200 --> 02:04:47,700 واسمحوا لي بالمضي قدمًا وجعل النافذة الطرفية أكبر من 2709 02:04:47,700 --> 02:04:51,730 ذلك-- نقطة خط مائل overflow. 2710 02:04:51,730 --> 02:04:54,540 حسنًا، سوف يحدث الأمر. 2711 02:04:54,540 --> 02:04:55,050 سوف يحدث. 2712 02:04:55,050 --> 02:04:57,050 سيحدث أسرع وأسرع، إذا جاز التعبير، 2713 02:04:57,050 --> 02:05:02,560 لأننا نضيف المزيد و المزيد في كل مرة من خلال المضاعفة. 2714 02:05:02,560 --> 02:05:06,810 2000، 4000، 8000، 16000-- 2715 02:05:06,810 --> 02:05:10,670 مازال يتضاعف-- 64000، 65000. 2716 02:05:10,670 --> 02:05:12,430 نحن الآن وصلنا للملايين-- 2717 02:05:12,430 --> 02:05:15,890 2 مليون، 4، 8، 16 مليون. 2718 02:05:15,890 --> 02:05:21,860 إنها تصبح أكبر وأكبر، كل هذه الأعداد الكبيرة. 2719 02:05:21,860 --> 02:05:23,840 أوه، هذا أمر مثير للاهتمام. 2720 02:05:23,840 --> 02:05:26,370 ما الذي حدث للتو؟ 2721 02:05:26,370 --> 02:05:29,430 إذًا يتضح أنه، إذا ضاعفت الأعداد بصورةٍ كبيرةٍ بما يكفي، فستحصل على 0 في النهاية، 2722 02:05:29,430 --> 02:05:31,430 وربما أيضًا شيء لم تدرسه. 2723 02:05:31,430 --> 02:05:32,520 لذا ما الذي حدث بالفعل؟ 2724 02:05:32,520 --> 02:05:34,350 Control-C، سنلغي هذا. 2725 02:05:34,350 --> 02:05:34,950 ماذا حدث؟ 2726 02:05:34,950 --> 02:05:38,880 أنا أعني، أن البرنامج يحاول إخباري أنه، على الرغم من أنه يبدو مشفرًا قليلاً، 2727 02:05:38,880 --> 02:05:40,200 تجاوز العدد الصحيح قليلاً. 2728 02:05:40,200 --> 02:05:42,880 "Signed" تعني أنه انتقل من الإيجابية إلى السلبية بصورةٍ أساسية. 2729 02:05:42,880 --> 02:05:45,660 لذا ما الذي حدث؟ 2730 02:05:45,660 --> 02:05:46,640 ما هذا؟ 2731 02:05:46,640 --> 02:05:47,690 أجل، لقد نفدت وحدات البت. 2732 02:05:47,690 --> 02:05:49,770 أنا أضاعف العدد مرارًا وتكرارًا. 2733 02:05:49,770 --> 02:05:54,120 وفي مرحلةٍ ما، ضعّفنا العدد 1 إذا جاز التعبير وأصبح الواحد الثالث والثلاثين، 2734 02:05:54,120 --> 02:05:56,310 لذلك تجاوز حدود قيمة 32 بت، 2735 02:05:56,310 --> 02:05:59,310 وتحول فقط على ما يبدو إلى السلبية لأنه في مرحلة ما-- 2736 02:05:59,310 --> 02:06:00,640 ونحن لم نتحدث عن ذلك-- 2737 02:06:00,640 --> 02:06:04,210 يمكنك استخدام ما يمكن القول أنه الجزء الموجود في أقصى اليسار من البت للقول إنه إيجابي أو سلبي. 2738 02:06:04,210 --> 02:06:05,880 لقد تحدثنا للتو عن الإيجابية حتى الآن. 2739 02:06:05,880 --> 02:06:07,750 ثم عند هذه النقطة، وبصراحة، الكمبيوتر 2740 02:06:07,750 --> 02:06:10,780 سيستسلم حقًا لأنه لا يعرف ما المقصود أكثر من هذا. 2741 02:06:10,780 --> 02:06:14,160 لذا إذا لم تكتب تعليمات برمجية لمعالجة هذا الموقف 2742 02:06:14,160 --> 02:06:18,450 وتأكدت أن أعدادك أقل من 4 مليارات قبل أن تعمل، 2743 02:06:18,450 --> 02:06:19,920 ستحدث الأخطاء فقط. 2744 02:06:19,920 --> 02:06:24,460 وهذا قد يبدو مفتعلاً هنا، لكن هذا لم يحدث منذ فترة طويلة. 2745 02:06:24,460 --> 02:06:27,270 لذلك كان عام 1999 قبل أن يعتقد الكثير من الناس بقليل 2746 02:06:27,270 --> 02:06:30,940 أن العالم سينتهي بسبب ما يسمى بخطأ Y2K، 2747 02:06:30,940 --> 02:06:34,740 ولم يكن ذلك حقاً خطأً بينما كان افتقارًا إلى التدبر أو نقص 2748 02:06:34,740 --> 02:06:35,790 الميزات. 2749 02:06:35,790 --> 02:06:37,810 ماذا كانت مشكلة Y2K باختصار؟ 2750 02:06:41,930 --> 02:06:43,130 هل يريد شخصٌ ما أن يُجيب؟ 2751 02:06:43,130 --> 02:06:45,010 حتى ولو كان بمفهوم غير تقني، نعم. 2752 02:06:45,010 --> 02:06:48,250 الجمهور: لم يستطع الكمبيوتر عرض الرقم 2000. 2753 02:06:48,250 --> 02:06:51,340 ديفيد: أجل، لذا دعوني ألخص لكم هذا هنا. 2754 02:06:51,340 --> 02:06:54,910 لذا إذا كانوا يستخدمون فقط رقمين لعرض القيم، 2755 02:06:54,910 --> 02:07:00,100 يمكنك الخلط بين عام 2000 و عام 1900 في الواقع لأنه، 2756 02:07:00,100 --> 02:07:04,600 خلاصة القول، ما فعله الإنسان كان نوعًا ما معقولاً لأنه على مر العقود-- 2757 02:07:04,600 --> 02:07:05,740 كانت مساحة التخزين باهظة. 2758 02:07:05,740 --> 02:07:07,180 وكانت أجهزة الكمبيوتر باهظة الثمن. 2759 02:07:07,180 --> 02:07:10,780 لم تكن الذاكرة متاحة كما هي عليه الآن مع كل هذا التخزين السحابي 2760 02:07:10,780 --> 02:07:11,800 وما شابه ذلك. 2761 02:07:11,800 --> 02:07:12,560 لذا أتعرف ماذا؟ 2762 02:07:12,560 --> 02:07:18,730 لو كنا مثلاً في 1970، فهل سنهتم حقًا بعامي 1969، 1968، ناهيك عن عام 1900؟ 2763 02:07:18,730 --> 02:07:21,940 ليس حقًا لنفترض فقط أننا جميعًا في التسعينيات 2764 02:07:21,940 --> 02:07:24,820 ولم نخزن أو نعرض رقم 9 واحد. 2765 02:07:24,820 --> 02:07:26,980 دعونا فقط نخزّن رقمين لكل سنة. 2766 02:07:26,980 --> 02:07:30,710 لذا 70 تُمثل السبعينيات و99 تمثل 1999. 2767 02:07:30,710 --> 02:07:34,060 لكن المشكلة هي أن المطاف انتهى بالإنسان بتشغيل تعليمات 2768 02:07:34,060 --> 02:07:38,380 برمجية كتبوها منذ سنوات مضت، منذ عقود مضت، أكثر مما اعتقد البشر 2769 02:07:38,380 --> 02:07:39,450 أنهم قد فعلوا، لماذا. 2770 02:07:39,450 --> 02:07:41,830 حسنًا، إنه باهظ الثمن، ويعد تغيير تعليمات برمجية مضيعةً للوقت، 2771 02:07:41,830 --> 02:07:42,710 التعليمات البرمجية تعمل. 2772 02:07:42,710 --> 02:07:43,970 فلماذا نحاول أن نلغيها؟ 2773 02:07:43,970 --> 02:07:47,300 المشكلة هي، كلما كبر الأشخاص وماتوا، 2774 02:07:47,300 --> 02:07:50,140 قل عدد الأشخاص الذين على علمٍ باللغات 2775 02:07:50,140 --> 02:07:51,530 التي كتبت بها هذه البرامج أكثر وأكثر. 2776 02:07:51,530 --> 02:07:53,650 والآن من حتى الذي سيقوم بتحديث البرنامج؟ 2777 02:07:53,650 --> 02:07:57,580 لذا كانوا يخشون الكثير من المشاكل، وهذا حقًا 2778 02:07:57,580 --> 02:08:02,380 يتلخص في أن عام 1999 ربما كان سيجاوز إلى، ليس 2779 02:08:02,380 --> 02:08:05,570 الصفر في حد ذاته لكن يُفهم ضمنيًا عام 1900. 2780 02:08:05,570 --> 02:08:07,870 وبالفعل، هذا حدث بالفعل، على الرغم من أنه ليس تقريبًا 2781 02:08:07,870 --> 02:08:09,460 على قدر ما اعتقد الأشخاص. 2782 02:08:09,460 --> 02:08:12,220 لكنه حدث بقيم فعليةً أكثر منذ بضع سنوات فقط. 2783 02:08:12,220 --> 02:08:15,910 هذه طائرة بوينغ 787، طائرة حقيقية 2784 02:08:15,910 --> 02:08:18,040 كان لا بد لها من الهبوط لبعض الوقت 2785 02:08:18,040 --> 02:08:21,310 لأنه كان لديها خطأ في البرمجة. 2786 02:08:21,310 --> 02:08:24,460 وتم تلخيصه هنا في مقال على الإنترنت. 2787 02:08:24,460 --> 02:08:29,770 طائرة 787 التي تعمل بقوة وباستمرار لمدة 248 يومًا، 2788 02:08:29,770 --> 02:08:34,510 يتضح أنه كان تحذيرًا، حيث بإمكانها فقدان جميع قوتها الكهربائية 2789 02:08:34,510 --> 02:08:38,110 لأن المولد سيفشل في الوضع الآمن. 2790 02:08:38,110 --> 02:08:38,770 لمَ كان هذا؟ 2791 02:08:38,770 --> 02:08:41,800 يحدث هذا الشرط بواسطة عداد البرنامج 2792 02:08:41,800 --> 02:08:45,160 الداخلي للمولد الذي من شأنه أن يفيض 2793 02:08:45,160 --> 02:08:48,850 بعد 248 يومًا من الطاقة المستمرة. 2794 02:08:48,850 --> 02:08:50,410 لذا ترجم هذا. 2795 02:08:50,410 --> 02:08:54,310 وهذا فقط يعني أن هناك برنامج يعمل في طائرة بوينغ 787 الفعلية. 2796 02:08:54,310 --> 02:08:56,200 إنهم يستخدمون 32 بت من الأعداد الصحيحة. 2797 02:08:56,200 --> 02:08:59,680 كانوا يستخدمون تلك الأعداد الصحيحة لتخزين مئات الثواني. 2798 02:08:59,680 --> 02:09:05,440 وفي مرحلة ما إذا تركت طائرتك لمدة 248 يومًا، كل منها 2799 02:09:05,440 --> 02:09:10,000 تحتوي على 24 ساعة، 60 دقيقة في الساعة، 60 ثانية في الدقيقة، 2800 02:09:10,000 --> 02:09:15,910 و 100 أعشار من الثانية أو مئات الثواني في كل ثانية، 2801 02:09:15,910 --> 02:09:19,960 هذا المنتج الذي يقوم بضرب الأشياء يصبح سريعًا بشكٍل كبير. 2802 02:09:19,960 --> 02:09:24,820 وفي اليوم 249، ستغلق الطائرات نظريًا حتى 2803 02:09:24,820 --> 02:09:27,160 في منتصف الرحلة لأسباب حقيقيةً جدًا 2804 02:09:27,160 --> 02:09:29,080 نظرًا لأن عددًا كبيرًا جدًا من الأعداد ينزل إلى الصفر 2805 02:09:29,080 --> 02:09:31,000 وهذا يُربك المولد. 2806 02:09:31,000 --> 02:09:35,050 ومهندسو الطائرات الذكية 2807 02:09:35,050 --> 02:09:37,360 يقومون بمثل هذه الأنواع من الأخطاء بسبب البرامج، 2808 02:09:37,360 --> 02:09:40,150 ولا يتوقعون سطرًا واحدًا من التعليمات البرمجية أو بعض أسطر التعليمات البرمجية. 2809 02:09:40,150 --> 02:09:43,060 أو ، كما اقترحت، لماذا لم يستخدموا فقط المزيد من وحدات البت؟ 2810 02:09:43,060 --> 02:09:45,130 ومجددًا، هذه مخاوف حقيقية. 2811 02:09:45,130 --> 02:09:49,240 لذلك تم التعامل مع ذلك لحسن الحظ وتم حله، ولكن بالطبع ليس قبل 2812 02:09:49,240 --> 02:09:50,500 انتشار الذعر هناك. 2813 02:09:50,500 --> 02:09:54,460 هكذا يتضح، أنه في لعبة قديمة، كانت هذه لعبة Civilization. 2814 02:09:54,460 --> 02:09:57,490 ويتضح أن واحدًا من الشخصيات الذي بإمكانك اللعب بها، 2815 02:09:57,490 --> 02:10:00,880 هو غاندي، وفي الواقع لا يظهر في اللعبة كشخصيةٍ سلمية 2816 02:10:00,880 --> 02:10:02,390 كما قد تعتقد. 2817 02:10:02,390 --> 02:10:05,050 ودعونا نلقي نظرة فقط هنا لثانية لفهم السياق. 2818 02:10:05,050 --> 02:10:11,140 إذا نظرنا فعلاً على المزيد من النظام الثنائي، وهذا في النظام الثنائي 2819 02:10:11,140 --> 02:10:13,420 يعادل أي رقم عشري؟ 2820 02:10:13,420 --> 02:10:14,230 حسنًا، 1. 2821 02:10:14,230 --> 02:10:15,430 وهذه 8 وحدات بت. 2822 02:10:15,430 --> 02:10:16,470 إذًا فهي وحدة بايت كامل. 2823 02:10:16,470 --> 02:10:17,380 8 وحدات بت تكوّن بايت-- 2824 02:10:17,380 --> 02:10:19,820 1، 2، 3، 4، 5، 6، 7، 8. 2825 02:10:19,820 --> 02:10:25,150 ما الذي ستحصل عليه إذا قمت بإنقاص واحد-- 2826 02:10:25,150 --> 02:10:28,280 حسنًا، إذا قمت بطرح 1 من هذا، من الواضح أنك تحصل على ماذا؟ 2827 02:10:28,280 --> 02:10:28,900 أصفار. 2828 02:10:28,900 --> 02:10:30,670 إذًا، فإن 1 ناقص 1 يساوي 0 فقط. 2829 02:10:30,670 --> 02:10:35,050 ماذا لو قمت بطرح 2 من هذه القيمة؟ 2830 02:10:35,050 --> 02:10:36,900 ماذا يحدث؟ 2831 02:10:36,900 --> 02:10:39,840 هذا في الواقع يسمى تجاوز الحد الأدنى للأعداد الصحيحة، وهو على النقيض تمامًَا، 2832 02:10:39,840 --> 02:10:42,340 ولكن في الحقيقة لا يوجد خيارات كثيرة للتفكير في هذا الأمر. 2833 02:10:42,340 --> 02:10:43,810 إذا كان لديك أصفار وواحدات فقط، يمكنك على الأرجح 2834 02:10:43,810 --> 02:10:45,700 فتخيل ما هو السيناريو السيئ. 2835 02:10:45,700 --> 02:10:51,210 ففي حال العدد 0000001، إذا طرحتَ 1، فسيتحول إلى أصفار، ثم إذا أعدتَ ذلك، 2836 02:10:51,210 --> 02:10:57,940 فأنت الآن تتجاوز الحد الأدنى، والذي يأتيك بناتج يمثل العكس تقريبًا وهو 11111111. 2837 02:10:57,940 --> 02:11:02,160 لذا فإن كان لديك 8 واحدات، فما قيمة ذلك إذا قمت بعملية رياضية؟ 2838 02:11:02,160 --> 02:11:04,980 واحدات، اثنانات، أربعات، ثمانية 16. 2839 02:11:04,980 --> 02:11:08,100 يتضح أنه 255 إذا كنت فعلاً تجري جميع الحسابات. 2840 02:11:08,100 --> 02:11:10,710 لذا يتضح أن هذه اللعبة Civilization 2841 02:11:10,710 --> 02:11:13,830 كانت تستخدم بايت واحد لتمثل مستوى كل شخصية من 2842 02:11:13,830 --> 02:11:15,690 العدوانية في اللعبة. 2843 02:11:15,690 --> 02:11:18,150 وكان غاندي، كما قد تتوقع، افتراضيًا 2844 02:11:18,150 --> 02:11:21,120 يهيئ إلى 1، غير عدواني جدًا. 2845 02:11:21,120 --> 02:11:24,240 لسوء الحظ، في هذه اللعبة Civilization، 2846 02:11:24,240 --> 02:11:28,380 عندما يطبق اللاعب الديمقراطية في حضارته أو حضارتها، 2847 02:11:28,380 --> 02:11:32,730 ستقل عدوانيته تلقائيًا بمعدل اثنين. 2848 02:11:32,730 --> 02:11:36,970 وحتى إذا أصبح غاندي ديمقراطيًا، عدوانيته لن تقل إلى سالب واحد. 2849 02:11:36,970 --> 02:11:40,590 ولكن سيدور ليصبح رقمًا مرتفعًا جدًا 255، 2850 02:11:40,590 --> 02:11:44,870 مما يجعله عدوانيًا كما يمكن للحضارة أن تكون. 2851 02:11:44,870 --> 02:11:48,880 إذًا مثال أقل تأثيرًا، للتأكيد، من مثال الطائرة، 2852 02:11:48,880 --> 02:11:50,640 لكن هذه المشاكل موجودة في كل مكان. 2853 02:11:50,640 --> 02:11:52,980 وإذا بدأت في متابعة وسائل الإعلام الشعبية 2854 02:11:52,980 --> 02:11:55,050 أو عندما توجد أخطاء أو اختراقات أو استغلالات، 2855 02:11:55,050 --> 02:12:01,440 غالبًا ما يكون ذلك بسبب قيام مبرمج أو مبرمجة بخطأ في التعليمات البرمجية. 2856 02:12:01,440 --> 02:12:04,980 لم يتوقعوا سيناريو ما أو اتخذوا قرارات منطقية 2857 02:12:04,980 --> 02:12:07,140 منذ سنوات، ولكن هذا أثبت في نهاية المطاف أننا 2858 02:12:07,140 --> 02:12:10,560 مازلنا سُذج حيث أننا مازلنا نعمل بالتعليمات البرمجية نفسها، وأصبحت الأرقام كبيرةً جدًا، 2859 02:12:10,560 --> 02:12:11,740 وحساباتهم خاطئة. 2860 02:12:11,740 --> 02:12:13,150 وهكذا تحدث أشياء خطيرة فعلاً. 2861 02:12:13,150 --> 02:12:15,400 ولكن الأهم بالنسبة لنا هو مجرد فهم 2862 02:12:15,400 --> 02:12:17,800 كيف ولماذا تحدث هذه الأشياء. 2863 02:12:17,800 --> 02:12:19,600 وماذا سنفعل في الأيام القادمة؟ 2864 02:12:19,600 --> 02:12:22,350 لذا فالواجب المنزلي التالي، مثلما كان مع سكراتش، سيكون بمثابة برمجة شيءٍ ما 2865 02:12:22,350 --> 02:12:24,450 لكن هذه المرة بلغة C، ستستخدم بيئة 2866 02:12:24,450 --> 02:12:27,720 تسمى مختبر CS50، والذي هو أساسًا CS50 sandbox، والذي 2867 02:12:27,720 --> 02:12:28,740 كنا نعمل بواسطته اليوم. 2868 02:12:28,740 --> 02:12:31,760 لكنه يضيف الإرشادات ومواصفات المشاكل 2869 02:12:31,760 --> 02:12:32,850 التي سترغب في حلها. 2870 02:12:32,850 --> 02:12:35,310 وسوف يرشدك في البداية من خلال بعض هذه الخطوات. 2871 02:12:35,310 --> 02:12:37,180 لستم بحاجة إلى كتابة كل شيء وحفظ 2872 02:12:37,180 --> 02:12:39,690 كل ما كتبته اليوم، ولكن لا تترددوا في هذه الأثناء 2873 02:12:39,690 --> 02:12:42,750 للذهاب إلى موقع الدورة واللعب مع أيٍ من هذه الأمثلة. 2874 02:12:42,750 --> 02:12:46,510 من بين التحديات القادمة سيكون هناك إعادة إنشاء بعض مقتطفات من الألعاب 2875 02:12:46,510 --> 02:12:49,560 من العام الماضي، والتفكير في كيفية ترجمة الأشياء التي قد تكون رأيتها تكبر 2876 02:12:49,560 --> 02:12:51,360 إلى تعليمات برمجية فعلية. 2877 02:12:51,360 --> 02:12:54,600 ومما لا شك فيه، من بين الأشياء الأولى التي ستشعرون بها، هو الإحباط. 2878 02:12:54,600 --> 02:12:57,480 ستنسون الفاصلة المنقوطة الغبية أو أين تذهب الأقواس؟ 2879 02:12:57,480 --> 02:12:58,530 وستضطرون للنظر إلى التعليمات البرمجية. 2880 02:12:58,530 --> 02:13:00,810 ولكن ضعوا في اعتباركم، لا شيء من تلك الأشياء يهم. 2881 02:13:00,810 --> 02:13:04,230 أنه أمر محبط للغاية في البداية، ولكن الذي يهم هو الأفكار 2882 02:13:04,230 --> 02:13:06,210 وبصراحة، الشعور بالرضا 2883 02:13:06,210 --> 02:13:08,520 الذي تشعر به، مثل كل طاقم CS50 قبلك، 2884 02:13:08,520 --> 02:13:11,610 في نهاية المطاف عندما تصمم أو تخلق شيءً بالفعل خاصًا بك. 2885 02:13:11,610 --> 02:13:14,960 دعونا نتوقف هنا، وسنراكم المرة القادمة.