1 00:00:01,000 --> 00:00:01,000 [MUSIC PLAYING] 2 00:00:49,690 --> 00:00:50,960 ديفيد ج. مالان: حسنًا. 3 00:00:50,960 --> 00:00:54,520 هذه هي دورة CS50 وهذه بداية الأسبوع الثاني. 4 00:00:54,520 --> 00:00:56,730 وسنتذكر أنه على مدار الأسبوعين الماضيين، 5 00:00:56,730 --> 00:00:57,410 كنا نقوم بمرحلة التأسيس. 6 00:00:57,410 --> 00:01:00,110 أولاً بدايةً من لغة سكراتش، لغة البرمجة الرسومية 7 00:01:00,110 --> 00:01:04,580 التي قمنا فيما بعد، تحديدًا الأسبوع الماضي، بترجمتها إلى البرنامج المكافئ NC. 8 00:01:04,580 --> 00:01:07,040 وبالطبع، يوجد الآن بناء جملة على نحو أكبر بكثير. 9 00:01:07,040 --> 00:01:11,090 إنه نص بالكامل لكن الأفكار، كما نتذكر، في الأساس هي ذاتها. 10 00:01:11,090 --> 00:01:13,520 والجانب السلبي هو أن أجهزة الكمبيوتر لا تفهم هذا. 11 00:01:13,520 --> 00:01:15,260 فما اللغة التي تفهمها فقط؟ 12 00:01:15,260 --> 00:01:16,510 الجمهور: [INAUDIBLE] 13 00:01:16,510 --> 00:01:18,610 ديفيد ج. مالان: أصفار وواحدات أو النظام الثنائي. 14 00:01:18,610 --> 00:01:23,650 وبالتالي هناك خطوة ضرورية لنا للوصول من هذه التعليمة البرمجية إلى النظام الثنائي. 15 00:01:23,650 --> 00:01:26,890 وما هو الاسم الذي كان يُطلق على تلك الخطوة أو ذلك البرنامج أو الإجراء؟ 16 00:01:26,890 --> 00:01:27,770 الجمهور: [INAUDIBLE] 17 00:01:27,770 --> 00:01:28,640 ديفيد ج. مالان: أجل، إذن هو التحويل البرمجي. 18 00:01:28,640 --> 00:01:30,640 وبالطبع، تذكرون بما أنكم الآن قد خضتم التجربة 19 00:01:30,640 --> 00:01:32,710 مع هذا الإجراء في الأسبوع الماضي فإنه لإجراء التحويل البرمجي لبرنامج، 20 00:01:32,710 --> 00:01:34,510 يمكنكم استخدام أداة التحويل البرمجي clang الخاصة بلغة C. 21 00:01:34,510 --> 00:01:36,410 يمكنكم فقط قول clang ثم اسم الملف 22 00:01:36,410 --> 00:01:37,450 الذي تريدون تحويله برمجيًا. 23 00:01:37,450 --> 00:01:40,090 وتلك المخرجات بشكلٍ افتراضي تسمى على نحو غريب جدًا باسم برنامج. 24 00:01:40,090 --> 00:01:41,740 Just a dot out. 25 00:01:41,740 --> 00:01:43,180 والتي تشير إلى مُخرَج برنامج التجميع. 26 00:01:43,180 --> 00:01:44,690 علاوةً على ذلك أنه يتم في الحال. 27 00:01:44,690 --> 00:01:47,390 لكن تذكروا أيضًا أنكم تستطيعون تجاوز هذا السلوك الافتراضي. 28 00:01:47,390 --> 00:01:49,480 ويمكنكم في الواقع أن تقولوا، Output "مخرَج" بدلاً من program "برنامج" 29 00:01:49,480 --> 00:01:52,120 ويُسمى، hello بدلاً من just a dot out. 30 00:01:52,120 --> 00:01:55,120 لكن يمكنكم القيام بخطوة أخرى إضافية، ويمكنكم بالفعل استخدام أداة Make. 31 00:01:55,120 --> 00:01:58,180 وأداة Make في حد ذاتها ليست أداة تحويل برمجي، بل إنها أداة بناء مساعدة. 32 00:01:58,180 --> 00:02:00,970 لكن بمصطلح غير المتخصصين، ما الذي تفعله لنا؟ 33 00:02:00,970 --> 00:02:02,350 الجمهور: [INAUDIBLE] 34 00:02:02,350 --> 00:02:03,580 ديفيد ج. مالان: تقوم بتحويله برمجيًا. 35 00:02:03,580 --> 00:02:07,000 وهي في الأساس تكتشف كل وسيطات سطر الأوامر تلك 36 00:02:07,000 --> 00:02:08,950 ذات المظهر التشفيري. 37 00:02:08,950 --> 00:02:10,630 مثل -o "شرطة o" شيء ما، وما إلى ذلك. 38 00:02:10,630 --> 00:02:12,340 لذلك يتم بناء البرنامج تمامًا بالطريقة 39 00:02:12,340 --> 00:02:14,200 التي نريدها دون أن نضطر لتذكر 40 00:02:14,200 --> 00:02:16,540 تلك الطلاسم السحرية كما تبدو. 41 00:02:16,540 --> 00:02:20,410 وبالرغم من أن هذا يعمل فقط على برامج بسيطة مثل هذا. 42 00:02:20,410 --> 00:02:23,000 إلا أنه في الواقع، فربما واجه البعض منكم من ذوي المشكلات الأخيرة 43 00:02:23,000 --> 00:02:25,420 أخطاء في التجميع والتي في الواقع 44 00:02:25,420 --> 00:02:29,410 لم تصادفنا عن قصد في الفصل لأن أداة Make كانت تساعدنا. 45 00:02:29,410 --> 00:02:31,900 في الواقع، بمجرد قيامك بتحسين برنامج ما 46 00:02:31,900 --> 00:02:36,760 ليأخذ بالفعل مدخلات المستخدم باستخدام مكتبة CS50 بتضمين CS50 نقطة H، 47 00:02:36,760 --> 00:02:39,940 فربما يكون البعض منكم قد أدرك أن أداة تحديد الوصول، وبشكل أعمّ أداة Clang، 48 00:02:39,940 --> 00:02:43,150 إذ فجأةً، لم تكن تعرف ما هو get_string. 49 00:02:43,150 --> 00:02:45,950 وبصراحة، ربما لم تكن أداة Clang حتى تعرف ما هي السلسلة. 50 00:02:45,950 --> 00:02:49,630 وذلك لأن هاتين الأداتين هما ميزتان لمكتبة CS50 51 00:02:49,630 --> 00:02:51,640 واللتين يجب عليك تعليمهما لأداة Clang. 52 00:02:51,640 --> 00:02:57,250 ولكن لا يكفيك تعليم أداة Clang كيف تبدوان، من خلال تضمين CS50.h. 53 00:02:57,250 --> 00:03:01,360 يتضح أن هناك خطوة ناقصة تساعدنا أداة Make في حلها 54 00:03:01,360 --> 00:03:04,610 لكن يمكنك أيضًا حلها يدويًا إذا أردت. 55 00:03:04,610 --> 00:03:08,650 وبذلك فأنا أعني هذا، بدلاً من التحويل البرمجي لبرنامج فقط باستخدام Clang، 56 00:03:08,650 --> 00:03:09,670 hello.c. 57 00:03:09,670 --> 00:03:13,560 عندما تريد استخدام مكتبة CS50، تحتاج بالفعل 58 00:03:13,560 --> 00:03:15,690 لإضافة وسيط سطر الأوامر الإضافي هذا. 59 00:03:15,690 --> 00:03:18,820 على وجه التحديد في النهاية، لا يمكن الانتقال في البداية مثل dash-O. 60 00:03:18,820 --> 00:03:20,410 وتشير dash-L إلى الرابط. 61 00:03:20,410 --> 00:03:24,250 وهذه طريقة لإخبار Clang، وبالمناسبة عند التحويل البرمجي للبرنامج الخاص بي، 62 00:03:24,250 --> 00:03:28,210 فيُرجى الربط في مستوى الأصفار والواحدات في CS50 والتي كتبناها نحن طاقم العمل 63 00:03:28,210 --> 00:03:31,590 قبل بضعة أسابيع وقمنا بتثبيتها لك في أداة تحديد الوصول. 64 00:03:31,590 --> 00:03:33,340 إذن فقد حصلتَ على الأصفار والواحدات الخاصة بك ومن ثم 65 00:03:33,340 --> 00:03:35,560 حصلتَ على الأصفار والواحدات الخاصة بنا إذا جاز التعبير. 66 00:03:35,560 --> 00:03:38,540 ويتم نطق dash-LCS50 لربطها معًا. 67 00:03:38,540 --> 00:03:42,340 لذا فأيًا ما كنتَ تحصل نوعًا ما على خطأ مرجعي غير معرّف إلى get_string 68 00:03:42,340 --> 00:03:43,270 أو لم تحصل-- 69 00:03:43,270 --> 00:03:46,480 فقد تعذر علينا إجراء تحويل برمجي لبرنامج استخدم للتو أيًا من دوالّ get 70 00:03:46,480 --> 00:03:47,830 من مكتبة CS50. 71 00:03:47,830 --> 00:03:51,550 والاحتمالات هي، ربما قد تم إصلاح هذا التغيير البسيط dash-LCS50. 72 00:03:51,550 --> 00:03:54,430 لكن بالطبع، هذا ليس شيئًا مثيرًا للاهتمام لكي نتذكره، فما بالك 73 00:03:54,430 --> 00:03:57,220 بتذكر كيفية استخدام dash-0 كذلك، عند النقطة التي 74 00:03:57,220 --> 00:03:59,600 يصبح الأمر فيها مملاً حقًا للكتابة. 75 00:03:59,600 --> 00:04:00,700 لذا هنا تأتي، أداة Make مجددًا. 76 00:04:00,700 --> 00:04:02,270 تقوم أداة Make بالتشغيل التلقائي لكل هذا لأجلنا. 77 00:04:02,270 --> 00:04:04,690 وفي الواقع، إذا كنتَ من الآن فصاعدًا ستبدأ في تشغيل أداة Make ثم 78 00:04:04,690 --> 00:04:08,500 تولي مزيدًا من الاهتمام لسطر المخرجات الطويل تمامًا والذي تقوم الأداة بإخراجه، 79 00:04:08,500 --> 00:04:11,180 فسترى فعليًا إشارةً لـ dash-LCS50، 80 00:04:11,180 --> 00:04:14,200 سترى إشارة كذلك إلى dash-LM، والتي تشير إلى الرياضيات. 81 00:04:14,200 --> 00:04:16,410 لذا إذا كنت تستخدم جولة، على سبيل المثال، فربما اكتشفتَ 82 00:04:16,410 --> 00:04:18,760 أن الجولة الثانية أيضًا 83 00:04:18,760 --> 00:04:21,880 لا تعمل خارج الصندوق إلا إذا استخدمت أداة Make نفسها 84 00:04:21,880 --> 00:04:25,030 أو هذا النهج الأكثر دقة. 85 00:04:25,030 --> 00:04:28,200 لذا فكل ما يمكن قوله هو أن التحويل البرمجي ما هو إلا كذبة بيضاء. 86 00:04:28,200 --> 00:04:31,120 مثلاً، نعم لقد قمتَ بالتحويل البرمجي وكنتَ تنتقل من التعليمة البرمجية للمصدر 87 00:04:31,120 --> 00:04:32,530 إلى التعليمة البرمجية للآلة. 88 00:04:32,530 --> 00:04:35,380 ولكن يتضح أنه كان هناك عدد من الخطوات الأخرى التي تحدث 89 00:04:35,380 --> 00:04:37,720 لك والتي سنقوم فقط بوضع بعض التسميات عليها اليوم. 90 00:04:37,720 --> 00:04:40,190 في نهاية اليوم، سنقوم فقط بكسر التجريد. 91 00:04:40,190 --> 00:04:42,930 لذا فإن التحويل البرمجي هو هذا التجريد من التعليمة البرمجية للمصدر إلى التعليمة البرمجية للآلة. 92 00:04:42,930 --> 00:04:45,190 دعونا نقوم فقط نوعًا ما بالتكبير لفترة وجيزة لتقدير 93 00:04:45,190 --> 00:04:47,860 ما يجري هنا على أمل أن يجعل التعليمة البرمجية 94 00:04:47,860 --> 00:04:50,590 التي نقوم بتحويلها برمجيًا أكثر قابلية للفهم. 95 00:04:50,590 --> 00:04:54,610 لذا فالخطوة الأولى من أربعة، والتي تتعلق بتحويل برمجي لبرنامج بالفعل 96 00:04:54,610 --> 00:04:55,780 تُسمى مرحلة المعالجة المسبقة. 97 00:04:55,780 --> 00:04:58,330 لذلك تذكروا أن هذا البرنامج الذي اطّلعنا عليه للتو كان فيه زوج 98 00:04:58,330 --> 00:05:00,440 من التضمينات بأعلى الملف. 99 00:05:00,440 --> 00:05:02,740 وهما يعرفان عامةً باسم توجيهات المعالجة المسبقة. 100 00:05:02,740 --> 00:05:05,380 ليس مصطلحًا مثيرًا للاهتمام بشكل خاص ولكن يتم 101 00:05:05,380 --> 00:05:08,380 ترسيمه بواسطة علامة التجزئة في بداية هذه السطور. 102 00:05:08,380 --> 00:05:12,230 وتلك إشارة إلى Clang أنه يجب معالجة هذه الأشياء أولاً. 103 00:05:12,230 --> 00:05:13,270 أن تتم معالجتها مسبقًا. 104 00:05:13,270 --> 00:05:15,250 المعالجة قبل أي شيء آخر. 105 00:05:15,250 --> 00:05:20,260 وفي الواقع، فإن السبب وراء هذا قد ناقشناه في الأسبوع الماضي، ضمن CS50.h 106 00:05:20,260 --> 00:05:21,790 ما هو، على سبيل المثال؟ 107 00:05:21,790 --> 00:05:24,300 الجمهور: [INAUDIBLE] 108 00:05:24,300 --> 00:05:27,460 ديفيد ج. مالان: على وجه الخصوص، إعلان دوالّ get string. 109 00:05:27,460 --> 00:05:30,540 لذلك توجد بعض سطور التعليمة البرمجية، النموذج الأولي إذا كنتم تذكرون، 110 00:05:30,540 --> 00:05:34,770 الذي يكون هو سطر التعليمة البرمجية الذي يعلّم Clang ما هي المدخلات لـ get_string 111 00:05:34,770 --> 00:05:35,910 وما هي المخرجات. 112 00:05:35,910 --> 00:05:38,590 نوع الإرجاع ونوع الوسيطات، إذا جاز التعبير. 113 00:05:38,590 --> 00:05:42,380 وهكذا عندما تقوم بتضمين CS50.h في أعلى الملف، فما 114 00:05:42,380 --> 00:05:45,780 يحدث عندما تقوم بتشغيل Clang لأول مرة خلال ما يسمى بخطوة المعالجة المسبقة، 115 00:05:45,780 --> 00:05:49,890 هو أن أداة Clang تبحث على القرص الصلب عن الملف المسمى حرفيًا باسم CS50.h. 116 00:05:49,890 --> 00:05:54,940 وهي تمسك بمحتوياتها وتقوم أساسًا بالعثور على هذا السطر واستبداله هنا. 117 00:05:54,940 --> 00:05:58,800 لذا يوجد في مكان ما في CS50.h خط كهذا الأصفر الظاهر هنا 118 00:05:58,800 --> 00:06:02,050 يقول إن get_string، هي دالّة تقوم بإرجاع سلسلة. 119 00:06:02,050 --> 00:06:05,340 كما يأخذ كمُدخَل، سلسلةً سنطلق عليها prompt "مطالبة"، 120 00:06:05,340 --> 00:06:06,930 والتي تسمى وسيطة. 121 00:06:06,930 --> 00:06:10,680 وفي الوقت نفسه، مع تضمين الإدخال/الإخراج القياسي. فما الهدف من تضمين ذلك؟ 122 00:06:10,680 --> 00:06:14,180 ما المفترض أن يُعلن عنه بداخل ذلك الملف؟ 123 00:06:14,180 --> 00:06:14,680 أجل؟ 124 00:06:14,680 --> 00:06:16,110 الجمهور: إنها المدخلات والمخرجات القياسية. 125 00:06:16,110 --> 00:06:17,220 ديفيد ج. مالان: المدخلات والمخرجات القياسية. 126 00:06:17,220 --> 00:06:19,020 وبصورةٍ أكثر تحديدًا، ما هو المثال الموجود هناك؟ 127 00:06:19,020 --> 00:06:19,600 أي دالة؟ 128 00:06:19,600 --> 00:06:20,470 الجمهور: [INAUDIBLE] 129 00:06:20,470 --> 00:06:21,560 ديفيد ج. مالان: إذن هي printf. 130 00:06:21,560 --> 00:06:22,950 الدالّة الأخرى التي نستمر باستخدامها. 131 00:06:22,950 --> 00:06:26,860 لذا فضمن io.h القياسي، في مكان ما على القرص الصلب الخاص بأداة تحديد الوصول 132 00:06:26,860 --> 00:06:29,700 يوجد بالمثل سطر من التعليمة البرمجية يبدو بصراحة غامضًا بدرجة أكثر قليلاً 133 00:06:29,700 --> 00:06:31,400 لكننا سنعود لهذا النوع من الأشياء 134 00:06:31,400 --> 00:06:33,540 في الطريق، والذي يقول إن printf هي دالّة. 135 00:06:33,540 --> 00:06:36,120 يحدث رجوع إلى int، لكن بأكثر من ذلك في وقتٍ آخر. 136 00:06:36,120 --> 00:06:38,730 يحدث أخذ تنسيق char*. 137 00:06:38,730 --> 00:06:40,150 لكن أكثر من ذلك في وقتٍ آخر. 138 00:06:40,150 --> 00:06:41,900 في الواقع، هذا هو أحد الأسباب التي تجعلنا نُخفي 139 00:06:41,900 --> 00:06:44,280 هذه التفاصيل في وقت مبكر نظرًا لوجود بناء جملة ما لا يمثل 140 00:06:44,280 --> 00:06:45,500 إلا تشتيتًا في الوقت الراهن. 141 00:06:45,500 --> 00:06:46,800 لكن هذا كل ما يحدث. 142 00:06:46,800 --> 00:06:50,640 تقوم علامة التضمين الحاد فقط بالعثور على المحتويات واستبدالها. 143 00:06:50,640 --> 00:06:54,460 زائد نقطة، نقطة، نقطة، مجموعة من أشياء أخرى في تلك الملفات كذلك. 144 00:06:54,460 --> 00:06:56,450 لذا عندما نقول مرحلة المعالجة المسبقة، فإننا نعني فقط 145 00:06:56,450 --> 00:06:59,370 أن يتم استبدالها حتى لا تضطر إلى النسخ واللصق 146 00:06:59,370 --> 00:07:01,470 لهذا النوع من الأشياء يدويًا بنفسك. 147 00:07:01,470 --> 00:07:04,770 لذا، فإن "التحويل البرمجي" هي كلمة لها في الواقع معنى محدد جيدًا. 148 00:07:04,770 --> 00:07:08,370 فبمجرد إجرائك لمرحلة المعالجة المسبقة، فستبدو التعليمة البرمجية لديك في الأساس كهذه، 149 00:07:08,370 --> 00:07:11,820 دون علمك، ثم تأتي خطوة التحويل البرمجي الفعلية. 150 00:07:11,820 --> 00:07:15,930 وتتحول هذه التعليمة البرمجية هنا إلى هذه التعليمة البرمجية هنا. 151 00:07:15,930 --> 00:07:18,840 يبدو هذا الآن مخيفًا، وهذا شيء نوعًا ما يشبه 152 00:07:18,840 --> 00:07:21,300 كأن تحصل على دورة دراسية مثل CS61 في جامعة هارفارد، 153 00:07:21,300 --> 00:07:23,610 أو، بشكلٍ أعمّ، برمجة الأنظمة، إذا جاز التعبير، 154 00:07:23,610 --> 00:07:25,180 فقد ترى شيئًا مشابهًا لهذا. 155 00:07:25,180 --> 00:07:28,550 هذه هي تعليمات تجميعة x86 64-bit. 156 00:07:28,550 --> 00:07:31,140 والشيء الوحيد المثير للاهتمام هو بشأن هذا الادعاء في الوقت الحالي 157 00:07:31,140 --> 00:07:32,220 بأن تلك التجميعة-- 158 00:07:32,220 --> 00:07:35,540 وقد أشرتُ نوعًا ما إلى ذلك من قبل-- هي مُخرَج برنامج التجميع، a.out. 159 00:07:35,540 --> 00:07:38,250 هناك بالفعل علاقة هنا، ولكن خلاصة القول، هذه 160 00:07:38,250 --> 00:07:41,880 هي التعليمات من المستوى الأدنى التي تفهمها فقط وحدة المعالجة المركزية (CPU)، 161 00:07:41,880 --> 00:07:44,700 العقل الموجود داخل جهاز الكمبيوتر لديك. 162 00:07:44,700 --> 00:07:48,150 وحدة المعالجة المركزية الخاصة بك لا تفهم لغة C. وهي لا تفهم Python أو C++ 163 00:07:48,150 --> 00:07:50,550 أو Java أو أي لغة قد تكون مألوفة لديك. 164 00:07:50,550 --> 00:07:53,160 إنها تفهم فقط هذا الشيء الذي يبدو غامضًا. 165 00:07:53,160 --> 00:07:56,820 ولكن بصراحة، بمجرد النظر إليها، فقد تكتشف أن البرمجة في هذه الوحدة ربما 166 00:07:56,820 --> 00:07:58,170 ليست بالأمر الممتع. 167 00:07:58,170 --> 00:08:00,990 أعني، يمكن القول، إنها ليست على هذا القدر الممتع للبرمجة في لغة C، 168 00:08:00,990 --> 00:08:03,210 لذلك فهذا يبدو أكثر غموضًا. 169 00:08:03,210 --> 00:08:04,250 ولكن لا مشكلة. 170 00:08:04,250 --> 00:08:07,440 فلُغة C والكثير من اللغات هي مجرد هذه التجريدات 171 00:08:07,440 --> 00:08:10,380 الموجودة بأعلى برامج المستوى الأدنى التي تفهمها وحدات المعالجة المركزية بالفعل 172 00:08:10,380 --> 00:08:13,230 لذا فلا داعي لأن نقلق بشأن هذا الموضوع إلى هذا الحد. 173 00:08:13,230 --> 00:08:16,470 ولكن إذا سلطنا الضوء على بضعة مصطلحات، سترى بعض الأشياء المألوفة هنا. 174 00:08:16,470 --> 00:08:19,500 لذا فالمصطلح الأساسي تتم الإشارة إليه في هذا المعروف باسم التعليمة البرمجية للتجميع. 175 00:08:19,500 --> 00:08:21,570 ترون الإشارة إلى دالتي get string و printf، 176 00:08:21,570 --> 00:08:23,170 لذا فنحن لا نضيّع المعلومات. 177 00:08:23,170 --> 00:08:27,650 إنه يُقدَّم حقًا بلُغة مختلفة، لغة التجميع. 178 00:08:27,650 --> 00:08:31,510 الآن يمكنكم اكتشاف، ربما، من بعض من أسماء هذه التعليمات، 179 00:08:31,510 --> 00:08:33,450 هذا ما يعنيه شعار Intel Inside. 180 00:08:33,450 --> 00:08:37,380 فعندما تتمكن Intel أو أي علامة تجارية من وحدات المعالجة المركزية من فهم التعليمات، 181 00:08:37,380 --> 00:08:42,210 فهذا يعني أشياء مثل الدفع والتحريك والطرح والاتصال. 182 00:08:42,210 --> 00:08:44,530 وهذه كلها دوالّ وأفعال منخفضة المستوى، 183 00:08:44,530 --> 00:08:46,680 إذا جاز التعبير، ولكن في مستوى وحدة المعالجة المركزية. 184 00:08:46,680 --> 00:08:48,960 ولكن لتفاصيل أكثر من ذلك، يمكنكم الحصول على دورات كاملة. 185 00:08:48,960 --> 00:08:51,450 ولكن فقط لكشف النقاب عن هذا اليوم، 186 00:08:51,450 --> 00:08:54,930 فهذه خطوة كانت تحدث لنا بطريقة سحرية دون علم أحد، 187 00:08:54,930 --> 00:08:57,350 بفضل Clang. 188 00:08:57,350 --> 00:09:00,690 إذن التجميع-- الآن وقد حصلتَ على هذه التعليمة البرمجية التي تبدو غامضة والتي لن 189 00:09:00,690 --> 00:09:02,910 نراها مجددًا-- لن تحتاج إلى مُخرَج مجددًا-- 190 00:09:02,910 --> 00:09:03,880 فما الذي ستفعله به؟ 191 00:09:03,880 --> 00:09:07,110 حسنًا، قلتم سابقًا إن أجهزة الكمبيوتر تفهم فقط الأصفار والواحدات، 192 00:09:07,110 --> 00:09:12,630 إذن فالخطوة الثالثة هي في الواقع تحويل لغة التجميع هذه إلى أصفار وواحدات فعلية 193 00:09:12,630 --> 00:09:15,090 تبدو الآن هكذا. 194 00:09:15,090 --> 00:09:17,460 لذا تحدث خطوة التجميع، دون علمك، 195 00:09:17,460 --> 00:09:19,170 في كل مرة تقوم فيها بتشغيل Clang أو، بدورها، بتشغيل 196 00:09:19,170 --> 00:09:22,120 أداة make، فنحصل على أصفار وواحدات من التعليمة البرمجية للتجميع، 197 00:09:22,120 --> 00:09:25,500 وسنحصل على التعليمة البرمجية للتجميع في C-code لديك. 198 00:09:25,500 --> 00:09:28,830 لكن إليكم الخطوة الرابعة والأخيرة. 199 00:09:28,830 --> 00:09:32,670 تذكروا أننا نحتاج للربط مع الأصفار والواحدات لدى أشخاص آخرين. 200 00:09:32,670 --> 00:09:34,560 إذا كنت تستخدم دالة printf فأنت لم تكتب تلك الدالة. 201 00:09:34,560 --> 00:09:36,940 إنما قام شخصٌ آخر بإنشاء تلك الأصفار والواحدات، وهي الأنماط 202 00:09:36,940 --> 00:09:38,190 التي يفهمها الكمبيوتر. 203 00:09:38,190 --> 00:09:39,390 أنت لم تنشيء get string. 204 00:09:39,390 --> 00:09:41,820 نحن فعلنا، لذا تحتاج للوصول إلى تلك الأصفار والواحدات 205 00:09:41,820 --> 00:09:44,250 حتى يتمكن برنامجك من استخدامها أيضًا. 206 00:09:44,250 --> 00:09:45,930 لذا الربط، في الأساس، يفعل هذا. 207 00:09:45,930 --> 00:09:48,490 إذا كنت قد كتبت برنامجًا-- على سبيل المثال، hello.c-- 208 00:09:48,490 --> 00:09:51,450 وحدث وأن استخدم زوجًا من المكتبات الأخرى، 209 00:09:51,450 --> 00:09:53,970 وهي الملفات التي كتبها أشخاص آخرون لتعليمة برمجية مفيدة 210 00:09:53,970 --> 00:09:57,970 لك، مثل cs50.c، والتي تجدها في مكانٍ ما، 211 00:09:57,970 --> 00:10:00,960 وحتى stdio.c، والذي يوجد بالفعل في مكانٍ ما، 212 00:10:00,960 --> 00:10:03,690 أو من الناحية التقنية، فالإدخال/الإخراج القياسي هو كمكتبة كبيرة، 213 00:10:03,690 --> 00:10:06,970 قاموا فيها بوضع دالّة printf في ملف سُمّي خصيصًا printf.c. 214 00:10:06,970 --> 00:10:10,650 ولكن في مكانٍ ما في محرك الأقراص الثابت لأداة تحديد الوصول، في كل أجهزة Mac وأجهزة الكمبيوتر الشخصي، 215 00:10:10,650 --> 00:10:14,850 إذا كانت تدعم التحويل البرمجي، فهي، على سبيل المثال، مثل هذه الملفات. 216 00:10:14,850 --> 00:10:18,060 ولكن كان علينا تحويل هذا إلى أصفار وواحدات، وهذا، وهذا، 217 00:10:18,060 --> 00:10:19,570 ثم نقوم بدمجها بطريقةٍ ما. 218 00:10:19,570 --> 00:10:21,830 لذلك، بالصور، يبدو هذا مثل هذا نوعًا ما. 219 00:10:21,830 --> 00:10:23,880 وهذا كله يحدث تلقائيًا بواسطة Clang. 220 00:10:23,880 --> 00:10:25,950 Hello.c، التعليمة البرمجية التي كتبتها، يتم تحويلها برمجيًا 221 00:10:25,950 --> 00:10:31,740 للتجميعة، والتي يتم تجميعها بعد ذلك إلى أصفار وواحدات، والتي تُسمى باسم التعليمة البرمجية 222 00:10:31,740 --> 00:10:32,970 للآلة أو التعليمة البرمجية للكائن. 223 00:10:32,970 --> 00:10:36,240 Cs50.c-- فعلنا هذا لكم قبل بدء الفصل الدراسي. 224 00:10:36,240 --> 00:10:39,090 تم إنشاء Printf قبل أن يبدأ أحدنا بعقود 225 00:10:39,090 --> 00:10:41,550 مضت ويبدو مثل هذا. 226 00:10:41,550 --> 00:10:44,700 هذه ثلاثة ملفات منفصلة، على الرغم من ذلك، فإن خطوات الربط حرفيًا 227 00:10:44,700 --> 00:10:48,570 تعني، ربط كل هذه الأشياء معًا، وجمع الأصفار 228 00:10:48,570 --> 00:10:51,980 والآحاد من، مثلاً، ثلاثة ملفات منفصلة، على الأقل، 229 00:10:51,980 --> 00:10:53,820 ودمجهم فقط بطريقة تعرفها الآن 230 00:10:53,820 --> 00:10:57,930 وحدة المعالجة المركزية عن كيفيه استخدام ليس فقط تعليماتك البرمجية لكن أيضًا printf وget string 231 00:10:57,930 --> 00:10:59,380 وهكذا. 232 00:10:59,380 --> 00:11:02,110 في الأسبوع الماضي، قدمنا التحويل البرمجي على هيئة عمليات تجريد، 233 00:11:02,110 --> 00:11:05,440 إذا جاز التعبير، وهذا هو كل ما عنيناه حقًا طوال هذا الوقت. 234 00:11:05,440 --> 00:11:08,230 لكن الآن رأينا ماذا يحدث تحت الغطاء، 235 00:11:08,230 --> 00:11:11,160 ويمكننا تحديد أن وحدة المعالجة المركزية والتي تبدو بصورة مادية 236 00:11:11,160 --> 00:11:14,010 مثل هذا، وإن كانت تبدو أصغر في الكمبيوتر المحمول أو أجهزة كمبيوتر سطح المكتب، 237 00:11:14,010 --> 00:11:17,290 تعرف كيف تتعامل مع كل هذا. 238 00:11:17,290 --> 00:11:19,850 أية أسئلة حول هذه الخطوات الأربع-- 239 00:11:19,850 --> 00:11:22,710 ما قبل المعالجة، والتحويل البرمجي، والتجميع ، والربط؟ 240 00:11:22,710 --> 00:11:27,340 ولكن بشكل عام، الآن، يمكن أن نطلق فقط عليهم تحويل برمجي، كما يفعل معظم الناس. 241 00:11:27,340 --> 00:11:28,100 أية أسئلة؟ 242 00:11:28,100 --> 00:11:29,090 أجل. 243 00:11:29,090 --> 00:11:36,510 الجمهور: كيف تعرف وحدة المعالجة المركزية أن هناك [INAUDIBLE]؟ 244 00:11:36,510 --> 00:11:39,780 هل هذا [INAUDIBLE]؟ 245 00:11:39,780 --> 00:11:41,740 DAVID J. MALAN: ليس في خطوة ما قبل المعالجة، 246 00:11:41,740 --> 00:11:43,490 وبالتالي فإن السؤال هو، كيف يعرف الكمبيوتر 247 00:11:43,490 --> 00:11:46,850 أن printf هي الدالة الوحيدة الموجودة هناك؟ 248 00:11:46,850 --> 00:11:49,040 بشكل أساسي، عندما تقوم بالربط في التعليمات البرمجية، 249 00:11:49,040 --> 00:11:51,980 فقط الأصفار والآحاد الضرورية عادةً هي التي ترتبط. 250 00:11:51,980 --> 00:11:55,280 أحيانًا، تحصل على أكثر مما تحتاج إليه بالفعل، إذا كانت مكتبة كبيرة، 251 00:11:55,280 --> 00:11:56,490 لكن هذا جيد، أيضًا. 252 00:11:56,490 --> 00:11:58,990 تلك الأصفار والواحدات لا تستخدمها وحدة المعالجة المركزية أبدًا. 253 00:11:58,990 --> 00:11:59,990 سؤال جيد. 254 00:11:59,990 --> 00:12:02,410 أية أسئلة أخرى؟ 255 00:12:02,410 --> 00:12:03,170 لا بأس، جسنًا. 256 00:12:03,170 --> 00:12:06,740 بما أننا نعرف أن هذا ممكن، فلنبدأ 257 00:12:06,740 --> 00:12:09,530 في تصميم طريق العودة الخاص بنا، لأن الجميع هنا 258 00:12:09,530 --> 00:12:11,810 ربما يعرف الآن أنه عند الكتابة بلغة C، والتي 259 00:12:11,810 --> 00:12:13,520 نوعًا ما من الناحية النظرية، يبدو أنها، لا تخلو 260 00:12:13,520 --> 00:12:16,740 من العقبات والمشاكل والأخطاء والغلطات. 261 00:12:16,740 --> 00:12:19,910 لذلك دعونا نقدم بعض التقنيات والأدوات التي يمكنكم من الآن فصاعدًا، 262 00:12:19,910 --> 00:12:23,110 من بداية هذا الأسبوع وما بعده، محاولة استكشاف هذه الأخطاء وإصلاحها بأنفسكم 263 00:12:23,110 --> 00:12:26,240 بدلاً من مجرد محاولة قراءة رسائل الخطأ التي تبدو مشفرة 264 00:12:26,240 --> 00:12:28,010 أو طلب مساعدة شخص آخر. 265 00:12:28,010 --> 00:12:31,660 دعونا نرى ما إذا كان البرنامج يستطيع في الواقع الإجابة عن بعض هذه الأسئلة لكم. 266 00:12:31,660 --> 00:12:32,960 لذا دعوني أمضي قُدمًا وأفعل هذا. 267 00:12:32,960 --> 00:12:35,450 دعوني أمضي قدمًا وأفتح أداة تحديد وصول هنا، 268 00:12:35,450 --> 00:12:38,340 وسأمضي قدمًا وأُنشئ ملفًا جديدًا باسم 269 00:12:38,340 --> 00:12:43,190 buggy0.c والذي سأرتكب فيه، هذه المرة، خطأً عن عمد. 270 00:12:43,190 --> 00:12:46,790 وسأمضي قدمًا وأُنشئ دالة خاصة بي باسم 271 00:12:46,790 --> 00:12:50,360 main، والتي، تعد بمثابة الحالة الافتراضية، مثل النقر على العلم الأخضر. 272 00:12:50,360 --> 00:12:53,240 وسأمضي قدمًا وأقول printf، علامة اقتباس، علامة اقتباس خاتمة، 273 00:12:53,240 --> 00:12:56,190 "Hello world/m." 274 00:12:56,190 --> 00:12:56,690 حسنًا. 275 00:12:56,690 --> 00:12:57,750 يبدو هذا جيدًا جدًا. 276 00:12:57,750 --> 00:13:01,300 سأمضي قدمًا وأحول buggy0 برمجيًا، وأضغط Enter، 277 00:13:01,300 --> 00:13:03,590 وبالطبع، لدي مجموعة من رسائل الخطأ هنا. 278 00:13:03,590 --> 00:13:05,020 دعوني أقوم بتكبيرها. 279 00:13:05,020 --> 00:13:07,730 لحسن الحظ، لدي اثنتان فقط، ولكن تذكروا، يجب عليكم، 280 00:13:07,730 --> 00:13:09,860 دائمًا التمرير لأعلى للبحث في البداية، 281 00:13:09,860 --> 00:13:12,320 لأنه قد يكون هناك تأثير متسلسل مزعج من 282 00:13:12,320 --> 00:13:13,370 الخطأ السابق على الخطأ اللاحق. 283 00:13:13,370 --> 00:13:18,890 إذن، buggy0.c، السطر 5، هي ما يعنيه هذا، الحرف 5، إذن كمثل 5 مسافات بالداخل، 284 00:13:18,890 --> 00:13:22,430 لتعلن ضمنيًا عن دالّة مكتبة printf مع نقطة، نقطة، نقطة. 285 00:13:22,430 --> 00:13:24,980 إذن ستبدؤون في رؤية هذا في كثير من الأحيان إذا قمتم 286 00:13:24,980 --> 00:13:27,050 بهذا الخطأ المعين أو السهو. 287 00:13:27,050 --> 00:13:29,690 الإعلان ضمنيًا عن شيء ما يعني أنك نسيت 288 00:13:29,690 --> 00:13:31,610 أن تخبر Clang بوجود شيء ما. 289 00:13:31,610 --> 00:13:36,010 وربما تعرفون من التجربة، ربما الآن، ما هو الحل. 290 00:13:36,010 --> 00:13:38,550 ما أول خطأ ارتكبتُه هنا؟ 291 00:13:38,550 --> 00:13:39,720 الجمهور: [INAUDIBLE]. 292 00:13:39,720 --> 00:13:42,020 ديفيد ج. مالان: أجل، لم أقم بتضمين ملف الرأس، 293 00:13:42,020 --> 00:13:43,220 إذا جاز التعبير، للمكتبة. 294 00:13:43,220 --> 00:13:47,860 لا أجد، في أعلى الملف، تضمين stdio.h، 295 00:13:47,860 --> 00:13:49,690 التي يتم فيها تعريف printf. 296 00:13:49,690 --> 00:13:53,230 ولكن دعونا نقول إنكم لم تكونوا متأكدين تمامًا من كيفية الوصول إلى تلك المرحلة، 297 00:13:53,230 --> 00:13:55,320 وكيف يمكننا، فعليًا، الحصول على بعض المساعدة في هذا الأمر؟ 298 00:13:55,320 --> 00:13:57,430 اسمحوا لي في الواقع بزيادة حجم النافذة الطرفية الخاصة بي 299 00:13:57,430 --> 00:14:00,490 هنا، وتذكروا أنه قبل دقيقة فقط، قمت بتشغيل makebuggy0، 300 00:14:00,490 --> 00:14:02,500 والذي أسفر عن الأخطاء التي رأيتُها. 301 00:14:02,500 --> 00:14:04,840 من الواضح أنه تم تثبيت أمر في أداة تحديد الوصول 302 00:14:04,840 --> 00:14:07,660 قمنا بكتابته، نحن طاقم العمل، ويسمى help50. 303 00:14:07,660 --> 00:14:11,330 وهذا مجرد برنامج قمنا بكتابته يأخذ أي رسالة خطأ 304 00:14:11,330 --> 00:14:14,740 أخرجتها التعليمة البرمجية لديك أو برنامج ما كإدخال. 305 00:14:14,740 --> 00:14:16,870 فنحن نوعًا ما نبحث عن العبارات والكلمات المألوفة، 306 00:14:16,870 --> 00:14:20,680 تمامًا مثلما يفعل رفيق التدريس في ساعات العمل، وإذا تعرفنا على رسالة خطأ ما، 307 00:14:20,680 --> 00:14:24,160 فسنحاول تقديم، سواء بشكل بياني أو صريح، 308 00:14:24,160 --> 00:14:25,880 نصيحة ما حول كيفية التعامل معها. 309 00:14:25,880 --> 00:14:29,470 لذا إذا مضيت قدمًا وشغّلت هذا الأمر الآن، فلاحظوا أن هناك المزيد من المخرجات بشكل قليل. 310 00:14:29,470 --> 00:14:33,550 أنا أرى بالضبط المخرج نفسه بالأبيض والأخضر والأحمر كما كان من قبل، 311 00:14:33,550 --> 00:14:36,790 لكن في الأسفل يوجد بعض الأصفر، والذي يأتي تحديدًا من help50. 312 00:14:36,790 --> 00:14:38,830 وإذا مضيت قدمًا وقمت بتقريب الصورة على هذا، سوف 313 00:14:38,830 --> 00:14:43,570 ترون أن سطر الإخراج الذي تعرفنا عليه 314 00:14:43,570 --> 00:14:46,150 هو هذا السطر، السطر نفسه الذي قمت حرفيًا بلفت الانتباه 315 00:14:46,150 --> 00:14:50,200 إليه من قبل-- buggy0.c، السطر 5، خطأ، ليعلن ضمنيًا عن دالة المكتبة 316 00:14:50,200 --> 00:14:52,010 printf، وهكذا. 317 00:14:52,010 --> 00:14:54,820 إذن هنا، بدون تمييز الخلفية، لكنها تظل باللون الأصفر، 318 00:14:54,820 --> 00:14:58,450 هي نصيحتنا أو سؤال قد يطرحه عليك رفيق تدريس أو مساعد في دورة تدريبية في ساعات العمل. 319 00:14:58,450 --> 00:15:02,080 حسنًا، هل نسيت تضمين stdio.h الذي يتم الإعلان عن printf 320 00:15:02,080 --> 00:15:05,290 فيه في أعلى ملفك؟ 321 00:15:05,290 --> 00:15:08,710 ونحن نأمل، أن تكون أسئلتنا، سواء بشكل بياني أو بخلاف ذلك، صحيحة، 322 00:15:08,710 --> 00:15:10,430 لأن هذا سيجعلكم تحققون المزيد. 323 00:15:10,430 --> 00:15:12,050 لذا دعونا نمضي قدمًا ونجرّب تلك النصيحة. 324 00:15:12,050 --> 00:15:15,220 إذن ضمّنوا stdio.h. 325 00:15:15,220 --> 00:15:16,970 الآن اسمحوا لي بالمضي قدمًا والعودة إلى أسفل هنا. 326 00:15:16,970 --> 00:15:19,570 وإذا كنتم لا تحبون الفوضى، فيمكنكم كتابة "clear،" 327 00:15:19,570 --> 00:15:23,380 أو الضغط على Control+L في النافذة الطرفية لترتيبه باستمرار كما أفعل. 328 00:15:23,380 --> 00:15:29,120 إذا أردت المضي قدمًا الآن وتشغيل makebuggy0، Enter، أخطاء أقل، 329 00:15:29,120 --> 00:15:30,760 أحرزنا تقدمًا، ولكنه ليس الأمر نفسه. 330 00:15:30,760 --> 00:15:33,430 لذا هذه الدالة، ربما، تكون أسهل قليلاً. 331 00:15:33,430 --> 00:15:36,470 قراءة السطر، ما هو سطر التعليمة البرمجية الذي به أخطاء هنا؟ 332 00:15:36,470 --> 00:15:38,420 الجمهور: نسيت الفاصلة المنقوطة. 333 00:15:38,420 --> 00:15:41,640 ديفيد ج. مالان: أجل، من الواضح أن، الخطأ ما زال في السطر 5، 334 00:15:41,640 --> 00:15:42,940 لكن لسبب آخر. 335 00:15:42,940 --> 00:15:44,360 يبدو أنني نسيت فاصلة منقوطة. 336 00:15:44,360 --> 00:15:47,030 ولكن يمكن أن أسأل بالمثل help50 للمساعدة في ذلك 337 00:15:47,030 --> 00:15:48,570 ونأمل أن يكتشف خطئي. 338 00:15:48,570 --> 00:15:50,780 لذا يجب أن يبدأ هذا، أيضًا، في أن يكون حدسكم الأول. 339 00:15:50,780 --> 00:15:52,760 إذا لم تفهموا من الوهلة الأولى حقًا 340 00:15:52,760 --> 00:15:54,290 ماذا تفعل رسالة الخطأ، حتى ولو قمتم 341 00:15:54,290 --> 00:15:57,320 بالتمرير إلى أول رسالة، كمثل طلب الحصول حرفيًا على مساعدة من هذا البرنامج 342 00:15:57,320 --> 00:15:59,870 بإعادة تشغيل الأمر نفسه تحديدًا الذي قمت للتو 343 00:15:59,870 --> 00:16:03,410 بتشغيله، لكن ابدأه بـ help50 ومسافة، 344 00:16:03,410 --> 00:16:05,360 وسيقوم هذا بتشغيل help50 لك. 345 00:16:05,360 --> 00:16:08,600 هل هناك أسئلة حول هذه العملية؟ 346 00:16:08,600 --> 00:16:10,690 حسنًا، دعونا نلقي نظرة على برنامج آخر، 347 00:16:10,690 --> 00:16:15,580 على سبيل المثال، فذلك في، هذه المرة، به خطأ آخر مضمّن فيه. 348 00:16:15,580 --> 00:16:19,210 لذا ماذا عن-- اسمحوا لي بالمضي قدمًا وإعداد برنامج سريع هنا. 349 00:16:19,210 --> 00:16:23,530 سأسمي هذا buggy2.c للتناسق مع بعض النماذج 350 00:16:23,530 --> 00:16:25,360 التي لدينا على الإنترنت لكم في وقت لاحق. 351 00:16:25,360 --> 00:16:29,930 وفي هذا المثال، سأمضي قدمًا وأكتب الشيء الصحيح 352 00:16:29,930 --> 00:16:33,820 أولاً، stdio.h، ثم سيكون لدي int (main) void، والذي 353 00:16:33,820 --> 00:16:35,350 سيجعل برنامجي بالكامل يبدأ التشغيل. 354 00:16:35,350 --> 00:16:37,480 وبعد ذلك سيكون لدي تكرار حلقي، وسأذكر-- 355 00:16:37,480 --> 00:16:40,190 [CLEARS THROAT] معذرةً-- ماريو أو برنامج ما آخر، 356 00:16:40,190 --> 00:16:44,120 ربما قد تكون قمت بشيء مثل int i get 0، حيث i أقل من أو يساوي-- 357 00:16:44,120 --> 00:16:47,260 دعونا نقوم بذلك 10 مرات، ثم i++. 358 00:16:47,260 --> 00:16:53,680 وكل ما أريد القيام به في هذا البرنامج هو طباعة قيمة i، مثلما يمكنني القيام بها، 359 00:16:53,680 --> 00:16:55,840 باستخدام العنصر النائب %i-- إذن برنامج بسيط. 360 00:16:55,840 --> 00:16:59,630 فقط أريده أن يعد من 0 إلى 10. 361 00:16:59,630 --> 00:17:04,720 لذا دعونا نمضي قدمًا ونشغّل buggy2، أو بالأحرى، فأنا أرغب في-- 362 00:17:04,720 --> 00:17:06,490 دعونا لا نقوم بالطباعة-- 363 00:17:06,490 --> 00:17:07,420 بالترجيع. 364 00:17:07,420 --> 00:17:12,190 دعونا نمضي قدمًا ونطبع فقط رمز علامة التجزئة 365 00:17:12,190 --> 00:17:15,560 ولا نقوم بإفساد الحل بهذه الطريقة. 366 00:17:15,560 --> 00:17:17,480 إذن هنا، أنا أمضي قدمًا وأطبع buggy2. 367 00:17:17,480 --> 00:17:21,920 هدفي الآن هو أنني سأحدد طباعة 10 علامات تجزئة فقط، بمعدل رمز واحد في السطر، 368 00:17:21,920 --> 00:17:23,270 وهو ما أريد القيام به هنا. 369 00:17:23,270 --> 00:17:28,640 والآن سأمضي قدمًا وأشغّل ./buggy2، على أمل، أن أرى، 370 00:17:28,640 --> 00:17:30,390 10 علامات تجزئة. 371 00:17:30,390 --> 00:17:33,450 وأنا أفسدت هذا قليلاً نوعًا ما، لكن ماذا أرى بدلاً من ذلك؟ 372 00:17:36,860 --> 00:17:39,800 أجل، أعتقد أنني أرى أكثر مما أتوقع. 373 00:17:39,800 --> 00:17:46,380 ويمكننا نوعًا ما القيام بالتكبير هنا والتحقق مرة أخرى، إذن 1، 2، 3، 4، 5، 6، 7، 374 00:17:46,380 --> 00:17:48,550 8، 9، 10، أوه، 11. 375 00:17:48,550 --> 00:17:49,220 11. 376 00:17:49,220 --> 00:17:53,090 الآن قد تشير عيون بعضكم بالفعل إلى الحل الذي ينبغي أن يكون، 377 00:17:53,090 --> 00:17:55,080 لكن دعونا فقط نقول إن هذا غير واضح. 378 00:17:55,080 --> 00:17:57,290 وإذا كان بالفعل غير واضح، وذلك أفضل، فكيف يمكنك 379 00:17:57,290 --> 00:17:59,990 التعامل مع تشخيص نوع المشكلة هذه، فقط ما لم 380 00:17:59,990 --> 00:18:02,010 تتواصل مع أحد وتطلب منه المساعدة. 381 00:18:02,010 --> 00:18:04,600 ليست هذه المشكلة التي يمكن لـ help50 مساعدتك فيها، 382 00:18:04,600 --> 00:18:06,020 لأنها ليست رسالة خطأ. 383 00:18:06,020 --> 00:18:07,720 برنامجك يعمل. 384 00:18:07,720 --> 00:18:09,890 إنه فقط لا يقوم بإخراج ما أردت أن يخرجه، 385 00:18:09,890 --> 00:18:13,400 لكنه ليس رسالة خطأ من المحول البرمجي الذي يمكن لـ help50 أن يساعده فيها. 386 00:18:13,400 --> 00:18:17,190 إذن أن تريد نوعًا ما مراقبة ما يقوم به البرنامج، 387 00:18:17,190 --> 00:18:20,420 وتريد فهم، لماذا يطبع 11 عندما تقوم بالفعل 388 00:18:20,420 --> 00:18:22,310 بإعداد هذا من 0 إلى 10؟ 389 00:18:22,310 --> 00:18:25,040 حسنًا، إحدى التقنيات الأكثر شيوعًا في لغة C أو أي لغة، 390 00:18:25,040 --> 00:18:29,340 بصراحة، هو استخدام printf فقط لأغراض أخرى- أغراض تشخيصية. 391 00:18:29,340 --> 00:18:32,210 على سبيل المثال، لا يوجد الكثير من الأشياء في هذا البرنامج، 392 00:18:32,210 --> 00:18:35,090 لكن قد أزعم أنه من المهم لي معرفة، 393 00:18:35,090 --> 00:18:37,250 برنامجي وبالتالي فهمه، فقط عن طريق، 394 00:18:37,250 --> 00:18:41,690 دعونا نطبع قيمة i هذه في كل تكرار، 395 00:18:41,690 --> 00:18:44,150 بتنفيذ سطر من التعليمة البرمجية التي قمتُ بها سابقًا، 396 00:18:44,150 --> 00:18:47,590 وقول شيء حرفيًا مثل i تساوي %i. 397 00:18:47,590 --> 00:18:49,640 سأقوم بإزالة هذا نهائيًا، لأنه 398 00:18:49,640 --> 00:18:52,140 سيجعل برنامجي يبدو سخيفًا بعض الشيء، 399 00:18:52,140 --> 00:18:54,750 لكنه سيساعدني في فهم ماذا يحدث. 400 00:18:54,750 --> 00:19:01,600 اسمحوا لي بالمضي قدمًا وإعادة التحويل البرمجي لـ buggy2, ./bugg2، وهذه المرة، 401 00:19:01,600 --> 00:19:03,110 أرى الكثير جدًا من المخرجات. 402 00:19:03,110 --> 00:19:07,260 ولكن إذا قمت بالتكبير، الآن نوعًا ما-- 403 00:19:07,260 --> 00:19:10,180 الآن الكمبيوتر في الأساس يساعدني على فهم ماذا يحدث. 404 00:19:10,180 --> 00:19:11,950 عندما تكون i 0، ها هو واحد منهم. 405 00:19:11,950 --> 00:19:13,460 عندما تكون i 1، ها هو واحد آخر. 406 00:19:13,460 --> 00:19:16,510 I تكون 2، 3، 4، 5، 6، 7، 8، 9، وهذا يبدو جيدًا. 407 00:19:16,510 --> 00:19:19,960 ولكن إذا انتقلنا أبعد قليلاً، تشعر أن الأمر مُشكل قليلاً 408 00:19:19,960 --> 00:19:22,210 أن i يمكن أن تكون 10 أيضًا. 409 00:19:22,210 --> 00:19:24,520 فما هو الخطأ منطقيًا في هذا البرنامج؟ 410 00:19:24,520 --> 00:19:25,880 الجمهور: [INAUDIBLE]. 411 00:19:25,880 --> 00:19:26,750 ديفيد ج. مالان: أجل. 412 00:19:26,750 --> 00:19:29,750 أنا أستخدم أقل من أو يساوي، لأنني نوعًَا ما أخلط بين النمط. 413 00:19:29,750 --> 00:19:31,790 يميل المبرمجون لبدء العد من الصفر، 414 00:19:31,790 --> 00:19:34,820 على ما يبدو، ولكن أريد أن أفعل هذا 10 مرات، وفي العالم البشري، 415 00:19:34,820 --> 00:19:38,560 إذا كنت أريد أن أفعل شيئًا 10 مرات، يمكنني العد إلى 10 وتضمينها. 416 00:19:38,560 --> 00:19:39,900 لكنك لا يمكن أن تحصل عليها بكلا الطريقتيتن. 417 00:19:39,900 --> 00:19:41,780 لا يمكنك البدء من الصفر والانتهاء في 10 إذا كنت 418 00:19:41,780 --> 00:19:43,700 تريد أن تفعل شيئًا بالضبط 10 مرات. 419 00:19:43,700 --> 00:19:46,070 لذا فإن هناك احتمالين هنا. 420 00:19:46,070 --> 00:19:48,310 كيف يمكننا إصلاح هذا؟ 421 00:19:48,310 --> 00:19:50,440 نعم، يمكننا بالتأكيد تغييره إلى أقل من. 422 00:19:50,440 --> 00:19:53,320 ما هو النهج الصحيح الآخر؟ 423 00:19:53,320 --> 00:19:56,450 نعم، قد نتمكن من ترك هذا بمفرده ونبدأ فقط بالعد الآن من واحد، 424 00:19:56,450 --> 00:19:59,540 وإذا كنت لا تطبع في الواقع القيم في برنامجك الفعلي، 425 00:19:59,540 --> 00:20:01,910 قد يكون ذلك معقولاً تمامًا، أيضًا. 426 00:20:01,910 --> 00:20:03,100 إنه ليس تقليديًا فقط. 427 00:20:03,100 --> 00:20:06,230 يحصل على الراحة من خلال العد، بسرعةٍ،من الصفر، لأن هذا فقط 428 00:20:06,230 --> 00:20:08,810 ما يفعله معظم الناس في هذه الأيام. 429 00:20:08,810 --> 00:20:11,060 لكن التقنية هنا هي مجرد استخدام printf. 430 00:20:11,060 --> 00:20:15,190 مثل، في حالة الشك، استخدم حرفيًا printf في هذا السطر، في هذا السطر، 431 00:20:15,190 --> 00:20:15,740 في هذا السطر. 432 00:20:15,740 --> 00:20:18,800 في أي مكان قد يحدث شيء مثير للاهتمام في برنامجك، 433 00:20:18,800 --> 00:20:21,460 فقط استخدمه لطباعة السلاسل الموجودة في المتغيرات الخاصة بك، 434 00:20:21,460 --> 00:20:24,770 اطبع الأعداد الصحيحة الموجودة في المتغيرات الخاصة بك، أو أي شيءٍ آخر. 435 00:20:24,770 --> 00:20:26,690 ويسمح لك نوعًا ما برؤية، إذا جاز التعبير، 436 00:20:26,690 --> 00:20:32,630 ماذا يحدث داخل البرنامج، printf. 437 00:20:32,630 --> 00:20:36,530 أداة واحدة أخيرة-- لكنها ليست شائعة، عند كتابة التعليمات البرمجية، 438 00:20:36,530 --> 00:20:39,290 ربما تحصل على شيءٍ سيئ في وقت مبكر، وخاصةً عندما لا تكون 439 00:20:39,290 --> 00:20:40,660 على دراية تامة بالأنماط. 440 00:20:40,660 --> 00:20:43,910 على سبيل المثال، إذا مضيت قدمًا وفعلت ذلك 441 00:20:43,910 --> 00:20:47,750 عن طريق حذف مجموعة كاملة من المسافات، حتى بعد إصلاح هذا الخطأ 442 00:20:47,750 --> 00:20:52,720 بالانتقال من صفر إلى 10، هل يُعد هذا البرنامج صحيحًا الآن، 443 00:20:52,720 --> 00:20:54,140 إذا كان الهدف هو طباعة 10 رموز شباك؟ 444 00:20:57,130 --> 00:20:57,880 أجل، لقد سمعت نعم. 445 00:20:57,880 --> 00:20:58,820 لماذا يُعد صحيحًا؟ 446 00:20:58,820 --> 00:20:59,410 بأي منطق؟ 447 00:21:02,680 --> 00:21:03,440 نعم، بالضبط. 448 00:21:03,440 --> 00:21:04,170 لا يزال يعمل. 449 00:21:04,170 --> 00:21:06,950 إنه يطبع رموز الشباك العشرة، واحد في كل سطر، 450 00:21:06,950 --> 00:21:09,770 لكنه كُتب بطريقة ضعيفة في ما يخص الأسلوب. 451 00:21:09,770 --> 00:21:12,380 لذلك أذكر أننا نميل إلى التقييم، والعالم 452 00:21:12,380 --> 00:21:14,440 يميل إلى التفكير في التعليمات البرمجية بثلاثة طرق على الأقل. 453 00:21:14,440 --> 00:21:16,690 الأولى، الصواب-- هل يفعل ما يتوجب عليه فعله، 454 00:21:16,690 --> 00:21:17,550 مثل طباعة 10 رموز شباك؟ 455 00:21:17,550 --> 00:21:19,960 ونعم، إنه يفعل ذلك، لأن كل ما فعلته كان حذف المسافات. 456 00:21:19,960 --> 00:21:22,730 لم أغير في الواقع التعليمات البرمجية أو أكسرها، بعد ذلك الإصلاح. 457 00:21:22,730 --> 00:21:25,900 الثانية هي التصميم، ما مدى كون هذه التعليمات البرمجية مدروسة، ومكتوبة بصورةٍ جيدة؟ 458 00:21:25,900 --> 00:21:28,490 وبصراحة، إن كتابة هذا أمر صعب نوعًا ما من نواح كثيرة جدا، 459 00:21:28,490 --> 00:21:29,670 لأنها أسطر قليلة جدًا. 460 00:21:29,670 --> 00:21:31,670 ولكن سترى مع مرور الوقت، مع نمو برامجك، 461 00:21:31,670 --> 00:21:33,740 أن زملاء التدريس والموظفون يمكنهم أن يقدموا لك الملاحظات 462 00:21:33,740 --> 00:21:35,060 حول تصميم التعليمات البرمجية الخاصة بك. 463 00:21:35,060 --> 00:21:36,950 لكن يُعد الأسلوب سهلاً نسبيًا. 464 00:21:36,950 --> 00:21:39,890 وقد قمت بتدريسه في الغالب بضرب الأمثلة، إذا صح التعبير، 465 00:21:39,890 --> 00:21:42,500 لأنني كنت منهجيًا جدًا في اتباع التعليمات البرمجية الخاصة بي 466 00:21:42,500 --> 00:21:45,440 والتأكد من أن كل شيء يبدو جيدًا جدًا، أو على الأقل جيد 467 00:21:45,440 --> 00:21:47,150 للعين المدربة. 468 00:21:47,150 --> 00:21:49,550 لكن هذه، دعونا فقط نقول، إنها ليست جيدة. 469 00:21:49,550 --> 00:21:53,060 مثل، محاذاة كل شيء إلى اليسار، هو أمر صحيح، 470 00:21:53,060 --> 00:21:54,460 لكنه يبدو رديئًا في الأسلوب. 471 00:21:54,460 --> 00:21:56,740 وماذا ستكون الحجة لعدم كتابة تعليمات برمجية 472 00:21:56,740 --> 00:21:58,580 مثل هذه، وبدلاً من ذلك، كتابة تعليمات برمجية بالطريقة 473 00:21:58,580 --> 00:22:02,020 التي قمت بها منذ لحظة، وإن كان بعد إصلاح الخطأ؟ 474 00:22:02,020 --> 00:22:02,680 نعم. 475 00:22:02,680 --> 00:22:05,560 الجمهور: ستساعدك في تحديد كل روتين فرعي 476 00:22:05,560 --> 00:22:10,040 ينتقل من خلال الشيء، لذا تعلم أن هذا القسم هنا. 477 00:22:10,040 --> 00:22:11,030 ديفيد ج. مالان: أجل. 478 00:22:11,030 --> 00:22:13,340 الجمهور: [INAUDIBLE] التالي، حتى تعرف مكان كل شيء. 479 00:22:13,340 --> 00:22:14,180 ديفيد ج. مالان: بالضبط. 480 00:22:14,180 --> 00:22:15,090 دعوني ألخّص هذا. 481 00:22:15,090 --> 00:22:17,300 إنها تسمح لكم برؤية، بطريقة بصرية أكثر، ما الذي 482 00:22:17,300 --> 00:22:20,540 يفعله الروتين الفرعي الفردي أو كتل التعليمات البرمجية 483 00:22:20,540 --> 00:22:22,070 المرتبطة ببعضها البعض؟ 484 00:22:22,070 --> 00:22:25,280 برنامج سكراتش مليء بالألوان، ويحتوى على أشكال، مثل شكل العناق 485 00:22:25,280 --> 00:22:27,200 والذي تقوم به الكثير من كتل التعليمات البرمجية، 486 00:22:27,200 --> 00:22:30,800 بالتوضيح بصريًا إلى المبرمج أن هذه الكتلة تشمل الآخرين، 487 00:22:30,800 --> 00:22:34,190 وبالتالي، أن كتلة repeat أو كتلة forever 488 00:22:34,190 --> 00:22:36,330 تفعل هذه الأشياء مرارًا وتكرارًا. 489 00:22:36,330 --> 00:22:38,930 هذه هي القاعدة التي تعمل بها هذه الأقواس المتعرجة، والمسافات البادئة 490 00:22:38,930 --> 00:22:41,240 في هذا وفي سياقات أخرى فإنها فقط تساعد في 491 00:22:41,240 --> 00:22:45,080 أن يصبح أكثر وضوحًا للمبرمج ماذا بداخل ماذا 492 00:22:45,080 --> 00:22:46,480 وماذا يحدث أين. 493 00:22:46,480 --> 00:22:49,010 لذا هذا أفضل في الكتابة، لأنه 494 00:22:49,010 --> 00:22:52,820 يمكنك رؤية أن التعليمات البرمجية داخل main هي كل شيء موجود هنا. 495 00:22:52,820 --> 00:22:56,090 التعليمات البرمجية الموجودة داخل التكرار الحلقي for هي كل شيء موجود هنا. 496 00:22:56,090 --> 00:22:58,370 لذا إنه فقط لنا كقارئين بشريين، وزملاء التدريس 497 00:22:58,370 --> 00:23:01,250 في حالة الدورة التدريبية، أو الزملاء في حالة العالم الحقيقي. 498 00:23:01,250 --> 00:23:05,240 لكن لنفترض أنك ترى أن هذه الأنماط عسيرة القراءة في البداية. 499 00:23:05,240 --> 00:23:06,710 هذا، أيضًا، جيد. 500 00:23:06,710 --> 00:23:09,320 لدى CS50 على موقعها على شبكة الإنترنت ما نسميه دليل الأسلوب. 501 00:23:09,320 --> 00:23:11,690 إنه مجرد ملخص عما يجب أن تكون عليه التعليمات البرمجية الخاصة بك 502 00:23:11,690 --> 00:23:14,210 عند استخدام ميزات معينة من C-- التكرار الحلقي، 503 00:23:14,210 --> 00:23:16,230 الشروط، والمتغيرات، والدوال، وما إلى ذلك. 504 00:23:16,230 --> 00:23:18,110 وهو مرتبط بموقع الدورة الإلكتروني. 505 00:23:18,110 --> 00:23:20,240 لكن هناك أيضًا أداة يمكنك استخدامها عند 506 00:23:20,240 --> 00:23:23,510 كتابة التعليمات البرمجية التي ستساعدك في تنظيفها وجعلها متسقة، 507 00:23:23,510 --> 00:23:26,300 ليس فقط من أجل جعلها تتماشى مع دليل الأسلوب، 508 00:23:26,300 --> 00:23:28,770 ولكن فقط لجعل التعليمات البرمجية الخاصة بك أكثر قابلية للقراءة. 509 00:23:28,770 --> 00:23:31,070 على سبيل المثال، إذا مضيت قدمًا وقمت بتشغيل أمر يسمى 510 00:23:31,070 --> 00:23:37,520 style50 على هذا البرنامج، buggy2.c، ثم ضغطت على Enter، 511 00:23:37,520 --> 00:23:40,490 فسأرى بعض المخرجات المليئة بالألوان. 512 00:23:40,490 --> 00:23:44,240 أرى التعليمات البرمجية الخاصة بي بالأبيض، ثم أرى مسافات خضراء، في 513 00:23:44,240 --> 00:23:47,210 الأماكن التي كان يتعين علي وضع مسافات بادئة فيها، مسافات خضراء 514 00:23:47,210 --> 00:23:50,060 تشجعني نوعًا ما لوضع مسافة، مسافة، مسافة، مسافة هنا. 515 00:23:50,060 --> 00:23:51,560 ضع مسافة، مسافة، مسافة، مسافة هنا. 516 00:23:51,560 --> 00:23:54,440 ضع ثمانِ مسافات هنا، وأربع مسافات هنا، وما إلى ذلك، 517 00:23:54,440 --> 00:23:56,940 وهذا يذكرني بأنني يجب أن أضيف تعليقات إيضًا. 518 00:23:56,940 --> 00:23:58,820 هذا برنامج قصير-- لا يحتاج بالضرورة 519 00:23:58,820 --> 00:24:01,250 إلى الكثير من التعليقات لشرح ماذا يحدث. 520 00:24:01,250 --> 00:24:04,100 لكن واحد فقط //، مثل ما رأيناه الأسبوع الماضي للشرح، 521 00:24:04,100 --> 00:24:06,830 ربما في أعلى الملف أو أعلى كتلة التعليمات البرمجية، 522 00:24:06,830 --> 00:24:08,830 يمكن أن يجعل style50 سعيدًا أيضًا. 523 00:24:08,830 --> 00:24:09,540 لذا دعونا نفعل ذلك. 524 00:24:09,540 --> 00:24:13,980 دعوني أمضي قدمًا وآخذ نصيحته وأضع مسافة قبلها باستخدام مفتاح Tab، 525 00:24:13,980 --> 00:24:17,150 هذه باستخدام مفتاح Tab، وهذه باستخدام مفتاح Tab، وهذه باستخدام مفتاح Tab، ومجددًا مرة أخرى. 526 00:24:17,150 --> 00:24:20,150 وستلاحظ ذلك على لوحة المفاتيح الخاصة بك، حتى لو كنت تضغط على مفتاح Tab، 527 00:24:20,150 --> 00:24:23,330 إنه في الواقع يحوله لك، لما هو شائع، أربع مسافات، 528 00:24:23,330 --> 00:24:25,700 حتى لا يجب عليك الضغط على مفتاح المسافة لأربع مرات. 529 00:24:25,700 --> 00:24:27,440 فقط اعتد على استخدام Tab. 530 00:24:27,440 --> 00:24:30,320 ودعوني أمضي قدمًا وأكتب تعليقًا هنا. 531 00:24:30,320 --> 00:24:32,480 "اطبع 10 رموز شباك." 532 00:24:32,480 --> 00:24:35,050 بهذه الطريقة، لا يتعين على زملائي، وزملاء التدريس، وعليّ في أسبوع 533 00:24:35,050 --> 00:24:37,890 قراءة التعليمات البرمجية الخاصة بي مجددًا واكتشاف ما تفعله. 534 00:24:37,890 --> 00:24:40,670 يمكنني قراءة التعليقات بمفردي لكل //. 535 00:24:40,670 --> 00:24:44,480 إذا قمت بتشغيل style50 مجددًا، الآن يبدو جيدًا. 536 00:24:44,480 --> 00:24:47,780 إنها تتفق مع دليل الأسلوب، و هي مكتوبة بشكل جميل، 537 00:24:47,780 --> 00:24:50,480 إذًا سيصبح مطبوع بشكلٍ جميل مصطلحًا فنيًا في البرمجة 538 00:24:50,480 --> 00:24:53,720 عندما تبدو التعليمات البرمجية الخاصة بك جيدة وليست فقط صحيحة. 539 00:24:53,720 --> 00:24:55,670 أية أسئلة أخرى؟ 540 00:24:55,670 --> 00:24:56,620 نعم. 541 00:24:56,620 --> 00:24:58,990 الجمهور: حاولت استخدام [INAUDIBLE] هذا الأسبوع الماضي 542 00:24:58,990 --> 00:25:00,930 وقال إنني أحتاج برنامجًا جديدًا. 543 00:25:00,930 --> 00:25:01,930 ديفيد ج. مالان: هذا-- 544 00:25:01,930 --> 00:25:04,010 لم يكن ممكّنًا للأسبوع الأول من الصف الدراسي. 545 00:25:04,010 --> 00:25:06,570 تم تمكينه من الآن فصاعدًا. 546 00:25:06,570 --> 00:25:08,930 أي أسئلة أخرى؟ 547 00:25:08,930 --> 00:25:09,430 لا. 548 00:25:09,430 --> 00:25:13,150 حسنًا، إذًا فقط للتخليص، هناك الآن ثلاث أدوات لتحصل عليها من مجموعة الأدوات 549 00:25:13,150 --> 00:25:16,270 الشهيرة وهي help50 ويستخدم في أي وقت تشاهد رسالة خطأ لا تفهمها، 550 00:25:16,270 --> 00:25:18,850 سواء كان ذلك مع make أو Clang، أو ربما، شيء آخر. 551 00:25:18,850 --> 00:25:21,280 Printf-- عندما يكون لديك برنامج منطقي-- 552 00:25:21,280 --> 00:25:24,340 خطأ في البرنامج الخاص بك، حيث لا يعمل فقط بالطريقة التي يجب أن يعمل بها 553 00:25:24,340 --> 00:25:27,970 أو بالطريقة التي يخبرك بها كيفية حل المشكلة، ثم style50 554 00:25:27,970 --> 00:25:31,960 عندما تريد التأكد أن، هل تبدو التعليمات البرمجية الخاصة بي صحيحة من حيث الأسلوب، 555 00:25:31,960 --> 00:25:33,370 وهل يمكن قراءتها قدر الإمكان؟ 556 00:25:33,370 --> 00:25:35,750 وبصراحة، ستعثر علينا في ساعات العمل وسنقوم 557 00:25:35,750 --> 00:25:38,380 غالبًا بتشجيعك، مهلاً، قبل أن نجيب على هذا السؤال، 558 00:25:38,380 --> 00:25:40,180 هل يمكنك من فضلك تشغيل style50 على التعليمات البرمجية الخاصة بك؟ 559 00:25:40,180 --> 00:25:43,180 هل يمكنك تنظيف التعليمات البرمجية الخاصة بك، لأنها تجعل حياتنا، أيضًا، 560 00:25:43,180 --> 00:25:45,940 كالأشخاص الآخرين أسهل بكثير عندما نفهم ماذا 561 00:25:45,940 --> 00:25:49,390 يحدث دون الاضطرار إلى الاكتشاف بصريًا أين تصطف الأقواس 562 00:25:49,390 --> 00:25:50,350 والأقواس المتعرجة. 563 00:25:50,350 --> 00:25:52,060 ولهذا يجب عليكم التمسك بهذه العادة، لأنها 564 00:25:52,060 --> 00:25:57,700 ستوفر لكم الوقت من إضاعته في تحليل الأشياء بصريًا بأنفسكم. 565 00:25:57,700 --> 00:25:58,750 حسنًا. 566 00:25:58,750 --> 00:26:01,570 لذا لا يوجد فقط وحدات معالجة مركزية في أجهزة الكمبيوتر. 567 00:26:01,570 --> 00:26:03,510 وحدات المعالجة المركزية هي العقول، وحدة المعالجة المركزية، 568 00:26:03,510 --> 00:26:06,760 ولهذا نظل نؤكد على التعليمات التي تفهمها أجهزة الكمبيوتر. 569 00:26:06,760 --> 00:26:09,610 وهناك أيضًا هذا، ما رأيناه المرة الماضية، أيضًا. 570 00:26:09,610 --> 00:26:12,350 وهذا مثال على أي نوع من الأجهزة؟ 571 00:26:12,350 --> 00:26:12,940 الجمهور: رام. 572 00:26:12,940 --> 00:26:15,110 ديفيد ج. مالان: رام، أو ذاكرة الوصول العشوائي. 573 00:26:15,110 --> 00:26:17,620 هذا هو نوع الذاكرة الذي تحتويه أجهزة الكمبيوتر المحمولة وأجهزة سطح المكتب والخوادم 574 00:26:17,620 --> 00:26:21,790 والذي يستخدم في أي وقت تقوم بتشغيل برنامج أو فتح ملف. 575 00:26:21,790 --> 00:26:25,060 هناك نوع آخر من الذاكرة يسمى محركات الأقراص الثابتة أو محركات الأقراص ذات الحالة الصلبة، 576 00:26:25,060 --> 00:26:27,010 والتي ربما تكون على دراية به كمستهلك، 577 00:26:27,010 --> 00:26:29,950 وهذا هو المكان الذي يتم فيه تخزين ملفاتك بشكلٍ دائم. 578 00:26:29,950 --> 00:26:30,830 يمكن أن تنتهي بطاريتك. 579 00:26:30,830 --> 00:26:32,920 يمكنك سحب القابس من الكمبيوتر المحمول أو سطح المكتب، 580 00:26:32,920 --> 00:26:35,350 وتكون أي ملفات محفوظة على محرك أقراص صلب ثابتة بصورةٍ دائمة. 581 00:26:35,350 --> 00:26:37,420 إنهم يبقون هناك بسبب التقنية 582 00:26:37,420 --> 00:26:38,960 المستخدمة لتنفيذ ذلك. 583 00:26:38,960 --> 00:26:41,500 لكن ذاكرة الوصول العشوائي سريعة الزوال بصورةٍ أكبر. 584 00:26:41,500 --> 00:26:43,600 يتم تشغيل ذاكرة الوصول العشوائي فقط عن طريق الكهرباء. 585 00:26:43,600 --> 00:26:46,720 يتم استخدامها فقط عند تشغيل الطاقة أو عندما تكون البطارية مشحونة، 586 00:26:46,720 --> 00:26:49,960 وهي المكان الذي تُخزن فيه ملفاتك وبرامجك بفعالية عندما 587 00:26:49,960 --> 00:26:52,030 تقوم بالنقر المزدوج عليهم وفتحهم. 588 00:26:52,030 --> 00:26:54,460 لذا عندما تقوم بالنقر المزدوج على شيء مثل برنامج Microsoft Word، 589 00:26:54,460 --> 00:26:59,140 يتم نسخه من القرص الصلب ذي المدى الطويل إلى هذا النوع من الذاكرة، 590 00:26:59,140 --> 00:27:02,440 لأن هذا النوع من الذاكرة، مع أنه أصغر من حيث السعة-- 591 00:27:02,440 --> 00:27:04,180 ليس لديك الكثير من وحدات البايت فيه-- 592 00:27:04,180 --> 00:27:06,760 لكنه أسرع بصورةٍ كبيرة جدًا. 593 00:27:06,760 --> 00:27:09,550 بالمثل، عند فتح مستند، أو الانتقال إلى صفحة ويب، 594 00:27:09,550 --> 00:27:13,210 محتوى الملف الذي تشاهده يُخزن في هذا النوع من الأجهزة، 595 00:27:13,210 --> 00:27:15,760 لأنه على الرغم من أنك لا تملك الكثير من وحدات البايت فيه، 596 00:27:15,760 --> 00:27:18,230 لكنه فقط أسرع بصورةٍ كبيرة جدًا. 597 00:27:18,230 --> 00:27:20,950 وهذا سيكون موضوعيًا في علوم الكمبيوتر وفي الأجهزة. 598 00:27:20,950 --> 00:27:23,950 أنت نوعًا ما لديك الكثير من الأشياء البطيئة والرخيصة، 599 00:27:23,950 --> 00:27:27,010 مثل مساحة القرص الثابت، من الناحية النسبية، ولديك أقل قليلاً 600 00:27:27,010 --> 00:27:30,040 من الأشياء الأكثر تكلفة ولكن أسرع مثل ذاكرة الوصول العشوائي. 601 00:27:30,040 --> 00:27:33,210 ولديك وحدة معالجة مركزية واحدة فقط، عادةً، وهي الشيء السريع حقًا 602 00:27:33,210 --> 00:27:34,990 والذي يمكنه القيام بمليارات الأشياء في الثانية. 603 00:27:34,990 --> 00:27:37,250 ولكنها أيضا أكثر تكلفة. 604 00:27:37,250 --> 00:27:39,760 ولذا يوجد أربعة رقائق مرئية على هذا الشيء، إذا صح التعبير. 605 00:27:39,760 --> 00:27:42,640 ولن ندخل في التفاصيل حول كيفية عمل هذه الأشياء، ولكن دعونا فقط 606 00:27:42,640 --> 00:27:46,030 نقوم بتكبير هذه الرقاقة السوداء هنا و نركز عليها 607 00:27:46,030 --> 00:27:48,550 كممثله لبعض المقدار من الذاكرة. 608 00:27:48,550 --> 00:27:50,830 ربما تكون واحد ميغا بايت، مليون بايت. 609 00:27:50,830 --> 00:27:54,310 ربما حتى واحد جيجا بايت هذه الأيام، مليار بايت. 610 00:27:54,310 --> 00:27:57,430 ولكن هذا يعني أن هذه الشريحة يمكن اعتبارها مجرد 611 00:27:57,430 --> 00:27:58,740 مجموعة من وحدات البايت. 612 00:27:58,740 --> 00:27:59,860 هذا ليس معيارًا. 613 00:27:59,860 --> 00:28:01,790 لديك الكثير من وحدات البايت أكثر من هذه، ولكن دعوني 614 00:28:01,790 --> 00:28:04,090 أقترح أن تفكروا فقط في كل واحد من هذه المربعات 615 00:28:04,090 --> 00:28:06,100 هنا كممثل لبايت واحد. 616 00:28:06,100 --> 00:28:08,920 لذا فالبايت الأول من الذاكرة الذي يمكنني الوصول إليه هو هنا. 617 00:28:08,920 --> 00:28:10,670 التالي هو هنا، وهكذا. 618 00:28:10,670 --> 00:28:13,420 وحقيقة أنهم يلتفون هو مجرد تصوير فني. 619 00:28:13,420 --> 00:28:15,760 يمكنك التفكير بهذه الأشياء افتراضيًا فقط على أنها 620 00:28:15,760 --> 00:28:19,580 تنتقل من اليسار إلى اليمين، وليس في أي نوع من الشبكات، ولكن ماديًا، يبدو الأمر كذلك. 621 00:28:19,580 --> 00:28:23,410 لذلك عندما تقوم بإنشاء متغير بالفعل في برنامج مثل C، 622 00:28:23,410 --> 00:28:24,630 فأنت تحتاج إلى char. 623 00:28:24,630 --> 00:28:27,760 يميل char إلى أن يكون بايت واحد أو 8 وحدات من البت، 624 00:28:27,760 --> 00:28:32,300 وهذا يعني أنه عندما يكون لديك متغير من نوع char في برنامج بلغة C، 625 00:28:32,300 --> 00:28:35,920 يذهب حرفيًا، بصورة مادية إلى واحدة من هذه المربعات، 626 00:28:35,920 --> 00:28:37,420 داخل ذاكرة الوصول العشوائي للكمبيوتر الخاص بك. 627 00:28:37,420 --> 00:28:40,520 على سبيل المثال، قد يأخذ منا كل هذه المسافة في أعلى اليسار. 628 00:28:40,520 --> 00:28:42,820 إذا كان لديك نوع أكبر من البيانات، مثلاً 629 00:28:42,820 --> 00:28:45,820 لديك عدد صحيح، والذي يميل إلى أن يكون أربع وحدات بايت أو 32 بت، 630 00:28:45,820 --> 00:28:48,910 قد تحتاج إلى أكثر من مربع، إذًا قد يمنحك الكمبيوتر إمكانية الوصول إلى 631 00:28:48,910 --> 00:28:50,990 إلى أربعة مربعات بدلاً من ذلك. 632 00:28:50,990 --> 00:28:54,010 ولديك 32 بت تغطي تلك المنطقة من الذاكرة. 633 00:28:54,010 --> 00:28:56,070 لكن بصراحة، اخترت تلك المربعات بشكل تعسفي. 634 00:28:56,070 --> 00:28:58,780 كان يمكن أن يكونوا في أي مكان في تلك الشريحة أو في أي من الشرائح الأخرى. 635 00:28:58,780 --> 00:29:01,620 الأمر يعود للكمبيوتر ليتذكر مكانهم لك. 636 00:29:01,620 --> 00:29:04,240 أنت لست بحاجة لتذكر ذلك، في حد ذاته. 637 00:29:04,240 --> 00:29:07,060 لكن إذا فكرنا في هذه الشبكة، يتضح أن 638 00:29:07,060 --> 00:29:10,540 هذا في الواقع قيّم جدًا أن لدينا أجزاء من الذاكرة-- 639 00:29:10,540 --> 00:29:11,780 وحدات من البايت، إذا صح التعبير-- 640 00:29:11,780 --> 00:29:13,960 متصلين على التوالي مع بعضهم البعض. 641 00:29:13,960 --> 00:29:16,250 في واقع الأمر، هناك كلمة لهذه التقنية. 642 00:29:16,250 --> 00:29:17,680 وهي الذاكرة المتجاورة-- 643 00:29:17,680 --> 00:29:19,270 متصلين على التوالي مع بعضهم البعض. 644 00:29:19,270 --> 00:29:23,210 وبصفة عامة، في البرمجة، يُشار إلى هذا بمصفوفة. 645 00:29:23,210 --> 00:29:25,510 قد تتذكرون من برنامج Scratch، إذا كنتم تستخدمون هذه الميزة، 646 00:29:25,510 --> 00:29:27,250 إنها في الواقع لديها أشياء تسمى قوائم، والتي 647 00:29:27,250 --> 00:29:30,250 هي عبارة بالضبط عن-- قوائم قيم، قوائم كلمات، قوائم سلاسل. 648 00:29:30,250 --> 00:29:33,020 المصفوفة هي مجرد أجزاء متجاورة من الذاكرة، حتى 649 00:29:33,020 --> 00:29:35,770 يمكنك تخزين شيء هنا، شيء هنا، شيء هنا، 650 00:29:35,770 --> 00:29:37,850 شيء هنا، وهكذا. 651 00:29:37,850 --> 00:29:41,560 لذا يتضح أن المصفوفة، هذا الشيء الأساسي البسيط الرائع 652 00:29:41,560 --> 00:29:43,900 هو في الواقع قوي بشكل لا يصدق. 653 00:29:43,900 --> 00:29:46,900 مجرد القدرة على تخزين أشياء في ذاكرة الكمبيوتر 654 00:29:46,900 --> 00:29:52,630 متصلين على التوالي مع بعضهم البعض يتيح العديد من الاحتمالات، كلا التصميمين، 655 00:29:52,630 --> 00:29:56,710 مثل كيف يمكنني كتابة التعليمات البرمجية، وأيضًا مدى السرعة التي يمكنني بها تشغيل التعليمات البرمجية. 656 00:29:56,710 --> 00:29:59,810 لذلك اسمحوا لي بالمضي قدمًا وإعطاء مثال على ذلك. 657 00:29:59,810 --> 00:30:04,690 اسمحوا لي بالمضي قدمًا وفتح، على سبيل المثال، ملف جديد في sandbox، 658 00:30:04,690 --> 00:30:06,700 وسنطلق عليه score0. 659 00:30:06,700 --> 00:30:12,150 لذلك اسمحوا لي بالمضي قدما وإغلاق هذا، وإنشاء ملف جديد يُسمى scores0.c. 660 00:30:12,150 --> 00:30:16,570 وفي هذا الملف، دعونا نمضي قدمًا ونكتب برنامجًا بسيطًا نسبيًا. 661 00:30:16,570 --> 00:30:18,790 اسمحوا لي بالمضي قدمًا، كالمعتاد، وإعطاء نفسي إمكانية وصول 662 00:30:18,790 --> 00:30:22,690 إلى بعض الدوال المفيدة-- cs50.h وstdio.h. 663 00:30:22,690 --> 00:30:25,300 وليس هناك حاجة لنسخ كل هذا في الأسفل حرفيًا، إذا كنت لا تحب ذلك. 664 00:30:25,300 --> 00:30:28,210 كل شيءٍ بالفعل على الموقع الإلكتروني للدورة. 665 00:30:28,210 --> 00:30:30,880 دعوني أبدأ برنامجي كالعادة مع int main void. 666 00:30:30,880 --> 00:30:33,730 ثم اسمحوا لي بكتابة برنامج، كما يشير اسم هذا البرنامج، 667 00:30:33,730 --> 00:30:38,470 مثل، أن يطلب من المستخدم ثلاث درجات على مجموعات المشكلة الأخيرة، 668 00:30:38,470 --> 00:30:41,470 أو مسابقات، أيًا كان، ثم نوعًا ما يُنشيء مخططًا بسيطًا جدًا منهم، 669 00:30:41,470 --> 00:30:44,440 مخطط شريطي مثلاً ليساعدني على تصور مدى جودة 670 00:30:44,440 --> 00:30:46,340 أو رداءة أدائي في شيءٍ ما. 671 00:30:46,340 --> 00:30:49,450 إذا كنت أرغب في الحصول على عدد صحيح، لا مفاجأة، 672 00:30:49,450 --> 00:30:51,610 يمكننا استخدام دالة int، ويمكنني فقط 673 00:30:51,610 --> 00:30:54,280 أن أطلب من المستخدم الحصول على أول درجة له. 674 00:30:54,280 --> 00:30:56,500 ولكن ربما يجب أن أفعل شيئًا بهذه النتيجة، 675 00:30:56,500 --> 00:31:00,160 وعلى الجانب الأيسر من هذا، ما الذي أضعه عادةً؟ 676 00:31:00,160 --> 00:31:00,660 نعم. 677 00:31:00,660 --> 00:31:04,720 إذًا int--بالتأكيد، النتيجة 1 تساوي هذا، ثم الفاصلة المنقوطة. 678 00:31:04,720 --> 00:31:07,480 قد لا يكون لديكم العديد من المناسبات لاستخدام ints فقط حتى الآن، 679 00:31:07,480 --> 00:31:09,370 لكن get int موجود في مكتبة cs50. 680 00:31:09,370 --> 00:31:11,170 هذا هو ما يسمى المُحث الذي يراه الشخص 681 00:31:11,170 --> 00:31:13,600 واسمحوا لي في الواقع بإصلاح المسافة الخاصة بي، لأنني 682 00:31:13,600 --> 00:31:16,630 أريد أن يرى الشخص المسافة بعد النقطتين. 683 00:31:16,630 --> 00:31:18,310 لكن هذا مجرد تفصيل جمالي. 684 00:31:18,310 --> 00:31:21,350 ثم عندما أعيد إلى هذه القيمة، قيمة إرجاعها-- 685 00:31:21,350 --> 00:31:23,650 تماما مثلما، في الأسبوع الماضي، سلمني آرون قطعة من الورق، 686 00:31:23,650 --> 00:31:26,710 فـ get int أيضًا سلمني قطعة افتراضية من الورق وفيها رقم 687 00:31:26,710 --> 00:31:29,500 والتي سأخزنها في متغير يُسمى Score 1. 688 00:31:29,500 --> 00:31:34,690 والآن فقط لنكون واضحين، ما حدث فعليًا هو هذا. 689 00:31:34,690 --> 00:31:39,550 في اللحظة التي تقوم فيها بإنشاء متغير من نوع int، وهو أربع وحدات بايت، 690 00:31:39,550 --> 00:31:42,430 حرفيًا، هذا هو ما يفعله Clang أو، بشكل عام، 691 00:31:42,430 --> 00:31:44,230 الكمبيوتر من أجلك. 692 00:31:44,230 --> 00:31:47,890 يتم تخزين int الذي كتبه الإنسان حرفيًا 693 00:31:47,890 --> 00:31:51,730 في أربع وحدات بايت متجاورة متصلة على التوالي، ربما هنا، ربما هنا، 694 00:31:51,730 --> 00:31:52,480 لكن معًا. 695 00:31:52,480 --> 00:31:55,540 هذا كل ما يحدث عندما في الواقع تستخدم لغة C. 696 00:31:55,540 --> 00:31:58,240 لذلك اسمحوا لي بالعودة إلى التعليمات البرمجية الخاصة بي هنا، وأنا الآن 697 00:31:58,240 --> 00:32:00,380 أريد أن-- ليس من المثير كتابة درجة واحدة. 698 00:32:00,380 --> 00:32:01,750 لذا دعوني أمضي قُدمًا وأكتب واحدة أخرى. 699 00:32:01,750 --> 00:32:08,080 إذًا int Score 2، get int، get int، وسأطلب من المستخدم score 2، 700 00:32:08,080 --> 00:32:13,800 فاصلة منقوطة، ثم دعونا نحصل على واحدة أخرى Score 3، get int، ثم نسميها Score 3، 701 00:32:13,800 --> 00:32:14,830 فاصلة منقوطة. 702 00:32:14,830 --> 00:32:17,390 حسنًا، اسمحوا لي الآن بالمضي قدمًا والقيام بتوليد شريط، 703 00:32:17,390 --> 00:32:18,490 مثل المخطط الشريطي لهذا. 704 00:32:18,490 --> 00:32:20,530 سأستخدم ما سندعوه فن ASCII. 705 00:32:20,530 --> 00:32:22,480 ASCII، بالطبع، هو مجرد نص، تذكروا-- 706 00:32:22,480 --> 00:32:23,780 نص بسيط جدًا في الكمبيوتر. 707 00:32:23,780 --> 00:32:27,670 ويمكنني أن أقوم بتصميم مخطط شريطي بسيط جدًا فقط عن طريق طباعة 708 00:32:27,670 --> 00:32:30,530 مجموعة من رموز الشباك مثلاً أفقيًا، لذلك سيمثل الشريط القصير 709 00:32:30,530 --> 00:32:34,090 رقمًا صغيرًا، وسيمثل الشريط الطويل رقمًا كبيرًا. 710 00:32:34,090 --> 00:32:38,410 لذا دعوني أمضي قدمًا وأقول للمستخدم، حسنًا، ها هو Score 1 الخاص بك. 711 00:32:38,410 --> 00:32:41,320 سأمضي قدمًا، ثم، أقول، for int i get 0. 712 00:32:41,320 --> 00:32:46,000 I أقل من Score 1, i++. 713 00:32:46,000 --> 00:32:48,970 والآن إذا قمت بالتمرير لأسفل وأعطيت نفسي مساحة هنا، 714 00:32:48,970 --> 00:32:53,740 دعوني أمضي قدمًا وأنفذ فقط طباعةٍ بسيطة. 715 00:32:53,740 --> 00:32:57,580 امضِ قدمًا واطبع رمز شباك، ثم عندما تنتهي من هذا، 716 00:32:57,580 --> 00:33:01,660 اطبع سطرًا جديدًا في نهاية التكرار الحلقي هذا. 717 00:33:01,660 --> 00:33:03,160 دعونا فقط نتوقف لثانية هنا. 718 00:33:03,160 --> 00:33:05,830 فقط للتلخيص، لقد سألت الأشخاص عن ثلاث نتائج. 719 00:33:05,830 --> 00:33:09,070 أنا أفعل شيئًا ما مع واحد منهم فقط في الوقت الحالي، لذلك في الواقع، 720 00:33:09,070 --> 00:33:13,420 فقط كفحص سريع، دعوني أحذف هؤلاء لكي لا أمضي قدمًا بنفسي. 721 00:33:13,420 --> 00:33:15,060 دعوني أقوم make score 0. 722 00:33:15,060 --> 00:33:16,380 سأعقد أصابعي. 723 00:33:16,380 --> 00:33:17,510 حسنًا، لا أخطاء. 724 00:33:17,510 --> 00:33:22,480 الآن اسمحوا لي بالمضي قدمًا وكتابة ./score0، وماذا كانت نتيجتك الأولى في pset 725 00:33:22,480 --> 00:33:24,580 هذا العام من أصل 100؟ 726 00:33:24,580 --> 00:33:26,170 حسنًا، 100. 727 00:33:26,170 --> 00:33:27,090 وعمل جيد. 728 00:33:27,090 --> 00:33:29,260 إنه حقًا شريطٌ طويل، وإذا قمنا بعد هؤلاء، 729 00:33:29,260 --> 00:33:31,380 نأمل، أن يكون هناك في الواقع 100 شريط. 730 00:33:31,380 --> 00:33:33,760 وإذا قمنا بتشغيله مجددًا والقول، إيه، هذا لم يجرِ يصورةٍ جيدة. 731 00:33:33,760 --> 00:33:35,170 حصلت على 50. 732 00:33:35,170 --> 00:33:36,640 هذا نصف حجم الشريط. 733 00:33:36,640 --> 00:33:39,130 لذلك يبدو أننا في طريقنا الصحيح لطريقة التشغيل. 734 00:33:39,130 --> 00:33:41,200 والآن دعوني أمضي قدمًا وأحصل على الدرجات الأخرى. 735 00:33:41,200 --> 00:33:42,860 حسنًا، حصلت عليهم هنا منذ لحظة. 736 00:33:42,860 --> 00:33:46,930 لذا دعوني أمضي قدمًا وحسنًا فقط، أنسخ، وألصق، وأغير هذا إلى اثنين، 737 00:33:46,930 --> 00:33:50,020 وأغير هذا إلى ثلاثة، وأغير هذا إلى ثلاثة، هذا إلى ثلاثة. 738 00:33:50,020 --> 00:33:53,020 حسنًا، أعرف كيفية طباعة شريط بطريقة واضحة، لذا دعوني أمضي قدمًا 739 00:33:53,020 --> 00:33:56,880 وأقوم بذلك، ومن ثم أقوم بذلك، ثم إصلاح المسافة البادئة. 740 00:33:56,880 --> 00:33:58,510 لا أريد أن أقول Score 1 في كل مكان. 741 00:33:58,510 --> 00:34:00,640 أريد أن Score 2, Score 2. 742 00:34:00,640 --> 00:34:03,370 أعني أنك ربما كنت مُضللاً بطريقة خاطئة أن هذا 743 00:34:03,370 --> 00:34:06,040 أمرًا سيئًا ومملاً، ولماذا؟ 744 00:34:06,040 --> 00:34:07,870 ما الذي أفعله بشكل سيئ الآن من حيث التصميم؟ 745 00:34:07,870 --> 00:34:09,330 الجمهور: نسخ التعليمات البرمجية ولصقها. 746 00:34:09,330 --> 00:34:11,650 ديفيد ج. مالان: النسخ واللصق معظم الوقت أمر سيئ، أليس كذلك؟ 747 00:34:11,650 --> 00:34:13,420 يوجد تكرار هنا، لكن لا بأس. 748 00:34:13,420 --> 00:34:15,670 دعونا نعطي الأولوية للتصحيح، في الوقت الحالي، على الأقل. 749 00:34:15,670 --> 00:34:18,110 إذًا دعوني أمضي قدمًا وأنشيء Score 0. 750 00:34:18,110 --> 00:34:21,290 حسنًا، لا أخطاء-- ./score0. 751 00:34:21,290 --> 00:34:22,210 ثم النقر عليها. 752 00:34:22,210 --> 00:34:24,630 دعوني أمضي قُدمًا وأشغل-- 753 00:34:24,630 --> 00:34:26,170 حسنًا، لقد حصلنا على 100 في المرة الأولى. 754 00:34:26,170 --> 00:34:27,590 وحصلنا على 50 فى-- 755 00:34:27,590 --> 00:34:29,320 أوه، هذا خطأ. 756 00:34:29,320 --> 00:34:31,560 ما الذي فعلته هناك؟ 757 00:34:31,560 --> 00:34:33,810 انظروا، هذا ما يحدث عندما تقومون بالنسخ واللصق. 758 00:34:33,810 --> 00:34:34,780 إذًا دعونا نصلح هذا. 759 00:34:34,780 --> 00:34:37,810 ينبغي أن يكون هذا Score 2، إذًا Control+C سينهي البرنامج. 760 00:34:37,810 --> 00:34:42,340 سيقوم Make score 0 بإعادة إنشائه. ./0، Enter-- 761 00:34:42,340 --> 00:34:43,260 حسنًا، ها قد بدأنا. 762 00:34:43,260 --> 00:34:44,850 100، 50. 763 00:34:44,850 --> 00:34:46,020 دعونا نقسم التباعد-- 764 00:34:46,020 --> 00:34:47,260 75. 765 00:34:47,260 --> 00:34:51,000 حسنًا، لذلك هذا مخطط شريطي بسيط مرسوم أفقيًا 766 00:34:51,000 --> 00:34:55,350 لكل واحدة من النقاط الثلاث الخاصة بي، حيث أن هذا هو 100، وهذا 50، وهذا 75. 767 00:34:55,350 --> 00:34:57,820 لكن هناك فرص للتحسين هنا. 768 00:34:57,820 --> 00:34:59,850 إذًا أولاً، إنها تضلل بعض الناس 769 00:34:59,850 --> 00:35:05,190 بالفعل حيث كنا حرفيًا ننسخ التعليمات البرمجية ونلصقها. 770 00:35:05,190 --> 00:35:09,430 فأين هى الفرصة الوحيدة للتحسين هنا؟ 771 00:35:09,430 --> 00:35:13,000 ما الذي ينبغي عليّ فعله بدلاً من نسخ التعليمات البرمجية ولصقها مراراً وتكراراً؟ 772 00:35:13,000 --> 00:35:15,640 ما المقوم الذي يمكنكم وضعه؟ 773 00:35:15,640 --> 00:35:19,100 حسنًا، إذًا يمكننا استخدام التكرار الحلقي وفي الواقع فعل الشيء نفسه ثلاث مرات. 774 00:35:19,100 --> 00:35:22,280 إذًا دعونا نجرب ذلك. 775 00:35:22,280 --> 00:35:25,310 دعوني أمضي قُدمًا وأقوم بذلك. 776 00:35:25,310 --> 00:35:28,660 إذًا دعوني أمضي قدمًا وأحذف النسخ واللصق الذي قمت به، 777 00:35:28,660 --> 00:35:35,620 ودعوني أمضي قدمًا وأقول، حسنًا، for int i get zero, i less than 3, i++. 778 00:35:35,620 --> 00:35:37,660 دعوني أنشيء قوسًا. 779 00:35:37,660 --> 00:35:39,460 يمكنني تمييز عدة سطور والنقر فوق Tab، 780 00:35:39,460 --> 00:35:41,590 وستتم إزاحتهم جمعيًا، وهو أمر مناسب. 781 00:35:41,590 --> 00:35:44,270 هل يمكنني القيام بذلك الآن، مثلاً؟ 782 00:35:48,860 --> 00:35:50,240 قولها بصوتٍ أعلى قليلاً. 783 00:35:50,240 --> 00:35:54,660 الجمهور: إذا كنت [INAUDIBLE] إلى محددة [INAUDIBLE].. 784 00:35:54,660 --> 00:35:56,580 ديفيد ج. مالان: نعم، أنا قلق قليلاً. 785 00:35:56,580 --> 00:36:01,420 كما تلاحظون هنا، إننا نستخدم في السطر 13 هنا المتغير نفسه، إذًا امم. 786 00:36:01,420 --> 00:36:03,420 حدس جيد، لكني أشعر فى الواقع 787 00:36:03,420 --> 00:36:05,160 أن هذا البرنامج، مغاير لسابقه فى الأسبوع الماضي، ونحن 788 00:36:05,160 --> 00:36:06,790 الآن نجمع عدة أجزاء من البيانات. 789 00:36:06,790 --> 00:36:08,090 التي يقسمها لنا التكرار الحلقي. 790 00:36:08,090 --> 00:36:08,590 نعم. 791 00:36:08,590 --> 00:36:13,020 الجمهور: يأخذ [INAUDIBLE] دالة [INAUDIBLE] تؤخذ فى-- 792 00:36:13,020 --> 00:36:16,980 كما لو يمكنك الحصول عليه [INAUDIBLE]. 793 00:36:16,980 --> 00:36:17,770 ديفيد ج. مالان: حسنًا. 794 00:36:17,770 --> 00:36:20,520 الجمهور: مثل مُدخلٍ لِكم عدد النتائج التي أردت إدخالها. 795 00:36:20,520 --> 00:36:21,410 ديفيد ج. مالان: حسنًا. 796 00:36:21,410 --> 00:36:23,690 الجمهور: وإذًا، [INAUDIBLE]. 797 00:36:23,690 --> 00:36:25,610 ديفيد ج. مالان: نعم، يمكننا تنفيذ 798 00:36:25,610 --> 00:36:27,810 دالة أخرى تقلل بعضًا من تلك الوظيفة. 799 00:36:27,810 --> 00:36:28,650 أي أفكار أخرى؟ 800 00:36:28,650 --> 00:36:30,790 AUDIENCE: قم بتخزين نتائجك في مصفوفة. 801 00:36:30,790 --> 00:36:33,540 ديفيد ج. مالان: حسنًا، يمكننا أيضًا تخزين نتائجنا فى مصفوفة. 802 00:36:33,540 --> 00:36:34,910 إذًا دعونا نفعل هذا بترتيب، في الواقع. 803 00:36:34,910 --> 00:36:37,740 إذًا التكرارت الحلقية رائعة عندما تريد أن تفعل شيئًا مرارًا 804 00:36:37,740 --> 00:36:39,890 وتكرارًا، ولكن الغرض كله من دالة ما، 805 00:36:39,890 --> 00:36:43,340 في جوهر الأمر، هو لتعيين أداء وظيفي مشترك. 806 00:36:43,340 --> 00:36:45,340 وربما ما يزال هناك تكرار حلقي فى الحل، 807 00:36:45,340 --> 00:36:48,130 لكن المشكلة الجوهرية الحقيقية مع ما كنت أفعله منذ لحظة 808 00:36:48,130 --> 00:36:50,210 هي أنني كنت أقوم بنسخ ولصق الأداء الوظيفي-- 809 00:36:50,210 --> 00:36:52,700 لا يتعين علينا القيام بهذا، لأن في كل من C و سكراتش، 810 00:36:52,700 --> 00:36:54,890 كان بوسعنا إنشاء الدالات الخاصة بنا. 811 00:36:54,890 --> 00:36:55,720 إذًا دعونا نقوم بذلك. 812 00:36:55,720 --> 00:36:58,010 دعوني ألغي تغييرات التكرار الحلقي هنا، فقط للعودة 813 00:36:58,010 --> 00:36:59,960 إلى ما كنا عليه منذ لحظات. 814 00:36:59,960 --> 00:37:02,790 دعوني أمضي قدمًا، وبدلاً من ذلك، إزالة هذا قليلا. 815 00:37:02,790 --> 00:37:04,910 دعوني أمضي قدمًا وأُنشيء دالة جديدة 816 00:37:04,910 --> 00:37:07,850 في الأسفل هنا سأسميها مثلاً، Chart، فقط 817 00:37:07,850 --> 00:37:09,380 فقط لأنشىء مخططًا لنفسي. 818 00:37:09,380 --> 00:37:12,840 وانها ستحصل على نتيجة لكونها مُدخل، ولكن يمكنني أن أسميه ما أريد. 819 00:37:12,840 --> 00:37:15,960 إنها void كونها علامة رجوع، لأنني لا أريدها أن تسلمني شيئًا 820 00:37:15,960 --> 00:37:16,460 مجددًا. 821 00:37:16,460 --> 00:37:18,010 لن أحصل على سلسلة من المستخدم. 822 00:37:18,010 --> 00:37:19,330 قمت فقط بطباعة حرف. 823 00:37:19,330 --> 00:37:21,680 إنه ما يسمى التأثير الجانبي أو المخرج. 824 00:37:21,680 --> 00:37:25,220 الآن سأمضي قدمًا وسأقوم بالتكرار الحلقي لديّ هنا for int i get 0. 825 00:37:25,220 --> 00:37:27,500 I أقل من-- 826 00:37:27,500 --> 00:37:32,400 كم عدد علامات الشباك التي أريد طباعتها في حالة تمريري في نتيجة المستخدم؟ 827 00:37:32,400 --> 00:37:34,770 مثلاً، هل هذا 3 هنا؟ 828 00:37:34,770 --> 00:37:35,860 الجمهور: النتيجة. 829 00:37:35,860 --> 00:37:37,610 ديفيد ج. مالان: النتيجة، إذًا لو تم 830 00:37:37,610 --> 00:37:40,540 تسليمي رقمًا يتراوح من 0 إلى 100، وهذا ما أريد تكراره دومًا. 831 00:37:40,540 --> 00:37:43,000 إذا كان هدفي هنا، في النهاية-- 832 00:37:43,000 --> 00:37:48,970 دعوني أنهي هذه المُعضِلة-- i++ هى [؟ 2 ؟] داخل هذا التكرار الحلقي 833 00:37:48,970 --> 00:37:52,080 اطبع علامة شباك واحدة لكل نقطة فى إجمالي نتائج 1. 834 00:37:52,080 --> 00:37:54,580 وفقط للحفاظ على الأشياء نظيفة، سأمضي قدمًا وأضع 835 00:37:54,580 --> 00:37:56,500 سطرًا جديدًا في أقصي نهاية هذا. 836 00:37:56,500 --> 00:37:59,820 لكنني أعتقد الآن، أنني قمت بتقليل كمية لا بأس بها من التكرار. 837 00:37:59,820 --> 00:38:01,960 ليس جميعه، ولكني على الأقل الآن 838 00:38:01,960 --> 00:38:04,030 منحت نفسي دالة تسمى Chart. 839 00:38:04,030 --> 00:38:08,860 إذًا فى الأعلى هنا، يبدو أنه يمكنني نوعًا ما إزالة ذلك التكرار الحلقي، الذي 840 00:38:08,860 --> 00:38:10,030 قمت بتقليله. 841 00:38:10,030 --> 00:38:13,390 إنه متطابق تقريبًا، باستثناء أن اسم المتغير كان مُرّمزًا ضمنيًا. 842 00:38:13,390 --> 00:38:18,250 وأعتقد أنه يمكنني الآن إنشاء مخطط مثل هذا، 843 00:38:18,250 --> 00:38:22,270 ثم ربما يمكنني القيام بالنسخ واللصق قليلاً، لو كان ممكنًا، إذا 844 00:38:22,270 --> 00:38:28,360 يمكنني البعد عن طريق القيام بذلك، ثم مثلاًُ 2، ثم مثلاً 3، 845 00:38:28,360 --> 00:38:30,310 ثم لنقل 3، ثم لنقل 2. 846 00:38:30,310 --> 00:38:32,680 إنه لا يزال يقوم بالنسخ واللصق، لكن بشكل أقل. 847 00:38:32,680 --> 00:38:33,520 ويبدو أفضل. 848 00:38:33,520 --> 00:38:36,940 إنه حرفيًا يناسب الموجود على الشاشة، لذا إنه تقدم-- ليس مثاليًا، لكنه تقدم. 849 00:38:36,940 --> 00:38:38,780 تصميم أفضل، لكنه ليس مثاليًا. 850 00:38:38,780 --> 00:38:42,200 إذًا هل سيتحول هذا برمجيًا؟ 851 00:38:42,200 --> 00:38:44,050 سأواجه أخطاء، لماذا؟ 852 00:38:44,050 --> 00:38:47,330 الجمهور: بشكل أساسي، إنه [INAUDIBLE] البرنامج[INAUDIBLE].. 853 00:38:47,330 --> 00:38:49,420 ديفيد ج. مالان: حسنًا. 854 00:38:49,420 --> 00:38:50,370 أجل. 855 00:38:50,370 --> 00:38:52,720 الجمهور: نحن بحاجة إلى إعلان [INAUDIBLE].. 856 00:38:52,720 --> 00:38:53,850 ديفيد ج. مالان: حسنًا، جيد. 857 00:38:53,850 --> 00:38:58,000 اسمحوا لي أن أحث الخطأ الفعلي، فقط حتى نعرف المشكلة التي نقوم بحلها. 858 00:38:58,000 --> 00:39:00,460 اسمحوا لي بالمضي قدمًا وأن أمضي قدمًا نوعًا ما ببراءة 859 00:39:00,460 --> 00:39:03,730 وأقوم بتحويل Score 0 برمجيًا على أمل أن كل شيء على ما يرام، لكن بالطبع، 860 00:39:03,730 --> 00:39:07,690 ليس بسبب خطأ شائع هنا. 861 00:39:07,690 --> 00:39:12,430 لذا لاحظوا، التصريح الضمني لمخطط الدالة غير صالح في C99. 862 00:39:12,430 --> 00:39:14,680 لذا مرة أخرى، التصريح الضمني للدالة 863 00:39:14,680 --> 00:39:18,720 فقط قد يعني أن Clang لا يعرف ما الذي تتحدث عنه. 864 00:39:18,720 --> 00:39:20,680 ويمكنك تشغيل help50، وربما على الأرجح 865 00:39:20,680 --> 00:39:22,300 سيعطيك نصيحة مماثلة. 866 00:39:22,300 --> 00:39:25,720 لكن مضمون هذا هو أن المخطط ليس دالة C. 867 00:39:25,720 --> 00:39:27,760 إنه لا يأتي مع لغة C. أنا من كتبته. 868 00:39:27,760 --> 00:39:29,470 لقد كتبته منذ قليل. 869 00:39:29,470 --> 00:39:32,620 إذًا فإن الحل الذي لم نستخدمه الأسبوع الماضي 870 00:39:32,620 --> 00:39:35,290 سيكون، حسنًا، إذا لم تعرفوا ما هو المخطط، فاسمحوا لي فقط 871 00:39:35,290 --> 00:39:37,920 أن أذهب وأضعه حيث ستعرفونه. 872 00:39:37,920 --> 00:39:40,740 والآن قم بتشغيل make score 0. 873 00:39:40,740 --> 00:39:42,250 حسنًا، تم حل المشكلة. 874 00:39:42,250 --> 00:39:46,180 إذًا هذا يصلحها، لكننا قد أصلحناها بطريقة مختلفة الأسبوع الماضي. 875 00:39:46,180 --> 00:39:48,790 ولماذا قد نرغب في التمسك بنهج الأسبوع الماضي 876 00:39:48,790 --> 00:39:50,800 وليس مجرد نسخ الدالة ولصقها ووضعها 877 00:39:50,800 --> 00:39:52,180 في الأعلى بدلاً من الأسفل؟ 878 00:39:55,940 --> 00:39:57,640 الجمهور: [INAUDIBLE]. 879 00:39:57,640 --> 00:40:00,640 ديفيد ج. مالان: أجل، أنا أقصد أنه يمثل قلقًا طفيفًا نوعًا ما في هذه اللحظة، 880 00:40:00,640 --> 00:40:02,260 لأن هذا برنامج قصير جدًا. 881 00:40:02,260 --> 00:40:06,130 ولكني أقوم بدفع الجزء الرئيسي من برنامجي، حرفيًا يدعى Main، 882 00:40:06,130 --> 00:40:07,360 أبعد وأبعد باتجاه الأسفل. 883 00:40:07,360 --> 00:40:10,570 والمغزى من قراءة التعليمة البرمجية هو فهم ماذا تفعل. 884 00:40:10,570 --> 00:40:13,770 لذا إذا قمت بفتح هذا الملف، وتعين علي التمرير، والتمرير، والتمرير، والتمرير، والتمرير 885 00:40:13,770 --> 00:40:16,330 فقط للبحث عن الدالة الرئيسية، فإن هذا أسلوب سيء. 886 00:40:16,330 --> 00:40:18,700 إنه لطيف نوعًا ما، وهو تقليد بشري جيد. 887 00:40:18,700 --> 00:40:22,480 ضع التعليمة البرمجية الرئيسية، الدالة الرئيسية، مكافئ النقر على العلم الأخضر، 888 00:40:22,480 --> 00:40:23,540 في الأعلى. 889 00:40:23,540 --> 00:40:25,480 إذًا لغة C تقدم لنا حلاً هنا. 890 00:40:25,480 --> 00:40:27,490 يجب عليك فقط أن تزوده بتلميح صغير. 891 00:40:27,490 --> 00:40:32,500 اسمحوا لي بالمضي قدمًا وقص هذا من هنا، ووضعه ثانيةً في الأسفل هنا، 892 00:40:32,500 --> 00:40:38,630 ومن ثم المضي قدمًا والنسخ واللصق فقط أو إعادة كتابة القيمة فقط-- 893 00:40:38,630 --> 00:40:43,630 عذرًا--القيمة لهذا السطر الأول، والتي تسمى بالنموذج الأولي. 894 00:40:43,630 --> 00:40:47,440 أعطي Clang معلومات كافية بحيث يعرف الوسائط التي تأخذها الدالة 895 00:40:47,440 --> 00:40:50,740 ونوع الإرجاع الخاص بها، وما هو اسمها، فاصلة منقوطة، 896 00:40:50,740 --> 00:40:53,680 وهذا هو ما يسمى بالإعلان أو-- 897 00:40:53,680 --> 00:40:58,070 ومن ثم تنفيذها بالأقواس المتعرجة وكل المنطق أدناه. 898 00:40:58,070 --> 00:40:59,780 لذا دعونا نمضي قدمًا ونشغل هذا. 899 00:40:59,780 --> 00:41:03,280 وإذا مررت لأعلى هنا، سنرى-- عذرًا. 900 00:41:03,280 --> 00:41:05,840 سنرى make score 0. 901 00:41:05,840 --> 00:41:08,060 حسنًا، نحن الآن في طريقنا إلى، score 0. 902 00:41:08,060 --> 00:41:08,560 Enter. 903 00:41:08,560 --> 00:41:13,780 Score 1 هو 100، 50، 75، والآن يبدو أننا لدينا دالة جيدة. 904 00:41:13,780 --> 00:41:17,280 ولكن لا يزال هناك فرصة، أجرؤ على القول، للتحسين. 905 00:41:17,280 --> 00:41:19,630 وأعتقد أن المشكلة الأساسية هي أنني ما زلت 906 00:41:19,630 --> 00:41:21,580 أقوم بنسخ ولصق الأشياء الصغيرة، لكن أعتقد 907 00:41:21,580 --> 00:41:26,290 أن المشكلة الأساسية هي أنني لا يوجد لدي التعبيرات المنطقية لتخزين 908 00:41:26,290 --> 00:41:30,010 قيم متعددة، إلا إذا كنت مسبقًا، كمبرمج، 909 00:41:30,010 --> 00:41:34,720 أعطيتهم جميع الأسماء الفريدة، لأنه إذا استخدمت المتغير نفسه لكل شيء، 910 00:41:34,720 --> 00:41:37,120 لن أتمكن من جمع الثلاث متغيرات في الأعلى، 911 00:41:37,120 --> 00:41:40,600 ثم تتكرر على كل ثلاثة في الأسفل، إذا كان لدي متغير واحد فقط. 912 00:41:40,600 --> 00:41:43,880 لذلك أحتاج إلى ثلاثة متغيرات، لكن هذا لا يُقاس بشكلٍ جيد. 913 00:41:43,880 --> 00:41:44,470 ومن يعلم؟ 914 00:41:44,470 --> 00:41:47,830 إذا أردت أن آخذ خمس نتائج، أو 10 نتائج، أو نتائج أكثر، 915 00:41:47,830 --> 00:41:51,140 فأنا حقًا أقوم بالنسخ واللصق بشكلٍ مفرط. 916 00:41:51,140 --> 00:41:53,660 لذا يتضح، بالفعل، أن الإجابة هي مصفوفة. 917 00:41:53,660 --> 00:41:55,910 لذا المصفوفة، في نهاية الأمر، هي مجرد 918 00:41:55,910 --> 00:41:59,110 تأثير جانبي لتخزين الأشياء في الذاكرة متصلين على التوالي مع بعضهم البعض. 919 00:41:59,110 --> 00:42:03,550 ولكن ما هو قوي حول حقيقة الذاكرة هذه هو التالي. 920 00:42:03,550 --> 00:42:07,960 أستطيع المضي قدمًا وفي، لنقل، إصدار جديد وأكثر تحسينًا 921 00:42:07,960 --> 00:42:10,090 من هذا البرنامج، والقيام بهذا. 922 00:42:10,090 --> 00:42:14,560 دعوني أمضي قدمًا وأفتح هذا، والذي كتبته مسبقًا، ويُسمى scores2.c. 923 00:42:14,560 --> 00:42:18,940 وفي scores2.c, لاحظوا أن لدينا التعليمات البرمجية التالية. 924 00:42:18,940 --> 00:42:23,140 في الدالة الرئيسية، لدي ميزة جديدة ووحدة بت جديدة من الصيغ. 925 00:42:23,140 --> 00:42:26,230 هذا السطر هنا الذي ظللته يقول، مرحبًا، Clang، 926 00:42:26,230 --> 00:42:30,520 أعطني متغيرًا يُدعى Scores من نوع العدد الصحيح، 927 00:42:30,520 --> 00:42:32,410 لكن من فضلك أعطني ثلاثةً منهم. 928 00:42:32,410 --> 00:42:34,270 لذا فإن الصيغة الجديدة هي القوسان المربعان لديك، 929 00:42:34,270 --> 00:42:37,880 وداخلهما أرقام المتغيرات التي تريدها من هذا النوع. 930 00:42:37,880 --> 00:42:39,760 ولا يجب عليك أن تمنحهم أسماء فريدة من نوعها. 931 00:42:39,760 --> 00:42:41,920 أنت تدعوهم حرفيًا بصورة جماعية، Scores، 932 00:42:41,920 --> 00:42:44,660 وباللغة الإنجليزية، اخترت عمدًا صيغة الجمع للتعبير عن ذلك. 933 00:42:44,660 --> 00:42:48,160 هذه مصفوفة قيم، وليست قيمة مفردة. 934 00:42:48,160 --> 00:42:49,460 ما الذي يمكنني فعله بعد ذلك؟ 935 00:42:49,460 --> 00:42:53,920 حسنًا، ها هو التكرار الحلقي for loop for int i get zero i أقل من 3 i++، 936 00:42:53,920 --> 00:42:56,410 والآن قمت بحل هذه المشكلة السابقة التي تم اقتراحها. 937 00:42:56,410 --> 00:42:57,920 حسنًا، فقط ضعه في تكرارٍ حلقي. 938 00:42:57,920 --> 00:43:02,560 أستطيع الآن، لأن المتغيرات الخاصة بي لا تُسمى Score 1, Score 2, Score 3، 939 00:43:02,560 --> 00:43:04,270 والتي حولتها إلى تعليمات برمجية ثابت. 940 00:43:04,270 --> 00:43:07,420 هم فقط يسمون Scores، والآن بما أنهم يُطلق عليهم Scores، 941 00:43:07,420 --> 00:43:10,480 ولدي هذا الترقيم للأقواس المربعة، فلاحظوا ما يمكنني القيام به. 942 00:43:10,480 --> 00:43:15,700 يمكنني الحصول على int, ويمكنني القول أن، اعطني score%i، وأدخل i زائد 1. 943 00:43:15,700 --> 00:43:17,500 لم أكن أريد أن أقول "صفر"، لأن الأشخاص 944 00:43:17,500 --> 00:43:18,950 لا يعدون من الصفر في العموم. 945 00:43:18,950 --> 00:43:24,430 لذا هذا يعد من واحد، اثنين، ثلاثة، لكن الكمبيوتر يقوم بهذا. 946 00:43:24,430 --> 00:43:25,980 لذا فإن Scores يعد متغيرًا. 947 00:43:25,980 --> 00:43:32,240 قوس، i، إغلاق القوس يقول خزّن قيمة i-th هناك. 948 00:43:32,240 --> 00:43:33,790 لذا i-th ليست لغة إنجليزية. 949 00:43:33,790 --> 00:43:36,850 وهذا يعني الانتقال إلى القوس 0، والقوس 1، والقوس 2. 950 00:43:36,850 --> 00:43:40,120 إذًا ما يعنيه هذا بشكلٍ فعال هو أن التكرار الأول للتكرار الحلقي، عندما 951 00:43:40,120 --> 00:43:44,080 i يساوي صفرًا، هذا يبدو مشابهًا لهذا، بشكلٍ فعّال. 952 00:43:44,080 --> 00:43:48,040 عندما يصبح i واحدًا في التكرار التالي، إذًا قم بهذا. 953 00:43:48,040 --> 00:43:51,610 عندما يصبح i اثنين في التكرار النهائي، فهي تبدو مثل هذا. 954 00:43:51,610 --> 00:43:54,910 عندما يصبح i ثلاثة، حسنًا، 3 ليس أقل من 3، 955 00:43:54,910 --> 00:43:57,050 وبالتالي لا يتم تنفيذه مجددًا. 956 00:43:57,050 --> 00:44:03,980 لذا باستخدام i داخل هذه الأقواس المربعة، هل أقوم بفهرسة المصفوفة؟ 957 00:44:03,980 --> 00:44:06,640 الفهرسة إلى مصفوفة تعني الانتقال إلى موقع معين، 958 00:44:06,640 --> 00:44:09,880 الموقع المُسمى i-th، لكنك تبدأ العد من الصفر. 959 00:44:09,880 --> 00:44:12,100 فقط لجعل هذا أكثر واقعية، ثم، إذا ذهبت للخلف 960 00:44:12,100 --> 00:44:14,350 لهذه الصورة لذاكرة جهاز الكمبيوتر الخاص بك، 961 00:44:14,350 --> 00:44:18,700 لذلك، هذا ربما، يكون القوس i، القوس 1-- 962 00:44:18,700 --> 00:44:23,710 القوس 0، القوس 1، القوس 2، القوس 3، القوس 4، القوس 50، أو أيًا كان. 963 00:44:23,710 --> 00:44:27,910 يمكنك الآن، باستخدام الأقواس المربعة، الدخول إلى أيٍ من كتل الذاكرة هذه 964 00:44:27,910 --> 00:44:30,970 لتخزين القيم لك. 965 00:44:30,970 --> 00:44:34,520 أي أسئلة حول ما قمنا به للتو؟ 966 00:44:34,520 --> 00:44:37,230 حسنًا، ثم على الجانب الآخر، يمكننا القيام بالشيء نفسه بالضبط. 967 00:44:37,230 --> 00:44:42,290 الآن عندما أطبع نتائجي، يمكنني التكرار بالمثل من 0 إلى 3، 968 00:44:42,290 --> 00:44:45,350 ثم طباعة النتائج عن طريق التمرير إلى المخطط 969 00:44:45,350 --> 00:44:48,170 القيمة نفسها، نتيجة i-th. 970 00:44:48,170 --> 00:44:51,440 مجددًا، الصيغة الجديدة الوحيدة هنا هي اسم متغير، قوس مربع، 971 00:44:51,440 --> 00:44:54,980 ثم رقم ، مثل 0، 1، 2، أو متغير مثل i، 972 00:44:54,980 --> 00:44:57,800 ثم دالة المخطط الخاصة بي هنا هي نفسها بالضبط. 973 00:44:57,800 --> 00:45:00,590 ليس لديها أدنى فكرة عن أن المصفوفة متضمَّنة، لأنني فقط 974 00:45:00,590 --> 00:45:04,640 أمرر نتيجة واحدة في وقت واحد. 975 00:45:04,640 --> 00:45:08,960 الآن يتضح أنه لا يزال هناك قرار تصميم سيئ واحد في هذا البرنامج. 976 00:45:08,960 --> 00:45:12,710 لا يزال هناك بعض التكرار، شيءٌ أستمر في كتابته مرارًا 977 00:45:12,710 --> 00:45:14,150 وتكرارًا. 978 00:45:14,150 --> 00:45:15,980 هل تظهر أمامك أي قيمة كأنها مكررة؟ 979 00:45:19,540 --> 00:45:20,710 الجمهور: التكرار الحلقي. 980 00:45:20,710 --> 00:45:21,920 ديفيد ج. مالان: التكرار الحلقي. 981 00:45:21,920 --> 00:45:24,810 حسنًا، لقد حصلت على التكرار الحلقي في أماكن متعددة. 982 00:45:24,810 --> 00:45:25,580 بالتأكيد. 983 00:45:25,580 --> 00:45:29,350 وما هي القيمة الأخرى التي تبدو في أماكن متعددة؟ 984 00:45:29,350 --> 00:45:30,170 إنها دقيقة. 985 00:45:32,820 --> 00:45:33,390 الرقم الإجمالي. 986 00:45:33,390 --> 00:45:34,440 نعم، 3. 987 00:45:34,440 --> 00:45:35,850 ثلاثة في أماكن متعددة. 988 00:45:35,850 --> 00:45:36,750 إنه هنا. 989 00:45:36,750 --> 00:45:41,160 إنه عندما أُعلن المصفوفة وأسأل نفسي عن ثلاث نتائج. 990 00:45:41,160 --> 00:45:44,200 إنه هنا عندما أقوم بالتكرار. 991 00:45:44,200 --> 00:45:46,410 إنه ليس هنا، لأن هذا تكرار مختلف. 992 00:45:46,410 --> 00:45:48,160 هذا فقط لرموز الشباك. 993 00:45:48,160 --> 00:45:51,270 حتى في، ويا للسخرية، كتبت 3 في ثلاثة أماكن. 994 00:45:51,270 --> 00:45:52,300 إذًا ماذا يعني هذا؟ 995 00:45:52,300 --> 00:45:54,630 حسنًا، لنفترض أن العام المقبل ستأخذون المزيد من الاختبارات أو ما شابه، 996 00:45:54,630 --> 00:45:55,770 وتحتاجون إلى المزيد من النتائج. 997 00:45:55,770 --> 00:46:00,320 فتفتحون البرنامج الخاص بكم، وحسنًا، الآن لقد حصلت على خمس نتائج وخمس-- 998 00:46:00,320 --> 00:46:04,020 عذرًا، خطأ مطبعي بالفعل-- خمسة، مثل هذا النوع من النمط 999 00:46:04,020 --> 00:46:06,180 حيث تكتب الشيء نفسه مرارًا وتكرارًا. 1000 00:46:06,180 --> 00:46:08,040 والآن يقع العبء علي، المبرمج، 1001 00:46:08,040 --> 00:46:11,580 لتذكر تغيير القيمة [? اللعينة ?] نفسها في أماكن متعددة-- 1002 00:46:11,580 --> 00:46:12,930 تصميم سيء للغاية. 1003 00:46:12,930 --> 00:46:14,640 أنت ستنسى واحدة من تلك القيم. 1004 00:46:14,640 --> 00:46:15,930 سيصبح البرنامج الخاص بك أكثر تعقيدًا. 1005 00:46:15,930 --> 00:46:18,390 ستترك واحدًا كما هو 3 وتغيّر الآخرين إلى 5، 1006 00:46:18,390 --> 00:46:20,540 وستحدث الأخطاء المنطقية في النهاية. 1007 00:46:20,540 --> 00:46:21,540 إذًا كيف يمكننا حل هذا؟ 1008 00:46:21,540 --> 00:46:24,410 الدالة ليست الحل هنا، لأنها ليست وظيفية. 1009 00:46:24,410 --> 00:46:25,560 إنها مجرد قيمة. 1010 00:46:25,560 --> 00:46:28,860 حسنًا ، يمكننا استخدام متغير، ولكن نوع معين من المتغيرات. 1011 00:46:28,860 --> 00:46:32,150 هذه الأرقام هنا-- 5، 5، 5 أو 3، 3، 3-- 1012 00:46:32,150 --> 00:46:34,360 هي ما يشير إليه الإنسان عمومًا كأرقام سحرية. 1013 00:46:34,360 --> 00:46:36,450 هم أرقام، ولكنهم سحريين نوعًا ما، 1014 00:46:36,450 --> 00:46:39,510 لأنك فقط بشكلٍ تعسفي تقوم بتضمينهم في أماكن عشوائية. 1015 00:46:39,510 --> 00:46:44,000 لكن ستحدث اتفاقية أفضل، في كثير من الأحيان كمتغير عالمي، وهي القيام بهذا-- 1016 00:46:44,000 --> 00:46:47,790 int، دعونا نطلق عليها "count"، يساوي 3. 1017 00:46:47,790 --> 00:46:51,270 لذا قم بإعلان متغير من النوع int على أنه عدد الأشياء 1018 00:46:51,270 --> 00:46:55,740 الذي تريدها، ثم اكتب اسم هذا المتغير في جميع أنحاء التعليمات البرمجية الخاصة بك 1019 00:46:55,740 --> 00:46:58,920 بحيث وفي وقت لاحق، إذا كنت ترغب في تغيير هذا البرنامج، 1020 00:46:58,920 --> 00:47:01,500 تغيره-- عذرًا-- في مكانٍ واحد، وتكون 1021 00:47:01,500 --> 00:47:03,330 قد انتهيت بعد إعادة تحويل البرنامج برمجيًا. 1022 00:47:03,330 --> 00:47:05,500 وفي الواقع، يجب علي فعل أفضل من ذلك قليلاً. 1023 00:47:05,500 --> 00:47:08,790 يتضح أنه إذا كنت تعلم أن لديك متغيرًا لن تقوم أبدًا 1024 00:47:08,790 --> 00:47:10,790 بتغييره، لأنه ليس من المفترض أن يتغير-- 1025 00:47:10,790 --> 00:47:12,450 من المفترض أن يكون قيمة ثابتة-- 1026 00:47:12,450 --> 00:47:16,470 لدى C أيضًا كلمة أساسية خاصة تُسمى const، حيث قبل نوع البيانات، 1027 00:47:16,470 --> 00:47:20,220 تقول، const int، ثم الاسم ثم القيمة، وهكذا، 1028 00:47:20,220 --> 00:47:22,740 سيتأكد المحول البرمجي، Clang، أنك، الإنسان، 1029 00:47:22,740 --> 00:47:27,100 لا تفسد وتحاول بطريق الخطأ تغيير العد في أي مكان آخر. 1030 00:47:27,100 --> 00:47:28,440 هناك شيء واحد آخر ملحوظ. 1031 00:47:28,440 --> 00:47:30,990 أنا أيضا قمت بتكبير جميع الحروف لسببٍ ما-- 1032 00:47:30,990 --> 00:47:31,870 التقليد الإنساني. 1033 00:47:31,870 --> 00:47:34,830 في أي وقت تقوم بتكبير كل الأحرف في اسم متغير، 1034 00:47:34,830 --> 00:47:36,990 التقليد ينص على أن هذا يعني أنها عالمية. 1035 00:47:36,990 --> 00:47:40,780 هذا يعني أنه تم تعريفه بطريقة أعلى، ويمكنك استخدامه في أي مكان، لذلك، 1036 00:47:40,780 --> 00:47:42,780 لأنه خارج جميع الأقواس المتعرجة. 1037 00:47:42,780 --> 00:47:46,290 ولكن الهدف من ذلك هو التوضيح وتذكيرك أن هذا أمر مميز. 1038 00:47:46,290 --> 00:47:48,630 إنه ليس مجرد ما يُدعى بمتغير محلي داخل 1039 00:47:48,630 --> 00:47:52,440 دالة أو داخل التكرار الحلقي أو ما شابه ذلك. 1040 00:47:52,440 --> 00:47:54,440 أي أسئلة على هذا الجزء؟ 1041 00:47:54,440 --> 00:47:55,110 أجل. 1042 00:47:55,110 --> 00:47:56,470 الجمهور: ما هو [INAUDIBLE]؟ 1043 00:47:56,470 --> 00:47:57,930 لماذا لديك i زائد 1؟ 1044 00:47:57,930 --> 00:47:59,730 ديفيد ج. مالان: أوه، لماذا لدي i زائد 1؟ 1045 00:47:59,730 --> 00:48:01,930 اسمحوا لي بتشغيل هذا البرنامج بسرعة. 1046 00:48:01,930 --> 00:48:05,160 السؤال هو لماذا لدي i زائد 1 في هذا السطر هنا. 1047 00:48:05,160 --> 00:48:07,860 إذًا دعوني أمضي قدمًا وأقوم بتشغيل make scores 2-- 1048 00:48:07,860 --> 00:48:09,630 عذرًا-- في الدليل الخاص بي. 1049 00:48:09,630 --> 00:48:13,680 Make scores 2 ./scores2, Enter. 1050 00:48:13,680 --> 00:48:18,570 أردت فقط من الأشخاص أن يروا Score 1 وScore 2 وScore 3. 1051 00:48:18,570 --> 00:48:22,620 لم أكن أريده أن يرى Score 0 ،Score 1 ،Score 2، لأنها تبدو فقط 1052 00:48:22,620 --> 00:48:23,640 نوعًا من السخافة للإنسان. 1053 00:48:23,640 --> 00:48:25,560 يحتاج الكمبيوتر إلى التفكير من حيث الأصفار. 1054 00:48:25,560 --> 00:48:29,190 الأشخاص والمستخدمين لا يفعلون، لذا هذا مجرد أمر جمالي. 1055 00:48:29,190 --> 00:48:29,860 أي أسئلة أخرى. 1056 00:48:29,860 --> 00:48:30,630 نعم. 1057 00:48:30,630 --> 00:48:32,100 الجمهور: [INAUDIBLE]. 1058 00:48:37,300 --> 00:48:39,010 ديفيد ج. مالان: أوه، سؤال جيد حقًا. 1059 00:48:39,010 --> 00:48:40,840 وقد فكرت بهذا في الواقع في الليلة الماضية 1060 00:48:40,840 --> 00:48:43,630 عند محاولة صياغة هذا المثال. 1061 00:48:43,630 --> 00:48:45,850 لماذا لا أقوم فقط بدمج هذين الاثنين للتكرار الحلقي، 1062 00:48:45,850 --> 00:48:50,500 لأنهم يتكررون بوضوح عدد مماثل من المرات؟ 1063 00:48:50,500 --> 00:48:52,450 هل كانت هذه يد أم مجرد تمطي؟ 1064 00:48:52,450 --> 00:48:53,830 لا، تمطي. 1065 00:48:53,830 --> 00:48:57,880 إذًا هذا في الواقع متعمد. 1066 00:48:57,880 --> 00:49:01,750 إذا قمت بدمج هؤلاء، ما الذي قد يتغير منطقيًا في برنامجي؟ 1067 00:49:01,750 --> 00:49:02,520 نعم. 1068 00:49:02,520 --> 00:49:05,890 الحضور: بعد كل [INAUDIBLE] المدخلات، قد [INAUDIBLE].. 1069 00:49:05,890 --> 00:49:08,860 ديفيد ج. مالان: نعم، إذًا، بعد كل مُدخل بشري لنتيجة، 1070 00:49:08,860 --> 00:49:11,920 كنت سأرى مخطط المستخدم، صف من رموز الشباك. 1071 00:49:11,920 --> 00:49:13,420 ثم سأطلب منهم قيمة أخرى. 1072 00:49:13,420 --> 00:49:15,470 سيشاهدون المخطط، قيمة أخرى، وسيشاهدون المخطط. 1073 00:49:15,470 --> 00:49:17,710 وهذا جيد، إذا كان هذا هو التصميم الذي تريده. 1074 00:49:17,710 --> 00:49:18,580 مقبول تمامًا. 1075 00:49:18,580 --> 00:49:19,480 صحيح تمامًا. 1076 00:49:19,480 --> 00:49:22,310 أردت أن يبدو برنامجي تقليديًا أكثر من ذلك بقليل مع كل الأشرطة 1077 00:49:22,310 --> 00:49:25,510 معًا، لذلك اضطررت بالفعل لتأجيل طباعة رموز الشباك. 1078 00:49:25,510 --> 00:49:27,760 ولهذا السبب لدي قليل من التكرار 1079 00:49:27,760 --> 00:49:30,400 عن طريق الحصول على مدخل المستخدم هنا ثم التكرار مجددًا 1080 00:49:30,400 --> 00:49:34,360 لطباعة مخرج المستخدم كمخطط، لذلك مجرد قرار تصميم. 1081 00:49:34,360 --> 00:49:35,060 سؤال جيد. 1082 00:49:35,060 --> 00:49:37,300 أي أسئلة أخرى؟ 1083 00:49:37,300 --> 00:49:40,020 حسنًا ، ماذا يبدو هذا؟ 1084 00:49:40,020 --> 00:49:41,020 في الواقع، أتعلم ماذا؟ 1085 00:49:41,020 --> 00:49:42,430 ربما أستطيع فعل أفضل من ذلك قليلاً. 1086 00:49:42,430 --> 00:49:45,730 دعوني أفتح مثالاً واحدًا نهائيًا يتضمن النتائج وهذا الشيء 1087 00:49:45,730 --> 00:49:46,860 المُسمى مصفوفة. 1088 00:49:46,860 --> 00:49:52,030 في Scores 4 هنا، دعوني أمضي قدمًا وأفعل هذا. 1089 00:49:52,030 --> 00:49:55,870 الآن قمت بتغيير دالة المخطط لدي للقيام بالمزيد، 1090 00:49:55,870 --> 00:49:58,840 وقد تتذكر من الأسبوع 0 و1، كان لدينا دالة call، 1091 00:49:58,840 --> 00:50:00,910 واستمررنا في تحسينها لتفعل المزيد، 1092 00:50:00,910 --> 00:50:02,830 مثل وضع المزيد من المنطق. 1093 00:50:02,830 --> 00:50:04,210 لاحظوا هذا. 1094 00:50:04,210 --> 00:50:08,360 تأخذ دالة Chart الآن وسيطة ثانية، وهذا أمر مثير للاهتمام. 1095 00:50:08,360 --> 00:50:10,720 فهي تأخذ وسيطة واحدة، والتي تكون رقمًا، 1096 00:50:10,720 --> 00:50:13,750 ثم الوسيطة التالية والتي تكون مصفوفة من scores. 1097 00:50:13,750 --> 00:50:16,090 إذن فالقصة الطويلة باختصار، إذا أردت أن تمتلك دالة 1098 00:50:16,090 --> 00:50:18,610 تأخذ مصفوفة كمدخل، فلا حاجة لك بمعرفة 1099 00:50:18,610 --> 00:50:20,200 مدى حجم تلك المصفوفة سلفًا. 1100 00:50:20,200 --> 00:50:23,140 في الحقيقة، لا ينبغي عليك وضع رقم بين أقواس مربعة 1101 00:50:23,140 --> 00:50:24,730 في هذا السياق. 1102 00:50:24,730 --> 00:50:27,700 لكن الشيء الذي تحتاج لمعرفته، في مرحلة ما 1103 00:50:27,700 --> 00:50:29,200 هو كم عدد العناصر في المصفوفة. 1104 00:50:29,200 --> 00:50:32,830 إذا قمت بالبرمجة في Java، أو أخذت إلحاق متقدم في علوم الكمبيوتر، فسيمنحك Java فقط. طول، 1105 00:50:32,830 --> 00:50:35,200 إذا كنت تتذكر ميزة الكائنات هذه. 1106 00:50:35,200 --> 00:50:36,550 لا تمتلك لغة C هذا. 1107 00:50:36,550 --> 00:50:39,850 لا تحتوي المصفوفات على طول متأصل مرتبط بها. 1108 00:50:39,850 --> 00:50:44,060 يجب أن تخبر كل فرد يستخدم مصفوفتك عن مدى طولها. 1109 00:50:44,060 --> 00:50:46,780 لذا على الرغم من أنك لا تقوم بهذا هنا من ناحية الصيغ، 1110 00:50:46,780 --> 00:50:50,620 فأنت حرفيًا تقول فقط، أنا أتوقع وسيطة تسمى scores 1111 00:50:50,620 --> 00:50:53,150 وهي مصفوفة في الأقواس المربعة. 1112 00:50:53,150 --> 00:50:55,900 يجب عليك غالبًا دومًا تمرير متغير ثانٍ 1113 00:50:55,900 --> 00:50:57,760 يتم تسميته بما تريد، 1114 00:50:57,760 --> 00:50:59,770 لكنه عدد من الأشياء في هذه المصفوفة، 1115 00:50:59,770 --> 00:51:02,560 لأنه إذا كان هدف هذه الدالة هو فقط 1116 00:51:02,560 --> 00:51:09,100 تكرار أكثر لعدد النتائج التي تم تمريرها، 1117 00:51:09,100 --> 00:51:12,940 ثم التكرار أكثر لعدد النقاط في هذه النتيجة 1118 00:51:12,940 --> 00:51:16,970 من أجل طباعة علامات الشباك، فعليك أن تعرف هذا العدد. 1119 00:51:16,970 --> 00:51:19,000 لذا ما الذي تقوم به هذه الدالة، فقط للتوضيح؟ 1120 00:51:19,000 --> 00:51:22,480 إنها تكرر أكثر عدد الإجمالي للنتائج من 0 إلى عدد، 1121 00:51:22,480 --> 00:51:24,820 وهو على الأرجح 3 أو 5 أو أيًا كان. 1122 00:51:24,820 --> 00:51:27,880 هذا التكرار الحلقي هنا، والذي يستخدم J، وهو فقط المتعارف عليه، 1123 00:51:27,880 --> 00:51:32,060 يكرر من 0 إلى درجة i-th أيًا كانت. 1124 00:51:32,060 --> 00:51:33,270 لذا هذا ما يعتبر مناسب. 1125 00:51:33,270 --> 00:51:38,140 الآن لقد قمت بالتمرير في المصفوفة، وما زلت أستطيع الحصول على قيم فردية 1126 00:51:38,140 --> 00:51:41,840 فقط باستخدام i، لأنني في تكرار i-th هنا. 1127 00:51:41,840 --> 00:51:44,800 لذا قد تتذكر هذا من ماريو، على سبيل المثال، أو أي مثال آخر 1128 00:51:44,800 --> 00:51:46,300 حيث يكون لديك تكرار حلقي متداخل-- 1129 00:51:46,300 --> 00:51:50,050 من المتعارف عليه جدًا استخدام i في الخارج، وj في الداخل. 1130 00:51:50,050 --> 00:51:54,370 لكن مرة أخرى، فإن النقطة الوحيدة هنا هي أننا نستطيع، بالفعل، تمرير المصفوفات، 1131 00:51:54,370 --> 00:51:59,530 حتى كوسائط، والذي سنفهم سبب فائدته قريبًا. 1132 00:51:59,530 --> 00:52:02,600 أي أسئلة؟ 1133 00:52:02,600 --> 00:52:05,540 حسنًا، إذًا كان هذا كثيرًا، لكن يمكننا أن نفعل أكثر بكثير باستخدام المصفوفات. 1134 00:52:05,540 --> 00:52:07,370 إنها تصبح رائعة أكثر وأكثر. 1135 00:52:07,370 --> 00:52:10,250 في الواقع، سنرى، خلال لحظات، كيف كانت المصفوفات بالفعل 1136 00:52:10,250 --> 00:52:11,530 معنا منذ الأسبوع الماضي. 1137 00:52:11,530 --> 00:52:14,280 إننا لم نلاحظها تمامًا تحت الغطاء، لكن دعونا نمضي قدمًا 1138 00:52:14,280 --> 00:52:15,690 ونأخذ استراحة، خمس دقائق. 1139 00:52:15,690 --> 00:52:16,990 سنعود ونتعمق في الأمر. 1140 00:52:16,990 --> 00:52:17,690 حسنًا. 1141 00:52:17,690 --> 00:52:20,360 أنا أعرف أن هذا كان مشوقًا قليلاً. 1142 00:52:20,360 --> 00:52:22,550 أين يمكن أيضًا أن تكون المصفوفات بالفعل؟ 1143 00:52:22,550 --> 00:52:25,010 لكن، بالطبع، هذه هي الطريقة التي قد نصورها بها بشكل تصويري. 1144 00:52:25,010 --> 00:52:27,980 نحن أطلقنا عليها مصفوفة، ومن الواضح أنه في الأسبوع الماضي، عندما 1145 00:52:27,980 --> 00:52:31,700 قمنا بتقديم السلاسل، وهي تسلسلات من الحروف، 1146 00:52:31,700 --> 00:52:34,520 والتي كانت حرفيًا مصفوفة باسم آخر. 1147 00:52:34,520 --> 00:52:39,330 فالسلسلة هي مصفوفة من الحروف، والحروف، بالطبع، هي نوع بيانات آخر. 1148 00:52:39,330 --> 00:52:41,250 الآن، ما هي الآثار الفعلية لهذا، 1149 00:52:41,250 --> 00:52:44,180 كلاهما من حيث التمثيل، مثل طريقة تمثيل الكمبيوتر 1150 00:52:44,180 --> 00:52:48,050 للمعلومات، وبشكل أساسي، وبرمجي 1151 00:52:48,050 --> 00:52:50,330 ماذا يمكننا أن نفعل عندما نعرف أن جميع بياناتنا 1152 00:52:50,330 --> 00:52:53,960 متصلة عل التوالي أو قريبة جدًا لبعضها البعض؟ 1153 00:52:53,960 --> 00:52:58,140 حسنًا، من الواضح أنه يمكننا تطبيق هذا المنطق بعدة طرق مختلفة. 1154 00:52:58,140 --> 00:53:01,110 اسمحوا لي بالمضي قدمًا وفتح، على سبيل المثال، 1155 00:53:01,110 --> 00:53:04,700 مثال هنا يسمى String 0. 1156 00:53:04,700 --> 00:53:08,330 لذا في التعليمة البرمجية الخاصة بنا لهذا اليوم، في مجلد Source 2 الخاص بنا، 1157 00:53:08,330 --> 00:53:13,230 اسمحوا لي بالمضي قدمًا وفتح String 0، وهذا المثال يبدو مثل هذا. 1158 00:53:13,230 --> 00:53:17,870 لاحظوا أننا أولاً، على السطر 9، نحصل على سلسلة من المستخدم. 1159 00:53:17,870 --> 00:53:19,670 فقط قل، مدخل، من فضلك. 1160 00:53:19,670 --> 00:53:23,880 فإننا نقوم بتخزين القيمة في string, s، ثم نقول، هنا يأتي المخرج. 1161 00:53:23,880 --> 00:53:26,390 ولاحظوا ما أقوم به في السطر التالي. 1162 00:53:26,390 --> 00:53:31,130 أنا أكرر أكثر i من 0 إلى strlen، أيًا كان هذا. 1163 00:53:31,130 --> 00:53:34,980 ثم في السطر 13 أقوم بطبع حرف واحد في كل مرة. 1164 00:53:34,980 --> 00:53:38,270 لكن لاحظوا الصيغة التي أستخدمها، والتي لم نستخدمها الأسبوع الماضي. 1165 00:53:38,270 --> 00:53:43,400 إذا كانت لديك سلسلة تسمى s، فيمكنك فهرستها إلى سلسلة 1166 00:53:43,400 --> 00:53:46,460 تمامًا كأنها مصفوفة، لكنها، بالفعل، غير ظاهرة. 1167 00:53:46,460 --> 00:53:50,450 إذًا s قوس i، حيث تبدأ i من الصفر فصاعدًا 1168 00:53:50,450 --> 00:53:55,450 إلى أي قيمة كانت هذه، فإنها طريقة للحصول على الحرف 0، ثم 1169 00:53:55,450 --> 00:53:58,370 الحرف 1،ثم الحرف 2، ثم الحرف 3، 1170 00:53:58,370 --> 00:54:01,550 وبالتالي فستبدو النتيجة النهائية مثل هذا. 1171 00:54:01,550 --> 00:54:04,210 اسمحوا لي بالمضي قدمًا، وكتابة make string-- 1172 00:54:04,210 --> 00:54:06,480 عذرًا-- make string 0. 1173 00:54:06,480 --> 00:54:06,980 عذرًا. 1174 00:54:06,980 --> 00:54:07,910 ليس في هذا الدليل. 1175 00:54:07,910 --> 00:54:15,890 Make string 0، ./string0، Enter، وسأكتب فيه، قل، Zamyla، 1176 00:54:15,890 --> 00:54:21,570 والمخرج الآن هو Z-A-M-Y-L-A. إنها فوضوية قليلاً، 1177 00:54:21,570 --> 00:54:24,870 لأنني لم يكن لدي سطر جديد هنا، لذا اسمحوا لي بالفعل-- دعونا نزيل هذا، 1178 00:54:24,870 --> 00:54:27,350 لأن هذا أمر سيء لا داعي له. 1179 00:54:27,350 --> 00:54:31,010 لذا اسمحوا لي بالمضي قدمًا وطباعة سطر جديد. 1180 00:54:31,010 --> 00:54:34,790 اسمحوا لي بإعادة تجميعه باستخدام make string 0، نقطة-- 1181 00:54:34,790 --> 00:54:37,520 عذرًا-- ./string0. 1182 00:54:37,520 --> 00:54:43,070 المدخل يجب أن يكون Zamyla، Enter، والآن Z-A-M-Y-L-A. 1183 00:54:43,070 --> 00:54:44,240 إذًا لماذا يحدث هذا؟ 1184 00:54:44,240 --> 00:54:47,720 حسنًا، إذا قمت بالتمرير لأسفل في هذه التعليمة البرمجية، فيبدو أنني، 1185 00:54:47,720 --> 00:54:52,700 عبر سطر printf هنا، أحصل على حرف i-th من الاسم الموجود في s، 1186 00:54:52,700 --> 00:54:55,820 ثم أطبع حرفًا واحدًا في كل مرة لكل %c، 1187 00:54:55,820 --> 00:54:57,270 يتبعه سطر جديد. 1188 00:54:57,270 --> 00:55:01,970 لذا فقد تخمنوا، ماذا تفعل هذه الدالة هنا؟ 1189 00:55:01,970 --> 00:55:06,490 Strlen-- مختصرة بشكل طفيف، لكن يمكنك، ربما، فهم ما تعنيه. 1190 00:55:06,490 --> 00:55:08,610 حسنًا، إنه في الواقع طول السلسلة. 1191 00:55:08,610 --> 00:55:11,220 لذا من الواضح أن هناك دالة تأتي 1192 00:55:11,220 --> 00:55:13,890 مع لغة C تسمى strlen، وأن البشر في السابق 1193 00:55:13,890 --> 00:55:17,670 وحاليًا يحبون الكتابة بعدد حروف أقل عندما يكون ذلك ممكنًا. 1194 00:55:17,670 --> 00:55:21,600 وبالتالي فإن strlen هي طول السلسلة، والطريقة التي تستخدمها هي 1195 00:55:21,600 --> 00:55:22,940 أنك فقط بحاجة إلى ملف رأس واحد آخر. 1196 00:55:22,940 --> 00:55:24,940 لذا يوجد هناك مكتبة أخرى تسمى مكتبة السلسلة 1197 00:55:24,940 --> 00:55:27,060 والتي تعطيك دوال ذات صلة بالسلسلة 1198 00:55:27,060 --> 00:55:29,410 وتتجاوز ما تقدمه مكتبة CS50. 1199 00:55:29,410 --> 00:55:32,130 وبالتالي إذا قمت بتضمين string.h، التي تمنحك الوصول 1200 00:55:32,130 --> 00:55:35,310 إلى دالة أخرى تسمى strlen، إذا قمت بإعطائها، 1201 00:55:35,310 --> 00:55:38,580 متغيرًا يتضمن سلسلة، فستعيد التمرير إليك 1202 00:55:38,580 --> 00:55:40,990 عدد الحروف كقيمة إرجاع إجمالي. 1203 00:55:40,990 --> 00:55:46,440 لذا لقد قمت بكتابة Z-A-M-Y-L-A، لذا يجب أن يرجع إلي هذا ستة، 1204 00:55:46,440 --> 00:55:49,650 وبالتالي طباعة ستة أحرف في اسم Zamyla. 1205 00:55:49,650 --> 00:55:50,240 أجل. 1206 00:55:50,240 --> 00:55:52,590 الجمهور:[INAUDIBLE]. 1207 00:55:52,590 --> 00:55:54,000 ديفيد ج. مالان: اه. 1208 00:55:54,000 --> 00:55:56,370 الجمهور: [INAUDIBLE] مفيد للحصول على أرقام فردية [INAUDIBLE].. 1209 00:55:56,370 --> 00:55:57,160 ديفيد ج. مالان: سؤال جيدحقًا. 1210 00:55:57,160 --> 00:56:00,480 في مشكلة الائتمان لمجموعة المشكلة، هل كان هذا مفيدًا؟ 1211 00:56:00,480 --> 00:56:01,740 نعم بالتأكيد. 1212 00:56:01,740 --> 00:56:04,500 لكن تذكر أن في الائتمان لـ pset، نحن نشجعك في الواقع 1213 00:56:04,500 --> 00:56:07,890 على أن تأخذ الرقم مثل رقم طويل، ليتسنى للقيمة المتكاملة، والتي 1214 00:56:07,890 --> 00:56:09,510 استلزمت بعض الحسابات. 1215 00:56:09,510 --> 00:56:12,690 لكن أجل، إذا كان لديك، بدلاً من ذلك، مشكلة تتعلق بأرقام بطاقة الائتمان 1216 00:56:12,690 --> 00:56:16,440 وحصلت على مدخل الإنسان كسلسلة طويلة من الأحرف 1217 00:56:16,440 --> 00:56:18,620 وليس كعدد حقيقي مثل عدد صحيح أو طويل، 1218 00:56:18,620 --> 00:56:21,330 إذًا، نعم، يمكنك بالفعل الحصول على تلك الحروف الفردية، 1219 00:56:21,330 --> 00:56:26,250 والتي ربما كانت ستجعل الأشياء أسهل لكنها متعمدة. 1220 00:56:26,250 --> 00:56:27,000 أجل. 1221 00:56:27,000 --> 00:56:29,290 الجمهور: [INAUDIBLE]. 1222 00:56:29,290 --> 00:56:30,840 ديفيد ج. مالان: سؤال جيدحقًا. 1223 00:56:30,840 --> 00:56:33,840 إذا قمنا بتعريف السلسلة في CS50، فهل سنعرفها مرة أخرى في سلسلة؟ 1224 00:56:33,840 --> 00:56:34,380 لا. 1225 00:56:34,380 --> 00:56:36,810 حتى السلسلة، بالرغم من أنها تدعى string.h، 1226 00:56:36,810 --> 00:56:39,210 فإنها لا تعرف شيء ما يدعى string. 1227 00:56:39,210 --> 00:56:42,660 إنها تحتوي على دوال ذات صلة بالسلسلة فقط. 1228 00:56:42,660 --> 00:56:43,410 المزيد من ذلك قريبًا. 1229 00:56:43,410 --> 00:56:43,910 أجل. 1230 00:56:43,910 --> 00:56:46,770 الجمهور: [INAUDIBLE] قيم فردية [INAUDIBLE]؟؟ 1231 00:56:46,770 --> 00:56:48,480 ديفيد ج. مالان: اه، سؤال جيد حقًا. 1232 00:56:48,480 --> 00:56:51,060 هل يمكنك تعديل القيم الفردية؟ 1233 00:56:51,060 --> 00:56:52,950 إجابة مختصرة، نعم. 1234 00:56:52,950 --> 00:56:57,930 يمكننا بالطبع تغيير القيم، وسنقوم بذلك قريبًا في سياق آخر. 1235 00:56:57,930 --> 00:56:59,650 أي أسئلة أخرى؟ 1236 00:56:59,650 --> 00:57:03,520 حسنًا، إذًا من الواضح أن هذا صحيح، إذا كان هدفي هو 1237 00:57:03,520 --> 00:57:06,050 طباعة جميع الحروف في اسم Zamyla، 1238 00:57:06,050 --> 00:57:07,330 لكنه ليس التصميم الأفضل. 1239 00:57:07,330 --> 00:57:09,820 ولكن هذا التصميم دقيق قليلاً، لكنه، ثانيةً ما نعنيه بشأن التصميم. 1240 00:57:09,820 --> 00:57:12,160 وردًا على السؤال الذي طُرح خلال فترة الراحة، 1241 00:57:12,160 --> 00:57:16,060 هل توقعنا من الجميع الكتابة بأسلوب جيد وتصميم جيد الأسبوع الماضي؟ 1242 00:57:16,060 --> 00:57:16,640 لا. 1243 00:57:16,640 --> 00:57:19,270 حتى اليوم، قدمنا فكرة الصواب 1244 00:57:19,270 --> 00:57:21,430 في كل من Scratch ولغة C الأسبوع الماضي، لكن الآن نحن 1245 00:57:21,430 --> 00:57:24,070 نقدم محاور جودة التعليمات البرمجية الأخرى 1246 00:57:24,070 --> 00:57:27,320 مثل التصميم، ومدى جودة التصميم، ومدى الجمالية 1247 00:57:27,320 --> 00:57:28,870 في سياق الأسلوب. 1248 00:57:28,870 --> 00:57:33,440 لذا التوقعات هنا من المفترض أن تتماشى مع تلك الخصائص، 1249 00:57:33,440 --> 00:57:35,030 لكن ليس في الماضي. 1250 00:57:35,030 --> 00:57:37,600 لذلك يوجد عدم كفاءة طفيفة هنا. 1251 00:57:37,600 --> 00:57:41,590 لذا في التكرار الأول في هذا التكرار الحلقي، أقوم أولاً بتهيئة i إلى 0، 1252 00:57:41,590 --> 00:57:45,370 ثم أتحقق مما إذا كانت i أقل من طول السلسلة، والتي نأمل، 1253 00:57:45,370 --> 00:57:48,470 أن يكون كذلك، إذا كان Zamyla، والذي هو أطول من 0. 1254 00:57:48,470 --> 00:57:50,260 سأطبع الحرف i-th. 1255 00:57:50,260 --> 00:57:51,880 سأقوم بزيادة i. 1256 00:57:51,880 --> 00:57:53,500 سأتحقق من هذا الشرط. 1257 00:57:53,500 --> 00:57:55,390 سأطبع الحرف i-th. 1258 00:57:55,390 --> 00:57:56,650 سأقوم بزيادة i. 1259 00:57:56,650 --> 00:57:58,730 سأتحقق من هذا الشرط وهكذا. 1260 00:57:58,730 --> 00:58:01,430 مررنا من خلال التكرار الحلقي الأسبوع الماضي، وكنتم قد استخدمتموه، ربما، 1261 00:58:01,430 --> 00:58:03,350 حتى الآن في المشاكل. 1262 00:58:03,350 --> 00:58:08,150 ما السؤال الذي أسأله بشكل متكرر ودون داعٍ؟ 1263 00:58:11,750 --> 00:58:13,850 يجب أن أتحقق من الشرط مرارًا وتكرارًا، 1264 00:58:13,850 --> 00:58:15,230 لأن i تزيد. 1265 00:58:15,230 --> 00:58:18,410 لكن هناك سؤال آخر والذي لا أحتاج 1266 00:58:18,410 --> 00:58:21,260 إلى الاستمرار في سؤاله للحصول على الإجابة نفسها. 1267 00:58:21,260 --> 00:58:23,530 الجمهور: ما هو طول [? السلسلة? ?] 1268 00:58:23,530 --> 00:58:25,570 ديفيد ج. مالان: أجل، هناك دالة call هذه 1269 00:58:25,570 --> 00:58:28,790 في التكرار الحلقي الخاص بـ strlen، s، وهذا جيد. 1270 00:58:28,790 --> 00:58:29,660 هذا صحيح. 1271 00:58:29,660 --> 00:58:32,670 أنا أتحقق من طول السلسلة، لكن بمجرد كتابة Zamyla، 1272 00:58:32,670 --> 00:58:34,730 اسمها لا يتغير في الطول. 1273 00:58:34,730 --> 00:58:38,240 أقوم بزيادة i، لذا أتنقل في السلسلة، إذا صح التعبير. 1274 00:58:38,240 --> 00:58:41,900 لكن السلسلة نفسها، Z-A-M-Y-L-A، لا تتغير. 1275 00:58:41,900 --> 00:58:46,020 فلماذا أطلب من الكمبيوتر، مرارًا وتكرارًا، أن يعطيني strlen الخاص بـ s، 1276 00:58:46,020 --> 00:58:48,140 أن يعطيني strlen الخاص بـ s، أن يعطيني strlen الخاص بـ s. 1277 00:58:48,140 --> 00:58:49,570 لذا يمكنني بالفعل إصلاح هذا. 1278 00:58:49,570 --> 00:58:52,540 يمكنني تحسين التصميم، لأن هذا يجب أن يأخذ بعض الوقت. 1279 00:58:52,540 --> 00:58:55,600 ربما إنه سريع، لكنه لا يزال كمية غير صفرية من الوقت. 1280 00:58:55,600 --> 00:58:56,770 لذا هل تعرف ما الذي يمكنني فعله؟ 1281 00:58:56,770 --> 00:58:59,950 يمكنني القيام بشيء مثل هذا-- int n get string length of s. 1282 00:58:59,950 --> 00:59:01,390 والآن أفعل هذا فقط. 1283 00:59:01,390 --> 00:59:05,560 هذا من شأنه أن يكون تصميم أفضل، لأن الآن أنا فقط أسأل السؤال مرة واحدة 1284 00:59:05,560 --> 00:59:06,460 من الدالة. 1285 00:59:06,460 --> 00:59:09,610 أنا أتذكر أو أقوم بالتخزين المؤقت، إذا صح التعبير، للإجابة، ثم 1286 00:59:09,610 --> 00:59:10,870 أستخدم فقط متغيرًا. 1287 00:59:10,870 --> 00:59:12,790 ومقارنة المتغيرات تصبح أسرع 1288 00:59:12,790 --> 00:59:16,180 من مقارنة متغير مقابل دالة، والتي يجب أن تُسمى، 1289 00:59:16,180 --> 00:59:18,600 والتي تصبح قيمة معادة، والتي يمكنك مقارنتها بعد ذلك. 1290 00:59:18,600 --> 00:59:20,650 ولكن بصراحة، إنه لا يجب أن يكون بهذا الإطناب. 1291 00:59:20,650 --> 00:59:22,810 يمكن بالفعل أن نكون منمقين أكثر بشأن هذا. 1292 00:59:22,810 --> 00:59:25,540 إذا كنت تستخدم التكرار الحلقي، ميزة سرية في التكرارات الحلقية 1293 00:59:25,540 --> 00:59:28,090 هي أنه يمكنك الحصول على فواصل بعد إعلان المتغيرات. 1294 00:59:28,090 --> 00:59:32,320 ويمكنك بالفعل القيام بهذا وفعل هذا بصورةٍ أكثر أناقة، إذا صح التعبير، 1295 00:59:32,320 --> 00:59:35,600 أو بصورةٍ مربكة أكثر، اعتمادًا على وجهة نظرك. 1296 00:59:35,600 --> 00:59:39,050 لكن هذا الآن يفعل الشيء نفسه لكنه يعلن n داخل التكرار الحلقي، 1297 00:59:39,050 --> 00:59:41,470 تمامًا كما أحدد i، وإنه أكثر إحكامًا بقليل. 1298 00:59:41,470 --> 00:59:44,850 إنه سطر واحد أقل من التعليمات البرمجية. 1299 00:59:44,850 --> 00:59:47,130 أية أسئلة أخرى؟ 1300 00:59:47,130 --> 00:59:50,020 الجمهور: [INAUDIBLE]. 1301 00:59:50,020 --> 00:59:51,270 ديفيد ج. مالان: سؤال جيد. 1302 00:59:51,270 --> 00:59:54,830 بالطريقة التي قمت بها لا يمكن إعادة استخدام هذا خارج الأقواس المتعرجة. 1303 00:59:54,830 --> 00:59:59,690 يوجد نطاق i وn في هذا السياق فقط الآن. 1304 00:59:59,690 --> 01:00:00,650 الطريقة الأخرى، نعم. 1305 01:00:00,650 --> 01:00:03,100 كان يمكن أن أستخدمها في مكانٍ آخر. 1306 01:00:03,100 --> 01:00:09,950 الجمهور: ماذا لو كنت [INAUDIBLE] من تكرار حلقي آخر، ولديك أيضًا [INAUDIBLE]؟؟ 1307 01:00:09,950 --> 01:00:11,440 ديفيد ج. مالان: بالتأكيد. 1308 01:00:11,440 --> 01:00:13,820 الجمهور: استخدام حروف أبجدية مختلفة، 1309 01:00:13,820 --> 01:00:17,140 يمكنك استخدام n وليس [INAUDIBLE].. 1310 01:00:17,140 --> 01:00:18,140 ديفيد ج. مالان: صحيح. 1311 01:00:18,140 --> 01:00:20,930 إذا كنت أرغب في استخدام طول s مجددًا، بالتأكيد. 1312 01:00:20,930 --> 01:00:24,420 يمكنني تحديد المتغير، كما فعلت سابقًا، خارج التكرار الحلقي، 1313 01:00:24,420 --> 01:00:25,650 حتى يمكنني إعادة استخدامه. 1314 01:00:25,650 --> 01:00:26,790 هذا جيد تمامًا. 1315 01:00:26,790 --> 01:00:27,290 نعم. 1316 01:00:27,290 --> 01:00:31,250 وحتى i-- توجد i فقط داخل هذا التكرار الحلقي، لذا إذا كان لدي تكرار حلقي آخر، 1317 01:00:31,250 --> 01:00:34,640 يمكنني إعادة استخدام i، وهي i مختلفة، لأن هذه المتغيرات فقط 1318 01:00:34,640 --> 01:00:37,610 توجد داخل التكرار الحلقي الذي تم تحديدهم فيه. 1319 01:00:37,610 --> 01:00:44,350 إذًا من الواضح أن هذه السلاسل لا يوجد بداخلها أي شيء 1320 01:00:44,350 --> 01:00:46,960 بخلاف حرف بعد حرف بعد حرف. 1321 01:00:46,960 --> 01:00:49,370 وفي الواقع، دعوني أمضي قدمًا هنا وأرسم 1322 01:00:49,370 --> 01:00:52,420 صورة لما يحدث بالفعل تحت غطاء الكمبيوتر 1323 01:00:52,420 --> 01:00:52,920 هنا. 1324 01:00:52,920 --> 01:00:55,180 لذا عندما أكتب اسم Zamyla، فأنا، بالطبع، 1325 01:00:55,180 --> 01:01:02,290 أقوم بشيء مثل Z-A-M-Y-L-A. لكن أين يذهب هذا بالفعل؟ 1326 01:01:02,290 --> 01:01:04,960 حسنًا، نحن نعرف الآن أن بداخل الكمبيوتر ذاكرة الوصول العشوائي أو الذاكرة، 1327 01:01:04,960 --> 01:01:06,730 ويمكنك تخيلها كشبكة. 1328 01:01:06,730 --> 01:01:08,640 وبصراحة، يمكنني التفكير في هذه الشاشة بأكملها 1329 01:01:08,640 --> 01:01:11,260 كما يجري في مختلف الاتجاهات، كشبكة من الذاكرة. 1330 01:01:11,260 --> 01:01:16,870 لذا على سبيل المثال، ربما يمكننا تقسيمها إلى صفوف وأعمدة مثل هكذا، ليس 1331 01:01:16,870 --> 01:01:20,830 بالضرورة على نطاق واسع، ويوجد العديد من الصفوف والأعمدة. 1332 01:01:20,830 --> 01:01:23,920 إذًا على الشاشة هنا، أنا فقط أُقسم الأشياء 1333 01:01:23,920 --> 01:01:28,190 إلى وحدات بايت فردية من الذاكرة التي رأيناها منذ لحظة. 1334 01:01:28,190 --> 01:01:32,550 وهكذا، في الواقع، تحت غطاء الكمبيوتر يوجد تخطيط الذاكرة. 1335 01:01:32,550 --> 01:01:35,680 اكتشف المحول البرمجي بطريقةٍ ما أو اكتشف البرنامج بطريقةٍ ما 1336 01:01:35,680 --> 01:01:39,460 أين يضع z وأين يضع a وأين يضع m وأين يضع y وأين يضع l وأين يضع a، 1337 01:01:39,460 --> 01:01:42,730 لكن الأساس هو أنهم جميعًا متجاورون، على التوالي مع بعضهم البعض. 1338 01:01:42,730 --> 01:01:46,780 ولكن تكمن المشكلة إذا كنت أكتب كلمات أخرى في برنامجي أو نتائجي 1339 01:01:46,780 --> 01:01:49,060 في برنامجي أو أي بيانات في برنامجي، 1340 01:01:49,060 --> 01:01:51,590 سوف ينتهي الأمر في مكان آخر في ذاكرة الكمبيوتر. 1341 01:01:51,590 --> 01:01:53,790 إذًا كيف تعرف أين تبدأ Zamyla وأين 1342 01:01:53,790 --> 01:01:56,590 تنتهي، إذا جاز التعبير، في الذاكرة؟ 1343 01:01:56,590 --> 01:02:02,100 حسنًا، المتغير، المدعو s، موجود هنا بشكل أساسي. 1344 01:02:02,100 --> 01:02:06,160 هناك تذكر ما في الكمبيوتر للمكان الذي يبدأ s منه. 1345 01:02:06,160 --> 01:02:10,750 لكن ليست هناك طريقة واضحة لمعرفة أين تنتهي Zamyla، 1346 01:02:10,750 --> 01:02:12,970 إلا إذا أخبرنا الكمبيوتر بأنفسنا. 1347 01:02:12,970 --> 01:02:16,510 إذًا وبدون علم منا، في أي وقت يقوم الكمبيوتر بتخزين سلسلة مثل 1348 01:02:16,510 --> 01:02:21,700 Z-A-M-Y-L-A، يتضح أنه لا يستخدم واحد، اثنين، ثلاثة، أربعة، خمسة 1349 01:02:21,700 --> 01:02:22,930 ستة حروف. 1350 01:02:22,930 --> 01:02:25,960 في الواقع إنه يستخدم سبعة سرًا. 1351 01:02:25,960 --> 01:02:28,210 إنه في الواقع يضع حرفًا خاصًا 1352 01:02:28,210 --> 01:02:33,510 لجميع الأصفار في وحدات البايت الأخيرة جدًا. 1353 01:02:33,510 --> 01:02:37,080 كل وحدة بايت تساوي ثمان وحدات بت، لذا فإنها تضع سرًا ثمان أصفار هنا، 1354 01:02:37,080 --> 01:02:40,980 أو يمكننا بالفعل رسم هذا بطريقة متعارف عليها أكثر كـ /0. 1355 01:02:40,980 --> 01:02:44,460 وهذا ما يسمى بالحرف الفارغ، ويعني تمامًا جميع الأصفار. 1356 01:02:44,460 --> 01:02:46,890 لذا فإن طول السلسلة، Zamyla، هو ستة، 1357 01:02:46,890 --> 01:02:50,550 لكن كم عدد وحدات البت التي تأخذها على ما يبدو، فقط للتوضيح؟ 1358 01:02:50,550 --> 01:02:52,030 إذًا في الواقع إنها تأخذ سبعة. 1359 01:02:52,030 --> 01:02:54,360 وهذا نوع من تفاصيل التنفيذ السرية 1360 01:02:54,360 --> 01:02:57,360 الذي لانهتم حقًا بأمره، لكن في النهاية، سنفعل ذلك، 1361 01:02:57,360 --> 01:02:59,250 لأن إذا أردنا تنفيذ دالة معينة، 1362 01:02:59,250 --> 01:03:01,390 فسنكون بحاجة إلى معرفة ما الذي يحدث في الواقع. 1363 01:03:01,390 --> 01:03:03,260 لذا فعلى سبيل المثال، اسمحوا لي بالمضي قدمًا والقيام بذلك. 1364 01:03:03,260 --> 01:03:07,200 اسمحوا لي بالمضي قدمًا وإنشاء برنامج يسمى strlen نفسه. 1365 01:03:07,200 --> 01:03:10,440 إذًا هذه ليست دالة لكنه برنامج يسمى strlen.c. 1366 01:03:10,440 --> 01:03:13,420 اسمحوا لي بالمضي قدمًا وتضمين مكتبة CS50 في الجزء العلوي. 1367 01:03:13,420 --> 01:03:15,780 اسمحوا لي بالمضي قدمًا وتضمين stdio.h. 1368 01:03:15,780 --> 01:03:20,160 اسمحوا لي بالمضي قدمًا وكتابة main void، كل هذا متماثل كما هو الحال دائمًا. 1369 01:03:20,160 --> 01:03:24,480 اسمحوا لي بالمضي قدمًا وحث المستخدم، لنقل، لاسمه أو اسمها، 1370 01:03:24,480 --> 01:03:25,620 مثل ذلك. 1371 01:03:25,620 --> 01:03:26,580 ثم أتعلمون ماذا؟ 1372 01:03:26,580 --> 01:03:28,530 اسمحوا لي بالفعل، هذه المرة، عدم طباعة أسمائهم فقط، 1373 01:03:28,530 --> 01:03:29,980 لأننا قمنا بهذه الوسيطة. 1374 01:03:29,980 --> 01:03:32,930 دعونا فقط نعد عدد الأحرف في اسمه أو اسمها. 1375 01:03:32,930 --> 01:03:33,930 إذًا كيف يمكننا فعل ذلك؟ 1376 01:03:33,930 --> 01:03:40,110 حسنًا، يمكننا فقط القيام بهذا-- int n get strlen من s، ثم نقول، 1377 01:03:40,110 --> 01:03:45,010 printf "The length of your name is %i." 1378 01:03:45,010 --> 01:03:48,120 ومن ثم يمكننا إدخال n، لأن هذا هو 1379 01:03:48,120 --> 01:03:49,860 الرقم الذي قمنا بتخزين الطول فيه. 1380 01:03:49,860 --> 01:03:52,560 لكن لاستخدام strlen، يجب أن أضمن أي ملف رأس؟ 1381 01:03:52,560 --> 01:03:56,410 String.h، وهي سلسلة جديدة، لذا string.h. 1382 01:03:56,410 --> 01:04:02,940 والآن إذا طبعت هذا بشكل صحيح، make strlen، make strlen، جيد. 1383 01:04:02,940 --> 01:04:05,280 ./strlen-- دعونا نجربها-- 1384 01:04:05,280 --> 01:04:06,130 Zamyla. 1385 01:04:06,130 --> 01:04:06,990 Enter. 1386 01:04:06,990 --> 01:04:08,760 حسنًا، طول الاسم هو ستة. 1387 01:04:08,760 --> 01:04:10,340 لكن ماذا يفعل strlen؟ 1388 01:04:10,340 --> 01:04:13,140 حسنًا، strlen هو فقط تجريد لنا، قام شخص آخر بكتابته، 1389 01:04:13,140 --> 01:04:16,530 وهو متعارف عليه بشكل رائع، لكن تعلمون، لا حاجة لنا به أبدًا. 1390 01:04:16,530 --> 01:04:18,250 يمكنني القيام بهذا بنفسي. 1391 01:04:18,250 --> 01:04:20,880 إذا فهمت ما الذي يقوم به الكمبيوتر، 1392 01:04:20,880 --> 01:04:24,040 فيمكنني تنفيذ هذه الوظيفة نفسها بنفسي كما يلي. 1393 01:04:24,040 --> 01:04:26,880 يمكنني الإعلان عن متغير يسمى n وأهيئه إلى 0، 1394 01:04:26,880 --> 01:04:27,840 ثم أتعلمون ماذا؟ 1395 01:04:27,840 --> 01:04:29,250 سأمضي قدمًا وأفعل هذا. 1396 01:04:29,250 --> 01:04:36,490 في حين أن s قوس n لا يساوي جميع الأصفار، 1397 01:04:36,490 --> 01:04:38,160 لكنك لا تكتب جميع الأصفار مثل هذا. 1398 01:04:38,160 --> 01:04:39,630 أنت تفعل ذلك حرفيًا-- 1399 01:04:39,630 --> 01:04:42,750 أن /0 والتي أشرت إليها سابقًا في علامات الاقتباس المفردة. 1400 01:04:42,750 --> 01:04:45,390 وهذا يعني تمامًا جميع الأصفار في وحدات البايت. 1401 01:04:45,390 --> 01:04:47,990 والآن يمكنني المضي قدمًا وكتابة n++. 1402 01:04:47,990 --> 01:04:49,950 إذا كنت على دراية بما يعنيه هذا، تذكروا، 1403 01:04:49,950 --> 01:04:54,390 أن هذا هو مجرد n يساوي n زائد 1،لكن إنه موجز قليلاً لقول، 1404 01:04:54,390 --> 01:04:55,710 n++. 1405 01:04:55,710 --> 01:04:57,750 ثم يمكنني طباعة اسم n الخاص بك-- 1406 01:04:57,750 --> 01:04:59,250 اسم n الخاص بك-- 1407 01:04:59,250 --> 01:05:03,930 اسم-- طول اسمك هو %i، داخل في n. 1408 01:05:03,930 --> 01:05:05,040 إذًا لماذا يعمل هذا؟ 1409 01:05:05,040 --> 01:05:07,200 إنه يبدو غريب قليلاً، لكن هذا فقط 1410 01:05:07,200 --> 01:05:09,330 يدل على فهم ما يحدث 1411 01:05:09,330 --> 01:05:10,690 أسفل الغطاء المشهور. 1412 01:05:10,690 --> 01:05:14,640 إذا تمت تهيئة n لصفر، ونظرت إلى s قوس n، 1413 01:05:14,640 --> 01:05:16,470 حسنًا، فهذا يشبه النظر إلى s قوس 0. 1414 01:05:16,470 --> 01:05:21,160 وإذا كانت السلسلة، s، هي Zamyla، فما هو s قوس 0؟ 1415 01:05:21,160 --> 01:05:24,250 Z. وهي بعد ذلك لا تساوي /0. 1416 01:05:24,250 --> 01:05:25,780 إنها تساوي z، بالتأكيد. 1417 01:05:25,780 --> 01:05:26,710 إذًا نحن نقوم بزيادة n. 1418 01:05:26,710 --> 01:05:28,300 إذًا الآن n تساوي 1. 1419 01:05:28,300 --> 01:05:29,150 الآن n تساوي 1. 1420 01:05:29,150 --> 01:05:32,340 إذًا ما هو s قوس 1 في اسم Zamyla؟ 1421 01:05:32,340 --> 01:05:38,140 A وهكذا، ونحصل على Z-A-M-Y-L-A، ثم جميع الأصفار، 1422 01:05:38,140 --> 01:05:41,590 التي تسمى بالحرف الفارغ، أو /0. 1423 01:05:41,590 --> 01:05:44,980 هذا، بالطبع، يساوي /0، لذا يتوقف التكرار الحلقي، 1424 01:05:44,980 --> 01:05:49,090 تاركًا العدد الإجمالي أو قيمة n كما كانت عليه، 1425 01:05:49,090 --> 01:05:51,100 والذي كان 6. 1426 01:05:51,100 --> 01:05:52,210 إذًا هذا هو الأمر. 1427 01:05:52,210 --> 01:05:54,070 مثل جميع ما هو غير ظاهر، كل ما لدينا 1428 01:05:54,070 --> 01:05:57,350 هو ذاكرة موضوعة مثل هذا، من الأعلى للأسفل، اليسار لليمين 1429 01:05:57,350 --> 01:06:00,100 ومع ذلك كل وظيفتها التي تم استخدامها لمدة أسبوع من الآن 1430 01:06:00,100 --> 01:06:03,850 فصاعدًا يتلخص في بعض البدائيات البسيطة نسبيًا، 1431 01:06:03,850 --> 01:06:05,650 وإذا فهمت هذه البدائيات، فيمكنك 1432 01:06:05,650 --> 01:06:08,860 القيام بأي شيء تريده باستخدام الكمبيوتر بكل من الطريقة الحسابية 1433 01:06:08,860 --> 01:06:11,350 وفيما يتعلق بالتعليمات البرمجية، وأيضًا فيما يتعلق بالذاكرة. 1434 01:06:11,350 --> 01:06:14,830 يمكننا بالفعل رؤية، في الواقع، بعض الأشياء التي نظرنا إليها في الإسبوعين الماضيين 1435 01:06:14,830 --> 01:06:15,440 كما يلي. 1436 01:06:15,440 --> 01:06:18,520 اسمحوا لي بالمضي قدمًا وفتح مثال يسمى ASCII 0. 1437 01:06:18,520 --> 01:06:22,090 تذكروا أن ASCII يقوم بالربط بين الأحرف والأرقام في الكمبيوتر. 1438 01:06:22,090 --> 01:06:23,890 ولاحظوا ما الذي سيفعله هذا البرنامج. 1439 01:06:23,890 --> 01:06:26,050 Make-- دعوني أفتح هذا المجلد. 1440 01:06:26,050 --> 01:06:30,250 Make ascii0، ./ascii0، Enter. 1441 01:06:30,250 --> 01:06:34,660 يجب أن تكون السلسلة، دعونا نقول، Zamyla، Enter. 1442 01:06:34,660 --> 01:06:38,320 حسنًا، اتضح أنك إذا كنت تبحث عن 1443 01:06:38,320 --> 01:06:45,700 رمز ASCII لاسم Zamyla، سيكون z هو 90، والحرف الصغير a هو 97، وm هو 109، 1444 01:06:45,700 --> 01:06:46,610 وهكذا. 1445 01:06:46,610 --> 01:06:47,950 توجد تلك الأحرف وفي الواقع، يمكننا 1446 01:06:47,950 --> 01:06:49,610 لعب اللعبة نفسها التي قمنا بها الأسبوع الماضي. 1447 01:06:49,610 --> 01:06:53,920 إذا قمت بذلك مجددًا على "hi،" فيوجد 72 الخاص بك، ويوجد 73 الخاص بك. 1448 01:06:53,920 --> 01:06:55,170 من أين يأتي هذا؟ 1449 01:06:55,170 --> 01:06:57,630 حسنًا، الآن أعرف كيفية معالجة السلاسل الفردية، 1450 01:06:57,630 --> 01:06:58,810 لاحظوا ما الذي يمكنني فعله. 1451 01:06:58,810 --> 01:07:01,690 يمكنني الحصول على سلسلة من المستخدم، تمامًا كما يمكننا دومًا. 1452 01:07:01,690 --> 01:07:05,020 يمكنني التكرار على طول تلك السلسلة، وإن كان بشكل غير فعال 1453 01:07:05,020 --> 01:07:06,650 باستخدام strlen هنا. 1454 01:07:06,650 --> 01:07:09,130 ثم لاحظوا هذه الميزة الجديدة اليوم. 1455 01:07:09,130 --> 01:07:14,830 يمكنني الآن تحويل نوع بيانات واحد إلى آخر، لأن char، 1456 01:07:14,830 --> 01:07:20,120 حرف هو فقط ثماني وحدات بت، ولكنه يقدم في سياق الأحرف. 1457 01:07:20,120 --> 01:07:24,300 كما أن وحدات البت هي فقط ثماني وحدات بت يمكنك معاملتها كعدد صحيح، رقم. 1458 01:07:24,300 --> 01:07:25,600 إنها حساسة للسياق تمامًا. 1459 01:07:25,600 --> 01:07:27,330 إذا قمت باستخدام برنامج Photoshop، فستكون رسمًا. 1460 01:07:27,330 --> 01:07:29,780 إذا قمت باستخدام برنامج نصي، فستكون رسالة وهكذا. 1461 01:07:29,780 --> 01:07:31,690 لذا يمكنك ترميز-- 1462 01:07:31,690 --> 01:07:33,310 تغيير السياق. 1463 01:07:33,310 --> 01:07:38,020 لذا لاحظوا هنا، s قوس i هي، بالطبع، حرف i-th من اسم Zamyla 1464 01:07:38,020 --> 01:07:40,570 لذا Z أو A أو M أو أيًا كان. 1465 01:07:40,570 --> 01:07:44,560 ولكن يمكنني تحويل حرف i إلى عدد صحيح بالقيام بما يسمى الصب. 1466 01:07:44,560 --> 01:07:47,320 يمكن حرفيًا، في ما بين الأقواس، تحديد نوع البيانات 1467 01:07:47,320 --> 01:07:50,020 التي ترغب في تحويل نوع بيانات واحد إليها، ثم 1468 01:07:50,020 --> 01:07:52,280 تخزينه في نوع البيانات هذا بالضبط. 1469 01:07:52,280 --> 01:07:54,520 لذا s قوس i-- حوله إلى رقم. 1470 01:07:54,520 --> 01:07:59,000 ثم خزنه في متغير رقم حقيقي، حتى يمكنني طباعة قيمته. 1471 01:07:59,000 --> 01:08:01,510 إذًا لغة c-- تعرض لي هذا الحرف. 1472 01:08:01,510 --> 01:08:06,890 تعرض لي الحرف كما هو متصل بالحرف، ومن ثم الحرف-- 1473 01:08:06,890 --> 01:08:09,730 عفوًا، الحرف والرقم الذي قمت للتو بتحويله إليه. 1474 01:08:09,730 --> 01:08:11,720 ولا يتوجب عليك فعليًا أن تكون صريحًا. 1475 01:08:11,720 --> 01:08:13,770 هذا ما يسمى بالصب الصريح. 1476 01:08:13,770 --> 01:08:17,260 فنيًا، يمكننا القيام بهذا بشكل ضمني، أيضًا. 1477 01:08:17,260 --> 01:08:19,420 ويعرف جهاز الكمبيوتر أن الأرقام هي أحرف، 1478 01:08:19,420 --> 01:08:20,680 والأحرف هي رقم. 1479 01:08:20,680 --> 01:08:22,520 لا يتوجب عليك أن تدقق كثيرًا وتقوم 1480 01:08:22,520 --> 01:08:24,130 بالصب الصريح في الأقواس. 1481 01:08:24,130 --> 01:08:27,550 يمكنك القيام به فقط باستخدام أنواع البيانات، وبصراحة في هذه النقطة، 1482 01:08:27,550 --> 01:08:29,100 أنا لا أحتاج إلى المتغير. 1483 01:08:29,100 --> 01:08:32,620 يمكنني التخلص منه، وهنا في الأسفل، يمكنني حرفيًا 1484 01:08:32,620 --> 01:08:36,310 طباعة الشيء نفسه مرتين، ولكن أخبر printf 1485 01:08:36,310 --> 01:08:39,310 أن يقوم بطباعة الأول في سياق حرف 1486 01:08:39,310 --> 01:08:43,120 والثاني في سياق عدد صحيح، فقط بالتعامل مع وحدات البت نفسها بالضبط 1487 01:08:43,120 --> 01:08:44,380 بشكل مختلف. 1488 01:08:44,380 --> 01:08:46,420 هذا هو الصب الضمني. 1489 01:08:46,420 --> 01:08:48,580 ويظهر فقط ما قمنا به في أسبوع 0 1490 01:08:48,580 --> 01:08:51,010 عندما زعمنا أن الأحرف هي أرقام، 1491 01:08:51,010 --> 01:08:54,970 والأرقام يمكن أن تكون ألوانًا، والألوان يمكن أن تكون صورًا، وهكذا. 1492 01:08:54,970 --> 01:08:55,770 هل هذا سؤال؟ 1493 01:08:55,770 --> 01:08:57,200 الجمهور: هل كانت ستكون مفيدة بالنسبة للائتمان. 1494 01:08:57,200 --> 01:08:57,600 ديفيد ج. مالان: أيضًا، نعم. 1495 01:08:57,600 --> 01:08:58,930 إن الأمر كله يعتمد على الائتمان. 1496 01:08:58,930 --> 01:08:59,520 نعم. 1497 01:08:59,520 --> 01:09:00,460 حقًا. 1498 01:09:00,460 --> 01:09:01,810 أي أسئلة أخرى؟ 1499 01:09:01,810 --> 01:09:02,470 لا. 1500 01:09:02,470 --> 01:09:06,100 حسنًا، إذًا ما الذي يمكننا القيام به في الواقع بهذا التقدير؟ 1501 01:09:06,100 --> 01:09:08,990 ميزة بسيطة جدًا نعتبرها جميعًا أمرًا مسلمًا به، 1502 01:09:08,990 --> 01:09:10,540 إذا كنا نستخدمها بعد هذه الأيام. 1503 01:09:10,540 --> 01:09:13,420 يمكن لـ Google Docs، وMicrosoft Word، وما يماثلهما 1504 01:09:13,420 --> 01:09:14,950 كتابة كلمات بأحرف كبيرة تلقائيًا لك هذه الأيام. 1505 01:09:14,950 --> 01:09:16,600 أعني أن هاتفك يمكنه القيام بذلك الآن. 1506 01:09:16,600 --> 01:09:18,430 إنها فقط عبارة عن نوع من التصحيح التلقائي لرسائلك. 1507 01:09:18,430 --> 01:09:20,080 حسنًا، كيف يعمل هذا فعليًا؟ 1508 01:09:20,080 --> 01:09:22,750 حسنًا، بمجرد أن تعرف أن السلسلة عبارة عن مجموعة من الأحرف فقط 1509 01:09:22,750 --> 01:09:26,410 متصلة على التوالي مع بعضها البعض، وتعرف أن هذه الأحرف لديها أرقام 1510 01:09:26,410 --> 01:09:32,210 تمثلها، ومثل الحرف الكبير A هو 65، والحرف الصغير A هو 97، بشكل واضح، 1511 01:09:32,210 --> 01:09:34,950 وهكذا، يمكننا الحصول على هذه الأنماط. 1512 01:09:34,950 --> 01:09:36,790 إذا مضيت قدمًا وفتحت المثال الآخر هذا 1513 01:09:36,790 --> 01:09:40,960 هنا المسمى بـ Capitalize 0، لاحظوا ما الذي سيقوم به هذا البرنامج 1514 01:09:40,960 --> 01:09:43,000 لي أولاً بتشغيله. 1515 01:09:43,000 --> 01:09:47,680 Make capitalize 0 ./capitalize0. 1516 01:09:47,680 --> 01:09:50,680 دعوني أمضي قدمًا وأكتب اسم Zamyla فقط كما فعلت من قبل، ولكن الآن 1517 01:09:50,680 --> 01:09:51,750 بجعل جميع الأحرف كبيرة. 1518 01:09:51,750 --> 01:09:52,930 لذا هذا زائد قليلاً. 1519 01:09:52,930 --> 01:09:55,220 آمل أن هاتفك لا يكتب كل حرف بالأحرف الكبيرة، 1520 01:09:55,220 --> 01:09:58,310 ولكن يمكنك تخيله يكتب الحرف الأول فقط، إذا رغبت في ذلك. 1521 01:09:58,310 --> 01:09:59,540 لذا كيف يتم هذا؟ 1522 01:09:59,540 --> 01:10:03,220 حسنًا، دعوني أمضي قدمًا وأفتح هذا المثال هنا. 1523 01:10:03,220 --> 01:10:04,930 وهذا ما قمنا به-- 1524 01:10:04,930 --> 01:10:08,490 هنا، أحصل على سلسلة من المستخدم، تمامًا كما نفعل دائمًا. 1525 01:10:08,490 --> 01:10:11,790 ثم فقط أقول، after، لتنسيق المخرج بشكل لطيف نوعًا ما. 1526 01:10:11,790 --> 01:10:15,840 هنا، أقوم بتكرار حلقي بكفاءة جيدة من i يعادل 0 إلى ما يصل 1527 01:10:15,840 --> 01:10:17,500 إلى طول السلسلة. 1528 01:10:17,500 --> 01:10:20,250 والآن لاحظوا تطبيق المنطق الأنيق هذا. 1529 01:10:20,250 --> 01:10:22,400 إنه مشفر قليلاً، للوهلة الأولى. 1530 01:10:22,400 --> 01:10:23,020 ولكن عفوًا. 1531 01:10:23,020 --> 01:10:23,770 والآن لقد اختفى. 1532 01:10:23,770 --> 01:10:27,580 وما الذي أقوم به بالضبط باستخدام سطور التعليمات البرمجية هذه؟ 1533 01:10:27,580 --> 01:10:31,080 حسنًا، بكل عملية تكرار لهذا التكرار الحلقي، سأطرح السؤال، 1534 01:10:31,080 --> 01:10:33,990 هل الحرف i من s، لذا الحرف الحالي، 1535 01:10:33,990 --> 01:10:37,830 أكبر من أو يعادل الحرف الصغير A، وأقل من 1536 01:10:37,830 --> 01:10:39,480 أو يعادل الحرف الصغير Z؟ 1537 01:10:39,480 --> 01:10:42,960 وبعبارة أخرى، كيف يمكنك قول ذلك بتعبير عامي أكثر باللغة الإنجليزية؟ 1538 01:10:42,960 --> 01:10:44,340 هل هو حرف صغير، حرفيًا. 1539 01:10:44,340 --> 01:10:47,640 ولكن هذه هي الطريقة الأكثر برمجية للتعبير، هل هو حرف صغير؟ 1540 01:10:47,640 --> 01:10:49,680 حسنًا، إذا كان كذلك، فلتمضي قدمًا وتقوم بذلك. 1541 01:10:49,680 --> 01:10:53,460 الآن هذا غريب قليلاً، ولكن اطبع حرفًا، على وجه التحديد، 1542 01:10:53,460 --> 01:10:58,560 الحرف i، ولكن اطرح من ذلك الحرف الصغير حرفًا أيًا كان 1543 01:10:58,560 --> 01:11:05,230 الاختلاف بين الحرف الصغير A والحرف الكبير A. الآن من أين أتى ذلك؟ 1544 01:11:05,230 --> 01:11:06,120 إذًا يتضح أن-- 1545 01:11:06,120 --> 01:11:08,730 حسنًا، الحرف الكبير A هو 65. 1546 01:11:08,730 --> 01:11:10,870 الحرف الصغير A هو 97. 1547 01:11:10,870 --> 01:11:13,270 لذا الفرق بين هذين الحرفين هو 32. 1548 01:11:13,270 --> 01:11:18,180 وهذا صحيح لـ B، لذا الحرف الكبير B هو 66، والحرف الصغير B هو 98. 1549 01:11:18,180 --> 01:11:20,590 وما زال 32، ويتكرر للأحرف الأبجدية بأكملها. 1550 01:11:20,590 --> 01:11:22,890 لذا يمكنني فقط القيام بهذا. 1551 01:11:22,890 --> 01:11:27,900 إذا علمت أن الأحرف الصغيرة لديها أرقام كبيرة، مثل 97، 98، 1552 01:11:27,900 --> 01:11:32,010 وأعرف أن الأرقام الصغيرة لديها أحرف صغيرة، مثل 65، 66، 1553 01:11:32,010 --> 01:11:35,450 يمكنني فقط حرفيًا طرح 32 من الأحرف الصغيرة الخاصة بي. 1554 01:11:35,450 --> 01:11:37,200 كما أشرتم، إنه حرف صغير. 1555 01:11:37,200 --> 01:11:40,910 اطرح 32، ويعطينا هذا أي نتيجة؟ 1556 01:11:40,910 --> 01:11:42,170 الإصدار المكتوب بأحرف كبيرة. 1557 01:11:42,170 --> 01:11:43,740 إنها تقوم بتكبير الأشياء من أجلنا. 1558 01:11:43,740 --> 01:11:46,550 ولكن بصراحة، إن هذا يبدو نوعًا من الاختراق، مثل، حسنًا، نعم، 1559 01:11:46,550 --> 01:11:48,510 يمكنني القيام بعملية حسابية بشكل صحيح، ولكن أتعرفون؟ 1560 01:11:48,510 --> 01:11:50,630 إنها ممارسة أفضل، بشكل عام، للطرح بهذه الطريقة. 1561 01:11:50,630 --> 01:11:53,090 لا تدخلوا في تعقيدات حساب عدد الأحرف التي تفصلهم 1562 01:11:53,090 --> 01:11:53,840 عن بعضها البعض. 1563 01:11:53,840 --> 01:11:55,730 الحساب أمر سهل وبسيط على جهاز الكمبيوتر. 1564 01:11:55,730 --> 01:11:58,460 فلتدعه يقوم بالعملية الحسابية لأجلك من خلال طرح قيمة الحرف الكبير A، 1565 01:11:58,460 --> 01:12:04,370 أيًا كانت من قيمة الحرف الصغير A. أو يمكننا فقط كتابة 32. 1566 01:12:04,370 --> 01:12:07,370 وإلا أمضي قدمًا وقم فقط بطباعة الحرف الذي لم يتغير. 1567 01:12:07,370 --> 01:12:11,030 لذا في هذه الحالة، تم تكبير الأحرف A-M-Y-L-A في اسم Zamyla، 1568 01:12:11,030 --> 01:12:13,930 وكل شيء آخر، وتم ترك الحرف Z بمفرده، 1569 01:12:13,930 --> 01:12:18,490 فقط من خلال فهم ما الذي يجري باستخدام الكيفية التي يتم تقديم جهاز الكمبيوتر بها. 1570 01:12:18,490 --> 01:12:21,110 ولكن بصراحة، لا أريد أن أستمر في كتابة تعليمة برمجية كهذه. 1571 01:12:21,110 --> 01:12:22,530 مثل، لن أحصل على هذا أبدًا. 1572 01:12:22,530 --> 01:12:23,960 أنا جديد في عالم البرمجة، من المحتمل. 1573 01:12:23,960 --> 01:12:26,990 لن أحصل أبدًا على هذا النوع من التسلسل لجميع الرموز المشفرة 1574 01:12:26,990 --> 01:12:30,230 معًا، وهذا جيد، لأنه يمكننا تنفيذ هذا البرنامج نفسه 1575 01:12:30,230 --> 01:12:32,960 بشكل أكثر سهولة قليلاً، بفضل الدوال 1576 01:12:32,960 --> 01:12:35,390 وعمليات التجريد التي كتبها الآخرون من أجلنا. 1577 01:12:35,390 --> 01:12:38,960 لذا في هذا البرنامج، اتضح أنه يمكنني تبسيط 1578 01:12:38,960 --> 01:12:43,880 الأسئلة التي سأطرحها من خلال حرفيًا طلب دالة تقول، أقل من. 1579 01:12:43,880 --> 01:12:45,590 وتوجد دالة أخرى تسمى، is upper، 1580 01:12:45,590 --> 01:12:48,130 وتوجد مجموعة أخرى والتي تسمى حرفيًا، 1581 01:12:48,130 --> 01:12:49,280 بشيء آخر أو غير ذلك. 1582 01:12:49,280 --> 01:12:53,300 لذا is lower تأخذ وسيطة مثل الحرف i من s، 1583 01:12:53,300 --> 01:12:55,760 ولا ترجع شيئًا-- صحيح أو خاطئ فقط. 1584 01:12:55,760 --> 01:12:57,110 كيف يتم تنفيذ ذلك؟ 1585 01:12:57,110 --> 01:13:00,530 حسنًا، وبصراحة، إذا نظرنا في التعليمة البرمجية التي كتبها شخص آخر منذ عقود 1586 01:13:00,530 --> 01:13:03,680 لـ is upper، فالاحتمالات هي-- أو is lower-- 1587 01:13:03,680 --> 01:13:07,250 الاحتمالات هي أنه كتب أو أنها كتبت تعليمة برمجية تشبه هذه كثيرًا. 1588 01:13:07,250 --> 01:13:10,050 ولكننا لسنا بحاجة إلى القلق من هذا المستوى من التفاصيل. 1589 01:13:10,050 --> 01:13:12,590 يمكننا استخدام دالته أو دالتها فقط، ولكن كيف يمكننا القيام بذلك؟ 1590 01:13:12,590 --> 01:13:15,050 اتضح أن هذه الدالة-- ويمكنك معرفة هذا فقط 1591 01:13:15,050 --> 01:13:17,380 عن طريق إخبارك أو البحث عنه في Google أو قراءة مرجع-- 1592 01:13:17,380 --> 01:13:20,630 موجودة في مكتبة باسم ctype.h. 1593 01:13:20,630 --> 01:13:25,090 وتحتاج إلى ملف الرأس المسمى ctype.h لكي تستخدمه. 1594 01:13:25,090 --> 01:13:27,800 وسنقوم دائمًا تقريبًا بتوجيهك إلى مراجع ووثائق 1595 01:13:27,800 --> 01:13:29,470 لتوضيح ذلك لك. 1596 01:13:29,470 --> 01:13:31,780 To upper هي ميزة أخرى، أليس كذلك؟ 1597 01:13:31,780 --> 01:13:33,050 هذه الحسابات-- مثل، يا إلهي. 1598 01:13:33,050 --> 01:13:34,070 أريد فقط كتابة حرف كبير. 1599 01:13:34,070 --> 01:13:36,830 أنا لا أريد أن أستمر في التفكير حقًا حول إلى أي مدى الفرق بين الأحرف الكبيرة 1600 01:13:36,830 --> 01:13:37,880 والأحرف الصغيرة. 1601 01:13:37,880 --> 01:13:39,980 اتضح أن في مكتبة من النوع C، توجد 1602 01:13:39,980 --> 01:13:43,280 دالة أخرى تسمى toupper والتي تقوم حرفيًا بالشيء نفسه بالضبط 1603 01:13:43,280 --> 01:13:45,350 في البرنامج السابق الذي كتبناه. 1604 01:13:45,350 --> 01:13:47,810 ولذا هذا، أيضًا، جيد. 1605 01:13:47,810 --> 01:13:48,560 ولكن أتدرون ماذا؟ 1606 01:13:48,560 --> 01:13:50,870 يبدو هذا أكثر إطنابًا قليلاً. 1607 01:13:50,870 --> 01:13:53,510 سيكون من الجيد إذا تمكنت حقًا من ربط هذا البرنامج. 1608 01:13:53,510 --> 01:13:55,670 لذا كيف تعمل toupper هذه؟ 1609 01:13:55,670 --> 01:13:58,790 حسنًا، يتضح أن البعض منكم أصبح على دراية بمرجع CS50 1610 01:13:58,790 --> 01:14:00,890 على الإنترنت، تطبيقنا القائم على الويب والذي لدينا 1611 01:14:00,890 --> 01:14:03,200 لمساعدتكم في التنقل بين الوظائف المتاحة في C. 1612 01:14:03,200 --> 01:14:06,050 يتضح أن جميع البيانات لذلك التطبيق 1613 01:14:06,050 --> 01:14:09,830 تأتي من برنامج سطر أوامر قديم يأتي في Linux 1614 01:14:09,830 --> 01:14:12,590 ويأتي في أداة تحديد الوصول التي تسمى Man لدليل. 1615 01:14:12,590 --> 01:14:16,070 وفي أي وقت تكتب فيه "man" في محث الأوامر، ومن ثم اسم 1616 01:14:16,070 --> 01:14:18,600 دالة أنت مهتم بها، إذا وجدت، 1617 01:14:18,600 --> 01:14:20,480 ستخبرك شيئًا بسيطًا حيال ذلك. 1618 01:14:20,480 --> 01:14:27,080 لذا إذا انتقلت إلى toupper ،man toupper سأحصل على وثائق مشفرة قليلاً 1619 01:14:27,080 --> 01:14:27,860 هنا. 1620 01:14:27,860 --> 01:14:30,260 ولكن لاحظوا أن toupper وبعض الدوال الأخرى 1621 01:14:30,260 --> 01:14:31,940 تحول حرف صغير أو حرف كبير. 1622 01:14:31,940 --> 01:14:33,410 هذا هو الملخص. 1623 01:14:33,410 --> 01:14:36,600 لاحظوا أنه في الملخص الموجز، صفحة man، إذا جاز التعبير، 1624 01:14:36,600 --> 01:14:39,560 تخبرني أي ملف رأس يتوجب عليّ تضمينه. 1625 01:14:39,560 --> 01:14:41,810 لاحظوا أنه أسفل الملخص الموجز، تخبرني أيضًا 1626 01:14:41,810 --> 01:14:44,970 بأي توقيع أو نموذج أولي للدالة. 1627 01:14:44,970 --> 01:14:48,050 وبعبارة أخرى، الوثائق في Man، دليل المبرمجين من Linux، 1628 01:14:48,050 --> 01:14:48,850 موجزة للغاية. 1629 01:14:48,850 --> 01:14:51,650 لذا فهي لن تحتفظ بيدك في تنسيق الأبيض والأسود هذا. 1630 01:14:51,650 --> 01:14:54,020 إنها فقط ستقوم بتحويلك، حسنًا، بشكل ضمني، 1631 01:14:54,020 --> 01:14:55,830 إلى الأفضل بوضع هذا في أعلى ملفك. 1632 01:14:55,830 --> 01:14:57,870 وبالمناسبة، هذه هي كيفية استخدامك للدالة. 1633 01:14:57,870 --> 01:15:03,810 إنها تأخذ وسيطة تسمى C، وتعيد قيمة من النوع int. 1634 01:15:03,810 --> 01:15:06,120 لماذا هذا int؟ 1635 01:15:06,120 --> 01:15:07,330 دعونا لا نلقي بالاً لهذا. 1636 01:15:07,330 --> 01:15:10,550 إنها تعيد حرفًا لأغراضنا اليوم. 1637 01:15:10,550 --> 01:15:12,980 وإذا انتقلنا إلى الأسفل، حسنًا، وصف. 1638 01:15:12,980 --> 01:15:16,400 آه، أنا حقًا لا أريد قراءة كل هذا، ولكن حسنًا، ها نحن ذا. 1639 01:15:16,400 --> 01:15:21,010 إذا كان c حرفًا صغيرًا، فتعيد toupper مكافئًا كبيرًا له، 1640 01:15:21,010 --> 01:15:23,510 إذا وجد تمثيل حرف كبير في الإعدادات المحلية الحالية. 1641 01:15:23,510 --> 01:15:26,300 فهذا يعني فقط إذا كان ترقيمًا، أنه لن يقوم بأي شيء. 1642 01:15:26,300 --> 01:15:29,900 وإلا فسيعيد C، وهذا نوع من التفاصيل الرئيسية. 1643 01:15:29,900 --> 01:15:33,770 إذا قمت بتمرير الحرف الصغير a إليه، فسيقدم لي الحرف الكبير A، 1644 01:15:33,770 --> 01:15:36,650 ولكن إذا قمت بتمرير الحرف الكبير A، فما الذي سيقدمه لي؟ 1645 01:15:36,650 --> 01:15:37,480 الجمهور: الحرف الكبير A. 1646 01:15:37,480 --> 01:15:40,390 ديفيد ج. مالان: أيضًا، الحرف الكبير A. تعيد الحرف الأصلي، c. 1647 01:15:40,390 --> 01:15:42,200 هذا هو التفصيل الوحيد الذي أهتم به. 1648 01:15:42,200 --> 01:15:43,930 في حالة الشك، اقرأ الدليل. 1649 01:15:43,930 --> 01:15:45,680 وقد يكون مشفرًا قليلاً، وهذا 1650 01:15:45,680 --> 01:15:48,320 هو السبب وراء أخذ مرجع CS50 وثائق مشفرة إلى حد ما 1651 01:15:48,320 --> 01:15:50,860 ومحاولته تبسيطها في مصطلحات ملائمة أكثر للإنسان. 1652 01:15:50,860 --> 01:15:53,490 ولكن في نهاية اليوم، هذه هي الإجابات الموثوقة. 1653 01:15:53,490 --> 01:15:55,820 وإذا كنت لا أعرف أنا أو أحد العاملين، فنحن حرفيًا 1654 01:15:55,820 --> 01:15:59,450 نسحب صفحة Man أو مرجع CS50 للإجابة على هذه الأنواع من الأسئلة. 1655 01:15:59,450 --> 01:16:01,070 الآن ما هو الأثر؟ 1656 01:16:01,070 --> 01:16:02,660 لا أحتاج أيًا من هذه. 1657 01:16:02,660 --> 01:16:06,560 يمكنني حرفيًا التخلص من الشرط وأسمح فقط 1658 01:16:06,560 --> 01:16:10,790 لـ toupper القيام بكل العمل الشاق، والآن برنامجي 1659 01:16:10,790 --> 01:16:13,880 أصبح مضغوطًا أكثر مما كانت عليه الإصدارات السابقة 1660 01:16:13,880 --> 01:16:15,380 لأنني قرأت الوثائق. 1661 01:16:15,380 --> 01:16:18,860 أنا اعرف ما الذي تقوم به الدالة، ويمكنني السماح لـ toupper بتكبير شيء 1662 01:16:18,860 --> 01:16:21,000 أو تمريره فقط بدون تغيير. 1663 01:16:21,000 --> 01:16:23,840 يمكننا التصميم بشكل أفضل، لأننا كتبنا بعض سطور التعليمات البرمجية 1664 01:16:23,840 --> 01:16:29,600 الواضحة تمامًا، ولذا يمكننا الآن ربط الأشياء. 1665 01:16:29,600 --> 01:16:33,690 أي أسئلة حول هذا النهج المعين؟ 1666 01:16:33,690 --> 01:16:34,190 حسنًا. 1667 01:16:34,190 --> 01:16:35,520 لذا نحصل على مستوى منخفض جدًا. 1668 01:16:35,520 --> 01:16:38,510 الآن دعونا نجعل هذه الأشياء مفيدة أكثر، لأنه وبشكل واضح، قام أشخاص آخرون 1669 01:16:38,510 --> 01:16:40,250 بحل بعض المشكلات هذه لأجلنا، 1670 01:16:40,250 --> 01:16:44,180 من خلال وجود هذه الدوال والمكتبة من النوع C ومكتبة السلسلة. 1671 01:16:44,180 --> 01:16:45,360 ما الذي يوجد هناك أكثر؟ 1672 01:16:45,360 --> 01:16:49,910 حسنًا، تذكروا ذلك كل مرة نقوم فيها بتشغيل Clang، أو حتى نقوم بتشغيل make، 1673 01:16:49,910 --> 01:16:52,400 نكتب كلمات متعددة في محث الأوامر. 1674 01:16:52,400 --> 01:16:56,030 أنت تكتب make hello أو make Mario، كلمة ثانية، 1675 01:16:56,030 --> 01:16:59,240 أو تكتب clang-o، hello، hello.c، 1676 01:16:59,240 --> 01:17:01,700 العديد من الكلمات في المحث. 1677 01:17:01,700 --> 01:17:04,430 حسنًا، يتضح أن طوال هذا الوقت، أنت تستخدم، حقًا، 1678 01:17:04,430 --> 01:17:05,630 وسيطات سطر الأوامر. 1679 01:17:05,630 --> 01:17:10,340 ولكن في C، يمكنك كتابة برامج تقبل أيضًا كلمات وأرقام عندما 1680 01:17:10,340 --> 01:17:11,890 يشغّل المستخدم البرنامج. 1681 01:17:11,890 --> 01:17:12,810 فكر مجددًا، بعد كل هذا. 1682 01:17:12,810 --> 01:17:15,610 عندما قمت بتشغيل Mario، فأنت قمت بـ ./mario، Enter. 1683 01:17:15,610 --> 01:17:17,570 لم يمكنك كتابة أي كلمات أكثر في المحث. 1684 01:17:17,570 --> 01:17:20,360 عندما قمت بالائتمان، فأنت قمت بـ ./credit، Enter. 1685 01:17:20,360 --> 01:17:21,530 لا توجد كلمات أخرى في المحث. 1686 01:17:21,530 --> 01:17:24,830 لقد استخدمت get string أو get more input، ولكن ليس 1687 01:17:24,830 --> 01:17:26,100 في سطر الأوامر. 1688 01:17:26,100 --> 01:17:29,720 ويتضح أنه يمكننا، ببساطة نسبيًا، في C، 1689 01:17:29,720 --> 01:17:31,940 ولكن هذا مشفر قليلاً للوهلة الأولى. 1690 01:17:31,940 --> 01:17:33,980 دعوني أمضي قدمًا-- 1691 01:17:33,980 --> 01:17:41,370 دعوني أمضي قدمًا، هنا، وأسحب هذا التوقيع هنا، والذي يشبه هذا. 1692 01:17:41,370 --> 01:17:45,450 هذه هي الدالة التي قمنا باستخدامها جميعًا حتى الآن لكتابة دالة رئيسية. 1693 01:17:45,450 --> 01:17:47,070 وحتى الآن، لقد قلنا void. 1694 01:17:47,070 --> 01:17:50,110 ولا يأخذ Main أي مخرج، وحقًا إنها فقط تقوم بالتشغيل. 1695 01:17:50,110 --> 01:17:54,150 ولكن يتضح أنه إذا قمت بتغيير برامجك الموجودة أو برامجك المستقبلية، 1696 01:17:54,150 --> 01:17:58,110 ليس بقول void، ولكن بقول int argc، string argv، 1697 01:17:58,110 --> 01:18:00,030 إنه مشفر قليلاً للوهلة الأولى. 1698 01:18:00,030 --> 01:18:04,350 ولكن ما هو الرمز الذي يمكن التعرف عليه الآن؟ 1699 01:18:04,350 --> 01:18:05,780 نعم، توجد أقواس هنا. 1700 01:18:05,780 --> 01:18:08,530 لذا يتضح أن كل مرة تكتب فيها برنامجًا، 1701 01:18:08,530 --> 01:18:11,680 إذا لم تقل void فقط، فأنت تمكّن هذه الميزة في الواقع 1702 01:18:11,680 --> 01:18:13,690 من خلال كتابة int argc، string argv. 1703 01:18:13,690 --> 01:18:15,790 يمكنك إخبار Clang، أتعرفون ماذا؟ 1704 01:18:15,790 --> 01:18:20,350 أريد هذا البرنامج أن يقبل كلمة واحدة أو أكثر أو رقمًا واحدًا أو أكثر بعد اسم 1705 01:18:20,350 --> 01:18:23,950 البرنامج، إذًا يمكنني القيام بـ ./hellodavid، أو ./hellozamyla. 1706 01:18:23,950 --> 01:18:27,940 لا أحتاج إلى انتظار البرنامج ليتم تشغيله لاستخدام سلسلة. 1707 01:18:27,940 --> 01:18:34,000 ومثلما هو الحال في المثال السابق، حيث كان يمكنك رسم مصفوفة، 1708 01:18:34,000 --> 01:18:38,170 يتم تحديد main بأخذ مصفوفة، تسمى argv لأسباب تاريخية-- 1709 01:18:38,170 --> 01:18:39,070 وسيطة vector. 1710 01:18:39,070 --> 01:18:40,630 Vector يعني مصفوفة. 1711 01:18:40,630 --> 01:18:43,510 تعني وسيطة vector، قوس، قوس مغلق فقط هذا هو-- 1712 01:18:43,510 --> 01:18:46,900 يحتوي هذا على كلمة واحدة أو أكثر، كل منها سلسلة. 1713 01:18:46,900 --> 01:18:49,600 Argc هو عدد الوسيطات، لذا هذا هو المتغير 1714 01:18:49,600 --> 01:18:52,240 حيث يصل main إلى ذلك ليخبره عن عدد الوسيطات، 1715 01:18:52,240 --> 01:18:55,410 عدد السلاسل الموجود بالفعل في argv. 1716 01:18:55,410 --> 01:18:58,420 لذا كيف يمكننا استخدام هذا بطريقة مفيدة؟ 1717 01:18:58,420 --> 01:19:01,780 حسنًا، دعوني أمضي قدمًا وأفتح أداة تحديد الوصول. 1718 01:19:01,780 --> 01:19:06,960 ودعوني أمضي قدمًا وأقوم بإنشاء ملف جديد باسم، لنقل، argv0، argv0.c-- 1719 01:19:06,960 --> 01:19:10,590 مجددًا، وسيطة vector، فقط قائمة أو مصفوفة من الوسيطات. 1720 01:19:10,590 --> 01:19:19,210 ودعوني أمضي قدمًا، وكما هو معتاد، include cs50.h، include stdio.h، 1721 01:19:19,210 --> 01:19:26,110 ومن ثم int main ليس void، ولكن int argc، string argv-- 1722 01:19:26,110 --> 01:19:28,810 argv-- فتح قوس، قوس مغلق. 1723 01:19:28,810 --> 01:19:31,690 وحتى إذا لم يظهر بشكل عادي في البداية، فستصبح هكذا في النهاية. 1724 01:19:31,690 --> 01:19:32,730 سأقوم بفعل ذلك. 1725 01:19:32,730 --> 01:19:39,040 إذا كان عدد الوسيطات التي تم تمريرها يساوي 2، 1726 01:19:39,040 --> 01:19:45,490 ثم أقوم بالمضي قدمًا وأفعل هذا-- printf، مرحبًا %s، فاصلة، 1727 01:19:45,490 --> 01:19:47,740 وهنا من قبل، قمت بكتابة اسم متغير. 1728 01:19:47,740 --> 01:19:49,840 ويمكنني الآن الوصول إلى متغير. 1729 01:19:49,840 --> 01:19:52,360 أمضي قدمًا وأكتب argv قوس 1. 1730 01:19:52,360 --> 01:19:56,200 Else، إذا لم يقم المستخدم بكتابة، على ما يبدو كلمتين، 1731 01:19:56,200 --> 01:20:00,920 دعوني أمضي قدمًا وفقط بشكل افتراضي، أقول، hello world، كما نفعل دائمًا. 1732 01:20:00,920 --> 01:20:03,850 الآن لماذا-- ما الذي يقوم به هذا، وكيف يقوم بذلك؟ 1733 01:20:03,850 --> 01:20:04,980 حسنًا، فلنشغله بسرعة. 1734 01:20:04,980 --> 01:20:07,660 لذا make-- أوه. 1735 01:20:07,660 --> 01:20:15,100 Make argv0, ./argv0, Enter, Hello World. 1736 01:20:15,100 --> 01:20:17,330 ولكن إذا كتبت Hello-- 1737 01:20:17,330 --> 01:20:19,840 أو نقطة-- سيكون اسم البرنامج بشكل أفضل 1738 01:20:19,840 --> 01:20:23,560 إذا أطلقنا عليه Hello، ولكن Zamyla، Enter. 1739 01:20:23,560 --> 01:20:24,190 Hello Zamyla. 1740 01:20:24,190 --> 01:20:26,560 إذا قمت بتغييره إلى ديفيد، الآن يمكنني الوصول إلى ديفيد. 1741 01:20:26,560 --> 01:20:29,020 إذا كان لدي ديفيد مالان، لا. 1742 01:20:29,020 --> 01:20:30,340 إنه لا يدعم ذلك. 1743 01:20:30,340 --> 01:20:31,330 إذًا ما الذي يحدث؟ 1744 01:20:31,830 --> 01:20:34,180 إذا قمت بتغيير main في أي برنامج للكتابة لتأخذ 1745 01:20:34,180 --> 01:20:38,410 هاتين الوسيطتين، argc وargv من النوع string int 1746 01:20:38,410 --> 01:20:41,440 ومن ثم مصفوفة السلاسل، تخبرك argc عدد الكلمات 1747 01:20:41,440 --> 01:20:42,550 المكتوبة في المحث. 1748 01:20:42,550 --> 01:20:45,040 لذا إذا كتب شخص كلمتين، أفترض أن 1749 01:20:45,040 --> 01:20:48,700 الكلمة الأولى هي اسم البرنامج، نقطة خط مائل argv0، 1750 01:20:48,700 --> 01:20:51,590 والكلمة الثانية من المفترض أن تكون اسمي، إذا كان يقدم أو كانت تقدم في الواقع 1751 01:20:51,590 --> 01:20:53,050 اسمه أو اسمها في المحث. 1752 01:20:53,050 --> 01:20:55,690 ولذا طبعت argv قوس 1. 1753 01:20:55,690 --> 01:20:58,630 ليس 0 لأن هذا هو اسم البرنامج، ولكن argv قوس 1. 1754 01:20:58,630 --> 01:21:02,680 Else، في الأسفل هنا، إذا لم يقدم الشخص فقط Zamyla، أو ديفيد فقط، 1755 01:21:02,680 --> 01:21:07,300 أو كلمة واحدة فقط بشكل عام أكثر، فأنا أطبع الافتراضي فقط، "Hello world." 1756 01:21:07,300 --> 01:21:15,400 لكن الأنيق حول هذا الآن هو لاحظوا أن argv هي مصفوفة السلاسل. 1757 01:21:15,400 --> 01:21:18,510 ما هي سلسلة؟ 1758 01:21:18,510 --> 01:21:20,340 إنها مصفوفة من الأحرف. 1759 01:21:20,340 --> 01:21:24,000 ولذا دعونا ندخل قطعة واحدة أخرى من الصيغة التي تصبح أقوى نوعًا ما 1760 01:21:24,000 --> 01:21:24,510 هنا. 1761 01:21:24,510 --> 01:21:28,290 دعوني أمضي قدمًا وأفعل هذا. 1762 01:21:28,290 --> 01:21:33,590 دعوني أمضي قدمًا، وفي ملف جديد هنا، argv 1.c. 1763 01:21:33,590 --> 01:21:35,010 دعوني أمضي قدمًا وألصق هذا. 1764 01:21:35,010 --> 01:21:36,120 أغلق هذا. 1765 01:21:36,120 --> 01:21:38,190 دعوني أمضي قدمًا وأفعل هذا. 1766 01:21:38,190 --> 01:21:43,600 وبدلاً من القيام بهذا التدقيق المنطقي، دعوني أقوم بهذا، لـ-- 1767 01:21:43,600 --> 01:21:48,890 دعونا نقول for int, i get 0. 1768 01:21:48,890 --> 01:21:50,330 i أقل من argc-- 1769 01:21:50,330 --> 01:21:51,580 i++. 1770 01:21:51,580 --> 01:21:54,910 دعونا نمضي قدمًا، واحد في كل سطر، ونطبع كل كلمة 1771 01:21:54,910 --> 01:21:57,310 كتبها شخص فقط، فقط لتأكيد 1772 01:21:57,310 --> 01:21:59,170 أن هذا هو ما يحدث حقًا. 1773 01:21:59,170 --> 01:22:01,180 لذا argv قوس 0، حفظ. 1774 01:22:01,180 --> 01:22:05,290 Make argv 1، enter. 1775 01:22:05,290 --> 01:22:07,530 والآن دعوني أمضي قدمًا وأشغل هذا البرنامج-- 1776 01:22:07,530 --> 01:22:12,590 نقطة خط مائل، argv 1، ديفيد مالان. 1777 01:22:12,590 --> 01:22:14,600 حسنًا، ترون جميع الكلمات الثلاث. 1778 01:22:14,600 --> 01:22:17,570 إذا قمنا بتغييرها إلى Zamyla، سنرى هاتين الكلمتين فقط. 1779 01:22:17,570 --> 01:22:20,300 إذا قمنا بتغييرها إلى Zamyla Chan، سنرى الكلمات الثلاث هذه. 1780 01:22:20,300 --> 01:22:23,210 لذا من الواضح أننا لدينا إمكانية الوصول إلى جميع الكلمات في المصفوفة، 1781 01:22:23,210 --> 01:22:25,230 ولكن دعونا نأخذ هذه الخطوة الإضافية. 1782 01:22:25,230 --> 01:22:28,520 وبدلاً من طباعة كل كلمة فقط في سلسلة، دعونا نمضي قدمًا ونفعل ذلك. 1783 01:22:28,520 --> 01:22:32,480 For intj get 0. 1784 01:22:32,480 --> 01:22:40,910 n يعادل طول السلسلة من الوسيطة الحالية، مثل هذا-- 1785 01:22:40,910 --> 01:22:43,340 j أقل من n، j++-- 1786 01:22:43,340 --> 01:22:45,560 أوه، أوه، أوه-- j++. 1787 01:22:45,560 --> 01:22:49,670 الآن دعوني أمضي قدمًا ولا أطبع السلسلة بأكملها، ولكن دعوني أقوم-- أوه، 1788 01:22:49,670 --> 01:22:52,970 أوه-- دعوني أمضي قدمًا وأطبع هذا-- 1789 01:22:52,970 --> 01:23:00,240 ليست سلسلة، ولكن حرف، n قوس i قوس j، مثل هذا. 1790 01:23:00,240 --> 01:23:00,740 حسنًا. 1791 01:23:00,740 --> 01:23:01,700 إذًا ما الذي يحدث؟ 1792 01:23:01,700 --> 01:23:07,910 واحد، هذا تكرار حلقي خارجي، ودعونا نعلق عليه، التكرار على السلاسل في argv. 1793 01:23:07,910 --> 01:23:13,140 هذا تكرار حلقي داخلي، تكرار على chars في argv قوس i. 1794 01:23:13,140 --> 01:23:17,240 لذا التكرار الحلقي الخارجي يتكرر على جميع السلاسل في argv. 1795 01:23:17,240 --> 01:23:20,990 والتكرار الداخلي، باستخدام متغير مختلف، يبدأ من 0، 1796 01:23:20,990 --> 01:23:23,930 يتكرر على جميع الأحرف في وسيطة i، 1797 01:23:23,930 --> 01:23:26,630 والتي هي سلسلة في حد ذاتها. 1798 01:23:26,630 --> 01:23:28,660 لذا يمكننا تسميتها بطول السلسلة. 1799 01:23:28,660 --> 01:23:31,460 ومن ثم نقوم بهذا حتى n، وهي طول تلك السلسلة. 1800 01:23:31,460 --> 01:23:33,210 ومن ثم نطبع كل حرف. 1801 01:23:33,210 --> 01:23:38,470 لذا فقط ليكون الأمر واضحًا-- عندما أقوم بتشغيل argv1 وأصححه، للوهلة الأولى، 1802 01:23:38,470 --> 01:23:42,070 لماذا يعلن بشكل ضمني دالة المكتبة sterling، ما هو الحل دائمًا 1803 01:23:42,070 --> 01:23:44,170 عندما تقوم بهذا الخطأ؟ 1804 01:23:44,170 --> 01:23:45,050 الجمهور: [INAUDIBLE] 1805 01:23:45,050 --> 01:23:45,920 ديفيد ج. مالان: أجل. 1806 01:23:45,920 --> 01:23:49,640 إذًا لقد نسيت هذا، include string.h وhelp50 قد 1807 01:23:49,640 --> 01:23:50,600 يساعد في هذا أيضًا. 1808 01:23:50,600 --> 01:23:52,830 لنعيد التحويل البرمجي باستخدام make argv1. 1809 01:23:52,830 --> 01:23:53,330 حسنًا. 1810 01:23:53,330 --> 01:24:00,580 عندما أقوم بتشغيل argv1، من، Zamyla Chan، ما الذي سأقوله؟ 1811 01:24:00,580 --> 01:24:01,980 الجمهور: [INAUDIBLE] 1812 01:24:01,980 --> 01:24:03,860 ديفيد ج. مالان: أجل. 1813 01:24:03,860 --> 01:24:05,620 هل ذلك هو الحدس الصحيح؟ 1814 01:24:05,620 --> 01:24:06,940 الجمهور: [INAUDIBLE] 1815 01:24:06,940 --> 01:24:10,370 ديفيد ج. مالان: سأنتقل لرؤية Zamyla Chan، لكن-- 1816 01:24:10,370 --> 01:24:11,250 الجمهور: [INAUDIBLE] 1817 01:24:11,250 --> 01:24:14,140 ديفيد ج. مالان: حرف واحد على كل سطر، بما في ذلك اسم البرنامج. 1818 01:24:14,140 --> 01:24:16,550 لذا في الحقيقة، دعوني أمرر هذا لأعلى حتى يصبح أكبر قليلاً. 1819 01:24:16,550 --> 01:24:17,160 Enter. 1820 01:24:17,160 --> 01:24:22,650 حسنًا، إن البرنامج غبي قليلاً، ولكنه يؤكد أن استخدام المصفوفات 1821 01:24:22,650 --> 01:24:25,140 هل لدي إمكانية الوصول ليس فقط إلى الكلمات، ولكن يمكنني نوعًا ما 1822 01:24:25,140 --> 01:24:26,310 الحصول على البعد الثاني. 1823 01:24:26,310 --> 01:24:30,450 ومن خلال كل كلمة، يمكنني الحصول على كل حرف بداخلها. 1824 01:24:30,450 --> 01:24:34,740 ونحن نقوم بذلك، مجددًا، فقط باستخدام ليس فقط أقواسًا مربعة مفردة، 1825 01:24:34,740 --> 01:24:35,280 ولكن اثنين. 1826 01:24:35,280 --> 01:24:37,810 ومجددًا، قم بتفصيل هذا إلى المبادئ الأساسية. 1827 01:24:37,810 --> 01:24:38,940 ما هو هذا القوس الأول؟ 1828 01:24:38,940 --> 01:24:41,680 هذه هي وسيطة i، سلسلة i في المصفوفة. 1829 01:24:41,680 --> 01:24:43,680 ومن ثم إذا أخذنا هذا مجددًا، باستخدام قوس j، 1830 01:24:43,680 --> 01:24:47,880 والذي يعطيك الحرف j داخل هذا. 1831 01:24:47,880 --> 01:24:51,250 الآن، مَن يهتم بأي من هذا النوع من الوظائف؟ 1832 01:24:51,250 --> 01:24:54,610 حسنًا، دعوني أقوم بالتمرير مجددًا وأقترح تطبيقًا واحدًا هنا. 1833 01:24:54,610 --> 01:24:57,570 لذا تذكروا أن علم الكمبيوتر هو فقط عبارة عن حل مشكلة حقًا. 1834 01:24:57,570 --> 01:24:59,490 ولكن لنفترض أن المشكلة التي تريد حلها 1835 01:24:59,490 --> 01:25:02,250 هي في الواقع عبارة عن تمرير رسالة سرية في الصف الدراسي 1836 01:25:02,250 --> 01:25:04,400 أو إرسال سر إلى شخص ما أيًا كان السبب. 1837 01:25:04,400 --> 01:25:06,240 حسنًا، يسمَى المدخل إلى تلك المشكلة 1838 01:25:06,240 --> 01:25:09,300 بشكل عام بالاختبار البسيط، رسالة تريد إرسالها إلى ذلك الشخص الآخر. 1839 01:25:09,300 --> 01:25:12,420 أنك تريد أن يظهر النص المشفر منه بشكل مثالي، 1840 01:25:12,420 --> 01:25:15,570 والتي تكون مشفرة ومشوشة، ومعلومات مشفرة إلى حد ما 1841 01:25:15,570 --> 01:25:18,720 وهكذا أي شخص في الغرفة، المعلم مثلاً، لا يمكنه انتزاع دفتر الملاحظات 1842 01:25:18,720 --> 01:25:21,810 وقراءة ما ترسله إلى فتى أحلامك أو الشخص الذى تحبه الموجود فى الغرفة، 1843 01:25:21,810 --> 01:25:23,610 أو في أي سياق آخر أيضًا. 1844 01:25:23,610 --> 01:25:26,160 لكن المشكلة تكمن فى إن كانت الرسالة التي تريد إرسالها، 1845 01:25:26,160 --> 01:25:29,220 هى مرحبًا!، إلى صديقنا القديم مع علامة تعجب، 1846 01:25:29,220 --> 01:25:34,020 يمكنك تشفيرها في سياقات محددة مثل 72، أو 73،أو 33. 1847 01:25:34,020 --> 01:25:37,450 ويمكنني القول أن معظم الفصول الدراسية في الحرم الجامعي إذا كتبت على قطعة من الورق 72، 1848 01:25:37,450 --> 01:25:40,910 73، 33، ومررتها خلال الغرفة، ومهما اعترضها الأستاذ الجامعي، 1849 01:25:40,910 --> 01:25:43,080 فلن يفهم ما تقوله على أى حال. 1850 01:25:43,080 --> 01:25:44,790 لكن هذا ليس نظامًا جيدًا. 1851 01:25:44,790 --> 01:25:46,620 هذا ليس نظام تشفير. 1852 01:25:46,620 --> 01:25:47,460 لماذا؟ 1853 01:25:47,460 --> 01:25:48,160 لأنه ليس آمنًا. 1854 01:25:52,270 --> 01:25:52,780 [INAUDIBLE] 1855 01:25:52,780 --> 01:25:54,540 [INTERPOSING VOICES] 1856 01:25:54,540 --> 01:25:55,420 ديفيد ج. مالان: أجل. 1857 01:25:55,420 --> 01:25:57,130 أي شخص يستطيع الوصول إلى هذا، أليس كذلك، طالما 1858 01:25:57,130 --> 01:26:00,490 كما كنتم تحضرون الأسبوع الأول مثلاً أو صفر من CS50، أو أن 1859 01:26:00,490 --> 01:26:02,320 لديكم معرفة عامة بـ Ascii. 1860 01:26:02,320 --> 01:26:04,780 مثل هذا مجرد شفرة ما. 1861 01:26:04,780 --> 01:26:08,260 أعني أن Ascii هو نظام يقوم بتعيين الأحرف إلى أرقام. 1862 01:26:08,260 --> 01:26:10,320 وأي شخص آخر يعرف تلك الشفرة فمن الواضح 1863 01:26:10,320 --> 01:26:12,820 أنه يعرف ما هي رسالتك، لأنه ليس سرًا فريدًا من نوعه 1864 01:26:12,820 --> 01:26:14,340 لك والمتلقي. 1865 01:26:14,340 --> 01:26:16,170 إذًا ربما هذه ليست أفضل فكرة. 1866 01:26:16,170 --> 01:26:18,160 حسنًا، يمكنك أن تكون أكثر تطورًا قليلاً. 1867 01:26:18,160 --> 01:26:19,990 وترجع هذه-- فى الواقع إلى كونها، صورة 1868 01:26:19,990 --> 01:26:23,680 من الحرب العالمية الأولى لرسالة أُرسلت من ألمانيا إلى المكسيك 1869 01:26:23,680 --> 01:26:25,780 تم تشفريها بطريقة مشابهة جدًا. 1870 01:26:25,780 --> 01:26:26,800 ولم تكن تستخدم Ascii. 1871 01:26:26,800 --> 01:26:29,080 والأرقام ،التي يمكنك استخلاصها من الصورة، 1872 01:26:29,080 --> 01:26:30,430 هي في الواقع أكبر من ذلك بكثير. 1873 01:26:30,430 --> 01:26:33,850 ولكن في هذا النظام، في السياق العسكري، كان هناك كتاب شفرات. 1874 01:26:33,850 --> 01:26:35,740 مشابهة جدًا في جوهرها للـ Ascii، حيث لديك 1875 01:26:35,740 --> 01:26:39,650 عمود من الأرقام وعمود من الأحرف التي تتوافق معها، 1876 01:26:39,650 --> 01:26:42,970 كتاب الشفرات الذي بشكل عام يحتوي على أرقام مثلاً، ثم ربما 1877 01:26:42,970 --> 01:26:45,280 حروف أو كلمات كاملة حتى تتوافق معها، 1878 01:26:45,280 --> 01:26:50,230 وأحيانًا الآلاف منهم، يكون حرفيًا كتابًا كبيرًا جدًا عن الشفرات. 1879 01:26:50,230 --> 01:26:53,800 وطالما فقط، في هذا السياق أن الألمان والمتلقين، 1880 01:26:53,800 --> 01:26:56,500 المكسيكيين، توّصلوا إلى الكتاب نفسه، 1881 01:26:56,500 --> 01:27:01,060 يمكنهم التعمية وفك التعمية، أو بالأحرى تشفير وفك تشفير المعلومات. 1882 01:27:01,060 --> 01:27:03,230 بالطبع، في هذا السياق المحدد للغاية-- 1883 01:27:03,230 --> 01:27:05,320 يمكنك قراءة المزيد حول هذا في النصوص التاريخية-- 1884 01:27:05,320 --> 01:27:06,280 تم اعتراض هذا. 1885 01:27:06,280 --> 01:27:08,860 هذه الرسالة، على ما يبدو ليست خطرًا، رغم أنها بالتأكيد 1886 01:27:08,860 --> 01:27:11,740 تبدو مثيرة للشكوك مع كل هذه الأرقام، 1887 01:27:11,740 --> 01:27:16,450 إذًا، هى خطر، قام البريطانيون، في هذه الحالة بالفعل، باعتراضها. 1888 01:27:16,450 --> 01:27:18,500 وبفضل العديد من المجهودات وتحليل الشفرات، 1889 01:27:18,500 --> 01:27:23,740 تم كسر نمط التعليمات البرمجية لحديقة بلتشلي، وإن كانوا حينها، 1890 01:27:23,740 --> 01:27:27,490 قادرين على اكتشاف ما تمثله الأرقام من كلمات 1891 01:27:27,490 --> 01:27:29,750 وفك تشفير الرسالة في الواقع. 1892 01:27:29,750 --> 01:27:31,960 في واقع الأمر، إليكم صورة لبعض الكلمات 1893 01:27:31,960 --> 01:27:34,480 التي تم ترجمتها من لغة إلى أخرى. 1894 01:27:34,480 --> 01:27:38,560 ولكن المزيد حول هذا على الإنترنت أو المراجع النصية. 1895 01:27:38,560 --> 01:27:41,380 اتضح أن هذه القصيدة أيضًا كان بها تعليمات برمجية مماثلة، أليس كذلك؟ 1896 01:27:41,380 --> 01:27:44,860 إذًا بمناسبة وجودكم فى بوسطن هنا، قد تتذكرون هذا. 1897 01:27:44,860 --> 01:27:49,090 "انصتوا يا أطفالي، وسأقص عليكم قصيدة "رحلة منتصف الليل لبول ريفير". 1898 01:27:49,090 --> 01:27:51,880 في 18 أبريل لعام '75، رجل بالكاد 1899 01:27:51,880 --> 01:27:54,910 يحيا الآن ويتذكر هذا اليوم والسنة المشهورين. 1900 01:27:54,910 --> 01:27:58,360 فقال لصديقه، إذا كانت الجيش البريطاني يسير براً أو بحراً 1901 01:27:58,360 --> 01:28:00,490 من المدينة مساء الليلة، فعلق مصباحًا 1902 01:28:00,490 --> 01:28:05,020 عاليًا فى قنطرة جرس برج الكنيسة الشمالية كإشارة ضوئية، 1903 01:28:05,020 --> 01:28:08,010 واحدًا إذا كان عبر البر، واثنين إذا كان عبر البحر. 1904 01:28:08,010 --> 01:28:10,510 وسأكون على الشاطئ الآخر مستعدًا للمضي ودق 1905 01:28:10,510 --> 01:28:13,630 ناقوس الخطر فى كل قرية ومزرعة لأهل "ميدلسكس" 1906 01:28:13,630 --> 01:28:14,900 ليتأهبوا ويستعدوا." 1907 01:28:14,900 --> 01:28:17,530 إذًا اتضح أن بعض هذا ليس صحيحًا البتة في الواقع، 1908 01:28:17,530 --> 01:28:21,760 ولكن شفرة واحد إذا كانوا عبر البر واثنين عبر البحر كانت 1909 01:28:21,760 --> 01:28:23,620 مثالاً لشفرة المرة واحدة نوعًا ما. 1910 01:28:23,620 --> 01:28:27,400 لأنه إذا كان الثوار في الثورة الأمريكية 1911 01:28:27,400 --> 01:28:30,970 قرّروا سرًا نوعًا ما بين أنفسهم حرفيًا - سنضع 1912 01:28:30,970 --> 01:28:34,580 مصباحًا واحدًا على رأس الكنيسة إذا جاء البريطانيون برًا. 1913 01:28:34,580 --> 01:28:37,690 وسنستخدم بدلاً من ذلك اثنين إذا كان البريطانيون قادمين عن طريق البحر. 1914 01:28:37,690 --> 01:28:38,850 مثل هذا يعد شفرة ما. 1915 01:28:38,850 --> 01:28:41,750 ويمكنكم كتابتها فى كتاب ما، إلا إذا كان لديكم كتاب الشفرة. 1916 01:28:41,750 --> 01:28:44,500 ولكن بالطبع، بمجرد أن يكتشف شخص ما هذا النمط، 1917 01:28:44,500 --> 01:28:45,670 فسيكون تم اختراقه. 1918 01:28:45,670 --> 01:28:49,150 وهكذا فإن كتب الشفرة لا تميل إلى تكون الآليات الأقوى 1919 01:28:49,150 --> 01:28:51,580 لتشفير المعلومات. 1920 01:28:51,580 --> 01:28:54,730 بدلاً من ذلك، من الأفضل استخدام شيء خوارزمي أكثر. 1921 01:28:54,730 --> 01:28:56,980 ومن الرائع، في علم الحاسوب وجود هذا الصندوق الأسود 1922 01:28:56,980 --> 01:28:59,800 لكي-- نظل نقول إنه، موطن الخوارزميات. 1923 01:28:59,800 --> 01:29:03,940 وبشكل عام، لديّ التشفير مشكلة مع المدخلات والمخرجات، 1924 01:29:03,940 --> 01:29:05,880 لكننا نحتاج فقط إلى مُدخل واحد إضافي. 1925 01:29:05,880 --> 01:29:09,080 المُدخل هو ما يسمّى عمومًا المفتاح، أو السر. 1926 01:29:09,080 --> 01:29:11,450 والسر قد يكون مجرد رقم. 1927 01:29:11,450 --> 01:29:13,680 فعلى سبيل المثال، إذا أردت أن يكون سرّي رقم 1، 1928 01:29:13,680 --> 01:29:16,730 لأننا سنبقي على المثال فى شكل مبسط، ولكن حقًا يمكن أن يكون أي رقم. 1929 01:29:16,730 --> 01:29:18,700 وبالفعل، رأينا فى الصورة منذ لحظات، 1930 01:29:18,700 --> 01:29:21,650 استخدام الألمان لأكبر من هذا، وإن كان ذلك في سياق الشفرات. 1931 01:29:21,650 --> 01:29:24,730 افترضنا أنكم تريدون الآن إرسال رسالة أكثر خصوصية إلى شخص ما 1932 01:29:24,730 --> 01:29:26,800 عبر الغرفة في الفصل هى، أنا أحبك. 1933 01:29:26,800 --> 01:29:31,120 كيف تقوم بتشفير ذلك بطريقة ما لا تستخدام مجرد Ascii 1934 01:29:31,120 --> 01:29:33,070 ولا تستخدم مجرد بعض كتب التشفير البسيطة؟ 1935 01:29:33,070 --> 01:29:37,490 حسنًا، دعوني أفترض الآن أننا فهمنا كيف يتم تمثيل السلاسل، 1936 01:29:37,490 --> 01:29:41,170 صحيح-- نحن حقًا على وشك أن نسفه ونقلل من قيمة الحب-- 1937 01:29:41,170 --> 01:29:44,950 إذًا حتى الآن قد عرفتم كيفية تمثيل السلاسل بشكل حسابي، 1938 01:29:44,950 --> 01:29:47,710 حسنًا، دعونا فقط نبدأ بتمثيل جملة "أنا أحبك" في Ascii. 1939 01:29:47,710 --> 01:29:49,150 إذًا I تكون 73. 1940 01:29:49,150 --> 01:29:50,620 L تكون 76. 1941 01:29:50,620 --> 01:29:53,320 O-V-E Y-O-U. هذا هو Ascii. 1942 01:29:53,320 --> 01:29:55,180 لا ينبغي إرسالها بهذه الطريقة، لأن أي شخص 1943 01:29:55,180 --> 01:29:58,240 يعرف Ascii سيمكنه معرفة ما تقوله. 1944 01:29:58,240 --> 01:30:02,260 ولكن ماذا لو قمت بتشفير هذه الرسالة، وقمت بتطبيق خوارزمية عليها؟ 1945 01:30:02,260 --> 01:30:04,300 وفى أبسط الأحوال، يمكن أن تكون الخوارزمية 1946 01:30:04,300 --> 01:30:06,590 رياضيات- عملية حسابية بسيطة، كما رأينا. 1947 01:30:06,590 --> 01:30:09,280 أتدرون، دعوني فقط أستخدم المفتاح السري لديّ رقم 1. 1948 01:30:09,280 --> 01:30:14,950 ودعوني أتأكد أن فتى أحلامي يعرف أنني أستخدم القيمة السرية لرقم 1. 1949 01:30:14,950 --> 01:30:17,680 إذًا هو أو هي أيضًا يدرك تلك القيمة. 1950 01:30:17,680 --> 01:30:21,640 وقبل أن أبعث رسالتي، سأقوم بإضافة رقم 1 إلى كل حرف. 1951 01:30:21,640 --> 01:30:23,410 إذًا، 73 يصبح 74. 1952 01:30:23,410 --> 01:30:24,880 76 يصبح 77. 1953 01:30:24,880 --> 01:30:29,560 80 و87 و70 و90 و80 و86. 1954 01:30:29,560 --> 01:30:31,850 الآن يمكن إرسال هذا بشكل واضح. 1955 01:30:31,850 --> 01:30:35,450 ولكن لاحقًا، يمكنني فى الواقع إرساله كرسالة نصية. 1956 01:30:35,450 --> 01:30:37,090 إذًا دعونا نرجعه إلى Ascii. 1957 01:30:37,090 --> 01:30:45,640 74 أصبح الآن j. و77 أصبح الآن M. و80 أصبح الآن P. وربما يمكنك أن ترى النمط. 1958 01:30:45,640 --> 01:30:48,190 هذه الرسالة كانت، أحبك. 1959 01:30:48,190 --> 01:30:52,740 والآن، أعتقد أن جميع الأحرف خطأ بمقدار 1، على ما أظن. 1960 01:30:52,740 --> 01:30:57,700 I أصبح J. وL أصبح M. وO أصبح P، وهكذا. 1961 01:30:57,700 --> 01:31:00,180 إذًا الادعاء سيكون، مشفرًا، سأقوم 1962 01:31:00,180 --> 01:31:02,460 بإرسال تلك الرسالة عبر الغرفة. 1963 01:31:02,460 --> 01:31:05,340 والآن لن يتمكن أي شخص لديه كتاب الشفرات من فكها. 1964 01:31:05,340 --> 01:31:07,090 لا يمكنني سرقة الكتاب وفك شفراتها، 1965 01:31:07,090 --> 01:31:09,900 لأن المفتاح الآن هو فقط في عقلي، إذا جاز التعبير. 1966 01:31:09,900 --> 01:31:12,030 إنه فقط الرقم 1 الذي هو أو هي وأنا 1967 01:31:12,030 --> 01:31:13,920 تعين علينا الاتفاق عليه مسبقًا أننا سنستخدمه 1968 01:31:13,920 --> 01:31:15,670 لإرسال رسائلنا السرية. 1969 01:31:15,670 --> 01:31:20,460 لذا إذا التقط شخص ما هذه الرسالة، المعلم في الفصل أو أي شخص، 1970 01:31:20,460 --> 01:31:26,050 كيف يمكنهم محاولة فكها أو حل رموز تلك الشفرة؟ 1971 01:31:26,050 --> 01:31:29,950 هل هناك أي أساليب متاحة لهم؟ 1972 01:31:29,950 --> 01:31:32,590 يمكنني القول أنه يمكننا نوعًا ما الكشف عما بداخل مذكرة الحب تلك. 1973 01:31:32,590 --> 01:31:32,980 الجمهور: [INAUDIBLE] 1974 01:31:32,980 --> 01:31:33,760 ديفيد ج. مالان: ماذا؟ 1975 01:31:33,760 --> 01:31:34,490 طريقة التخمين والتحقق. 1976 01:31:34,490 --> 01:31:35,480 حسنًا، يمكننا تجربة كل-- 1977 01:31:35,480 --> 01:31:36,860 ما يزال هناك بعض التباعد نوعًا ما. 1978 01:31:36,860 --> 01:31:40,430 إذًا تدركون حقًا، أنه يمكننا القيام بتحليل شفرتها نوعًا ما، 1979 01:31:40,430 --> 01:31:41,690 تحليل التكرار. 1980 01:31:41,690 --> 01:31:43,780 مثل، أنه لا يمكنني التفكير في الكثير من الكلمات باللغة الإنجليزية 1981 01:31:43,780 --> 01:31:45,200 التي تحتوي على حرف واحد فيها. 1982 01:31:45,200 --> 01:31:46,590 إذًا ما الذي تمثله J على الأرجح؟ 1983 01:31:46,590 --> 01:31:47,420 [INTERPOSING VOICES] 1984 01:31:47,420 --> 01:31:48,650 ديفيد ج. مالان: I، ربما. 1985 01:31:48,650 --> 01:31:52,050 ربما A، ولكن ربما I. وليس هناك الكثير من الخيارات الأخرى. 1986 01:31:52,050 --> 01:31:55,070 لذلك تجسسنا على جزء واحد الرسالة بالفعل. 1987 01:31:55,070 --> 01:31:56,390 أرى القواسم المشتركة. 1988 01:31:56,390 --> 01:31:59,170 هناك اثنان من ماذا هنا؟ 1989 01:31:59,170 --> 01:32:02,800 اثنان P. ولا أعرف بالضرورة أنها تمثل O، ولكن 1990 01:32:02,800 --> 01:32:04,730 أعلم أنه الحرف نفسه. 1991 01:32:04,730 --> 01:32:08,940 لذلك إذا واصلت تلك العملية المدروسة أو هذا الاختبار والخطأ، 1992 01:32:08,940 --> 01:32:10,690 واكتشفت، أوه، ماذا لو كان هذا هو حرف O؟ 1993 01:32:10,690 --> 01:32:12,370 وذاك O. ثم لحظة من فضلكم. 1994 01:32:12,370 --> 01:32:13,930 إنهم ينتقلون من واحد إلى آخر. 1995 01:32:13,930 --> 01:32:15,100 ربما يعطي هذا، أنا أحبك. 1996 01:32:15,100 --> 01:32:17,680 مثل لو كنت بالفعل تستطيع، مع بعض الاحتمالات، 1997 01:32:17,680 --> 01:32:20,930 فك تشفير رسالة ما من خلال تحليلها بهذه الطريقة نوعًا ما. 1998 01:32:20,930 --> 01:32:22,810 إنها على الأقل أكثر أمانًا من كتاب الشفرات، 1999 01:32:22,810 --> 01:32:25,360 لأنك لن تتعرض للاختراق إذا كان الكتاب نفسه مسروقًا. 2000 01:32:25,360 --> 01:32:28,240 ويمكنك تغيير المفتاح فى كل مرة، طالما اتفقت 2001 01:32:28,240 --> 01:32:30,650 أنت والمتلقي على شيء ما بالفعل. 2002 01:32:30,650 --> 01:32:33,490 لكن على الأقل وضعنا الآن هذه الآلية في الحسبان. 2003 01:32:33,490 --> 01:32:36,730 إذًا مجرد فهمك لما يمكنك القيام به مع السلاسل، 2004 01:32:36,730 --> 01:32:39,760 هل يمكنك في الواقع الآن القيام حقًا بأشياء مثيرة للاهتمام في المجال المحدد 2005 01:32:39,760 --> 01:32:40,370 لهم؟ 2006 01:32:40,370 --> 01:32:45,490 في الواقع، سابقًا، القيصر، سابقًا في الأوقات العسكرية حقًا 2007 01:32:45,490 --> 01:32:47,250 استخدم تشفير مثل هذا تمامًا. 2008 01:32:47,250 --> 01:32:49,750 وبصراحة، عندما تكون الأول في استخدام هذه التشفيرات، 2009 01:32:49,750 --> 01:32:52,580 فهي في الواقع آمنة نوعًا ما، حتى لو كانت بسيطة نسبيًا. 2010 01:32:52,580 --> 01:32:57,250 لكن آملاً، عدم استخدام مفتاح 1، فقط، ربما 2، أو 13، أو 25، 2011 01:32:57,250 --> 01:32:58,360 أو شيءٍ أكبر. 2012 01:32:58,360 --> 01:33:01,690 لكن هذا مثال عن الشفرة البديلة، 2013 01:33:01,690 --> 01:33:04,540 أو الشفرات الدائرة حيث كل شيء نوعًا ما يدور-- 2014 01:33:04,540 --> 01:33:07,870 A تصبح B ،B تصبح C. أو يمكنك نوعًا ما 2015 01:33:07,870 --> 01:33:11,060 تدويرها بصورة أكبر من ذلك. 2016 01:33:11,060 --> 01:33:14,350 حسنًا، دعونا نلقي نظرة على مثال أخير هنا 2017 01:33:14,350 --> 01:33:17,110 لميزةٍ واحدةٍ أخرى بدائية ونهائية 2018 01:33:17,110 --> 01:33:20,830 اليوم، قبل أن نرجع للوراء إلى مستوى أعلى ونجمع كل شيءٍ معًا. 2019 01:33:20,830 --> 01:33:23,380 يتضح أن طباعة رسائل الخطأ 2020 01:33:23,380 --> 01:33:27,060 ليست الطريقة الوحيدة للإشارة إلى أن شيئًا ما قد حدث بشكلٍ خاطئ. 2021 01:33:27,060 --> 01:33:31,890 هناك كلمة رئيسية جديدة، استخدام جديد لكلمة رئيسية قديمة في هذا المثال، 2022 01:33:31,890 --> 01:33:33,980 وهو في الواقع تقليد للإشارة إلى الأخطاء. 2023 01:33:33,980 --> 01:33:36,550 إذًا هذا مثال يُسمى exit.c. 2024 01:33:36,550 --> 01:33:42,410 ويبدو أنه يريد الإنسان أن يفعل ماذا، إذا استنتجنا من التعليمات البرمجية؟ 2025 01:33:42,410 --> 01:33:43,540 الجمهور: خروج، [INAUDIBLE]. 2026 01:33:43,540 --> 01:33:44,030 ديفيد ج. مالان: نعم. 2027 01:33:44,030 --> 01:33:44,580 كررها؟ 2028 01:33:44,580 --> 01:33:45,460 الجمهور: [INAUDIBLE] 2029 01:33:45,460 --> 01:33:47,410 ديفيد ج. مالان، حسنًا، إنه يريد-- حسنًا ماذا 2030 01:33:47,410 --> 01:33:51,110 تريد أن يفعل الإنسان ضمنيًا، استنادًا إلى printf هنا؟ 2031 01:33:51,110 --> 01:33:53,410 كيف يمكنني تشغيل هذا البرنامج؟ 2032 01:33:53,410 --> 01:33:53,990 أجل؟ 2033 01:33:53,990 --> 01:33:56,770 الجمهور: [INAUDIBLE] فقط قم بتطبيق [INAUDIBLE].. 2034 01:33:56,770 --> 01:33:57,650 ديفيد ج. مالان: نعم. 2035 01:33:57,650 --> 01:34:00,410 لذا لأي سبب من الأسباب، هذا البرنامج ضمنيًا 2036 01:34:00,410 --> 01:34:03,080 يريد مني أن أكتب بالضبط كلمتين في المُحث. 2037 01:34:03,080 --> 01:34:06,500 لأنه إذا لم أفعل ذلك، فسيصرخ في وجهي، أنه يفتقد وسيطة سطر الأوامر. 2038 01:34:06,500 --> 01:34:08,630 ثم سيرجع 1، أيًا كان ذلك. 2039 01:34:08,630 --> 01:34:10,850 وبخلاف ذلك، سوف يقول، أهلاً، كذا وكذا. 2040 01:34:10,850 --> 01:34:12,680 إذًا إذا قمت بالفعل بتشغيل هذا البرنامج-- 2041 01:34:12,680 --> 01:34:17,080 فاسمحوا لي بالعودة هنا وكتابة make exit-- 2042 01:34:17,080 --> 01:34:19,910 عذرًا، في دليلي، make exit. 2043 01:34:19,910 --> 01:34:23,900 حسنًا، نقطة خط مائل exit، enter، أنا أفتقد وسيطة سطر الأوامر. 2044 01:34:23,900 --> 01:34:25,400 حسنًا، اسمحوا لي بوضع اسم Zamyla. 2045 01:34:25,400 --> 01:34:26,100 أوه، Hello Zamyla. 2046 01:34:26,100 --> 01:34:28,000 اسمحوا لي بوضع Zamyla Chan. 2047 01:34:28,000 --> 01:34:29,500 لا، أنا أفتقد وسيطة سطر الأوامر. 2048 01:34:29,500 --> 01:34:33,530 يريد فقط وسيطة واحدة، حتى في هذه الحالة هنا. 2049 01:34:33,530 --> 01:34:36,380 أنا أرى بصريًا رسالة الخطأ، لكن من الواضح أن 2050 01:34:36,380 --> 01:34:41,510 الكمبيوتر يعطي إشارة لي بما يسمى تعليمات الإنهاء البرمجية. 2051 01:34:41,510 --> 01:34:44,510 إذن فالقصة الطويلة باختصار، أننا شاهدنا أمثلة بالفعل الأسبوع الماضي عن الطريقة 2052 01:34:44,510 --> 01:34:46,190 التي يمكنك بها الحصول على دالة لإرجاع قيمة. 2053 01:34:46,190 --> 01:34:47,990 ورأينا كيف [؟إيرين؟] جاء على خشبة المسرح، 2054 01:34:47,990 --> 01:34:50,480 وأعادت لي قصاصة ورق مع سلسلة عليها. 2055 01:34:50,480 --> 01:34:52,820 لكن من الواضح أن main هو خاص قليلاً. 2056 01:34:52,820 --> 01:34:58,820 إذا قامت main بإرجاع قيمة مثل 1 أو 0، فيمكنك بالفعل رؤية ذلك، 2057 01:34:58,820 --> 01:35:01,790 وإن كان بطريقة غير واضحة نوعًا ما. 2058 01:35:01,790 --> 01:35:06,920 إذا قمت بتشغيل exit، وقمت بتشغيلها بشكل صحيح باستخدام Zamyla كاسم، 2059 01:35:06,920 --> 01:35:10,910 إذا قمت بعد ذلك بكتابة echo، علامة الدولار، علامة استفهام، لجميع الأشياء، 2060 01:35:10,910 --> 01:35:15,990 enter، سأرى بعد ذلك بالفعل ما الذي عادت به main، وهي في هذه الحالة 0. 2061 01:35:15,990 --> 01:35:17,540 الآن، اسمحوا لي بالمحاولة وأكون غير متعاون. 2062 01:35:17,540 --> 01:35:23,570 إذا قمت بالفعل بتشغيل نقطة خط مائل exit، بدون كلمة، 2063 01:35:23,570 --> 01:35:25,230 سأرى، أنا أفتقد وسيطة سطر الأوامر. 2064 01:35:25,230 --> 01:35:29,030 لكن إذا قمت بالأمر المشفر نفسه، echo، علامة الدولار، علامة استفهام، 2065 01:35:29,030 --> 01:35:30,920 سأرى أن main خرجت بـ 1. 2066 01:35:30,920 --> 01:35:32,200 الآن، لماذا هذا مفيد؟ 2067 01:35:32,200 --> 01:35:35,640 حسنًا، عندما بدأنا نكتب برامج أكثر تعقيدًا، 2068 01:35:35,640 --> 01:35:39,320 سيكون من المتعارف عليه الخروج من main بإرجاع 2069 01:35:39,320 --> 01:35:42,020 قيمة غير صفرية، إذا حدث خطأ ما. 2070 01:35:42,020 --> 01:35:44,350 ينتج 0 ليعني أن كل شيء سار بشكل جيد. 2071 01:35:44,350 --> 01:35:46,070 وفي الواقع، في كل البرامج لدينا 2072 01:35:46,070 --> 01:35:49,760 تمت كتابة هذا حتى الآن، إذا لم تذكر إرجاع أي شيء، 2073 01:35:49,760 --> 01:35:53,900 فسترجع main تلقائيًا لك 0. 2074 01:35:53,900 --> 01:35:55,160 ولقد كان ذلك طوال هذا الوقت. 2075 01:35:55,160 --> 01:35:57,990 إنها مجرد ميزة، لذا فلا تزعج نفسك بكتابتها. 2076 01:35:57,990 --> 01:36:00,730 ولكن اللطيف في ذلك، أو ما هو حقيقي بشأن ذلك، 2077 01:36:00,730 --> 01:36:04,250 هو إذا كان على جهاز الكمبيوتر الشخصي أو Mac لديك، إذا واجهت أي رسالة خطأ مزعجة 2078 01:36:04,250 --> 01:36:08,780 تقول، خطأ سلبي 29، حدث خطأ في النظام، أو شيء ما توقف، 2079 01:36:08,780 --> 01:36:11,510 لكنك غالبًا ما ترى أرقام على الشاشة، ربما. 2080 01:36:11,510 --> 01:36:15,300 مثل خطأ التعليمات البرمجية هذه والتي تميل إلى الارتباط بهذه الأنواع من القيم. 2081 01:36:15,300 --> 01:36:18,290 لذا إذا كان الإنسان يكتب برنامجًا وحدث خطأ ما 2082 01:36:18,290 --> 01:36:21,290 وحدث خطأ، فإنها كما هو متوقع تقوم بإرجاع قيمة مثل هذه. 2083 01:36:21,290 --> 01:36:23,240 ويحق للكمبيوتر الوصول إليه. 2084 01:36:23,240 --> 01:36:25,950 وأن هذا ليس بهذه الفائدة للشخص الذي يقوم بتشغيل البرنامج. 2085 01:36:25,950 --> 01:36:27,950 لكن عندما تصبح برامجك أكثر تعقيدًا، سنرى 2086 01:36:27,950 --> 01:36:32,030 أن هذا بالفعل مفيد كطريقة لإعطاء إشارة 2087 01:36:32,030 --> 01:36:34,460 أنه حدث خطأ ما بالفعل. 2088 01:36:34,460 --> 01:36:34,960 آه. 2089 01:36:34,960 --> 01:36:41,240 حسنًا، إنها صيغ كثيرة مغلفة في سياق محبب. 2090 01:36:41,240 --> 01:36:44,830 أية أسئلة قبل تناول مجال واحد نهائي؟ 2091 01:36:44,830 --> 01:36:45,540 لا؟ 2092 01:36:45,540 --> 01:36:46,170 حسنًا. 2093 01:36:46,170 --> 01:36:51,960 إذًا من الواضح أنه يمكننا الإجابة على سؤال "من يهتم" بطريقة أخرى 2094 01:36:51,960 --> 01:36:52,770 أيضًا. 2095 01:36:52,770 --> 01:36:59,520 من الواضح أن-- اسمحوا لي بالمضي قدمًا وفتح مثال لمصفوفتنا مرة أخرى هنا-- 2096 01:36:59,520 --> 01:37:03,150 يمكن استخدام هذه المصفوفات بالفعل الآن لحل المشاكل بطريقة أكثر خوارزمية. 2097 01:37:03,150 --> 01:37:05,030 وهنا تصبح الحياة أكثر إثارة. 2098 01:37:05,030 --> 01:37:06,840 لأننا مررنا بشكلٍ لا يصدق بتعقيدات اليوم. 2099 01:37:06,840 --> 01:37:08,590 وكلما تقدمنّا في الصف، نحن 2100 01:37:08,590 --> 01:37:10,350 لن نمضي الكثير من الوقت في الصيغ، 2101 01:37:10,350 --> 01:37:13,350 وعلامات الدولار، وعلامات الاستفهام، والأقواس المربعة، وما شابه ذلك. 2102 01:37:13,350 --> 01:37:14,490 هذا ليس جزءًا مثيرًا للاهتمام. 2103 01:37:14,490 --> 01:37:17,280 الجزء المثير للاهتمام هو عندما نحصل الآن على هذه الكتل البنائية 2104 01:37:17,280 --> 01:37:20,820 الأساسية، مثل مصفوفة، والتي بمكننا من خلالها حل مشاكل. 2105 01:37:20,820 --> 01:37:23,640 لذا يتضح أن المصفوفة، أنت تعلم، يمكنك 2106 01:37:23,640 --> 01:37:26,250 نوعًا ما التفكير فيها كسلسلة من الخزائن، 2107 01:37:26,250 --> 01:37:29,400 سلسلة من الخزانات التي قد تبدو مثل هذا، وبداخلها يوجد 2108 01:37:29,400 --> 01:37:32,620 قيم-- سلاسل، أو أرقام، أو حروف، أو غيرهم. 2109 01:37:32,620 --> 01:37:36,090 لكن الخزانات هي استعارة ملائمة لأن جهاز الكمبيوتر، على عكس الأشخاص، 2110 01:37:36,090 --> 01:37:38,520 يمكنه فقط أن يرى ويفعل شيئًا واحدًا في المرة الواحدة. 2111 01:37:38,520 --> 01:37:41,130 يمكنه فتح خزانة واحدة والنظر داخلها، لكن لا يمكنه نوعًا ما 2112 01:37:41,130 --> 01:37:44,760 الرجوع خطوة للوراء، كما يمكننا نحن ذلك، والنظر داخل جميع الخزانات، 2113 01:37:44,760 --> 01:37:46,450 حتى إذا كانت جميع الأبواب مفتوحة. 2114 01:37:46,450 --> 01:37:49,170 لذا يجب أن يكون هناك إجراء متعمد أكثر من ذلك. 2115 01:37:49,170 --> 01:37:51,060 لذا ما هي الآثار الفعلية؟ 2116 01:37:51,060 --> 01:37:52,710 حسنًا، طوال هذا الوقت-- 2117 01:37:52,710 --> 01:37:55,110 كان لدينا مثال دليل الهاتف في الأسبوع الأول، 2118 01:37:55,110 --> 01:37:59,370 وكفاءة تلك الخوارزمية، من العثور على مايك سميث في دليل الهاتف هذا، 2119 01:37:59,370 --> 01:38:02,120 جميعنا يفترض ما هي ميزة دليل الهاتف هذا؟ 2120 01:38:02,120 --> 01:38:03,920 الجمهور: إنه مرتب ترتيبًا أبجديًا. 2121 01:38:03,920 --> 01:38:05,360 ديفيد ج. مالان: إنه تم ترتيبه ترتيبًا أبجديًا. 2122 01:38:05,360 --> 01:38:08,270 وكان هذا إضافةً كبيرة، لأنني بعد ذلك استطعت الانتقال إلى المنتصف، 2123 01:38:08,270 --> 01:38:10,340 واستطعت الانتقل إلى منتصف المنتصف، وهكذا. 2124 01:38:10,340 --> 01:38:12,010 وكان هذا ممكنًا خوارزميًا. 2125 01:38:12,010 --> 01:38:13,850 على هواتفنا، إذا سحبت جهات الاتصال الخاصة بك، 2126 01:38:13,850 --> 01:38:17,150 فستحصل على قائمة من الأسماء الأولى، أو أسماء العائلة، كلها مرتبة ترتيبًا أبجديًا. 2127 01:38:17,150 --> 01:38:20,420 هذا لأن، خمن ما هو هيكل البيانات أو التخطيط 2128 01:38:20,420 --> 01:38:24,450 الذي ربما يستخدمه هاتفك لتخزين جهات الاتصال الخاصة بك؟ 2129 01:38:24,450 --> 01:38:26,380 إنها مصفوفة نوعًا ما، أليس كذلك؟ 2130 01:38:26,380 --> 01:38:27,130 إنها مجرد قائمة. 2131 01:38:27,130 --> 01:38:29,500 وقد يتم عرضها عموديًا بدلاً من أفقيًا، 2132 01:38:29,500 --> 01:38:30,550 كما رسمتها اليوم. 2133 01:38:30,550 --> 01:38:33,500 لكنها مجرد قيم متصلة على التوالي مع بعضهم البعض 2134 01:38:33,500 --> 01:38:34,720 والتي يتم تخزينها بالفعل. 2135 01:38:34,720 --> 01:38:37,210 لكن كيف أصبحت في ذلك الترتيب المخزن بالفعل؟ 2136 01:38:37,210 --> 01:38:38,840 وكيف يمكنك بالفعل العثور على قيم؟ 2137 01:38:38,840 --> 01:38:40,930 حسنًا، دعونا ننظر في ما هي هذا المشكلة بالفعل 2138 01:38:40,930 --> 01:38:43,070 للكمبيوتر، على النحو التالي. 2139 01:38:43,070 --> 01:38:44,530 دعوني أمضي قدمًا هنا. 2140 01:38:44,530 --> 01:38:47,840 هل يمانع أحد المتطوعين فى المجيء إلى هنا؟ 2141 01:38:47,840 --> 01:38:49,950 يمكنني إهداؤه كرة ضغط. 2142 01:38:49,950 --> 01:38:51,400 حسنًا ، شخصًا ما من الخلف؟ 2143 01:38:51,400 --> 01:38:52,240 حسنًا ، تعال إلى هنا. 2144 01:38:52,240 --> 01:38:52,940 تعال. 2145 01:38:52,940 --> 01:38:53,650 ما اسمك؟ 2146 01:38:53,650 --> 01:38:54,600 إريك: إريك. 2147 01:38:54,600 --> 01:38:55,610 ديفيد ج. مالان: آرون. 2148 01:38:55,610 --> 01:38:56,110 حسنًا. 2149 01:38:56,110 --> 01:38:57,670 إذًا سيأتي آرون. 2150 01:38:57,670 --> 01:38:58,550 و-- 2151 01:38:58,550 --> 01:38:59,230 إريك: إريك. 2152 01:38:59,230 --> 01:38:59,680 ديفيد ج. مالان: معذرةً؟ 2153 01:38:59,680 --> 01:39:00,460 أوه، إريك. 2154 01:39:00,460 --> 01:39:01,430 تشرفت بمقابلتك. 2155 01:39:01,430 --> 01:39:01,930 حسنًا. 2156 01:39:01,930 --> 01:39:02,670 تعال هنا. 2157 01:39:02,670 --> 01:39:05,440 لذا إريك، الآن وبشكلٍ طبيعي، أود أن أطلب منك العثور على رقم 23. 2158 01:39:05,440 --> 01:39:08,310 ولكن هذا يبدو سهلاً قليلاً، يمكنك المضي قدمًا والعثور لنا 2159 01:39:08,310 --> 01:39:11,420 على رقم 50 خلف هذه الأبواب، أو حقًا هذه الخزانات الصفراء؟ 2160 01:39:11,420 --> 01:39:11,920 8؟ 2161 01:39:11,920 --> 01:39:12,690 كلا. 2162 01:39:12,690 --> 01:39:13,190 42؟ 2163 01:39:13,190 --> 01:39:13,690 كلا. 2164 01:39:13,690 --> 01:39:14,300 حسنًا. 2165 01:39:14,300 --> 01:39:14,800 جيد جدًا. 2166 01:39:14,800 --> 01:39:16,300 هذه ثلاثة، ثلاثة من سبعة. 2167 01:39:16,300 --> 01:39:17,740 كيف حصلت عليها بهذه السرعة؟ 2168 01:39:17,740 --> 01:39:18,660 إريك: قمت بالتخمين. 2169 01:39:18,660 --> 01:39:20,230 ديفيد ج. مالان: حسنًا، إذًا لقد خمّن. 2170 01:39:20,230 --> 01:39:24,710 هل هذه أفضل خوارزمية كان يمكن أن يستخدمها إريك هنا؟ 2171 01:39:24,710 --> 01:39:26,210 إريك: ربما لا. 2172 01:39:26,210 --> 01:39:27,800 ديفيد ج. مالان: حسنًا، لا أعرف. 2173 01:39:27,800 --> 01:39:28,290 نعم؟ 2174 01:39:28,290 --> 01:39:28,860 لا؟ 2175 01:39:28,860 --> 01:39:29,210 الجمهور: نعم. 2176 01:39:29,210 --> 01:39:30,040 ديفيد ج. مالان: لماذا؟ 2177 01:39:30,040 --> 01:39:30,790 لماذا نعم؟ 2178 01:39:30,790 --> 01:39:31,670 الجمهور: [INAUDIBLE] 2179 01:39:31,670 --> 01:39:32,890 ديفيد ج. مالان: ليس لديه معلومات أخرى. 2180 01:39:32,890 --> 01:39:34,310 لذا نعم، هذا كان أفضل ما يمكنك القيام به. 2181 01:39:34,310 --> 01:39:35,630 ولكن اسمحوا لي أن أقدم لكم القليل من المعلومات. 2182 01:39:35,630 --> 01:39:36,720 يمكنك البقاء هنا. 2183 01:39:36,720 --> 01:39:40,560 واسمحوا لي بالمضي قدمًا وإعادة تحميل الشاشة هنا. 2184 01:39:40,560 --> 01:39:43,580 ودعوني أمضي قدمًا وأسحب مجموعة مختلفة من الأبواب. 2185 01:39:43,580 --> 01:39:46,730 والآن لنفترض أن ذلك يشبه إلى حدٍ كبير دليل الهاتف، والكثير من الهواتف 2186 01:39:46,730 --> 01:39:49,010 يتم ترتيبها، والآن هذه الأبواب تم ترتيبها. 2187 01:39:49,010 --> 01:39:51,460 اعثر لنا على الرقم 50. 2188 01:39:54,360 --> 01:39:54,860 حسنًا. 2189 01:39:54,860 --> 01:39:55,760 جيد جدًا. 2190 01:39:55,760 --> 01:39:57,040 ماذا فعلتَ هذه المرة؟ 2191 01:39:57,040 --> 01:39:59,420 الجمهور: حسنًا، [INAUDIBLE]. 2192 01:39:59,420 --> 01:40:00,650 كان 50 هو 116. 2193 01:40:00,650 --> 01:40:01,400 لذلك أنا فقط-- 2194 01:40:01,400 --> 01:40:02,320 ديفيد ج. مالان: حسنًا. 2195 01:40:02,320 --> 01:40:07,570 إذًا قفزتَ إلى الوسط في البداية، ثم إلى النصف الأيمن. 2196 01:40:07,570 --> 01:40:10,140 ثم من الناحية الفنية-- إذًا نحن بعيدون بمقدار 1 من الناحية الفنية، أليس كذلك؟ 2197 01:40:10,140 --> 01:40:12,850 لأن البحث الثنائي مثلاً كان سينتقل إلى منتصف الـ-- 2198 01:40:12,850 --> 01:40:14,840 لا بأس، عمل جيد جدًا يا إريك. 2199 01:40:14,840 --> 01:40:18,970 هنا، دعني أقدم لك كرة ضغط كمكافأة. 2200 01:40:18,970 --> 01:40:20,320 حسنًا شكرًا لك. 2201 01:40:20,320 --> 01:40:21,110 عمل جيد جدًا. 2202 01:40:21,110 --> 01:40:23,500 إذًا بهذه المعلومات الإضافية، كما تعلمون، 2203 01:40:23,500 --> 01:40:27,490 تمكّن إيرك من الأداء بشكل أفضل لأن المعلومات كانت مُرتبة على الشاشة. 2204 01:40:27,490 --> 01:40:30,490 لكن كانت لديه رؤية واحدة فقط لخزانة في كل مرة، 2205 01:40:30,490 --> 01:40:33,710 لأنه فقط من خلال الكشف عما بالداخل سيستطيع أن يراه بالفعل. 2206 01:40:33,710 --> 01:40:35,980 إذًا هذا يبدو أنه يقترح أنك بمجرد 2207 01:40:35,980 --> 01:40:39,070 حصولك على هذه المعلومات الإضافية في مثال إريك، في مثال هاتفك، 2208 01:40:39,070 --> 01:40:44,440 في مثال دليل الهاتف، فإنك تتيح الاحتمالات للمزيد، والمزيد من 2209 01:40:44,440 --> 01:40:45,880 الخوارزميات الفعّالة. 2210 01:40:45,880 --> 01:40:50,380 ولكن للوصول إلى هذا، كنا نؤجل هذا طوال الوقت في الصف الدراسي 2211 01:40:50,380 --> 01:40:53,390 كيف يمكنك في الواقع فرز هذه العناصر. 2212 01:40:53,390 --> 01:40:56,920 وإذا كنتم لا تمانعون-- بهذه الطريقة، نأمل أن ننتهي على 2213 01:40:56,920 --> 01:40:59,700 ملاحظة أكثر حيوية هنا لأنني أعرف أننا أصابنا الملل لبرهة-- 2214 01:40:59,700 --> 01:41:02,270 هلا حصلنا على ثمانية متطوعين؟ 2215 01:41:02,270 --> 01:41:09,300 حسنًا، 1، 2، 3، 4-- ماذا عن 5، 6، 7، 8، تعالوا هنا. 2216 01:41:09,300 --> 01:41:09,890 أوه، معذرة. 2217 01:41:09,890 --> 01:41:11,900 هل تغاضيت تمامًا عن الصف الأمامي؟ 2218 01:41:11,900 --> 01:41:12,400 حسنًا. 2219 01:41:12,400 --> 01:41:13,270 لا بأس، المرة القادمة. 2220 01:41:13,270 --> 01:41:14,170 المرة القادمة. 2221 01:41:14,170 --> 01:41:14,800 تعالوا إلى هنا. 2222 01:41:20,560 --> 01:41:23,980 أوه، وكولتون، هل تمانع في مقابلتهم هنا بدلاً من هناك؟ 2223 01:41:23,980 --> 01:41:25,170 حسنًا. 2224 01:41:25,170 --> 01:41:26,000 تعالوا. 2225 01:41:26,000 --> 01:41:26,710 ما اسمك؟ 2226 01:41:26,710 --> 01:41:27,670 [? كامي: ?] [? كامي. ?] 2227 01:41:27,670 --> 01:41:28,540 ديفيد ج. مالان: [؟ كامي؟ ؟] ديفيد. 2228 01:41:28,540 --> 01:41:29,110 هناك بالضبط. 2229 01:41:29,110 --> 01:41:29,390 ما اسمك؟ 2230 01:41:29,390 --> 01:41:29,790 مات: مات. 2231 01:41:29,790 --> 01:41:30,040 ديفيد ج. مالان: مات؟ 2232 01:41:30,040 --> 01:41:30,880 ديفيد. 2233 01:41:30,880 --> 01:41:31,360 [؟ جوهي:؟] [؟ جوهي. ؟] 2234 01:41:31,360 --> 01:41:32,270 ديفيد ج. مالان: [؟ جوهي؟ ؟] ديفيد. 2235 01:41:32,270 --> 01:41:32,620 ماكس: ماكس. 2236 01:41:32,620 --> 01:41:33,900 ديفيد ج. مالان: ماكس، سعدت بلقائك. 2237 01:41:33,900 --> 01:41:34,350 جيمس: جيمس. 2238 01:41:34,350 --> 01:41:35,630 ديفيد ج. مالان: جيمس، سعدت بلقائك. 2239 01:41:35,630 --> 01:41:36,700 هنا، سأحضر المزيد من الكراسي. 2240 01:41:36,700 --> 01:41:37,030 ما اسمك؟ 2241 01:41:37,030 --> 01:41:37,600 ،بيتن: بيتن. 2242 01:41:37,600 --> 01:41:38,050 ديفيد ج. مالان: بيتن؟ 2243 01:41:38,050 --> 01:41:38,890 ديفيد. 2244 01:41:38,890 --> 01:41:40,180 واثنين آخرين. 2245 01:41:40,180 --> 01:41:42,430 في الواقع هل يمكنكما المجيء إلي هنا؟ 2246 01:41:42,430 --> 01:41:43,130 ما اسمك. 2247 01:41:43,130 --> 01:41:43,800 أندريا: أندريا. 2248 01:41:43,800 --> 01:41:45,650 ديفيد ج. مالان: أندريا، سعدت بلقائك. 2249 01:41:45,650 --> 01:41:46,240 واسمك؟ 2250 01:41:46,240 --> 01:41:46,940 [؟ بيكو:؟] [؟ بيكو. ؟] 2251 01:41:46,940 --> 01:41:47,870 ديفيد ج. مالان: [؟ بيكو،؟] ديفيد. 2252 01:41:47,870 --> 01:41:48,530 سعدت بلقائك. 2253 01:41:48,530 --> 01:41:54,430 حسنًا، لدى كولتون قميصًا لكل واحد منكم، وهو على طراز جامعة هارفارد. 2254 01:41:54,430 --> 01:41:57,830 وكل واحد من هذه القمصان، التي على وشك أن تروها، عليها رقم ما. 2255 01:41:57,830 --> 01:42:00,850 وهذا الرقم هو-- 2256 01:42:00,850 --> 01:42:02,900 حسنًا، امضوا قدمًا وارتدوهم، إذا لا تمانعون. 2257 01:42:06,420 --> 01:42:07,580 حسنًا، شكرًا جزيلاً لكم. 2258 01:42:07,580 --> 01:42:11,240 إذًا أعتقد أننا قد رتبنا الأشخاص لدينا مثل الخزائن إلى حد كبير في مصفوفة. 2259 01:42:11,240 --> 01:42:13,790 فمثلاً لدينا مجموعة أشخاص، متصلين على التوالي مع بعضهم البعض. 2260 01:42:13,790 --> 01:42:17,210 لكن هذا في الواقع نعمة ونقمة، 2261 01:42:17,210 --> 01:42:18,920 لأن لدينا فقط ثمانية مقاعد. 2262 01:42:18,920 --> 01:42:22,730 إذًا لا يوجد في الحقيقة متسعًا هنا، لذلك سنقتصر على هذه المساحة فقط هنا. 2263 01:42:22,730 --> 01:42:25,890 وأرى أن لدينا 4، 8، 5، 2، 3، 1، 6، 7. 2264 01:42:25,890 --> 01:42:26,840 هذا رائع. 2265 01:42:26,840 --> 01:42:28,010 كأنهم غير مُرتبين. 2266 01:42:28,010 --> 01:42:29,630 وحسب التعريف، هذا عشوائي جدًا. 2267 01:42:29,630 --> 01:42:30,300 إذًا هذا رائع. 2268 01:42:30,300 --> 01:42:31,710 إذًا دعونا نبدأ هكذا. 2269 01:42:31,710 --> 01:42:33,230 رتبوا أنفسكم من 1 إلى 8، رجاءً. 2270 01:42:42,280 --> 01:42:43,290 حسنًا. 2271 01:42:43,290 --> 01:42:45,500 حسنًا، أي خوارزمية كانت تلك؟ 2272 01:42:45,500 --> 01:42:46,400 [LAUGHTER] 2273 01:42:46,400 --> 01:42:47,950 الجمهور: انظروا حولكم، وتبينوا الأمر. 2274 01:42:47,950 --> 01:42:49,210 ديفيد ج. مالان: انظروا حولكم، وتبينوا الأمر. 2275 01:42:49,210 --> 01:42:49,810 حسنًا، إذًا-- 2276 01:42:49,810 --> 01:42:50,620 مات: الإبداع البشري. 2277 01:42:50,620 --> 01:42:51,500 ديفيد ج. مالان: الإبداع البشري؟ 2278 01:42:51,500 --> 01:42:52,330 أحسنت للغاية. 2279 01:42:52,330 --> 01:42:54,700 إذًا هل يمكننا-- حسناً، معرفة ما الذي كان يدور 2280 01:42:54,700 --> 01:42:56,420 في عقولكم؟ 2281 01:42:56,420 --> 01:42:57,760 مات: العثور على كرسي والجلوس. 2282 01:42:57,760 --> 01:42:58,720 ديفيد ج. مالان: العثور على الكرسي-- 2283 01:42:58,720 --> 01:42:59,590 العثور على الكرسي المناسب. 2284 01:42:59,590 --> 01:43:00,710 إذًا الذهاب إلى موقع. 2285 01:43:00,710 --> 01:43:01,210 جيد. 2286 01:43:01,210 --> 01:43:02,890 إذًا مثل موقع الفهرس، أليس كذلك؟ 2287 01:43:02,890 --> 01:43:04,750 المصفوفات لديها مؤشرات،إذا جاز التعبير-- 2288 01:43:04,750 --> 01:43:07,780 0، 1، 2، على النسق نفسه حتى 7. 2289 01:43:07,780 --> 01:43:10,310 وعلى الرغم من أن القمصان الخاصة بنا مرقمة من 1 إلى 8، 2290 01:43:10,310 --> 01:43:11,780 يمكنك التفكير من حيث 0 إلى 7. 2291 01:43:11,780 --> 01:43:12,310 إذًا كان هذا جيدًا. 2292 01:43:12,310 --> 01:43:12,810 أي شخص آخر؟ 2293 01:43:12,810 --> 01:43:14,530 أفكار أخرى؟ 2294 01:43:14,530 --> 01:43:17,690 [؟ كامي:؟] أعني، هذا شيء كنا نفكر فيه بشكل ضمني، 2295 01:43:17,690 --> 01:43:19,310 ولم يخبرنا أحد أن الترتيب من اليمين إلى اليسار. 2296 01:43:19,310 --> 01:43:20,880 كان يمكننا الترتيب من اليسار إلى اليمين. 2297 01:43:20,880 --> 01:43:21,250 ديفيد ج. مالان: حسنًا. 2298 01:43:21,250 --> 01:43:21,730 قطعًا. 2299 01:43:21,730 --> 01:43:23,770 كان يمكنكم الانتقال من اليمين إلى اليسار، بدلاً من اليسار إلى اليمين. 2300 01:43:23,770 --> 01:43:25,250 ولكننا على الأقل وافقنا جميعًا على هذا الاتفاق 2301 01:43:25,250 --> 01:43:26,590 أيضًا، إذًا كان ذلك في عقولكم. 2302 01:43:26,590 --> 01:43:26,860 حسنًا. 2303 01:43:26,860 --> 01:43:27,220 جيد جدًا. 2304 01:43:27,220 --> 01:43:28,090 إذًا حصلنا على هذا الترتيب. 2305 01:43:28,090 --> 01:43:30,130 امضوا قدمًا وأعيدوا ترتيب أنفسكم عشوائيًا، إذا سمحتم. 2306 01:43:35,220 --> 01:43:37,660 أي خوارزمية كانت تلك؟ 2307 01:43:37,660 --> 01:43:38,980 مجرد خلط عشوائي؟ 2308 01:43:38,980 --> 01:43:39,790 حسنًا، هذا جيد. 2309 01:43:39,790 --> 01:43:41,260 إذًا يبدو عشوائيًا جدًا. 2310 01:43:41,260 --> 01:43:42,100 سيفي بالغرض. 2311 01:43:42,100 --> 01:43:44,500 دعونا نرى الآن إذا كان بإمكاننا تقليل عملية الترتيب 2312 01:43:44,500 --> 01:43:47,300 إلى شيء حسابي أكثر من ذلك بقليل حتى، أولاً، يمكننا أن نتأكد 2313 01:43:47,300 --> 01:43:50,500 أننا على صواب وليست مجرد صدفة أن كل شخص تبين أمره 2314 01:43:50,500 --> 01:43:52,450 ولم يُستثنى أحد، وثانيًا، 2315 01:43:52,450 --> 01:43:54,730 البدأ في التفكير في مدى كفاءتها، أليس كذلك؟ 2316 01:43:54,730 --> 01:43:57,700 لأنه إذا كنا نظفر بكفاءة كبيرة لدليل الهاتف، 2317 01:43:57,700 --> 01:43:59,730 لجهات الاتصال لدينا، لـ [؟ خطأ؟] التالي، 2318 01:43:59,730 --> 01:44:01,780 كان يتعين علينا حقًا أن نسأل طوال الوقت، 2319 01:44:01,780 --> 01:44:05,080 بالتأكيد، يمكنكم توفير الوقت بواسطة البحث الثنائي وخوارزمية فرق تسد، 2320 01:44:05,080 --> 01:44:08,110 ولكن كم تستغرق لتصل إلى نقطة معينة 2321 01:44:08,110 --> 01:44:10,750 حيث يمكنك استخدام البحث الثنائي وخوارزمية فرق تسد؟ 2322 01:44:10,750 --> 01:44:14,160 لأن الترتيب، إذا كان فائق الثمن وباهظًا للغاية ويستغرق وقتًا طويلاً 2323 01:44:14,160 --> 01:44:15,250 ربما يكون سلبيًا تمامًا. 2324 01:44:15,250 --> 01:44:17,290 ويمكنكم كذلك البحث في القائمة بأكملها، 2325 01:44:17,290 --> 01:44:18,730 بدلاً من ترتيب أي شيء. 2326 01:44:18,730 --> 01:44:19,230 حسنًا. 2327 01:44:19,230 --> 01:44:20,920 إذًا دعونا نرى هنا. 2328 01:44:20,920 --> 01:44:22,630 6 و5، لا أحب هذا. 2329 01:44:22,630 --> 01:44:24,000 لماذا؟ 2330 01:44:24,000 --> 01:44:25,390 الجمهور: [INAUDIBLE] 2331 01:44:25,390 --> 01:44:27,310 ديفيد ج. مالان: من المفترض أن يأتي 6 بعد 5. 2332 01:44:27,310 --> 01:44:29,510 وهكذا، هل يمكننا إصلاح هذا، من فضلكم؟ 2333 01:44:29,510 --> 01:44:30,010 حسنًا. 2334 01:44:30,010 --> 01:44:30,800 ثم دعونا نرى. 2335 01:44:30,800 --> 01:44:33,520 حسنًا، 6 و1-- آه، لا يعجبني هذا حقًا. 2336 01:44:33,520 --> 01:44:36,050 نعم، هل يمكننا إصلاح هذا؟ 2337 01:44:36,050 --> 01:44:36,550 جيد جدًا. 2338 01:44:36,550 --> 01:44:39,700 6 و3، حسنًا، لقد حصلنا على نتيجة غير متكافئة هنا. 2339 01:44:39,700 --> 01:44:43,010 إذًا 6 و3، هل يمكننا إصلاح هذا؟ 2340 01:44:43,010 --> 01:44:44,590 و6-- نعم، حسنًا. 2341 01:44:44,590 --> 01:44:46,210 أوه، حسنًا، 6 و7-- جيد. 2342 01:44:46,210 --> 01:44:47,590 حسنًا، هذا جيد جدًا. 2343 01:44:47,590 --> 01:44:49,180 7 و8، جيد. 2344 01:44:49,180 --> 01:44:50,000 8 و4، آسف. 2345 01:44:50,000 --> 01:44:52,640 هل يمكننا التبديل هنا؟ 2346 01:44:52,640 --> 01:44:53,140 حسنًا. 2347 01:44:53,140 --> 01:44:54,440 ثم 8 و2؟ 2348 01:44:54,440 --> 01:44:56,000 هل يمكننا التبديل هنا؟ 2349 01:44:56,000 --> 01:44:56,500 حسنًا. 2350 01:44:56,500 --> 01:44:58,580 دعوني أطرح عليكم سؤالاً بلاغيًا إلى حد ما. 2351 01:44:58,580 --> 01:45:00,120 حسنًا، هل انتهيت؟ 2352 01:45:00,120 --> 01:45:00,760 حسنًا، لا. 2353 01:45:00,760 --> 01:45:03,580 من الواضح أنه لا، لكني عالجت بعض المشاكل، أليس كذلك؟ 2354 01:45:03,580 --> 01:45:06,380 أصلحت بعض التبديلات، والأرقام غير المرتبة. 2355 01:45:06,380 --> 01:45:07,480 وفي الحقيقة، أنا-- ذكرني باسمك مجددًا؟ 2356 01:45:07,480 --> 01:45:08,270 [? كامي: ?] [? كامي. ?] 2357 01:45:08,270 --> 01:45:11,500 ديفيد ج. مالان: [؟ كامي،؟] تزحزحت نوعًا ما إلى اليمين هنا، إذا جاز التعبير. 2358 01:45:11,500 --> 01:45:14,050 كما لو كنتِ بعيدة نوعًا ما، والآن أنتِ هنا. 2359 01:45:14,050 --> 01:45:16,930 ومثل الأرقام الأصغر، نوعًا ما-- نعم 1. 2360 01:45:16,930 --> 01:45:19,600 كأنه، يا إلهي، كأنه شق طريقه في هذا الاتجاه. 2361 01:45:19,600 --> 01:45:21,580 إذًا الأمور تسير، بشكل منطقي. 2362 01:45:21,580 --> 01:45:23,240 وهذا شيء جيد. 2363 01:45:23,240 --> 01:45:24,350 أتعلمون ماذا؟ 2364 01:45:24,350 --> 01:45:26,170 دعوني أحاول إصلاح بعض المشاكل المتبقية. 2365 01:45:26,170 --> 01:45:27,330 إذًا 1 و5-- جيد. 2366 01:45:27,330 --> 01:45:29,560 أوه 3 و5، هل يمكنكما التبديل؟ 2367 01:45:29,560 --> 01:45:31,780 5 و6، حسنًا. 2368 01:45:31,780 --> 01:45:32,590 6 و7؟ 2369 01:45:32,590 --> 01:45:34,950 7 و4، هل يمكنكما التبديل؟ 2370 01:45:34,950 --> 01:45:36,040 حسنًا. 2371 01:45:36,040 --> 01:45:40,390 7 و2، هل يمكنكما التبديل؟ 2372 01:45:40,390 --> 01:45:42,700 والآن، لا يتعين عليّ التحدث مع [؟ كامي؟] مجددًا، 2373 01:45:42,700 --> 01:45:44,450 لأننا نعرف أنها في المكان الصحيح. 2374 01:45:44,450 --> 01:45:46,490 لذا أنا في الواقع لا يتعين عليّ القيام بالكثير 2375 01:45:46,490 --> 01:45:48,050 من العمل هذه المرة، وهذا جيد نوعًا ما. 2376 01:45:48,050 --> 01:45:49,240 لكن، هل انتهيت؟ 2377 01:45:49,240 --> 01:45:50,560 لا، من الواضح لا. 2378 01:45:50,560 --> 01:45:52,360 لكن ما هو النمط الآن؟ 2379 01:45:52,360 --> 01:45:53,950 ما هو الطراز الأساسي؟ 2380 01:45:53,950 --> 01:45:57,190 إذا قارنت فقط بين زوج من الأشخاص والأرقام، 2381 01:45:57,190 --> 01:45:59,560 يمكنني تحسين الموقف نوعًا ما في كل مرة 2382 01:45:59,560 --> 01:46:01,180 من خلال تبديلهم فقط، تبدليهم. 2383 01:46:01,180 --> 01:46:02,560 وفي كل مرة الآن-- 2384 01:46:02,560 --> 01:46:04,750 أنا آسف، [؟ بيكو ؟] في مكان رقم 7. 2385 01:46:04,750 --> 01:46:07,300 لا يتعين عليّ التحدث معه أكثر من ذلك، لأنه شق الآن 2386 01:46:07,300 --> 01:46:08,640 طريقه للوصول إلى القمة. 2387 01:46:08,640 --> 01:46:10,970 إذًا رغم أنني أفعل الشيء نفسه مرارًا وتكرارًا، 2388 01:46:10,970 --> 01:46:13,420 وأقوم بالتكرار الحلقي مرارًا وتكرارًا فهذا ليس دائمًا أفضل شيء، 2389 01:46:13,420 --> 01:46:16,730 طالما كنت تكرر لمرات أقل وأقل، فستتوقف في النهاية، 2390 01:46:16,730 --> 01:46:17,320 على ما يبدو. 2391 01:46:17,320 --> 01:46:20,110 لأن 6 ستذهب في النهاية إلى المكان المناسب، ثم 5، 2392 01:46:20,110 --> 01:46:21,260 ثم 4، وهكذا. 2393 01:46:21,260 --> 01:46:22,510 لذلك إذا استطعنا فقط إنهاء هذه الخوارزمية. 2394 01:46:22,510 --> 01:46:24,270 جيد. 2395 01:46:24,270 --> 01:46:26,070 ليس جيدًا. 2396 01:46:26,070 --> 01:46:27,600 حسنًا، 6 و2، ليس جيدًا. 2397 01:46:27,600 --> 01:46:28,960 هل يمكنكما التبديل؟ 2398 01:46:28,960 --> 01:46:30,400 حسنًا، ذكّرني باسمك مجددًا؟ 2399 01:46:30,400 --> 01:46:31,030 بيتن: بيتن. 2400 01:46:31,030 --> 01:46:32,260 ديفيد ج. مالان: بيتن الآن في المكان الصحيح. 2401 01:46:32,260 --> 01:46:33,980 لديّ عمل أقل الآن أمامي. 2402 01:46:33,980 --> 01:46:35,650 لذا إذا استطعت فقط مواصلة هذه العملية-- 2403 01:46:35,650 --> 01:46:39,580 1 و3، و3 و5، و4 و5، حسنًا، ثم 2 و5. 2404 01:46:39,580 --> 01:46:40,960 ثم، ذكرني باسمك مجددًا؟ 2405 01:46:40,960 --> 01:46:41,440 مات: مات. 2406 01:46:41,440 --> 01:46:42,790 ديفيد ج. مالان: مات الآن في المكان الصحيح. 2407 01:46:42,790 --> 01:46:43,560 صار لديّ عمل أقل. 2408 01:46:43,560 --> 01:46:44,350 كدنا نصل. 2409 01:46:44,350 --> 01:46:47,710 1 و3، و3 و4، و4 و2، هل يمكنكما التبديل. 2410 01:46:47,710 --> 01:46:48,640 حسنًا، كدنا ننتهي. 2411 01:46:48,640 --> 01:46:51,460 و1 و3، و3 و2، هل يمكنكما التبديل. 2412 01:46:51,460 --> 01:46:52,360 جيد. 2413 01:46:52,360 --> 01:46:53,600 إذًا هذا مثير للاهتمام. 2414 01:46:53,600 --> 01:46:55,810 يبدو أني-- أنتم تعرفون، في المقام الأول، 2415 01:46:55,810 --> 01:46:59,080 قارنت نوعًا ما بين سبعة أزواج من الأشخاص. 2416 01:46:59,080 --> 01:47:02,170 ثم في المرة التالية، قارنت كم زوجًا من الأشخاص 2417 01:47:02,170 --> 01:47:02,830 كحد أقصى؟ 2418 01:47:02,830 --> 01:47:03,740 الجمهور: [INAUDIBLE] 2419 01:47:03,740 --> 01:47:05,080 ديفيد ج. مالان: 6 فقط، أليس كذلك؟ 2420 01:47:05,080 --> 01:47:06,340 لأننا كنا قادرين على ترك [? كامي ?]. 2421 01:47:06,340 --> 01:47:09,000 ثم تمكنا من ترك [? بيكو ?]، ثم بيتن. 2422 01:47:09,000 --> 01:47:12,220 وبالتالي فإن عدد المقارنات التي أجريتها أصبح أقل وأقل. 2423 01:47:12,220 --> 01:47:13,510 لذا يبدو هذا جيدًا للغاية. 2424 01:47:13,510 --> 01:47:14,260 ولكن أتعرف ماذا؟ 2425 01:47:14,260 --> 01:47:17,130 قبل أن نحلل هذا، هل يمكنكم ترتيب أنفسكم بشكل عشوائي مجددًا؟ 2426 01:47:17,130 --> 01:47:18,590 تعد أي خوارزمية بشرية جيدة. 2427 01:47:18,590 --> 01:47:22,990 دعونا نحاول اتباع نهج واحد آخر، لأن هذا يبدو غير واضح، أليس كذلك؟ 2428 01:47:22,990 --> 01:47:26,020 كنت أصلح الأمور، ولكن كان يتعين عليّ إصلاحها مرارًا وتكرارًا. 2429 01:47:26,020 --> 01:47:28,150 دعوني أحاول تقليل حجم المشكلة 2430 01:47:28,150 --> 01:47:30,260 هذه المرة من خلال فقط اختيار الشخص صاحب الرقم الأصغر. 2431 01:47:30,260 --> 01:47:31,350 حسنًا، إذًا ما هو اسمك مجددًا؟ 2432 01:47:31,350 --> 01:47:32,080 [؟ جوهي:؟] [؟ جوهي. ؟] 2433 01:47:32,080 --> 01:47:34,070 ديفيد ج. مالان: [؟ جوهي،؟] رقم 2-- هذا رقم صغير جدًا، 2434 01:47:34,070 --> 01:47:36,400 إذًا سأتذكر ذلك في نوع المتغير العقلي. 2435 01:47:36,400 --> 01:47:36,890 4؟ 2436 01:47:36,890 --> 01:47:37,730 لا، هذا رقم كبير جدًا. 2437 01:47:37,730 --> 01:47:39,050 كبير جدًا. 2438 01:47:39,050 --> 01:47:40,250 حسنًا، ذكّرني باسمك مجددًا؟ 2439 01:47:40,250 --> 01:47:40,840 جيمس: جيمس. 2440 01:47:40,840 --> 01:47:41,750 ديفيد ج. مالان: جيمس. 2441 01:47:41,750 --> 01:47:42,290 جيمس هو رقم 1. 2442 01:47:42,290 --> 01:47:43,090 هذا جيد جدًا. 2443 01:47:43,090 --> 01:47:43,960 دعني أتابع التحقق. 2444 01:47:43,960 --> 01:47:47,400 حسنًا، جيمس، في المتغيّر العقلي لديّ هو أصغر عدد. 2445 01:47:47,400 --> 01:47:48,860 أعلم أنني أريده في البداية. 2446 01:47:48,860 --> 01:47:50,480 لذا إذا كنت لا تمانع في المجيء معي. 2447 01:47:50,480 --> 01:47:52,090 وأنا آسف، ليس لك مكان بعد الآن. 2448 01:47:52,090 --> 01:47:53,670 إذا يمكنك فقط-- أوه، أتدرون؟ 2449 01:47:53,670 --> 01:47:55,500 هل يمكنكم جميعًا فقط التنحي جانبًا؟ 2450 01:47:55,500 --> 01:47:57,280 حسنًا، امم، لا أعرف إن كنت أحب ذلك. 2451 01:47:57,280 --> 01:47:58,470 هذا كثير من العمل، أليس كذلك؟ 2452 01:47:58,470 --> 01:48:00,260 نقل كل هذه القيم، دعونا لا نفعل ذلك. 2453 01:48:00,260 --> 01:48:01,460 دعونا لا نفعل ذلك. 2454 01:48:01,460 --> 01:48:03,260 رقم 2، هل تمانعين الذهاب حيث-- 2455 01:48:03,260 --> 01:48:03,770 حيث-- 2456 01:48:03,770 --> 01:48:04,520 جيمس: أنا جيمس. 2457 01:48:04,520 --> 01:48:06,180 ديفيد ج. مالان: كان جيمس؟ 2458 01:48:06,180 --> 01:48:09,270 حسنًا، لقد نجحت في جعل المشكلة أسوأ قليلاً نوعًا ما بهذه الطريقة، 2459 01:48:09,270 --> 01:48:11,790 الآن، رقم 2 أصبح بعيدًا جدًا عن الهدف. 2460 01:48:11,790 --> 01:48:14,910 لكن كان من الممكن أن يحالفني الحظ، وربما كانت هي رقم 7 أو 8. 2461 01:48:14,910 --> 01:48:17,760 لذا دعوني أزعم هذا، في المتوسط، مجرد استبعاد الشخص 2462 01:48:17,760 --> 01:48:20,070 سيجعل الأمور متساوية نوعًا ما. 2463 01:48:20,070 --> 01:48:21,870 لكن جيمس الآن في المكان الصحيح. 2464 01:48:21,870 --> 01:48:22,590 تم. 2465 01:48:22,590 --> 01:48:24,740 الآن لدي مشكلة مقدارها 7 أشخاص. 2466 01:48:24,740 --> 01:48:26,490 إذًا دعوني أختار الشخص التالي صاحب الرقم الأصغر. 2467 01:48:26,490 --> 01:48:29,910 4 هو الرقم الأصغر التالي، وليس 8، ولا 5، ولا 7-- أوه، 2. 2468 01:48:29,910 --> 01:48:30,990 ليس 3، ولا 6. 2469 01:48:30,990 --> 01:48:32,610 حسنًا، إذًا عدتِ إلى اللعبة. 2470 01:48:32,610 --> 01:48:33,660 حسنًا، تعالي مجددًا. 2471 01:48:33,660 --> 01:48:35,920 وهل يمكننا استبعاد رقم 4؟ 2472 01:48:35,920 --> 01:48:37,860 وفي تلك الخوارزمية، إذا جاز التعبير، أنا فقط 2473 01:48:37,860 --> 01:48:40,530 اخترت بشكل تفسيري أصغر شخص. 2474 01:48:40,530 --> 01:48:44,070 أنا لا أقارن الجميع تمامًا بالطريقة نفسها وأبادل بينهم زوجيًا، 2475 01:48:44,070 --> 01:48:46,050 أنا أقوم بالمزيد من المبادلات المجهرية. 2476 01:48:46,050 --> 01:48:48,510 إذًا سأذهب الآن للعثور على الرقم الأصغر التالي، وهو رقم 3. 2477 01:48:48,510 --> 01:48:50,130 إذا تفضلت بالظهور هنا؟ 2478 01:48:50,130 --> 01:48:52,210 [؟ كامي، ؟] يتعين علينا، للأسف، استبعادك، 2479 01:48:52,210 --> 01:48:53,540 لكن هذا يصب في صالحنا. 2480 01:48:53,540 --> 01:48:55,460 دعوني أبحث عن الرقم الأصغر التالي، وهو رقم 4. 2481 01:48:55,460 --> 01:48:56,280 حسنًا، لقد عدتِ. 2482 01:48:56,280 --> 01:48:57,330 تعالي. 2483 01:48:57,330 --> 01:48:58,710 بدلي مع رقم 5. 2484 01:48:58,710 --> 01:49:00,150 حسنًا، أبحث الآن عن رقم 5. 2485 01:49:00,150 --> 01:49:01,160 مهلاً، رقم 5، ها أنت ذا. 2486 01:49:01,160 --> 01:49:01,660 حسنًا. 2487 01:49:01,660 --> 01:49:02,710 إذًا تعال هنا. 2488 01:49:02,710 --> 01:49:03,900 حسنًا، أبحث عن رقم 6. 2489 01:49:03,900 --> 01:49:06,510 أوه، 6، بدلوا أماكنكم قليلاً. 2490 01:49:06,510 --> 01:49:07,020 حسنًا. 2491 01:49:07,020 --> 01:49:08,610 والآن أبحث عن رقم 7. 2492 01:49:08,610 --> 01:49:10,710 أوه، 7، إذا أمكنك الذهاب إلى هنا. 2493 01:49:10,710 --> 01:49:12,170 لكن لاحظوا، أنا لا أعود للخلف. 2494 01:49:12,170 --> 01:49:13,380 وهذا هو المهم. 2495 01:49:13,380 --> 01:49:15,360 خطواتي تصبح أقصر وأقصر. 2496 01:49:15,360 --> 01:49:17,520 خطواتي المتبقية تصبح أقصر وأقصر. 2497 01:49:17,520 --> 01:49:21,030 والآن قمنا بالفعل بترتيب كل هؤلاء الأشخاص. 2498 01:49:21,030 --> 01:49:24,480 إذًا طريقتان مختلفتان اختلافًا جوهريًا، لكن كلتيهما مُقارن بطبيعته، 2499 01:49:24,480 --> 01:49:27,060 لأنني أقارن هذه الأحرف مرارًا، 2500 01:49:27,060 --> 01:49:29,880 وتكرارًا، وأبدلهم إذا كانوا غير مرتبين. 2501 01:49:29,880 --> 01:49:34,350 أو في مستوى أعلى، أو أمر عبرهم وأبدلهم مرارًا، 2502 01:49:34,350 --> 01:49:35,970 وتكرارًا. 2503 01:49:35,970 --> 01:49:38,370 ولكن كم عدد الخطوات التي آخذها كل مرة؟ 2504 01:49:38,370 --> 01:49:41,880 على الرغم أنني أفعل القليل والقليل ولم أعد للخلف مرة أخرى، 2505 01:49:41,880 --> 01:49:45,600 في المرة الأولى، كنت أقوم بمقارنات مثل n ناقص 1. 2506 01:49:45,600 --> 01:49:46,830 ثم عدت إلى هنا. 2507 01:49:46,830 --> 01:49:50,700 وفي الخوارزمية الأولى، توقفت عن المضي قدر الإمكان نوعًا ما. 2508 01:49:50,700 --> 01:49:53,540 في الخوارزمية الثانية، أنا فقط لم أعد للخلف قدر الإمكان نوعًا ما. 2509 01:49:53,540 --> 01:49:56,290 إذًا كانت مجرد طريقة مختلفة نوعًا ما للتفكير في المشكلة. 2510 01:49:56,290 --> 01:49:57,240 ولكن بعد ذلك ماذا فعلت؟ 2511 01:49:57,240 --> 01:49:59,320 سبع مقارنات مثلاً؟ 2512 01:49:59,320 --> 01:50:03,240 ثم ستة، ثم خمسة، ثم أربعة، ثم ثلاثة، ثم اثنتين، ثم واحدة. 2513 01:50:03,240 --> 01:50:06,340 إنها تصبح أصغر، ولكن كم عدد المقارنات في المجمل؟ 2514 01:50:06,340 --> 01:50:09,100 لقد حصلت مثلاً على n أشخاص n هو رقم. 2515 01:50:09,100 --> 01:50:10,330 الجمهور: [INAUDIBLE] 2516 01:50:10,330 --> 01:50:12,120 دايفيد ج. مالان: ليس بدرجة السوء نفسها كالمتغيرات. 2517 01:50:12,120 --> 01:50:14,150 سنكون هنا طوال اليوم. 2518 01:50:14,150 --> 01:50:15,060 لكنها كبيرة. 2519 01:50:15,060 --> 01:50:15,560 إنها كبيرة. 2520 01:50:15,560 --> 01:50:18,050 دعونا-- نقدم عاصفة من التصفيق، رجاءً، لمتطوعينا. 2521 01:50:18,050 --> 01:50:19,910 يمكنكم الاحتفاظ بالقمصان، إذا رغبتم، كتذكار. 2522 01:50:19,910 --> 01:50:20,450 [APPLAUSE] 2523 01:50:20,450 --> 01:50:22,370 شكرًا جزيلاً لكم. 2524 01:50:22,370 --> 01:50:26,570 دعوني أرى ما إذا كان بامكاننا تحديد ذلك-- شكرًا جزيلاً لكم-- 2525 01:50:26,570 --> 01:50:29,420 ونرى كيف وصلنا في الواقع إلى هذه النقطة. 2526 01:50:29,420 --> 01:50:34,370 إذا مضيت قدمًا ولم أسحب خزائننا، وإنما إجاباتنا هنا، 2527 01:50:34,370 --> 01:50:38,900 دعوني أقول أن ما فعلناه فقط كان في الأساس خوارزميتين. 2528 01:50:38,900 --> 01:50:39,920 واحدة تُسمي "bubble". 2529 01:50:39,920 --> 01:50:42,790 وكنت أتعمد نوعًا ما إقحام الكلمة هناك. 2530 01:50:42,790 --> 01:50:45,980 "Bubble sort" هو فقط ترتيب مُقارن، زوج مقابل زوج، 2531 01:50:45,980 --> 01:50:47,810 لإصلاح الأخطاء الصغيرة. 2532 01:50:47,810 --> 01:50:50,760 لكننا بحاجة إلي القيام به مرارًا وتكرارًا. 2533 01:50:50,760 --> 01:50:54,310 حتى تشكل هذه الخطوات إضافة ما، ولكن يمكننا التعبير عنهم كتعليمات برمجية زائفة. 2534 01:50:54,310 --> 01:50:56,900 لذا في التعليمات البرمجية الزائفة-- يمكنك كتابة أي عدد من الطرق-- 2535 01:50:56,900 --> 01:50:58,140 قد أفعل ما يلي فقط. 2536 01:50:58,140 --> 01:51:01,160 فقط أستمر في القيام بما يلي، حتى لا يكون هناك مبادلات متبقية-- 2537 01:51:01,160 --> 01:51:06,470 من i من 0 إلى n -2، وn هو العدد الإجمالي للأشخاص. 2538 01:51:06,470 --> 01:51:10,190 n -2 تمثل قول اذهب من هذا الشخص إلي هذا الشخص، 2539 01:51:10,190 --> 01:51:13,070 لأنني أرغب فى مقارنته أو مقارنتها مع الشخص الذي بجانبه/بجانبها. 2540 01:51:13,070 --> 01:51:14,730 لذا لا أريد فعل هذا دون قصد. 2541 01:51:14,730 --> 01:51:16,860 هذا هو السبب أن n -2 في النهاية هنا. 2542 01:51:16,860 --> 01:51:19,820 ثم أريد أن أمضي قدمًا، إذا كانت العناصر i وi +1 2543 01:51:19,820 --> 01:51:21,390 غير مرتبة، فقم بتبديلهم. 2544 01:51:21,390 --> 01:51:24,700 ولهذا السبب كنت أطلب من الأشخاص المتطوعين تبديل أماكنهم. 2545 01:51:24,700 --> 01:51:27,410 وأستمر فقط فى متابعة ذلك، حتى لا يتبقى أحد للتبديل. 2546 01:51:27,410 --> 01:51:29,840 وبحسب التعريف، يكون قد تم ترتيب الجميع. 2547 01:51:29,840 --> 01:51:33,200 بينما، تحتوي الخوارزمية الثانية على الاسم التقليدي "selection sort". 2548 01:51:33,200 --> 01:51:37,220 "selection sort" هو حرفيًا حيث تقوم حقًا 2549 01:51:37,220 --> 01:51:40,900 بتحديد أصغر شخص، أو رقم يهمك، بشكل حدسي، 2550 01:51:40,900 --> 01:51:41,570 مرارًا وتكرارًا. 2551 01:51:41,570 --> 01:51:43,400 ويصبح الرقم أكبر، لكنك 2552 01:51:43,400 --> 01:51:45,980 تبدأ بتجاهل الناس الذين وضعتهم بالفعل في أماكنهم. 2553 01:51:45,980 --> 01:51:48,810 وبالتالي فإن المشكلة، بالمثل، تصبح أصغر وأصغر. 2554 01:51:48,810 --> 01:51:52,010 تمامًا مثل "bubble sort"، كانت تصبح مرتبة أكثر فأكثر. 2555 01:51:52,010 --> 01:51:54,470 قد تبدو التعليمات البرمجية الزائفة لـ "selection sort" هكذا. 2556 01:51:54,470 --> 01:51:58,820 For i from 0 to n -1، إذًا هذا 0 في مصفوفة. 2557 01:51:58,820 --> 01:52:00,080 وهذا هو n -1. 2558 01:52:00,080 --> 01:52:05,060 فقط استمروا في البحث عن أصغر عنصر بين هذين الكرسيين، 2559 01:52:05,060 --> 01:52:06,830 ثم أخرجوا هذا الشخص. 2560 01:52:06,830 --> 01:52:09,480 ثم فقط استبعدوا من هناك أيًا كان-- بدلوهم، 2561 01:52:09,480 --> 01:52:13,110 ولكن ليس بالضرورة جانبًا، فقط بعيد قدر ما هو ضروري. 2562 01:52:13,110 --> 01:52:16,610 وبهذه الطريقة، أدير ظهري إلي المزيد والمزيد من الناس 2563 01:52:16,610 --> 01:52:18,920 لأنهم أصبحوا في مكانهم. 2564 01:52:18,920 --> 01:52:20,750 إذًا هناك إطاران مختلفان للمشكلة، 2565 01:52:20,750 --> 01:52:24,950 ولكن اتضح أن كليهما في الواقع لديه عدد الخطوات نفسه، المعطاة أو المأخوذة. 2566 01:52:24,950 --> 01:52:27,200 اتضح بشدة أنهما عدد الخطوات نفسه، 2567 01:52:27,200 --> 01:52:29,450 رغم إنهما طريقتان مختلفتان للتفكير حول هذا الموضوع. 2568 01:52:29,450 --> 01:52:32,620 لأني إن فكرت في "bubble sort"، التكرار الأول، على سبيل المثال، 2569 01:52:32,620 --> 01:52:35,500 ما الذي فقط-- فعلاً، حسنًا، دعونا حتى نفكر في "selection sort". 2570 01:52:35,500 --> 01:52:39,110 في "selection sort"، كم عدد المقارنات التى تعين عليّ فعلها؟ 2571 01:52:39,110 --> 01:52:41,450 حسنًا، بمجرد عثوري على عنصري الأصغر، 2572 01:52:41,450 --> 01:52:43,530 كان لزامًا عليّ مقارنته بالجميع. 2573 01:52:43,530 --> 01:52:46,100 إذًا هذه n -1 مقارنة في المرة الأولى. 2574 01:52:46,100 --> 01:52:47,600 إذًا n -1 على اللوحة. 2575 01:52:47,600 --> 01:52:50,570 ثم يمكنني تجاهلها، لأنها أصبحت ورائي الآن. 2576 01:52:50,570 --> 01:52:54,050 إذًا الآن كم عدد المقارنات المنتهية من n من الأشخاص لديّ؟ 2577 01:52:54,050 --> 01:52:56,210 n -2، لأنني قد طرحت واحدة. 2578 01:52:56,210 --> 01:53:00,810 ثم مجددًا، n -3، ثم n -4، بنفس النسق إلي أن يتبقى شخص واحد. 2579 01:53:00,810 --> 01:53:03,560 لذا سأعبر عن هذا النوع بشكل عام، رياضيًا، هكذا. 2580 01:53:03,560 --> 01:53:09,590 إذًا n -1 زائد n -2 زائد أيًا كان زائد مقارنة واحدة أخيرة، أيًا كانت هذه. 2581 01:53:09,590 --> 01:53:12,130 واتضح أنه في الواقع إذا قرأت الجزء الخلفي من كتاب الرياضيات 2582 01:53:12,130 --> 01:53:14,840 أو كتب الفيزياء المدرسية الخاصة بك حيث لديهم تلك الأوراق المرجعية 2583 01:53:14,840 --> 01:53:20,930 بشأن ما تكون عليه تلك التكرارات، اتضح أن n -1 زائد n -2 زائد n -3 2584 01:53:20,930 --> 01:53:22,850 وما إلى ذلك يمكن التعبير عنهم بشكل أكثر إيجازًا 2585 01:53:22,850 --> 01:53:26,600 كحرفيًا فقط n ضرب n ن-1 مقسومًا على 2. 2586 01:53:26,600 --> 01:53:28,920 وإذا لم تتذكر ذلك، لا بأس. 2587 01:53:28,920 --> 01:53:30,510 أنا دومًا ما أراجع هذه الأمور أيضًا. 2588 01:53:30,510 --> 01:53:32,180 لكن هذا صحيح-- حقًا. 2589 01:53:32,180 --> 01:53:33,690 إذًا ما الذي يعادله هذا؟ 2590 01:53:33,690 --> 01:53:36,900 حسناً، إنه مثل n تربيع ناقص n، إذا ما ضربته فقط. 2591 01:53:36,900 --> 01:53:38,660 ثم إذا قمت بقسمة الاثنين، يكون 2592 01:53:38,660 --> 01:53:40,760 n تربيع مقسومًا على 2 ناقص n على 2. 2593 01:53:40,760 --> 01:53:42,260 إذًا هذا هو العدد الإجمالي للخطوات. 2594 01:53:42,260 --> 01:53:43,250 ويمكنني بالفعل إدخال هذا فيه. 2595 01:53:43,250 --> 01:53:46,610 يمكننا إدخال 8، والقيام بالحسابات، والحصول على العدد الإجمالي للمقارنات 2596 01:53:46,610 --> 01:53:49,580 التي كانت حرفيًا تزعجني نوعًا ما. 2597 01:53:49,580 --> 01:53:51,750 إذًا هل هذا أمر كبير؟ 2598 01:53:51,750 --> 01:53:54,360 امم، يبدو الأمر كما لو أنه مرتب بتربيع n. 2599 01:53:54,360 --> 01:53:56,360 وفي الحقيقة، عالم الكمبيوتر، عند تقييمه 2600 01:53:56,360 --> 01:53:59,210 فعالية خوارزمية ما، يميل إلى عدم الاهتمام كثيرًا 2601 01:53:59,210 --> 01:54:00,350 بالقيم الدقيقة. 2602 01:54:00,350 --> 01:54:02,800 كل ما سنهتم به هو المصطلح الأكبر. 2603 01:54:02,800 --> 01:54:05,030 ما هي القيمة التي تتوصل إليها في الصيغة 2604 01:54:05,030 --> 01:54:07,820 التي تهيمن على المصطلحات الأخرى، إذا جاز التعبير، 2605 01:54:07,820 --> 01:54:11,610 التي لها التأثير الأكبر، خاصةً أن n تصبح أكبر وأكبر؟ 2606 01:54:11,610 --> 01:54:12,560 الآن، لماذا هذا؟ 2607 01:54:12,560 --> 01:54:15,290 حسنًا، دعونا نوعًا ما نجري برهانًا على المثال، إذا صح التعبير. 2608 01:54:15,290 --> 01:54:18,170 إذا كان هذا هو التعبير، من الناحية الفنية، لكني 2609 01:54:18,170 --> 01:54:20,270 أزعم أن، آه، إنها قريبة بما يكفي لنقول 2610 01:54:20,270 --> 01:54:24,900 في ترتيب، رمز O الكبير لـ n تربيع، إذا جاز التعبير، دعونا نستخدم مثالاً. 2611 01:54:24,900 --> 01:54:27,620 إذا كان هناك مليون شخص على خشبة المسرح، وليس فقط ثمانية، 2612 01:54:27,620 --> 01:54:29,630 فستكون الحسابات تقريبًا مليونًا مربعًا 2613 01:54:29,630 --> 01:54:33,490 مقسومًا على خطوتين ناقص مليون مقسومًا على 2، الإجمالي. 2614 01:54:33,490 --> 01:54:35,240 إذًا فماذا سينتج هذا في الواقع؟ 2615 01:54:35,240 --> 01:54:38,920 حسنًا، هذه 500 مليار ناقص 500,000. 2616 01:54:38,920 --> 01:54:40,340 وماذا سينتج هذا في الواقع؟ 2617 01:54:40,340 --> 01:54:46,220 حسنًا، هذه 499 مليار، 999 مليون، 500,000. 2618 01:54:46,220 --> 01:54:49,940 هذا قريب للغاية من n تربيع مثلاً. 2619 01:54:49,940 --> 01:54:54,750 أعني، أن طرح 500,000 من 500 مليار شىء لا يُذكر. 2620 01:54:54,750 --> 01:54:55,460 لذلك أتعلم ماذا؟ 2621 01:54:55,460 --> 01:54:57,770 أه، إنها في ترتيب n تربيع. 2622 01:54:57,770 --> 01:55:01,440 هذا ليس دقيقًا، لكنه في هذا الترتيب العام للمقدار، 2623 01:55:01,440 --> 01:55:02,190 إذا جاز التعبير. 2624 01:55:02,190 --> 01:55:04,700 وإذًا هذا الرمز، هذا حرف 0 كبير، هو حرفيًا رمز 2625 01:55:04,700 --> 01:55:06,860 مُستخدم في علوم الكمبيوتر وفي البرمجة 2626 01:55:06,860 --> 01:55:09,230 للوصف بإيجاز، 2627 01:55:09,230 --> 01:55:13,730 وباستخدام بعض الحدس والخوارزمية الجيدة، مدى سرعة أو بطء خوارزميتك. 2628 01:55:13,730 --> 01:55:16,660 واتضح أن هناك طرق مختلفة لتقييم الخوارزميات 2629 01:55:16,660 --> 01:55:18,440 مع صيغ مماثلة متنوعة فقط. 2630 01:55:18,440 --> 01:55:21,950 n تربيع تصادف أن تكون الوقت الذى استغرقه كلُ من bubble sort 2631 01:55:21,950 --> 01:55:22,460 وselection sort. 2632 01:55:22,460 --> 01:55:24,290 إذا قمت حرفيًا بعدّ كل الأعمال 2633 01:55:24,290 --> 01:55:26,180 التى قمنا بها على خشبة المسرح مع متطوعينا، 2634 01:55:26,180 --> 01:55:32,300 سيكون حوالي n تربيع، 8 تربيع، أو 64 خطوة، معطاة أو مأخوذة، 2635 01:55:32,300 --> 01:55:33,560 لجميع هؤلاء الأفراد. 2636 01:55:33,560 --> 01:55:35,010 وسيكون هذا خارج السياق بشكل ملحوظ. 2637 01:55:35,010 --> 01:55:36,930 هناك كمية لا بأس بها من خطأ التقريب هناك. 2638 01:55:36,930 --> 01:55:39,830 ولكن إذا كان لدينا مليون متطوع على خشبة المسرح، 2639 01:55:39,830 --> 01:55:42,450 إذًا سيصبح خطأ التقريب مهملاً جدًا. 2640 01:55:42,450 --> 01:55:45,150 لكننا رأينا بالفعل بعض من ترتيبات المقدار الأخرى، 2641 01:55:45,150 --> 01:55:46,710 إذا جاز التعبير، مسبقًا. 2642 01:55:46,710 --> 01:55:49,940 على سبيل المثال، عندما أحصينا شخصًا ما، أو بحثنا عن مايك سميث بقلب صفحة واحدة 2643 01:55:49,940 --> 01:55:52,340 في كل مرة، سمّينا هذا خوارزمية خطية. 2644 01:55:52,340 --> 01:55:53,750 وكان ذلك حرف O كبير لـ n. 2645 01:55:53,750 --> 01:55:55,190 إذًا، إنها في ترتيب خطوات n. 2646 01:55:55,190 --> 01:55:55,850 إنها 1000. 2647 01:55:55,850 --> 01:55:56,730 ربما تكون 999. 2648 01:55:56,730 --> 01:55:57,230 أيًا كان. 2649 01:55:57,230 --> 01:55:58,880 إنها في ترتيب خطوات n. 2650 01:55:58,880 --> 01:56:02,840 كان نهج [؟ twosies ؟] أسرع مرتين، تذكّروا-- صفحتين في كل مرة. 2651 01:56:02,840 --> 01:56:03,590 ولكن أتدرون ماذا؟ 2652 01:56:03,590 --> 01:56:05,010 ما يزال هذا خطي، أليس كذلك؟ 2653 01:56:05,010 --> 01:56:06,100 مثل صفحتين في آنّ واحد؟ 2654 01:56:06,100 --> 01:56:08,270 دعوني أنتظر حتى العام القادم عندما تصبح وحدة المعالجة المركزية أسرع 2655 01:56:08,270 --> 01:56:10,930 بمرتين، لأن شركة Intel والشركات تستمر في تسريع أجهزة الكمبيوتر. 2656 01:56:10,930 --> 01:56:12,630 تكون الخوارزمية في الأساس هي نفسها. 2657 01:56:12,630 --> 01:56:15,860 وفي الواقع، إذا رجعتم بالذاكرة إلي الصورة التي رسمناها، 2658 01:56:15,860 --> 01:56:18,890 كانت أشكال تلك المنحنيات هي نفسها في الحقيقة. 2659 01:56:18,890 --> 01:56:22,100 الخوارزمية الأولى تلك، العثور على مايك بقلب صفحة واحدة فى كل مرة كانت هكذا. 2660 01:56:22,100 --> 01:56:24,230 الخوارزمية الثانية العثور عليه كانت هكذا. 2661 01:56:24,230 --> 01:56:28,070 فقط الخوارزمية الثالثة، فرق تسد، وتقسيم دليل الهاتف 2662 01:56:28,070 --> 01:56:29,900 كانت شكلاً مختلفاً اختلافًا جذريًا. 2663 01:56:29,900 --> 01:56:33,140 وعلى الرغم من أننا لم نستخدم هذه الصياغة الخيالية منذ بضعة أسابيع 2664 01:56:33,140 --> 01:56:37,510 مضت، تلك الخوارزميات الأولى، صفحة واحدة في كل مرة، صفحتان في كل مرة، 2665 01:56:37,510 --> 01:56:39,680 إنهم على ترتيب n. 2666 01:56:39,680 --> 01:56:42,560 من الناحية الفنية، نعم، n مقابل n مقسومًا على 2، 2667 01:56:42,560 --> 01:56:46,170 لكننا نهتم فقط بالعامل المسيطر، المتغير n. 2668 01:56:46,170 --> 01:56:48,170 يمكننا التخلص من كل شيء موجود في المقام، 2669 01:56:48,170 --> 01:56:51,350 ويمكننا التخلص من كل ما هو أصغر من المصطلح الأكبر، الذي 2670 01:56:51,350 --> 01:56:52,940 وفي هذه الحالة هو n. 2671 01:56:52,940 --> 01:56:54,940 وقد ألمحت إلى هذا قبل أسبوعين-- 2672 01:56:54,940 --> 01:56:55,800 لوغاريتمي. 2673 01:56:55,800 --> 01:56:58,760 حسنًا، اتضح أن في أي وقت تقسم شيئًا مرارًا 2674 01:56:58,760 --> 01:57:02,520 وتكرارًا، فإنك تحصل على دالة نوع لوغاريتمي 2675 01:57:02,520 --> 01:57:03,890 قاعدة log 2 من الناحية الفنية. 2676 01:57:03,890 --> 01:57:08,010 ولكن على ترتيب قاعدة log فإن n شائع أيضًا. 2677 01:57:08,010 --> 01:57:10,640 الخوارزميات الرائعة هي هذه-- 2678 01:57:10,640 --> 01:57:14,310 حرفيًا، خطوة واحدة، أو عدد خطوات ثابت من الناحية الفنية. 2679 01:57:14,310 --> 01:57:17,450 على سبيل المثال، ما هي الخوارزمية التي قد تكون وقتًا ثابتًا؟ 2680 01:57:20,270 --> 01:57:21,570 افتحوا دليل الهاتف. 2681 01:57:21,570 --> 01:57:22,600 حسنًا، خطوة واحدة. 2682 01:57:22,600 --> 01:57:24,560 لا يهم فى الحقيقة كم عدد الصفحات هناك، 2683 01:57:24,560 --> 01:57:25,790 سأقوم فقط بفتح دفتر الهاتف. 2684 01:57:25,790 --> 01:57:27,680 ولا يختلف هذا بحسب عدد الصفحات. 2685 01:57:27,680 --> 01:57:30,120 قد تكون هذه خوارزمية الوقت الثابت، على سبيل المثال. 2686 01:57:30,120 --> 01:57:32,060 إذاً، هذا أقل ما يمكن أن تذهب إليه. 2687 01:57:32,060 --> 01:57:34,580 ثم هناك مكان ما وليكن فى المنتصف هنا 2688 01:57:34,580 --> 01:57:37,820 نتطلع إليه مع بعض الخوارزميات الأخرى. 2689 01:57:37,820 --> 01:57:41,020 إذًا فى الحقيقة، دعونا نرى فقط إذا-- لحظة-- 2690 01:57:41,020 --> 01:57:44,990 دعونا فقط نرى ما إذا كنا بمقدورنا القيام بهذا بإيجاز أكثر. 2691 01:57:44,990 --> 01:57:50,690 دعونا نمضي قدمًا ونستخدم المصفوفات في طريقة واحدة نهائية فقط، باستخدام أنواع الدمج. 2692 01:57:50,690 --> 01:57:53,510 اتضح أن، باستخدام مصفوفة، يمكننا بالفعل 2693 01:57:53,510 --> 01:57:56,870 القيام بأمر كبير للغاية، طالما أننا نتيح لأنفسنا 2694 01:57:56,870 --> 01:57:58,200 زوجين من المصفوفات. 2695 01:57:58,200 --> 01:58:00,510 إذًا مرة أخرى، عندما نضيف sorting مع bubble sort وselection sort، 2696 01:58:00,510 --> 01:58:01,420 فإننا حصلنا على مجموعة واحدة فقط. 2697 01:58:01,420 --> 01:58:04,860 كان لدينا ثمانية مقاعد لأفرادنا الثمانية. 2698 01:58:04,860 --> 01:58:07,910 ولكن إذا سمحت بوجود 16 مقعدًا مثلاً أو أكثر، 2699 01:58:07,910 --> 01:58:10,070 وسمحت لهؤلاء الأشخاص بالتحرك أكثر قليلاً، 2700 01:58:10,070 --> 01:58:12,710 سيمكنني بالفعل القيام بما هو أفضل من ذلك باستخدام المصفوفات. 2701 01:58:12,710 --> 01:58:16,040 إذاً هذه بعض الأرقام العشوائية التي سنقوم بها بشكل مرئي دون استخدام أى أشخاص. 2702 01:58:16,040 --> 01:58:18,410 وهم في مصفوفة، متصلين على التوالي. 2703 01:58:18,410 --> 01:58:20,270 ولكن إذا أتحت لنفسي مصفوفة ثانية، سأكون 2704 01:58:20,270 --> 01:58:23,360 قادرًا على خلط هذه الأشياء وليس مقارنتهم فقط، 2705 01:58:23,360 --> 01:58:26,450 لأن هذه المقارنات وجميع خطواتي صوبهم 2706 01:58:26,450 --> 01:58:28,320 التي بدأت تستنفد الكثير من الوقت بالفعل. 2707 01:58:28,320 --> 01:58:29,260 إذًا ها هى مصفوفتي. 2708 01:58:29,260 --> 01:58:29,850 أتعلمون ماذا؟ 2709 01:58:29,850 --> 01:58:32,720 تمامًا مثل دليل الهاتف-- مثال دليل الهاتف هذا الذى حصلنا عليه سابقًا 2710 01:58:32,720 --> 01:58:33,800 في الأسبوع الأول-- 2711 01:58:33,800 --> 01:58:38,090 دعوني أعالج نصف المشكلة في وقت واحد ثم أجمع إجابتي نوعًا ما. 2712 01:58:38,090 --> 01:58:39,020 إذًا ها هى مصفوفة-- 2713 01:58:39,020 --> 01:58:42,080 4، 2، 7، 5، 6، 8، 3، 1-- تم ترتيبها بشكل عشوائي. 2714 01:58:42,080 --> 01:58:44,420 دعوني أمضي قدمًا وأرتب نصفهم فقط، 2715 01:58:44,420 --> 01:58:47,760 تمامًا مثلما بحثت عن مايك في البداية في منتصف دليل الهاتف فقط. 2716 01:58:47,760 --> 01:58:50,570 إذًا 4، 2، 7، 5-- لم يتم ترتيبهم. 2717 01:58:50,570 --> 01:58:51,500 ولكن أتدرون ماذا؟ 2718 01:58:51,500 --> 01:58:53,410 هذا يبدو وكأنه ما يزال مشكلة كبيرة للغاية. 2719 01:58:53,410 --> 01:58:56,980 دعوني أرتب النصف الأيسر من النصف الأيسر. 2720 01:58:56,980 --> 01:58:58,280 حسنًا، الآن أصبحت المشكلة أصغر. 2721 01:58:58,280 --> 01:58:59,040 أتعلمون؟ 2722 01:58:59,040 --> 01:59:00,770 4 و2، ما يزالان غير مرتبين. 2723 01:59:00,770 --> 01:59:05,540 دعوني أقسم هذه القائمة الثنائية إلى مصفوفتين صغيرتين، كل واحدة من الحجم 1. 2724 01:59:05,540 --> 01:59:08,500 إذًا، ها هنا مصفوفة صغيرة بحجم 1، وأخرى بحجم 2725 01:59:08,500 --> 01:59:10,970 7، ولكنهم متصلين على التوالي، أيًا كان. 2726 01:59:10,970 --> 01:59:14,060 لكن هذه المصفوفة من الحجم 1، هل تم ترتيبها؟ 2727 01:59:14,060 --> 01:59:15,220 الجمهور: لا. 2728 01:59:15,220 --> 01:59:16,310 ديفيد ج. مالان: معذرةً؟ 2729 01:59:16,310 --> 01:59:17,210 الجمهور: لا. 2730 01:59:17,210 --> 01:59:18,490 ديفيد ج. مالان: لا؟ 2731 01:59:18,490 --> 01:59:21,360 إذا كان لدى هذا المصفوفة عنصر واحد فقط وهذا العنصر هو 4-- 2732 01:59:21,360 --> 01:59:22,180 الجمهور: لا يوجد سوى شيء واحد يمكنك القيام به. 2733 01:59:22,180 --> 01:59:24,470 ديفيد ج. مالان: نعم، إذًا تم ترتيبها، حسب التعريف. 2734 01:59:24,470 --> 01:59:25,600 حسنًا، إذًا تمت. 2735 01:59:25,600 --> 01:59:26,860 حققنا بعض التقدم. 2736 01:59:26,860 --> 01:59:28,720 الآن، دعوني أقم بتنشيط ذاكرتكم قليلاً. 2737 01:59:28,720 --> 01:59:32,300 دعوني أرتب النصف الأيمن من تلك المصفوفة. 2738 01:59:32,300 --> 01:59:34,360 إذًا الآن لديّ مصفوفة أخرى من الحجم 1. 2739 01:59:34,360 --> 01:59:36,550 هل يتم ترتيب هذه المصفوفة؟ 2740 01:59:36,550 --> 01:59:37,930 نعم، بغباء نوعًا ما. 2741 01:59:37,930 --> 01:59:39,250 يبدو حقًا أنه لا يتعين علينا فعل أي شيء. 2742 01:59:39,250 --> 01:59:40,290 نحن فقط نقوم بمحض افتراضات. 2743 01:59:40,290 --> 01:59:41,650 بلى، تم ترتيب هذا. 2744 01:59:41,650 --> 01:59:44,200 لكن الآن، كان هذا هو النصف الأصلي. 2745 01:59:44,200 --> 01:59:46,030 وتم ترتيب هذا النصف. 2746 01:59:46,030 --> 01:59:47,250 تم ترتيب هذا النصف. 2747 01:59:47,250 --> 01:59:49,840 ماذا لو قمت الآن بدمج هذه الأنصاف المرتبة نوعًا ما؟ 2748 01:59:49,840 --> 01:59:52,060 لديّ قائمتان بحجم 1-- 2749 01:59:52,060 --> 01:59:53,560 4 و2. 2750 01:59:53,560 --> 01:59:56,740 والآن إذا كان لديّ مساحة تخزين إضافية، إذا كان لديّ مقاعد إضافية، 2751 01:59:56,740 --> 01:59:58,180 يمكنني القيام بهذا بشكل أفضل قليلاً. 2752 01:59:58,180 --> 02:00:00,650 ماذا إن مضيت قدمًا ودمجت هذين على النحو التالي؟ 2753 02:00:00,650 --> 02:00:02,070 ستذهب 2 إلى هناك. 2754 02:00:02,070 --> 02:00:03,460 ستذهب 4 إلى هناك. 2755 02:00:03,460 --> 02:00:06,910 إذًا الآن لقد أخذت قائمتين مرتبتين وأنشئت واحدة أكبر، قائمة أكثر ترتيبًا 2756 02:00:06,910 --> 02:00:10,030 فقط عن طريق دمجهما معًا، واكتساب بعض المساحة الإضافية. 2757 02:00:10,030 --> 02:00:11,200 الآن، دعوني أقم بتنشيط ذاكراتكم. 2758 02:00:11,200 --> 02:00:12,480 كيف وصلت إلى 4 و2؟ 2759 02:00:12,480 --> 02:00:15,880 حسنًا، لقد بدأت بالنصف الأيسر، ثم بالنصف الأيسر من النصف الأيسر. 2760 02:00:15,880 --> 02:00:19,330 دعوني أتولى النصف الأيمن من النصف الأيسر، إذا صح التعبير. 2761 02:00:19,330 --> 02:00:20,830 حسناً، دعوني أُقَسم هذا مجدداً. 2762 02:00:20,830 --> 02:00:23,440 7، قائمة بالحجم 1، هل تم ترتيبها؟ 2763 02:00:23,440 --> 02:00:24,720 نعم، ببساطة. 2764 02:00:24,720 --> 02:00:26,440 5، هل تم ترتيبها؟ 2765 02:00:26,440 --> 02:00:27,250 نعم. 2766 02:00:27,250 --> 02:00:29,710 7 و5، دعونا نمضي قُدمًا وندمجهما سويًا. 2767 02:00:29,710 --> 02:00:31,480 5، بالطبع ، ستذهب إلى هنا. 2768 02:00:31,480 --> 02:00:33,840 7، بالطبع، ستذهب إلى هنا. 2769 02:00:33,840 --> 02:00:34,420 حسنًا. 2770 02:00:34,420 --> 02:00:35,470 الآن، إلى أين وصلنا؟ 2771 02:00:35,470 --> 02:00:37,570 نحن في الأصل رتبنا النصف الأيسر. 2772 02:00:37,570 --> 02:00:39,290 دعونا نرتب الأيمن-- أوه، الأيمن. 2773 02:00:39,290 --> 02:00:40,060 معذرةً. 2774 02:00:40,060 --> 02:00:41,680 الآن، لدينا النصف الأيسر. 2775 02:00:41,680 --> 02:00:45,130 وتم ترتيب النصف الأيمن من النصف الأيسر. 2776 02:00:45,130 --> 02:00:46,540 دعونا نمضي قُدمًا وندمج هؤلاء. 2777 02:00:46,540 --> 02:00:48,950 لدينا قائمتان الآن بحجم 2-- 2778 02:00:48,950 --> 02:00:52,540 تم فرز كل من، 2 و4 و5 و7. 2779 02:00:52,540 --> 02:00:56,170 إذا قمت الآن بدمج 2 و4 و5 و7، أى عنصر ينبغي أن يأتي أولاً 2780 02:00:56,170 --> 02:00:59,260 في القائمة الكبيرة المطولة، بوضوح؟ 2781 02:00:59,260 --> 02:01:00,180 2. 2782 02:01:00,180 --> 02:01:01,890 ثم 4، ثم 5، ثم 7. 2783 02:01:01,890 --> 02:01:03,100 لم يكن أمرًا شاقًا. 2784 02:01:03,100 --> 02:01:05,870 لكن حسنًا، نحن فقط نستخدم مساحة أكثر قليلاً في مصفوفتنا. 2785 02:01:05,870 --> 02:01:07,350 الآن ماذا بعد؟ 2786 02:01:07,350 --> 02:01:08,560 الآن، دعونا نفعل النصف الأيمن. 2787 02:01:08,560 --> 02:01:11,410 مرة أخرى، بدأنا بتناول المشكلة كلها، والقيام بالنصف الأيسر، 2788 02:01:11,410 --> 02:01:14,740 والنصف الأيسر من النصف الأيسر، والنصف الأيسر للنصف الأيسر من النصف الأيسر. 2789 02:01:14,740 --> 02:01:17,000 والآن سنرجع بالزمن، إذا صح التعبير. 2790 02:01:17,000 --> 02:01:20,350 إذًا دعونا نقسم هذا إلى نصفين، ومايزال إلى الآن النصف الأيسر 2791 02:01:20,350 --> 02:01:21,000 فى نصفين. 2792 02:01:21,000 --> 02:01:22,350 6 تم ترتيبها. 2793 02:01:22,350 --> 02:01:23,380 8 تم ترتيبها. 2794 02:01:23,380 --> 02:01:24,640 الآن يتعين عليّ دمجهما-- 2795 02:01:24,640 --> 02:01:26,170 6، 8. 2796 02:01:26,170 --> 02:01:26,950 الآن ماذا بعد؟ 2797 02:01:26,950 --> 02:01:29,020 النصف الأيمن-- 3 و1. 2798 02:01:29,020 --> 02:01:31,960 حسنًا، تم ترتيب النصف الأيسر، تم ترتيب النصف الأيمن-- 2799 02:01:31,960 --> 02:01:33,760 1 و3. 2800 02:01:33,760 --> 02:01:35,260 حسنًا، كيف يمكنني الآن دمج هؤلاء؟ 2801 02:01:35,260 --> 02:01:38,560 6، 8، 1، 3، أي عنصر من الواضح يُفترض أن يأتي أولاً؟ 2802 02:01:38,560 --> 02:01:42,880 1، ثم 3، ثم 6، ثم 8. 2803 02:01:42,880 --> 02:01:45,610 ثم أخيرًا، لديّ قائمتان بحجم أربعة. 2804 02:01:45,610 --> 02:01:48,290 دعوني أمنح نفسي مساحة صغيرة أكثر، ومصفوفة أخرى. 2805 02:01:48,290 --> 02:01:53,320 والآن دعوني أمضي قدمًا وأضع 1 و2 و3 و4 و5، 2806 02:01:53,320 --> 02:01:56,380 و6 و7 و8. 2807 02:01:56,380 --> 02:01:57,580 ما الذي حدث للتو؟ 2808 02:01:57,580 --> 02:02:00,640 لأنه حدث في الواقع كثيرًا بشكل أسرع، رغم أننا كنا نقوم بذلك 2809 02:02:00,640 --> 02:02:01,630 كله لفظيًا. 2810 02:02:01,630 --> 02:02:06,430 حسنًا لاحظوا، كم عدد المرات التي قام بها كل رقم بتغيير أماكنه؟ 2811 02:02:09,760 --> 02:02:10,810 حرفيًا ثلاث مرات، أليس كذلك؟ 2812 02:02:10,810 --> 02:02:13,330 مثل واحد، اثنان، ثلاثة، صحيح؟ 2813 02:02:13,330 --> 02:02:17,230 انتقلت من المصفوفة الأصلية، إلى المصفوفة الثانية، إلى المصفوفة الثالثة، 2814 02:02:17,230 --> 02:02:19,870 إلى المجموعة الرابعة، أيًا كان ما يسمّى. 2815 02:02:19,870 --> 02:02:21,580 ثم صارت في مكانها فى نهاية المطاف. 2816 02:02:21,580 --> 02:02:24,670 إذًا كان يتعين على كل رقم أن يتحرك واحدة، اثنتين، ثلاثة نقاط. 2817 02:02:24,670 --> 02:02:26,840 ثم كم عدد الأرقام هناك؟ 2818 02:02:26,840 --> 02:02:28,240 الجمهور: [INAUDIBLE] 2819 02:02:28,240 --> 02:02:30,830 ديفيد ج. مالان: حسنًا، لقد كانوا بالفعل في المجموعة الأصلية. 2820 02:02:30,830 --> 02:02:32,450 كم عدد المرات التي تعين عليهم الانتقال؟ 2821 02:02:32,450 --> 02:02:33,890 فقط مرة، اثنتين، ثلاثة. 2822 02:02:33,890 --> 02:02:36,500 إذًا، كم عدد الأجمالي للأرقام هناك، فقط للتوضيح؟ 2823 02:02:36,500 --> 02:02:37,130 هناك ثمانية. 2824 02:02:37,130 --> 02:02:38,360 إذًا 8 ضرب 3. 2825 02:02:38,360 --> 02:02:39,470 إذًا دعونا نعمم هذا. 2826 02:02:39,470 --> 02:02:43,280 إذا كان هناك أرقام n، وكل مرة قمنا بنقل 2827 02:02:43,280 --> 02:02:46,940 الأرقام التي فعلناها حوالي نصفهم، من النصف، ثم النصف، حسنًا، 2828 02:02:46,940 --> 02:02:50,510 كم مرة يمكنك قسمة 8 على 2؟ 2829 02:02:50,510 --> 02:02:51,090 8 تذهب إلى 4. 2830 02:02:51,090 --> 02:02:52,340 4 تذهب إلى 2. 2831 02:02:52,340 --> 02:02:53,520 2 تذهب إلى 1. 2832 02:02:53,520 --> 02:02:57,170 ولهذا السبب وصلنا للمستوى الأدنى في عنصر واحد، قوائم الحجم 1. 2833 02:02:57,170 --> 02:03:00,300 إذًا اتضح أنه كلما قمت بتقسيم شيء إلى النصف، إلى النصف، إلى النصف، 2834 02:03:00,300 --> 02:03:05,240 ما هذه الدالة أو الصيغة؟ 2835 02:03:05,240 --> 02:03:06,320 ليست "power"، هذا سيء. 2836 02:03:06,320 --> 02:03:07,560 هذا هو البعد الآخر. 2837 02:03:07,560 --> 02:03:08,060 الجمهور: [INAUDIBLE] 2838 02:03:08,060 --> 02:03:08,970 ديفيد ج. مالان: إنه لوغاريتم. 2839 02:03:08,970 --> 02:03:11,210 إذًا مرة أخرى، اللوغاريتم هو فقط وصف رياضي 2840 02:03:11,210 --> 02:03:14,210 لأية دالة تبقيك تقسم شيئاً ما مرارًا وتكرارًا. 2841 02:03:14,210 --> 02:03:17,200 إلى النصف، إلى النصف، إلى النصف، إلى الثلث، إلى الثلث، إلى الثلث، أيًا كان هو، 2842 02:03:17,200 --> 02:03:20,450 وتعني فقط التقسيم بالكميات النسبية نفسها، 2843 02:03:20,450 --> 02:03:22,170 مرارًا وتكرارًا. 2844 02:03:22,170 --> 02:03:27,920 ولذا إذا قمنا بتحريك الأرقام ثلاث مرات، أو بشكل عام سجل 2845 02:03:27,920 --> 02:03:31,220 مرات n، التي تعني مجدّدًا تقسيمك لأشياء n مرارًا، 2846 02:03:31,220 --> 02:03:33,710 وتكرارًا، يمكنك فقط تسميت هذا بسجل n. 2847 02:03:33,710 --> 02:03:36,890 ويوجد أرقام n، إذًا قامت أرقام n بنقل 2848 02:03:36,890 --> 02:03:40,850 سجل مرات n،الحساب الإجمالي هنا في السؤال 2849 02:03:40,850 --> 02:03:44,270 هو واحد من تلك القيم الأخرى فى ورقة الملاحظات لدينا، والتي 2850 02:03:44,270 --> 02:03:46,130 تبدو مثل هذا. 2851 02:03:46,130 --> 02:03:51,140 في ورقة الملاحظات لدينا، تذكّروا أنه كان لدينا صيغ تبدو مثل هذه، 2852 02:03:51,140 --> 02:03:55,910 ليس مجرد n تربيع وn،وlog n و1، لدينا هذا في المنتصف-- 2853 02:03:55,910 --> 02:03:57,850 n ضرب log n. 2854 02:03:57,850 --> 02:03:59,690 إذًا مجدّدًا، إننا نمضي سريعًا نوعًا ما هنا. 2855 02:03:59,690 --> 02:04:02,480 ولكن مجدّدًا، كل رقم يتحرك في مواقع log n. 2856 02:04:02,480 --> 02:04:03,950 يوجد المجموع الإجمالي لأرقام n. 2857 02:04:03,950 --> 02:04:07,820 إذًا n ضرب log n يكون، حسب التعريف، n log n. 2858 02:04:07,820 --> 02:04:09,740 ولكن لماذا تم فرز هذا بهذه الطريقة؟ 2859 02:04:09,740 --> 02:04:12,500 حسنًا log n، تذكّروا في الأسبوع الأول من مثال دليل الهاتف، 2860 02:04:12,500 --> 02:04:16,520 المنحنى الأخضر هو بالتأكيد أصغر من n. n كانت الخطوط المستقيمة، 2861 02:04:16,520 --> 02:04:18,350 كان log n هو المنحنى الأخضر. 2862 02:04:18,350 --> 02:04:21,350 إذًا في الواقع ينتمي هذا إلى كليهما لأن هذا هو n ضرب n. 2863 02:04:21,350 --> 02:04:22,220 هذا n. 2864 02:04:22,220 --> 02:04:25,160 هذا n ضرب شيء ما أصغر من n. 2865 02:04:25,160 --> 02:04:26,870 الآن ما هو الأثر الفعلي؟ 2866 02:04:26,870 --> 02:04:29,930 حسنًا، إذا كان علينا تشغيل هذه الخوارزميات جنبًا إلى جنب 2867 02:04:29,930 --> 02:04:34,310 ومقارنتهم في الواقع بشيء مثل هذا-- 2868 02:04:34,310 --> 02:04:41,070 دعوني أمضي قدمًا وأقارن هذه الخوارزميات باستخدام هذا العرض التوضيحي هنا-- 2869 02:04:41,070 --> 02:04:44,190 إذا مضيت قدمًا، وضغطت على تشغيل، سنرى أن الأشرطة في هذا المخطط 2870 02:04:44,190 --> 02:04:45,510 هي أفقية في الواقع. 2871 02:04:45,510 --> 02:04:47,670 والأشرطة الصغيرة تمثل الأرقام الصغيرة، 2872 02:04:47,670 --> 02:04:49,200 الأشرطة الكبيرة تمثل الأرقام الطويلة. 2873 02:04:49,200 --> 02:04:52,200 ثم يقوم كل واحد منهما بتشغيل خوارزمية مختلفة-- selection 2874 02:04:52,200 --> 02:04:54,390 sort على اليسار، bubble sort فى المنتصف، 2875 02:04:54,390 --> 02:04:57,450 merge sort، كما سنسميها الآن، على اليمين. 2876 02:04:57,450 --> 02:05:00,240 وإليك كم يستغرق كل واحد منهم لترتيب هذه القيم. 2877 02:05:04,630 --> 02:05:06,010 ما تزال Bubble مستمرة. 2878 02:05:06,010 --> 02:05:07,060 ما تزال Selection مستمرة. 2879 02:05:07,060 --> 02:05:09,860 وهذا هو الاختلاف الملموس، وإن كان هناك عرض توضيحي صغير، 2880 02:05:09,860 --> 02:05:12,610 بين n تربيع وشيء مثل log n. 2881 02:05:12,610 --> 02:05:13,860 إذًا ماذا فعلنا هنا؟ 2882 02:05:13,860 --> 02:05:17,060 نحن، حقًا للغاية مشغولين بتفاصيل ما يمكن أن تقوم به المصفوفة في الواقع 2883 02:05:17,060 --> 02:05:20,060 لنا وما هي العلاقات مع السلاسل، لأن كل ذلك 2884 02:05:20,060 --> 02:05:22,580 يقلل من اتصال الأشياء مع بعضها على التوالي. 2885 02:05:22,580 --> 02:05:24,410 ولكننا سنعود الآن نوعًا ما وسنتابع 2886 02:05:24,410 --> 02:05:26,480 باستمرار هذا المسار في المرة القادمة ليمكنني 2887 02:05:26,480 --> 02:05:29,810 التحدث على مستوى أعلى بكثير حول ما يجري في الواقع. 2888 02:05:29,810 --> 02:05:32,810 ويمكننا الآن التحدث فى هذا بتعمق، من خلال تطبيق 2889 02:05:32,810 --> 02:05:35,420 نوع آخر من أشكال الوسائط إلى هذه الأنواع نفسها من الأسئلة. 2890 02:05:35,420 --> 02:05:37,370 وسنستنتج أنه يستغرق حوالي 60 ثانية. 2891 02:05:37,370 --> 02:05:39,250 هذه الأشرطة عمودية، بدلاً من أن تكون أفقية. 2892 02:05:39,250 --> 02:05:41,040 وما سترونه هنا هو تصور 2893 02:05:41,040 --> 02:05:43,770 ترتيبات مختلفة لخوارزميات، من بينهم selection sort، 2894 02:05:43,770 --> 02:05:46,700 وbubble sort، وmerge sort،وكل ترتيبات البقية، كل منهم 2895 02:05:46,700 --> 02:05:50,030 لديه صوت مختلف له بسبب السرعة 2896 02:05:50,030 --> 02:05:53,550 والنمط الذي تعمل من خلاله بالفعل. 2897 02:05:53,550 --> 02:05:54,680 إذًا دعونا نلقي نظرة سريعة. 2898 02:05:54,680 --> 02:05:55,340 [VIDEO PLAYBACK] 2899 02:05:55,340 --> 02:05:56,640 [MUSIC PLAYING] 2900 02:06:05,550 --> 02:06:06,860 هذا هو bubble sort. 2901 02:06:06,860 --> 02:06:10,700 ويمكنكم رؤية أن العناصر الكبيرة تتزحزح بالفعل إلى الأعلى. 2902 02:06:15,730 --> 02:06:16,230 [؟ 2903 02:06:16,230 --> 02:06:18,060 ويمكنكم سماع [؟ صوت توالي الدورات نوعًا ما، 2904 02:06:18,060 --> 02:06:20,600 أو الدورة التي تدور فيها. 2905 02:06:25,690 --> 02:06:33,470 وهناك عمل قليل للغاية للقيام به، حتى تقريبًا-- 2906 02:06:33,470 --> 02:06:34,910 هذا هو selection sort الآن. 2907 02:06:34,910 --> 02:06:38,810 إذًا يبدأ بشكل عشوائي، لكننا نواصل اختيار الأفراد أصحاب العدد الأصغر 2908 02:06:38,810 --> 02:06:41,900 أو، في هذه الحالة، الشريط الأقصر. 2909 02:06:41,900 --> 02:06:45,620 وسترى هنا أن الأشرطة ترتبط بالتردد بشكل واضح. 2910 02:06:45,620 --> 02:06:50,210 إذاً هي تصبح أعلى وأعلى وأطول وأطول. 2911 02:06:50,210 --> 02:06:53,780 هذا هو merge sort الآن تذكّروا، الذي، يقسم الأشياء إلى أنصاف، 2912 02:06:53,780 --> 02:06:57,410 ثم أنصاف الأنصاف، ثم يدمج تلك الأنصاف. 2913 02:06:57,410 --> 02:07:03,210 إذًا قمنا بعمل الجزء الأيسر كله، وتقريبًا عمل الجزء الأيمن كله. 2914 02:07:03,210 --> 02:07:04,340 هذا الجزء ممتع جدًا. 2915 02:07:04,340 --> 02:07:06,360 [LAUGHS] 2916 02:07:06,360 --> 02:07:10,550 هذا شيء يسمّى [؟ nom ؟] sort, ويقوم بتحسين الأمور. 2917 02:07:10,550 --> 02:07:13,490 ليس مثاليًا تمامًا، ولكنه دائمًا ما يحقق تقدمًا للأمام، 2918 02:07:13,490 --> 02:07:15,830 ثم الرجوع للخلف على نحو مضاعف نوعًا ما ومحو الأشياء. 2919 02:07:24,000 --> 02:07:24,960 [END PLAYBACK] 2920 02:07:24,960 --> 02:07:25,460 آه. 2921 02:07:25,460 --> 02:07:26,120 كان هذا كثيرًا. 2922 02:07:26,120 --> 02:07:26,960 دعونا نتوقف هنا. 2923 02:07:26,960 --> 02:07:28,040 سأبقى هنا لبعض الوقت من أجل الأسئلة الفردية. 2924 02:07:28,040 --> 02:07:29,030 حسنًا أراكم المرة القادمة. 2925 02:07:29,030 --> 02:07:31,090 [APPLAUSE]